PageSourceSearch

https://vektorvl.ru/local/templates/vector/assets/libs/bootstrap/js/bootstrap.js

js vektorvl.ru collected 2026-10-08 14:10:57 UTC 153,194 bytes, 5,026 lines download raw bytes

1/*!
2  * Bootstrap v5.1.0 (https://getbootstrap.com/)
3  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5  */
6(function (global, factory) {
7  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :
8  typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :
9  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));
10}(this, (function (Popper) { 'use strict';
11
12  function _interopNamespace(e) {
13    if (e && e.__esModule) return e;
14    var n = Object.create(null);
15    if (e) {
16      Object.keys(e).forEach(function (k) {
17        if (k !== 'default') {
18          var d = Object.getOwnPropertyDescriptor(e, k);
19          Object.defineProperty(n, k, d.get ? d : {
20            enumerable: true,
21            get: function () {
22              return e[k];
23            }
24          });
25        }
26      });
27    }
28    n['default'] = e;
29    return Object.freeze(n);
30  }
31
32  var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
33
34  /**
35   * --------------------------------------------------------------------------
36   * Bootstrap (v5.1.0): util/index.js
37   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
38   * --------------------------------------------------------------------------
39   */
40  const MAX_UID = 1000000;
41  const MILLISECONDS_MULTIPLIER = 1000;
vendor: 10,864 bytes, lines 42-394
42  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
43
44  const toType = obj => {
45    if (obj === null || obj === undefined) {
46      return `${obj}`;
47    }
48
49    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
50  };
51  /**
52   * --------------------------------------------------------------------------
53   * Public Util Api
54   * --------------------------------------------------------------------------
55   */
56
57
58  const getUID = prefix => {
59    do {
60      prefix += Math.floor(Math.random() * MAX_UID);
61    } while (document.getElementById(prefix));
62
63    return prefix;
64  };
65
66  const getSelector = element => {
67    let selector = element.getAttribute('data-bs-target');
68
69    if (!selector || selector === '#') {
70      let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
71      // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
72      // `document.querySelector` will rightfully complain it is invalid.
73      // See https://github.com/twbs/bootstrap/issues/32273
74
75      if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
76        return null;
77      } // Just in case some CMS puts out a full URL with the anchor appended
78
79
80      if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
81        hrefAttr = `#${hrefAttr.split('#')[1]}`;
82      }
83
84      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
85    }
86
87    return selector;
88  };
89
90  const getSelectorFromElement = element => {
91    const selector = getSelector(element);
92
93    if (selector) {
94      return document.querySelector(selector) ? selector : null;
95    }
96
97    return null;
98  };
99
100  const getElementFromSelector = element => {
101    const selector = getSelector(element);
102    return selector ? document.querySelector(selector) : null;
103  };
104
105  const getTransitionDurationFromElement = element => {
106    if (!element) {
107      return 0;
108    } // Get transition-duration of the element
109
110
111    let {
112      transitionDuration,
113      transitionDelay
114    } = window.getComputedStyle(element);
115    const floatTransitionDuration = Number.parseFloat(transitionDuration);
116    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
117
118    if (!floatTransitionDuration && !floatTransitionDelay) {
119      return 0;
120    } // If multiple durations are defined, take the first
121
122
123    transitionDuration = transitionDuration.split(',')[0];
124    transitionDelay = transitionDelay.split(',')[0];
125    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
126  };
127
128  const triggerTransitionEnd = element => {
129    element.dispatchEvent(new Event(TRANSITION_END));
130  };
131
132  const isElement = obj => {
133    if (!obj || typeof obj !== 'object') {
134      return false;
135    }
136
137    if (typeof obj.jquery !== 'undefined') {
138      obj = obj[0];
139    }
140
141    return typeof obj.nodeType !== 'undefined';
142  };
143
144  const getElement = obj => {
145    if (isElement(obj)) {
146      // it's a jQuery object or a node element
147      return obj.jquery ? obj[0] : obj;
148    }
149
150    if (typeof obj === 'string' && obj.length > 0) {
151      return document.querySelector(obj);
152    }
153
154    return null;
155  };
156
157  const typeCheckConfig = (componentName, config, configTypes) => {
158    Object.keys(configTypes).forEach(property => {
159      const expectedTypes = configTypes[property];
160      const value = config[property];
161      const valueType = value && isElement(value) ? 'element' : toType(value);
162
163      if (!new RegExp(expectedTypes).test(valueType)) {
164        throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
165      }
166    });
167  };
168
169  const isVisible = element => {
170    if (!isElement(element) || element.getClientRects().length === 0) {
171      return false;
172    }
173
174    return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
175  };
176
177  const isDisabled = element => {
178    if (!element || element.nodeType !== Node.ELEMENT_NODE) {
179      return true;
180    }
181
182    if (element.classList.contains('disabled')) {
183      return true;
184    }
185
186    if (typeof element.disabled !== 'undefined') {
187      return element.disabled;
188    }
189
190    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
191  };
192
193  const findShadowRoot = element => {
194    if (!document.documentElement.attachShadow) {
195      return null;
196    } // Can find the shadow root otherwise it'll return the document
197
198
199    if (typeof element.getRootNode === 'function') {
200      const root = element.getRootNode();
201      return root instanceof ShadowRoot ? root : null;
202    }
203
204    if (element instanceof ShadowRoot) {
205      return element;
206    } // when we don't find a shadow root
207
208
209    if (!element.parentNode) {
210      return null;
211    }
212
213    return findShadowRoot(element.parentNode);
214  };
215
216  const noop = () => {};
217  /**
218   * Trick to restart an element's animation
219   *
220   * @param {HTMLElement} element
221   * @return void
222   *
223   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
224   */
225
226
227  const reflow = element => {
228    // eslint-disable-next-line no-unused-expressions
229    element.offsetHeight;
230  };
231
232  const getjQuery = () => {
233    const {
234      jQuery
235    } = window;
236
237    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
238      return jQuery;
239    }
240
241    return null;
242  };
243
244  const DOMContentLoadedCallbacks = [];
245
246  const onDOMContentLoaded = callback => {
247    if (document.readyState === 'loading') {
248      // add listener on the first call when the document is in loading state
249      if (!DOMContentLoadedCallbacks.length) {
250        document.addEventListener('DOMContentLoaded', () => {
251          DOMContentLoadedCallbacks.forEach(callback => callback());
252        });
253      }
254
255      DOMContentLoadedCallbacks.push(callback);
256    } else {
257      callback();
258    }
259  };
260
261  const isRTL = () => document.documentElement.dir === 'rtl';
262
263  const defineJQueryPlugin = plugin => {
264    onDOMContentLoaded(() => {
265      const $ = getjQuery();
266      /* istanbul ignore if */
267
268      if ($) {
269        const name = plugin.NAME;
270        const JQUERY_NO_CONFLICT = $.fn[name];
271        $.fn[name] = plugin.jQueryInterface;
272        $.fn[name].Constructor = plugin;
273
274        $.fn[name].noConflict = () => {
275          $.fn[name] = JQUERY_NO_CONFLICT;
276          return plugin.jQueryInterface;
277        };
278      }
279    });
280  };
281
282  const execute = callback => {
283    if (typeof callback === 'function') {
284      callback();
285    }
286  };
287
288  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
289    if (!waitForTransition) {
290      execute(callback);
291      return;
292    }
293
294    const durationPadding = 5;
295    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
296    let called = false;
297
298    const handler = ({
299      target
300    }) => {
301      if (target !== transitionElement) {
302        return;
303      }
304
305      called = true;
306      transitionElement.removeEventListener(TRANSITION_END, handler);
307      execute(callback);
308    };
309
310    transitionElement.addEventListener(TRANSITION_END, handler);
311    setTimeout(() => {
312      if (!called) {
313        triggerTransitionEnd(transitionElement);
314      }
315    }, emulatedDuration);
316  };
317  /**
318   * Return the previous/next element of a list.
319   *
320   * @param {array} list    The list of elements
321   * @param activeElement   The active element
322   * @param shouldGetNext   Choose to get next or previous element
323   * @param isCycleAllowed
324   * @return {Element|elem} The proper element
325   */
326
327
328  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
329    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
330
331    if (index === -1) {
332      return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
333    }
334
335    const listLength = list.length;
336    index += shouldGetNext ? 1 : -1;
337
338    if (isCycleAllowed) {
339      index = (index + listLength) % listLength;
340    }
341
342    return list[Math.max(0, Math.min(index, listLength - 1))];
343  };
344
345  /**
346   * --------------------------------------------------------------------------
347   * Bootstrap (v5.1.0): dom/event-handler.js
348   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
349   * --------------------------------------------------------------------------
350   */
351  /**
352   * ------------------------------------------------------------------------
353   * Constants
354   * ------------------------------------------------------------------------
355   */
356
357  const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
358  const stripNameRegex = /\..*/;
359  const stripUidRegex = /::\d+$/;
360  const eventRegistry = {}; // Events storage
361
362  let uidEvent = 1;
363  const customEvents = {
364    mouseenter: 'mouseover',
365    mouseleave: 'mouseout'
366  };
367  const customEventsRegex = /^(mouseenter|mouseleave)/i;
368  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
369  /**
370   * ------------------------------------------------------------------------
371   * Private methods
372   * ------------------------------------------------------------------------
373   */
374
375  function getUidEvent(element, uid) {
376    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
377  }
378
379  function getEvent(element) {
380    const uid = getUidEvent(element);
381    element.uidEvent = uid;
382    eventRegistry[uid] = eventRegistry[uid] || {};
383    return eventRegistry[uid];
384  }
385
386  function bootstrapHandler(element, fn) {
387    return function handler(event) {
388      event.delegateTarget = element;
389
390      if (handler.oneOff) {
391        EventHandler.off(element, event.type, fn);
392      }
393
394      return fn.apply(element, [event]);
vendor: 10,312 bytes, lines 395-716
395    };
396  }
397
398  function bootstrapDelegationHandler(element, selector, fn) {
399    return function handler(event) {
400      const domElements = element.querySelectorAll(selector);
401
402      for (let {
403        target
404      } = event; target && target !== this; target = target.parentNode) {
405        for (let i = domElements.length; i--;) {
406          if (domElements[i] === target) {
407            event.delegateTarget = target;
408
409            if (handler.oneOff) {
410              // eslint-disable-next-line unicorn/consistent-destructuring
411              EventHandler.off(element, event.type, selector, fn);
412            }
413
414            return fn.apply(target, [event]);
415          }
416        }
417      } // To please ESLint
418
419
420      return null;
421    };
422  }
423
424  function findHandler(events, handler, delegationSelector = null) {
425    const uidEventList = Object.keys(events);
426
427    for (let i = 0, len = uidEventList.length; i < len; i++) {
428      const event = events[uidEventList[i]];
429
430      if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
431        return event;
432      }
433    }
434
435    return null;
436  }
437
438  function normalizeParams(originalTypeEvent, handler, delegationFn) {
439    const delegation = typeof handler === 'string';
440    const originalHandler = delegation ? delegationFn : handler;
441    let typeEvent = getTypeEvent(originalTypeEvent);
442    const isNative = nativeEvents.has(typeEvent);
443
444    if (!isNative) {
445      typeEvent = originalTypeEvent;
446    }
447
448    return [delegation, originalHandler, typeEvent];
449  }
450
451  function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
452    if (typeof originalTypeEvent !== 'string' || !element) {
453      return;
454    }
455
456    if (!handler) {
457      handler = delegationFn;
458      delegationFn = null;
459    } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
460    // this prevents the handler from being dispatched the same way as mouseover or mouseout does
461
462
463    if (customEventsRegex.test(originalTypeEvent)) {
464      const wrapFn = fn => {
465        return function (event) {
466          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
467            return fn.call(this, event);
468          }
469        };
470      };
471
472      if (delegationFn) {
473        delegationFn = wrapFn(delegationFn);
474      } else {
475        handler = wrapFn(handler);
476      }
477    }
478
479    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
480    const events = getEvent(element);
481    const handlers = events[typeEvent] || (events[typeEvent] = {});
482    const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);
483
484    if (previousFn) {
485      previousFn.oneOff = previousFn.oneOff && oneOff;
486      return;
487    }
488
489    const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));
490    const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);
491    fn.delegationSelector = delegation ? handler : null;
492    fn.originalHandler = originalHandler;
493    fn.oneOff = oneOff;
494    fn.uidEvent = uid;
495    handlers[uid] = fn;
496    element.addEventListener(typeEvent, fn, delegation);
497  }
498
499  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
500    const fn = findHandler(events[typeEvent], handler, delegationSelector);
501
502    if (!fn) {
503      return;
504    }
505
506    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
507    delete events[typeEvent][fn.uidEvent];
508  }
509
510  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
511    const storeElementEvent = events[typeEvent] || {};
512    Object.keys(storeElementEvent).forEach(handlerKey => {
513      if (handlerKey.includes(namespace)) {
514        const event = storeElementEvent[handlerKey];
515        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
516      }
517    });
518  }
519
520  function getTypeEvent(event) {
521    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
522    event = event.replace(stripNameRegex, '');
523    return customEvents[event] || event;
524  }
525
526  const EventHandler = {
527    on(element, event, handler, delegationFn) {
528      addHandler(element, event, handler, delegationFn, false);
529    },
530
531    one(element, event, handler, delegationFn) {
532      addHandler(element, event, handler, delegationFn, true);
533    },
534
535    off(element, originalTypeEvent, handler, delegationFn) {
536      if (typeof originalTypeEvent !== 'string' || !element) {
537        return;
538      }
539
540      const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
541      const inNamespace = typeEvent !== originalTypeEvent;
542      const events = getEvent(element);
543      const isNamespace = originalTypeEvent.startsWith('.');
544
545      if (typeof originalHandler !== 'undefined') {
546        // Simplest case: handler is passed, remove that listener ONLY.
547        if (!events || !events[typeEvent]) {
548          return;
549        }
550
551        removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);
552        return;
553      }
554
555      if (isNamespace) {
556        Object.keys(events).forEach(elementEvent => {
557          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
558        });
559      }
560
561      const storeElementEvent = events[typeEvent] || {};
562      Object.keys(storeElementEvent).forEach(keyHandlers => {
563        const handlerKey = keyHandlers.replace(stripUidRegex, '');
564
565        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
566          const event = storeElementEvent[keyHandlers];
567          removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
568        }
569      });
570    },
571
572    trigger(element, event, args) {
573      if (typeof event !== 'string' || !element) {
574        return null;
575      }
576
577      const $ = getjQuery();
578      const typeEvent = getTypeEvent(event);
579      const inNamespace = event !== typeEvent;
580      const isNative = nativeEvents.has(typeEvent);
581      let jQueryEvent;
582      let bubbles = true;
583      let nativeDispatch = true;
584      let defaultPrevented = false;
585      let evt = null;
586
587      if (inNamespace && $) {
588        jQueryEvent = $.Event(event, args);
589        $(element).trigger(jQueryEvent);
590        bubbles = !jQueryEvent.isPropagationStopped();
591        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
592        defaultPrevented = jQueryEvent.isDefaultPrevented();
593      }
594
595      if (isNative) {
596        evt = document.createEvent('HTMLEvents');
597        evt.initEvent(typeEvent, bubbles, true);
598      } else {
599        evt = new CustomEvent(event, {
600          bubbles,
601          cancelable: true
602        });
603      } // merge custom information in our event
604
605
606      if (typeof args !== 'undefined') {
607        Object.keys(args).forEach(key => {
608          Object.defineProperty(evt, key, {
609            get() {
610              return args[key];
611            }
612
613          });
614        });
615      }
616
617      if (defaultPrevented) {
618        evt.preventDefault();
619      }
620
621      if (nativeDispatch) {
622        element.dispatchEvent(evt);
623      }
624
625      if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
626        jQueryEvent.preventDefault();
627      }
628
629      return evt;
630    }
631
632  };
633
634  /**
635   * --------------------------------------------------------------------------
636   * Bootstrap (v5.1.0): dom/data.js
637   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
638   * --------------------------------------------------------------------------
639   */
640
641  /**
642   * ------------------------------------------------------------------------
643   * Constants
644   * ------------------------------------------------------------------------
645   */
646  const elementMap = new Map();
647  var Data = {
648    set(element, key, instance) {
649      if (!elementMap.has(element)) {
650        elementMap.set(element, new Map());
651      }
652
653      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
654      // can be removed later when multiple key/instances are fine to be used
655
656      if (!instanceMap.has(key) && instanceMap.size !== 0) {
657        // eslint-disable-next-line no-console
658        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
659        return;
660      }
661
662      instanceMap.set(key, instance);
663    },
664
665    get(element, key) {
666      if (elementMap.has(element)) {
667        return elementMap.get(element).get(key) || null;
668      }
669
670      return null;
671    },
672
673    remove(element, key) {
674      if (!elementMap.has(element)) {
675        return;
676      }
677
678      const instanceMap = elementMap.get(element);
679      instanceMap.delete(key); // free up element references if there are no instances left for an element
680
681      if (instanceMap.size === 0) {
682        elementMap.delete(element);
683      }
684    }
685
686  };
687
688  /**
689   * --------------------------------------------------------------------------
690   * Bootstrap (v5.1.0): base-component.js
691   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
692   * --------------------------------------------------------------------------
693   */
694  /**
695   * ------------------------------------------------------------------------
696   * Constants
697   * ------------------------------------------------------------------------
698   */
699
700  const VERSION = '5.1.0';
701
702  class BaseComponent {
703    constructor(element) {
704      element = getElement(element);
705
706      if (!element) {
707        return;
708      }
709
710      this._element = element;
711      Data.set(this._element, this.constructor.DATA_KEY, this);
712    }
713
714    dispose() {
715      Data.remove(this._element, this.constructor.DATA_KEY);
716      EventHandler.off(this._element, this.constructor.EVENT_KEY);
vendor: 5,722 bytes, lines 717-902
717      Object.getOwnPropertyNames(this).forEach(propertyName => {
718        this[propertyName] = null;
719      });
720    }
721
722    _queueCallback(callback, element, isAnimated = true) {
723      executeAfterTransition(callback, element, isAnimated);
724    }
725    /** Static */
726
727
728    static getInstance(element) {
729      return Data.get(getElement(element), this.DATA_KEY);
730    }
731
732    static getOrCreateInstance(element, config = {}) {
733      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
734    }
735
736    static get VERSION() {
737      return VERSION;
738    }
739
740    static get NAME() {
741      throw new Error('You have to implement the static method "NAME", for each component!');
742    }
743
744    static get DATA_KEY() {
745      return `bs.${this.NAME}`;
746    }
747
748    static get EVENT_KEY() {
749      return `.${this.DATA_KEY}`;
750    }
751
752  }
753
754  /**
755   * --------------------------------------------------------------------------
756   * Bootstrap (v5.1.0): util/component-functions.js
757   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
758   * --------------------------------------------------------------------------
759   */
760
761  const enableDismissTrigger = (component, method = 'hide') => {
762    const clickEvent = `click.dismiss${component.EVENT_KEY}`;
763    const name = component.NAME;
764    EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
765      if (['A', 'AREA'].includes(this.tagName)) {
766        event.preventDefault();
767      }
768
769      if (isDisabled(this)) {
770        return;
771      }
772
773      const target = getElementFromSelector(this) || this.closest(`.${name}`);
774      const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
775
776      instance[method]();
777    });
778  };
779
780  /**
781   * --------------------------------------------------------------------------
782   * Bootstrap (v5.1.0): alert.js
783   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
784   * --------------------------------------------------------------------------
785   */
786  /**
787   * ------------------------------------------------------------------------
788   * Constants
789   * ------------------------------------------------------------------------
790   */
791
792  const NAME$d = 'alert';
793  const DATA_KEY$c = 'bs.alert';
794  const EVENT_KEY$c = `.${DATA_KEY$c}`;
795  const EVENT_CLOSE = `close${EVENT_KEY$c}`;
796  const EVENT_CLOSED = `closed${EVENT_KEY$c}`;
797  const CLASS_NAME_FADE$5 = 'fade';
798  const CLASS_NAME_SHOW$8 = 'show';
799  /**
800   * ------------------------------------------------------------------------
801   * Class Definition
802   * ------------------------------------------------------------------------
803   */
804
805  class Alert extends BaseComponent {
806    // Getters
807    static get NAME() {
808      return NAME$d;
809    } // Public
810
811
812    close() {
813      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
814
815      if (closeEvent.defaultPrevented) {
816        return;
817      }
818
819      this._element.classList.remove(CLASS_NAME_SHOW$8);
820
821      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
822
823      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
824    } // Private
825
826
827    _destroyElement() {
828      this._element.remove();
829
830      EventHandler.trigger(this._element, EVENT_CLOSED);
831      this.dispose();
832    } // Static
833
834
835    static jQueryInterface(config) {
836      return this.each(function () {
837        const data = Alert.getOrCreateInstance(this);
838
839        if (typeof config !== 'string') {
840          return;
841        }
842
843        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
844          throw new TypeError(`No method named "${config}"`);
845        }
846
847        data[config](this);
848      });
849    }
850
851  }
852  /**
853   * ------------------------------------------------------------------------
854   * Data Api implementation
855   * ------------------------------------------------------------------------
856   */
857
858
859  enableDismissTrigger(Alert, 'close');
860  /**
861   * ------------------------------------------------------------------------
862   * jQuery
863   * ------------------------------------------------------------------------
864   * add .Alert to jQuery only if jQuery is present
865   */
866
867  defineJQueryPlugin(Alert);
868
869  /**
870   * --------------------------------------------------------------------------
871   * Bootstrap (v5.1.0): button.js
872   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
873   * --------------------------------------------------------------------------
874   */
875  /**
876   * ------------------------------------------------------------------------
877   * Constants
878   * ------------------------------------------------------------------------
879   */
880
881  const NAME$c = 'button';
882  const DATA_KEY$b = 'bs.button';
883  const EVENT_KEY$b = `.${DATA_KEY$b}`;
884  const DATA_API_KEY$7 = '.data-api';
885  const CLASS_NAME_ACTIVE$3 = 'active';
886  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
887  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;
888  /**
889   * ------------------------------------------------------------------------
890   * Class Definition
891   * ------------------------------------------------------------------------
892   */
893
894  class Button extends BaseComponent {
895    // Getters
896    static get NAME() {
897      return NAME$c;
898    } // Public
899
900
901    toggle() {
902      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle(
902)` method
903      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
904    } // Static
905
906
907    static jQueryInterface(config) {
908      return this.each(function () {
909        const data = Button.getOrCreateInstance(this);
910
911        if (config === 'toggle') {
912          data[config]();
913        }
914      });
915    }
916
917  }
918  /**
919   * ------------------------------------------------------------------------
920   * Data Api implementation
921   * ------------------------------------------------------------------------
922   */
923
924
925  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
926    event.preventDefault();
927    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
928    const data = Button.getOrCreateInstance(button);
929    data.toggle();
930  });
931  /**
932   * ------------------------------------------------------------------------
933   * jQuery
934   * ------------------------------------------------------------------------
935   * add .Button to jQuery only if jQuery is present
936   */
937
938  defineJQueryPlugin(Button);
939
940  /**
941   * --------------------------------------------------------------------------
942   * Bootstrap (v5.1.0): dom/manipulator.js
943   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
944   * --------------------------------------------------------------------------
945   */
946  function normalizeData(val) {
947    if (val === 'true') {
948      return true;
949    }
950
951    if (val === 'false') {
952      return false;
953    }
954
955    if (val === Number(val).toString()) {
956      return Number(val);
957    }
958
959    if (val === '' || val === 'null') {
960      return null;
961    }
962
963    return val;
964  }
965
966  function normalizeDataKey(key) {
967    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
968  }
969
970  const Manipulator = {
971    setDataAttribute(element, key, value) {
972      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
973    },
974
975    removeDataAttribute(element, key) {
976      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
977    },
978
979    getDataAttributes(element) {
980      if (!element) {
981        return {};
982      }
983
984      const attributes = {};
985      Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
986        let pureKey = key.replace(/^bs/, '');
987        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
988        attributes[pureKey] = normalizeData(element.dataset[key]);
989      });
990      return attributes;
991    },
992
993    getDataAttribute(element, key) {
994      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
995    },
996
997    offset(element) {
998      const rect = element.getBoundingClientRect();
999      return {
1000        top: rect.top + window.pageYOffset,
1001        left: rect.left + window.pageXOffset
1002      };
1003    },
1004
1005    position(element) {
1006      return {
1007        top: element.offsetTop,
1008        left: element.offsetLeft
1009      };
1010    }
1011
1012  };
1013
1014  /**
1015   * --------------------------------------------------------------------------
1016   * Bootstrap (v5.1.0): dom/selector-engine.js
1017   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1018   * --------------------------------------------------------------------------
1019   */
1020  const NODE_TEXT = 3;
1021  const SelectorEngine = {
1022    find(selector, element = document.documentElement) {
1023      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
1024    },
1025
1026    findOne(selector, element = document.documentElement) {
1027      return Element.prototype.querySelector.call(element, selector);
1028    },
1029
1030    children(element, selector) {
1031      return [].concat(...element.children).filter(child => child.matches(selector));
1032    },
1033
1034    parents(element, selector) {
1035      const parents = [];
1036      let ancestor = element.parentNode;
1037
1038      while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
1039        if (ancestor.matches(selector)) {
1040          parents.push(ancestor);
1041        }
1042
1043        ancestor = ancestor.parentNode;
1044      }
1045
1046      return parents;
1047    },
1048
1049    prev(element, selector) {
1050      let previous = element.previousElementSibling;
1051
1052      while (previous) {
1053        if (previous.matches(selector)) {
1054          return [previous];
1055        }
1056
1057        previous = previous.previousElementSibling;
1058      }
1059
1060      return [];
1061    },
1062
1063    next(element, selector) {
1064      let next = element.nextElementSibling;
1065
1066      while (next) {
1067        if (next.matches(selector)) {
1068          return [next];
1069        }
1070
1071        next = next.nextElementSibling;
1072      }
1073
1074      return [];
1075    },
1076
1077    focusableChildren(element) {
1078      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
1079      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
1080    }
1081
1082  };
1083
1084  /**
1085   * --------------------------------------------------------------------------
1086   * Bootstrap (v5.1.0): carousel.js
1087   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1088   * --------------------------------------------------------------------------
1089   */
1090  /**
1091   * ------------------------------------------------------------------------
1092   * Constants
1093   * ------------------------------------------------------------------------
1094   */
1095
1096  const NAME$b = 'carousel';
1097  const DATA_KEY$a = 'bs.carousel';
1098  const EVENT_KEY$a = `.${DATA_KEY$a}`;
1099  const DATA_API_KEY$6 = '.data-api';
1100  const ARROW_LEFT_KEY = 'ArrowLeft';
1101  const ARROW_RIGHT_KEY = 'ArrowRight';
1102  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1103
1104  const SWIPE_THRESHOLD = 40;
1105  const Default$a = {
1106    interval: 5000,
1107    keyboard: true,
1108    slide: false,
1109    pause: 'hover',
1110    wrap: true,
1111    touch: true
1112  };
1113  const DefaultType$a = {
1114    interval: '(number|boolean)',
1115    keyboard: 'boolean',
1116    slide: '(boolean|string)',
1117    pause: '(string|boolean)',
1118    wrap: 'boolean',
1119    touch: 'boolean'
1120  };
1121  const ORDER_NEXT = 'next';
1122  const ORDER_PREV = 'prev';
1123  const DIRECTION_LEFT = 'left';
1124  const DIRECTION_RIGHT = 'right';
1125  const KEY_TO_DIRECTION = {
1126    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,
1127    [ARROW_RIGHT_KEY]: DIRECTION_LEFT
1128  };
1129  const EVENT_SLIDE = `slide${EVENT_KEY$a}`;
1130  const EVENT_SLID = `slid${EVENT_KEY$a}`;
1131  const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;
1132  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;
1133  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;
1134  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;
1135  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;
1136  const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;
1137  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;
1138  const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;
1139  const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
1140  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;
1141  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
1142  const CLASS_NAME_CAROUSEL = 'carousel';
1143  const CLASS_NAME_ACTIVE$2 = 'active';
1144  const CLASS_NAME_SLIDE = 'slide';
1145  const CLASS_NAME_END = 'carousel-item-end';
1146  const CLASS_NAME_START = 'carousel-item-start';
1147  const CLASS_NAME_NEXT = 'carousel-item-next';
1148  const CLASS_NAME_PREV = 'carousel-item-prev';
1149  const CLASS_NAME_POINTER_EVENT = 'pointer-event';
1150  const SELECTOR_ACTIVE$1 = '.active';
1151  const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
1152  const SELECTOR_ITEM = '.carousel-item';
1153  const SELECTOR_ITEM_IMG = '.carousel-item img';
1154  const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
1155  const SELECTOR_INDICATORS = '.carousel-indicators';
1156  const SELECTOR_INDICATOR = '[data-bs-target]';
1157  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
1158  const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
1159  const POINTER_TYPE_TOUCH = 'touch';
1160  const POINTER_TYPE_PEN = 'pen';
1161  /**
1162   * ------------------------------------------------------------------------
1163   * Class Definition
1164   * ------------------------------------------------------------------------
1165   */
1166
1167  class Carousel extends BaseComponent {
1168    constructor(element, config) {
1169      super(element);
1170      this._items = null;
1171      this._interval = null;
1172      this._activeElement = null;
1173      this._isPaused = false;
1174      this._isSliding = false;
1175      this.touchTimeout = null;
1176      this.touchStartX = 0;
1177      this.touchDeltaX = 0;
1178      this._config = this._getConfig(config);
1179      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
1180      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
1181      this._pointerEvent = Boolean(window.PointerEvent);
1182
1183      this._addEventListeners();
1184    } // Getters
1185
1186
1187    static get Default() {
1188      return Default$a;
1189    }
1190
1191    static get NAME() {
1192      return NAME$b;
1193    } // Public
1194
1195
1196    next() {
1197      this._slide(ORDER_NEXT);
1198    }
1199
1200    nextWhenVisible() {
1201      // Don't call next when the page isn't visible
1202      // or the carousel or its parent isn't visible
1203      if (!document.hidden && isVisible(this._element)) {
1204        this.next();
1205      }
1206    }
1207
1208    prev() {
1209      this._slide(ORDER_PREV);
1210    }
1211
1212    pause(event) {
1213      if (!event) {
1214        this._isPaused = true;
1215      }
1216
1217      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {
1218        triggerTransitionEnd(this._element);
1219        this.cycle(true);
1220      }
1221
1222      clearInterval(this._interval);
1223      this._interval = null;
1224    }
1225
1226    cycle(event) {
1227      if (!event) {
1228        this._isPaused = false;
1229      }
1230
1231      if (this._interval) {
1232        clearInterval(this._interval);
1233        this._interval = null;
1234      }
1235
1236      if (this._config && this._config.interval && !this._isPaused) {
1237        this._updateInterval();
1238
1239        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
1240      }
1241    }
1242
1243    to(index) {
1244      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1245
1246      const activeIndex = this._getItemIndex(this._activeElement);
1247
1248      if (index > this._items.length - 1 || index < 0) {
1249        return;
1250      }
1251
1252      if (this._isSliding) {
1253        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
1254        return;
1255      }
1256
1257      if (activeIndex === index) {
1258        this.pause();
1259        this.cycle();
1260        return;
1261      }
1262
1263      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
1264
1265      this._slide(order, this._items[index]);
1266    } // Private
1267
1268
1269    _getConfig(config) {
1270      config = { ...Default$a,
1271        ...Manipulator.getDataAttributes(this._element),
1272        ...(typeof config === 'object' ? config : {})
1273      };
1274      typeCheckConfig(NAME$b, config, DefaultType$a);
1275      return config;
1276    }
1277
1278    _handleSwipe() {
1279      const absDeltax = Math.abs(this.touchDeltaX);
1280
1281      if (absDeltax <= SWIPE_THRESHOLD) {
1282        return;
1283      }
1284
1285      const direction = absDeltax / this.touchDeltaX;
1286      this.touchDeltaX = 0;
1287
1288      if (!direction) {
1289        return;
1290      }
1291
1292      this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);
1293    }
1294
1295    _addEventListeners() {
1296      if (this._config.keyboard) {
1297        EventHandler.on(this._element, EVENT_KEYDOWN, event =>
1297 this._keydown(event));
1298      }
1299
1300      if (this._config.pause === 'hover') {
1301        EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));
1302        EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));
1303      }
1304
1305      if (this._config.touch && this._touchSupported) {
1306        this._addTouchEventListeners();
1307      }
1308    }
1309
1310    _addTouchEventListeners() {
1311      const start = event => {
1312        if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
1313          this.touchStartX = event.clientX;
1314        } else if (!this._pointerEvent) {
1315          this.touchStartX = event.touches[0].clientX;
1316        }
1317      };
1318
1319      const move = event => {
1320        // ensure swiping with one touch and not pinching
1321        this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;
1322      };
1323
1324      const end = event => {
1325        if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
1326          this.touchDeltaX = event.clientX - this.touchStartX;
1327        }
1328
1329        this._handleSwipe();
1330
1331        if (this._config.pause === 'hover') {
1332          // If it's a touch-enabled device, mouseenter/leave are fired as
1333          // part of the mouse compatibility events on first tap - the carousel
1334          // would stop cycling until user tapped out of it;
1335          // here, we listen for touchend, explicitly pause the carousel
1336          // (as if it's the second time we tap on it, mouseenter compat event
1337          // is NOT fired) and after a timeout (to allow for mouse compatibility
1338          // events to fire) we explicitly restart cycling
1339          this.pause();
1340
1341          if (this.touchTimeout) {
1342            clearTimeout(this.touchTimeout);
1343          }
1344
1345          this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
1346        }
1347      };
1348
1349      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {
1350        EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault());
1351      });
1352
1353      if (this._pointerEvent) {
1354        EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));
1355        EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));
1356
1357        this._element.classList.add(CLASS_NAME_POINTER_EVENT);
1358      } else {
1359        EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));
1360        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));
1361        EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));
1362      }
1363    }
1364
1365    _keydown(event) {
1366      if (/input|textarea/i.test(event.target.tagName)) {
1367        return;
1368      }
1369
1370      const direction = KEY_TO_DIRECTION[event.key];
1371
1372      if (direction) {
1373        event.preventDefault();
1374
1375        this._slide(direction);
1376      }
1377    }
1378
1379    _getItemIndex(element) {
1380      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];
1381      return this._items.indexOf(element);
1382    }
1383
1384    _getItemByOrder(order, activeElement) {
1385      const isNext = order === ORDER_NEXT;
1386      return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);
1387    }
1388
1389    _triggerSlideEvent(relatedTarget, eventDirectionName) {
1390      const targetIndex = this._getItemIndex(relatedTarget);
1391
1392      const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));
1393
1394      return EventHandler.trigger(this._element, EVENT_SLIDE, {
1395        relatedTarget,
1396        direction: eventDirectionName,
1397        from: fromIndex,
1398        to: targetIndex
1399      });
1400    }
1401
1402    _setActiveIndicatorElement(element) {
1403      if (this._indicatorsElement) {
1404        const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);
1405        activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
1406        activeIndicator.removeAttribute('aria-current');
1407        const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);
1408
1409        for (let i = 0; i < indicators.length; i++) {
1410          if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {
1411            indicators[i].classList.add(CLASS_NAME_ACTIVE$2);
1412            indicators[i].setAttribute('aria-current', 'true');
1413            break;
1414          }
1415        }
1416      }
1417    }
1418
1419    _updateInterval() {
1420      const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1421
1422      if (!element) {
1423        return;
1424      }
1425
1426      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
1427
1428      if (elementInterval) {
1429        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
1430        this._config.interval = elementInterval;
1431      } else {
1432        this._config.interval = this._config.defaultInterval || this._config.interval;
1433      }
1434    }
1435
1436    _slide(directionOrOrder, element) {
1437      const order = this._directionToOrder(directionOrOrder);
1438
1439      const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1440
1441      const activeElementIndex = this._getItemIndex(activeElement);
1442
1443      const nextElement = element || this._getItemByOrder(order, activeElement);
1444
1445      const nextElementIndex = this._getItemIndex(nextElement);
1446
1447      const isCycling = Boolean(this._interval);
1448      const isNext = order === ORDER_NEXT;
1449      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
1450      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
1451
1452      const eventDirectionName = this._orderToDirection(order);
1453
1454      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {
1455        this._isSliding = false;
1456        return;
1457      }
1458
1459      if (this._isSliding) {
1460        return;
1461      }
1462
1463      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
1464
1465      if (slideEvent.defaultPrevented) {
1466        return;
1467      }
1468
1469      if (!activeElement || !nextElement) {
1470        // Some weirdness is happening, so we bail
1471        return;
1472      }
1473
1474      this._isSliding = true;
1475
1476      if (isCycling) {
1477        this.pause();
1478      }
1479
1480      this._setActiveIndicatorElement(nextElement);
1481
1482      this._activeElement = nextElement;
1483
1484      const triggerSlidEvent = () => {
1485        EventHandler.trigger(this._element, EVENT_SLID, {
1486          relatedTarget: nextElement,
1487          direction: eventDirectionName,
1488          from: activeElementIndex,
1489          to: nextElementIndex
1490        });
1491      };
1492
1493      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {
1494        nextElement.classList.add(orderClassName);
1495        reflow(nextElement);
1496        activeElement.classList.add(directionalClassName);
1497        nextElement.classList.add(directionalClassName);
1498
1499        const completeCallBack = () => {
1500          nextElement.classList.remove(directionalClassName, orderClassName);
1501          nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1502          activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
1503          this._isSliding = false;
1504          setTimeout(triggerSlidEvent, 0);
1505        };
1506
1507        this._queueCallback(completeCallBack, activeElement, true);
1508      } else {
1509        activeElement.classList.remove(CLASS_NAME_ACTIVE$2);
1510        nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1511        this._isSliding = false;
1512        triggerSlidEvent();
1513      }
1514
1515      if (isCycling) {
1516        this.cycle();
1517      }
1518    }
1519
1520    _directionToOrder(direction) {
1521      if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
1522        return direction;
1523      }
1524
1525      if (isRTL()) {
1526        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
1527      }
1528
1529      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
1530    }
1531
1532    _orderToDirection(order) {
1533      if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
1534        return order;
1535      }
1536
1537      if (isRTL()) {
1538        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
1539      }
1540
1541      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
1542    } // Static
1543
1544
1545    static carouselInterface(element, config) {
1546      const data = Carousel.getOrCreateInstance(element, config);
1547      let {
1548        _config
1549      } = data;
1550
1551      if (typeof config === 'object') {
1552        _config = { ..._config,
1553          ...config
1554        };
1555      }
1556
1557      const action = typeof config === 'string' ? config : _config.slide;
1558
1559      if (typeof config === 'number') {
1560        data.to(config);
1561      } else if (typeof action === 'string') {
1562        if (typeof data[action] === 'undefined') {
1563          throw new TypeError(`No method named "${action}"`);
1564        }
1565
1566        data[action]();
1567      } else if (_config.interval && _config.ride) {
1568        data.pause();
1569        data.cycle();
1570      }
1571    }
1572
1573    static jQueryInterface(config) {
1574      return this.each(function () {
1575        Carousel.carouselInterface(this, config);
1576      });
1577    }
1578
1579    static dataApiClickHandler(event) {
1580      const target = getElementFromSelector(this);
1581
1582      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
1583        return;
1584      }
1585
1586      const config = { ...Manipulator.getDataAttributes(target),
1587        ...Manipulator.getDataAttributes(this)
1588      };
1589      const slideIndex = this.getAttribute('data-bs-slide-to');
1590
1591      if (slideIndex) {
1592        config.interval = false;
1593      }
1594
1595      Carousel.carouselInterface(target, config);
1596
1597      if (slideIndex) {
1598        Carousel.getInstance(target).to(slideIndex);
1599      }
1600
1601      event.preventDefault();
1602    }
1603
1604  }
1605  /**
1606   * ------------------------------------------------------------------------
1607   * Data Api implementation
1608   * ------------------------------------------------------------------------
1609   */
1610
1611
1612  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);
1613  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
1614    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
1615
1616    for (let i = 0, len = carousels.length; i < len; i++) {
1617      Carousel.carouselInterface(carousels[i], Carousel.getInstance(carou
1617sels[i]));
1618    }
1619  });
1620  /**
1621   * ------------------------------------------------------------------------
1622   * jQuery
1623   * ------------------------------------------------------------------------
1624   * add .Carousel to jQuery only if jQuery is present
1625   */
1626
1627  defineJQueryPlugin(Carousel);
1628
1629  /**
1630   * --------------------------------------------------------------------------
1631   * Bootstrap (v5.1.0): collapse.js
1632   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1633   * --------------------------------------------------------------------------
1634   */
1635  /**
1636   * ------------------------------------------------------------------------
1637   * Constants
1638   * ------------------------------------------------------------------------
1639   */
1640
1641  const NAME$a = 'collapse';
1642  const DATA_KEY$9 = 'bs.collapse';
1643  const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1644  const DATA_API_KEY$5 = '.data-api';
1645  const Default$9 = {
1646    toggle: true,
1647    parent: null
1648  };
1649  const DefaultType$9 = {
1650    toggle: 'boolean',
1651    parent: '(null|element)'
1652  };
1653  const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;
1654  const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;
1655  const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;
1656  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;
1657  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;
1658  const CLASS_NAME_SHOW$7 = 'show';
1659  const CLASS_NAME_COLLAPSE = 'collapse';
1660  const CLASS_NAME_COLLAPSING = 'collapsing';
1661  const CLASS_NAME_COLLAPSED = 'collapsed';
1662  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1663  const WIDTH = 'width';
1664  const HEIGHT = 'height';
1665  const SELECTOR_ACTIVES = '.show, .collapsing';
1666  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
1667  /**
1668   * ------------------------------------------------------------------------
1669   * Class Definition
1670   * ------------------------------------------------------------------------
1671   */
1672
1673  class Collapse extends BaseComponent {
1674    constructor(element, config) {
1675      super(element);
1676      this._isTransitioning = false;
1677      this._config = this._getConfig(config);
1678      this._triggerArray = [];
1679      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1680
1681      for (let i = 0, len = toggleList.length; i < len; i++) {
1682        const elem = toggleList[i];
1683        const selector = getSelectorFromElement(elem);
1684        const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);
1685
1686        if (selector !== null && filterElement.length) {
1687          this._selector = selector;
1688
1689          this._triggerArray.push(elem);
1690        }
1691      }
1692
1693      this._initializeChildren();
1694
1695      if (!this._config.parent) {
1696        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1697      }
1698
1699      if (this._config.toggle) {
1700        this.toggle();
1701      }
1702    } // Getters
1703
1704
1705    static get Default() {
1706      return Default$9;
1707    }
1708
1709    static get NAME() {
1710      return NAME$a;
1711    } // Public
1712
1713
1714    toggle() {
1715      if (this._isShown()) {
1716        this.hide();
1717      } else {
1718        this.show();
1719      }
1720    }
1721
1722    show() {
1723      if (this._isTransitioning || this._isShown()) {
1724        return;
1725      }
1726
1727      let actives = [];
1728      let activesData;
1729
1730      if (this._config.parent) {
1731        const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
1732        actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
1733      }
1734
1735      const container = SelectorEngine.findOne(this._selector);
1736
1737      if (actives.length) {
1738        const tempActiveData = actives.find(elem => container !== elem);
1739        activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
1740
1741        if (activesData && activesData._isTransitioning) {
1742          return;
1743        }
1744      }
1745
1746      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);
1747
1748      if (startEvent.defaultPrevented) {
1749        return;
1750      }
1751
1752      actives.forEach(elemActive => {
1753        if (container !== elemActive) {
1754          Collapse.getOrCreateInstance(elemActive, {
1755            toggle: false
1756          }).hide();
1757        }
1758
1759        if (!activesData) {
1760          Data.set(elemActive, DATA_KEY$9, null);
1761        }
1762      });
1763
1764      const dimension = this._getDimension();
1765
1766      this._element.classList.remove(CLASS_NAME_COLLAPSE);
1767
1768      this._element.classList.add(CLASS_NAME_COLLAPSING);
1769
1770      this._element.style[dimension] = 0;
1771
1772      this._addAriaAndCollapsedClass(this._triggerArray, true);
1773
1774      this._isTransitioning = true;
1775
1776      const complete = () => {
1777        this._isTransitioning = false;
1778
1779        this._element.classList.remove(CLASS_NAME_COLLAPSING);
1780
1781        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1782
1783        this._element.style[dimension] = '';
1784        EventHandler.trigger(this._element, EVENT_SHOWN$5);
1785      };
1786
1787      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1788      const scrollSize = `scroll${capitalizedDimension}`;
1789
1790      this._queueCallback(complete, this._element, true);
1791
1792      this._element.style[dimension] = `${this._element[scrollSize]}px`;
1793    }
1794
1795    hide() {
1796      if (this._isTransitioning || !this._isShown()) {
1797        return;
1798      }
1799
1800      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);
1801
1802      if (startEvent.defaultPrevented) {
1803        return;
1804      }
1805
1806      const dimension = this._getDimension();
1807
1808      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
1809      reflow(this._element);
1810
1811      this._element.classList.add(CLASS_NAME_COLLAPSING);
1812
1813      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1814
1815      const triggerArrayLength = this._triggerArray.length;
1816
1817      for (let i = 0; i < triggerArrayLength; i++) {
1818        const trigger = this._triggerArray[i];
1819        const elem = getElementFromSelector(trigger);
1820
1821        if (elem && !this._isShown(elem)) {
1822          this._addAriaAndCollapsedClass([trigger], false);
1823        }
1824      }
1825
1826      this._isTransitioning = true;
1827
1828      const complete = () => {
1829        this._isTransitioning = false;
1830
1831        this._element.classList.remove(CLASS_NAME_COLLAPSING);
1832
1833        this._element.classList.add(CLASS_NAME_COLLAPSE);
1834
1835        EventHandler.trigger(this._element, EVENT_HIDDEN$5);
1836      };
1837
1838      this._element.style[dimension] = '';
1839
1840      this._queueCallback(complete, this._element, true);
1841    }
1842
1843    _isShown(element = this._element) {
1844      return element.classList.contains(CLASS_NAME_SHOW$7);
1845    } // Private
1846
1847
1848    _getConfig(config) {
1849      config = { ...Default$9,
1850        ...Manipulator.getDataAttributes(this._element),
1851        ...config
1852      };
1853      config.toggle = Boolean(config.toggle); // Coerce string values
1854
1855      config.parent = getElement(config.parent);
1856      typeCheckConfig(NAME$a, config, DefaultType$9);
1857      return config;
1858    }
1859
1860    _getDimension() {
1861      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1862    }
1863
1864    _initializeChildren() {
1865      if (!this._config.parent) {
1866        return;
1867      }
1868
1869      const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
1870      SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
1871        const selected = getElementFromSelector(element);
1872
1873        if (selected) {
1874          this._addAriaAndCollapsedClass([element], this._isShown(selected));
1875        }
1876      });
1877    }
1878
1879    _addAriaAndCollapsedClass(triggerArray, isOpen) {
1880      if (!triggerArray.length) {
1881        return;
1882      }
1883
1884      triggerArray.forEach(elem => {
1885        if (isOpen) {
1886          elem.classList.remove(CLASS_NAME_COLLAPSED);
1887        } else {
1888          elem.classList.add(CLASS_NAME_COLLAPSED);
1889        }
1890
1891        elem.setAttribute('aria-expanded', isOpen);
1892      });
1893    } // Static
1894
1895
1896    static jQueryInterface(config) {
1897      return this.each(function () {
1898        const _config = {};
1899
1900        if (typeof config === 'string' && /show|hide/.test(config)) {
1901          _config.toggle = false;
1902        }
1903
1904        const data = Collapse.getOrCreateInstance(this, _config);
1905
1906        if (typeof config === 'string') {
1907          if (typeof data[config] === 'undefined') {
1908            throw new TypeError(`No method named "${config}"`);
1909          }
1910
1911          data[config]();
1912        }
1913      });
1914    }
1915
1916  }
1917  /**
1918   * ------------------------------------------------------------------------
1919   * Data Api implementation
1920   * ------------------------------------------------------------------------
1921   */
1922
1923
1924  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
1925    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
1926    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
1927      event.preventDefault();
1928    }
1929
1930    const selector = getSelectorFromElement(this);
1931    const selectorElements = SelectorEngine.find(selector);
1932    selectorElements.forEach(element => {
1933      Collapse.getOrCreateInstance(element, {
1934        toggle: false
1935      }).toggle();
1936    });
1937  });
1938  /**
1939   * ------------------------------------------------------------------------
1940   * jQuery
1941   * ------------------------------------------------------------------------
1942   * add .Collapse to jQuery only if jQuery is present
1943   */
1944
1945  defineJQueryPlugin(Collapse);
1946
1947  /**
1948   * --------------------------------------------------------------------------
1949   * Bootstrap (v5.1.0): dropdown.js
1950   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1951   * --------------------------------------------------------------------------
1952   */
1953  /**
1954   * ------------------------------------------------------------------------
1955   * Constants
1956   * ------------------------------------------------------------------------
1957   */
1958
1959  const NAME$9 = 'dropdown';
1960  const DATA_KEY$8 = 'bs.dropdown';
1961  const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1962  const DATA_API_KEY$4 = '.data-api';
1963  const ESCAPE_KEY$2 = 'Escape';
1964  const SPACE_KEY = 'Space';
1965  const TAB_KEY$1 = 'Tab';
1966  const ARROW_UP_KEY = 'ArrowUp';
1967  const ARROW_DOWN_KEY = 'ArrowDown';
1968  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
1969
1970  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);
1971  const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;
1972  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;
1973  const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;
1974  const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;
1975  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;
1976  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;
1977  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;
1978  const CLASS_NAME_SHOW$6 = 'show';
1979  const CLASS_NAME_DROPUP = 'dropup';
1980  const CLASS_NAME_DROPEND = 'dropend';
1981  const CLASS_NAME_DROPSTART = 'dropstart';
1982  const CLASS_NAME_NAVBAR = 'navbar';
1983  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]';
1984  const SELECTOR_MENU = '.dropdown-menu';
1985  const SELECTOR_NAVBAR_NAV = '.navbar-nav';
1986  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
1987  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
1988  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
1989  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
1990  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
1991  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
1992  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
1993  const Default$8 = {
1994    offset: [0, 2],
1995    boundary: 'clippingParents',
1996    reference: 'toggle',
1997    display: 'dynamic',
1998    popperConfig: null,
1999    autoClose: true
2000  };
2001  const DefaultType$8 = {
2002    offset: '(array|string|function)',
2003    boundary: '(string|element)',
2004    reference: '(string|element|object)',
2005    display: 'string',
2006    popperConfig: '(null|object|function)',
2007    autoClose: '(boolean|string)'
2008  };
2009  /**
2010   * ------------------------------------------------------------------------
2011   * Class Definition
2012   * ------------------------------------------------------------------------
2013   */
2014
2015  class Dropdown extends BaseComponent {
2016    constructor(element, config) {
2017      super(element);
2018      this._popper = null;
2019      this._config = this._getConfig(config);
2020      this._menu = this._getMenuElement();
2021      this._inNavbar = this._detectNavbar();
2022    } // Getters
2023
2024
2025    static get Default() {
2026      return Default$8;
2027    }
2028
2029    static get DefaultType() {
2030      return DefaultType$8;
2031    }
2032
2033    static get NAME() {
2034      return NAME$9;
2035    } // Public
2036
2037
2038    toggle() {
2039      return this._isShown() ? this.hide() : this.show();
2040    }
2041
2042    show() {
2043      if (isDisabled(this._element) || this._isShown(this._menu)) {
2044        return;
2045      }
2046
2047      const relatedTarget = {
2048        relatedTarget: this._element
2049      };
2050      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);
2051
2052      if (showEvent.defaultPrevented) {
2053        return;
2054      }
2055
2056      const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar
2057
2058      if (this._inNavbar) {
2059        Manipulator.setDataAttribute(this._menu, 'popper', 'none');
2060      } else {
2061        this._createPopper(parent);
2062      } // If this is a touch-enabled device we add extra
2063      // empty mouseover listeners to the body's immediate children;
2064      // only needed because of broken event delegation on iOS
2065      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2066
2067
2068      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
2069        [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));
2070      }
2071
2072      this._element.focus();
2073
2074      this._element.setAttribute('aria-expanded', true);
2075
2076      this._menu.classList.add(CLASS_NAME_SHOW$6);
2077
2078      this._element.classList.add(CLASS_NAME_SHOW$6);
2079
2080      EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
2081    }
2082
2083    hide() {
2084      if (isDisabled(this._element) || !this._isShown(this._menu)) {
2085        return;
2086      }
2087
2088      const relatedTarget = {
2089        relatedTarget: this._element
2090      };
2091
2092      this._completeHide(relatedTarget);
2093    }
2094
2095    dispose() {
2096      if (this._popper) {
2097        this._popper.destroy();
2098      }
2099
2100      super.dispose();
2101    }
2102
2103    update() {
2104      this._inNavbar = this._detectNavbar();
2105
2106      if (this._popper) {
2107        this._popper.update();
2108      }
2109    } // Private
2110
2111
2112    _completeHide(relatedTarget) {
2113      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
2114
2115      if (hideEvent.defaultPrevented) {
2116        return;
2117      } // If this is a touch-enabled device we remove the extra
2118      // empty mouseover listeners we added for iOS support
2119
2120
2121      if ('ontouchstart' in document.documentElement) {
2122        [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));
2123      }
2124
2125      if (this._popper) {
2126        this._popper.destroy();
2127      }
2128
2129      this._menu.classList.remove(CLASS_NAME_SHOW$6);
2130
2131      this._element.classList.remove(CLASS_NAME_SHOW$6);
2132
2133      this._element.setAttribute('aria-expanded', 'false');
2134
2135      Manipulator.removeDataAttribute(this._menu, 'popper');
2136      EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);
2137    }
2138
2139    _getConfig(config) {
2140      config = { ...this.constructor.Default,
2141        ...Manipulator.getDataAttributes(this._element),
2142        ...config
2143      };
2144      typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
2145
2146      if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
2147        // Popper virtual elements require a getBoundingClientRect method
2148        throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2149      }
2150
2151      return config;
2152    }
2153
2154    _createPopper(parent) {
2155      if (typeof Popper__namespace === 'undefined') {
2156        throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
2157      }
2158
2159      let referenceElement = this._element;
2160
2161      if (this._config.reference === 'parent') {
2162        referenceElement = parent;
2163      } else if (isElement(this._config.reference)) {
2164        referenceElement = getElement(this._config.reference);
2165      } else if (typeof this._config.reference === 'object') {
2166        referenceElement = this._config.reference;
2167      }
2168
2169      const popperConfig = this._getPopperConfig();
2170
2171      const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
2172      this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
2173
2174      if (isDisplayStatic) {
2175        Manipulator.setDataAttribute(this._menu, 'popper', 'static');
2176      }
2177    }
2178
2179    _isShown(element = this._element) {
2180      return element.classList.contains(CLASS_NAME_SHOW$6);
2181    }
2182
2183    _getMenuElement() {
2184      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
2185    }
2186
2187    _getPlacement() {
2188      const parentDropdown = this._element.parentNode;
2189
2190      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
2191        return PLACEMENT_RIGHT;
2192      }
2193
2194      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
2195        return PLACEMENT_LEFT;
2196      } // We need to trim the value because custom properties can also include spaces
2197
2198
2199      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
2200
2201      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
2202        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
2203      }
2204
2205      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
2206    }
2207
2208    _detectNavbar() {
2209      return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
2210    }
2211
2212    _getOffset() {
2213      const {
2214        offset
2215      } = this._config;
2216
2217      if (typeof offset === 'string') {
2218        return offset.split(',').map(val => Number.parseInt(val, 10));
2219      }
2220
2221      if (typeof offset === 'function') {
2222        return popperData => offset(popperData, this._element);
2223      }
2224
2225      return offset;
2226    }
2227
2228    _getPopperConfig() {
2229      const defaultBsPopperConfig = {
2230        placement: this._getPlacement(),
2231        modifiers: [{
2232          name: 'preventOverflow',
2233          options: {
2234            boundary: this._config.boundary
2235          }
2236        }, {
2237          name: 'offset',
2238          options: {
2239            offset: this._getOffset()
2240          }
2241        }]
2242      }; // Disable Popper if we have a static display
2243
2244      if (this._config.display === 'static') {
2245        defaultBsPopperConfig.modifiers = [{
2246          name: 'applyStyles',
2247          enabled: false
2248        }];
2249      }
2250
2251      return { ...defaultBsPopperConfig,
2252        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
2253      };
2254    }
2255
2256    _selectMenuItem({
2257      key,
2258      target
2259    }) {
2260      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
2261
2262      if (!items.length) {
2263        return;
2264      } // if target isn't included in items (e.g. when expanding the dropdown)
2265      // allow cycling to get the last item in case key equals ARROW_UP_KEY
2266
2267
2268      getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
2269    } // Static
2270
2271
2272    static jQueryInterface(config) {
2273      return this.each(function () {
2274        const data = Dropdown.getOrCreateInstance(this, config);
2275
2276        if (typeof config !== 'string') {
2277          return;
2278        }
2279
2280        if (typeof data[config] === 'undefined') {
2281          throw new TypeError(`No method named "${config}"`);
2282        }
2283
2284        data[config]();
2285      });
2286    }
2287
2288    static clearMenus(event) {
2289      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {
2290        return;
2291      }
2292
2293      const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);
2294
2295      for (let i = 0, len = toggles.length; i < len; i++) {
2296        const context = Dropdown.getInstance(toggles[i]);
2297
2298        if (!context || context._config.autoClose === false) {
2299          continue;
2300        }
2301
2302        if (!context._isShown()) {
2303          continue;
2304        }
2305
2306        const relatedTarget = {
2307          relatedTarget: context._element
2308        };
2309
2310        if (event) {
2311          const composedPath = event.composedPath();
2312          const isMenuTarget = composedPath.includes(context._menu);
2313
2314          if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
2315            continue;
2316          } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
2317
2318
2319          if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
2320            continue;
2321          }
2322
2323          if (event.type === 'click') {
2324            relatedTarget.clickEvent = event;
2325          }
2326        }
2327
2328        context._completeHide(relatedTarget);
2329      }
2330    }
2331
2332    static getParentFromElement(element) {
2333      return getElementFromSelector(element) || element.parentNode;
2334    }
2335
2336    static dataApiKeydownHandler(event) {
2337      // If not input/textarea:
2338      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
2339      // If input/textarea:
2340      //  - If space key => not a dropdown command
2341      //  - If key is other than escape
2342      //    - If key is not up or down => not a dropdown command
2343      //    - If trigger inside the menu => not a dropdown command
2344      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
2345        return;
2346      }
2347
2348      const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
2349
2350      if (!isActive && event.key === ESCAPE_KEY$2) {
2351        return;
2352      }
2353
2354      event.preventDefault();
2355      event.stopPropagation();
2356
2357      if (isDisabled(this)) {
2358        return;
2359      }
2360
2361      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this 
2361: SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2362      const instance = Dropdown.getOrCreateInstance(getToggleButton);
2363
2364      if (event.key === ESCAPE_KEY$2) {
2365        instance.hide();
2366        return;
2367      }
2368
2369      if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
2370        if (!isActive) {
2371          instance.show();
2372        }
2373
2374        instance._selectMenuItem(event);
2375
2376        return;
2377      }
2378
2379      if (!isActive || event.key === SPACE_KEY) {
2380        Dropdown.clearMenus();
2381      }
2382    }
2383
2384  }
2385  /**
2386   * ------------------------------------------------------------------------
2387   * Data Api implementation
2388   * ------------------------------------------------------------------------
2389   */
2390
2391
2392  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
2393  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
2394  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
2395  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
2396  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
2397    event.preventDefault();
2398    Dropdown.getOrCreateInstance(this).toggle();
2399  });
2400  /**
2401   * ------------------------------------------------------------------------
2402   * jQuery
2403   * ------------------------------------------------------------------------
2404   * add .Dropdown to jQuery only if jQuery is present
2405   */
2406
2407  defineJQueryPlugin(Dropdown);
2408
2409  /**
2410   * --------------------------------------------------------------------------
2411   * Bootstrap (v5.1.0): util/scrollBar.js
2412   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2413   * --------------------------------------------------------------------------
2414   */
2415  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2416  const SELECTOR_STICKY_CONTENT = '.sticky-top';
2417
2418  class ScrollBarHelper {
2419    constructor() {
2420      this._element = document.body;
2421    }
2422
2423    getWidth() {
2424      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
2425      const documentWidth = document.documentElement.clientWidth;
2426      return Math.abs(window.innerWidth - documentWidth);
2427    }
2428
2429    hide() {
2430      const width = this.getWidth();
2431
2432      this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
2433
2434
2435      this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
2436
2437
2438      this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
2439
2440      this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
2441    }
2442
2443    _disableOverFlow() {
2444      this._saveInitialAttribute(this._element, 'overflow');
2445
2446      this._element.style.overflow = 'hidden';
2447    }
2448
2449    _setElementAttributes(selector, styleProp, callback) {
2450      const scrollbarWidth = this.getWidth();
2451
2452      const manipulationCallBack = element => {
2453        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
2454          return;
2455        }
2456
2457        this._saveInitialAttribute(element, styleProp);
2458
2459        const calculatedValue = window.getComputedStyle(element)[styleProp];
2460        element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
2461      };
2462
2463      this._applyManipulationCallback(selector, manipulationCallBack);
2464    }
2465
2466    reset() {
2467      this._resetElementAttributes(this._element, 'overflow');
2468
2469      this._resetElementAttributes(this._element, 'paddingRight');
2470
2471      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
2472
2473      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
2474    }
2475
2476    _saveInitialAttribute(element, styleProp) {
2477      const actualValue = element.style[styleProp];
2478
2479      if (actualValue) {
2480        Manipulator.setDataAttribute(element, styleProp, actualValue);
2481      }
2482    }
2483
2484    _resetElementAttributes(selector, styleProp) {
2485      const manipulationCallBack = element => {
2486        const value = Manipulator.getDataAttribute(element, styleProp);
2487
2488        if (typeof value === 'undefined') {
2489          element.style.removeProperty(styleProp);
2490        } else {
2491          Manipulator.removeDataAttribute(element, styleProp);
2492          element.style[styleProp] = value;
2493        }
2494      };
2495
2496      this._applyManipulationCallback(selector, manipulationCallBack);
2497    }
2498
2499    _applyManipulationCallback(selector, callBack) {
2500      if (isElement(selector)) {
2501        callBack(selector);
2502      } else {
2503        SelectorEngine.find(selector, this._element).forEach(callBack);
2504      }
2505    }
2506
2507    isOverflowing() {
2508      return this.getWidth() > 0;
2509    }
2510
2511  }
2512
2513  /**
2514   * --------------------------------------------------------------------------
2515   * Bootstrap (v5.1.0): util/backdrop.js
2516   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2517   * --------------------------------------------------------------------------
2518   */
2519  const Default$7 = {
2520    className: 'modal-backdrop',
2521    isVisible: true,
2522    // if false, we use the backdrop helper without adding any element to the dom
2523    isAnimated: false,
2524    rootElement: 'body',
2525    // give the choice to place backdrop under different elements
2526    clickCallback: null
2527  };
2528  const DefaultType$7 = {
2529    className: 'string',
2530    isVisible: 'boolean',
2531    isAnimated: 'boolean',
2532    rootElement: '(element|string)',
2533    clickCallback: '(function|null)'
2534  };
2535  const NAME$8 = 'backdrop';
2536  const CLASS_NAME_FADE$4 = 'fade';
2537  const CLASS_NAME_SHOW$5 = 'show';
2538  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;
2539
2540  class Backdrop {
2541    constructor(config) {
2542      this._config = this._getConfig(config);
2543      this._isAppended = false;
2544      this._element = null;
2545    }
2546
2547    show(callback) {
2548      if (!this._config.isVisible) {
2549        execute(callback);
2550        return;
2551      }
2552
2553      this._append();
2554
2555      if (this._config.isAnimated) {
2556        reflow(this._getElement());
2557      }
2558
2559      this._getElement().classList.add(CLASS_NAME_SHOW$5);
2560
2561      this._emulateAnimation(() => {
2562        execute(callback);
2563      });
2564    }
2565
2566    hide(callback) {
2567      if (!this._config.isVisible) {
2568        execute(callback);
2569        return;
2570      }
2571
2572      this._getElement().classList.remove(CLASS_NAME_SHOW$5);
2573
2574      this._emulateAnimation(() => {
2575        this.dispose();
2576        execute(callback);
2577      });
2578    } // Private
2579
2580
2581    _getElement() {
2582      if (!this._element) {
2583        const backdrop = document.createElement('div');
2584        backdrop.className = this._config.className;
2585
2586        if (this._config.isAnimated) {
2587          backdrop.classList.add(CLASS_NAME_FADE$4);
2588        }
2589
2590        this._element = backdrop;
2591      }
2592
2593      return this._element;
2594    }
2595
2596    _getConfig(config) {
2597      config = { ...Default$7,
2598        ...(typeof config === 'object' ? config : {})
2599      }; // use getElement() with the default "body" to get a fresh Element on each instantiation
2600
2601      config.rootElement = getElement(config.rootElement);
2602      typeCheckConfig(NAME$8, config, DefaultType$7);
2603      return config;
2604    }
2605
2606    _append() {
2607      if (this._isAppended) {
2608        return;
2609      }
2610
2611      this._config.rootElement.append(this._getElement());
2612
2613      EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
2614        execute(this._config.clickCallback);
2615      });
2616      this._isAppended = true;
2617    }
2618
2619    dispose() {
2620      if (!this._isAppended) {
2621        return;
2622      }
2623
2624      EventHandler.off(this._element, EVENT_MOUSEDOWN);
2625
2626      this._element.remove();
2627
2628      this._isAppended = false;
2629    }
2630
2631    _emulateAnimation(callback) {
2632      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
2633    }
2634
2635  }
2636
2637  /**
2638   * --------------------------------------------------------------------------
2639   * Bootstrap (v5.1.0): util/focustrap.js
2640   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2641   * --------------------------------------------------------------------------
2642   */
2643  const Default$6 = {
2644    trapElement: null,
2645    // The element to trap focus inside of
2646    autofocus: true
2647  };
2648  const DefaultType$6 = {
2649    trapElement: 'element',
2650    autofocus: 'boolean'
2651  };
2652  const NAME$7 = 'focustrap';
2653  const DATA_KEY$7 = 'bs.focustrap';
2654  const EVENT_KEY$7 = `.${DATA_KEY$7}`;
2655  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;
2656  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
2657  const TAB_KEY = 'Tab';
2658  const TAB_NAV_FORWARD = 'forward';
2659  const TAB_NAV_BACKWARD = 'backward';
2660
2661  class FocusTrap {
2662    constructor(config) {
2663      this._config = this._getConfig(config);
2664      this._isActive = false;
2665      this._lastTabNavDirection = null;
2666    }
2667
2668    activate() {
2669      const {
2670        trapElement,
2671        autofocus
2672      } = this._config;
2673
2674      if (this._isActive) {
2675        return;
2676      }
2677
2678      if (autofocus) {
2679        trapElement.focus();
2680      }
2681
2682      EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop
2683
2684      EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));
2685      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
2686      this._isActive = true;
2687    }
2688
2689    deactivate() {
2690      if (!this._isActive) {
2691        return;
2692      }
2693
2694      this._isActive = false;
2695      EventHandler.off(document, EVENT_KEY$7);
2696    } // Private
2697
2698
2699    _handleFocusin(event) {
2700      const {
2701        target
2702      } = event;
2703      const {
2704        trapElement
2705      } = this._config;
2706
2707      if (target === document || target === trapElement || trapElement.contains(target)) {
2708        return;
2709      }
2710
2711      const elements = SelectorEngine.focusableChildren(trapElement);
2712
2713      if (elements.length === 0) {
2714        trapElement.focus();
2715      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
2716        elements[elements.length - 1].focus();
2717      } else {
2718        elements[0].focus();
2719      }
2720    }
2721
2722    _handleKeydown(event) {
2723      if (event.key !== TAB_KEY) {
2724        return;
2725      }
2726
2727      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
2728    }
2729
2730    _getConfig(config) {
2731      config = { ...Default$6,
2732        ...(typeof config === 'object' ? config : {})
2733      };
2734      typeCheckConfig(NAME$7, config, DefaultType$6);
2735      return config;
2736    }
2737
2738  }
2739
2740  /**
2741   * --------------------------------------------------------------------------
2742   * Bootstrap (v5.1.0): modal.js
2743   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2744   * --------------------------------------------------------------------------
2745   */
2746  /**
2747   * ------------------------------------------------------------------------
2748   * Constants
2749   * ------------------------------------------------------------------------
2750   */
2751
2752  const NAME$6 = 'modal';
2753  const DATA_KEY$6 = 'bs.modal';
2754  const EVENT_KEY$6 = `.${DATA_KEY$6}`;
2755  const DATA_API_KEY$3 = '.data-api';
2756  const ESCAPE_KEY$1 = 'Escape';
2757  const Default$5 = {
2758    backdrop: true,
2759    keyboard: true,
2760    focus: true
2761  };
2762  const DefaultType$5 = {
2763    backdrop: '(boolean|string)',
2764    keyboard: 'boolean',
2765    focus: 'boolean'
2766  };
2767  const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;
2768  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;
2769  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;
2770  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;
2771  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;
2772  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;
2773  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
2774  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
2775  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
2776  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
2777  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
2778  const CLASS_NAME_OPEN = 'modal-open';
2779  const CLASS_NAME_FADE$3 = 'fade';
2780  const CLASS_NAME_SHOW$4 = 'show';
2781  const CLASS_NAME_STATIC = 'modal-static';
2782  const SELECTOR_DIALOG = '.modal-dialog';
2783  const SELECTOR_MODAL_BODY = '.modal-body';
2784  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
2785  /**
2786   * ------------------------------------------------------------------------
2787   * Class Definition
2788   * ------------------------------------------------------------------------
2789   */
2790
2791  class Modal extends BaseComponent {
2792    constructor(element, config) {
2793      super(element);
2794      this._config = this._getConfig(config);
2795      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
2796      this._backdrop = this._initializeBackDrop();
2797      this._focustrap = this._initializeFocusTrap();
2798      this._isShown = false;
2799      this._ignoreBackdropClick = false;
2800      this._isTransitioning = false;
2801      this._scrollBar = new ScrollBarHelper();
2802    } // Getters
2803
2804
2805    static get Default() {
2806      return Default$5;
2807    }
2808
2809    static get NAME() {
2810      return NAME$6;
2811    } // Public
2812
2813
2814    toggle(relatedTarget) {
2815      return this._isShown ? this.hide() : this.show(relatedTarget);
2816    }
2817
2818    show(relatedTarget) {
2819      if (this._isShown || this._isTransitioning) {
2820        return;
2821      }
2822
2823      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
2824        relatedTarget
2825      });
2826
2827      if (showEvent.defaultPrevented) {
2828        return;
2829      }
2830
2831      this._isShown = true;
2832
2833      if (this._isAnimated()) {
2834        this._isTransitioning = true;
2835      }
2836
2837      this._scrollBar.hide();
2838
2839      document.body.classList.add(CLASS_NAME_OPEN);
2840
2841      this._adjustDialog();
2842
2843      this._setEscapeEvent();
2844
2845      this._setResizeEvent();
2846
2847      EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
2848        EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
2849          if (event.target === this._element) {
2850            this._ignoreBackdropClick = true;
2851          }
2852        });
2853      });
2854
2855      this._showBackdrop(() => this._showElement(relatedTarget));
2856    }
2857
2858    hide() {
2859      if (!this._isShown || this._isTransitioning) {
2860        return;
2861      }
2862
2863      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
2864
2865      if (hideEvent.defaultPrevented) {
2866        return;
2867      }
2868
2869      this._isShown = false;
2870
2871      const isAnimated = this._isAnimated();
2872
2873      if (isAnimated) {
2874        this._isTransitioning = true;
2875      }
2876
2877      this._setEscapeEvent();
2878
2879      this._setResizeEvent();
2880
2881      this._focustrap.deactivate();
2882
2883      this._element.classList.remove(CLASS_NAME_SHOW$4);
2884
2885      EventHandler.off(this._element, EVENT_CLICK_DISMISS);
2886      EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
2887
2888      this._queueCallback(() => this._hideModal(), this._element, isAnimated);
2889    }
2890
2891    dispose() {
2892      [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));
2893
2894      this._backdrop.dispose();
2895
2896      this._focustrap.deactivate();
2897
2898      super.dispose();
2899    }
2900
2901    handleUpdate() {
2902      this._adjustDialog();
2903    } // Private
2904
2905
2906    _initializeBackDrop() {
2907      return new Backdrop({
2908        isVisible: Boolean(this._config.backdrop),
2909        // 'static' option will be translated to true, and booleans will keep their value
2910        isAnimated: this._isAnimated()
2911      });
2912    }
2913
2914    _initializeFocusTrap() {
2915      return new FocusTrap({
2916        trapElement: this._element
2917      });
2918    }
2919
2920    _getConfig(config) {
2921      config = { ...Default$5,
2922        ...Manipulator.getDataAttributes(this._element),
2923        ...(typeof config === 'object' ? config : {})
2924      };
2925      typeCheckConfig(NAME$6, config, DefaultType$5);
2926      return config;
2927    }
2928
2929    _showElement(re
2929latedTarget) {
2930      const isAnimated = this._isAnimated();
2931
2932      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
2933
2934      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
2935        // Don't move modal's DOM position
2936        document.body.append(this._element);
2937      }
2938
2939      this._element.style.display = 'block';
2940
2941      this._element.removeAttribute('aria-hidden');
2942
2943      this._element.setAttribute('aria-modal', true);
2944
2945      this._element.setAttribute('role', 'dialog');
2946
2947      this._element.scrollTop = 0;
2948
2949      if (modalBody) {
2950        modalBody.scrollTop = 0;
2951      }
2952
2953      if (isAnimated) {
2954        reflow(this._element);
2955      }
2956
2957      this._element.classList.add(CLASS_NAME_SHOW$4);
2958
2959      const transitionComplete = () => {
2960        if (this._config.focus) {
2961          this._focustrap.activate();
2962        }
2963
2964        this._isTransitioning = false;
2965        EventHandler.trigger(this._element, EVENT_SHOWN$3, {
2966          relatedTarget
2967        });
2968      };
2969
2970      this._queueCallback(transitionComplete, this._dialog, isAnimated);
2971    }
2972
2973    _setEscapeEvent() {
2974      if (this._isShown) {
2975        EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
2976          if (this._config.keyboard && event.key === ESCAPE_KEY$1) {
2977            event.preventDefault();
2978            this.hide();
2979          } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {
2980            this._triggerBackdropTransition();
2981          }
2982        });
2983      } else {
2984        EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);
2985      }
2986    }
2987
2988    _setResizeEvent() {
2989      if (this._isShown) {
2990        EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());
2991      } else {
2992        EventHandler.off(window, EVENT_RESIZE);
2993      }
2994    }
2995
2996    _hideModal() {
2997      this._element.style.display = 'none';
2998
2999      this._element.setAttribute('aria-hidden', true);
3000
3001      this._element.removeAttribute('aria-modal');
3002
3003      this._element.removeAttribute('role');
3004
3005      this._isTransitioning = false;
3006
3007      this._backdrop.hide(() => {
3008        document.body.classList.remove(CLASS_NAME_OPEN);
3009
3010        this._resetAdjustments();
3011
3012        this._scrollBar.reset();
3013
3014        EventHandler.trigger(this._element, EVENT_HIDDEN$3);
3015      });
3016    }
3017
3018    _showBackdrop(callback) {
3019      EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {
3020        if (this._ignoreBackdropClick) {
3021          this._ignoreBackdropClick = false;
3022          return;
3023        }
3024
3025        if (event.target !== event.currentTarget) {
3026          return;
3027        }
3028
3029        if (this._config.backdrop === true) {
3030          this.hide();
3031        } else if (this._config.backdrop === 'static') {
3032          this._triggerBackdropTransition();
3033        }
3034      });
3035
3036      this._backdrop.show(callback);
3037    }
3038
3039    _isAnimated() {
3040      return this._element.classList.contains(CLASS_NAME_FADE$3);
3041    }
3042
3043    _triggerBackdropTransition() {
3044      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
3045
3046      if (hideEvent.defaultPrevented) {
3047        return;
3048      }
3049
3050      const {
3051        classList,
3052        scrollHeight,
3053        style
3054      } = this._element;
3055      const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
3056
3057      if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
3058        return;
3059      }
3060
3061      if (!isModalOverflowing) {
3062        style.overflowY = 'hidden';
3063      }
3064
3065      classList.add(CLASS_NAME_STATIC);
3066
3067      this._queueCallback(() => {
3068        classList.remove(CLASS_NAME_STATIC);
3069
3070        if (!isModalOverflowing) {
3071          this._queueCallback(() => {
3072            style.overflowY = '';
3073          }, this._dialog);
3074        }
3075      }, this._dialog);
3076
3077      this._element.focus();
3078    } // ----------------------------------------------------------------------
3079    // the following methods are used to handle overflowing modals
3080    // ----------------------------------------------------------------------
3081
3082
3083    _adjustDialog() {
3084      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
3085
3086      const scrollbarWidth = this._scrollBar.getWidth();
3087
3088      const isBodyOverflowing = scrollbarWidth > 0;
3089
3090      if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
3091        this._element.style.paddingLeft = `${scrollbarWidth}px`;
3092      }
3093
3094      if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
3095        this._element.style.paddingRight = `${scrollbarWidth}px`;
3096      }
3097    }
3098
3099    _resetAdjustments() {
3100      this._element.style.paddingLeft = '';
3101      this._element.style.paddingRight = '';
3102    } // Static
3103
3104
3105    static jQueryInterface(config, relatedTarget) {
3106      return this.each(function () {
3107        const data = Modal.getOrCreateInstance(this, config);
3108
3109        if (typeof config !== 'string') {
3110          return;
3111        }
3112
3113        if (typeof data[config] === 'undefined') {
vendor: 6,829 bytes, lines 3114-3364
3114          throw new TypeError(`No method named "${config}"`);
3115        }
3116
3117        data[config](relatedTarget);
3118      });
3119    }
3120
3121  }
3122  /**
3123   * ------------------------------------------------------------------------
3124   * Data Api implementation
3125   * ------------------------------------------------------------------------
3126   */
3127
3128
3129  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
3130    const target = getElementFromSelector(this);
3131
3132    if (['A', 'AREA'].includes(this.tagName)) {
3133      event.preventDefault();
3134    }
3135
3136    EventHandler.one(target, EVENT_SHOW$3, showEvent => {
3137      if (showEvent.defaultPrevented) {
3138        // only register focus restorer if modal will actually get shown
3139        return;
3140      }
3141
3142      EventHandler.one(target, EVENT_HIDDEN$3, () => {
3143        if (isVisible(this)) {
3144          this.focus();
3145        }
3146      });
3147    });
3148    const data = Modal.getOrCreateInstance(target);
3149    data.toggle(this);
3150  });
3151  enableDismissTrigger(Modal);
3152  /**
3153   * ------------------------------------------------------------------------
3154   * jQuery
3155   * ------------------------------------------------------------------------
3156   * add .Modal to jQuery only if jQuery is present
3157   */
3158
3159  defineJQueryPlugin(Modal);
3160
3161  /**
3162   * --------------------------------------------------------------------------
3163   * Bootstrap (v5.1.0): offcanvas.js
3164   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
3165   * --------------------------------------------------------------------------
3166   */
3167  /**
3168   * ------------------------------------------------------------------------
3169   * Constants
3170   * ------------------------------------------------------------------------
3171   */
3172
3173  const NAME$5 = 'offcanvas';
3174  const DATA_KEY$5 = 'bs.offcanvas';
3175  const EVENT_KEY$5 = `.${DATA_KEY$5}`;
3176  const DATA_API_KEY$2 = '.data-api';
3177  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;
3178  const ESCAPE_KEY = 'Escape';
3179  const Default$4 = {
3180    backdrop: true,
3181    keyboard: true,
3182    scroll: false
3183  };
3184  const DefaultType$4 = {
3185    backdrop: 'boolean',
3186    keyboard: 'boolean',
3187    scroll: 'boolean'
3188  };
3189  const CLASS_NAME_SHOW$3 = 'show';
3190  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
3191  const OPEN_SELECTOR = '.offcanvas.show';
3192  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
3193  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
3194  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
3195  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;
3196  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
3197  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
3198  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
3199  /**
3200   * ------------------------------------------------------------------------
3201   * Class Definition
3202   * ------------------------------------------------------------------------
3203   */
3204
3205  class Offcanvas extends BaseComponent {
3206    constructor(element, config) {
3207      super(element);
3208      this._config = this._getConfig(config);
3209      this._isShown = false;
3210      this._backdrop = this._initializeBackDrop();
3211      this._focustrap = this._initializeFocusTrap();
3212
3213      this._addEventListeners();
3214    } // Getters
3215
3216
3217    static get NAME() {
3218      return NAME$5;
3219    }
3220
3221    static get Default() {
3222      return Default$4;
3223    } // Public
3224
3225
3226    toggle(relatedTarget) {
3227      return this._isShown ? this.hide() : this.show(relatedTarget);
3228    }
3229
3230    show(relatedTarget) {
3231      if (this._isShown) {
3232        return;
3233      }
3234
3235      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {
3236        relatedTarget
3237      });
3238
3239      if (showEvent.defaultPrevented) {
3240        return;
3241      }
3242
3243      this._isShown = true;
3244      this._element.style.visibility = 'visible';
3245
3246      this._backdrop.show();
3247
3248      if (!this._config.scroll) {
3249        new ScrollBarHelper().hide();
3250      }
3251
3252      this._element.removeAttribute('aria-hidden');
3253
3254      this._element.setAttribute('aria-modal', true);
3255
3256      this._element.setAttribute('role', 'dialog');
3257
3258      this._element.classList.add(CLASS_NAME_SHOW$3);
3259
3260      const completeCallBack = () => {
3261        if (!this._config.scroll) {
3262          this._focustrap.activate();
3263        }
3264
3265        EventHandler.trigger(this._element, EVENT_SHOWN$2, {
3266          relatedTarget
3267        });
3268      };
3269
3270      this._queueCallback(completeCallBack, this._element, true);
3271    }
3272
3273    hide() {
3274      if (!this._isShown) {
3275        return;
3276      }
3277
3278      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);
3279
3280      if (hideEvent.defaultPrevented) {
3281        return;
3282      }
3283
3284      this._focustrap.deactivate();
3285
3286      this._element.blur();
3287
3288      this._isShown = false;
3289
3290      this._element.classList.remove(CLASS_NAME_SHOW$3);
3291
3292      this._backdrop.hide();
3293
3294      const completeCallback = () => {
3295        this._element.setAttribute('aria-hidden', true);
3296
3297        this._element.removeAttribute('aria-modal');
3298
3299        this._element.removeAttribute('role');
3300
3301        this._element.style.visibility = 'hidden';
3302
3303        if (!this._config.scroll) {
3304          new ScrollBarHelper().reset();
3305        }
3306
3307        EventHandler.trigger(this._element, EVENT_HIDDEN$2);
3308      };
3309
3310      this._queueCallback(completeCallback, this._element, true);
3311    }
3312
3313    dispose() {
3314      this._backdrop.dispose();
3315
3316      this._focustrap.deactivate();
3317
3318      super.dispose();
3319    } // Private
3320
3321
3322    _getConfig(config) {
3323      config = { ...Default$4,
3324        ...Manipulator.getDataAttributes(this._element),
3325        ...(typeof config === 'object' ? config : {})
3326      };
3327      typeCheckConfig(NAME$5, config, DefaultType$4);
3328      return config;
3329    }
3330
3331    _initializeBackDrop() {
3332      return new Backdrop({
3333        className: CLASS_NAME_BACKDROP,
3334        isVisible: this._config.backdrop,
3335        isAnimated: true,
3336        rootElement: this._element.parentNode,
3337        clickCallback: () => this.hide()
3338      });
3339    }
3340
3341    _initializeFocusTrap() {
3342      return new FocusTrap({
3343        trapElement: this._element
3344      });
3345    }
3346
3347    _addEventListeners() {
3348      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
3349        if (this._config.keyboard && event.key === ESCAPE_KEY) {
3350          this.hide();
3351        }
3352      });
3353    } // Static
3354
3355
3356    static jQueryInterface(config) {
3357      return this.each(function () {
3358        const data = Offcanvas.getOrCreateInstance(this, config);
3359
3360        if (typeof config !== 'string') {
3361          return;
3362        }
3363
3364        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3365          throw new TypeError(`No method named "${config}"`);
3366        }
3367
3368        data[config](this);
3369      });
3370    }
3371
3372  }
3373  /**
3374   * ------------------------------------------------------------------------
3375   * Data Api implementation
3376   * ------------------------------------------------------------------------
3377   */
3378
3379
3380  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
3381    const target = getElementFromSelector(this);
3382
3383    if (['A', 'AREA'].includes(this.tagName)) {
3384      event.preventDefault();
3385    }
3386
3387    if (isDisabled(this)) {
3388      return;
3389    }
3390
3391    EventHandler.one(target, EVENT_HIDDEN$2, () => {
3392      // focus on trigger when it is closed
3393      if (isVisible(this)) {
3394        this.focus();
3395      }
3396    }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
3397
3398    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
3399
3400    if (allReadyOpen && allReadyOpen !== target) {
3401      Offcanvas.getInstance(allReadyOpen).hide();
3402    }
3403
3404    const data = Offcanvas.getOrCreateInstance(target);
3405    data.toggle(this);
3406  });
3407  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
3408  enableDismissTrigger(Offcanvas);
3409  /**
3410   * ------------------------------------------------------------------------
3411   * jQuery
3412   * ------------------------------------------------------------------------
3413   */
3414
3415  defineJQueryPlugin(Offcanvas);
3416
3417  /**
3418   * --------------------------------------------------------------------------
3419   * Bootstrap (v5.1.0): util/sanitizer.js
3420   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3421   * --------------------------------------------------------------------------
3422   */
3423  const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
3424  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
3425  /**
3426   * A pattern that recognizes a commonly useful subset of URLs that are safe.
3427   *
3428   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
3429   */
3430
3431  const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
3432  /**
3433   * A pattern that matches safe data URLs. Only matches image, video and audio types.
3434   *
3435   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
3436   */
3437
3438  const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
3439
3440  const allowedAttribute = (attr, allowedAttributeList) => {
3441    const attrName = attr.nodeName.toLowerCase();
3442
3443    if (allowedAttributeList.includes(attrName)) {
3444      if (uriAttrs.has(attrName)) {
3445        return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
3446      }
3447
3448      return true;
3449    }
3450
3451    const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.
3452
3453    for (let i = 0, len = regExp.length; i < len; i++) {
3454      if (regExp[i].test(attrName)) {
3455        return true;
3456      }
3457    }
3458
3459    return false;
3460  };
3461
3462  const DefaultAllowlist = {
3463    // Global attributes allowed on any supplied element below.
3464    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
3465    a: ['target', 'href', 'title', 'rel'],
3466    area: [],
3467    b: [],
3468    br: [],
3469    col: [],
3470    code: [],
3471    div: [],
3472    em: [],
3473    hr: [],
3474    h1: [],
3475    h2: [],
3476    h3: [],
3477    h4: [],
3478    h5: [],
3479    h6: [],
3480    i: [],
3481    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
3482    li: [],
3483    ol: [],
3484    p: [],
3485    pre: [],
3486    s: [],
3487    small: [],
3488    span: [],
3489    sub: [],
3490    sup: [],
3491    strong: [],
3492    u: [],
3493    ul: []
3494  };
3495  function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
3496    if (!unsafeHtml.length) {
3497      return unsafeHtml;
3498    }
3499
3500    if (sanitizeFn && typeof sanitizeFn === 'function') {
3501      return sanitizeFn(unsafeHtml);
3502    }
3503
3504    const domParser = new window.DOMParser();
3505    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
3506    const allowlistKeys = Object.keys(allowList);
3507    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
3508
3509    for (let i = 0, len = elements.length; i < len; i++) {
3510      const el = elements[i];
3511      const elName = el.nodeName.toLowerCase();
3512
3513      if (!allowlistKeys.includes(elName)) {
3514        el.remove();
3515        continue;
3516      }
3517
3518      const attributeList = [].concat(...el.attributes);
3519      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);
3520      attributeList.forEach(attr => {
3521        if (!allowedAttribute(attr, allowedAttributes)) {
3522          el.removeAttribute(attr.nodeName);
3523        }
3524      });
3525    }
3526
3527    return createdDocument.body.innerHTML;
3528  }
3529
3530  /**
3531   * --------------------------------------------------------------------------
3532   * Bootstrap (v5.1.0): tooltip.js
3533   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3534   * --------------------------------------------------------------------------
3535   */
3536  /**
3537   * ------------------------------------------------------------------------
3538   * Constants
3539   * ------------------------------------------------------------------------
3540   */
3541
3542  const NAME$4 = 'tooltip';
3543  const DATA_KEY$4 = 'bs.tooltip';
3544  const EVENT_KEY$4 = `.${DATA_KEY$4}`;
3545  const CLASS_PREFIX$1 = 'bs-tooltip';
3546  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
3547  const DefaultType$3 = {
3548    animation: 'boolean',
3549    template: 'string',
3550    title: '(string|element|function)',
3551    trigger: 'string',
3552    delay: '(number|object)',
3553    html: 'boolean',
3554    selector: '(string|boolean)',
3555    placement: '(string|function)',
3556    offset: '(array|string|function)',
3557    container: '(string|element|boolean)',
3558    fallbackPlacements: 'array',
3559    boundary: '(string|element)',
3560    customClass: '(string|function)',
3561    sanitize: 'boolean',
3562    sanitizeFn: '(null|function)',
3563    allowList: 'object',
3564    popperConfig: '(null|object|function)'
3565  };
3566  const AttachmentMap = {
3567    AUTO: 'auto',
3568    TOP: 'top',
3569    RIGHT: isRTL() ? 'left' : 'right',
3570    BOTTOM: 'bottom',
3571    LEFT: isRTL() ? 'right' : 'left'
3572  };
3573  const Default$3 = {
3574    animation: true,
3575    template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
3576    trigger: 'hover focus',
3577    title: '',
3578    delay: 0,
3579    html: false,
3580    selector: false,
3581    placement: 'top',
3582    offset: [0, 0],
3583    container: false,
3584    fallbackPlacements: ['top', 'right', 'bottom', 'left'],
3585    boundary: 'clippingParents',
3586    customClass: '',
3587    sanitize: true,
3588    sanitizeFn: null,
3589    allowList: DefaultAllowlist,
3590    popperConfig: null
3591  };
3592  const Event$2 = {
3593    HIDE: `hide${EVENT_KEY$4}`,
3594    HIDDEN: `hidden${EVENT_KEY$4}`,
3595    SHOW: `show${EVENT_KEY$4}`,
3596    SHOWN: `shown${EVENT_KEY$4}`,
3597    INSERTED: `inserted${EVENT_KEY$4}`,
3598    CLICK: `click${EVENT_KEY$4}`,
3599    FOCUSIN: `focusin${EVENT_KEY$4}`,
3600    FOCUSOUT: `focusout${EVENT_KEY$4}`,
3601    MOUSEENTER: `mouseenter${EVENT_KEY$4}`,
3602    MOUSELEAVE: `mouseleave${EVENT_KEY$4}`
3603  };
3604  const CLASS_NAME_FADE$2 = 'fade';
3605  const CLASS_NAME_MODAL = 'modal';
3606  const CLASS_NAME_SHOW$2 = 'show';
3607  const HOVER_STATE_SHOW = 'show';
3608  const HOVER_STATE_OUT = 'out';
3609  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
3610  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
3611  const EVENT_MODAL_HIDE = 'hide.bs.modal';
3612  const TRIGGER_HOVER = 'hover';
3613  const TRIGGER_FOCUS = 'focus';
3614  const TRIGGER_CLICK = 'click';
3615  const TRIGGER_MANUAL = 'manual';
3616  /**
3617   * ------------------------------------------------------------------------
3618   * Class Definition
3619   * ------------------------------------------------------------------------
3620   */
3621
3622  class Tooltip extends BaseComponent {
3623    constructor(element, config) {
3624      if (typeof Popper__namespace === 'undefined') {
3625        throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
3626      }
3627
3628      super(element); // private
3629
3630      this._isEnabled = true;
3631      this._timeout = 0;
3632      this._hoverState = '';
3633      this._activeTrigger = {};
3634      this._popper = null; // Protected
3635
3636      this._config = this._getConfig(config);
3637      this.tip = null;
3638
3639      this._setListeners();
3640    } // Getters
3641
3642
3643    static get Default() {
3644      return Default$3;
3645    }
3646
3647    static get NAME() {
3648      return NAME$4;
3649    }
3650
3651    static get Event() {
3652      return Event$2;
3653    }
3654
3655    static get DefaultType() {
3656      return DefaultType$3;
3657    } // Public
3658
3659
3660    enable() {
3661      this._isEnabled = true;
3662    }
3663
3664    disable() {
3665      this._isEnabled = false;
3666    }
3667
3668    toggleEnabled() {
3669      this._isEnabled = !this._isEnabled;
3670    }
3671
3672    toggle(event) {
3673      if (!this._isEnabled) {
3674        return;
3675      }
3676
3677      if (event) {
3678        const context = this._initializeOnDelegatedTarget(event);
3679
3680        context._activeTrigger.click = !context._activeTrigger.click;
3681
3682        if (context._isWithActiveTrigger()) {
3683          context._enter(null, context);
3684        } else {
3685          context._leave(null, context);
3686        }
3687      } else {
3688        if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {
3689          this._leave(null, this);
3690
3691          return;
3692        }
3693
3694        this._enter(null, this);
3695      }
3696    }
3697
3698    dispose() {
3699      clearTimeout(this._timeout);
3700      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3701
3702      if (this.tip) {
3703        this.tip.remove();
3704      }
3705
3706      if (this._popper) {
3707        this._popper.destroy();
3708      }
3709
3710      super.dispose();
3711    }
3712
3713    show() {
3714      if (this._element.style.display === 'none') {
3715        throw new Error('Please use show on visible elements');
3716      }
3717
3718      if (!(this.isWithContent() && this._isEnabled)) {
3719        return;
3720      }
3721
3722      const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);
3723      const shadowRoot = findShadowRoot(this._element);
3724      const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
3725
3726      if (showEvent.defaultPrevented || !isInTheDom) {
3727        return;
3728      }
3729
3730      const tip = this.getTipElement();
3731      const tipId = getUID(this.constructor.NAME);
3732      tip.setAttribute('id', tipId);
3733
3734      this._element.setAttribute('aria-describedby', tipId);
3735
3736      if (this._config.animation) {
3737        tip.classList.add(CLASS_NAME_FADE$2);
3738      }
3739
3740      const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
3741
3742      const attachment = this._getAttachment(placement);
3743
3744      this._addAttachmentClass(attachment);
3745
3746      const {
3747        container
3748      } = this._config;
3749      Data.set(tip, this.constructor.DATA_KEY, this);
3750
3751      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
3752        container.append(tip);
3753        EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
3754      }
3755
3756      if (this._popper) {
3757        this._popper.update();
3758      } else {
3759        this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
3760      }
3761
3762      tip.classList.add(CLASS_NAME_SHOW$2);
3763
3764      const customClass = this._resolvePossibleFunction(this._config.customClass);
3765
3766      if (customClass) {
3767        tip.classList.add(...customClass.split(' '));
3768      } // If this is a touch-enabled device we add extra
3769      // empty mouseover listeners to the body's immediate children;
3770      // only needed because of broken event delegation on iOS
3771      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
3772
3773
3774      if ('ontouchstart' in document.documentElement) {
3775        [].concat(...document.body.children).forEach(element => {
3776          EventHandler.on(element, 'mouseover', noop);
3777        });
3778      }
3779
3780      const complete = () => {
3781        const prevHoverState = this._hoverState;
3782        this._hoverState = null;
3783        EventHandler.trigger(this._element, this.constructor.Event.SHOWN);
3784
3785        if (prevHoverState === HOVER_STATE_OUT) {
3786          this._leave(null, this);
3787        }
3788      };
3789
3790      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3791
3792      this._queueCallback(complete, this.tip, isAnimated);
3793    }
3794
3795    hide() {
3796      if (!this._popper) {
3797        return;
3798      }
3799
3800      const tip = this.getTipElement();
3801
3802      const complete = () => {
3803        if (this._isWithActiveTrigger()) {
3804          return;
3805        }
3806
3807        if (this._hoverState !== HOVER_STATE_SHOW) {
3808          tip.remove();
3809        }
3810
3811        this._cleanTipClass();
3812
3813        this._element.removeAttribute('aria-describedby');
3814
3815        EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);
3816
3817        if (this._popper) {
3818          this._popper.destroy();
3819
3820          this._popper = null;
3821        }
3822      };
3823
3824      const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);
3825
3826      if (hideEvent.defaultPrevented) {
3827        return;
3828      }
3829
3830      tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
3831      // empty mouseover listeners we added for iOS support
3832
3833      if ('ontouchstart' in document.documentElement) {
3834        [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));
3835      }
3836
3837      this._activeTrigger[TRIGGER_CLICK] = false;
3838      this._activeTrigger[TRIGGER_FOCUS] = false;
3839      this._activeTrigger[TRIGGER_HOVER] = false;
3840      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3841
3842      this._queueCallback(complete, this.tip, isAnimated);
3843
3844      this._hoverState = '';
3845    }
3846
3847    update() {
3848      if (this._popper !== null) {
3849        this._popper.update();
3850      }
3851    } // Protected
3852
3853
3854    isWithContent() {
3855      return Boolean(this.getTitle());
3856    }
3857
3858    getTipElement() {
3859      if (this.tip) {
3860        return this.tip;
3861      }
3862
3863      const element = document.createElement('div');
3864      element.innerHTML = this._config.template;
3865      const tip = element.children[0];
3866      this.setContent(tip);
3867      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
3868      this.tip = tip;
3869      return this.tip;
3870    }
3871
3872    setContent(tip) {
3873      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
3874    }
3875
3876    _sanitizeAndSetContent(template, content, selector) {
3877      const templateElement = SelectorEngine.findOne(selector, template);
3878
3879      if (!content && templateElement) {
3880        templateElement.remove();
3881        return;
3882      } // we use append for html objects to maintain js events
3883
3884
3885      this.setElementContent(templateElement, content);
3886    }
3887
3888    setElementContent(element, content) {
3889      if (element === null) {
3890        return;
3891      }
3892
3893      if (isElement(content)) {
3894        content = getElement(content); // content is a DOM node or a jQuery
3895
3896        if (this._config.html) {
3897          if (content.parentNode !== element) {
3898            element.innerHTML = '';
3899            element.append(content);
3900          }
3901        } else {
3902          element.textContent = content.textContent;
3903        }
3904
3905        return;
3906      }
3907
3908      if (this._config.html) {
3909        if (this._config.sanitize) {
3910          content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);
3911        }
3912
3913        element.innerHTML = content;
3914      } else {
3915        element.textContent = content;
3916      }
3917    }
3918
3919    getTitle() {
3920      const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
3921
3922      return this._resolvePossibleFunction(title);
3923    }
3924
3925    updateAttachment(attachment) {
3926      if (attachment === 'right') {
3927        return 'end';
3928      }
3929
3930      if (attachment === 'left') {
3931        return 'start';
3932      }
3933
3934      return attachment;
3935    } // Private
3936
3937
3938    _initializeOnDelegatedTarget(event, context) {
3939      return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
3940    }
3941
3942    _getOffset() {
3943      const {
3944        offset
3945      } = this._config;
3946
3947      if (typeof offset === 'string') {
3948        return offset.split(',').map(val => Number.parseInt(val, 10));
3949      }
3950
3951      if (typeof offset === 'function') {
3952        return popperData => offset(popperData, this._element);
3953      }
3954
3955      return offset;
3956    }
3957
3958    _resolvePossibleFunction(content) {
3959      return typeof content === 'function' ? content.call(this._element) : content;
3960    }
3961
3962    _getPopperConfig(attachment) {
3963      const defaultBsPopperConfig = {
3964        placement: attachment,
3965        modifiers: [{
3966          name: 'flip',
3967          options: {
3968            fallbackPlacements: this._config.fallbackPlacements
3969          }
3970        }, {
3971          name: 'offset',
3972          options: {
3973            offset: this._getOffset()
3974          }
3975        }, {
3976          name: 'preventOverflow',
3977          options: {
3978            boundary: this._config.boundary
3979          }
3980        }, {
3981          name: 'arrow',
3982          options: {
3983            element: `.${this.constructor.NAME}-arrow`
3984          }
3985        }, {
3986          name: 'onChange',
3987          enabled: true,
3988          phase: 'afterWrite',
3989          fn: data => this._handlePopperPlacementChange(data)
3990        }],
3991        onFirstUpdate: data => {
3992          if (data.options.placement !== data.placement) {
3993            this._handlePopperPlacementChange(data);
3994          }
3995        }
3996      };
3997      return { ...defaultBsPopperConfig,
3998        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
3999      };
4000    }
4001
4002    _addAttachmentClass(attachment) {
4003      this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
4004    }
4005
4006    _getAttachment(placement) {
4007      return AttachmentMap[placement.toUpperCase()];
4008    }
4009
4010    _setListeners() {
4011      const triggers = this._config.trigger.split(' ');
4012
4013      triggers.forEach(trigger => {
4014        if (trigger === 'click') {
4015          EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));
4016        } else if (trigger !== TRIGGER_MANUAL) {
4017          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
4018          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
4019          EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));
4020          EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));
4021        }
4022      });
4023
4024      this._hideModalHandler = () => {
4025        if (this._element) {
4026          this.hide();
4027        }
4028      };
4029
4030      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
4031
4032      if (this._config.selector) {
4033        this._config = { ...this._config,
4034          trigger: 'manual',
4035          selector: ''
4036        };
4037      } else {
4038        this._fixTitle();
4039      }
4040    }
4041
4042    _fixTitle() {
4043      const title = this._element.getAttribute('title');
4044
4045      const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');
4046
4047      if (title || originalTitleType !== 'string') {
4048        this._element.setAttribute('data-bs-original-title', title || '');
4049
4050        if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {
4051          this._element.setAttribute('aria-label', title);
4052        }
4053
4054        this._element.setAttribute('title', '');
4055      }
4056    }
4057
4058    _enter(event, context) {
4059      context = this._initializeOnDelegatedTarget(event, context);
4060
4061      if (event) {
4062        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
4063      }
4064
4065      if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {
4066        context._hoverState = HOVER_STATE_SHOW;
4067        return;
4068      }
4069
4070      clearTimeout(context._timeout);
4071      context._hoverState = HOVER_STATE_SHOW;
4072
4073      if (!context._config.delay || !context._config.delay.show) {
4074        context.show();
4075        return;
4076      }
4077
4078      context._timeout = setTimeout(() => {
4079        if (context._hoverState === HOVER_STATE_SHOW) {
4080          context.show();
4081        }
4082      }, context._config.delay.show);
4083    }
4084
4085    _leave(event, context) {
4086      context = this._initializeOnDelegatedTarget(event, context);
4087
4088      if (event) {
4089        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
4090      }
4091
4092      if (context._isWithActiveTrigger()) {
4093        return;
4094      }
4095
4096      clearTimeout(context._timeout);
4097      context._hoverState = HOVER_STATE_OUT;
4098
4099      if (!context._config.delay || !context._config.delay.hide) {
4100        context.hide();
4101        return;
4102      }
4103
4104      context._timeout = setTimeout(() => {
4105        if (context._hoverState === HOVER_STATE_OUT) {
4106          context.hide();
4107        }
4108      }, context._config.delay.hide);
4109    }
4110
4111    _isWithActiveTrigger() {
4112      for (const trigger in this._activeTrigger) {
4113        if (this._activeTrigger[trigger]) {
4114          return true;
4115        }
4116      }
4117
4118      return false;
4119    }
4120
4121    _getConfig(config) {
4122      const dataAttributes = Manipulator.getDataAttributes(this._element);
4123      Object.keys(dataAttributes).forEach(dataAttr => {
4124        if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
4125          delete dataAttributes[dataAttr];
4126        }
4127      });
4128      config = { ...this.constructor.Default,
4129        ...dataAttributes,
4130        ...(typeof config === 'object' && config ? config : {})
4131      };
4132      config.container = config.container === false ? document.body : getElement(config.container);
4133
4134      if (typeof config.delay === 'number') {
4135        config.delay = {
4136          show: config.delay,
4137          hide: config.delay
4138        };
4139      }
4140
4141      if (typeof config.title === 'number') {
4142        config.title = config.title.toString();
4143      }
4144
4145      if (typeof config.content === 'number') {
4146        config.content = config.content.toString();
4147      }
4148
4149      typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
4150
4151      if (config.sanitize) {
4152        config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);
4153      }
4154
4155      return config;
4156    }
4157
4158    _getDelegateConfig() {
4159      const config = {};
4160
4161      for (const key in this._config) {
4162        if (this.constructor.Default[key] !== this._config[key]) {
4163          config[key] = this._config[key];
4164        }
4165      } // In the future can be replaced with:
4166      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
4167      // `Object.fromEntries(keysWithDifferentValues)`
4168
4169
4170      return config;
4171    }
4172
4173    _cleanTipClass() {
4174      const tip = this.getTipElement();
4175      const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g');
4176      const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);
4177
4178      if (tabClass !== null && tabClass.length > 0) {
4179        tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
4180      }
4181    }
4182
4183    _getBasicClassPrefix() {
4184      return CLASS_PREFIX$1;
4185    }
4186
4187    _handlePopperPlacementChange(popperData) {
4188      const {
4189        state
4190      } = popperData;
4191
4192      if (!state) {
4193        return;
4194      }
4195
4196      this.tip = state.elements.popper;
4197
4198      this._cleanTipClass();
4199
4200      this._addAttachmentClass(this._getAttachment(state.placement));
4201    } // Static
4202
4203
4204    static jQueryInterface(config) {
4205      return this.each(function () {
4206        const data = Tooltip.getOrCreateInstance(this, config);
4207
4208        if (typeof config === 'string') {
4209          if (typeof data[config] === 'undefined') {
4210            throw new TypeError(`No method named "${config}"`);
4211          }
4212
4213          data[config]();
4214        }
4215      });
4216    }
4217
4218  }
4219  /**
4220   * ------------------------------------------------------------------------
4221   * jQuery
4222   * ------------------------------------------------------------------------
4223   * add .Tooltip to jQuery only if jQuery is present
4224   */
4225
4226
4227  defineJQueryPlugin(Tooltip);
4228
4229  /**
4230   * --------------------------------------------------------------------------
4231   * Bootstrap (v5.1.0): popover.js
4232   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4233   * --------------------------------------------------------------------------
4234   */
4235  /**
4236   * ------------------------------------------------------------------------
4237   * Constants
4238   * ------------------------------------------------------------------------
4239   */
4240
4241  const NAME$3 = 'popover';
4242  const DATA_KEY$3 = 'bs.popover';
4243  const EVENT_KEY$3 = `.${DATA_KEY$3}`;
4244  const CLASS_PREFIX = 'bs-popover';
4245  const Default$2 = { ...Tooltip.Default,
4246    placement: 'right',
4247    offset: [0, 8],
4248    trigger: 'click',
4249    content: '',
4250    template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>'
4251  };
4252  const DefaultType$2 = { ...Tooltip.DefaultType,
4253    content: '(string|element|function)'
4254  };
4255  const Event$1 = {
4256    HIDE: `hide${EVENT_KEY$3}`,
4257    HIDDEN: `hidden${EVENT_KEY$3}`,
4258    SHOW: `show${EVENT_KEY$3}`,
4259    SHOWN: `shown${EVENT_KEY$3}`,
4260    INSERTED: `inserted${EVENT_KEY$3}`,
4261    CLICK: `click${EVENT_KEY$3}`,
4262    FOCUSIN: `focusin${EVENT_KEY$3}`,
4263    FOCUSOUT: `focusout${EVENT_KEY$3}`,
4264    MOUSEENTER: `mouseenter${EVENT_KEY$3}`,
4265    MOUSELEAVE: `mouseleave${EVENT_KEY$3}`
4266  };
4267  const SELECTOR_TITLE = '.popover-header';
4268  const SELECTOR_CONTENT = '.popover-body';
4269  /**
4270   * ------------------------------------------------------------------------
4271   * Class Definition
4272   * ------------------------------------------------------------------------
4273   */
4274
4275  class Popover extends Tooltip {
4276    // Getters
4277    static get Default() {
4278      return Default$2;
4279    }
4280
4281    static get NAME() {
4282      return NAME$3;
4283    }
4284
4285    static get Event() {
4286      return Event$1;
4287    }
4288
4289    static get DefaultType() {
4290      return DefaultType$2;
4291    } // Overrides
4292
4293
4294    isWithContent() {
4295      return this.getTitle() || this._getContent();
4296    }
4297
4298    setContent(tip) {
4299      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
4300
4301      this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
4302    } // Private
4303
4304
4305    _getContent() {
4306      return this._resolvePossibleFunction(this._config.content);
4307    }
4308
4309    _getBasicClassPrefix() {
4310      return CLASS_PREFIX;
4311    } // Static
4312
4313
4314    static jQueryInterface(config) {
4315      return this.each(function () {
4316        const data = Popover.getOrCreateInstance(this, config);
4317
4318        if (typeof config === 'string') {
4319          if (typeof data[config] === 'undefined') {
4320            throw new TypeError(`No method named "${config}"`);
4321          }
4322
4323          data[config]();
4324        }
4325      });
4326    }
4327
4328  }
4329  /**
4330   * ------------------------------------------------------------------------
4331   * jQuery
4332   * ------------------------------------------------------------------------
4333   * add .Popover to jQuery only if jQuery is present
4334   */
4335
4336
4337  defineJQueryPlugin(Popover);
4338
4339  /**
4340   * --------------------------------------------------------------------------
4341   * Bootstrap (v5.1.0): scrollspy.js
4342   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4343   * --------------------------------------------------------------------------
4344   */
4345  /**
4346   * ------------------------------------------------------------------------
4347   * Constants
4348   * ------------------------------------------------------------------------
4349   */
4350
4351  const NAME$2 = 'scrollspy';
4352  const DATA_KEY$2 = 'bs.scrollspy';
4353  const EVENT_KEY$2 = `.${DATA_KEY$2}`;
4354  const DATA_API_KEY$1 = '.data-api';
4355  const Default$1 = {
4356    offset: 10,
4357    method: 'auto',
4358    target: ''
4359  };
4360  const DefaultType$1 = {
4361    offset: 'number',
4362    method: 'string',
4363    target: '(string|element)'
4364  };
4365  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
4366  const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;
4367  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;
4368  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
4369  const CLASS_NAME_ACTIVE$1 = 'active';
4370  const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
4371  const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';
4372  const SELECTOR_NAV_LINKS = '.nav-link';
4373  const SELECTOR_NAV_ITEMS = '.nav-item';
4374  const SELECTOR_LIST_ITEMS = '.list-group-item';
4375  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
4376  const SELECTOR_DROPDOWN$1 = '.dropdown';
4377  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
4378  const METHOD_OFFSET = 'offset';
4379  const METHOD_POSITION = 'position';
4380  /**
4381   * ------------------------------------------------------------------------
4382   * Class Definition
4383   * ------------------------------------------------------------------------
4384   */
4385
4386  class ScrollSpy extends BaseComponent {
4387    constructor(element, config) {
4388      super(element);
4389      this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
4390      this._config = this._getConfig(config);
4391      this._offsets = [];
4392      this._targets = [];
4393      this._activeTarget = null;
4394      this._scrollHeight = 0;
4395      EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());
4396      this.refresh();
4397
4398      this._process();
4399    } // Getters
4400
4401
4402    static get Default() {
4403      return Default$1;
4404    }
4405
4406    static get NAME() {
4407      return NAME$2;
4408    } // Public
4409
4410
4411    refresh() {
4412      const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
4413      const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
4414      const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
4415      this._offsets = [];
4416      this._targets = [];
4417      this._scrollHeight = this._getScrollHeight();
4418      const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);
4419      targets.map(element => {
4420        const targetSelector = getSelectorFromElement(element);
4421        const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;
4422
4423        if (target) {
4424          const targetBCR = target.getBoundingClientRect();
4425
4426          if (targetBCR.width || targetBCR.height) {
4427            return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];
4428          }
4429        }
4430
4431        return null;
4432      }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {
4433        this._offsets.push(item[0]);
4434
4435        this._targets.push(item[1]);
4436      });
4437    }
4438
4439    dispose() {
4440      EventHandler.off(this._scrollElement, EVENT_KEY$2);
4441      super.dispose();
4442    } // Private
4443
4444
4445    _getConfig(config) {
4446      config = { ...Default$1,
4447        ...Manipulator.getDataAttributes(this._element),
4448        ...(typeof config === 'object' && config ? config : {})
4449      };
4450      config.target = getElement(config.target) || document.documentElement;
4451      typeCheckConfig(NAME$2, config, DefaultType$1);
4452      return config;
4453    }
4454
4455    _getScrollTop() {
4456      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
4457    }
4458
4459    _getScrollHeight() {
4460      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
4461    }
4462
4463    _getOffsetHeight() {
4464      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
4465    }
4466
4467    _process() {
4468      const scrollTop = this._getScrollTop() + this._config.offset;
4469
4470      const scrollHeight = this._getScrollHeight();
4471
4472      const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
4473
4474      if (this._scrollHeight !== scrollHeight) {
4475        this.refresh();
4476      }
4477
4478      if (scrollTop >= maxScroll) {
4479        const target = this._targets[this._targets.length - 1];
4480
4481        if (this._activeTarget !== target) {
4482          this._activate(target);
4483        }
4484
4485        return;
4486      }
4487
4488      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
4489        this._activeTarget = null;
4490
4491        this._clear();
4492
4493        return;
4494      }
4495
4496      for (let i = this._offsets.length; i--;) {
4497        const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
4498
4499        if (isActiveTarget) {
4500          this._activate(this._targets[i]);
4501        }
4502      }
4503    }
4504
4505    _activate(target) {
4506      this._activeTarget = target;
4507
4508      this._clear();
4509
4510      const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
4511      const link = SelectorEngine.findOne(queries.join(','), this._config.target);
4512      link.classList.add(CLASS_NAME_ACTIVE$1);
4513
4514      if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
4515        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);
4516      } else {
4517        SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {
4518          // Set triggered links parents as active
4519          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
4520          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item
4521
4522          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {
4523            SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));
4524          });
4525        });
4526      }
4527
4528      EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {
4529        relatedTarget: target
4530      });
4531    }
4532
4533    _clear() {
4534      SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));
4535    } // Static
4536
4537
4538    static jQueryInterface(config) {
4539      return this.each(function () {
4540        const data = ScrollSpy.getOrCreateInstance(this, config);
4541
4542        if (typeof config !== 'string') {
4543          return;
4544        }
4545
4546        if (typeof data[config] === 'undefined') {
4547          throw new TypeError(`No method named "${config}"`);
4548        }
4549
4550        data[config]();
4551      });
4552    }
4553
4554  }
4555  /**
4556   * ------------------------------------------------------------------------
4557   * Data Api implementation
4558   * ------------------------------------------------------------------------
4559   */
4560
4561
4562  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
4563    SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
4564  });
4565  /**
4566   * ------------------------------------------------------------------------
4567   * jQuery
4568   * ------------------------------------------------------------------------
4569   * add .ScrollSpy to jQuery only if jQuery is present
4570   */
4571
4572  defineJQueryPlugin(ScrollSpy);
4573
4574  /**
4575   * --------------------------------------------------------------------------
4576   * Bootstrap (v5.1.0): tab.js
4577   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4578   * --------------------------------------------------------------------------
4579   */
4580  /**
4581   * ------------------------------------------------------------------------
4582   * Constants
4583   * ------------------------------------------------------------------------
4584   */
4585
4586  const NAME$1 = 'tab';
4587  const DATA_KEY$1 = 'bs.tab';
4588  const EVENT_KEY$1 = `.${DATA_KEY$1}`;
4589  const DATA_API_KEY = '.data-api';
4590  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
4591  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
4592  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
4593  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
4594  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;
4595  const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
4596  const CLASS_NAME_ACTIVE = 'active';
4597  const CLASS_NAME_FADE$1 = 'fade';
4598  const CLASS_NAME_SHOW$1 = 'show';
4599  const SELECTOR_DROPDOWN = '.dropdown';
4600  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
4601  const SELECTOR_ACTIVE = '.active';
4602  const SELECTOR_ACTIVE_UL = ':scope > li > .active';
4603  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
4604  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
4605  const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';
4606  /**
4607   * ------------------------------------------------------------------------
4608   * Class Definition
4609   * ------------------------------------------------------------------------
4610   */
4611
4612  class Tab extends BaseComponent {
4613    // Getters
4614    static get NAME() {
4615      return NAME$1;
4616    } // Public
4617
4618
4619    show() {
4620      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
4621        return;
4622      }
4623
4624      let previous;
4625      const target = getElementFromSelector(this._element);
4626
4627      const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
4628
4629      if (listElement) {
4630        const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
4631        previous = SelectorEngine.find(itemSelector, listElement);
4632        previous = previous[previous.length - 1];
4633      }
4634
4635      const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {
4636        relatedTarget: this._element
4637      }) : null;
4638      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {
4639        relatedTarget: previous
4640      });
4641
4642      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {
4643        return;
4644      }
4645
4646      this._activate(this._element, listElement);
4647
4648      const complete = () => {
4649        EventHandler.trigger(previous, EVENT_HIDDEN$1, {
4650          relatedTarget: this._element
4651        });
4652        EventHandler.trigger(this._element, EVENT_SHOWN$1, {
4653          relatedTarget: previous
4654        });
4655      };
4656
4657      if (target) {
4658        this._activate(target, target.parentNode, complete);
4659      } else {
4660        complete();
4661      }
4662    } // Private
4663
4664
4665    _activate(element, container, callback) {
4666      const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);
4667      const active = activeElements[0];
4668      const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);
4669
4670      const complete = () => this._transitionComplete(element, active, callback);
4671
4672      if (active && isTransitioning) {
4673        active.classList.remove(CLASS_NAME_SHOW$1);
4674
4675        this._queueCallback(complete, element, true);
4676      } else {
4677        complete();
4678      }
4679    }
4680
4681    _transitionComplete(element, active, callback) {
4682      if (active) {
4683        active.classList.remove(CLASS_NAME_ACTIVE);
4684        const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
4685
4686        if (dropdownChild) {
4687          dropdownChild.classList.remove(CLASS_NAME_ACTIVE);
4688        }
4689
4690        if (active.getAttribute('role') === 'tab') {
4691          active.setAttribute('aria-selected', false);
4692        }
4693      }
4694
4695      element.classList.add(CLASS_NAME_ACTIVE);
4696
4697      if (element.getAttribute('role') === 'tab') {
4698        element.setAttribute('aria-selected', true);
4699      }
4700
4701      reflow(element);
4702
4703      if (element.classList.contains(CLASS_NAME_FADE$1)) {
4704        element.classList.add(CLASS_NAME_SHOW$1);
4705      }
4706
4707      let parent = element.parentNode;
4708
4709      if (parent && parent.nodeName === 'LI') {
4710        parent = parent.parentNode;
4711      }
4712
4713      if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
4714        const dropdownElement = element.closest(SELECTOR_DROPDOWN);
4715
4716        if (dropdownElement) {
4717          SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
4718        }
4719
4720        element.setAttribute('aria-expanded', true);
4721      }
4722
4723      if (callback) {
4724        callback();
4725      }
4726    } // Static
4727
4728
4729    static jQueryInterface(config) {
4730      return this.each(function () {
4731        const data = Tab.getOrCreateInstance(this);
4732
4733        if (typeof config === 'string') {
4734          if (typeof data[config] === 'undefined') {
4735            throw new TypeError(`No method named "${config}"`);
4736          }
4737
4738          data[config]();
4739        }
4740      });
4741    }
4742
4743  }
4744  /**
4745   * ------------------------------------------------------------------------
4746   * Data Api implementation
4747   * ------------------------------------------------------------------------
4748   */
4749
4750
4751  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
4752    if (['A', 'AREA'].includes(this.tagName)) {
4753      event.preventDefault();
4754    }
4755
4756    if (isDisabled(this)) {
4757      return;
4758    }
4759
4760    const data = Tab.getOrCreateInstance(this);
4761    data.show();
4762  });
4763  /**
4764   * ------------------------------------------------------------------------
4765   * jQuery
4766   * ------------------------------------------------------------------------
4767   * add .Tab to jQuery only if jQuery is present
4768   */
4769
4770  defineJQueryPlugin(Tab);
4771
4772  /**
4773   * --------------------------------------------------------------------------
4774   * Bootstrap (v5.1.0): toast.js
4775   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4776   * --------------------------------------------------------------------------
4777   */
4778  /**
4779   * ------------------------------------------------------------------------
4780   * Constants
4781   * ------------------------------------------------------------------------
4782   */
4783
4784  const NAME = 'toast';
4785  const DATA_KEY = 'bs.toast';
4786  const EVENT_KEY = `.${DATA_KEY}`;
4787  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
4788  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
4789  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
4790  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
4791  const EVENT_HIDE = `hide${EVENT_KEY}`;
4792  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
4793  const EVENT_SHOW = `show${EVENT_KEY}`;
4794  const EVENT_SHOWN = `shown${EVENT_KEY}`;
4795  const CLASS_NAME_FADE = 'fade';
4796  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
4797
4798  const CLASS_NAME_SHOW = 'show';
4799  const CLASS_NAME_SHOWING = 'showing';
4800  const DefaultType = {
4801    animation: 'boolean',
4802    autohide: 'boolean',
4803    delay: 'number'
4804  };
4805  const Default = {
4806    animation: true,
4807    autohide: true,
4808    delay: 5000
4809  };
4810  /**
4811   * ------------------------------------------------------------------------
4812   * Class Definition
4813   * ------------------------------------------------------------------------
4814   */
4815
4816  class Toast extends BaseComponent {
4817    constructor(element, config) {
4818      super(element);
4819      this._config = this._getConfig(config);
4820      this._timeout = null;
4821      this._hasMouseInteraction = false;
4822      this._hasKeyboardInteraction = false;
4823
4824      this._setListeners();
4825    } // Getters
4826
4827
4828    static get DefaultType() {
4829      return DefaultType;
4830    }
4831
4832    static get Default() {
4833      return Default;
4834    }
4835
4836    static get NAME() {
4837      return NAME;
4838    } // Public
4839
4840
4841    show() {
4842      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
4843
4844      if (showEvent.defaultPrevented) {
4845        return;
4846      }
4847
4848      this._clearTimeout();
4849
4850      if (this._config.animation) {
4851        this._element.classList.add(CLASS_NAME_FADE);
4852      }
4853
4854      const complete = () => {
4855        this._element.classList.remove(CLASS_NAME_SHOWING);
4856
4857        EventHandler.trigger(this._element, EVENT_SHOWN);
4858
4859        this._maybeScheduleHide();
4860      };
4861
4862      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
4863
4864
4865      reflow(this._element);
4866
4867      this._element.classList.add(CLASS_NAME_SHOW);
4868
4869      this._element.classList.add(CLASS_NAME_SHOWING);
4870
4871      this._queueCallback(complete, this._element, this._config.animation);
4872    }
4873
4874    hide() {
4875      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
4876        return;
4877      }
4878
4879      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
4880
4881      if (hideEvent.defaultPrevented) {
4882        return;
4883      }
4884
4885      const complete = () => {
4886        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
4887
4888
4889        this._element.classList.remove(CLASS_NAME_SHOWING);
4890
4891        this._element.classList.remove(CLASS_NAME_SHOW);
4892
4893        EventHandler.trigger(this._element, EVENT_HIDDEN);
4894      };
4895
4896      this._element.classList.add(CLASS_NAME_SHOWING);
4897
4898      this._queueCallback(complete, this._element, this._config.animation);
4899    }
4900
4901    dispose() {
4902      this._clearTimeout();
4903
4904      if (this._element.classList.contains(CLASS_NAME_SHOW)) {
4905        this._element.classList.remove(CLASS_NAME_SHOW);
4906      }
4907
4908      super.dispose();
4909    } // Private
4910
4911
4912    _getConfig(config) {
4913      config = { ...Default,
4914        ...Manipulator.getDataAttributes(this._element),
4915        ...(typeof config === 'object' && config ? config : {})
4916      };
4917      typeCheckConfig(NAME, config, this.constructor.DefaultType);
4918      return config;
4919    }
4920
4921    _maybeScheduleHide() {
4922      if (!this._config.autohide) {
4923        return;
4924      }
4925
4926      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
4927        return;
4928      }
4929
4930      this._timeout = setTimeout(() => {
4931        this.hide();
4932      }, this._config.delay);
4933    }
4934
4935    _onInteraction(event, isInteracting) {
4936      switch (event.type) {
4937        case 'mouseover':
4938        case 'mouseout':
4939          this._hasMouseInteraction = isInteracting;
4940          break;
4941
4942        case 'focusin':
4943        case 'focusout':
4944          this._hasKeyboardInteraction = isInteracting;
4945          break;
4946      }
4947
4948      if (isInteracting) {
4949        this._clearTimeout();
4950
4951        return;
4952      }
4953
4954      const nextElement = event.relatedTarget;
4955
4956      if (this._element === nextElement || this._element.contains(nextElement)) {
4957        return;
4958      }
4959
4960      this._maybeScheduleHide();
4961    }
4962
4963    _setListeners() {
4964      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
4965      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
4966      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
4967      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
4968    }
4969
4970    _clearTimeout() {
4971      clearTimeout(this._timeout);
4972      this._timeout = null;
4973    } // Static
4974
4975
4976    static jQueryInterface(config) {
4977      return this.each(function () {
4978        const data = Toast.getOrCreateInstance(this, config);
4979
4980        if (typeof config === 'string') {
4981          if (typeof data[config] === 'undefined') {
4982            throw new TypeError(`No method named "${config}"`);
4983          }
4984
4985          data[config](this);
4986        }
4987      });
4988    }
4989
4990  }
4991
4992  enableDismissTrigger(Toast);
4993  /**
4994   * ------------------------------------------------------------------------
4995   * jQuery
4996   * ------------------------------------------------------------------------
4997   * add .Toast to jQuery only if jQuery is present
4998   */
4999
5000  defineJQueryPlugin(Toast);
5001
5002  /**
5003   * --------------------------------------------------------------------------
5004   * Bootstrap (v5.1.0): index.umd.js
5005   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5006   * --------------------------------------------------------------------------
5007   */
5008  var index_umd = {
5009    Alert,
5010    Button,
5011    Carousel,
5012    Collapse,
5013    Dropdown,
5014    Modal,
5015    Offcanvas,
5016    Popover,
5017    ScrollSpy,
5018    Tab,
5019    Toast,
5020    Tooltip
5021  };
5022
5023  return index_umd;
5024
5025})));
5026//# sourceMappingURL=bootstrap.js.map

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