{
  "version": 3,
  "sources": ["../../../../../../node_modules/@rails/actioncable/src/adapters.js", "../../../../../../node_modules/@rails/actioncable/src/logger.js", "../../../../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../../../../node_modules/@rails/actioncable/src/internal.js", "../../../../../../node_modules/@rails/actioncable/src/connection.js", "../../../../../../node_modules/@rails/actioncable/src/subscription.js", "../../../../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../../../../node_modules/@rails/actioncable/src/consumer.js", "../../../../../../node_modules/@rails/actioncable/src/index.js", "../../../../../../node_modules/object-assign/index.js", "../../../../../../node_modules/react/cjs/react.production.min.js", "../../../../../../node_modules/react/index.js", "../../../../../../node_modules/scheduler/cjs/scheduler.production.min.js", "../../../../../../node_modules/scheduler/index.js", "../../../../../../node_modules/react-dom/cjs/react-dom.production.min.js", "../../../../../../node_modules/react-dom/index.js", "../../../../../../node_modules/@rails/request.js/src/fetch_response.js", "../../../../../../node_modules/@rails/request.js/src/request_interceptor.js", "../../../../../../node_modules/@rails/request.js/src/lib/utils.js", "../../../../../../node_modules/@rails/request.js/src/fetch_request.js", "../../../../../../node_modules/@rails/request.js/src/verbs.js", "../../../../../../node_modules/@rails/request.js/src/index.js", "../../../../../../node_modules/lodash.debounce/index.js", "../../../../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js", "../../../../../../node_modules/object-keys/isArguments.js", "../../../../../../node_modules/object-keys/implementation.js", "../../../../../../node_modules/object-keys/index.js", "../../../../../../node_modules/define-properties/index.js", "../../../../../../node_modules/function-bind/implementation.js", "../../../../../../node_modules/function-bind/index.js", "../../../../../../node_modules/has-symbols/shams.js", "../../../../../../node_modules/has-symbols/index.js", "../../../../../../node_modules/has/src/index.js", "../../../../../../node_modules/get-intrinsic/index.js", "../../../../../../node_modules/call-bind/index.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/GetIntrinsic.js", "../../../../../../node_modules/array.prototype.flat/node_modules/object-inspect/index.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsPropertyKey.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/5/Type.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/Type.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/Get.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/callBind.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/callBound.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsArray.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/isPropertyDescriptor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/DefineOwnProperty.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/assertRecord.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/FromPropertyDescriptor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsAccessorDescriptor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsDataDescriptor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/isNaN.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/SameValue.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToBoolean.js", "../../../../../../node_modules/array.prototype.flat/node_modules/is-callable/index.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsCallable.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToPropertyDescriptor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/DefinePropertyOrThrow.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsConstructor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/abs.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/floor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/isFinite.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsInteger.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ArraySpeciesCreate.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/maxSafeInteger.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/Call.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/getOwnPropertyDescriptor.js", "../../../../../../node_modules/call-bind/callBound.js", "../../../../../../node_modules/is-regex/index.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsRegExp.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/OrdinaryGetOwnProperty.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/isPrimitive.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/IsExtensible.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/CreateDataProperty.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/CreateDataPropertyOrThrow.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/HasProperty.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/5/abs.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/5/floor.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/5/ToNumber.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/sign.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/5/ToInteger.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/helpers/regexTester.js", "../../../../../../node_modules/es-to-primitive/helpers/isPrimitive.js", "../../../../../../node_modules/is-callable/index.js", "../../../../../../node_modules/is-date-object/index.js", "../../../../../../node_modules/is-symbol/index.js", "../../../../../../node_modules/es-to-primitive/es2015.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToPrimitive.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToNumber.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToInteger.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToLength.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/LengthOfArrayLike.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToString.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/FlattenIntoArray.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/5/CheckObjectCoercible.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/RequireObjectCoercible.js", "../../../../../../node_modules/array.prototype.flat/node_modules/es-abstract/2020/ToObject.js", "../../../../../../node_modules/array.prototype.flat/implementation.js", "../../../../../../node_modules/array.prototype.flat/polyfill.js", "../../../../../../node_modules/array.prototype.flat/shim.js", "../../../../../../node_modules/array.prototype.flat/index.js", "../../../../../../node_modules/global-cache/index.js", "../../../../../../node_modules/react-with-styles-interface-css/dist/utils/constants.js", "../../../../../../node_modules/react-with-styles-interface-css/dist/utils/getClassName.js", "../../../../../../node_modules/react-with-styles-interface-css/dist/utils/separateStyles.js", "../../../../../../node_modules/react-with-styles-interface-css/dist/index.js", "../../../../../../node_modules/react-with-styles-interface-css/index.js", "../../../../../../node_modules/react-with-styles/lib/ThemedStyleSheet.js", "../../../../../../node_modules/react-dates/lib/theme/DefaultTheme.js", "../../../../../../node_modules/react-dates/lib/utils/registerInterfaceWithDefaultTheme.js", "../../../../../../node_modules/react-dates/lib/utils/registerCSSInterfaceWithDefaultTheme.js", "../../../../../../node_modules/react-dates/lib/initialize.js", "../../../../../../node_modules/react-dates/initialize.js", "../../../../../../node_modules/object-is/implementation.js", "../../../../../../node_modules/object-is/polyfill.js", "../../../../../../node_modules/object-is/shim.js", "../../../../../../node_modules/object-is/index.js", "../../../../../../node_modules/enzyme-shallow-equal/src/index.js", "../../../../../../node_modules/@babel/runtime/helpers/extends.js", "../../../../../../node_modules/@babel/runtime/helpers/assertThisInitialized.js", "../../../../../../node_modules/@babel/runtime/helpers/setPrototypeOf.js", "../../../../../../node_modules/@babel/runtime/helpers/inheritsLoose.js", "../../../../../../node_modules/@babel/runtime/helpers/typeof.js", "../../../../../../node_modules/@babel/runtime/helpers/toPrimitive.js", "../../../../../../node_modules/@babel/runtime/helpers/toPropertyKey.js", "../../../../../../node_modules/@babel/runtime/helpers/defineProperty.js", "../../../../../../node_modules/prop-types/lib/ReactPropTypesSecret.js", "../../../../../../node_modules/prop-types/factoryWithThrowingShims.js", "../../../../../../node_modules/prop-types/index.js", "../../../../../../node_modules/moment/moment.js", "../../../../../../node_modules/react-moment-proptypes/src/moment-validation-wrapper.js", "../../../../../../node_modules/react-moment-proptypes/src/core.js", "../../../../../../node_modules/react-moment-proptypes/src/index.js", "../../../../../../node_modules/airbnb-prop-types/src/mocks/index.js", "../../../../../../node_modules/airbnb-prop-types/index.js", "../../../../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js", "../../../../../../node_modules/react-is/cjs/react-is.production.min.js", "../../../../../../node_modules/react-is/index.js", "../../../../../../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js", "../../../../../../node_modules/es-abstract/node_modules/is-callable/index.js", "../../../../../../node_modules/es-abstract/2020/IsCallable.js", "../../../../../../node_modules/functions-have-names/index.js", "../../../../../../node_modules/function.prototype.name/implementation.js", "../../../../../../node_modules/function.prototype.name/polyfill.js", "../../../../../../node_modules/function.prototype.name/shim.js", "../../../../../../node_modules/function.prototype.name/index.js", "../../../../../../node_modules/airbnb-prop-types/src/helpers/getComponentName.js", "../../../../../../node_modules/react-with-styles/lib/utils/emptyStylesFn.js", "../../../../../../node_modules/react-with-styles/lib/utils/perf.js", "../../../../../../node_modules/deepmerge/dist/cjs.js", "../../../../../../node_modules/react-with-direction/dist/constants.js", "../../../../../../node_modules/react-with-direction/dist/proptypes/brcast.js", "../../../../../../node_modules/es-abstract/5/CheckObjectCoercible.js", "../../../../../../node_modules/es-abstract/2020/RequireObjectCoercible.js", "../../../../../../node_modules/react-with-direction/node_modules/object.values/implementation.js", "../../../../../../node_modules/react-with-direction/node_modules/object.values/polyfill.js", "../../../../../../node_modules/react-with-direction/node_modules/object.values/shim.js", "../../../../../../node_modules/react-with-direction/node_modules/object.values/index.js", "../../../../../../node_modules/react-with-direction/dist/proptypes/direction.js", "../../../../../../node_modules/react-with-direction/dist/withDirection.js", "../../../../../../node_modules/react-with-styles/lib/WithStylesContext.js", "../../../../../../node_modules/react-with-styles/lib/withStylesPropTypes.js", "../../../../../../node_modules/react-with-styles/lib/withStyles.js", "../../../../../../node_modules/performance-now/src/performance-now.coffee", "../../../../../../node_modules/raf/index.js", "../../../../../../node_modules/react-dates/lib/defaultPhrases.js", "../../../../../../node_modules/react-dates/lib/utils/getPhrasePropTypes.js", "../../../../../../node_modules/react-dates/lib/utils/getPhrase.js", "../../../../../../node_modules/react-dates/lib/constants.js", "../../../../../../node_modules/react-dates/lib/utils/getCalendarDaySettings.js", "../../../../../../node_modules/@babel/runtime/helpers/arrayLikeToArray.js", "../../../../../../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js", "../../../../../../node_modules/@babel/runtime/helpers/iterableToArray.js", "../../../../../../node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", "../../../../../../node_modules/@babel/runtime/helpers/nonIterableSpread.js", "../../../../../../node_modules/@babel/runtime/helpers/toConsumableArray.js", "../../../../../../node_modules/react-dates/lib/shapes/ModifiersShape.js", "../../../../../../node_modules/react-dates/lib/components/CalendarDay.js", "../../../../../../node_modules/react-dates/lib/components/CalendarWeek.js", "../../../../../../node_modules/react-dates/lib/utils/calculateDimension.js", "../../../../../../node_modules/react-dates/lib/utils/getCalendarMonthWeeks.js", "../../../../../../node_modules/react-dates/lib/utils/isSameDay.js", "../../../../../../node_modules/react-dates/lib/utils/toMomentObject.js", "../../../../../../node_modules/react-dates/lib/utils/toISODateString.js", "../../../../../../node_modules/react-dates/lib/shapes/ScrollableOrientationShape.js", "../../../../../../node_modules/react-dates/lib/shapes/DayOfWeekShape.js", "../../../../../../node_modules/react-dates/lib/components/CalendarMonth.js", "../../../../../../node_modules/consolidated-events/lib/index.js", "../../../../../../node_modules/react-dates/lib/utils/noflip.js", "../../../../../../node_modules/react-dates/lib/utils/isTransitionEndSupported.js", "../../../../../../node_modules/react-dates/lib/utils/getTransformStyles.js", "../../../../../../node_modules/react-dates/lib/utils/getCalendarMonthWidth.js", "../../../../../../node_modules/react-dates/lib/utils/toISOMonthString.js", "../../../../../../node_modules/react-dates/lib/utils/isSameMonth.js", "../../../../../../node_modules/react-dates/lib/utils/isPrevMonth.js", "../../../../../../node_modules/react-dates/lib/utils/isNextMonth.js", "../../../../../../node_modules/react-dates/lib/components/CalendarMonthGrid.js", "../../../../../../node_modules/react-portal/lib/utils.js", "../../../../../../node_modules/react-portal/lib/Portal.js", "../../../../../../node_modules/react-portal/lib/LegacyPortal.js", "../../../../../../node_modules/react-portal/lib/PortalCompat.js", "../../../../../../node_modules/react-portal/lib/PortalWithState.js", "../../../../../../node_modules/react-portal/lib/index.js", "../../../../../../node_modules/is-touch-device/build/index.js", "../../../../../../node_modules/object.values/node_modules/es-abstract/GetIntrinsic.js", "../../../../../../node_modules/object.values/node_modules/es-abstract/5/CheckObjectCoercible.js", "../../../../../../node_modules/object.values/node_modules/es-abstract/2019/RequireObjectCoercible.js", "../../../../../../node_modules/object.values/node_modules/es-abstract/helpers/callBind.js", "../../../../../../node_modules/object.values/node_modules/es-abstract/helpers/callBound.js", "../../../../../../node_modules/object.values/implementation.js", "../../../../../../node_modules/object.values/polyfill.js", "../../../../../../node_modules/object.values/shim.js", "../../../../../../node_modules/object.values/index.js", "../../../../../../node_modules/document.contains/implementation.js", "../../../../../../node_modules/document.contains/polyfill.js", "../../../../../../node_modules/document.contains/shim.js", "../../../../../../node_modules/document.contains/index.js", "../../../../../../node_modules/react-outside-click-handler/build/OutsideClickHandler.js", "../../../../../../node_modules/react-outside-click-handler/index.js", "../../../../../../node_modules/react-dates/lib/shapes/FocusedInputShape.js", "../../../../../../node_modules/react-dates/lib/shapes/IconPositionShape.js", "../../../../../../node_modules/react-dates/lib/shapes/OrientationShape.js", "../../../../../../node_modules/react-dates/lib/shapes/DisabledShape.js", "../../../../../../node_modules/react-dates/lib/shapes/AnchorDirectionShape.js", "../../../../../../node_modules/react-dates/lib/shapes/OpenDirectionShape.js", "../../../../../../node_modules/react-dates/lib/shapes/CalendarInfoPositionShape.js", "../../../../../../node_modules/react-dates/lib/shapes/NavPositionShape.js", "../../../../../../node_modules/react-dates/lib/shapes/DateRangePickerShape.js", "../../../../../../node_modules/react-dates/lib/utils/getResponsiveContainerStyles.js", "../../../../../../node_modules/react-dates/lib/utils/getDetachedContainerStyles.js", "../../../../../../node_modules/react-dates/lib/utils/getInputHeight.js", "../../../../../../node_modules/react-dates/lib/utils/isBeforeDay.js", "../../../../../../node_modules/react-dates/lib/utils/isInclusivelyAfterDay.js", "../../../../../../node_modules/react-dates/lib/utils/disableScroll.js", "../../../../../../node_modules/lodash/isObject.js", "../../../../../../node_modules/lodash/_freeGlobal.js", "../../../../../../node_modules/lodash/_root.js", "../../../../../../node_modules/lodash/now.js", "../../../../../../node_modules/lodash/_trimmedEndIndex.js", "../../../../../../node_modules/lodash/_baseTrim.js", "../../../../../../node_modules/lodash/_Symbol.js", "../../../../../../node_modules/lodash/_getRawTag.js", "../../../../../../node_modules/lodash/_objectToString.js", "../../../../../../node_modules/lodash/_baseGetTag.js", "../../../../../../node_modules/lodash/isObjectLike.js", "../../../../../../node_modules/lodash/isSymbol.js", "../../../../../../node_modules/lodash/toNumber.js", "../../../../../../node_modules/lodash/debounce.js", "../../../../../../node_modules/lodash/throttle.js", "../../../../../../node_modules/react-dates/lib/components/DateInput.js", "../../../../../../node_modules/react-dates/lib/components/RightArrow.js", "../../../../../../node_modules/react-dates/lib/components/LeftArrow.js", "../../../../../../node_modules/react-dates/lib/components/CloseButton.js", "../../../../../../node_modules/react-dates/lib/components/CalendarIcon.js", "../../../../../../node_modules/react-dates/lib/components/DateRangePickerInput.js", "../../../../../../node_modules/react-dates/lib/utils/toLocalizedDateString.js", "../../../../../../node_modules/react-dates/lib/components/DateRangePickerInputController.js", "../../../../../../node_modules/@babel/runtime/helpers/arrayWithHoles.js", "../../../../../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", "../../../../../../node_modules/@babel/runtime/helpers/nonIterableRest.js", "../../../../../../node_modules/@babel/runtime/helpers/slicedToArray.js", "../../../../../../node_modules/react-dates/lib/utils/isNextDay.js", "../../../../../../node_modules/react-dates/lib/utils/isAfterDay.js", "../../../../../../node_modules/react-dates/lib/utils/isPreviousDay.js", "../../../../../../node_modules/react-dates/lib/utils/getVisibleDays.js", "../../../../../../node_modules/react-dates/lib/utils/isDayVisible.js", "../../../../../../node_modules/react-dates/lib/utils/getSelectedDateOffset.js", "../../../../../../node_modules/react-dates/lib/utils/getPreviousMonthMemoLast.js", "../../../../../../node_modules/react-dates/lib/utils/modifiers.js", "../../../../../../node_modules/react-dates/lib/components/ChevronUp.js", "../../../../../../node_modules/react-dates/lib/components/ChevronDown.js", "../../../../../../node_modules/react-dates/lib/components/DayPickerNavigation.js", "../../../../../../node_modules/react-dates/lib/components/KeyboardShortcutRow.js", "../../../../../../node_modules/react-dates/lib/components/DayPickerKeyboardShortcuts.js", "../../../../../../node_modules/react-dates/lib/utils/getNumberOfCalendarMonthWeeks.js", "../../../../../../node_modules/react-dates/lib/utils/getActiveElement.js", "../../../../../../node_modules/react-dates/lib/components/DayPicker.js", "../../../../../../node_modules/react-dates/lib/utils/getPooledMoment.js", "../../../../../../node_modules/react-dates/lib/components/DayPickerRangeController.js", "../../../../../../node_modules/react-dates/lib/components/DateRangePicker.js", "../../../../../../node_modules/react-dates/lib/components/DayPickerSingleDateController.js", "../../../../../../node_modules/react-dates/lib/shapes/SingleDatePickerShape.js", "../../../../../../node_modules/react-dates/lib/components/SingleDatePickerInput.js", "../../../../../../node_modules/react-dates/lib/components/SingleDatePickerInputController.js", "../../../../../../node_modules/react-dates/lib/components/SingleDatePicker.js", "../../../../../../node_modules/react-dates/lib/utils/isInclusivelyBeforeDay.js", "../../../../../../node_modules/react-dates/lib/index.js", "../../../../../../node_modules/react-dates/index.js", "../../../../../../node_modules/moment/locale/nl.js", "../../../../../../node_modules/moment/locale/en-gb.js", "../../../../../../node_modules/moment/locale/de.js", "../../../../../../node_modules/moment/locale/fr.js", "../../../../../../node_modules/moment/locale/cs.js", "../../../../../../node_modules/moment/locale/da.js", "../../../../../../node_modules/moment/locale/es.js", "../../../../../../node_modules/moment/locale/it.js", "../../../../../../node_modules/moment/locale/nb.js", "../../../../../../node_modules/moment/locale/pl.js", "../../../../../../node_modules/moment/locale/pt.js", "../../../../../../node_modules/moment/locale/tr.js", "../../../../../../gems/design_system/app/javascript/design_system/lib/moment.js", "../../../../../../gems/design_system/app/javascript/design_system/react_components/react_dates.jsx", "../../../../../../gems/design_system/app/javascript/design_system/react_components/date_calendar.jsx", "../../../../../../gems/design_system/app/javascript/design_system/react_components/date_range_calendar.jsx", "../../../../../../node_modules/@jsep-plugin/arrow/src/index.js", "../../../../../../node_modules/@jsep-plugin/assignment/src/index.js", "../../../../../../node_modules/@jsep-plugin/async-await/src/index.js", "../../../../../../node_modules/@jsep-plugin/new/src/index.js", "../../../../../../node_modules/@jsep-plugin/object/src/index.js", "../../../../../../node_modules/@jsep-plugin/regex/src/index.js", "../../../../../../node_modules/@jsep-plugin/spread/src/index.js", "../../../../../../node_modules/@jsep-plugin/template/src/index.js", "../../../../../../node_modules/@jsep-plugin/ternary/src/index.js", "../../../../../../node_modules/scroll-lock/dist/scroll-lock.js", "../../../../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../../../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../../javascript/application/controllers/auto_submit_period_select_controller.js", "../../../javascript/application/controllers/availability_search/floating_bar_controller.js", "../../../../../../node_modules/stimulus-store/src/utils/camelize.ts", "../../../../../../node_modules/stimulus-store/src/hooks/useStore.ts", "../../../../../../node_modules/stimulus-store/src/errors/useStoreErrorHandlers.ts", "../../../../../../node_modules/stimulus-store/src/errors/useStoreWarningHandlers.ts", "../../../../../../node_modules/stimulus-store/src/store/storeValuesTypeMap.ts", "../../../../../../node_modules/stimulus-store/src/store/store.ts", "../../../../../../node_modules/stimulus-store/src/errors/storeErrorHandlers.ts", "../../../../../../node_modules/stimulus-store/src/store/createStore.ts", "../../../../../../node_modules/stimulus-store/src/errors/createStoreErrorHandlers.ts", "../../../javascript/application/controllers/availability_search/location_filter_store.js", "../../../javascript/application/controllers/availability_search/location_filter_controller.js", "../../../javascript/application/controllers/availability_search/location_filter_menu_item_controller.js", "../../../../../../node_modules/@popperjs/core/lib/enums.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../../../../../../node_modules/@popperjs/core/lib/utils/math.js", "../../../../../../node_modules/@popperjs/core/lib/utils/userAgent.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../../../../../../node_modules/@popperjs/core/lib/utils/within.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../../../../../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../../../../../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getVariation.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../../../../../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../../../../../../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../../../../../../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../../../../../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/flip.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/hide.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/offset.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../../../../../../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../../../../../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../../../../../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../../../../../../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../../../../../../node_modules/@popperjs/core/lib/utils/debounce.js", "../../../../../../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../../../../../../node_modules/@popperjs/core/lib/createPopper.js", "../../../../../../node_modules/@popperjs/core/lib/popper.js", "../../../../../../node_modules/tippy.js/src/constants.ts", "../../../../../../node_modules/tippy.js/src/utils.ts", "../../../../../../node_modules/tippy.js/src/dom-utils.ts", "../../../../../../node_modules/tippy.js/src/bindGlobalEventListeners.ts", "../../../../../../node_modules/tippy.js/src/browser.ts", "../../../../../../node_modules/tippy.js/src/validation.ts", "../../../../../../node_modules/tippy.js/src/props.ts", "../../../../../../node_modules/tippy.js/src/template.ts", "../../../../../../node_modules/tippy.js/src/createTippy.ts", "../../../../../../node_modules/tippy.js/src/index.ts", "../../../../../../node_modules/tippy.js/src/addons/createSingleton.ts", "../../../../../../node_modules/tippy.js/src/addons/delegate.ts", "../../../../../../node_modules/tippy.js/src/plugins/animateFill.ts", "../../../../../../node_modules/tippy.js/src/plugins/followCursor.ts", "../../../../../../node_modules/tippy.js/src/plugins/inlinePositioning.ts", "../../../../../../node_modules/tippy.js/src/plugins/sticky.ts", "../../../../../../node_modules/tippy.js/build/base.js", "../../../javascript/application/controllers/availability_search/primary_filters_controller.js", "../../../../../../node_modules/embla-carousel/src/components/utils.ts", "../../../../../../node_modules/embla-carousel/src/components/Alignment.ts", "../../../../../../node_modules/embla-carousel/src/components/EventStore.ts", "../../../../../../node_modules/embla-carousel/src/components/Animations.ts", "../../../../../../node_modules/embla-carousel/src/components/Axis.ts", "../../../../../../node_modules/embla-carousel/src/components/Limit.ts", "../../../../../../node_modules/embla-carousel/src/components/Counter.ts", "../../../../../../node_modules/embla-carousel/src/components/DragHandler.ts", "../../../../../../node_modules/embla-carousel/src/components/DragTracker.ts", "../../../../../../node_modules/embla-carousel/src/components/NodeRects.ts", "../../../../../../node_modules/embla-carousel/src/components/PercentOfView.ts", "../../../../../../node_modules/embla-carousel/src/components/ResizeHandler.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollBody.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollBounds.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollContain.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollLimit.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollLooper.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollProgress.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollSnaps.ts", "../../../../../../node_modules/embla-carousel/src/components/SlideRegistry.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollTarget.ts", "../../../../../../node_modules/embla-carousel/src/components/ScrollTo.ts", "../../../../../../node_modules/embla-carousel/src/components/SlideFocus.ts", "../../../../../../node_modules/embla-carousel/src/components/Vector1d.ts", "../../../../../../node_modules/embla-carousel/src/components/Translate.ts", "../../../../../../node_modules/embla-carousel/src/components/SlideLooper.ts", "../../../../../../node_modules/embla-carousel/src/components/SlidesHandler.ts", "../../../../../../node_modules/embla-carousel/src/components/SlidesInView.ts", "../../../../../../node_modules/embla-carousel/src/components/SlideSizes.ts", "../../../../../../node_modules/embla-carousel/src/components/SlidesToScroll.ts", "../../../../../../node_modules/embla-carousel/src/components/Engine.ts", "../../../../../../node_modules/embla-carousel/src/components/EventHandler.ts", "../../../../../../node_modules/embla-carousel/src/components/Options.ts", "../../../../../../node_modules/embla-carousel/src/components/OptionsHandler.ts", "../../../../../../node_modules/embla-carousel/src/components/PluginsHandler.ts", "../../../../../../node_modules/embla-carousel/src/components/EmblaCarousel.ts", "../../../javascript/application/controllers/carousel_controller.js", "../../../javascript/application/controllers/consent/consent_management_controller.js", "../../../javascript/application/controllers/increment_controller.js", "../../../javascript/application/controllers/initialize_controller.js", "../../../javascript/application/controllers/openable_controller.js", "../../../javascript/application/controllers/overlappable_controller.js", "../../../javascript/application/controllers/period_select_controller.jsx", "../../../javascript/application/react_components/period_selector.jsx", "../../../javascript/application/react_components/period_selector_day.jsx", "../../../javascript/application/controllers/pop_up_controller.js", "../../../javascript/application/controllers/recaptcha_controller.js", "../../../javascript/application/controllers/slideshow_controller.js", "../../../javascript/application/controllers/sticky_controller.js", "../../../javascript/application/controllers/turbo_opt_in_controller.js", "../../../javascript/application/controllers/turbo_request_controller.js", "../../../../../../node_modules/idiomorph/dist/idiomorph.esm.js", "../../../javascript/application/controllers/turbo_request_cache.js", "../../../../../../node_modules/hls.js/dist/src/polyfills/number.ts", "../../../../../../node_modules/hls.js/dist/src/errors.ts", "../../../../../../node_modules/hls.js/dist/src/events.ts", "../../../../../../node_modules/hls.js/dist/src/types/loader.ts", "../../../../../../node_modules/hls.js/dist/src/utils/ewma.ts", "../../../../../../node_modules/hls.js/dist/src/utils/ewma-bandwidth-estimator.ts", "../../../../../../node_modules/hls.js/dist/src/utils/logger.ts", "../../../../../../node_modules/hls.js/dist/src/utils/mediasource-helper.ts", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/utf8ArrayToStr.js", "../../../../../../node_modules/hls.js/dist/src/utils/hex.ts", "../../../../../../node_modules/hls.js/dist/node_modules/url-toolkit/src/url-toolkit.js", "../../../../../../node_modules/hls.js/dist/src/loader/load-stats.ts", "../../../../../../node_modules/hls.js/dist/src/loader/fragment.ts", "../../../../../../node_modules/hls.js/dist/src/utils/mp4-tools.ts", "../../../../../../node_modules/hls.js/dist/src/utils/codecs.ts", "../../../../../../node_modules/hls.js/dist/src/utils/mediacapabilities-helper.ts", "../../../../../../node_modules/hls.js/dist/src/types/level.ts", "../../../../../../node_modules/hls.js/dist/src/utils/hdr.ts", "../../../../../../node_modules/hls.js/dist/src/utils/safe-json-stringify.ts", "../../../../../../node_modules/hls.js/dist/src/utils/rendition-helper.ts", "../../../../../../node_modules/hls.js/dist/src/controller/abr-controller.ts", "../../../../../../node_modules/hls.js/dist/src/utils/binary-search.ts", "../../../../../../node_modules/hls.js/dist/src/controller/fragment-finders.ts", "../../../../../../node_modules/hls.js/dist/src/utils/error-helper.ts", "../../../../../../node_modules/hls.js/dist/src/controller/error-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/fragment-tracker.ts", "../../../../../../node_modules/hls.js/dist/src/crypt/decrypter-aes-mode.ts", "../../../../../../node_modules/hls.js/dist/src/crypt/aes-crypto.ts", "../../../../../../node_modules/hls.js/dist/src/crypt/aes-decryptor.ts", "../../../../../../node_modules/hls.js/dist/src/crypt/fast-aes-key.ts", "../../../../../../node_modules/hls.js/dist/src/crypt/decrypter.ts", "../../../../../../node_modules/hls.js/dist/src/loader/fragment-loader.ts", "../../../../../../node_modules/hls.js/dist/src/task-loop.ts", "../../../../../../node_modules/hls.js/dist/src/types/transmuxer.ts", "../../../../../../node_modules/hls.js/dist/src/utils/buffer-helper.ts", "../../../../../../node_modules/hls.js/dist/src/utils/variable-substitution.ts", "../../../../../../node_modules/hls.js/dist/src/utils/attr-list.ts", "../../../../../../node_modules/hls.js/dist/src/loader/date-range.ts", "../../../../../../node_modules/hls.js/dist/src/loader/level-details.ts", "../../../../../../node_modules/hls.js/dist/src/utils/arrays.ts", "../../../../../../node_modules/hls.js/dist/src/utils/encryption-methods-util.ts", "../../../../../../node_modules/hls.js/dist/src/utils/numeric-encoding-utils.ts", "../../../../../../node_modules/hls.js/dist/src/utils/utf8-utils.ts", "../../../../../../node_modules/hls.js/dist/src/utils/keysystem-util.ts", "../../../../../../node_modules/hls.js/dist/src/utils/global.ts", "../../../../../../node_modules/hls.js/dist/src/utils/mediakeys-helper.ts", "../../../../../../node_modules/hls.js/dist/src/loader/level-key.ts", "../../../../../../node_modules/hls.js/dist/src/loader/m3u8-parser.ts", "../../../../../../node_modules/hls.js/dist/src/utils/level-helper.ts", "../../../../../../node_modules/hls.js/dist/src/utils/discontinuities.ts", "../../../../../../node_modules/hls.js/dist/src/utils/event-listener-helper.ts", "../../../../../../node_modules/hls.js/dist/src/utils/time-ranges.ts", "../../../../../../node_modules/hls.js/dist/src/controller/base-stream-controller.ts", "../../../../../../node_modules/hls.js/dist/src/demux/chunk-cache.ts", "../../../../../../node_modules/hls.js/dist/node_modules/eventemitter3/index.js", "../../../../../../node_modules/hls.js/dist/src/version.ts", "../../../../../../node_modules/hls.js/dist/src/demux/inject-worker.ts", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/isId3Footer.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/isId3Header.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/readId3Size.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/getId3Data.js", "../../../../../../node_modules/hls.js/dist/src/demux/audio/adts.ts", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/canParseId3.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/toArrayBuffer.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/utf8.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/decodeId3ImageFrame.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/decodeId3PrivFrame.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/decodeId3TextFrame.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/decodeId3UrlFrame.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/decodeId3Frame.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/getId3FrameData.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/getId3Frames.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/isId3TimestampFrame.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/util/readId3Timestamp.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/id3/getId3Timestamp.js", "../../../../../../node_modules/hls.js/dist/src/types/demuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/dummy-demuxed-track.ts", "../../../../../../node_modules/hls.js/dist/src/demux/audio/base-audio-demuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/audio/mpegaudio.ts", "../../../../../../node_modules/hls.js/dist/src/demux/audio/aacdemuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/audio/dolby.ts", "../../../../../../node_modules/hls.js/dist/src/demux/audio/ac3-demuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/audio/mp3demuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/mp4demuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/sample-aes.ts", "../../../../../../node_modules/hls.js/dist/src/demux/video/base-video-parser.ts", "../../../../../../node_modules/hls.js/dist/src/demux/video/exp-golomb.ts", "../../../../../../node_modules/hls.js/dist/src/demux/video/avc-video-parser.ts", "../../../../../../node_modules/hls.js/dist/src/demux/video/hevc-video-parser.ts", "../../../../../../node_modules/hls.js/dist/src/demux/tsdemuxer.ts", "../../../../../../node_modules/hls.js/dist/src/remux/aac-helper.ts", "../../../../../../node_modules/hls.js/dist/src/remux/mp4-generator.ts", "../../../../../../node_modules/hls.js/dist/src/utils/timescale-conversion.ts", "../../../../../../node_modules/hls.js/dist/src/remux/mp4-remuxer.ts", "../../../../../../node_modules/hls.js/dist/src/remux/passthrough-remuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/transmuxer.ts", "../../../../../../node_modules/hls.js/dist/src/demux/transmuxer-interface.ts", "../../../../../../node_modules/hls.js/dist/src/controller/audio-stream-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/base-playlist-controller.ts", "../../../../../../node_modules/hls.js/dist/src/utils/media-option-attributes.ts", "../../../../../../node_modules/hls.js/dist/src/controller/audio-track-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/buffer-operation-queue.ts", "../../../../../../node_modules/hls.js/dist/src/controller/buffer-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/cap-level-controller.ts", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/CmObjectType.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CmcdObjectType.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/CmStreamingFormat.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CmcdStreamingFormat.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/SfItem.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/DICT.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/throwError.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeError.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/SfToken.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/BARE_ITEM.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/BOOLEAN.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeBoolean.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/encodeBase64.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/BYTES.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeByteSequence.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/INTEGER.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/isInvalidInt.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeInteger.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeDate.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/roundToEven.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/DECIMAL.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeDecimal.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/STRING.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/STRING_REGEX.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeString.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/utils/symbolToStr.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/TOKEN.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeToken.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeBareItem.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/KEY.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeKey.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeParams.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeItem.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeInnerList.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeDict.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/encodeSfDict.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_OBJECT.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_REQUEST.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_SESSION.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_STATUS.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_HEADER_MAP.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CmcdHeaderField.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/groupCmcdHeaders.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/utils/isTokenField.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/utils/isValid.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_EVENT_MODE.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/urlToRelativePath.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_FORMATTER_MAP.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_REQUEST_MODE.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_RESPONSE_MODE.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_COMMON_KEYS.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_EVENT_KEYS.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/isCmcdCustomKey.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/isCmcdEventKey.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_REQUEST_KEYS.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/isCmcdRequestKey.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_RESPONSE_KEYS.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/isCmcdResponseKey.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_V1_KEYS.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/isCmcdV1Key.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/prepareCmcdData.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/toCmcdHeaders.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/appendCmcdHeaders.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_PARAM.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/encodeCmcd.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/toCmcdUrl.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/toCmcdQuery.js", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/appendCmcdQuery.js", "../../../../../../node_modules/hls.js/dist/src/controller/cmcd-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/content-steering-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/eme-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/fps-controller.ts", "../../../../../../node_modules/hls.js/dist/src/utils/texttrack-utils.ts", "../../../../../../node_modules/hls.js/dist/src/controller/subtitle-track-controller.ts", "../../../../../../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/uuid.js", "../../../../../../node_modules/hls.js/dist/src/utils/hash.ts", "../../../../../../node_modules/hls.js/dist/src/loader/interstitial-event.ts", "../../../../../../node_modules/hls.js/dist/src/controller/interstitial-player.ts", "../../../../../../node_modules/hls.js/dist/src/controller/interstitials-schedule.ts", "../../../../../../node_modules/hls.js/dist/src/loader/interstitial-asset-list.ts", "../../../../../../node_modules/hls.js/dist/src/controller/interstitials-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/subtitle-stream-controller.ts", "../../../../../../node_modules/hls.js/dist/src/utils/cea-608-parser.ts", "../../../../../../node_modules/hls.js/dist/src/utils/vttcue.ts", "../../../../../../node_modules/hls.js/dist/src/utils/vttparser.ts", "../../../../../../node_modules/hls.js/dist/src/utils/webvtt-parser.ts", "../../../../../../node_modules/hls.js/dist/src/utils/imsc1-ttml-parser.ts", "../../../../../../node_modules/hls.js/dist/src/utils/output-filter.ts", "../../../../../../node_modules/hls.js/dist/src/controller/timeline-controller.ts", "../../../../../../node_modules/hls.js/dist/src/utils/cues.ts", "../../../../../../node_modules/hls.js/dist/src/utils/fetch-loader.ts", "../../../../../../node_modules/hls.js/dist/src/utils/xhr-loader.ts", "../../../../../../node_modules/hls.js/dist/src/config.ts", "../../../../../../node_modules/hls.js/dist/src/controller/gap-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/id3-track-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/latency-controller.ts", "../../../../../../node_modules/hls.js/dist/src/controller/level-controller.ts", "../../../../../../node_modules/hls.js/dist/src/is-supported.ts", "../../../../../../node_modules/hls.js/dist/src/controller/stream-controller.ts", "../../../../../../node_modules/hls.js/dist/src/loader/key-loader.ts", "../../../../../../node_modules/hls.js/dist/src/loader/playlist-loader.ts", "../../../../../../node_modules/hls.js/dist/src/hls.ts", "../../../../../../node_modules/plyr/dist/plyr.mjs", "../../../javascript/application/controllers/video_player_controller.js", "/srv/apps/cms/app/javascript/application/controllers", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/application_layout_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/autofocus_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/autosubmit_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/date_calendar_controller.jsx", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/date_range_calendar_controller.jsx", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/expandable_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_observer.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_utils.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_state.js", "../../../../../../node_modules/jsep/dist/jsep.js", "../../../../../../node_modules/jse-eval/index.ts", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_evaluator.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_attribute.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_computed.js", "../../../../../../node_modules/dompurify/src/utils.ts", "../../../../../../node_modules/dompurify/src/tags.ts", "../../../../../../node_modules/dompurify/src/attrs.ts", "../../../../../../node_modules/dompurify/src/regexp.ts", "../../../../../../node_modules/dompurify/src/purify.ts", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/live_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/modal_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/modal_dialog_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/modal_slideshow_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/modal_trigger_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/modules/tippy.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/popover_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/range_slider_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/search_list_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/toggle_by_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/show_by_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/stepper_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/tabs_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/tabs_item_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/tabs_panel_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/stimulus_controllers/tooltip_controller.js", "../../../../../../gems/design_system/app/javascript/design_system/modules/turbo_frame.js", "../../../../../../gems/design_system/app/javascript/design_system/modules/turbo_stream.js", "../../../javascript/application/modules/turbo.js", "../../../javascript/application/bundle.js"],
  "sourcesContent": ["export default {\n  logger: typeof console !== \"undefined\" ? console : undefined,\n  WebSocket: typeof WebSocket !== \"undefined\" ? WebSocket : undefined,\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordMessage() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\",\n    \"remote\": \"remote\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n    if (this.isOpen()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  triedToReconnect() {\n    return this.monitor.reconnectAttempts > 0\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    this.monitor.recordMessage()\n    switch (type) {\n      case message_types.welcome:\n        if (this.triedToReconnect()) {\n          this.reconnectAttempted = true\n        }\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return null\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        if (this.reconnectAttempted) {\n          this.reconnectAttempted = false\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: true})\n        } else {\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: false})\n        }\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport logger from \"./logger\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n    this.subprotocols = []\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n\n  addSubProtocol(subprotocol) {\n    this.subprotocols = [...this.subprotocols, subprotocol]\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n", "/** @license React v16.14.0\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var l=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.forward_ref\"):60112,y=n?Symbol.for(\"react.suspense\"):60113,z=n?Symbol.for(\"react.memo\"):60115,A=n?Symbol.for(\"react.lazy\"):\n60116,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};function F(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}F.prototype.isReactComponent={};F.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(C(85));this.updater.enqueueSetState(this,a,b,\"setState\")};F.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\nfunction G(){}G.prototype=F.prototype;function H(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}var I=H.prototype=new G;I.constructor=H;l(I,F.prototype);I.isPureReactComponent=!0;var J={current:null},K=Object.prototype.hasOwnProperty,L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,c){var e,d={},g=null,k=null;if(null!=b)for(e in void 0!==b.ref&&(k=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)K.call(b,e)&&!L.hasOwnProperty(e)&&(d[e]=b[e]);var f=arguments.length-2;if(1===f)d.children=c;else if(1<f){for(var h=Array(f),m=0;m<f;m++)h[m]=arguments[m+2];d.children=h}if(a&&a.defaultProps)for(e in f=a.defaultProps,f)void 0===d[e]&&(d[e]=f[e]);return{$$typeof:p,type:a,key:g,ref:k,props:d,_owner:J.current}}\nfunction N(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,c,e){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=c;d.context=e;d.count=0;return d}return{result:a,keyPrefix:b,func:c,context:e,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,c,e){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return c(e,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var k=0;k<a.length;k++){d=a[k];var f=b+U(d,k);g+=T(d,f,c,e)}else if(null===a||\"object\"!==typeof a?f=null:(f=B&&a[B]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),k=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,k++),g+=T(d,f,c,e);else if(\"object\"===d)throw c=\"\"+a,Error(C(31,\"[object Object]\"===c?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":c,\"\"));return g}function V(a,b,c){return null==a?0:T(a,\"\",b,c)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function W(a,b){a.func.call(a.context,b,a.count++)}\nfunction aa(a,b,c){var e=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?X(a,e,c,function(a){return a}):null!=a&&(O(a)&&(a=N(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+c)),e.push(a))}function X(a,b,c,e,d){var g=\"\";null!=c&&(g=(\"\"+c).replace(P,\"$&/\")+\"/\");b=R(b,g,e,d);V(a,aa,b);S(b)}var Y={current:null};function Z(){var a=Y.current;if(null===a)throw Error(C(321));return a}\nvar ba={ReactCurrentDispatcher:Y,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:J,IsSomeRendererActing:{current:!1},assign:l};exports.Children={map:function(a,b,c){if(null==a)return a;var e=[];X(a,e,null,b,c);return e},forEach:function(a,b,c){if(null==a)return a;b=R(null,null,b,c);V(a,W,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];X(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(C(143));return a}};\nexports.Component=F;exports.Fragment=r;exports.Profiler=u;exports.PureComponent=H;exports.StrictMode=t;exports.Suspense=y;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ba;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(C(267,a));var e=l({},a.props),d=a.key,g=a.ref,k=a._owner;if(null!=b){void 0!==b.ref&&(g=b.ref,k=J.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var f=a.type.defaultProps;for(h in b)K.call(b,h)&&!L.hasOwnProperty(h)&&(e[h]=void 0===b[h]&&void 0!==f?f[h]:b[h])}var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){f=Array(h);for(var m=0;m<h;m++)f[m]=arguments[m+2];e.children=f}return{$$typeof:p,type:a.type,\nkey:d,ref:g,props:e,_owner:k}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:x,render:a}};exports.isValidElement=O;\nexports.lazy=function(a){return{$$typeof:A,_ctor:a,_status:-1,_result:null}};exports.memo=function(a,b){return{$$typeof:z,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return Z().useCallback(a,b)};exports.useContext=function(a,b){return Z().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return Z().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return Z().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return Z().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return Z().useMemo(a,b)};exports.useReducer=function(a,b,c){return Z().useReducer(a,b,c)};exports.useRef=function(a){return Z().useRef(a)};exports.useState=function(a){return Z().useState(a)};exports.version=\"16.14.0\";\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n", "/** @license React v0.19.1\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var f,g,h,k,l;\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,\ny=window.setTimeout,z=window.clearTimeout;if(\"undefined\"!==typeof console){var A=window.cancelAnimationFrame;\"function\"!==typeof window.requestAnimationFrame&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\");\"function\"!==typeof A&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\")}if(\"object\"===\ntypeof w&&\"function\"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var B=x.now();exports.unstable_now=function(){return x.now()-B}}var C=!1,D=null,E=-1,F=5,G=0;k=function(){return exports.unstable_now()>=G};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported\"):F=0<a?Math.floor(1E3/a):5};var H=new MessageChannel,I=H.port2;H.port1.onmessage=\nfunction(){if(null!==D){var a=exports.unstable_now();G=a+F;try{D(!0,a)?I.postMessage(null):(C=!1,D=null)}catch(b){throw I.postMessage(null),b;}}else C=!1};f=function(a){D=a;C||(C=!0,I.postMessage(null))};g=function(a,b){E=y(function(){a(exports.unstable_now())},b)};h=function(){z(E);E=-1}}function J(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<K(e,b))a[d]=b,a[c]=e,c=d;else break a}}function L(a){a=a[0];return void 0===a?null:a}\nfunction M(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>K(n,c))void 0!==r&&0>K(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>K(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function K(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var N=[],O=[],P=1,Q=null,R=3,S=!1,T=!1,U=!1;\nfunction V(a){for(var b=L(O);null!==b;){if(null===b.callback)M(O);else if(b.startTime<=a)M(O),b.sortIndex=b.expirationTime,J(N,b);else break;b=L(O)}}function W(a){U=!1;V(a);if(!T)if(null!==L(N))T=!0,f(X);else{var b=L(O);null!==b&&g(W,b.startTime-a)}}\nfunction X(a,b){T=!1;U&&(U=!1,h());S=!0;var c=R;try{V(b);for(Q=L(N);null!==Q&&(!(Q.expirationTime>b)||a&&!k());){var d=Q.callback;if(null!==d){Q.callback=null;R=Q.priorityLevel;var e=d(Q.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?Q.callback=e:Q===L(N)&&M(N);V(b)}else M(N);Q=L(N)}if(null!==Q)var m=!0;else{var n=L(O);null!==n&&g(W,n.startTime-b);m=!1}return m}finally{Q=null,R=c,S=!1}}\nfunction Y(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var Z=l;exports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){T||S||(T=!0,f(X))};\nexports.unstable_getCurrentPriorityLevel=function(){return R};exports.unstable_getFirstCallbackNode=function(){return L(N)};exports.unstable_next=function(a){switch(R){case 1:case 2:case 3:var b=3;break;default:b=R}var c=R;R=b;try{return a()}finally{R=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=Z;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=R;R=a;try{return b()}finally{R=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if(\"object\"===typeof c&&null!==c){var e=c.delay;e=\"number\"===typeof e&&0<e?d+e:d;c=\"number\"===typeof c.timeout?c.timeout:Y(a)}else c=Y(a),e=d;c=e+c;a={id:P++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,J(O,a),null===L(N)&&a===L(O)&&(U?h():U=!0,g(W,e-d))):(a.sortIndex=c,J(N,a),T||S||(T=!0,f(X)));return a};\nexports.unstable_shouldYield=function(){var a=exports.unstable_now();V(a);var b=L(N);return b!==Q&&null!==Q&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<Q.expirationTime||k()};exports.unstable_wrapCallback=function(a){var b=R;return function(){var c=R;R=b;try{return a.apply(this,arguments)}finally{R=c}}};\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n", "/** @license React v16.14.0\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),r=require(\"scheduler\");function u(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(u(227));\nfunction ba(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var da=!1,ea=null,fa=!1,ha=null,ia={onError:function(a){da=!0;ea=a}};function ja(a,b,c,d,e,f,g,h,k){da=!1;ea=null;ba.apply(ia,arguments)}function ka(a,b,c,d,e,f,g,h,k){ja.apply(this,arguments);if(da){if(da){var l=ea;da=!1;ea=null}else throw Error(u(198));fa||(fa=!0,ha=l)}}var la=null,ma=null,na=null;\nfunction oa(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=na(c);ka(d,b,void 0,a);a.currentTarget=null}var pa=null,qa={};\nfunction ra(){if(pa)for(var a in qa){var b=qa[a],c=pa.indexOf(a);if(!(-1<c))throw Error(u(96,a));if(!sa[c]){if(!b.extractEvents)throw Error(u(97,a));sa[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(ta.hasOwnProperty(h))throw Error(u(99,h));ta[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ua(k[e],g,h);e=!0}else f.registrationName?(ua(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(u(98,d,a));}}}}\nfunction ua(a,b,c){if(va[a])throw Error(u(100,a));va[a]=b;wa[a]=b.eventTypes[c].dependencies}var sa=[],ta={},va={},wa={};function xa(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!qa.hasOwnProperty(c)||qa[c]!==d){if(qa[c])throw Error(u(102,c));qa[c]=d;b=!0}}b&&ra()}var ya=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),za=null,Aa=null,Ba=null;\nfunction Ca(a){if(a=ma(a)){if(\"function\"!==typeof za)throw Error(u(280));var b=a.stateNode;b&&(b=la(b),za(a.stateNode,a.type,b))}}function Da(a){Aa?Ba?Ba.push(a):Ba=[a]:Aa=a}function Ea(){if(Aa){var a=Aa,b=Ba;Ba=Aa=null;Ca(a);if(b)for(a=0;a<b.length;a++)Ca(b[a])}}function Fa(a,b){return a(b)}function Ga(a,b,c,d,e){return a(b,c,d,e)}function Ha(){}var Ia=Fa,Ja=!1,Ka=!1;function La(){if(null!==Aa||null!==Ba)Ha(),Ea()}\nfunction Ma(a,b,c){if(Ka)return a(b,c);Ka=!0;try{return Ia(a,b,c)}finally{Ka=!1,La()}}var Na=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,Oa=Object.prototype.hasOwnProperty,Pa={},Qa={};\nfunction Ra(a){if(Oa.call(Qa,a))return!0;if(Oa.call(Pa,a))return!1;if(Na.test(a))return Qa[a]=!0;Pa[a]=!0;return!1}function Sa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction Ta(a,b,c,d){if(null===b||\"undefined\"===typeof b||Sa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var C={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){C[a]=new v(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];C[b]=new v(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){C[a]=new v(a,2,!1,a.toLowerCase(),null,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){C[a]=new v(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){C[a]=new v(a,3,!1,a.toLowerCase(),null,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){C[a]=new v(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){C[a]=new v(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){C[a]=new v(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){C[a]=new v(a,5,!1,a.toLowerCase(),null,!1)});var Ua=/[\\-:]([a-z])/g;function Va(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(Ua,\nVa);C[b]=new v(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!1)});\nC.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!0)});var Wa=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Wa.hasOwnProperty(\"ReactCurrentDispatcher\")||(Wa.ReactCurrentDispatcher={current:null});Wa.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Wa.ReactCurrentBatchConfig={suspense:null});\nfunction Xa(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(Ta(b,c,e,d)&&(c=null),d||null===e?Ra(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nvar Ya=/^(.*)[\\\\\\/]/,E=\"function\"===typeof Symbol&&Symbol.for,Za=E?Symbol.for(\"react.element\"):60103,$a=E?Symbol.for(\"react.portal\"):60106,ab=E?Symbol.for(\"react.fragment\"):60107,bb=E?Symbol.for(\"react.strict_mode\"):60108,cb=E?Symbol.for(\"react.profiler\"):60114,db=E?Symbol.for(\"react.provider\"):60109,eb=E?Symbol.for(\"react.context\"):60110,fb=E?Symbol.for(\"react.concurrent_mode\"):60111,gb=E?Symbol.for(\"react.forward_ref\"):60112,hb=E?Symbol.for(\"react.suspense\"):60113,ib=E?Symbol.for(\"react.suspense_list\"):\n60120,jb=E?Symbol.for(\"react.memo\"):60115,kb=E?Symbol.for(\"react.lazy\"):60116,lb=E?Symbol.for(\"react.block\"):60121,mb=\"function\"===typeof Symbol&&Symbol.iterator;function nb(a){if(null===a||\"object\"!==typeof a)return null;a=mb&&a[mb]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}function ob(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction pb(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ab:return\"Fragment\";case $a:return\"Portal\";case cb:return\"Profiler\";case bb:return\"StrictMode\";case hb:return\"Suspense\";case ib:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case eb:return\"Context.Consumer\";case db:return\"Context.Provider\";case gb:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\");case jb:return pb(a.type);case lb:return pb(a.render);case kb:if(a=1===a._status?a._result:null)return pb(a)}return null}function qb(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=pb(a.type);c=null;d&&(c=pb(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Ya,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\n    in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\nfunction rb(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}function sb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction tb(a){var b=sb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function xb(a){a._valueTracker||(a._valueTracker=tb(a))}function yb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=sb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function zb(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Ab(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=rb(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Bb(a,b){b=b.checked;null!=b&&Xa(a,\"checked\",b,!1)}\nfunction Cb(a,b){Bb(a,b);var c=rb(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Db(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Db(a,b.type,rb(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Eb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Db(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Fb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Gb(a,b){a=n({children:void 0},b);if(b=Fb(b.children))a.children=b;return a}\nfunction Hb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+rb(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Ib(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(u(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Jb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(u(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(u(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:rb(c)}}\nfunction Kb(a,b){var c=rb(b.value),d=rb(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Lb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Mb={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Nb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Ob(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Nb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Pb,Qb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Mb.svg||\"innerHTML\"in a)a.innerHTML=b;else{Pb=Pb||document.createElement(\"div\");Pb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Pb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Rb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Sb(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Tb={animationend:Sb(\"Animation\",\"AnimationEnd\"),animationiteration:Sb(\"Animation\",\"AnimationIteration\"),animationstart:Sb(\"Animation\",\"AnimationStart\"),transitionend:Sb(\"Transition\",\"TransitionEnd\")},Ub={},Vb={};\nya&&(Vb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Tb.animationend.animation,delete Tb.animationiteration.animation,delete Tb.animationstart.animation),\"TransitionEvent\"in window||delete Tb.transitionend.transition);function Wb(a){if(Ub[a])return Ub[a];if(!Tb[a])return a;var b=Tb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Vb)return Ub[a]=b[c];return a}\nvar Xb=Wb(\"animationend\"),Yb=Wb(\"animationiteration\"),Zb=Wb(\"animationstart\"),$b=Wb(\"transitionend\"),ac=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),bc=new (\"function\"===typeof WeakMap?WeakMap:Map);function cc(a){var b=bc.get(a);void 0===b&&(b=new Map,bc.set(a,b));return b}\nfunction dc(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function ec(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function fc(a){if(dc(a)!==a)throw Error(u(188));}\nfunction gc(a){var b=a.alternate;if(!b){b=dc(a);if(null===b)throw Error(u(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return fc(e),a;if(f===d)return fc(e),b;f=f.sibling}throw Error(u(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(u(189));}}if(c.alternate!==d)throw Error(u(190));}if(3!==c.tag)throw Error(u(188));return c.stateNode.current===c?a:b}function hc(a){a=gc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction ic(a,b){if(null==b)throw Error(u(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function jc(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var kc=null;\nfunction lc(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)oa(a,b[d],c[d]);else b&&oa(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function mc(a){null!==a&&(kc=ic(kc,a));a=kc;kc=null;if(a){jc(a,lc);if(kc)throw Error(u(95));if(fa)throw a=ha,fa=!1,ha=null,a;}}\nfunction nc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function oc(a){if(!ya)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var pc=[];function qc(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>pc.length&&pc.push(a)}\nfunction rc(a,b,c,d){if(pc.length){var e=pc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}\nfunction sc(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=tc(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=nc(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,k=0;k<sa.length;k++){var l=sa[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=\nic(h,l))}mc(h)}}function uc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":vc(b,\"scroll\",!0);break;case \"focus\":case \"blur\":vc(b,\"focus\",!0);vc(b,\"blur\",!0);c.set(\"blur\",null);c.set(\"focus\",null);break;case \"cancel\":case \"close\":oc(a)&&vc(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===ac.indexOf(a)&&F(a,b)}c.set(a,null)}}\nvar wc,xc,yc,zc=!1,Ac=[],Bc=null,Cc=null,Dc=null,Ec=new Map,Fc=new Map,Gc=[],Hc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),Ic=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");\nfunction Jc(a,b){var c=cc(b);Hc.forEach(function(a){uc(a,b,c)});Ic.forEach(function(a){uc(a,b,c)})}function Kc(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,container:d}}\nfunction Lc(a,b){switch(a){case \"focus\":case \"blur\":Bc=null;break;case \"dragenter\":case \"dragleave\":Cc=null;break;case \"mouseover\":case \"mouseout\":Dc=null;break;case \"pointerover\":case \"pointerout\":Ec.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Fc.delete(b.pointerId)}}function Mc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Kc(b,c,d,e,f),null!==b&&(b=Nc(b),null!==b&&xc(b)),a;a.eventSystemFlags|=d;return a}\nfunction Oc(a,b,c,d,e){switch(b){case \"focus\":return Bc=Mc(Bc,a,b,c,d,e),!0;case \"dragenter\":return Cc=Mc(Cc,a,b,c,d,e),!0;case \"mouseover\":return Dc=Mc(Dc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Ec.set(f,Mc(Ec.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Fc.set(f,Mc(Fc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Pc(a){var b=tc(a.target);if(null!==b){var c=dc(b);if(null!==c)if(b=c.tag,13===b){if(b=ec(c),null!==b){a.blockedOn=b;r.unstable_runWithPriority(a.priority,function(){yc(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Qc(a){if(null!==a.blockedOn)return!1;var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Nc(b);null!==c&&xc(c);a.blockedOn=b;return!1}return!0}\nfunction Sc(a,b,c){Qc(a)&&c.delete(b)}function Tc(){for(zc=!1;0<Ac.length;){var a=Ac[0];if(null!==a.blockedOn){a=Nc(a.blockedOn);null!==a&&wc(a);break}var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:Ac.shift()}null!==Bc&&Qc(Bc)&&(Bc=null);null!==Cc&&Qc(Cc)&&(Cc=null);null!==Dc&&Qc(Dc)&&(Dc=null);Ec.forEach(Sc);Fc.forEach(Sc)}function Uc(a,b){a.blockedOn===b&&(a.blockedOn=null,zc||(zc=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Tc)))}\nfunction Vc(a){function b(b){return Uc(b,a)}if(0<Ac.length){Uc(Ac[0],a);for(var c=1;c<Ac.length;c++){var d=Ac[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Bc&&Uc(Bc,a);null!==Cc&&Uc(Cc,a);null!==Dc&&Uc(Dc,a);Ec.forEach(b);Fc.forEach(b);for(c=0;c<Gc.length;c++)d=Gc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Gc.length&&(c=Gc[0],null===c.blockedOn);)Pc(c),null===c.blockedOn&&Gc.shift()}\nvar Wc={},Yc=new Map,Zc=new Map,$c=[\"abort\",\"abort\",Xb,\"animationEnd\",Yb,\"animationIteration\",Zb,\"animationStart\",\"canplay\",\"canPlay\",\"canplaythrough\",\"canPlayThrough\",\"durationchange\",\"durationChange\",\"emptied\",\"emptied\",\"encrypted\",\"encrypted\",\"ended\",\"ended\",\"error\",\"error\",\"gotpointercapture\",\"gotPointerCapture\",\"load\",\"load\",\"loadeddata\",\"loadedData\",\"loadedmetadata\",\"loadedMetadata\",\"loadstart\",\"loadStart\",\"lostpointercapture\",\"lostPointerCapture\",\"playing\",\"playing\",\"progress\",\"progress\",\"seeking\",\n\"seeking\",\"stalled\",\"stalled\",\"suspend\",\"suspend\",\"timeupdate\",\"timeUpdate\",$b,\"transitionEnd\",\"waiting\",\"waiting\"];function ad(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f=\"on\"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+\"Capture\"},dependencies:[d],eventPriority:b};Zc.set(d,b);Yc.set(d,f);Wc[e]=f}}\nad(\"blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange\".split(\" \"),0);\nad(\"drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel\".split(\" \"),1);ad($c,2);for(var bd=\"change selectionchange textInput compositionstart compositionend compositionupdate\".split(\" \"),cd=0;cd<bd.length;cd++)Zc.set(bd[cd],0);\nvar dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function F(a,b){vc(b,a,!1)}function vc(a,b,c){var d=Zc.get(b);switch(void 0===d?2:d){case 0:d=gd.bind(null,b,1,a);break;case 1:d=hd.bind(null,b,1,a);break;default:d=id.bind(null,b,1,a)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function gd(a,b,c,d){Ja||Ha();var e=id,f=Ja;Ja=!0;try{Ga(e,a,b,c,d)}finally{(Ja=f)||La()}}function hd(a,b,c,d){ed(dd,id.bind(null,a,b,c,d))}\nfunction id(a,b,c,d){if(fd)if(0<Ac.length&&-1<Hc.indexOf(a))a=Kc(null,a,b,c,d),Ac.push(a);else{var e=Rc(a,b,c,d);if(null===e)Lc(a,d);else if(-1<Hc.indexOf(a))a=Kc(e,a,b,c,d),Ac.push(a);else if(!Oc(e,a,b,c,d)){Lc(a,d);a=rc(a,d,null,b);try{Ma(sc,a)}finally{qc(a)}}}}\nfunction Rc(a,b,c,d){c=nc(d);c=tc(c);if(null!==c){var e=dc(c);if(null===e)c=null;else{var f=e.tag;if(13===f){c=ec(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=rc(a,d,c,b);try{Ma(sc,a)}finally{qc(a)}return null}\nvar jd={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},kd=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(jd).forEach(function(a){kd.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);jd[b]=jd[a]})});function ld(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||jd.hasOwnProperty(a)&&jd[a]?(\"\"+b).trim():b+\"px\"}\nfunction md(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=ld(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var nd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction od(a,b){if(b){if(nd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(u(137,a,\"\"));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(u(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(u(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(u(62,\"\"));}}\nfunction pd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var qd=Mb.html;function rd(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=cc(a);b=wa[b];for(var d=0;d<b.length;d++)uc(b[d],a,c)}function sd(){}\nfunction td(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ud(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function vd(a,b){var c=ud(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=ud(c)}}\nfunction wd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?wd(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function xd(){for(var a=window,b=td();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=td(a.document)}return b}\nfunction yd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var zd=\"$\",Ad=\"/$\",Bd=\"$?\",Cd=\"$!\",Dd=null,Ed=null;function Fd(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction Gd(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var Hd=\"function\"===typeof setTimeout?setTimeout:void 0,Id=\"function\"===typeof clearTimeout?clearTimeout:void 0;function Jd(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction Kd(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===zd||c===Cd||c===Bd){if(0===b)return a;b--}else c===Ad&&b++}a=a.previousSibling}return null}var Ld=Math.random().toString(36).slice(2),Md=\"__reactInternalInstance$\"+Ld,Nd=\"__reactEventHandlers$\"+Ld,Od=\"__reactContainere$\"+Ld;\nfunction tc(a){var b=a[Md];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Od]||c[Md]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Kd(a);null!==a;){if(c=a[Md])return c;a=Kd(a)}return b}a=c;c=a.parentNode}return null}function Nc(a){a=a[Md]||a[Od];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pd(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(u(33));}function Qd(a){return a[Nd]||null}\nfunction Rd(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction Sd(a,b){var c=a.stateNode;if(!c)return null;var d=la(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw Error(u(231,\nb,typeof c));return c}function Td(a,b,c){if(b=Sd(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a)}function Ud(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Rd(b);for(b=c.length;0<b--;)Td(c[b],\"captured\",a);for(b=0;b<c.length;b++)Td(c[b],\"bubbled\",a)}}\nfunction Vd(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Sd(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a))}function Wd(a){a&&a.dispatchConfig.registrationName&&Vd(a._targetInst,null,a)}function Xd(a){jc(a,Ud)}var Yd=null,Zd=null,$d=null;\nfunction ae(){if($d)return $d;var a,b=Zd,c=b.length,d,e=\"value\"in Yd?Yd.value:Yd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return $d=e.slice(a,1<d?1-d:void 0)}function be(){return!0}function ce(){return!1}\nfunction G(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?be:ce;this.isPropagationStopped=ce;return this}\nn(G.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=be)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=be)},persist:function(){this.isPersistent=be},isPersistent:ce,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=ce;this._dispatchInstances=this._dispatchListeners=null}});G.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nG.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;de(c);return c};de(G);function ee(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction fe(a){if(!(a instanceof this))throw Error(u(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function de(a){a.eventPool=[];a.getPooled=ee;a.release=fe}var ge=G.extend({data:null}),he=G.extend({data:null}),ie=[9,13,27,32],je=ya&&\"CompositionEvent\"in window,ke=null;ya&&\"documentMode\"in document&&(ke=document.documentMode);\nvar le=ya&&\"TextEvent\"in window&&!ke,me=ya&&(!je||ke&&8<ke&&11>=ke),ne=String.fromCharCode(32),oe={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},pe=!1;\nfunction qe(a,b){switch(a){case \"keyup\":return-1!==ie.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function re(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var se=!1;function te(a,b){switch(a){case \"compositionend\":return re(b);case \"keypress\":if(32!==b.which)return null;pe=!0;return ne;case \"textInput\":return a=b.data,a===ne&&pe?null:a;default:return null}}\nfunction ue(a,b){if(se)return\"compositionend\"===a||!je&&qe(a,b)?(a=ae(),$d=Zd=Yd=null,se=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return me&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar ve={eventTypes:oe,extractEvents:function(a,b,c,d){var e;if(je)b:{switch(a){case \"compositionstart\":var f=oe.compositionStart;break b;case \"compositionend\":f=oe.compositionEnd;break b;case \"compositionupdate\":f=oe.compositionUpdate;break b}f=void 0}else se?qe(a,c)&&(f=oe.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=oe.compositionStart);f?(me&&\"ko\"!==c.locale&&(se||f!==oe.compositionStart?f===oe.compositionEnd&&se&&(e=ae()):(Yd=d,Zd=\"value\"in Yd?Yd.value:Yd.textContent,se=!0)),f=ge.getPooled(f,\nb,c,d),e?f.data=e:(e=re(c),null!==e&&(f.data=e)),Xd(f),e=f):e=null;(a=le?te(a,c):ue(a,c))?(b=he.getPooled(oe.beforeInput,b,c,d),b.data=a,Xd(b)):b=null;return null===e?b:null===b?e:[e,b]}},we={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function xe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!we[a.type]:\"textarea\"===b?!0:!1}\nvar ye={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function ze(a,b,c){a=G.getPooled(ye.change,a,b,c);a.type=\"change\";Da(c);Xd(a);return a}var Ae=null,Be=null;function Ce(a){mc(a)}function De(a){var b=Pd(a);if(yb(b))return a}function Ee(a,b){if(\"change\"===a)return b}var Fe=!1;ya&&(Fe=oc(\"input\")&&(!document.documentMode||9<document.documentMode));\nfunction Ge(){Ae&&(Ae.detachEvent(\"onpropertychange\",He),Be=Ae=null)}function He(a){if(\"value\"===a.propertyName&&De(Be))if(a=ze(Be,a,nc(a)),Ja)mc(a);else{Ja=!0;try{Fa(Ce,a)}finally{Ja=!1,La()}}}function Ie(a,b,c){\"focus\"===a?(Ge(),Ae=b,Be=c,Ae.attachEvent(\"onpropertychange\",He)):\"blur\"===a&&Ge()}function Je(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return De(Be)}function Ke(a,b){if(\"click\"===a)return De(b)}function Le(a,b){if(\"input\"===a||\"change\"===a)return De(b)}\nvar Me={eventTypes:ye,_isInputEventSupported:Fe,extractEvents:function(a,b,c,d){var e=b?Pd(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=Ee;else if(xe(e))if(Fe)g=Le;else{g=Je;var h=Ie}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=Ke);if(g&&(g=g(a,b)))return ze(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Db(e,\"number\",e.value)}},Ne=G.extend({view:null,detail:null}),\nOe={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pe(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Oe[a])?!!b[a]:!1}function Qe(){return Pe}\nvar Re=0,Se=0,Te=!1,Ue=!1,Ve=Ne.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Qe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=Re;Re=a.screenX;return Te?\"mousemove\"===a.type?a.screenX-b:0:(Te=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;\nvar b=Se;Se=a.screenY;return Ue?\"mousemove\"===a.type?a.screenY-b:0:(Ue=!0,0)}}),We=Ve.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),Xe={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",\ndependencies:[\"pointerout\",\"pointerover\"]}},Ye={eventTypes:Xe,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?tc(b):null,null!==b){var h=dc(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===\na){var k=Ve;var l=Xe.mouseLeave;var m=Xe.mouseEnter;var p=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)k=We,l=Xe.pointerLeave,m=Xe.pointerEnter,p=\"pointer\";a=null==g?f:Pd(g);f=null==b?f:Pd(b);l=k.getPooled(l,g,c,d);l.type=p+\"leave\";l.target=a;l.relatedTarget=f;c=k.getPooled(m,b,c,d);c.type=p+\"enter\";c.target=f;c.relatedTarget=a;d=g;p=b;if(d&&p)a:{k=d;m=p;g=0;for(a=k;a;a=Rd(a))g++;a=0;for(b=m;b;b=Rd(b))a++;for(;0<g-a;)k=Rd(k),g--;for(;0<a-g;)m=Rd(m),a--;for(;g--;){if(k===m||k===m.alternate)break a;\nk=Rd(k);m=Rd(m)}k=null}else k=null;m=k;for(k=[];d&&d!==m;){g=d.alternate;if(null!==g&&g===m)break;k.push(d);d=Rd(d)}for(d=[];p&&p!==m;){g=p.alternate;if(null!==g&&g===m)break;d.push(p);p=Rd(p)}for(p=0;p<k.length;p++)Vd(k[p],\"bubbled\",l);for(p=d.length;0<p--;)Vd(d[p],\"captured\",c);return 0===(e&64)?[l]:[l,c]}};function Ze(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var $e=\"function\"===typeof Object.is?Object.is:Ze,af=Object.prototype.hasOwnProperty;\nfunction bf(a,b){if($e(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!af.call(b,c[d])||!$e(a[c[d]],b[c[d]]))return!1;return!0}\nvar cf=ya&&\"documentMode\"in document&&11>=document.documentMode,df={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},ef=null,ff=null,gf=null,hf=!1;\nfunction jf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(hf||null==ef||ef!==td(c))return null;c=ef;\"selectionStart\"in c&&yd(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return gf&&bf(gf,c)?null:(gf=c,a=G.getPooled(df.select,ff,a,b),a.type=\"select\",a.target=ef,Xd(a),a)}\nvar kf={eventTypes:df,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=cc(e);f=wa.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pd(b):window;switch(a){case \"focus\":if(xe(e)||\"true\"===e.contentEditable)ef=e,ff=b,gf=null;break;case \"blur\":gf=ff=ef=null;break;case \"mousedown\":hf=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return hf=!1,jf(c,d);case \"selectionchange\":if(cf)break;\ncase \"keydown\":case \"keyup\":return jf(c,d)}return null}},lf=G.extend({animationName:null,elapsedTime:null,pseudoElement:null}),mf=G.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),nf=Ne.extend({relatedTarget:null});function of(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar pf={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},qf={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},rf=Ne.extend({key:function(a){if(a.key){var b=pf[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=of(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?qf[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Qe,charCode:function(a){return\"keypress\"===\na.type?of(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===a.type?of(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),sf=Ve.extend({dataTransfer:null}),tf=Ne.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Qe}),uf=G.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),vf=Ve.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in\na?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),wf={eventTypes:Wc,extractEvents:function(a,b,c,d){var e=Yc.get(a);if(!e)return null;switch(a){case \"keypress\":if(0===of(c))return null;case \"keydown\":case \"keyup\":a=rf;break;case \"blur\":case \"focus\":a=nf;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=\nVe;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=sf;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=tf;break;case Xb:case Yb:case Zb:a=lf;break;case $b:a=uf;break;case \"scroll\":a=Ne;break;case \"wheel\":a=vf;break;case \"copy\":case \"cut\":case \"paste\":a=mf;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=\nWe;break;default:a=G}b=a.getPooled(e,b,c,d);Xd(b);return b}};if(pa)throw Error(u(101));pa=Array.prototype.slice.call(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));ra();var xf=Nc;la=Qd;ma=xf;na=Pd;xa({SimpleEventPlugin:wf,EnterLeaveEventPlugin:Ye,ChangeEventPlugin:Me,SelectEventPlugin:kf,BeforeInputEventPlugin:ve});var yf=[],zf=-1;function H(a){0>zf||(a.current=yf[zf],yf[zf]=null,zf--)}\nfunction I(a,b){zf++;yf[zf]=a.current;a.current=b}var Af={},J={current:Af},K={current:!1},Bf=Af;function Cf(a,b){var c=a.type.contextTypes;if(!c)return Af;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function L(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction Df(){H(K);H(J)}function Ef(a,b,c){if(J.current!==Af)throw Error(u(168));I(J,b);I(K,c)}function Ff(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(u(108,pb(b)||\"Unknown\",e));return n({},c,{},d)}function Gf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Af;Bf=J.current;I(J,a);I(K,K.current);return!0}\nfunction Hf(a,b,c){var d=a.stateNode;if(!d)throw Error(u(169));c?(a=Ff(a,b,Bf),d.__reactInternalMemoizedMergedChildContext=a,H(K),H(J),I(J,a)):H(K);I(K,c)}\nvar If=r.unstable_runWithPriority,Jf=r.unstable_scheduleCallback,Kf=r.unstable_cancelCallback,Lf=r.unstable_requestPaint,Mf=r.unstable_now,Nf=r.unstable_getCurrentPriorityLevel,Of=r.unstable_ImmediatePriority,Pf=r.unstable_UserBlockingPriority,Qf=r.unstable_NormalPriority,Rf=r.unstable_LowPriority,Sf=r.unstable_IdlePriority,Tf={},Uf=r.unstable_shouldYield,Vf=void 0!==Lf?Lf:function(){},Wf=null,Xf=null,Yf=!1,Zf=Mf(),$f=1E4>Zf?Mf:function(){return Mf()-Zf};\nfunction ag(){switch(Nf()){case Of:return 99;case Pf:return 98;case Qf:return 97;case Rf:return 96;case Sf:return 95;default:throw Error(u(332));}}function bg(a){switch(a){case 99:return Of;case 98:return Pf;case 97:return Qf;case 96:return Rf;case 95:return Sf;default:throw Error(u(332));}}function cg(a,b){a=bg(a);return If(a,b)}function dg(a,b,c){a=bg(a);return Jf(a,b,c)}function eg(a){null===Wf?(Wf=[a],Xf=Jf(Of,fg)):Wf.push(a);return Tf}function gg(){if(null!==Xf){var a=Xf;Xf=null;Kf(a)}fg()}\nfunction fg(){if(!Yf&&null!==Wf){Yf=!0;var a=0;try{var b=Wf;cg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Wf=null}catch(c){throw null!==Wf&&(Wf=Wf.slice(a+1)),Jf(Of,gg),c;}finally{Yf=!1}}}function hg(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function ig(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var jg={current:null},kg=null,lg=null,mg=null;function ng(){mg=lg=kg=null}\nfunction og(a){var b=jg.current;H(jg);a.type._context._currentValue=b}function pg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function qg(a,b){kg=a;mg=lg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(rg=!0),a.firstContext=null)}\nfunction sg(a,b){if(mg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)mg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===lg){if(null===kg)throw Error(u(308));lg=b;kg.dependencies={expirationTime:0,firstContext:b,responders:null}}else lg=lg.next=b}return a._currentValue}var tg=!1;function ug(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}\nfunction vg(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function wg(a,b){a={expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null};return a.next=a}function xg(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}\nfunction yg(a,b){var c=a.alternate;null!==c&&vg(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}\nfunction zg(a,b,c,d){var e=a.updateQueue;tg=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&(h.baseQueue=g))}if(null!==f){h=f.next;var k=e.baseState,l=0,m=null,p=null,x=null;if(null!==h){var z=h;do{g=z.expirationTime;if(g<d){var ca={expirationTime:z.expirationTime,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null};null===x?(p=x=\nca,m=k):x=x.next=ca;g>l&&(l=g)}else{null!==x&&(x=x.next={expirationTime:1073741823,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null});Ag(g,z.suspenseConfig);a:{var D=a,t=z;g=b;ca=c;switch(t.tag){case 1:D=t.payload;if(\"function\"===typeof D){k=D.call(ca,k,g);break a}k=D;break a;case 3:D.effectTag=D.effectTag&-4097|64;case 0:D=t.payload;g=\"function\"===typeof D?D.call(ca,k,g):D;if(null===g||void 0===g)break a;k=n({},k,g);break a;case 2:tg=!0}}null!==z.callback&&\n(a.effectTag|=32,g=e.effects,null===g?e.effects=[z]:g.push(z))}z=z.next;if(null===z||z===h)if(g=e.shared.pending,null===g)break;else z=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===x?m=k:x.next=p;e.baseState=m;e.baseQueue=x;Bg(l);a.expirationTime=l;a.memoizedState=k}}\nfunction Cg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if(\"function\"!==typeof d)throw Error(u(191,d));d.call(e)}}}var Dg=Wa.ReactCurrentBatchConfig,Eg=(new aa.Component).refs;function Fg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}\nvar Jg={isMounted:function(a){return(a=a._reactInternalFiber)?dc(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Gg(),d=Dg.suspense;\nc=Hg(c,a,d);d=wg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);xg(a,d);Ig(a,c)}};function Kg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!bf(c,d)||!bf(e,f):!0}\nfunction Lg(a,b,c){var d=!1,e=Af;var f=b.contextType;\"object\"===typeof f&&null!==f?f=sg(f):(e=L(b)?Bf:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Cf(a,e):Af);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Jg;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Mg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Jg.enqueueReplaceState(b,b.state,null)}\nfunction Ng(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Eg;ug(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=sg(f):(f=L(b)?Bf:J.current,e.context=Cf(a,f));zg(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Fg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||\n(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Jg.enqueueReplaceState(e,e.state,null),zg(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Og=Array.isArray;\nfunction Pg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(u(309));var d=c.stateNode}if(!d)throw Error(u(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Eg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(u(284));if(!c._owner)throw Error(u(290,a));}return a}\nfunction Qg(a,b){if(\"textarea\"!==a.type)throw Error(u(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\"));}\nfunction Rg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Sg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Tg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Pg(a,b,c),d.return=a,d;d=Ug(c.type,c.key,c.props,null,a.mode,d);d.ref=Pg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=Vg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Wg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function p(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Tg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Za:return c=Ug(b.type,b.key,b.props,null,a.mode,c),c.ref=Pg(a,null,b),c.return=a,c;case $a:return b=Vg(b,a.mode,c),b.return=a,b}if(Og(b)||\nnb(b))return b=Wg(b,a.mode,c,null),b.return=a,b;Qg(a,b)}return null}function x(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Za:return c.key===e?c.type===ab?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case $a:return c.key===e?l(a,b,c,d):null}if(Og(c)||nb(c))return null!==e?null:m(a,b,c,d,null);Qg(a,c)}return null}function z(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Za:return a=a.get(null===d.key?c:d.key)||null,d.type===ab?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case $a:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Og(d)||nb(d))return a=a.get(c)||null,m(b,a,d,e,null);Qg(b,d)}return null}function ca(e,g,h,k){for(var l=null,t=null,m=g,y=g=0,A=null;null!==m&&y<h.length;y++){m.index>y?(A=m,m=null):A=m.sibling;var q=x(e,m,h[y],k);if(null===q){null===m&&(m=A);break}a&&\nm&&null===q.alternate&&b(e,m);g=f(q,g,y);null===t?l=q:t.sibling=q;t=q;m=A}if(y===h.length)return c(e,m),l;if(null===m){for(;y<h.length;y++)m=p(e,h[y],k),null!==m&&(g=f(m,g,y),null===t?l=m:t.sibling=m,t=m);return l}for(m=d(e,m);y<h.length;y++)A=z(m,e,y,h[y],k),null!==A&&(a&&null!==A.alternate&&m.delete(null===A.key?y:A.key),g=f(A,g,y),null===t?l=A:t.sibling=A,t=A);a&&m.forEach(function(a){return b(e,a)});return l}function D(e,g,h,l){var k=nb(h);if(\"function\"!==typeof k)throw Error(u(150));h=k.call(h);\nif(null==h)throw Error(u(151));for(var m=k=null,t=g,y=g=0,A=null,q=h.next();null!==t&&!q.done;y++,q=h.next()){t.index>y?(A=t,t=null):A=t.sibling;var D=x(e,t,q.value,l);if(null===D){null===t&&(t=A);break}a&&t&&null===D.alternate&&b(e,t);g=f(D,g,y);null===m?k=D:m.sibling=D;m=D;t=A}if(q.done)return c(e,t),k;if(null===t){for(;!q.done;y++,q=h.next())q=p(e,q.value,l),null!==q&&(g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);return k}for(t=d(e,t);!q.done;y++,q=h.next())q=z(t,e,y,q.value,l),null!==q&&(a&&null!==\nq.alternate&&t.delete(null===q.key?y:q.key),g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);a&&t.forEach(function(a){return b(e,a)});return k}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===ab&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Za:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ab){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,\nk.sibling);d=e(k,f.props);d.ref=Pg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ab?(d=Wg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ug(f.type,f.key,f.props,null,a.mode,h),h.ref=Pg(a,d,f),h.return=a,a=h)}return g(a);case $a:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=\nd.sibling}d=Vg(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Tg(f,a.mode,h),d.return=a,a=d),g(a);if(Og(f))return ca(a,d,f,h);if(nb(f))return D(a,d,f,h);l&&Qg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(u(152,a.displayName||a.name||\"Component\"));}return c(a,d)}}var Xg=Rg(!0),Yg=Rg(!1),Zg={},$g={current:Zg},ah={current:Zg},bh={current:Zg};\nfunction ch(a){if(a===Zg)throw Error(u(174));return a}function dh(a,b){I(bh,b);I(ah,a);I($g,Zg);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Ob(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Ob(b,a)}H($g);I($g,b)}function eh(){H($g);H(ah);H(bh)}function fh(a){ch(bh.current);var b=ch($g.current);var c=Ob(b,a.type);b!==c&&(I(ah,a),I($g,c))}function gh(a){ah.current===a&&(H($g),H(ah))}var M={current:0};\nfunction hh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===Bd||c.data===Cd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ih(a,b){return{responder:a,props:b}}\nvar jh=Wa.ReactCurrentDispatcher,kh=Wa.ReactCurrentBatchConfig,lh=0,N=null,O=null,P=null,mh=!1;function Q(){throw Error(u(321));}function nh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!$e(a[c],b[c]))return!1;return!0}\nfunction oh(a,b,c,d,e,f){lh=f;N=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;jh.current=null===a||null===a.memoizedState?ph:qh;a=c(d,e);if(b.expirationTime===lh){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(u(301));f+=1;P=O=null;b.updateQueue=null;jh.current=rh;a=c(d,e)}while(b.expirationTime===lh)}jh.current=sh;b=null!==O&&null!==O.next;lh=0;P=O=N=null;mh=!1;if(b)throw Error(u(300));return a}\nfunction th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===P?N.memoizedState=P=a:P=P.next=a;return P}function uh(){if(null===O){var a=N.alternate;a=null!==a?a.memoizedState:null}else a=O.next;var b=null===P?N.memoizedState:P.next;if(null!==b)P=b,O=a;else{if(null===a)throw Error(u(310));O=a;a={memoizedState:O.memoizedState,baseState:O.baseState,baseQueue:O.baseQueue,queue:O.queue,next:null};null===P?N.memoizedState=P=a:P=P.next=a}return P}\nfunction vh(a,b){return\"function\"===typeof b?b(a):b}\nfunction wh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=O,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.expirationTime;if(l<lh){var m={expirationTime:k.expirationTime,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null};null===h?(g=h=m,f=d):h=h.next=m;l>N.expirationTime&&\n(N.expirationTime=l,Bg(l))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),Ag(l,k.suspenseConfig),d=k.eagerReducer===a?k.eagerState:a(d,k.action);k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;$e(d,b.memoizedState)||(rg=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction xh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);$e(f,b.memoizedState)||(rg=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction yh(a){var b=th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:vh,lastRenderedState:a};a=a.dispatch=zh.bind(null,N,a);return[b.memoizedState,a]}function Ah(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=N.updateQueue;null===b?(b={lastEffect:null},N.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}\nfunction Bh(){return uh().memoizedState}function Ch(a,b,c,d){var e=th();N.effectTag|=a;e.memoizedState=Ah(1|b,c,void 0,void 0===d?null:d)}function Dh(a,b,c,d){var e=uh();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&nh(d,g.deps)){Ah(b,c,f,d);return}}N.effectTag|=a;e.memoizedState=Ah(1|b,c,f,d)}function Eh(a,b){return Ch(516,4,a,b)}function Fh(a,b){return Dh(516,4,a,b)}function Gh(a,b){return Dh(4,2,a,b)}\nfunction Hh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Ih(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Dh(4,2,Hh.bind(null,b,a),c)}function Jh(){}function Kh(a,b){th().memoizedState=[a,void 0===b?null:b];return a}function Lh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Mh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Nh(a,b,c){var d=ag();cg(98>d?98:d,function(){a(!0)});cg(97<d?97:d,function(){var d=kh.suspense;kh.suspense=void 0===b?null:b;try{a(!1),c()}finally{kh.suspense=d}})}\nfunction zh(a,b,c){var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===N||null!==f&&f===N)mh=!0,e.expirationTime=lh,N.expirationTime=lh;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.eagerReducer=f;e.eagerState=h;if($e(h,g))return}catch(k){}finally{}Ig(a,\nd)}}\nvar sh={readContext:sg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useResponder:Q,useDeferredValue:Q,useTransition:Q},ph={readContext:sg,useCallback:Kh,useContext:sg,useEffect:Eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Ch(4,2,Hh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Ch(4,2,a,b)},useMemo:function(a,b){var c=th();b=void 0===b?null:b;a=a();c.memoizedState=[a,\nb];return a},useReducer:function(a,b,c){var d=th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=zh.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=th();a={current:a};return b.memoizedState=a},useState:yh,useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=yh(a),d=c[0],e=c[1];Eh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=\nc}},[a,b]);return d},useTransition:function(a){var b=yh(!1),c=b[0];b=b[1];return[Kh(Nh.bind(null,b,a),[b,a]),c]}},qh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:wh,useRef:Bh,useState:function(){return wh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=wh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=\nwh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,b,a),[b,a]),c]}},rh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:xh,useRef:Bh,useState:function(){return xh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=xh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=xh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,\nb,a),[b,a]),c]}},Oh=null,Ph=null,Qh=!1;function Rh(a,b){var c=Sh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\nfunction Th(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Uh(a){if(Qh){var b=Ph;if(b){var c=b;if(!Th(a,b)){b=Jd(c.nextSibling);if(!b||!Th(a,b)){a.effectTag=a.effectTag&-1025|2;Qh=!1;Oh=a;return}Rh(Oh,c)}Oh=a;Ph=Jd(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Qh=!1,Oh=a}}function Vh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;Oh=a}\nfunction Wh(a){if(a!==Oh)return!1;if(!Qh)return Vh(a),Qh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!Gd(b,a.memoizedProps))for(b=Ph;b;)Rh(a,b),b=Jd(b.nextSibling);Vh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(u(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===Ad){if(0===b){Ph=Jd(a.nextSibling);break a}b--}else c!==zd&&c!==Cd&&c!==Bd||b++}a=a.nextSibling}Ph=null}}else Ph=Oh?Jd(a.stateNode.nextSibling):null;return!0}\nfunction Xh(){Ph=Oh=null;Qh=!1}var Yh=Wa.ReactCurrentOwner,rg=!1;function R(a,b,c,d){b.child=null===a?Yg(b,null,c,d):Xg(b,a.child,c,d)}function Zh(a,b,c,d,e){c=c.render;var f=b.ref;qg(b,e);d=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction ai(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!bi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ci(a,b,g,d,e,f);a=Ug(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:bf,c(e,d)&&a.ref===b.ref))return $h(a,b,f);b.effectTag|=1;a=Sg(g,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ci(a,b,c,d,e,f){return null!==a&&bf(a.memoizedProps,d)&&a.ref===b.ref&&(rg=!1,e<f)?(b.expirationTime=a.expirationTime,$h(a,b,f)):di(a,b,c,d,f)}function ei(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function di(a,b,c,d,e){var f=L(c)?Bf:J.current;f=Cf(b,f);qg(b,e);c=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction fi(a,b,c,d,e){if(L(c)){var f=!0;Gf(b)}else f=!1;qg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Lg(b,c,d),Ng(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l));var m=c.getDerivedStateFromProps,p=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;p||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l);tg=!1;var x=b.memoizedState;g.state=x;zg(b,d,g,e);k=b.memoizedState;h!==d||x!==k||K.current||tg?(\"function\"===typeof m&&(Fg(b,c,m,d),k=b.memoizedState),(h=tg||Kg(b,c,h,d,x,k,l))?(p||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===\ntypeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,vg(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:ig(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l)),m=c.getDerivedStateFromProps,(p=\"function\"===typeof m||\"function\"===\ntypeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l),tg=!1,k=b.memoizedState,g.state=k,zg(b,d,g,e),x=b.memoizedState,h!==d||k!==x||K.current||tg?(\"function\"===typeof m&&(Fg(b,c,m,d),x=b.memoizedState),(m=tg||Kg(b,c,h,d,k,x,l))?(p||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,\nx,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=l,d=m):\n(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return gi(a,b,c,d,f,e)}\nfunction gi(a,b,c,d,e,f){ei(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hf(b,c,!1),$h(a,b,f);d=b.stateNode;Yh.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=Xg(b,a.child,null,f),b.child=Xg(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Hf(b,c,!0);return b.child}function hi(a){var b=a.stateNode;b.pendingContext?Ef(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Ef(a,b.context,!1);dh(a,b.containerInfo)}\nvar ii={dehydrated:null,retryTime:0};\nfunction ji(a,b,c){var d=b.mode,e=b.pendingProps,f=M.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(M,f&1);if(null===a){void 0!==e.fallback&&Uh(b);if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=\nb;e.sibling=c;b.memoizedState=ii;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Yg(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Sg(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sg(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=ii;b.child=c;return d}c=Xg(b,a.child,e.children,c);b.memoizedState=null;return b.child=\nc}a=a.child;if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=ii;b.child=e;return c}b.memoizedState=null;return b.child=Xg(b,a,e.children,c)}\nfunction ki(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);pg(a.return,b)}function li(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}\nfunction mi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&ki(a,c);else if(19===a.tag)ki(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(M,d);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===hh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);li(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===hh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}li(b,!0,c,null,f,b.lastEffect);break;case \"together\":li(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction $h(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Bg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(u(153));if(null!==b.child){a=b.child;c=Sg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}var ni,oi,pi,qi;\nni=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};oi=function(){};\npi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;ch($g.current);a=null;switch(c){case \"input\":f=zb(g,f);d=zb(g,d);a=[];break;case \"option\":f=Gb(g,f);d=Gb(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Ib(g,f);d=Ib(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=sd)}od(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(va.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(va.hasOwnProperty(h)?(null!=l&&rd(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};\nqi=function(a,b,c,d){c!==d&&(b.effectTag|=4)};function ri(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction si(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return L(b.type)&&Df(),null;case 3:return eh(),H(K),H(J),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Wh(b)||(b.effectTag|=4),oi(b),null;case 5:gh(b);c=ch(bh.current);var e=b.type;if(null!==a&&null!=b.stateNode)pi(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(u(166));\nreturn null}a=ch($g.current);if(Wh(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Md]=b;d[Nd]=f;switch(e){case \"iframe\":case \"object\":case \"embed\":F(\"load\",d);break;case \"video\":case \"audio\":for(a=0;a<ac.length;a++)F(ac[a],d);break;case \"source\":F(\"error\",d);break;case \"img\":case \"image\":case \"link\":F(\"error\",d);F(\"load\",d);break;case \"form\":F(\"reset\",d);F(\"submit\",d);break;case \"details\":F(\"toggle\",d);break;case \"input\":Ab(d,f);F(\"invalid\",d);rd(c,\"onChange\");break;case \"select\":d._wrapperState=\n{wasMultiple:!!f.multiple};F(\"invalid\",d);rd(c,\"onChange\");break;case \"textarea\":Jb(d,f),F(\"invalid\",d),rd(c,\"onChange\")}od(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(a=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(a=[\"children\",\"\"+h]):va.hasOwnProperty(g)&&null!=h&&rd(c,g)}switch(e){case \"input\":xb(d);Eb(d,f,!0);break;case \"textarea\":xb(d);Lb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&\n(d.onclick=sd)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;a===qd&&(a=Nb(e));a===qd?\"script\"===e?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\"string\"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),\"select\"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Md]=b;a[Nd]=d;ni(a,b,!1,!1);b.stateNode=a;g=pd(e,d);switch(e){case \"iframe\":case \"object\":case \"embed\":F(\"load\",\na);h=d;break;case \"video\":case \"audio\":for(h=0;h<ac.length;h++)F(ac[h],a);h=d;break;case \"source\":F(\"error\",a);h=d;break;case \"img\":case \"image\":case \"link\":F(\"error\",a);F(\"load\",a);h=d;break;case \"form\":F(\"reset\",a);F(\"submit\",a);h=d;break;case \"details\":F(\"toggle\",a);h=d;break;case \"input\":Ab(a,d);h=zb(a,d);F(\"invalid\",a);rd(c,\"onChange\");break;case \"option\":h=Gb(a,d);break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};h=n({},d,{value:void 0});F(\"invalid\",a);rd(c,\"onChange\");break;case \"textarea\":Jb(a,\nd);h=Ib(a,d);F(\"invalid\",a);rd(c,\"onChange\");break;default:h=d}od(e,h);var k=h;for(f in k)if(k.hasOwnProperty(f)){var l=k[f];\"style\"===f?md(a,l):\"dangerouslySetInnerHTML\"===f?(l=l?l.__html:void 0,null!=l&&Qb(a,l)):\"children\"===f?\"string\"===typeof l?(\"textarea\"!==e||\"\"!==l)&&Rb(a,l):\"number\"===typeof l&&Rb(a,\"\"+l):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(va.hasOwnProperty(f)?null!=l&&rd(c,f):null!=l&&Xa(a,f,l,g))}switch(e){case \"input\":xb(a);Eb(a,d,!1);\nbreak;case \"textarea\":xb(a);Lb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+rb(d.value));break;case \"select\":a.multiple=!!d.multiple;c=d.value;null!=c?Hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&Hb(a,!!d.multiple,d.defaultValue,!0);break;default:\"function\"===typeof h.onClick&&(a.onclick=sd)}Fd(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)qi(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(u(166));\nc=ch(bh.current);ch($g.current);Wh(b)?(c=b.stateNode,d=b.memoizedProps,c[Md]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),c[Md]=b,b.stateNode=c)}return null;case 13:H(M);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Wh(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=\ne,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(M.current&1))S===ti&&(S=ui);else{if(S===ti||S===ui)S=vi;0!==wi&&null!==T&&(xi(T,U),yi(T,wi))}if(c||d)b.effectTag|=4;return null;case 4:return eh(),oi(b),null;case 10:return og(b),null;case 17:return L(b.type)&&Df(),null;case 19:H(M);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)ri(d,!1);else{if(S!==ti||null!==a&&0!==(a.effectTag&\n64))for(f=b.child;null!==f;){a=hh(f);if(null!==a){b.effectTag|=64;ri(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,\ne.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;I(M,M.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=hh(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),ri(d,!0),null===d.tail&&\"hidden\"===d.tailMode&&!f.alternate)return b=\nb.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*$f()-d.renderingStartTime>d.tailExpiration&&1<c&&(b.effectTag|=64,e=!0,ri(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=$f()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=$f(),c.sibling=null,b=M.current,I(M,e?b&1|2:b&1),c):null}throw Error(u(156,\nb.tag));}function zi(a){switch(a.tag){case 1:L(a.type)&&Df();var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:eh();H(K);H(J);b=a.effectTag;if(0!==(b&64))throw Error(u(285));a.effectTag=b&-4097|64;return a;case 5:return gh(a),null;case 13:return H(M),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return H(M),null;case 4:return eh(),null;case 10:return og(a),null;default:return null}}function Ai(a,b){return{value:a,source:b,stack:qb(b)}}\nvar Bi=\"function\"===typeof WeakSet?WeakSet:Set;function Ci(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=qb(c));null!==c&&pb(c.type);b=b.value;null!==a&&1===a.tag&&pb(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function Di(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Ei(a,c)}}function Fi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Ei(a,c)}else b.current=null}\nfunction Gi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:ig(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(u(163));}\nfunction Hi(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Ii(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}\nfunction Ji(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:Ii(3,c);return;case 1:a=c.stateNode;if(c.effectTag&4)if(null===b)a.componentDidMount();else{var d=c.elementType===c.type?b.memoizedProps:ig(c.type,b.memoizedProps);a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}b=c.updateQueue;null!==b&&Cg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Cg(c,b,a)}return;\ncase 5:a=c.stateNode;null===b&&c.effectTag&4&&Fd(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Vc(c))));return;case 19:case 17:case 20:case 21:return}throw Error(u(163));}\nfunction Ki(a,b,c){\"function\"===typeof Li&&Li(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;cg(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Ei(g,h)}}a=a.next}while(a!==d)})}break;case 1:Fi(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&Di(b,c);break;case 5:Fi(b);break;case 4:Mi(a,b,c)}}\nfunction Ni(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Ni(b)}function Oi(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Pi(a){a:{for(var b=a.return;null!==b;){if(Oi(b)){var c=b;break a}b=b.return}throw Error(u(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(u(161));}c.effectTag&16&&(Rb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Oi(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Qi(a,c,b):Ri(a,c,b)}\nfunction Qi(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=sd));else if(4!==d&&(a=a.child,null!==a))for(Qi(a,b,c),a=a.sibling;null!==a;)Qi(a,b,c),a=a.sibling}\nfunction Ri(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Ri(a,b,c),a=a.sibling;null!==a;)Ri(a,b,c),a=a.sibling}\nfunction Mi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(u(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Ki(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break a;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ki(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction Si(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Hi(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Nd]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Bb(c,d);pd(a,e);b=pd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?md(c,h):\"dangerouslySetInnerHTML\"===g?Qb(c,h):\"children\"===g?Rb(c,h):Xa(c,g,h,b)}switch(a){case \"input\":Cb(c,d);break;\ncase \"textarea\":Kb(c,d);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Hb(c,!!d.multiple,d.defaultValue,!0):Hb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}return;case 6:if(null===b.stateNode)throw Error(u(162));b.stateNode.nodeValue=b.memoizedProps;return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,Vc(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?\nd=!1:(d=!0,c=b.child,Ti=$f());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=ld(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=\nf;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Ui(b);return;case 19:Ui(b);return;case 17:return}throw Error(u(163));}function Ui(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Bi);b.forEach(function(b){var d=Vi.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nvar Wi=\"function\"===typeof WeakMap?WeakMap:Map;function Xi(a,b,c){c=wg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Yi||(Yi=!0,Zi=d);Ci(a,b)};return c}\nfunction $i(a,b,c){c=wg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Ci(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===aj?aj=new Set([this]):aj.add(this),Ci(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nvar bj=Math.ceil,cj=Wa.ReactCurrentDispatcher,dj=Wa.ReactCurrentOwner,V=0,ej=8,fj=16,gj=32,ti=0,hj=1,ij=2,ui=3,vi=4,jj=5,W=V,T=null,X=null,U=0,S=ti,kj=null,lj=1073741823,mj=1073741823,nj=null,wi=0,oj=!1,Ti=0,pj=500,Y=null,Yi=!1,Zi=null,aj=null,qj=!1,rj=null,sj=90,tj=null,uj=0,vj=null,wj=0;function Gg(){return(W&(fj|gj))!==V?1073741821-($f()/10|0):0!==wj?wj:wj=1073741821-($f()/10|0)}\nfunction Hg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=ag();if(0===(b&4))return 99===d?1073741823:1073741822;if((W&fj)!==V)return U;if(null!==c)a=hg(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=hg(a,150,100);break;case 97:case 96:a=hg(a,5E3,250);break;case 95:a=2;break;default:throw Error(u(326));}null!==T&&a===U&&--a;return a}\nfunction Ig(a,b){if(50<uj)throw uj=0,vj=null,Error(u(185));a=xj(a,b);if(null!==a){var c=ag();1073741823===b?(W&ej)!==V&&(W&(fj|gj))===V?yj(a):(Z(a),W===V&&gg()):Z(a);(W&4)===V||98!==c&&99!==c||(null===tj?tj=new Map([[a,b]]):(c=tj.get(a),(void 0===c||c>b)&&tj.set(a,b)))}}\nfunction xj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(T===e&&(Bg(b),S===vi&&xi(e,U)),yi(e,b));return e}\nfunction zj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Aj(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=eg(yj.bind(null,a));else{var b=zj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Gg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Tf&&Kf(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?eg(yj.bind(null,a)):dg(d,Bj.bind(null,a),{timeout:10*(1073741821-b)-$f()});a.callbackNode=b}}}\nfunction Bj(a,b){wj=0;if(b)return b=Gg(),Cj(a,b),Z(a),null;var c=zj(a);if(0!==c){b=a.callbackNode;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&c===U||Ej(a,c);if(null!==X){var d=W;W|=fj;var e=Fj();do try{Gj();break}catch(h){Hj(a,h)}while(1);ng();W=d;cj.current=e;if(S===hj)throw b=kj,Ej(a,c),xi(a,c),Z(a),b;if(null===X)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=S,T=null,d){case ti:case hj:throw Error(u(345));case ij:Cj(a,2<c?2:c);break;case ui:xi(a,c);d=a.lastSuspendedTime;\nc===d&&(a.nextKnownPendingLevel=Ij(e));if(1073741823===lj&&(e=Ti+pj-$f(),10<e)){if(oj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Ej(a,c);break}}f=zj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=Hd(Jj.bind(null,a),e);break}Jj(a);break;case vi:xi(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ij(e));if(oj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Ej(a,c);break}e=zj(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=\nd;break}1073741823!==mj?d=10*(1073741821-mj)-$f():1073741823===lj?d=0:(d=10*(1073741821-lj)-5E3,e=$f(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*bj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=Hd(Jj.bind(null,a),d);break}Jj(a);break;case jj:if(1073741823!==lj&&null!==nj){f=lj;var g=nj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=$f()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){xi(a,c);a.timeoutHandle=\nHd(Jj.bind(null,a),d);break}}Jj(a);break;default:throw Error(u(329));}Z(a);if(a.callbackNode===b)return Bj.bind(null,a)}}return null}\nfunction yj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&b===U||Ej(a,b);if(null!==X){var c=W;W|=fj;var d=Fj();do try{Kj();break}catch(e){Hj(a,e)}while(1);ng();W=c;cj.current=d;if(S===hj)throw c=kj,Ej(a,b),xi(a,b),Z(a),c;if(null!==X)throw Error(u(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;T=null;Jj(a);Z(a)}return null}function Lj(){if(null!==tj){var a=tj;tj=null;a.forEach(function(a,c){Cj(c,a);Z(c)});gg()}}\nfunction Mj(a,b){var c=W;W|=1;try{return a(b)}finally{W=c,W===V&&gg()}}function Nj(a,b){var c=W;W&=-2;W|=ej;try{return a(b)}finally{W=c,W===V&&gg()}}\nfunction Ej(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Id(c));if(null!==X)for(c=X.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&Df();break;case 3:eh();H(K);H(J);break;case 5:gh(d);break;case 4:eh();break;case 13:H(M);break;case 19:H(M);break;case 10:og(d)}c=c.return}T=a;X=Sg(a.current,null);U=b;S=ti;kj=null;mj=lj=1073741823;nj=null;wi=0;oj=!1}\nfunction Hj(a,b){do{try{ng();jh.current=sh;if(mh)for(var c=N.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}lh=0;P=O=N=null;mh=!1;if(null===X||null===X.return)return S=hj,kj=b,X=null;a:{var e=a,f=X.return,g=X,h=b;b=U;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&\"object\"===typeof h&&\"function\"===typeof h.then){var k=h;if(0===(g.mode&2)){var l=g.alternate;l?(g.updateQueue=l.updateQueue,g.memoizedState=l.memoizedState,g.expirationTime=l.expirationTime):(g.updateQueue=\nnull,g.memoizedState=null)}var m=0!==(M.current&1),p=f;do{var x;if(x=13===p.tag){var z=p.memoizedState;if(null!==z)x=null!==z.dehydrated?!0:!1;else{var ca=p.memoizedProps;x=void 0===ca.fallback?!1:!0!==ca.unstable_avoidThisFallback?!0:m?!1:!0}}if(x){var D=p.updateQueue;if(null===D){var t=new Set;t.add(k);p.updateQueue=t}else D.add(k);if(0===(p.mode&2)){p.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var y=wg(1073741823,null);y.tag=2;xg(g,y)}g.expirationTime=1073741823;\nbreak a}h=void 0;g=b;var A=e.pingCache;null===A?(A=e.pingCache=new Wi,h=new Set,A.set(k,h)):(h=A.get(k),void 0===h&&(h=new Set,A.set(k,h)));if(!h.has(g)){h.add(g);var q=Oj.bind(null,e,k,g);k.then(q,q)}p.effectTag|=4096;p.expirationTime=b;break a}p=p.return}while(null!==p);h=Error((pb(g.type)||\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+qb(g))}S!==\njj&&(S=ij);h=Ai(h,g);p=f;do{switch(p.tag){case 3:k=h;p.effectTag|=4096;p.expirationTime=b;var B=Xi(p,k,b);yg(p,B);break a;case 1:k=h;var w=p.type,ub=p.stateNode;if(0===(p.effectTag&64)&&(\"function\"===typeof w.getDerivedStateFromError||null!==ub&&\"function\"===typeof ub.componentDidCatch&&(null===aj||!aj.has(ub)))){p.effectTag|=4096;p.expirationTime=b;var vb=$i(p,k,b);yg(p,vb);break a}}p=p.return}while(null!==p)}X=Pj(X)}catch(Xc){b=Xc;continue}break}while(1)}\nfunction Fj(){var a=cj.current;cj.current=sh;return null===a?sh:a}function Ag(a,b){a<lj&&2<a&&(lj=a);null!==b&&a<mj&&2<a&&(mj=a,nj=b)}function Bg(a){a>wi&&(wi=a)}function Kj(){for(;null!==X;)X=Qj(X)}function Gj(){for(;null!==X&&!Uf();)X=Qj(X)}function Qj(a){var b=Rj(a.alternate,a,U);a.memoizedProps=a.pendingProps;null===b&&(b=Pj(a));dj.current=null;return b}\nfunction Pj(a){X=a;do{var b=X.alternate;a=X.return;if(0===(X.effectTag&2048)){b=si(b,X,U);if(1===U||1!==X.childExpirationTime){for(var c=0,d=X.child;null!==d;){var e=d.expirationTime,f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}X.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=X.firstEffect),null!==X.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=X.firstEffect),a.lastEffect=X.lastEffect),1<X.effectTag&&(null!==\na.lastEffect?a.lastEffect.nextEffect=X:a.firstEffect=X,a.lastEffect=X))}else{b=zi(X);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=X.sibling;if(null!==b)return b;X=a}while(null!==X);S===ti&&(S=jj);return null}function Ij(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Jj(a){var b=ag();cg(99,Sj.bind(null,a,b));return null}\nfunction Sj(a,b){do Dj();while(null!==rj);if((W&(fj|gj))!==V)throw Error(u(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(u(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ij(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=\nd-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===T&&(X=T=null,U=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=W;W|=gj;dj.current=null;Dd=fd;var g=xd();if(yd(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,\nm=k.focusNode;k=k.focusOffset;try{h.nodeType,m.nodeType}catch(wb){h=null;break a}var p=0,x=-1,z=-1,ca=0,D=0,t=g,y=null;b:for(;;){for(var A;;){t!==h||0!==l&&3!==t.nodeType||(x=p+l);t!==m||0!==k&&3!==t.nodeType||(z=p+k);3===t.nodeType&&(p+=t.nodeValue.length);if(null===(A=t.firstChild))break;y=t;t=A}for(;;){if(t===g)break b;y===h&&++ca===l&&(x=p);y===m&&++D===k&&(z=p);if(null!==(A=t.nextSibling))break;t=y;y=t.parentNode}t=A}h=-1===x||-1===z?null:{start:x,end:z}}else h=null}h=h||{start:0,end:0}}else h=\nnull;Ed={activeElementDetached:null,focusedElem:g,selectionRange:h};fd=!1;Y=e;do try{Tj()}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var q=Y.effectTag;q&16&&Rb(Y.stateNode,\"\");if(q&128){var B=Y.alternate;if(null!==B){var w=B.ref;null!==w&&(\"function\"===typeof w?w(null):w.current=null)}}switch(q&1038){case 2:Pi(Y);Y.effectTag&=-3;break;case 6:Pi(Y);Y.effectTag&=-3;Si(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=\n-1025;Si(Y.alternate,Y);break;case 4:Si(Y.alternate,Y);break;case 8:l=Y,Mi(g,l,h),Ni(l)}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);w=Ed;B=xd();q=w.focusedElem;h=w.selectionRange;if(B!==q&&q&&q.ownerDocument&&wd(q.ownerDocument.documentElement,q)){null!==h&&yd(q)&&(B=h.start,w=h.end,void 0===w&&(w=B),\"selectionStart\"in q?(q.selectionStart=B,q.selectionEnd=Math.min(w,q.value.length)):(w=(B=q.ownerDocument||document)&&B.defaultView||window,w.getSelection&&\n(w=w.getSelection(),l=q.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!w.extend&&g>h&&(l=h,h=g,g=l),l=vd(q,g),m=vd(q,h),l&&m&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==m.node||w.focusOffset!==m.offset)&&(B=B.createRange(),B.setStart(l.node,l.offset),w.removeAllRanges(),g>h?(w.addRange(B),w.extend(m.node,m.offset)):(B.setEnd(m.node,m.offset),w.addRange(B))))));B=[];for(w=q;w=w.parentNode;)1===w.nodeType&&B.push({element:w,left:w.scrollLeft,\ntop:w.scrollTop});\"function\"===typeof q.focus&&q.focus();for(q=0;q<B.length;q++)w=B[q],w.element.scrollLeft=w.left,w.element.scrollTop=w.top}fd=!!Dd;Ed=Dd=null;a.current=c;Y=e;do try{for(q=a;null!==Y;){var ub=Y.effectTag;ub&36&&Ji(q,Y.alternate,Y);if(ub&128){B=void 0;var vb=Y.ref;if(null!==vb){var Xc=Y.stateNode;switch(Y.tag){case 5:B=Xc;break;default:B=Xc}\"function\"===typeof vb?vb(B):vb.current=B}}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=\nnull;Vf();W=f}else a.current=c;if(qj)qj=!1,rj=a,sj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&(aj=null);1073741823===b?a===vj?uj++:(uj=0,vj=a):uj=0;\"function\"===typeof Uj&&Uj(c.stateNode,d);Z(a);if(Yi)throw Yi=!1,a=Zi,Zi=null,a;if((W&ej)!==V)return null;gg();return null}function Tj(){for(;null!==Y;){var a=Y.effectTag;0!==(a&256)&&Gi(Y.alternate,Y);0===(a&512)||qj||(qj=!0,dg(97,function(){Dj();return null}));Y=Y.nextEffect}}\nfunction Dj(){if(90!==sj){var a=97<sj?97:sj;sj=90;return cg(a,Vj)}}function Vj(){if(null===rj)return!1;var a=rj;rj=null;if((W&(fj|gj))!==V)throw Error(u(331));var b=W;W|=gj;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Hi(5,c),Ii(5,c)}}catch(d){if(null===a)throw Error(u(330));Ei(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}W=b;gg();return!0}\nfunction Wj(a,b,c){b=Ai(c,b);b=Xi(a,b,1073741823);xg(a,b);a=xj(a,1073741823);null!==a&&Z(a)}function Ei(a,b){if(3===a.tag)Wj(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Wj(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===aj||!aj.has(d))){a=Ai(b,a);a=$i(c,a,1073741823);xg(c,a);c=xj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction Oj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);T===a&&U===c?S===vi||S===ui&&1073741823===lj&&$f()-Ti<pj?Ej(a,U):oj=!0:Aj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,Z(a)))}function Vi(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=Gg(),b=Hg(b,a,null));a=xj(a,b);null!==a&&Z(a)}var Rj;\nRj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)rg=!0;else{if(d<c){rg=!1;switch(b.tag){case 3:hi(b);Xh();break;case 5:fh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:L(b.type)&&Gf(b);break;case 4:dh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;I(jg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;\nif(0!==d&&d>=c)return ji(a,b,c);I(M,M.current&1);b=$h(a,b,c);return null!==b?b.sibling:null}I(M,M.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return mi(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(M,M.current);if(!d)return null}return $h(a,b,c)}rg=!1}}else rg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=Cf(b,J.current);qg(b,c);e=oh(null,\nb,d,a,e,c);b.effectTag|=1;if(\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(L(d)){var f=!0;Gf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ug(b);var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Fg(b,d,g,a);e.updater=Jg;b.stateNode=e;e._reactInternalFiber=b;Ng(b,d,a,c);b=gi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=\nnull,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ob(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Xj(e);a=ig(e,a);switch(f){case 0:b=di(null,b,e,a,c);break a;case 1:b=fi(null,b,e,a,c);break a;case 11:b=Zh(null,b,e,a,c);break a;case 14:b=ai(null,b,e,ig(e.type,a),d,c);break a}throw Error(u(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),di(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),fi(a,b,d,e,c);\ncase 3:hi(b);d=b.updateQueue;if(null===a||null===d)throw Error(u(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;vg(a,b);zg(b,d,null,c);d=b.memoizedState.element;if(d===e)Xh(),b=$h(a,b,c);else{if(e=b.stateNode.hydrate)Ph=Jd(b.stateNode.containerInfo.firstChild),Oh=b,e=Qh=!0;if(e)for(c=Yg(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else R(a,b,d,c),Xh();b=b.child}return b;case 5:return fh(b),null===a&&Uh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:\nnull,g=e.children,Gd(d,e)?g=null:null!==f&&Gd(d,f)&&(b.effectTag|=16),ei(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&Uh(b),null;case 13:return ji(a,b,c);case 4:return dh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Xg(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),Zh(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,\nb,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;I(jg,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=$e(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!K.current){b=$h(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==\nk){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=wg(c,null),l.tag=2,xg(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);pg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=\ng}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,qg(b,c),e=sg(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;case 14:return e=b.type,f=ig(e,b.pendingProps),f=ig(e.type,f),ai(a,b,e,f,d,c);case 15:return ci(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,L(d)?(a=!0,Gf(b)):a=!1,qg(b,c),Lg(b,d,e),Ng(b,d,e,c),gi(null,\nb,d,!0,a,c);case 19:return mi(a,b,c)}throw Error(u(156,b.tag));};var Uj=null,Li=null;function Yj(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Uj=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Li=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction Zj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Sh(a,b,c,d){return new Zj(a,b,c,d)}\nfunction bi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Xj(a){if(\"function\"===typeof a)return bi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===gb)return 11;if(a===jb)return 14}return 2}\nfunction Sg(a,b){var c=a.alternate;null===c?(c=Sh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Ug(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ab:return Wg(c.children,e,f,b);case fb:g=8;e|=7;break;case bb:g=8;e|=1;break;case cb:return a=Sh(12,c,b,e|8),a.elementType=cb,a.type=cb,a.expirationTime=f,a;case hb:return a=Sh(13,c,b,e),a.type=hb,a.elementType=hb,a.expirationTime=f,a;case ib:return a=Sh(19,c,b,e),a.elementType=ib,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case db:g=\n10;break a;case eb:g=9;break a;case gb:g=11;break a;case jb:g=14;break a;case kb:g=16;d=null;break a;case lb:g=22;break a}throw Error(u(130,null==a?a:typeof a,\"\"));}b=Sh(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Wg(a,b,c,d){a=Sh(7,a,d,b);a.expirationTime=c;return a}function Tg(a,b,c){a=Sh(6,a,null,b);a.expirationTime=c;return a}\nfunction Vg(a,b,c){b=Sh(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction ak(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Aj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function xi(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction yi(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Cj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction bk(a,b,c,d){var e=b.current,f=Gg(),g=Dg.suspense;f=Hg(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(dc(c)!==c||1!==c.tag)throw Error(u(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(L(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(u(171));}if(1===c.tag){var k=c.type;if(L(k)){c=Ff(c,k,h);break a}}c=h}else c=Af;null===b.context?b.context=c:b.pendingContext=c;b=wg(f,g);b.payload={element:a};d=void 0===\nd?null:d;null!==d&&(b.callback=d);xg(e,b);Ig(e,f);return f}function ck(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function dk(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function ek(a,b){dk(a,b);(a=a.alternate)&&dk(a,b)}\nfunction fk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new ak(a,b,c),e=Sh(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ug(e);a[Od]=d.current;c&&0!==b&&Jc(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}fk.prototype.render=function(a){bk(a,this._internalRoot,null,null)};fk.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;bk(null,a,null,function(){b[Od]=null})};\nfunction gk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function hk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new fk(a,0,b?{hydrate:!0}:void 0)}\nfunction ik(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=ck(g);h.call(a)}}bk(b,g,a,e)}else{f=c._reactRootContainer=hk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=ck(g);k.call(a)}}Nj(function(){bk(b,g,a,e)})}return ck(g)}function jk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:$a,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nwc=function(a){if(13===a.tag){var b=hg(Gg(),150,100);Ig(a,b);ek(a,b)}};xc=function(a){13===a.tag&&(Ig(a,3),ek(a,3))};yc=function(a){if(13===a.tag){var b=Gg();b=Hg(b,a,null);Ig(a,b);ek(a,b)}};\nza=function(a,b,c){switch(b){case \"input\":Cb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Qd(d);if(!e)throw Error(u(90));yb(d);Cb(d,e)}}}break;case \"textarea\":Kb(a,c);break;case \"select\":b=c.value,null!=b&&Hb(a,!!c.multiple,b,!1)}};Fa=Mj;\nGa=function(a,b,c,d,e){var f=W;W|=4;try{return cg(98,a.bind(null,b,c,d,e))}finally{W=f,W===V&&gg()}};Ha=function(){(W&(1|fj|gj))===V&&(Lj(),Dj())};Ia=function(a,b){var c=W;W|=2;try{return a(b)}finally{W=c,W===V&&gg()}};function kk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!gk(b))throw Error(u(200));return jk(a,b,null,c)}var lk={Events:[Nc,Pd,Qd,xa,ta,Xd,function(a){jc(a,Wd)},Da,Ea,id,mc,Dj,{current:!1}]};\n(function(a){var b=a.findFiberByHostInstance;return Yj(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Wa.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=hc(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:tc,bundleType:0,version:\"16.14.0\",\nrendererPackageName:\"react-dom\"});exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=lk;exports.createPortal=kk;exports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw Error(u(188));throw Error(u(268,Object.keys(a)));}a=hc(b);a=null===a?null:a.stateNode;return a};\nexports.flushSync=function(a,b){if((W&(fj|gj))!==V)throw Error(u(187));var c=W;W|=1;try{return cg(99,a.bind(null,b))}finally{W=c,gg()}};exports.hydrate=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!0,c)};exports.render=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!1,c)};\nexports.unmountComponentAtNode=function(a){if(!gk(a))throw Error(u(40));return a._reactRootContainer?(Nj(function(){ik(null,null,a,!1,function(){a._reactRootContainer=null;a[Od]=null})}),!0):!1};exports.unstable_batchedUpdates=Mj;exports.unstable_createPortal=function(a,b){return kk(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!gk(c))throw Error(u(200));if(null==a||void 0===a._reactInternalFiber)throw Error(u(38));return ik(a,b,c,!1,d)};exports.version=\"16.14.0\";\n", "'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n", "export class FetchResponse {\n  constructor (response) {\n    this.response = response\n  }\n\n  get statusCode () {\n    return this.response.status\n  }\n\n  get redirected () {\n    return this.response.redirected\n  }\n\n  get ok () {\n    return this.response.ok\n  }\n\n  get unauthenticated () {\n    return this.statusCode === 401\n  }\n\n  get unprocessableEntity () {\n    return this.statusCode === 422\n  }\n\n  get authenticationURL () {\n    return this.response.headers.get('WWW-Authenticate')\n  }\n\n  get contentType () {\n    const contentType = this.response.headers.get('Content-Type') || ''\n\n    return contentType.replace(/;.*$/, '')\n  }\n\n  get headers () {\n    return this.response.headers\n  }\n\n  get html () {\n    if (this.contentType.match(/^(application|text)\\/(html|xhtml\\+xml)$/)) {\n      return this.text\n    }\n\n    return Promise.reject(new Error(`Expected an HTML response but got \"${this.contentType}\" instead`))\n  }\n\n  get json () {\n    if (this.contentType.match(/^application\\/.*json$/)) {\n      return this.responseJson || (this.responseJson = this.response.json())\n    }\n\n    return Promise.reject(new Error(`Expected a JSON response but got \"${this.contentType}\" instead`))\n  }\n\n  get text () {\n    return this.responseText || (this.responseText = this.response.text())\n  }\n\n  get isTurboStream () {\n    return this.contentType.match(/^text\\/vnd\\.turbo-stream\\.html/)\n  }\n\n  get isScript () {\n    return this.contentType.match(/\\b(?:java|ecma)script\\b/)\n  }\n\n  async renderTurboStream () {\n    if (this.isTurboStream) {\n      if (window.Turbo) {\n        await window.Turbo.renderStreamMessage(await this.text)\n      } else {\n        console.warn('You must set `window.Turbo = Turbo` to automatically process Turbo Stream events with request.js')\n      }\n    } else {\n      return Promise.reject(new Error(`Expected a Turbo Stream response but got \"${this.contentType}\" instead`))\n    }\n  }\n\n  async activeScript () {\n    if (this.isScript) {\n      const script = document.createElement('script')\n      const metaTag = document.querySelector('meta[name=csp-nonce]')\n      const nonce = metaTag && metaTag.content\n      if (nonce) { script.setAttribute('nonce', nonce) }\n      script.innerHTML = await this.text\n      document.body.appendChild(script)\n    } else {\n      return Promise.reject(new Error(`Expected a Script response but got \"${this.contentType}\" instead`))\n    }\n  }\n}\n", "export class RequestInterceptor {\n  static register (interceptor) {\n    this.interceptor = interceptor\n  }\n\n  static get () {\n    return this.interceptor\n  }\n\n  static reset () {\n    this.interceptor = undefined\n  }\n}\n", "export function getCookie (name) {\n  const cookies = document.cookie ? document.cookie.split('; ') : []\n  const prefix = `${encodeURIComponent(name)}=`\n  const cookie = cookies.find(cookie => cookie.startsWith(prefix))\n\n  if (cookie) {\n    const value = cookie.split('=').slice(1).join('=')\n\n    if (value) {\n      return decodeURIComponent(value)\n    }\n  }\n}\n\nexport function compact (object) {\n  const result = {}\n\n  for (const key in object) {\n    const value = object[key]\n    if (value !== undefined) {\n      result[key] = value\n    }\n  }\n\n  return result\n}\n\nexport function metaContent (name) {\n  const element = document.head.querySelector(`meta[name=\"${name}\"]`)\n  return element && element.content\n}\n\nexport function stringEntriesFromFormData (formData) {\n  return [...formData].reduce((entries, [name, value]) => {\n    return entries.concat(typeof value === 'string' ? [[name, value]] : [])\n  }, [])\n}\n\nexport function mergeEntries (searchParams, entries) {\n  for (const [name, value] of entries) {\n    if (value instanceof window.File) continue\n\n    if (searchParams.has(name) && !name.includes('[]')) {\n      searchParams.delete(name)\n      searchParams.set(name, value)\n    } else {\n      searchParams.append(name, value)\n    }\n  }\n}\n", "import { FetchResponse } from './fetch_response'\nimport { RequestInterceptor } from './request_interceptor'\nimport { getCookie, compact, metaContent, stringEntriesFromFormData, mergeEntries } from './lib/utils'\n\nexport class FetchRequest {\n  constructor (method, url, options = {}) {\n    this.method = method\n    this.options = options\n    this.originalUrl = url.toString()\n  }\n\n  async perform () {\n    try {\n      const requestInterceptor = RequestInterceptor.get()\n      if (requestInterceptor) {\n        await requestInterceptor(this)\n      }\n    } catch (error) {\n      console.error(error)\n    }\n\n    const fetch = (this.responseKind === 'turbo-stream' && window.Turbo)\n      ? window.Turbo.fetch\n      : window.fetch\n\n    const response = new FetchResponse(await fetch(this.url, this.fetchOptions))\n\n    if (response.unauthenticated && response.authenticationURL) {\n      return Promise.reject(window.location.href = response.authenticationURL)\n    }\n\n    if (response.isScript) {\n      await response.activeScript()\n    }\n\n    const responseStatusIsTurboStreamable = response.ok || response.unprocessableEntity\n\n    if (responseStatusIsTurboStreamable && response.isTurboStream) {\n      await response.renderTurboStream()\n    }\n\n    return response\n  }\n\n  addHeader (key, value) {\n    const headers = this.additionalHeaders\n    headers[key] = value\n    this.options.headers = headers\n  }\n\n  sameHostname () {\n    if (!this.originalUrl.startsWith('http:')) {\n      return true\n    }\n\n    try {\n      return new URL(this.originalUrl).hostname === window.location.hostname\n    } catch (_) {\n      return true\n    }\n  }\n\n  get fetchOptions () {\n    return {\n      method: this.method.toUpperCase(),\n      headers: this.headers,\n      body: this.formattedBody,\n      signal: this.signal,\n      credentials: this.credentials,\n      redirect: this.redirect\n    }\n  }\n\n  get headers () {\n    const baseHeaders = {\n      'X-Requested-With': 'XMLHttpRequest',\n      'Content-Type': this.contentType,\n      Accept: this.accept\n    }\n\n    if (this.sameHostname()) {\n      baseHeaders['X-CSRF-Token'] = this.csrfToken\n    }\n\n    return compact(\n      Object.assign(baseHeaders, this.additionalHeaders)\n    )\n  }\n\n  get csrfToken () {\n    return getCookie(metaContent('csrf-param')) || metaContent('csrf-token')\n  }\n\n  get contentType () {\n    if (this.options.contentType) {\n      return this.options.contentType\n    } else if (this.body == null || this.body instanceof window.FormData) {\n      return undefined\n    } else if (this.body instanceof window.File) {\n      return this.body.type\n    }\n\n    return 'application/json'\n  }\n\n  get accept () {\n    switch (this.responseKind) {\n      case 'html':\n        return 'text/html, application/xhtml+xml'\n      case 'turbo-stream':\n        return 'text/vnd.turbo-stream.html, text/html, application/xhtml+xml'\n      case 'json':\n        return 'application/json, application/vnd.api+json'\n      case 'script':\n        return 'text/javascript, application/javascript'\n      default:\n        return '*/*'\n    }\n  }\n\n  get body () {\n    return this.options.body\n  }\n\n  get query () {\n    const originalQuery = (this.originalUrl.split('?')[1] || '').split('#')[0]\n    const params = new URLSearchParams(originalQuery)\n\n    let requestQuery = this.options.query\n    if (requestQuery instanceof window.FormData) {\n      requestQuery = stringEntriesFromFormData(requestQuery)\n    } else if (requestQuery instanceof window.URLSearchParams) {\n      requestQuery = requestQuery.entries()\n    } else {\n      requestQuery = Object.entries(requestQuery || {})\n    }\n\n    mergeEntries(params, requestQuery)\n\n    const query = params.toString()\n    return (query.length > 0 ? `?${query}` : '')\n  }\n\n  get url () {\n    return (this.originalUrl.split('?')[0]).split('#')[0] + this.query\n  }\n\n  get responseKind () {\n    return this.options.responseKind || 'html'\n  }\n\n  get signal () {\n    return this.options.signal\n  }\n\n  get redirect () {\n    return this.options.redirect || 'follow'\n  }\n\n  get credentials () {\n    return this.options.credentials || 'same-origin'\n  }\n\n  get additionalHeaders () {\n    return this.options.headers || {}\n  }\n\n  get formattedBody () {\n    const bodyIsAString = Object.prototype.toString.call(this.body) === '[object String]'\n    const contentTypeIsJson = this.headers['Content-Type'] === 'application/json'\n\n    if (contentTypeIsJson && !bodyIsAString) {\n      return JSON.stringify(this.body)\n    }\n\n    return this.body\n  }\n}\n", "import { FetchRequest } from './fetch_request'\n\nasync function get (url, options) {\n  const request = new FetchRequest('get', url, options)\n  return request.perform()\n}\n\nasync function post (url, options) {\n  const request = new FetchRequest('post', url, options)\n  return request.perform()\n}\n\nasync function put (url, options) {\n  const request = new FetchRequest('put', url, options)\n  return request.perform()\n}\n\nasync function patch (url, options) {\n  const request = new FetchRequest('patch', url, options)\n  return request.perform()\n}\n\nasync function destroy (url, options) {\n  const request = new FetchRequest('delete', url, options)\n  return request.perform()\n}\n\nexport { get, post, put, patch, destroy }\n", "import { FetchRequest } from './fetch_request'\nimport { FetchResponse } from './fetch_response'\nimport { RequestInterceptor } from './request_interceptor'\nimport { get, post, put, patch, destroy } from './verbs'\n\nexport { FetchRequest, FetchResponse, RequestInterceptor, get, post, put, patch, destroy }\n", "/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n", "function _interopRequireDefault(e) {\n  return e && e.__esModule ? e : {\n    \"default\": e\n  };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n", "'use strict';\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = require('./isArguments'); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n", "'use strict';\n\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n", "'use strict';\n\nvar keys = require('object-keys');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar origDefineProperty = Object.defineProperty;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\torigDefineProperty(obj, 'x', { enumerable: false, value: obj });\n\t\t// eslint-disable-next-line no-unused-vars, no-restricted-syntax\n\t\tfor (var _ in obj) { // jscs:ignore disallowUnusedVariables\n\t\t\treturn false;\n\t\t}\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\torigDefineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n", "'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n    var target = this;\n    if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n        throw new TypeError(ERROR_MESSAGE + target);\n    }\n    var args = slice.call(arguments, 1);\n\n    var bound;\n    var binder = function () {\n        if (this instanceof bound) {\n            var result = target.apply(\n                this,\n                args.concat(slice.call(arguments))\n            );\n            if (Object(result) === result) {\n                return result;\n            }\n            return this;\n        } else {\n            return target.apply(\n                that,\n                args.concat(slice.call(arguments))\n            );\n        }\n    };\n\n    var boundLength = Math.max(0, target.length - args.length);\n    var boundArgs = [];\n    for (var i = 0; i < boundLength; i++) {\n        boundArgs.push('$' + i);\n    }\n\n    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n    if (target.prototype) {\n        var Empty = function Empty() {};\n        Empty.prototype = target.prototype;\n        bound.prototype = new Empty();\n        Empty.prototype = null;\n    }\n\n    return bound;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n", "'use strict';\n\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n", "'use strict';\n\nvar origSymbol = global.Symbol;\nvar hasSymbolSham = require('./shams');\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n", "'use strict';\n\nvar bind = require('function-bind');\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n", "'use strict';\n\nvar undefined;\n\nvar $SyntaxError = SyntaxError;\nvar $Function = Function;\nvar $TypeError = TypeError;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': Object,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%ReferenceError%': ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet\n};\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('has');\nvar $concat = bind.call(Function.call, Array.prototype.concat);\nvar $spliceApply = bind.call(Function.apply, Array.prototype.splice);\nvar $replace = bind.call(Function.call, String.prototype.replace);\nvar $strSlice = bind.call(Function.call, String.prototype.slice);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n", "'use strict';\n\nvar bind = require('function-bind');\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n", "'use strict';\n\n/* globals\n\tAggregateError,\n\tAtomics,\n\tFinalizationRegistry,\n\tSharedArrayBuffer,\n\tWeakRef,\n*/\n\nvar undefined;\n\nvar $SyntaxError = SyntaxError;\nvar $Function = Function;\nvar $TypeError = TypeError;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\t// eslint-disable-next-line no-new-func\n\t\treturn Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () { throw new $TypeError(); };\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar asyncGenFunction = getEvalledConstructor('async function* () {}');\nvar asyncGenFunctionPrototype = asyncGenFunction ? asyncGenFunction.prototype : undefined;\nvar asyncGenPrototype = asyncGenFunctionPrototype ? asyncGenFunctionPrototype.prototype : undefined;\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': getEvalledConstructor('async function () {}'),\n\t'%AsyncGenerator%': asyncGenFunctionPrototype,\n\t'%AsyncGeneratorFunction%': asyncGenFunction,\n\t'%AsyncIteratorPrototype%': asyncGenPrototype ? getProto(asyncGenPrototype) : undefined,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': getEvalledConstructor('function* () {}'),\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': Object,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%ReferenceError%': ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet\n};\n\nvar LEGACY_ALIASES = {\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('has');\nvar $concat = bind.call(Function.call, Array.prototype.concat);\nvar $spliceApply = bind.call(Function.apply, Array.prototype.splice);\nvar $replace = bind.call(Function.call, String.prototype.replace);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\tif (!allowMissing && !(part in value)) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n", "var hasMap = typeof Map === 'function' && Map.prototype;\nvar mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;\nvar mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;\nvar mapForEach = hasMap && Map.prototype.forEach;\nvar hasSet = typeof Set === 'function' && Set.prototype;\nvar setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;\nvar setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;\nvar setForEach = hasSet && Set.prototype.forEach;\nvar hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;\nvar weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;\nvar hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;\nvar weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;\nvar hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;\nvar weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;\nvar booleanValueOf = Boolean.prototype.valueOf;\nvar objectToString = Object.prototype.toString;\nvar functionToString = Function.prototype.toString;\nvar match = String.prototype.match;\nvar bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;\nvar gOPS = Object.getOwnPropertySymbols;\nvar symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;\nvar hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';\nvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (\n    [].__proto__ === Array.prototype // eslint-disable-line no-proto\n        ? function (O) {\n            return O.__proto__; // eslint-disable-line no-proto\n        }\n        : null\n);\n\nvar inspectCustom = require('./util.inspect').custom;\nvar inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null;\nvar toStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag !== 'undefined' ? Symbol.toStringTag : null;\n\nmodule.exports = function inspect_(obj, options, depth, seen) {\n    var opts = options || {};\n\n    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {\n        throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');\n    }\n    if (\n        has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'\n            ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity\n            : opts.maxStringLength !== null\n        )\n    ) {\n        throw new TypeError('option \"maxStringLength\", if provided, must be a positive integer, Infinity, or `null`');\n    }\n    var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;\n    if (typeof customInspect !== 'boolean') {\n        throw new TypeError('option \"customInspect\", if provided, must be `true` or `false`');\n    }\n\n    if (\n        has(opts, 'indent')\n        && opts.indent !== null\n        && opts.indent !== '\\t'\n        && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)\n    ) {\n        throw new TypeError('options \"indent\" must be \"\\\\t\", an integer > 0, or `null`');\n    }\n\n    if (typeof obj === 'undefined') {\n        return 'undefined';\n    }\n    if (obj === null) {\n        return 'null';\n    }\n    if (typeof obj === 'boolean') {\n        return obj ? 'true' : 'false';\n    }\n\n    if (typeof obj === 'string') {\n        return inspectString(obj, opts);\n    }\n    if (typeof obj === 'number') {\n        if (obj === 0) {\n            return Infinity / obj > 0 ? '0' : '-0';\n        }\n        return String(obj);\n    }\n    if (typeof obj === 'bigint') {\n        return String(obj) + 'n';\n    }\n\n    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;\n    if (typeof depth === 'undefined') { depth = 0; }\n    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {\n        return isArray(obj) ? '[Array]' : '[Object]';\n    }\n\n    var indent = getIndent(opts, depth);\n\n    if (typeof seen === 'undefined') {\n        seen = [];\n    } else if (indexOf(seen, obj) >= 0) {\n        return '[Circular]';\n    }\n\n    function inspect(value, from, noIndent) {\n        if (from) {\n            seen = seen.slice();\n            seen.push(from);\n        }\n        if (noIndent) {\n            var newOpts = {\n                depth: opts.depth\n            };\n            if (has(opts, 'quoteStyle')) {\n                newOpts.quoteStyle = opts.quoteStyle;\n            }\n            return inspect_(value, newOpts, depth + 1, seen);\n        }\n        return inspect_(value, opts, depth + 1, seen);\n    }\n\n    if (typeof obj === 'function') {\n        var name = nameOf(obj);\n        var keys = arrObjKeys(obj, inspect);\n        return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + keys.join(', ') + ' }' : '');\n    }\n    if (isSymbol(obj)) {\n        var symString = hasShammedSymbols ? String(obj).replace(/^(Symbol\\(.*\\))_[^)]*$/, '$1') : symToString.call(obj);\n        return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;\n    }\n    if (isElement(obj)) {\n        var s = '<' + String(obj.nodeName).toLowerCase();\n        var attrs = obj.attributes || [];\n        for (var i = 0; i < attrs.length; i++) {\n            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);\n        }\n        s += '>';\n        if (obj.childNodes && obj.childNodes.length) { s += '...'; }\n        s += '</' + String(obj.nodeName).toLowerCase() + '>';\n        return s;\n    }\n    if (isArray(obj)) {\n        if (obj.length === 0) { return '[]'; }\n        var xs = arrObjKeys(obj, inspect);\n        if (indent && !singleLineValues(xs)) {\n            return '[' + indentedJoin(xs, indent) + ']';\n        }\n        return '[ ' + xs.join(', ') + ' ]';\n    }\n    if (isError(obj)) {\n        var parts = arrObjKeys(obj, inspect);\n        if (parts.length === 0) { return '[' + String(obj) + ']'; }\n        return '{ [' + String(obj) + '] ' + parts.join(', ') + ' }';\n    }\n    if (typeof obj === 'object' && customInspect) {\n        if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {\n            return obj[inspectSymbol]();\n        } else if (typeof obj.inspect === 'function') {\n            return obj.inspect();\n        }\n    }\n    if (isMap(obj)) {\n        var mapParts = [];\n        mapForEach.call(obj, function (value, key) {\n            mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));\n        });\n        return collectionOf('Map', mapSize.call(obj), mapParts, indent);\n    }\n    if (isSet(obj)) {\n        var setParts = [];\n        setForEach.call(obj, function (value) {\n            setParts.push(inspect(value, obj));\n        });\n        return collectionOf('Set', setSize.call(obj), setParts, indent);\n    }\n    if (isWeakMap(obj)) {\n        return weakCollectionOf('WeakMap');\n    }\n    if (isWeakSet(obj)) {\n        return weakCollectionOf('WeakSet');\n    }\n    if (isWeakRef(obj)) {\n        return weakCollectionOf('WeakRef');\n    }\n    if (isNumber(obj)) {\n        return markBoxed(inspect(Number(obj)));\n    }\n    if (isBigInt(obj)) {\n        return markBoxed(inspect(bigIntValueOf.call(obj)));\n    }\n    if (isBoolean(obj)) {\n        return markBoxed(booleanValueOf.call(obj));\n    }\n    if (isString(obj)) {\n        return markBoxed(inspect(String(obj)));\n    }\n    if (!isDate(obj) && !isRegExp(obj)) {\n        var ys = arrObjKeys(obj, inspect);\n        var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;\n        var protoTag = obj instanceof Object ? '' : 'null prototype';\n        var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? toStr(obj).slice(8, -1) : protoTag ? 'Object' : '';\n        var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';\n        var tag = constructorTag + (stringTag || protoTag ? '[' + [].concat(stringTag || [], protoTag || []).join(': ') + '] ' : '');\n        if (ys.length === 0) { return tag + '{}'; }\n        if (indent) {\n            return tag + '{' + indentedJoin(ys, indent) + '}';\n        }\n        return tag + '{ ' + ys.join(', ') + ' }';\n    }\n    return String(obj);\n};\n\nfunction wrapQuotes(s, defaultStyle, opts) {\n    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '\"' : \"'\";\n    return quoteChar + s + quoteChar;\n}\n\nfunction quote(s) {\n    return String(s).replace(/\"/g, '&quot;');\n}\n\nfunction isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\nfunction isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\nfunction isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\nfunction isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\nfunction isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\nfunction isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\nfunction isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }\n\n// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives\nfunction isSymbol(obj) {\n    if (hasShammedSymbols) {\n        return obj && typeof obj === 'object' && obj instanceof Symbol;\n    }\n    if (typeof obj === 'symbol') {\n        return true;\n    }\n    if (!obj || typeof obj !== 'object' || !symToString) {\n        return false;\n    }\n    try {\n        symToString.call(obj);\n        return true;\n    } catch (e) {}\n    return false;\n}\n\nfunction isBigInt(obj) {\n    if (!obj || typeof obj !== 'object' || !bigIntValueOf) {\n        return false;\n    }\n    try {\n        bigIntValueOf.call(obj);\n        return true;\n    } catch (e) {}\n    return false;\n}\n\nvar hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };\nfunction has(obj, key) {\n    return hasOwn.call(obj, key);\n}\n\nfunction toStr(obj) {\n    return objectToString.call(obj);\n}\n\nfunction nameOf(f) {\n    if (f.name) { return f.name; }\n    var m = match.call(functionToString.call(f), /^function\\s*([\\w$]+)/);\n    if (m) { return m[1]; }\n    return null;\n}\n\nfunction indexOf(xs, x) {\n    if (xs.indexOf) { return xs.indexOf(x); }\n    for (var i = 0, l = xs.length; i < l; i++) {\n        if (xs[i] === x) { return i; }\n    }\n    return -1;\n}\n\nfunction isMap(x) {\n    if (!mapSize || !x || typeof x !== 'object') {\n        return false;\n    }\n    try {\n        mapSize.call(x);\n        try {\n            setSize.call(x);\n        } catch (s) {\n            return true;\n        }\n        return x instanceof Map; // core-js workaround, pre-v2.5.0\n    } catch (e) {}\n    return false;\n}\n\nfunction isWeakMap(x) {\n    if (!weakMapHas || !x || typeof x !== 'object') {\n        return false;\n    }\n    try {\n        weakMapHas.call(x, weakMapHas);\n        try {\n            weakSetHas.call(x, weakSetHas);\n        } catch (s) {\n            return true;\n        }\n        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0\n    } catch (e) {}\n    return false;\n}\n\nfunction isWeakRef(x) {\n    if (!weakRefDeref || !x || typeof x !== 'object') {\n        return false;\n    }\n    try {\n        weakRefDeref.call(x);\n        return true;\n    } catch (e) {}\n    return false;\n}\n\nfunction isSet(x) {\n    if (!setSize || !x || typeof x !== 'object') {\n        return false;\n    }\n    try {\n        setSize.call(x);\n        try {\n            mapSize.call(x);\n        } catch (m) {\n            return true;\n        }\n        return x instanceof Set; // core-js workaround, pre-v2.5.0\n    } catch (e) {}\n    return false;\n}\n\nfunction isWeakSet(x) {\n    if (!weakSetHas || !x || typeof x !== 'object') {\n        return false;\n    }\n    try {\n        weakSetHas.call(x, weakSetHas);\n        try {\n            weakMapHas.call(x, weakMapHas);\n        } catch (s) {\n            return true;\n        }\n        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0\n    } catch (e) {}\n    return false;\n}\n\nfunction isElement(x) {\n    if (!x || typeof x !== 'object') { return false; }\n    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {\n        return true;\n    }\n    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';\n}\n\nfunction inspectString(str, opts) {\n    if (str.length > opts.maxStringLength) {\n        var remaining = str.length - opts.maxStringLength;\n        var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');\n        return inspectString(str.slice(0, opts.maxStringLength), opts) + trailer;\n    }\n    // eslint-disable-next-line no-control-regex\n    var s = str.replace(/(['\\\\])/g, '\\\\$1').replace(/[\\x00-\\x1f]/g, lowbyte);\n    return wrapQuotes(s, 'single', opts);\n}\n\nfunction lowbyte(c) {\n    var n = c.charCodeAt(0);\n    var x = {\n        8: 'b',\n        9: 't',\n        10: 'n',\n        12: 'f',\n        13: 'r'\n    }[n];\n    if (x) { return '\\\\' + x; }\n    return '\\\\x' + (n < 0x10 ? '0' : '') + n.toString(16).toUpperCase();\n}\n\nfunction markBoxed(str) {\n    return 'Object(' + str + ')';\n}\n\nfunction weakCollectionOf(type) {\n    return type + ' { ? }';\n}\n\nfunction collectionOf(type, size, entries, indent) {\n    var joinedEntries = indent ? indentedJoin(entries, indent) : entries.join(', ');\n    return type + ' (' + size + ') {' + joinedEntries + '}';\n}\n\nfunction singleLineValues(xs) {\n    for (var i = 0; i < xs.length; i++) {\n        if (indexOf(xs[i], '\\n') >= 0) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction getIndent(opts, depth) {\n    var baseIndent;\n    if (opts.indent === '\\t') {\n        baseIndent = '\\t';\n    } else if (typeof opts.indent === 'number' && opts.indent > 0) {\n        baseIndent = Array(opts.indent + 1).join(' ');\n    } else {\n        return null;\n    }\n    return {\n        base: baseIndent,\n        prev: Array(depth + 1).join(baseIndent)\n    };\n}\n\nfunction indentedJoin(xs, indent) {\n    if (xs.length === 0) { return ''; }\n    var lineJoiner = '\\n' + indent.prev + indent.base;\n    return lineJoiner + xs.join(',' + lineJoiner) + '\\n' + indent.prev;\n}\n\nfunction arrObjKeys(obj, inspect) {\n    var isArr = isArray(obj);\n    var xs = [];\n    if (isArr) {\n        xs.length = obj.length;\n        for (var i = 0; i < obj.length; i++) {\n            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';\n        }\n    }\n    var syms = typeof gOPS === 'function' ? gOPS(obj) : [];\n    var symMap;\n    if (hasShammedSymbols) {\n        symMap = {};\n        for (var k = 0; k < syms.length; k++) {\n            symMap['$' + syms[k]] = syms[k];\n        }\n    }\n\n    for (var key in obj) { // eslint-disable-line no-restricted-syntax\n        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n        if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {\n            // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section\n            continue; // eslint-disable-line no-restricted-syntax, no-continue\n        } else if ((/[^\\w$]/).test(key)) {\n            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));\n        } else {\n            xs.push(key + ': ' + inspect(obj[key], obj));\n        }\n    }\n    if (typeof gOPS === 'function') {\n        for (var j = 0; j < syms.length; j++) {\n            if (isEnumerable.call(obj, syms[j])) {\n                xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));\n            }\n        }\n    }\n    return xs;\n}\n", "'use strict';\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey\n\nmodule.exports = function IsPropertyKey(argument) {\n\treturn typeof argument === 'string' || typeof argument === 'symbol';\n};\n", "'use strict';\n\n// https://www.ecma-international.org/ecma-262/5.1/#sec-8\n\nmodule.exports = function Type(x) {\n\tif (x === null) {\n\t\treturn 'Null';\n\t}\n\tif (typeof x === 'undefined') {\n\t\treturn 'Undefined';\n\t}\n\tif (typeof x === 'function' || typeof x === 'object') {\n\t\treturn 'Object';\n\t}\n\tif (typeof x === 'number') {\n\t\treturn 'Number';\n\t}\n\tif (typeof x === 'boolean') {\n\t\treturn 'Boolean';\n\t}\n\tif (typeof x === 'string') {\n\t\treturn 'String';\n\t}\n};\n", "'use strict';\n\nvar ES5Type = require('../5/Type');\n\n// https://tc39.es/ecma262/2020/#sec-ecmascript-data-types-and-values\n\nmodule.exports = function Type(x) {\n\tif (typeof x === 'symbol') {\n\t\treturn 'Symbol';\n\t}\n\tif (typeof x === 'bigint') {\n\t\treturn 'BigInt';\n\t}\n\treturn ES5Type(x);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar inspect = require('object-inspect');\n\nvar IsPropertyKey = require('./IsPropertyKey');\nvar Type = require('./Type');\n\n/**\n * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p\n * 1. Assert: Type(O) is Object.\n * 2. Assert: IsPropertyKey(P) is true.\n * 3. Return O.[[Get]](P, O).\n */\n\nmodule.exports = function Get(O, P) {\n\t// 7.3.1.1\n\tif (Type(O) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t}\n\t// 7.3.1.2\n\tif (!IsPropertyKey(P)) {\n\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));\n\t}\n\t// 7.3.1.3\n\treturn O[P];\n};\n", "'use strict';\n\nvar bind = require('function-bind');\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind() {\n\treturn $reflectApply(bind, $call, arguments);\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar callBind = require('./callBind');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Array = GetIntrinsic('%Array%');\n\n// eslint-disable-next-line global-require\nvar toStr = !$Array.isArray && require('../helpers/callBound')('Object.prototype.toString');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-isarray\n\nmodule.exports = $Array.isArray || function IsArray(argument) {\n\treturn toStr(argument) === '[object Array]';\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar has = require('has');\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nmodule.exports = function IsPropertyDescriptor(ES, Desc) {\n\tif (ES.Type(Desc) !== 'Object') {\n\t\treturn false;\n\t}\n\tvar allowed = {\n\t\t'[[Configurable]]': true,\n\t\t'[[Enumerable]]': true,\n\t\t'[[Get]]': true,\n\t\t'[[Set]]': true,\n\t\t'[[Value]]': true,\n\t\t'[[Writable]]': true\n\t};\n\n\tfor (var key in Desc) { // eslint-disable-line no-restricted-syntax\n\t\tif (has(Desc, key) && !allowed[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) {\n\t\tthrow new $TypeError('Property Descriptors may not be both accessor and data descriptors');\n\t}\n\treturn true;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nvar callBound = require('../helpers/callBound');\n\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\n\n// eslint-disable-next-line max-params\nmodule.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {\n\tif (!$defineProperty) {\n\t\tif (!IsDataDescriptor(desc)) {\n\t\t\t// ES3 does not support getters/setters\n\t\t\treturn false;\n\t\t}\n\t\tif (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// fallback for ES3\n\t\tif (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {\n\t\t\t// a non-enumerable existing property\n\t\t\treturn false;\n\t\t}\n\n\t\t// property does not exist at all, or exists but is enumerable\n\t\tvar V = desc['[[Value]]'];\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tO[P] = V; // will use [[Define]]\n\t\treturn SameValue(O[P], V);\n\t}\n\t$defineProperty(O, P, FromPropertyDescriptor(desc));\n\treturn true;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $SyntaxError = GetIntrinsic('%SyntaxError%');\n\nvar has = require('has');\n\nvar predicates = {\n\t// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type\n\t'Property Descriptor': function isPropertyDescriptor(Type, Desc) {\n\t\tif (Type(Desc) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tvar allowed = {\n\t\t\t'[[Configurable]]': true,\n\t\t\t'[[Enumerable]]': true,\n\t\t\t'[[Get]]': true,\n\t\t\t'[[Set]]': true,\n\t\t\t'[[Value]]': true,\n\t\t\t'[[Writable]]': true\n\t\t};\n\n\t\tfor (var key in Desc) { // eslint-disable-line\n\t\t\tif (has(Desc, key) && !allowed[key]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tvar isData = has(Desc, '[[Value]]');\n\t\tvar IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');\n\t\tif (isData && IsAccessor) {\n\t\t\tthrow new $TypeError('Property Descriptors may not be both accessor and data descriptors');\n\t\t}\n\t\treturn true;\n\t}\n};\n\nmodule.exports = function assertRecord(Type, recordType, argumentName, value) {\n\tvar predicate = predicates[recordType];\n\tif (typeof predicate !== 'function') {\n\t\tthrow new $SyntaxError('unknown record type: ' + recordType);\n\t}\n\tif (!predicate(Type, value)) {\n\t\tthrow new $TypeError(argumentName + ' must be a ' + recordType);\n\t}\n};\n", "'use strict';\n\nvar assertRecord = require('../helpers/assertRecord');\n\nvar Type = require('./Type');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor\n\nmodule.exports = function FromPropertyDescriptor(Desc) {\n\tif (typeof Desc === 'undefined') {\n\t\treturn Desc;\n\t}\n\n\tassertRecord(Type, 'Property Descriptor', 'Desc', Desc);\n\n\tvar obj = {};\n\tif ('[[Value]]' in Desc) {\n\t\tobj.value = Desc['[[Value]]'];\n\t}\n\tif ('[[Writable]]' in Desc) {\n\t\tobj.writable = Desc['[[Writable]]'];\n\t}\n\tif ('[[Get]]' in Desc) {\n\t\tobj.get = Desc['[[Get]]'];\n\t}\n\tif ('[[Set]]' in Desc) {\n\t\tobj.set = Desc['[[Set]]'];\n\t}\n\tif ('[[Enumerable]]' in Desc) {\n\t\tobj.enumerable = Desc['[[Enumerable]]'];\n\t}\n\tif ('[[Configurable]]' in Desc) {\n\t\tobj.configurable = Desc['[[Configurable]]'];\n\t}\n\treturn obj;\n};\n", "'use strict';\n\nvar has = require('has');\n\nvar assertRecord = require('../helpers/assertRecord');\n\nvar Type = require('./Type');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor\n\nmodule.exports = function IsAccessorDescriptor(Desc) {\n\tif (typeof Desc === 'undefined') {\n\t\treturn false;\n\t}\n\n\tassertRecord(Type, 'Property Descriptor', 'Desc', Desc);\n\n\tif (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n", "'use strict';\n\nvar has = require('has');\n\nvar assertRecord = require('../helpers/assertRecord');\n\nvar Type = require('./Type');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor\n\nmodule.exports = function IsDataDescriptor(Desc) {\n\tif (typeof Desc === 'undefined') {\n\t\treturn false;\n\t}\n\n\tassertRecord(Type, 'Property Descriptor', 'Desc', Desc);\n\n\tif (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n", "'use strict';\n\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n", "'use strict';\n\nvar $isNaN = require('../helpers/isNaN');\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12\n\nmodule.exports = function SameValue(x, y) {\n\tif (x === y) { // 0 === -0, but they are not identical.\n\t\tif (x === 0) { return 1 / x === 1 / y; }\n\t\treturn true;\n\t}\n\treturn $isNaN(x) && $isNaN(y);\n};\n", "'use strict';\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2\n\nmodule.exports = function ToBoolean(value) { return !!value; };\n", "'use strict';\n\nvar fnToStr = Function.prototype.toString;\nvar reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;\nvar badArrayLike;\nvar isCallableMarker;\nif (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {\n\ttry {\n\t\tbadArrayLike = Object.defineProperty({}, 'length', {\n\t\t\tget: function () {\n\t\t\t\tthrow isCallableMarker;\n\t\t\t}\n\t\t});\n\t\tisCallableMarker = {};\n\t\t// eslint-disable-next-line no-throw-literal\n\t\treflectApply(function () { throw 42; }, null, badArrayLike);\n\t} catch (_) {\n\t\tif (_ !== isCallableMarker) {\n\t\t\treflectApply = null;\n\t\t}\n\t}\n} else {\n\treflectApply = null;\n}\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = reflectApply\n\t? function isCallable(value) {\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (typeof value === 'function' && !value.prototype) { return true; }\n\t\ttry {\n\t\t\treflectApply(value, null, badArrayLike);\n\t\t} catch (e) {\n\t\t\tif (e !== isCallableMarker) { return false; }\n\t\t}\n\t\treturn !isES6ClassFn(value);\n\t}\n\t: function isCallable(value) {\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (typeof value === 'function' && !value.prototype) { return true; }\n\t\tif (hasToStringTag) { return tryFunctionObject(value); }\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tvar strClass = toStr.call(value);\n\t\treturn strClass === fnClass || strClass === genClass;\n\t};\n", "'use strict';\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11\n\nmodule.exports = require('is-callable');\n", "'use strict';\n\nvar has = require('has');\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar Type = require('./Type');\nvar ToBoolean = require('./ToBoolean');\nvar IsCallable = require('./IsCallable');\n\n// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5\n\nmodule.exports = function ToPropertyDescriptor(Obj) {\n\tif (Type(Obj) !== 'Object') {\n\t\tthrow new $TypeError('ToPropertyDescriptor requires an object');\n\t}\n\n\tvar desc = {};\n\tif (has(Obj, 'enumerable')) {\n\t\tdesc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);\n\t}\n\tif (has(Obj, 'configurable')) {\n\t\tdesc['[[Configurable]]'] = ToBoolean(Obj.configurable);\n\t}\n\tif (has(Obj, 'value')) {\n\t\tdesc['[[Value]]'] = Obj.value;\n\t}\n\tif (has(Obj, 'writable')) {\n\t\tdesc['[[Writable]]'] = ToBoolean(Obj.writable);\n\t}\n\tif (has(Obj, 'get')) {\n\t\tvar getter = Obj.get;\n\t\tif (typeof getter !== 'undefined' && !IsCallable(getter)) {\n\t\t\tthrow new $TypeError('getter must be a function');\n\t\t}\n\t\tdesc['[[Get]]'] = getter;\n\t}\n\tif (has(Obj, 'set')) {\n\t\tvar setter = Obj.set;\n\t\tif (typeof setter !== 'undefined' && !IsCallable(setter)) {\n\t\t\tthrow new $TypeError('setter must be a function');\n\t\t}\n\t\tdesc['[[Set]]'] = setter;\n\t}\n\n\tif ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {\n\t\tthrow new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');\n\t}\n\treturn desc;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar isPropertyDescriptor = require('../helpers/isPropertyDescriptor');\nvar DefineOwnProperty = require('../helpers/DefineOwnProperty');\n\nvar FromPropertyDescriptor = require('./FromPropertyDescriptor');\nvar IsAccessorDescriptor = require('./IsAccessorDescriptor');\nvar IsDataDescriptor = require('./IsDataDescriptor');\nvar IsPropertyKey = require('./IsPropertyKey');\nvar SameValue = require('./SameValue');\nvar ToPropertyDescriptor = require('./ToPropertyDescriptor');\nvar Type = require('./Type');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow\n\nmodule.exports = function DefinePropertyOrThrow(O, P, desc) {\n\tif (Type(O) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t}\n\n\tif (!IsPropertyKey(P)) {\n\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t}\n\n\tvar Desc = isPropertyDescriptor({\n\t\tType: Type,\n\t\tIsDataDescriptor: IsDataDescriptor,\n\t\tIsAccessorDescriptor: IsAccessorDescriptor\n\t}, desc) ? desc : ToPropertyDescriptor(desc);\n\tif (!isPropertyDescriptor({\n\t\tType: Type,\n\t\tIsDataDescriptor: IsDataDescriptor,\n\t\tIsAccessorDescriptor: IsAccessorDescriptor\n\t}, Desc)) {\n\t\tthrow new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');\n\t}\n\n\treturn DefineOwnProperty(\n\t\tIsDataDescriptor,\n\t\tSameValue,\n\t\tFromPropertyDescriptor,\n\t\tO,\n\t\tP,\n\t\tDesc\n\t);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic.js');\n\nvar $construct = GetIntrinsic('%Reflect.construct%', true);\n\nvar DefinePropertyOrThrow = require('./DefinePropertyOrThrow');\ntry {\n\tDefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });\n} catch (e) {\n\t// Accessor properties aren't supported\n\tDefinePropertyOrThrow = null;\n}\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor\n\nif (DefinePropertyOrThrow && $construct) {\n\tvar isConstructorMarker = {};\n\tvar badArrayLike = {};\n\tDefinePropertyOrThrow(badArrayLike, 'length', {\n\t\t'[[Get]]': function () {\n\t\t\tthrow isConstructorMarker;\n\t\t},\n\t\t'[[Enumerable]]': true\n\t});\n\n\tmodule.exports = function IsConstructor(argument) {\n\t\ttry {\n\t\t\t// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:\n\t\t\t$construct(argument, badArrayLike);\n\t\t} catch (err) {\n\t\t\treturn err === isConstructorMarker;\n\t\t}\n\t};\n} else {\n\tmodule.exports = function IsConstructor(argument) {\n\t\t// unfortunately there's no way to truly check this without try/catch `new argument` in old environments\n\t\treturn typeof argument === 'function' && !!argument.prototype;\n\t};\n}\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $abs = GetIntrinsic('%Math.abs%');\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-5.2\n\nmodule.exports = function abs(x) {\n\treturn $abs(x);\n};\n", "'use strict';\n\n// var modulo = require('./modulo');\nvar $floor = Math.floor;\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-5.2\n\nmodule.exports = function floor(x) {\n\t// return x - modulo(x, 1);\n\treturn $floor(x);\n};\n", "'use strict';\n\nvar $isNaN = Number.isNaN || function (a) { return a !== a; };\n\nmodule.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };\n", "'use strict';\n\nvar abs = require('./abs');\nvar floor = require('./floor');\n\nvar $isNaN = require('../helpers/isNaN');\nvar $isFinite = require('../helpers/isFinite');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger\n\nmodule.exports = function IsInteger(argument) {\n\tif (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {\n\t\treturn false;\n\t}\n\tvar absValue = abs(argument);\n\treturn floor(absValue) === absValue;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Array = GetIntrinsic('%Array%');\nvar $species = GetIntrinsic('%Symbol.species%', true);\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar Get = require('./Get');\nvar IsArray = require('./IsArray');\nvar IsConstructor = require('./IsConstructor');\nvar IsInteger = require('./IsInteger');\nvar Type = require('./Type');\n\n// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate\n\nmodule.exports = function ArraySpeciesCreate(originalArray, length) {\n\tif (!IsInteger(length) || length < 0) {\n\t\tthrow new $TypeError('Assertion failed: length must be an integer >= 0');\n\t}\n\tvar len = length === 0 ? 0 : length;\n\tvar C;\n\tvar isArray = IsArray(originalArray);\n\tif (isArray) {\n\t\tC = Get(originalArray, 'constructor');\n\t\t// TODO: figure out how to make a cross-realm normal Array, a same-realm Array\n\t\t// if (IsConstructor(C)) {\n\t\t// \tif C is another realm's Array, C = undefined\n\t\t// \tObject.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?\n\t\t// }\n\t\tif ($species && Type(C) === 'Object') {\n\t\t\tC = Get(C, $species);\n\t\t\tif (C === null) {\n\t\t\t\tC = void 0;\n\t\t\t}\n\t\t}\n\t}\n\tif (typeof C === 'undefined') {\n\t\treturn $Array(len);\n\t}\n\tif (!IsConstructor(C)) {\n\t\tthrow new $TypeError('C must be a constructor');\n\t}\n\treturn new C(len); // Construct(C, len);\n};\n\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Math = GetIntrinsic('%Math%');\nvar $Number = GetIntrinsic('%Number%');\n\nmodule.exports = $Number.MAX_SAFE_INTEGER || $Math.pow(2, 53) - 1;\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\nvar callBound = require('../helpers/callBound');\n\nvar $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-call\n\nmodule.exports = function Call(F, V) {\n\tvar args = arguments.length > 2 ? arguments[2] : [];\n\treturn $apply(F, V, args);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%');\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n", "'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n", "'use strict';\n\nvar callBound = require('call-bind/callBound');\nvar hasSymbols = require('has-symbols')();\nvar hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol';\nvar has;\nvar $exec;\nvar isRegexMarker;\nvar badStringifier;\n\nif (hasToStringTag) {\n\thas = callBound('Object.prototype.hasOwnProperty');\n\t$exec = callBound('RegExp.prototype.exec');\n\tisRegexMarker = {};\n\n\tvar throwRegexMarker = function () {\n\t\tthrow isRegexMarker;\n\t};\n\tbadStringifier = {\n\t\ttoString: throwRegexMarker,\n\t\tvalueOf: throwRegexMarker\n\t};\n\n\tif (typeof Symbol.toPrimitive === 'symbol') {\n\t\tbadStringifier[Symbol.toPrimitive] = throwRegexMarker;\n\t}\n}\n\nvar $toString = callBound('Object.prototype.toString');\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar regexClass = '[object RegExp]';\n\nmodule.exports = hasToStringTag\n\t// eslint-disable-next-line consistent-return\n\t? function isRegex(value) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar descriptor = gOPD(value, 'lastIndex');\n\t\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\t\tif (!hasLastIndexDataProperty) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t$exec(value, badStringifier);\n\t\t} catch (e) {\n\t\t\treturn e === isRegexMarker;\n\t\t}\n\t}\n\t: function isRegex(value) {\n\t\t// In older browsers, typeof regex incorrectly returns 'function'\n\t\tif (!value || (typeof value !== 'object' && typeof value !== 'function')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn $toString(value) === regexClass;\n\t};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $match = GetIntrinsic('%Symbol.match%', true);\n\nvar hasRegExpMatcher = require('is-regex');\n\nvar ToBoolean = require('./ToBoolean');\n\n// https://ecma-international.org/ecma-262/6.0/#sec-isregexp\n\nmodule.exports = function IsRegExp(argument) {\n\tif (!argument || typeof argument !== 'object') {\n\t\treturn false;\n\t}\n\tif ($match) {\n\t\tvar isRegExp = argument[$match];\n\t\tif (typeof isRegExp !== 'undefined') {\n\t\t\treturn ToBoolean(isRegExp);\n\t\t}\n\t}\n\treturn hasRegExpMatcher(argument);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $gOPD = require('../helpers/getOwnPropertyDescriptor');\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar callBound = require('../helpers/callBound');\n\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\n\nvar has = require('has');\n\nvar IsArray = require('./IsArray');\nvar IsPropertyKey = require('./IsPropertyKey');\nvar IsRegExp = require('./IsRegExp');\nvar ToPropertyDescriptor = require('./ToPropertyDescriptor');\nvar Type = require('./Type');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty\n\nmodule.exports = function OrdinaryGetOwnProperty(O, P) {\n\tif (Type(O) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: O must be an Object');\n\t}\n\tif (!IsPropertyKey(P)) {\n\t\tthrow new $TypeError('Assertion failed: P must be a Property Key');\n\t}\n\tif (!has(O, P)) {\n\t\treturn void 0;\n\t}\n\tif (!$gOPD) {\n\t\t// ES3 / IE 8 fallback\n\t\tvar arrayLength = IsArray(O) && P === 'length';\n\t\tvar regexLastIndex = IsRegExp(O) && P === 'lastIndex';\n\t\treturn {\n\t\t\t'[[Configurable]]': !(arrayLength || regexLastIndex),\n\t\t\t'[[Enumerable]]': $isEnumerable(O, P),\n\t\t\t'[[Value]]': O[P],\n\t\t\t'[[Writable]]': true\n\t\t};\n\t}\n\treturn ToPropertyDescriptor($gOPD(O, P));\n};\n", "'use strict';\n\nmodule.exports = function isPrimitive(value) {\n\treturn value === null || (typeof value !== 'function' && typeof value !== 'object');\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Object = GetIntrinsic('%Object%');\n\nvar isPrimitive = require('../helpers/isPrimitive');\n\nvar $preventExtensions = $Object.preventExtensions;\nvar $isExtensible = $Object.isExtensible;\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o\n\nmodule.exports = $preventExtensions\n\t? function IsExtensible(obj) {\n\t\treturn !isPrimitive(obj) && $isExtensible(obj);\n\t}\n\t: function IsExtensible(obj) {\n\t\treturn !isPrimitive(obj);\n\t};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar DefineOwnProperty = require('../helpers/DefineOwnProperty');\n\nvar FromPropertyDescriptor = require('./FromPropertyDescriptor');\nvar OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');\nvar IsDataDescriptor = require('./IsDataDescriptor');\nvar IsExtensible = require('./IsExtensible');\nvar IsPropertyKey = require('./IsPropertyKey');\nvar SameValue = require('./SameValue');\nvar Type = require('./Type');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty\n\nmodule.exports = function CreateDataProperty(O, P, V) {\n\tif (Type(O) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t}\n\tif (!IsPropertyKey(P)) {\n\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t}\n\tvar oldDesc = OrdinaryGetOwnProperty(O, P);\n\tvar extensible = !oldDesc || IsExtensible(O);\n\tvar immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']);\n\tif (immutable || !extensible) {\n\t\treturn false;\n\t}\n\treturn DefineOwnProperty(\n\t\tIsDataDescriptor,\n\t\tSameValue,\n\t\tFromPropertyDescriptor,\n\t\tO,\n\t\tP,\n\t\t{\n\t\t\t'[[Configurable]]': true,\n\t\t\t'[[Enumerable]]': true,\n\t\t\t'[[Value]]': V,\n\t\t\t'[[Writable]]': true\n\t\t}\n\t);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar CreateDataProperty = require('./CreateDataProperty');\nvar IsPropertyKey = require('./IsPropertyKey');\nvar Type = require('./Type');\n\n// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow\n\nmodule.exports = function CreateDataPropertyOrThrow(O, P, V) {\n\tif (Type(O) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t}\n\tif (!IsPropertyKey(P)) {\n\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t}\n\tvar success = CreateDataProperty(O, P, V);\n\tif (!success) {\n\t\tthrow new $TypeError('unable to create data property');\n\t}\n\treturn success;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar IsPropertyKey = require('./IsPropertyKey');\nvar Type = require('./Type');\n\n// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty\n\nmodule.exports = function HasProperty(O, P) {\n\tif (Type(O) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: `O` must be an Object');\n\t}\n\tif (!IsPropertyKey(P)) {\n\t\tthrow new $TypeError('Assertion failed: `P` must be a Property Key');\n\t}\n\treturn P in O;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $abs = GetIntrinsic('%Math.abs%');\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-5.2\n\nmodule.exports = function abs(x) {\n\treturn $abs(x);\n};\n", "'use strict';\n\n// var modulo = require('./modulo');\nvar $floor = Math.floor;\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-5.2\n\nmodule.exports = function floor(x) {\n\t// return x - modulo(x, 1);\n\treturn $floor(x);\n};\n", "'use strict';\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.3\n\nmodule.exports = function ToNumber(value) {\n\treturn +value; // eslint-disable-line no-implicit-coercion\n};\n", "'use strict';\n\nmodule.exports = function sign(number) {\n\treturn number >= 0 ? 1 : -1;\n};\n", "'use strict';\n\nvar abs = require('./abs');\nvar floor = require('./floor');\nvar ToNumber = require('./ToNumber');\n\nvar $isNaN = require('../helpers/isNaN');\nvar $isFinite = require('../helpers/isFinite');\nvar $sign = require('../helpers/sign');\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.4\n\nmodule.exports = function ToInteger(value) {\n\tvar number = ToNumber(value);\n\tif ($isNaN(number)) { return 0; }\n\tif (number === 0 || !$isFinite(number)) { return number; }\n\treturn $sign(number) * floor(abs(number));\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $test = GetIntrinsic('RegExp.prototype.test');\n\nvar callBind = require('./callBind');\n\nmodule.exports = function regexTester(regex) {\n\treturn callBind($test, regex);\n};\n", "'use strict';\n\nmodule.exports = function isPrimitive(value) {\n\treturn value === null || (typeof value !== 'function' && typeof value !== 'object');\n};\n", "'use strict';\n\nvar fnToStr = Function.prototype.toString;\nvar reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;\nvar badArrayLike;\nvar isCallableMarker;\nif (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {\n\ttry {\n\t\tbadArrayLike = Object.defineProperty({}, 'length', {\n\t\t\tget: function () {\n\t\t\t\tthrow isCallableMarker;\n\t\t\t}\n\t\t});\n\t\tisCallableMarker = {};\n\t} catch (_) {\n\t\treflectApply = null;\n\t}\n} else {\n\treflectApply = null;\n}\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = reflectApply\n\t? function isCallable(value) {\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (typeof value === 'function' && !value.prototype) { return true; }\n\t\ttry {\n\t\t\treflectApply(value, null, badArrayLike);\n\t\t} catch (e) {\n\t\t\tif (e !== isCallableMarker) { return false; }\n\t\t}\n\t\treturn !isES6ClassFn(value);\n\t}\n\t: function isCallable(value) {\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (typeof value === 'function' && !value.prototype) { return true; }\n\t\tif (hasToStringTag) { return tryFunctionObject(value); }\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tvar strClass = toStr.call(value);\n\t\treturn strClass === fnClass || strClass === genClass;\n\t};\n", "'use strict';\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateGetDayCall(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn false;\n\t}\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n", "'use strict';\n\nvar toStr = Object.prototype.toString;\nvar hasSymbols = require('has-symbols')();\n\nif (hasSymbols) {\n\tvar symToStr = Symbol.prototype.toString;\n\tvar symStringRegex = /^Symbol\\(.*\\)$/;\n\tvar isSymbolObject = function isRealSymbolObject(value) {\n\t\tif (typeof value.valueOf() !== 'symbol') {\n\t\t\treturn false;\n\t\t}\n\t\treturn symStringRegex.test(symToStr.call(value));\n\t};\n\n\tmodule.exports = function isSymbol(value) {\n\t\tif (typeof value === 'symbol') {\n\t\t\treturn true;\n\t\t}\n\t\tif (toStr.call(value) !== '[object Symbol]') {\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\treturn isSymbolObject(value);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n} else {\n\n\tmodule.exports = function isSymbol(value) {\n\t\t// this environment does not support Symbols.\n\t\treturn false && value;\n\t};\n}\n", "'use strict';\n\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';\n\nvar isPrimitive = require('./helpers/isPrimitive');\nvar isCallable = require('is-callable');\nvar isDate = require('is-date-object');\nvar isSymbol = require('is-symbol');\n\nvar ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {\n\tif (typeof O === 'undefined' || O === null) {\n\t\tthrow new TypeError('Cannot call method on ' + O);\n\t}\n\tif (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {\n\t\tthrow new TypeError('hint must be \"string\" or \"number\"');\n\t}\n\tvar methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];\n\tvar method, result, i;\n\tfor (i = 0; i < methodNames.length; ++i) {\n\t\tmethod = O[methodNames[i]];\n\t\tif (isCallable(method)) {\n\t\t\tresult = method.call(O);\n\t\t\tif (isPrimitive(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tthrow new TypeError('No default value');\n};\n\nvar GetMethod = function GetMethod(O, P) {\n\tvar func = O[P];\n\tif (func !== null && typeof func !== 'undefined') {\n\t\tif (!isCallable(func)) {\n\t\t\tthrow new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');\n\t\t}\n\t\treturn func;\n\t}\n\treturn void 0;\n};\n\n// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive\nmodule.exports = function ToPrimitive(input) {\n\tif (isPrimitive(input)) {\n\t\treturn input;\n\t}\n\tvar hint = 'default';\n\tif (arguments.length > 1) {\n\t\tif (arguments[1] === String) {\n\t\t\thint = 'string';\n\t\t} else if (arguments[1] === Number) {\n\t\t\thint = 'number';\n\t\t}\n\t}\n\n\tvar exoticToPrim;\n\tif (hasSymbols) {\n\t\tif (Symbol.toPrimitive) {\n\t\t\texoticToPrim = GetMethod(input, Symbol.toPrimitive);\n\t\t} else if (isSymbol(input)) {\n\t\t\texoticToPrim = Symbol.prototype.valueOf;\n\t\t}\n\t}\n\tif (typeof exoticToPrim !== 'undefined') {\n\t\tvar result = exoticToPrim.call(input, hint);\n\t\tif (isPrimitive(result)) {\n\t\t\treturn result;\n\t\t}\n\t\tthrow new TypeError('unable to convert exotic object to primitive');\n\t}\n\tif (hint === 'default' && (isDate(input) || isSymbol(input))) {\n\t\thint = 'string';\n\t}\n\treturn ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);\n};\n", "'use strict';\n\nvar toPrimitive = require('es-to-primitive/es2015');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive\n\nmodule.exports = function ToPrimitive(input) {\n\tif (arguments.length > 1) {\n\t\treturn toPrimitive(input, arguments[1]);\n\t}\n\treturn toPrimitive(input);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $Number = GetIntrinsic('%Number%');\nvar $RegExp = GetIntrinsic('%RegExp%');\nvar $parseInteger = GetIntrinsic('%parseInt%');\n\nvar callBound = require('../helpers/callBound');\nvar regexTester = require('../helpers/regexTester');\nvar isPrimitive = require('../helpers/isPrimitive');\n\nvar $strSlice = callBound('String.prototype.slice');\nvar isBinary = regexTester(/^0b[01]+$/i);\nvar isOctal = regexTester(/^0o[0-7]+$/i);\nvar isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);\nvar nonWS = ['\\u0085', '\\u200b', '\\ufffe'].join('');\nvar nonWSregex = new $RegExp('[' + nonWS + ']', 'g');\nvar hasNonWS = regexTester(nonWSregex);\n\n// whitespace from: https://es5.github.io/#x15.5.4.20\n// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324\nvar ws = [\n\t'\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003',\n\t'\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028',\n\t'\\u2029\\uFEFF'\n].join('');\nvar trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');\nvar $replace = callBound('String.prototype.replace');\nvar $trim = function (value) {\n\treturn $replace(value, trimRegex, '');\n};\n\nvar ToPrimitive = require('./ToPrimitive');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber\n\nmodule.exports = function ToNumber(argument) {\n\tvar value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);\n\tif (typeof value === 'symbol') {\n\t\tthrow new $TypeError('Cannot convert a Symbol value to a number');\n\t}\n\tif (typeof value === 'string') {\n\t\tif (isBinary(value)) {\n\t\t\treturn ToNumber($parseInteger($strSlice(value, 2), 2));\n\t\t} else if (isOctal(value)) {\n\t\t\treturn ToNumber($parseInteger($strSlice(value, 2), 8));\n\t\t} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {\n\t\t\treturn NaN;\n\t\t} else {\n\t\t\tvar trimmed = $trim(value);\n\t\t\tif (trimmed !== value) {\n\t\t\t\treturn ToNumber(trimmed);\n\t\t\t}\n\t\t}\n\t}\n\treturn $Number(value);\n};\n", "'use strict';\n\nvar ES5ToInteger = require('../5/ToInteger');\n\nvar ToNumber = require('./ToNumber');\n\n// https://www.ecma-international.org/ecma-262/11.0/#sec-tointeger\n\nmodule.exports = function ToInteger(value) {\n\tvar number = ToNumber(value);\n\tif (number !== 0) {\n\t\tnumber = ES5ToInteger(number);\n\t}\n\treturn number === 0 ? 0 : number;\n};\n", "'use strict';\n\nvar MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');\n\nvar ToInteger = require('./ToInteger');\n\nmodule.exports = function ToLength(argument) {\n\tvar len = ToInteger(argument);\n\tif (len <= 0) { return 0; } // includes converting -0 to +0\n\tif (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }\n\treturn len;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar Get = require('./Get');\nvar ToLength = require('./ToLength');\nvar Type = require('./Type');\n\n// https://tc39.es/ecma262/2020/#sec-lengthofarraylike\n\nmodule.exports = function LengthOfArrayLike(obj) {\n\tif (Type(obj) !== 'Object') {\n\t\tthrow new $TypeError('Assertion failed: `obj` must be an Object');\n\t}\n\treturn ToLength(Get(obj, 'length'));\n};\n\n// TODO: use this all over\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $String = GetIntrinsic('%String%');\nvar $TypeError = GetIntrinsic('%TypeError%');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring\n\nmodule.exports = function ToString(argument) {\n\tif (typeof argument === 'symbol') {\n\t\tthrow new $TypeError('Cannot convert a Symbol value to a string');\n\t}\n\treturn $String(argument);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\nvar MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');\n\nvar Call = require('./Call');\nvar CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');\nvar Get = require('./Get');\nvar HasProperty = require('./HasProperty');\nvar IsArray = require('./IsArray');\nvar LengthOfArrayLike = require('./LengthOfArrayLike');\nvar ToString = require('./ToString');\n\n// https://tc39.es/ecma262/2020/#sec-flattenintoarray\n\n// eslint-disable-next-line max-params\nmodule.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {\n\tvar mapperFunction;\n\tif (arguments.length > 5) {\n\t\tmapperFunction = arguments[5];\n\t}\n\n\tvar targetIndex = start;\n\tvar sourceIndex = 0;\n\twhile (sourceIndex < sourceLen) {\n\t\tvar P = ToString(sourceIndex);\n\t\tvar exists = HasProperty(source, P);\n\t\tif (exists === true) {\n\t\t\tvar element = Get(source, P);\n\t\t\tif (typeof mapperFunction !== 'undefined') {\n\t\t\t\tif (arguments.length <= 6) {\n\t\t\t\t\tthrow new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');\n\t\t\t\t}\n\t\t\t\telement = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);\n\t\t\t}\n\t\t\tvar shouldFlatten = false;\n\t\t\tif (depth > 0) {\n\t\t\t\tshouldFlatten = IsArray(element);\n\t\t\t}\n\t\t\tif (shouldFlatten) {\n\t\t\t\tvar elementLen = LengthOfArrayLike(element);\n\t\t\t\ttargetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);\n\t\t\t} else {\n\t\t\t\tif (targetIndex >= MAX_SAFE_INTEGER) {\n\t\t\t\t\tthrow new $TypeError('index too large');\n\t\t\t\t}\n\t\t\t\tCreateDataPropertyOrThrow(target, ToString(targetIndex), element);\n\t\t\t\ttargetIndex += 1;\n\t\t\t}\n\t\t}\n\t\tsourceIndex += 1;\n\t}\n\n\treturn targetIndex;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.10\n\nmodule.exports = function CheckObjectCoercible(value, optMessage) {\n\tif (value == null) {\n\t\tthrow new $TypeError(optMessage || ('Cannot call method on ' + value));\n\t}\n\treturn value;\n};\n", "'use strict';\n\nmodule.exports = require('../5/CheckObjectCoercible');\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $Object = GetIntrinsic('%Object%');\n\nvar RequireObjectCoercible = require('./RequireObjectCoercible');\n\n// https://www.ecma-international.org/ecma-262/6.0/#sec-toobject\n\nmodule.exports = function ToObject(value) {\n\tRequireObjectCoercible(value);\n\treturn $Object(value);\n};\n", "'use strict';\n\nvar ArraySpeciesCreate = require('es-abstract/2020/ArraySpeciesCreate');\nvar FlattenIntoArray = require('es-abstract/2020/FlattenIntoArray');\nvar Get = require('es-abstract/2020/Get');\nvar ToInteger = require('es-abstract/2020/ToInteger');\nvar ToLength = require('es-abstract/2020/ToLength');\nvar ToObject = require('es-abstract/2020/ToObject');\n\nmodule.exports = function flat() {\n\tvar O = ToObject(this);\n\tvar sourceLen = ToLength(Get(O, 'length'));\n\n\tvar depthNum = 1;\n\tif (arguments.length > 0 && typeof arguments[0] !== 'undefined') {\n\t\tdepthNum = ToInteger(arguments[0]);\n\t}\n\n\tvar A = ArraySpeciesCreate(O, 0);\n\tFlattenIntoArray(A, O, sourceLen, 0, depthNum);\n\treturn A;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn Array.prototype.flat || implementation;\n};\n", "'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimFlat() {\n\tvar polyfill = getPolyfill();\n\tdefine(\n\t\tArray.prototype,\n\t\t{ flat: polyfill },\n\t\t{ flat: function () { return Array.prototype.flat !== polyfill; } }\n\t);\n\treturn polyfill;\n};\n", "'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar polyfill = getPolyfill();\nvar shim = require('./shim');\n\nvar boundFlat = callBind(polyfill);\n\ndefine(boundFlat, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = boundFlat;\n", "'use strict';\n\nvar define = require('define-properties');\nvar isSymbol = require('is-symbol');\n\nvar globalKey = '__ global cache key __';\n/* istanbul ignore else */\n// eslint-disable-next-line no-restricted-properties\nif (typeof Symbol === 'function' && isSymbol(Symbol('foo')) && typeof Symbol['for'] === 'function') {\n\t// eslint-disable-next-line no-restricted-properties\n\tglobalKey = Symbol['for'](globalKey);\n}\n\nvar trueThunk = function () {\n\treturn true;\n};\n\nvar ensureCache = function ensureCache() {\n\tif (!global[globalKey]) {\n\t\tvar properties = {};\n\t\tproperties[globalKey] = {};\n\t\tvar predicates = {};\n\t\tpredicates[globalKey] = trueThunk;\n\t\tdefine(global, properties, predicates);\n\t}\n\treturn global[globalKey];\n};\n\nvar cache = ensureCache();\n\nvar isPrimitive = function isPrimitive(val) {\n\treturn val === null || (typeof val !== 'object' && typeof val !== 'function');\n};\n\nvar getPrimitiveKey = function getPrimitiveKey(val) {\n\tif (isSymbol(val)) {\n\t\treturn Symbol.prototype.valueOf.call(val);\n\t}\n\treturn typeof val + ' | ' + String(val);\n};\n\nvar requirePrimitiveKey = function requirePrimitiveKey(val) {\n\tif (!isPrimitive(val)) {\n\t\tthrow new TypeError('key must not be an object');\n\t}\n};\n\nvar globalCache = {\n\tclear: function clear() {\n\t\tdelete global[globalKey];\n\t\tcache = ensureCache();\n\t},\n\n\t'delete': function deleteKey(key) {\n\t\trequirePrimitiveKey(key);\n\t\tdelete cache[getPrimitiveKey(key)];\n\t\treturn !globalCache.has(key);\n\t},\n\n\tget: function get(key) {\n\t\trequirePrimitiveKey(key);\n\t\treturn cache[getPrimitiveKey(key)];\n\t},\n\n\thas: function has(key) {\n\t\trequirePrimitiveKey(key);\n\t\treturn getPrimitiveKey(key) in cache;\n\t},\n\n\tset: function set(key, value) {\n\t\trequirePrimitiveKey(key);\n\t\tvar primitiveKey = getPrimitiveKey(key);\n\t\tvar props = {};\n\t\tprops[primitiveKey] = value;\n\t\tvar predicates = {};\n\t\tpredicates[primitiveKey] = trueThunk;\n\t\tdefine(cache, props, predicates);\n\t\treturn globalCache.has(key);\n\t},\n\n\tsetIfMissingThenGet: function setIfMissingThenGet(key, valueThunk) {\n\t\tif (globalCache.has(key)) {\n\t\t\treturn globalCache.get(key);\n\t\t}\n\t\tvar item = valueThunk();\n\t\tglobalCache.set(key, item);\n\t\treturn item;\n\t}\n};\n\nmodule.exports = globalCache;\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MAX_SPECIFICITY = exports.GLOBAL_CACHE_KEY = void 0;\nvar GLOBAL_CACHE_KEY = 'reactWithStylesInterfaceCSS';\nexports.GLOBAL_CACHE_KEY = GLOBAL_CACHE_KEY;\nvar MAX_SPECIFICITY = 20;\nexports.MAX_SPECIFICITY = MAX_SPECIFICITY;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getClassName;\n\n/**\n * Construct a class name.\n *\n * namespace {String} Used to construct unique class names.\n * styleName {String} Name identifying the specific style.\n *\n * Return the class name.\n */\nfunction getClassName(namespace, styleName) {\n  var namespaceSegment = namespace.length > 0 ? \"\".concat(namespace, \"__\") : '';\n  return \"\".concat(namespaceSegment).concat(styleName);\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\n// This function takes an array of styles and separates them into styles that\n// are handled by Aphrodite and inline styles.\nfunction separateStyles(stylesArray) {\n  var classNames = []; // Since determining if an Object is empty requires collecting all of its\n  // keys, and we want the best performance in this code because we are in the\n  // render path, we are going to do a little bookkeeping ourselves.\n\n  var hasInlineStyles = false;\n  var inlineStyles = {}; // This is run on potentially every node in the tree when rendering, where\n  // performance is critical. Normally we would prefer using `forEach`, but\n  // old-fashioned for loops are faster so that's what we have chosen here.\n\n  for (var i = 0; i < stylesArray.length; i++) {\n    // eslint-disable-line no-plusplus\n    var style = stylesArray[i]; // If this  style is falsy, we just want to disregard it. This allows for\n    // syntax like:\n    //\n    //   css(isFoo && styles.foo)\n\n    if (style) {\n      if (typeof style === 'string') {\n        classNames.push(style);\n      } else {\n        Object.assign(inlineStyles, style);\n        hasInlineStyles = true;\n      }\n    }\n  }\n\n  return {\n    classNames: classNames,\n    hasInlineStyles: hasInlineStyles,\n    inlineStyles: inlineStyles\n  };\n}\n\nvar _default = separateStyles;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _arrayPrototype = _interopRequireDefault(require(\"array.prototype.flat\"));\n\nvar _globalCache = _interopRequireDefault(require(\"global-cache\"));\n\nvar _constants = require(\"./utils/constants\");\n\nvar _getClassName = _interopRequireDefault(require(\"./utils/getClassName\"));\n\nvar _separateStyles2 = _interopRequireDefault(require(\"./utils/separateStyles\"));\n\n/**\n * Function required as part of the react-with-styles interface. Parses the styles provided by\n * react-with-styles to produce class names based on the style name and optionally the namespace if\n * available.\n *\n * stylesObject {Object} The styles object passed to withStyles.\n *\n * Return an object mapping style names to class names.\n */\nfunction create(stylesObject) {\n  var stylesToClasses = {};\n  var styleNames = Object.keys(stylesObject);\n  var sharedState = _globalCache[\"default\"].get(_constants.GLOBAL_CACHE_KEY) || {};\n  var _sharedState$namespac = sharedState.namespace,\n      namespace = _sharedState$namespac === void 0 ? '' : _sharedState$namespac;\n  styleNames.forEach(function (styleName) {\n    var className = (0, _getClassName[\"default\"])(namespace, styleName);\n    stylesToClasses[styleName] = className;\n  });\n  return stylesToClasses;\n}\n/**\n * Process styles to be consumed by a component.\n *\n * stylesArray {Array} Array of the following: values returned by create, plain JavaScript objects\n * representing inline styles, or arrays thereof.\n *\n * Return an object with optional className and style properties to be spread on a component.\n */\n\n\nfunction resolve(stylesArray) {\n  var flattenedStyles = (0, _arrayPrototype[\"default\"])(stylesArray, Infinity);\n\n  var _separateStyles = (0, _separateStyles2[\"default\"])(flattenedStyles),\n      classNames = _separateStyles.classNames,\n      hasInlineStyles = _separateStyles.hasInlineStyles,\n      inlineStyles = _separateStyles.inlineStyles;\n\n  var specificClassNames = classNames.map(function (name, index) {\n    return \"\".concat(name, \" \").concat(name, \"_\").concat(index + 1);\n  });\n  var className = specificClassNames.join(' ');\n  var result = {\n    className: className\n  };\n  if (hasInlineStyles) result.style = inlineStyles;\n  return result;\n}\n\nvar _default = {\n  create: create,\n  resolve: resolve\n};\nexports[\"default\"] = _default;", "// eslint-disable-next-line import/no-unresolved\nmodule.exports = require('./dist/index.js').default;\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports._getInterface = _getInterface;\nexports._getTheme = get;\nexports[\"default\"] = void 0;\nvar styleInterface;\nvar styleTheme;\nvar START_MARK = 'react-with-styles.resolve.start';\nvar END_MARK = 'react-with-styles.resolve.end';\nvar MEASURE_MARK = \"\\uD83D\\uDC69\\u200D\\uD83C\\uDFA8 [resolve]\";\n\nfunction registerTheme(theme) {\n  styleTheme = theme;\n}\n\nfunction registerInterface(interfaceToRegister) {\n  styleInterface = interfaceToRegister;\n}\n\nfunction create(makeFromTheme, createWithDirection) {\n  var styles = createWithDirection(makeFromTheme(styleTheme));\n  return function () {\n    return styles;\n  };\n}\n\nfunction createLTR(makeFromTheme) {\n  return create(makeFromTheme, styleInterface.createLTR || styleInterface.create);\n}\n\nfunction createRTL(makeFromTheme) {\n  return create(makeFromTheme, styleInterface.createRTL || styleInterface.create);\n}\n\nfunction get() {\n  return styleTheme;\n}\n\nfunction resolve() {\n  if (process.env.NODE_ENV !== 'production' && typeof performance !== 'undefined' && performance.mark !== undefined && typeof performance.clearMarks === 'function') {\n    performance.clearMarks(START_MARK);\n    performance.mark(START_MARK);\n  }\n\n  for (var _len = arguments.length, styles = new Array(_len), _key = 0; _key < _len; _key++) {\n    styles[_key] = arguments[_key];\n  }\n\n  var result = styleInterface.resolve(styles);\n\n  if (process.env.NODE_ENV !== 'production' && typeof performance !== 'undefined' && performance.mark !== undefined && typeof performance.clearMarks === 'function') {\n    performance.clearMarks(END_MARK);\n    performance.mark(END_MARK);\n    performance.measure(MEASURE_MARK, START_MARK, END_MARK);\n    performance.clearMarks(MEASURE_MARK);\n  }\n\n  return result;\n}\n\nfunction resolveLTR() {\n  for (var _len2 = arguments.length, styles = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    styles[_key2] = arguments[_key2];\n  }\n\n  if (styleInterface.resolveLTR) {\n    return styleInterface.resolveLTR(styles);\n  }\n\n  return resolve(styles);\n}\n\nfunction resolveRTL() {\n  for (var _len3 = arguments.length, styles = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n    styles[_key3] = arguments[_key3];\n  }\n\n  if (styleInterface.resolveRTL) {\n    return styleInterface.resolveRTL(styles);\n  }\n\n  return resolve(styles);\n}\n\nfunction flush() {\n  if (styleInterface.flush) {\n    styleInterface.flush();\n  }\n} // Exported until we deprecate this API completely\n// eslint-disable-next-line no-underscore-dangle\n\n\nfunction _getInterface() {\n  return styleInterface;\n} // Exported until we deprecate this API completely\n\n\nvar _default = {\n  registerTheme: registerTheme,\n  registerInterface: registerInterface,\n  create: createLTR,\n  createLTR: createLTR,\n  createRTL: createRTL,\n  get: get,\n  resolve: resolveLTR,\n  resolveLTR: resolveLTR,\n  resolveRTL: resolveRTL,\n  flush: flush\n};\nexports[\"default\"] = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\nvar core = {\n  white: '#fff',\n  gray: '#484848',\n  grayLight: '#82888a',\n  grayLighter: '#cacccd',\n  grayLightest: '#f2f2f2',\n  borderMedium: '#c4c4c4',\n  border: '#dbdbdb',\n  borderLight: '#e4e7e7',\n  borderLighter: '#eceeee',\n  borderBright: '#f4f5f5',\n  primary: '#00a699',\n  primaryShade_1: '#33dacd',\n  primaryShade_2: '#66e2da',\n  primaryShade_3: '#80e8e0',\n  primaryShade_4: '#b2f1ec',\n  primary_dark: '#008489',\n  secondary: '#007a87',\n  yellow: '#ffe8bc',\n  yellow_dark: '#ffce71'\n};\nvar _default = {\n  reactDates: {\n    zIndex: 0,\n    border: {\n      input: {\n        border: 0,\n        borderTop: 0,\n        borderRight: 0,\n        borderBottom: '2px solid transparent',\n        borderLeft: 0,\n        outlineFocused: 0,\n        borderFocused: 0,\n        borderTopFocused: 0,\n        borderLeftFocused: 0,\n        borderBottomFocused: \"2px solid \".concat(core.primary_dark),\n        borderRightFocused: 0,\n        borderRadius: 0\n      },\n      pickerInput: {\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderRadius: 2\n      }\n    },\n    color: {\n      core: core,\n      disabled: core.grayLightest,\n      background: core.white,\n      backgroundDark: '#f2f2f2',\n      backgroundFocused: core.white,\n      border: 'rgb(219, 219, 219)',\n      text: core.gray,\n      textDisabled: core.border,\n      textFocused: '#007a87',\n      placeholderText: '#757575',\n      outside: {\n        backgroundColor: core.white,\n        backgroundColor_active: core.white,\n        backgroundColor_hover: core.white,\n        color: core.gray,\n        color_active: core.gray,\n        color_hover: core.gray\n      },\n      highlighted: {\n        backgroundColor: core.yellow,\n        backgroundColor_active: core.yellow_dark,\n        backgroundColor_hover: core.yellow_dark,\n        color: core.gray,\n        color_active: core.gray,\n        color_hover: core.gray\n      },\n      minimumNights: {\n        backgroundColor: core.white,\n        backgroundColor_active: core.white,\n        backgroundColor_hover: core.white,\n        borderColor: core.borderLighter,\n        color: core.grayLighter,\n        color_active: core.grayLighter,\n        color_hover: core.grayLighter\n      },\n      hoveredSpan: {\n        backgroundColor: core.primaryShade_4,\n        backgroundColor_active: core.primaryShade_3,\n        backgroundColor_hover: core.primaryShade_4,\n        borderColor: core.primaryShade_3,\n        borderColor_active: core.primaryShade_3,\n        borderColor_hover: core.primaryShade_3,\n        color: core.secondary,\n        color_active: core.secondary,\n        color_hover: core.secondary\n      },\n      selectedSpan: {\n        backgroundColor: core.primaryShade_2,\n        backgroundColor_active: core.primaryShade_1,\n        backgroundColor_hover: core.primaryShade_1,\n        borderColor: core.primaryShade_1,\n        borderColor_active: core.primary,\n        borderColor_hover: core.primary,\n        color: core.white,\n        color_active: core.white,\n        color_hover: core.white\n      },\n      selected: {\n        backgroundColor: core.primary,\n        backgroundColor_active: core.primary,\n        backgroundColor_hover: core.primary,\n        borderColor: core.primary,\n        borderColor_active: core.primary,\n        borderColor_hover: core.primary,\n        color: core.white,\n        color_active: core.white,\n        color_hover: core.white\n      },\n      blocked_calendar: {\n        backgroundColor: core.grayLighter,\n        backgroundColor_active: core.grayLighter,\n        backgroundColor_hover: core.grayLighter,\n        borderColor: core.grayLighter,\n        borderColor_active: core.grayLighter,\n        borderColor_hover: core.grayLighter,\n        color: core.grayLight,\n        color_active: core.grayLight,\n        color_hover: core.grayLight\n      },\n      blocked_out_of_range: {\n        backgroundColor: core.white,\n        backgroundColor_active: core.white,\n        backgroundColor_hover: core.white,\n        borderColor: core.borderLight,\n        borderColor_active: core.borderLight,\n        borderColor_hover: core.borderLight,\n        color: core.grayLighter,\n        color_active: core.grayLighter,\n        color_hover: core.grayLighter\n      }\n    },\n    spacing: {\n      dayPickerHorizontalPadding: 9,\n      captionPaddingTop: 22,\n      captionPaddingBottom: 37,\n      inputPadding: 0,\n      displayTextPaddingVertical: undefined,\n      displayTextPaddingTop: 11,\n      displayTextPaddingBottom: 9,\n      displayTextPaddingHorizontal: undefined,\n      displayTextPaddingLeft: 11,\n      displayTextPaddingRight: 11,\n      displayTextPaddingVertical_small: undefined,\n      displayTextPaddingTop_small: 7,\n      displayTextPaddingBottom_small: 5,\n      displayTextPaddingHorizontal_small: undefined,\n      displayTextPaddingLeft_small: 7,\n      displayTextPaddingRight_small: 7\n    },\n    sizing: {\n      inputWidth: 130,\n      inputWidth_small: 97,\n      arrowWidth: 24\n    },\n    noScrollBarOnVerticalScrollable: false,\n    font: {\n      size: 14,\n      captionSize: 18,\n      input: {\n        size: 19,\n        weight: 200,\n        lineHeight: '24px',\n        size_small: 15,\n        lineHeight_small: '18px',\n        letterSpacing_small: '0.2px',\n        styleDisabled: 'italic'\n      }\n    }\n  }\n};\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = registerInterfaceWithDefaultTheme;\n\nvar _ThemedStyleSheet = _interopRequireDefault(require(\"react-with-styles/lib/ThemedStyleSheet\"));\n\nvar _DefaultTheme = _interopRequireDefault(require(\"../theme/DefaultTheme\"));\n\nfunction registerInterfaceWithDefaultTheme(reactWithStylesInterface) {\n  _ThemedStyleSheet[\"default\"].registerInterface(reactWithStylesInterface);\n\n  _ThemedStyleSheet[\"default\"].registerTheme(_DefaultTheme[\"default\"]);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = registerCSSInterfaceWithDefaultTheme;\n\nvar _reactWithStylesInterfaceCss = _interopRequireDefault(require(\"react-with-styles-interface-css\"));\n\nvar _registerInterfaceWithDefaultTheme = _interopRequireDefault(require(\"./registerInterfaceWithDefaultTheme\"));\n\nfunction registerCSSInterfaceWithDefaultTheme() {\n  (0, _registerInterfaceWithDefaultTheme[\"default\"])(_reactWithStylesInterfaceCss[\"default\"]);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _registerCSSInterfaceWithDefaultTheme = _interopRequireDefault(require(\"./utils/registerCSSInterfaceWithDefaultTheme\"));\n\n(0, _registerCSSInterfaceWithDefaultTheme[\"default\"])();", "// eslint-disable-next-line import/no-unresolved\nrequire('./lib/initialize');\n", "'use strict';\n\nvar numberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t}\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (numberIsNaN(a) && numberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.is === 'function' ? Object.is : implementation;\n};\n", "'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimObjectIs() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { is: polyfill }, {\n\t\tis: function testObjectIs() {\n\t\t\treturn Object.is !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n", "'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Object);\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n", "import is from 'object-is';\nimport has from 'has';\n\n// adapted from https://github.com/facebook/react/blob/144328fe81719e916b946e22660479e31561bb0b/packages/shared/shallowEqual.js#L36-L68\nexport default function shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (!objA || !objB || typeof objA !== 'object' || typeof objB !== 'object') {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  keysA.sort();\n  keysB.sort();\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i += 1) {\n    if (!has(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n", "function _extends() {\n  return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _assertThisInitialized(e) {\n  if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  return e;\n}\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _setPrototypeOf(t, e) {\n  return module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _setPrototypeOf(t, e);\n}\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _inheritsLoose(t, o) {\n  t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nmodule.exports = _inheritsLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n", "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n", "//! moment.js\n//! version : 2.30.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\n    var hookCallback;\n\n    function hooks() {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback(callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return (\n            input instanceof Array ||\n            Object.prototype.toString.call(input) === '[object Array]'\n        );\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return (\n            input != null &&\n            Object.prototype.toString.call(input) === '[object Object]'\n        );\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function isObjectEmpty(obj) {\n        if (Object.getOwnPropertyNames) {\n            return Object.getOwnPropertyNames(obj).length === 0;\n        } else {\n            var k;\n            for (k in obj) {\n                if (hasOwnProp(obj, k)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    function isNumber(input) {\n        return (\n            typeof input === 'number' ||\n            Object.prototype.toString.call(input) === '[object Number]'\n        );\n    }\n\n    function isDate(input) {\n        return (\n            input instanceof Date ||\n            Object.prototype.toString.call(input) === '[object Date]'\n        );\n    }\n\n    function map(arr, fn) {\n        var res = [],\n            i,\n            arrLen = arr.length;\n        for (i = 0; i < arrLen; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function createUTC(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty: false,\n            unusedTokens: [],\n            unusedInput: [],\n            overflow: -2,\n            charsLeftOver: 0,\n            nullInput: false,\n            invalidEra: null,\n            invalidMonth: null,\n            invalidFormat: false,\n            userInvalidated: false,\n            iso: false,\n            parsedDateParts: [],\n            era: null,\n            meridiem: null,\n            rfc2822: false,\n            weekdayMismatch: false,\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this),\n                len = t.length >>> 0,\n                i;\n\n            for (i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function isValid(m) {\n        var flags = null,\n            parsedParts = false,\n            isNowValid = m._d && !isNaN(m._d.getTime());\n        if (isNowValid) {\n            flags = getParsingFlags(m);\n            parsedParts = some.call(flags.parsedDateParts, function (i) {\n                return i != null;\n            });\n            isNowValid =\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidEra &&\n                !flags.invalidMonth &&\n                !flags.invalidWeekday &&\n                !flags.weekdayMismatch &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated &&\n                (!flags.meridiem || (flags.meridiem && parsedParts));\n            if (m._strict) {\n                isNowValid =\n                    isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n        }\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        } else {\n            return isNowValid;\n        }\n        return m._isValid;\n    }\n\n    function createInvalid(flags) {\n        var m = createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        } else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = (hooks.momentProperties = []),\n        updateInProgress = false;\n\n    function copyConfig(to, from) {\n        var i,\n            prop,\n            val,\n            momentPropertiesLen = momentProperties.length;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentPropertiesLen > 0) {\n            for (i = 0; i < momentPropertiesLen; i++) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        if (!this.isValid()) {\n            this._d = new Date(NaN);\n        }\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment(obj) {\n        return (\n            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)\n        );\n    }\n\n    function warn(msg) {\n        if (\n            hooks.suppressDeprecationWarnings === false &&\n            typeof console !== 'undefined' &&\n            console.warn\n        ) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (hooks.deprecationHandler != null) {\n                hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [],\n                    arg,\n                    i,\n                    key,\n                    argLen = arguments.length;\n                for (i = 0; i < argLen; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (key in arguments[0]) {\n                            if (hasOwnProp(arguments[0], key)) {\n                                arg += key + ': ' + arguments[0][key] + ', ';\n                            }\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(\n                    msg +\n                        '\\nArguments: ' +\n                        Array.prototype.slice.call(args).join('') +\n                        '\\n' +\n                        new Error().stack\n                );\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    hooks.suppressDeprecationWarnings = false;\n    hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    function set(config) {\n        var prop, i;\n        for (i in config) {\n            if (hasOwnProp(config, i)) {\n                prop = config[i];\n                if (isFunction(prop)) {\n                    this[i] = prop;\n                } else {\n                    this['_' + i] = prop;\n                }\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        this._dayOfMonthOrdinalParseLenient = new RegExp(\n            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n                '|' +\n                /\\d{1,2}/.source\n        );\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig),\n            prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (\n                hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])\n            ) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i,\n                res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay: '[Today at] LT',\n        nextDay: '[Tomorrow at] LT',\n        nextWeek: 'dddd [at] LT',\n        lastDay: '[Yesterday at] LT',\n        lastWeek: '[Last] dddd [at] LT',\n        sameElse: 'L',\n    };\n\n    function calendar(key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (\n            (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +\n            absNumber\n        );\n    }\n\n    var formattingTokens =\n            /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n        localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n        formatFunctions = {},\n        formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken(token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(\n                    func.apply(this, arguments),\n                    token\n                );\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens),\n            i,\n            length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '',\n                i;\n            for (i = 0; i < length; i++) {\n                output += isFunction(array[i])\n                    ? array[i].call(mom, format)\n                    : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] =\n            formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(\n                localFormattingTokens,\n                replaceLongDateFormatTokens\n            );\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var defaultLongDateFormat = {\n        LTS: 'h:mm:ss A',\n        LT: 'h:mm A',\n        L: 'MM/DD/YYYY',\n        LL: 'MMMM D, YYYY',\n        LLL: 'MMMM D, YYYY h:mm A',\n        LLLL: 'dddd, MMMM D, YYYY h:mm A',\n    };\n\n    function longDateFormat(key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper\n            .match(formattingTokens)\n            .map(function (tok) {\n                if (\n                    tok === 'MMMM' ||\n                    tok === 'MM' ||\n                    tok === 'DD' ||\n                    tok === 'dddd'\n                ) {\n                    return tok.slice(1);\n                }\n                return tok;\n            })\n            .join('');\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate() {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d',\n        defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n    function ordinal(number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future: 'in %s',\n        past: '%s ago',\n        s: 'a few seconds',\n        ss: '%d seconds',\n        m: 'a minute',\n        mm: '%d minutes',\n        h: 'an hour',\n        hh: '%d hours',\n        d: 'a day',\n        dd: '%d days',\n        w: 'a week',\n        ww: '%d weeks',\n        M: 'a month',\n        MM: '%d months',\n        y: 'a year',\n        yy: '%d years',\n    };\n\n    function relativeTime(number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return isFunction(output)\n            ? output(number, withoutSuffix, string, isFuture)\n            : output.replace(/%d/i, number);\n    }\n\n    function pastFuture(diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {\n        D: 'date',\n        dates: 'date',\n        date: 'date',\n        d: 'day',\n        days: 'day',\n        day: 'day',\n        e: 'weekday',\n        weekdays: 'weekday',\n        weekday: 'weekday',\n        E: 'isoWeekday',\n        isoweekdays: 'isoWeekday',\n        isoweekday: 'isoWeekday',\n        DDD: 'dayOfYear',\n        dayofyears: 'dayOfYear',\n        dayofyear: 'dayOfYear',\n        h: 'hour',\n        hours: 'hour',\n        hour: 'hour',\n        ms: 'millisecond',\n        milliseconds: 'millisecond',\n        millisecond: 'millisecond',\n        m: 'minute',\n        minutes: 'minute',\n        minute: 'minute',\n        M: 'month',\n        months: 'month',\n        month: 'month',\n        Q: 'quarter',\n        quarters: 'quarter',\n        quarter: 'quarter',\n        s: 'second',\n        seconds: 'second',\n        second: 'second',\n        gg: 'weekYear',\n        weekyears: 'weekYear',\n        weekyear: 'weekYear',\n        GG: 'isoWeekYear',\n        isoweekyears: 'isoWeekYear',\n        isoweekyear: 'isoWeekYear',\n        w: 'week',\n        weeks: 'week',\n        week: 'week',\n        W: 'isoWeek',\n        isoweeks: 'isoWeek',\n        isoweek: 'isoWeek',\n        y: 'year',\n        years: 'year',\n        year: 'year',\n    };\n\n    function normalizeUnits(units) {\n        return typeof units === 'string'\n            ? aliases[units] || aliases[units.toLowerCase()]\n            : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {\n        date: 9,\n        day: 11,\n        weekday: 11,\n        isoWeekday: 11,\n        dayOfYear: 4,\n        hour: 13,\n        millisecond: 16,\n        minute: 14,\n        month: 8,\n        quarter: 7,\n        second: 15,\n        weekYear: 1,\n        isoWeekYear: 1,\n        week: 5,\n        isoWeek: 5,\n        year: 1,\n    };\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [],\n            u;\n        for (u in unitsObj) {\n            if (hasOwnProp(unitsObj, u)) {\n                units.push({ unit: u, priority: priorities[u] });\n            }\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    var match1 = /\\d/, //       0 - 9\n        match2 = /\\d\\d/, //      00 - 99\n        match3 = /\\d{3}/, //     000 - 999\n        match4 = /\\d{4}/, //    0000 - 9999\n        match6 = /[+-]?\\d{6}/, // -999999 - 999999\n        match1to2 = /\\d\\d?/, //       0 - 99\n        match3to4 = /\\d\\d\\d\\d?/, //     999 - 9999\n        match5to6 = /\\d\\d\\d\\d\\d\\d?/, //   99999 - 999999\n        match1to3 = /\\d{1,3}/, //       0 - 999\n        match1to4 = /\\d{1,4}/, //       0 - 9999\n        match1to6 = /[+-]?\\d{1,6}/, // -999999 - 999999\n        matchUnsigned = /\\d+/, //       0 - inf\n        matchSigned = /[+-]?\\d+/, //    -inf - inf\n        matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi, // +00:00 -00:00 +0000 -0000 or Z\n        matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n        matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/, // 123456789 123456789.123\n        // any word (or two) characters or numbers including two/three word month in arabic.\n        // includes scottish gaelic two word and hyphenated months\n        matchWord =\n            /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n        match1to2NoLeadingZero = /^[1-9]\\d?/, //         1-99\n        match1to2HasZero = /^([1-9]\\d|\\d)/, //           0-99\n        regexes;\n\n    regexes = {};\n\n    function addRegexToken(token, regex, strictRegex) {\n        regexes[token] = isFunction(regex)\n            ? regex\n            : function (isStrict, localeData) {\n                  return isStrict && strictRegex ? strictRegex : regex;\n              };\n    }\n\n    function getParseRegexForToken(token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(\n            s\n                .replace('\\\\', '')\n                .replace(\n                    /\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,\n                    function (matched, p1, p2, p3, p4) {\n                        return p1 || p2 || p3 || p4;\n                    }\n                )\n        );\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    function absFloor(number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    var tokens = {};\n\n    function addParseToken(token, callback) {\n        var i,\n            func = callback,\n            tokenLen;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (isNumber(callback)) {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        tokenLen = token.length;\n        for (i = 0; i < tokenLen; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken(token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    var YEAR = 0,\n        MONTH = 1,\n        DATE = 2,\n        HOUR = 3,\n        MINUTE = 4,\n        SECOND = 5,\n        MILLISECOND = 6,\n        WEEK = 7,\n        WEEKDAY = 8;\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY', 4], 0, 'year');\n    addFormatToken(0, ['YYYYY', 5], 0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // PARSING\n\n    addRegexToken('Y', matchSigned);\n    addRegexToken('YY', match1to2, match2);\n    addRegexToken('YYYY', match1to4, match4);\n    addRegexToken('YYYYY', match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] =\n            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    // HOOKS\n\n    hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear() {\n        return isLeapYear(this.year());\n    }\n\n    function makeGetSet(unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                set$1(this, unit, value);\n                hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get(this, unit);\n            }\n        };\n    }\n\n    function get(mom, unit) {\n        if (!mom.isValid()) {\n            return NaN;\n        }\n\n        var d = mom._d,\n            isUTC = mom._isUTC;\n\n        switch (unit) {\n            case 'Milliseconds':\n                return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();\n            case 'Seconds':\n                return isUTC ? d.getUTCSeconds() : d.getSeconds();\n            case 'Minutes':\n                return isUTC ? d.getUTCMinutes() : d.getMinutes();\n            case 'Hours':\n                return isUTC ? d.getUTCHours() : d.getHours();\n            case 'Date':\n                return isUTC ? d.getUTCDate() : d.getDate();\n            case 'Day':\n                return isUTC ? d.getUTCDay() : d.getDay();\n            case 'Month':\n                return isUTC ? d.getUTCMonth() : d.getMonth();\n            case 'FullYear':\n                return isUTC ? d.getUTCFullYear() : d.getFullYear();\n            default:\n                return NaN; // Just in case\n        }\n    }\n\n    function set$1(mom, unit, value) {\n        var d, isUTC, year, month, date;\n\n        if (!mom.isValid() || isNaN(value)) {\n            return;\n        }\n\n        d = mom._d;\n        isUTC = mom._isUTC;\n\n        switch (unit) {\n            case 'Milliseconds':\n                return void (isUTC\n                    ? d.setUTCMilliseconds(value)\n                    : d.setMilliseconds(value));\n            case 'Seconds':\n                return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));\n            case 'Minutes':\n                return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));\n            case 'Hours':\n                return void (isUTC ? d.setUTCHours(value) : d.setHours(value));\n            case 'Date':\n                return void (isUTC ? d.setUTCDate(value) : d.setDate(value));\n            // case 'Day': // Not real\n            //    return void (isUTC ? d.setUTCDay(value) : d.setDay(value));\n            // case 'Month': // Not used because we need to pass two variables\n            //     return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));\n            case 'FullYear':\n                break; // See below ...\n            default:\n                return; // Just in case\n        }\n\n        year = value;\n        month = mom.month();\n        date = mom.date();\n        date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;\n        void (isUTC\n            ? d.setUTCFullYear(year, month, date)\n            : d.setFullYear(year, month, date));\n    }\n\n    // MOMENTS\n\n    function stringGet(units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n    function stringSet(units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units),\n                i,\n                prioritizedLen = prioritized.length;\n            for (i = 0; i < prioritizedLen; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function mod(n, x) {\n        return ((n % x) + x) % x;\n    }\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        if (isNaN(year) || isNaN(month)) {\n            return NaN;\n        }\n        var modMonth = mod(month, 12);\n        year += (month - modMonth) / 12;\n        return modMonth === 1\n            ? isLeapYear(year)\n                ? 29\n                : 28\n            : 31 - ((modMonth % 7) % 2);\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // PARSING\n\n    addRegexToken('M', match1to2, match1to2NoLeadingZero);\n    addRegexToken('MM', match1to2, match2);\n    addRegexToken('MMM', function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var defaultLocaleMonths =\n            'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n                '_'\n            ),\n        defaultLocaleMonthsShort =\n            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n        defaultMonthsShortRegex = matchWord,\n        defaultMonthsRegex = matchWord;\n\n    function localeMonths(m, format) {\n        if (!m) {\n            return isArray(this._months)\n                ? this._months\n                : this._months['standalone'];\n        }\n        return isArray(this._months)\n            ? this._months[m.month()]\n            : this._months[\n                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)\n                      ? 'format'\n                      : 'standalone'\n              ][m.month()];\n    }\n\n    function localeMonthsShort(m, format) {\n        if (!m) {\n            return isArray(this._monthsShort)\n                ? this._monthsShort\n                : this._monthsShort['standalone'];\n        }\n        return isArray(this._monthsShort)\n            ? this._monthsShort[m.month()]\n            : this._monthsShort[\n                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'\n              ][m.month()];\n    }\n\n    function handleStrictParse(monthName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse(monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp(\n                    '^' + this.months(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n                this._shortMonthsParse[i] = new RegExp(\n                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex =\n                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'MMMM' &&\n                this._longMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'MMM' &&\n                this._shortMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth(mom, value) {\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (!isNumber(value)) {\n                    return mom;\n                }\n            }\n        }\n\n        var month = value,\n            date = mom.date();\n\n        date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));\n        void (mom._isUTC\n            ? mom._d.setUTCMonth(month, date)\n            : mom._d.setMonth(month, date));\n        return mom;\n    }\n\n    function getSetMonth(value) {\n        if (value != null) {\n            setMonth(this, value);\n            hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth() {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    function monthsShortRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict\n                ? this._monthsShortStrictRegex\n                : this._monthsShortRegex;\n        }\n    }\n\n    function monthsRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict\n                ? this._monthsStrictRegex\n                : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            shortP,\n            longP;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            shortP = regexEscape(this.monthsShort(mom, ''));\n            longP = regexEscape(this.months(mom, ''));\n            shortPieces.push(shortP);\n            longPieces.push(longP);\n            mixedPieces.push(longP);\n            mixedPieces.push(shortP);\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._monthsShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    function createDate(y, m, d, h, M, s, ms) {\n        // can't just apply() to create a date:\n        // https://stackoverflow.com/q/181348\n        var date;\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            date = new Date(y + 400, m, d, h, M, s, ms);\n            if (isFinite(date.getFullYear())) {\n                date.setFullYear(y);\n            }\n        } else {\n            date = new Date(y, m, d, h, M, s, ms);\n        }\n\n        return date;\n    }\n\n    function createUTCDate(y) {\n        var date, args;\n        // the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            args = Array.prototype.slice.call(arguments);\n            // preserve leap years using a full 400 year cycle, then reset\n            args[0] = y + 400;\n            date = new Date(Date.UTC.apply(null, args));\n            if (isFinite(date.getUTCFullYear())) {\n                date.setUTCFullYear(y);\n            }\n        } else {\n            date = new Date(Date.UTC.apply(null, arguments));\n        }\n\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear,\n            resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear,\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek,\n            resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear,\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // PARSING\n\n    addRegexToken('w', match1to2, match1to2NoLeadingZero);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W', match1to2, match1to2NoLeadingZero);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(\n        ['w', 'ww', 'W', 'WW'],\n        function (input, week, config, token) {\n            week[token.substr(0, 1)] = toInt(input);\n        }\n    );\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek(mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6, // The week that contains Jan 6th is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek() {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear() {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek(input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek(input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // PARSING\n\n    addRegexToken('d', match1to2);\n    addRegexToken('e', match1to2);\n    addRegexToken('E', match1to2);\n    addRegexToken('dd', function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd', function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd', function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n    function shiftWeekdays(ws, n) {\n        return ws.slice(n, 7).concat(ws.slice(0, n));\n    }\n\n    var defaultLocaleWeekdays =\n            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        defaultWeekdaysRegex = matchWord,\n        defaultWeekdaysShortRegex = matchWord,\n        defaultWeekdaysMinRegex = matchWord;\n\n    function localeWeekdays(m, format) {\n        var weekdays = isArray(this._weekdays)\n            ? this._weekdays\n            : this._weekdays[\n                  m && m !== true && this._weekdays.isFormat.test(format)\n                      ? 'format'\n                      : 'standalone'\n              ];\n        return m === true\n            ? shiftWeekdays(weekdays, this._week.dow)\n            : m\n              ? weekdays[m.day()]\n              : weekdays;\n    }\n\n    function localeWeekdaysShort(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysShort, this._week.dow)\n            : m\n              ? this._weekdaysShort[m.day()]\n              : this._weekdaysShort;\n    }\n\n    function localeWeekdaysMin(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysMin, this._week.dow)\n            : m\n              ? this._weekdaysMin[m.day()]\n              : this._weekdaysMin;\n    }\n\n    function handleStrictParse$1(weekdayName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse(weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return handleStrictParse$1.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._shortWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._minWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n            }\n            if (!this._weekdaysParse[i]) {\n                regex =\n                    '^' +\n                    this.weekdays(mom, '') +\n                    '|^' +\n                    this.weekdaysShort(mom, '') +\n                    '|^' +\n                    this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'dddd' &&\n                this._fullWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'ddd' &&\n                this._shortWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'dd' &&\n                this._minWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        var day = get(this, 'Day');\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    function weekdaysRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict\n                ? this._weekdaysStrictRegex\n                : this._weekdaysRegex;\n        }\n    }\n\n    function weekdaysShortRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict\n                ? this._weekdaysShortStrictRegex\n                : this._weekdaysShortRegex;\n        }\n    }\n\n    function weekdaysMinRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict\n                ? this._weekdaysMinStrictRegex\n                : this._weekdaysMinRegex;\n        }\n    }\n\n    function computeWeekdaysParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [],\n            shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            minp,\n            shortp,\n            longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, 1]).day(i);\n            minp = regexEscape(this.weekdaysMin(mom, ''));\n            shortp = regexEscape(this.weekdaysShort(mom, ''));\n            longp = regexEscape(this.weekdays(mom, ''));\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysMinStrictRegex = new RegExp(\n            '^(' + minPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return (\n            '' +\n            hFormat.apply(this) +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return (\n            '' +\n            this.hours() +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    function meridiem(token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(\n                this.hours(),\n                this.minutes(),\n                lowercase\n            );\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // PARSING\n\n    function matchMeridiem(isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a', matchMeridiem);\n    addRegexToken('A', matchMeridiem);\n    addRegexToken('H', match1to2, match1to2HasZero);\n    addRegexToken('h', match1to2, match1to2NoLeadingZero);\n    addRegexToken('k', match1to2, match1to2NoLeadingZero);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n    addRegexToken('kk', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['k', 'kk'], function (input, array, config) {\n        var kInput = toInt(input);\n        array[HOUR] = kInput === 24 ? 0 : kInput;\n    });\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM(input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return (input + '').toLowerCase().charAt(0) === 'p';\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n        // Setting the hour should keep the time, because the user explicitly\n        // specified which hour they want. So trying to maintain the same hour (in\n        // a new timezone) makes sense. Adding/subtracting hours does not follow\n        // this rule.\n        getSetHour = makeGetSet('Hours', true);\n\n    function localeMeridiem(hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse,\n    };\n\n    // internal storage for locale config files\n    var locales = {},\n        localeFamilies = {},\n        globalLocale;\n\n    function commonPrefix(arr1, arr2) {\n        var i,\n            minl = Math.min(arr1.length, arr2.length);\n        for (i = 0; i < minl; i += 1) {\n            if (arr1[i] !== arr2[i]) {\n                return i;\n            }\n        }\n        return minl;\n    }\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0,\n            j,\n            next,\n            locale,\n            split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (\n                    next &&\n                    next.length >= j &&\n                    commonPrefix(split, next) >= j - 1\n                ) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return globalLocale;\n    }\n\n    function isLocaleNameSane(name) {\n        // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n        // Ensure name is available and function returns boolean\n        return !!(name && name.match('^[^/\\\\\\\\]*$'));\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null,\n            aliasedRequire;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (\n            locales[name] === undefined &&\n            typeof module !== 'undefined' &&\n            module &&\n            module.exports &&\n            isLocaleNameSane(name)\n        ) {\n            try {\n                oldLocale = globalLocale._abbr;\n                aliasedRequire = require;\n                aliasedRequire('./locale/' + name);\n                getSetGlobalLocale(oldLocale);\n            } catch (e) {\n                // mark as not found to avoid repeating expensive file require call causing high CPU\n                // when trying to find en-US, en_US, en-us for every format call\n                locales[name] = null; // null means not found\n            }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function getSetGlobalLocale(key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = getLocale(key);\n            } else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            } else {\n                if (typeof console !== 'undefined' && console.warn) {\n                    //warn user if arguments are passed but the locale could not be set\n                    console.warn(\n                        'Locale ' + key + ' not found. Did you forget to load it?'\n                    );\n                }\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale(name, config) {\n        if (config !== null) {\n            var locale,\n                parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple(\n                    'defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'\n                );\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    locale = loadLocale(config.parentLocale);\n                    if (locale != null) {\n                        parentConfig = locale._config;\n                    } else {\n                        if (!localeFamilies[config.parentLocale]) {\n                            localeFamilies[config.parentLocale] = [];\n                        }\n                        localeFamilies[config.parentLocale].push({\n                            name: name,\n                            config: config,\n                        });\n                        return null;\n                    }\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            if (localeFamilies[name]) {\n                localeFamilies[name].forEach(function (x) {\n                    defineLocale(x.name, x.config);\n                });\n            }\n\n            // backwards compat for now: also set the locale\n            // make sure we set the locale AFTER all child locales have been\n            // created, so we won't end up with the child locale set.\n            getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale,\n                tmpLocale,\n                parentConfig = baseConfig;\n\n            if (locales[name] != null && locales[name].parentLocale != null) {\n                // Update existing child locale in-place to avoid memory-leaks\n                locales[name].set(mergeConfigs(locales[name]._config, config));\n            } else {\n                // MERGE\n                tmpLocale = loadLocale(name);\n                if (tmpLocale != null) {\n                    parentConfig = tmpLocale._config;\n                }\n                config = mergeConfigs(parentConfig, config);\n                if (tmpLocale == null) {\n                    // updateLocale is called for creating a new locale\n                    // Set abbr so it will have a name (getters return\n                    // undefined otherwise).\n                    config.abbr = name;\n                }\n                locale = new Locale(config);\n                locale.parentLocale = locales[name];\n                locales[name] = locale;\n            }\n\n            // backwards compat for now: also set the locale\n            getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                    if (name === getSetGlobalLocale()) {\n                        getSetGlobalLocale(name);\n                    }\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function getLocale(key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow(m) {\n        var overflow,\n            a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH] < 0 || a[MONTH] > 11\n                    ? MONTH\n                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])\n                      ? DATE\n                      : a[HOUR] < 0 ||\n                          a[HOUR] > 24 ||\n                          (a[HOUR] === 24 &&\n                              (a[MINUTE] !== 0 ||\n                                  a[SECOND] !== 0 ||\n                                  a[MILLISECOND] !== 0))\n                        ? HOUR\n                        : a[MINUTE] < 0 || a[MINUTE] > 59\n                          ? MINUTE\n                          : a[SECOND] < 0 || a[SECOND] > 59\n                            ? SECOND\n                            : a[MILLISECOND] < 0 || a[MILLISECOND] > 999\n                              ? MILLISECOND\n                              : -1;\n\n            if (\n                getParsingFlags(m)._overflowDayOfYear &&\n                (overflow < YEAR || overflow > DATE)\n            ) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        basicIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n        isoDates = [\n            ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n            ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n            ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n            ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n            ['YYYY-DDD', /\\d{4}-\\d{3}/],\n            ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n            ['YYYYYYMMDD', /[+-]\\d{10}/],\n            ['YYYYMMDD', /\\d{8}/],\n            ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n            ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n            ['YYYYDDD', /\\d{7}/],\n            ['YYYYMM', /\\d{6}/, false],\n            ['YYYY', /\\d{4}/, false],\n        ],\n        // iso time formats and regexes\n        isoTimes = [\n            ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n            ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n            ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n            ['HH:mm', /\\d\\d:\\d\\d/],\n            ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n            ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n            ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n            ['HHmm', /\\d\\d\\d\\d/],\n            ['HH', /\\d\\d/],\n        ],\n        aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n        rfc2822 =\n            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n        obsOffsets = {\n            UT: 0,\n            GMT: 0,\n            EDT: -4 * 60,\n            EST: -5 * 60,\n            CDT: -5 * 60,\n            CST: -6 * 60,\n            MDT: -6 * 60,\n            MST: -7 * 60,\n            PDT: -7 * 60,\n            PST: -8 * 60,\n        };\n\n    // date from iso format\n    function configFromISO(config) {\n        var i,\n            l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime,\n            dateFormat,\n            timeFormat,\n            tzFormat,\n            isoDatesLen = isoDates.length,\n            isoTimesLen = isoTimes.length;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n            for (i = 0, l = isoDatesLen; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimesLen; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    function extractFromRFC2822Strings(\n        yearStr,\n        monthStr,\n        dayStr,\n        hourStr,\n        minuteStr,\n        secondStr\n    ) {\n        var result = [\n            untruncateYear(yearStr),\n            defaultLocaleMonthsShort.indexOf(monthStr),\n            parseInt(dayStr, 10),\n            parseInt(hourStr, 10),\n            parseInt(minuteStr, 10),\n        ];\n\n        if (secondStr) {\n            result.push(parseInt(secondStr, 10));\n        }\n\n        return result;\n    }\n\n    function untruncateYear(yearStr) {\n        var year = parseInt(yearStr, 10);\n        if (year <= 49) {\n            return 2000 + year;\n        } else if (year <= 999) {\n            return 1900 + year;\n        }\n        return year;\n    }\n\n    function preprocessRFC2822(s) {\n        // Remove comments and folding whitespace and replace multiple-spaces with a single space\n        return s\n            .replace(/\\([^()]*\\)|[\\n\\t]/g, ' ')\n            .replace(/(\\s\\s+)/g, ' ')\n            .replace(/^\\s\\s*/, '')\n            .replace(/\\s\\s*$/, '');\n    }\n\n    function checkWeekday(weekdayStr, parsedInput, config) {\n        if (weekdayStr) {\n            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n                weekdayActual = new Date(\n                    parsedInput[0],\n                    parsedInput[1],\n                    parsedInput[2]\n                ).getDay();\n            if (weekdayProvided !== weekdayActual) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function calculateOffset(obsOffset, militaryOffset, numOffset) {\n        if (obsOffset) {\n            return obsOffsets[obsOffset];\n        } else if (militaryOffset) {\n            // the only allowed military tz is Z\n            return 0;\n        } else {\n            var hm = parseInt(numOffset, 10),\n                m = hm % 100,\n                h = (hm - m) / 100;\n            return h * 60 + m;\n        }\n    }\n\n    // date and time from ref 2822 format\n    function configFromRFC2822(config) {\n        var match = rfc2822.exec(preprocessRFC2822(config._i)),\n            parsedArray;\n        if (match) {\n            parsedArray = extractFromRFC2822Strings(\n                match[4],\n                match[3],\n                match[2],\n                match[5],\n                match[6],\n                match[7]\n            );\n            if (!checkWeekday(match[1], parsedArray, config)) {\n                return;\n            }\n\n            config._a = parsedArray;\n            config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n            config._d = createUTCDate.apply(null, config._a);\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n            getParsingFlags(config).rfc2822 = true;\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        configFromRFC2822(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        if (config._strict) {\n            config._isValid = false;\n        } else {\n            // Final attempt, use Input Fallback\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(hooks.now());\n        if (config._useUTC) {\n            return [\n                nowValue.getUTCFullYear(),\n                nowValue.getUTCMonth(),\n                nowValue.getUTCDate(),\n            ];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray(config) {\n        var i,\n            date,\n            input = [],\n            currentDate,\n            expectedWeekday,\n            yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear != null) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (\n                config._dayOfYear > daysInYear(yearToUse) ||\n                config._dayOfYear === 0\n            ) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] =\n                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (\n            config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0\n        ) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(\n            null,\n            input\n        );\n        expectedWeekday = config._useUTC\n            ? config._d.getUTCDay()\n            : config._d.getDay();\n\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n\n        // check for mismatching day of week\n        if (\n            config._w &&\n            typeof config._w.d !== 'undefined' &&\n            config._w.d !== expectedWeekday\n        ) {\n            getParsingFlags(config).weekdayMismatch = true;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(\n                w.GG,\n                config._a[YEAR],\n                weekOfYear(createLocal(), 1, 4).year\n            );\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            curWeek = weekOfYear(createLocal(), dow, doy);\n\n            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n            // Default to current week.\n            week = defaults(w.w, curWeek.week);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from beginning of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to beginning of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    hooks.ISO_8601 = function () {};\n\n    // constant that refers to the RFC 2822 form\n    hooks.RFC_2822 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n        if (config._f === hooks.RFC_2822) {\n            configFromRFC2822(config);\n            return;\n        }\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i,\n            parsedInput,\n            tokens,\n            token,\n            skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0,\n            era,\n            tokenLen;\n\n        tokens =\n            expandFormat(config._f, config._locale).match(formattingTokens) || [];\n        tokenLen = tokens.length;\n        for (i = 0; i < tokenLen; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) ||\n                [])[0];\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(\n                    string.indexOf(parsedInput) + parsedInput.length\n                );\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                } else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            } else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver =\n            stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (\n            config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0\n        ) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(\n            config._locale,\n            config._a[HOUR],\n            config._meridiem\n        );\n\n        // handle era\n        era = getParsingFlags(config).era;\n        if (era !== null) {\n            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n        }\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n    function meridiemFixWrap(locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n            scoreToBeat,\n            i,\n            currentScore,\n            validFormatFound,\n            bestFormatIsValid = false,\n            configfLen = config._f.length;\n\n        if (configfLen === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < configfLen; i++) {\n            currentScore = 0;\n            validFormatFound = false;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (isValid(tempConfig)) {\n                validFormatFound = true;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (!bestFormatIsValid) {\n                if (\n                    scoreToBeat == null ||\n                    currentScore < scoreToBeat ||\n                    validFormatFound\n                ) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                    if (validFormatFound) {\n                        bestFormatIsValid = true;\n                    }\n                }\n            } else {\n                if (currentScore < scoreToBeat) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                }\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i),\n            dayOrDate = i.day === undefined ? i.date : i.day;\n        config._a = map(\n            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],\n            function (obj) {\n                return obj && parseInt(obj, 10);\n            }\n        );\n\n        configFromArray(config);\n    }\n\n    function createFromConfig(config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig(config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return createInvalid({ nullInput: true });\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else {\n            configFromInput(config);\n        }\n\n        if (!isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (isUndefined(input)) {\n            config._d = new Date(hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (isObject(input)) {\n            configFromObject(config);\n        } else if (isNumber(input)) {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC(input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (format === true || format === false) {\n            strict = format;\n            format = undefined;\n        }\n\n        if (locale === true || locale === false) {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if (\n            (isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)\n        ) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function createLocal(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other < this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        ),\n        prototypeMax = deprecate(\n            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other > this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +new Date();\n    };\n\n    var ordering = [\n        'year',\n        'quarter',\n        'month',\n        'week',\n        'day',\n        'hour',\n        'minute',\n        'second',\n        'millisecond',\n    ];\n\n    function isDurationValid(m) {\n        var key,\n            unitHasDecimal = false,\n            i,\n            orderLen = ordering.length;\n        for (key in m) {\n            if (\n                hasOwnProp(m, key) &&\n                !(\n                    indexOf.call(ordering, key) !== -1 &&\n                    (m[key] == null || !isNaN(m[key]))\n                )\n            ) {\n                return false;\n            }\n        }\n\n        for (i = 0; i < orderLen; ++i) {\n            if (m[ordering[i]]) {\n                if (unitHasDecimal) {\n                    return false; // only allow non-integers for smallest unit\n                }\n                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                    unitHasDecimal = true;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    function isValid$1() {\n        return this._isValid;\n    }\n\n    function createInvalid$1() {\n        return createDuration(NaN);\n    }\n\n    function Duration(duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        this._isValid = isDurationValid(normalizedInput);\n\n        // representation for dateAddRemove\n        this._milliseconds =\n            +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days + weeks * 7;\n        // It is impossible to translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months + quarters * 3 + years * 12;\n\n        this._data = {};\n\n        this._locale = getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration(obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound(number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if (\n                (dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))\n            ) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    // FORMATTING\n\n    function offset(token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset(),\n                sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return (\n                sign +\n                zeroFill(~~(offset / 60), 2) +\n                separator +\n                zeroFill(~~offset % 60, 2)\n            );\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z', matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = (string || '').match(matcher),\n            chunk,\n            parts,\n            minutes;\n\n        if (matches === null) {\n            return null;\n        }\n\n        chunk = matches[matches.length - 1] || [];\n        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff =\n                (isMoment(input) || isDate(input)\n                    ? input.valueOf()\n                    : createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return createLocal(input).local();\n        }\n    }\n\n    function getDateOffset(m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset());\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset(input, keepLocalTime, keepMinutes) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n                if (input === null) {\n                    return this;\n                }\n            } else if (Math.abs(input) < 16 && !keepMinutes) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    addSubtract(\n                        this,\n                        createDuration(input - offset, 'm'),\n                        1,\n                        false\n                    );\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone(input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC(keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal(keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset() {\n        if (this._tzm != null) {\n            this.utcOffset(this._tzm, false, true);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n            if (tZone != null) {\n                this.utcOffset(tZone);\n            } else {\n                this.utcOffset(0, true);\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset(input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime() {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted() {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {},\n            other;\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n            this._isDSTShifted =\n                this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal() {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset() {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc() {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n        // and further modified to allow for strings containing both week and day\n        isoRegex =\n            /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n    function createDuration(input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms: input._milliseconds,\n                d: input._days,\n                M: input._months,\n            };\n        } else if (isNumber(input) || !isNaN(+input)) {\n            duration = {};\n            if (key) {\n                duration[key] = +input;\n            } else {\n                duration.milliseconds = +input;\n            }\n        } else if ((match = aspNetRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: 0,\n                d: toInt(match[DATE]) * sign,\n                h: toInt(match[HOUR]) * sign,\n                m: toInt(match[MINUTE]) * sign,\n                s: toInt(match[SECOND]) * sign,\n                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match\n            };\n        } else if ((match = isoRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: parseIso(match[2], sign),\n                M: parseIso(match[3], sign),\n                w: parseIso(match[4], sign),\n                d: parseIso(match[5], sign),\n                h: parseIso(match[6], sign),\n                m: parseIso(match[7], sign),\n                s: parseIso(match[8], sign),\n            };\n        } else if (duration == null) {\n            // checks for null or undefined\n            duration = {};\n        } else if (\n            typeof duration === 'object' &&\n            ('from' in duration || 'to' in duration)\n        ) {\n            diffRes = momentsDifference(\n                createLocal(duration.from),\n                createLocal(duration.to)\n            );\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n            ret._isValid = input._isValid;\n        }\n\n        return ret;\n    }\n\n    createDuration.fn = Duration.prototype;\n    createDuration.invalid = createInvalid$1;\n\n    function parseIso(inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {};\n\n        res.months =\n            other.month() - base.month() + (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +base.clone().add(res.months, 'M');\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return { milliseconds: 0, months: 0 };\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(\n                    name,\n                    'moment().' +\n                        name +\n                        '(period, number) is deprecated. Please use moment().' +\n                        name +\n                        '(number, period). ' +\n                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'\n                );\n                tmp = val;\n                val = period;\n                period = tmp;\n            }\n\n            dur = createDuration(val, period);\n            addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function addSubtract(mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (months) {\n            setMonth(mom, get(mom, 'Month') + months * isAdding);\n        }\n        if (days) {\n            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n        }\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (updateOffset) {\n            hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add = createAdder(1, 'add'),\n        subtract = createAdder(-1, 'subtract');\n\n    function isString(input) {\n        return typeof input === 'string' || input instanceof String;\n    }\n\n    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n    function isMomentInput(input) {\n        return (\n            isMoment(input) ||\n            isDate(input) ||\n            isString(input) ||\n            isNumber(input) ||\n            isNumberOrStringArray(input) ||\n            isMomentInputObject(input) ||\n            input === null ||\n            input === undefined\n        );\n    }\n\n    function isMomentInputObject(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'years',\n                'year',\n                'y',\n                'months',\n                'month',\n                'M',\n                'days',\n                'day',\n                'd',\n                'dates',\n                'date',\n                'D',\n                'hours',\n                'hour',\n                'h',\n                'minutes',\n                'minute',\n                'm',\n                'seconds',\n                'second',\n                's',\n                'milliseconds',\n                'millisecond',\n                'ms',\n            ],\n            i,\n            property,\n            propertyLen = properties.length;\n\n        for (i = 0; i < propertyLen; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function isNumberOrStringArray(input) {\n        var arrayTest = isArray(input),\n            dataTypeTest = false;\n        if (arrayTest) {\n            dataTypeTest =\n                input.filter(function (item) {\n                    return !isNumber(item) && isString(input);\n                }).length === 0;\n        }\n        return arrayTest && dataTypeTest;\n    }\n\n    function isCalendarSpec(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'sameDay',\n                'nextDay',\n                'lastDay',\n                'nextWeek',\n                'lastWeek',\n                'sameElse',\n            ],\n            i,\n            property;\n\n        for (i = 0; i < properties.length; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6\n            ? 'sameElse'\n            : diff < -1\n              ? 'lastWeek'\n              : diff < 0\n                ? 'lastDay'\n                : diff < 1\n                  ? 'sameDay'\n                  : diff < 2\n                    ? 'nextDay'\n                    : diff < 7\n                      ? 'nextWeek'\n                      : 'sameElse';\n    }\n\n    function calendar$1(time, formats) {\n        // Support for single parameter, formats only overload to the calendar function\n        if (arguments.length === 1) {\n            if (!arguments[0]) {\n                time = undefined;\n                formats = undefined;\n            } else if (isMomentInput(arguments[0])) {\n                time = arguments[0];\n                formats = undefined;\n            } else if (isCalendarSpec(arguments[0])) {\n                formats = arguments[0];\n                time = undefined;\n            }\n        }\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = hooks.calendarFormat(this, sod) || 'sameElse',\n            output =\n                formats &&\n                (isFunction(formats[format])\n                    ? formats[format].call(this, now)\n                    : formats[format]);\n\n        return this.format(\n            output || this.localeData().calendar(format, this, createLocal(now))\n        );\n    }\n\n    function clone() {\n        return new Moment(this);\n    }\n\n    function isAfter(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween(from, to, units, inclusivity) {\n        var localFrom = isMoment(from) ? from : createLocal(from),\n            localTo = isMoment(to) ? to : createLocal(to);\n        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n            return false;\n        }\n        inclusivity = inclusivity || '()';\n        return (\n            (inclusivity[0] === '('\n                ? this.isAfter(localFrom, units)\n                : !this.isBefore(localFrom, units)) &&\n            (inclusivity[1] === ')'\n                ? this.isBefore(localTo, units)\n                : !this.isAfter(localTo, units))\n        );\n    }\n\n    function isSame(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return (\n                this.clone().startOf(units).valueOf() <= inputMs &&\n                inputMs <= this.clone().endOf(units).valueOf()\n            );\n        }\n    }\n\n    function isSameOrAfter(input, units) {\n        return this.isSame(input, units) || this.isAfter(input, units);\n    }\n\n    function isSameOrBefore(input, units) {\n        return this.isSame(input, units) || this.isBefore(input, units);\n    }\n\n    function diff(input, units, asFloat) {\n        var that, zoneDelta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        switch (units) {\n            case 'year':\n                output = monthDiff(this, that) / 12;\n                break;\n            case 'month':\n                output = monthDiff(this, that);\n                break;\n            case 'quarter':\n                output = monthDiff(this, that) / 3;\n                break;\n            case 'second':\n                output = (this - that) / 1e3;\n                break; // 1000\n            case 'minute':\n                output = (this - that) / 6e4;\n                break; // 1000 * 60\n            case 'hour':\n                output = (this - that) / 36e5;\n                break; // 1000 * 60 * 60\n            case 'day':\n                output = (this - that - zoneDelta) / 864e5;\n                break; // 1000 * 60 * 60 * 24, negate dst\n            case 'week':\n                output = (this - that - zoneDelta) / 6048e5;\n                break; // 1000 * 60 * 60 * 24 * 7, negate dst\n            default:\n                output = this - that;\n        }\n\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff(a, b) {\n        if (a.date() < b.date()) {\n            // end-of-month calculations work correct when the start month has more\n            // days than the end month.\n            return -monthDiff(b, a);\n        }\n        // difference in months\n        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2,\n            adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString() {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function toISOString(keepOffset) {\n        if (!this.isValid()) {\n            return null;\n        }\n        var utc = keepOffset !== true,\n            m = utc ? this.clone().utc() : this;\n        if (m.year() < 0 || m.year() > 9999) {\n            return formatMoment(\n                m,\n                utc\n                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\n                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'\n            );\n        }\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            if (utc) {\n                return this.toDate().toISOString();\n            } else {\n                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)\n                    .toISOString()\n                    .replace('Z', formatMoment(m, 'Z'));\n            }\n        }\n        return formatMoment(\n            m,\n            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'\n        );\n    }\n\n    /**\n     * Return a human readable representation of a moment that can\n     * also be evaluated to get a new moment which is the same\n     *\n     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n     */\n    function inspect() {\n        if (!this.isValid()) {\n            return 'moment.invalid(/* ' + this._i + ' */)';\n        }\n        var func = 'moment',\n            zone = '',\n            prefix,\n            year,\n            datetime,\n            suffix;\n        if (!this.isLocal()) {\n            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n            zone = 'Z';\n        }\n        prefix = '[' + func + '(\"]';\n        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n        datetime = '-MM-DD[T]HH:mm:ss.SSS';\n        suffix = zone + '[\")]';\n\n        return this.format(prefix + year + datetime + suffix);\n    }\n\n    function format(inputString) {\n        if (!inputString) {\n            inputString = this.isUtc()\n                ? hooks.defaultFormatUtc\n                : hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ to: this, from: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow(withoutSuffix) {\n        return this.from(createLocal(), withoutSuffix);\n    }\n\n    function to(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ from: this, to: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow(withoutSuffix) {\n        return this.to(createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale(key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData() {\n        return this._locale;\n    }\n\n    var MS_PER_SECOND = 1000,\n        MS_PER_MINUTE = 60 * MS_PER_SECOND,\n        MS_PER_HOUR = 60 * MS_PER_MINUTE,\n        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n    // actual modulo - handles negative numbers (for dates before 1970):\n    function mod$1(dividend, divisor) {\n        return ((dividend % divisor) + divisor) % divisor;\n    }\n\n    function localStartOfDate(y, m, d) {\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return new Date(y, m, d).valueOf();\n        }\n    }\n\n    function utcStartOfDate(y, m, d) {\n        // Date.UTC remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return Date.UTC(y, m, d);\n        }\n    }\n\n    function startOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year(), 0, 1);\n                break;\n            case 'quarter':\n                time = startOfDate(\n                    this.year(),\n                    this.month() - (this.month() % 3),\n                    1\n                );\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month(), 1);\n                break;\n            case 'week':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - this.weekday()\n                );\n                break;\n            case 'isoWeek':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - (this.isoWeekday() - 1)\n                );\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date());\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time -= mod$1(\n                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                    MS_PER_HOUR\n                );\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_MINUTE);\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_SECOND);\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function endOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year() + 1, 0, 1) - 1;\n                break;\n            case 'quarter':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month() - (this.month() % 3) + 3,\n                        1\n                    ) - 1;\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n                break;\n            case 'week':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - this.weekday() + 7\n                    ) - 1;\n                break;\n            case 'isoWeek':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - (this.isoWeekday() - 1) + 7\n                    ) - 1;\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time +=\n                    MS_PER_HOUR -\n                    mod$1(\n                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                        MS_PER_HOUR\n                    ) -\n                    1;\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function valueOf() {\n        return this._d.valueOf() - (this._offset || 0) * 60000;\n    }\n\n    function unix() {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate() {\n        return new Date(this.valueOf());\n    }\n\n    function toArray() {\n        var m = this;\n        return [\n            m.year(),\n            m.month(),\n            m.date(),\n            m.hour(),\n            m.minute(),\n            m.second(),\n            m.millisecond(),\n        ];\n    }\n\n    function toObject() {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds(),\n        };\n    }\n\n    function toJSON() {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function isValid$2() {\n        return isValid(this);\n    }\n\n    function parsingFlags() {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt() {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict,\n        };\n    }\n\n    addFormatToken('N', 0, 0, 'eraAbbr');\n    addFormatToken('NN', 0, 0, 'eraAbbr');\n    addFormatToken('NNN', 0, 0, 'eraAbbr');\n    addFormatToken('NNNN', 0, 0, 'eraName');\n    addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n\n    addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n    addFormatToken('y', ['yy', 2], 0, 'eraYear');\n    addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n\n    addRegexToken('N', matchEraAbbr);\n    addRegexToken('NN', matchEraAbbr);\n    addRegexToken('NNN', matchEraAbbr);\n    addRegexToken('NNNN', matchEraName);\n    addRegexToken('NNNNN', matchEraNarrow);\n\n    addParseToken(\n        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],\n        function (input, array, config, token) {\n            var era = config._locale.erasParse(input, token, config._strict);\n            if (era) {\n                getParsingFlags(config).era = era;\n            } else {\n                getParsingFlags(config).invalidEra = input;\n            }\n        }\n    );\n\n    addRegexToken('y', matchUnsigned);\n    addRegexToken('yy', matchUnsigned);\n    addRegexToken('yyy', matchUnsigned);\n    addRegexToken('yyyy', matchUnsigned);\n    addRegexToken('yo', matchEraYearOrdinal);\n\n    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n    addParseToken(['yo'], function (input, array, config, token) {\n        var match;\n        if (config._locale._eraYearOrdinalRegex) {\n            match = input.match(config._locale._eraYearOrdinalRegex);\n        }\n\n        if (config._locale.eraYearOrdinalParse) {\n            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n        } else {\n            array[YEAR] = parseInt(input, 10);\n        }\n    });\n\n    function localeEras(m, format) {\n        var i,\n            l,\n            date,\n            eras = this._eras || getLocale('en')._eras;\n        for (i = 0, l = eras.length; i < l; ++i) {\n            switch (typeof eras[i].since) {\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].since).startOf('day');\n                    eras[i].since = date.valueOf();\n                    break;\n            }\n\n            switch (typeof eras[i].until) {\n                case 'undefined':\n                    eras[i].until = +Infinity;\n                    break;\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].until).startOf('day').valueOf();\n                    eras[i].until = date.valueOf();\n                    break;\n            }\n        }\n        return eras;\n    }\n\n    function localeErasParse(eraName, format, strict) {\n        var i,\n            l,\n            eras = this.eras(),\n            name,\n            abbr,\n            narrow;\n        eraName = eraName.toUpperCase();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            name = eras[i].name.toUpperCase();\n            abbr = eras[i].abbr.toUpperCase();\n            narrow = eras[i].narrow.toUpperCase();\n\n            if (strict) {\n                switch (format) {\n                    case 'N':\n                    case 'NN':\n                    case 'NNN':\n                        if (abbr === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNN':\n                        if (name === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNNN':\n                        if (narrow === eraName) {\n                            return eras[i];\n                        }\n                        break;\n                }\n            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n                return eras[i];\n            }\n        }\n    }\n\n    function localeErasConvertYear(era, year) {\n        var dir = era.since <= era.until ? +1 : -1;\n        if (year === undefined) {\n            return hooks(era.since).year();\n        } else {\n            return hooks(era.since).year() + (year - era.offset) * dir;\n        }\n    }\n\n    function getEraName() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].name;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].name;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraNarrow() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].narrow;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].narrow;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraAbbr() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].abbr;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].abbr;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraYear() {\n        var i,\n            l,\n            dir,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (\n                (eras[i].since <= val && val <= eras[i].until) ||\n                (eras[i].until <= val && val <= eras[i].since)\n            ) {\n                return (\n                    (this.year() - hooks(eras[i].since).year()) * dir +\n                    eras[i].offset\n                );\n            }\n        }\n\n        return this.year();\n    }\n\n    function erasNameRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNameRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNameRegex : this._erasRegex;\n    }\n\n    function erasAbbrRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasAbbrRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasAbbrRegex : this._erasRegex;\n    }\n\n    function erasNarrowRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNarrowRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNarrowRegex : this._erasRegex;\n    }\n\n    function matchEraAbbr(isStrict, locale) {\n        return locale.erasAbbrRegex(isStrict);\n    }\n\n    function matchEraName(isStrict, locale) {\n        return locale.erasNameRegex(isStrict);\n    }\n\n    function matchEraNarrow(isStrict, locale) {\n        return locale.erasNarrowRegex(isStrict);\n    }\n\n    function matchEraYearOrdinal(isStrict, locale) {\n        return locale._eraYearOrdinalRegex || matchUnsigned;\n    }\n\n    function computeErasParse() {\n        var abbrPieces = [],\n            namePieces = [],\n            narrowPieces = [],\n            mixedPieces = [],\n            i,\n            l,\n            erasName,\n            erasAbbr,\n            erasNarrow,\n            eras = this.eras();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            erasName = regexEscape(eras[i].name);\n            erasAbbr = regexEscape(eras[i].abbr);\n            erasNarrow = regexEscape(eras[i].narrow);\n\n            namePieces.push(erasName);\n            abbrPieces.push(erasAbbr);\n            narrowPieces.push(erasNarrow);\n            mixedPieces.push(erasName);\n            mixedPieces.push(erasAbbr);\n            mixedPieces.push(erasNarrow);\n        }\n\n        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n        this._erasNarrowRegex = new RegExp(\n            '^(' + narrowPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken(token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg', 'weekYear');\n    addWeekYearFormatToken('ggggg', 'weekYear');\n    addWeekYearFormatToken('GGGG', 'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    // PARSING\n\n    addRegexToken('G', matchSigned);\n    addRegexToken('g', matchSigned);\n    addRegexToken('GG', match1to2, match2);\n    addRegexToken('gg', match1to2, match2);\n    addRegexToken('GGGG', match1to4, match4);\n    addRegexToken('gggg', match1to4, match4);\n    addRegexToken('GGGGG', match1to6, match6);\n    addRegexToken('ggggg', match1to6, match6);\n\n    addWeekParseToken(\n        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],\n        function (input, week, config, token) {\n            week[token.substr(0, 2)] = toInt(input);\n        }\n    );\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.week(),\n            this.weekday() + this.localeData()._week.dow,\n            this.localeData()._week.dow,\n            this.localeData()._week.doy\n        );\n    }\n\n    function getSetISOWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.isoWeek(),\n            this.isoWeekday(),\n            1,\n            4\n        );\n    }\n\n    function getISOWeeksInYear() {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getISOWeeksInISOWeekYear() {\n        return weeksInYear(this.isoWeekYear(), 1, 4);\n    }\n\n    function getWeeksInYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getWeeksInWeekYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter(input) {\n        return input == null\n            ? Math.ceil((this.month() + 1) / 3)\n            : this.month((input - 1) * 3 + (this.month() % 3));\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // PARSING\n\n    addRegexToken('D', match1to2, match1to2NoLeadingZero);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        return isStrict\n            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse\n            : locale._dayOfMonthOrdinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0]);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // PARSING\n\n    addRegexToken('DDD', match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear(input) {\n        var dayOfYear =\n            Math.round(\n                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5\n            ) + 1;\n        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // PARSING\n\n    addRegexToken('m', match1to2, match1to2HasZero);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // PARSING\n\n    addRegexToken('s', match1to2, match1to2HasZero);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n    // PARSING\n\n    addRegexToken('S', match1to3, match1);\n    addRegexToken('SS', match1to3, match2);\n    addRegexToken('SSS', match1to3, match3);\n\n    var token, getSetMillisecond;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n\n    getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z', 0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr() {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName() {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var proto = Moment.prototype;\n\n    proto.add = add;\n    proto.calendar = calendar$1;\n    proto.clone = clone;\n    proto.diff = diff;\n    proto.endOf = endOf;\n    proto.format = format;\n    proto.from = from;\n    proto.fromNow = fromNow;\n    proto.to = to;\n    proto.toNow = toNow;\n    proto.get = stringGet;\n    proto.invalidAt = invalidAt;\n    proto.isAfter = isAfter;\n    proto.isBefore = isBefore;\n    proto.isBetween = isBetween;\n    proto.isSame = isSame;\n    proto.isSameOrAfter = isSameOrAfter;\n    proto.isSameOrBefore = isSameOrBefore;\n    proto.isValid = isValid$2;\n    proto.lang = lang;\n    proto.locale = locale;\n    proto.localeData = localeData;\n    proto.max = prototypeMax;\n    proto.min = prototypeMin;\n    proto.parsingFlags = parsingFlags;\n    proto.set = stringSet;\n    proto.startOf = startOf;\n    proto.subtract = subtract;\n    proto.toArray = toArray;\n    proto.toObject = toObject;\n    proto.toDate = toDate;\n    proto.toISOString = toISOString;\n    proto.inspect = inspect;\n    if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n            return 'Moment<' + this.format() + '>';\n        };\n    }\n    proto.toJSON = toJSON;\n    proto.toString = toString;\n    proto.unix = unix;\n    proto.valueOf = valueOf;\n    proto.creationData = creationData;\n    proto.eraName = getEraName;\n    proto.eraNarrow = getEraNarrow;\n    proto.eraAbbr = getEraAbbr;\n    proto.eraYear = getEraYear;\n    proto.year = getSetYear;\n    proto.isLeapYear = getIsLeapYear;\n    proto.weekYear = getSetWeekYear;\n    proto.isoWeekYear = getSetISOWeekYear;\n    proto.quarter = proto.quarters = getSetQuarter;\n    proto.month = getSetMonth;\n    proto.daysInMonth = getDaysInMonth;\n    proto.week = proto.weeks = getSetWeek;\n    proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n    proto.weeksInYear = getWeeksInYear;\n    proto.weeksInWeekYear = getWeeksInWeekYear;\n    proto.isoWeeksInYear = getISOWeeksInYear;\n    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n    proto.date = getSetDayOfMonth;\n    proto.day = proto.days = getSetDayOfWeek;\n    proto.weekday = getSetLocaleDayOfWeek;\n    proto.isoWeekday = getSetISODayOfWeek;\n    proto.dayOfYear = getSetDayOfYear;\n    proto.hour = proto.hours = getSetHour;\n    proto.minute = proto.minutes = getSetMinute;\n    proto.second = proto.seconds = getSetSecond;\n    proto.millisecond = proto.milliseconds = getSetMillisecond;\n    proto.utcOffset = getSetOffset;\n    proto.utc = setOffsetToUTC;\n    proto.local = setOffsetToLocal;\n    proto.parseZone = setOffsetToParsedOffset;\n    proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    proto.isDST = isDaylightSavingTime;\n    proto.isLocal = isLocal;\n    proto.isUtcOffset = isUtcOffset;\n    proto.isUtc = isUtc;\n    proto.isUTC = isUtc;\n    proto.zoneAbbr = getZoneAbbr;\n    proto.zoneName = getZoneName;\n    proto.dates = deprecate(\n        'dates accessor is deprecated. Use date instead.',\n        getSetDayOfMonth\n    );\n    proto.months = deprecate(\n        'months accessor is deprecated. Use month instead',\n        getSetMonth\n    );\n    proto.years = deprecate(\n        'years accessor is deprecated. Use year instead',\n        getSetYear\n    );\n    proto.zone = deprecate(\n        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',\n        getSetZone\n    );\n    proto.isDSTShifted = deprecate(\n        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',\n        isDaylightSavingTimeShifted\n    );\n\n    function createUnix(input) {\n        return createLocal(input * 1000);\n    }\n\n    function createInZone() {\n        return createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat(string) {\n        return string;\n    }\n\n    var proto$1 = Locale.prototype;\n\n    proto$1.calendar = calendar;\n    proto$1.longDateFormat = longDateFormat;\n    proto$1.invalidDate = invalidDate;\n    proto$1.ordinal = ordinal;\n    proto$1.preparse = preParsePostFormat;\n    proto$1.postformat = preParsePostFormat;\n    proto$1.relativeTime = relativeTime;\n    proto$1.pastFuture = pastFuture;\n    proto$1.set = set;\n    proto$1.eras = localeEras;\n    proto$1.erasParse = localeErasParse;\n    proto$1.erasConvertYear = localeErasConvertYear;\n    proto$1.erasAbbrRegex = erasAbbrRegex;\n    proto$1.erasNameRegex = erasNameRegex;\n    proto$1.erasNarrowRegex = erasNarrowRegex;\n\n    proto$1.months = localeMonths;\n    proto$1.monthsShort = localeMonthsShort;\n    proto$1.monthsParse = localeMonthsParse;\n    proto$1.monthsRegex = monthsRegex;\n    proto$1.monthsShortRegex = monthsShortRegex;\n    proto$1.week = localeWeek;\n    proto$1.firstDayOfYear = localeFirstDayOfYear;\n    proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n    proto$1.weekdays = localeWeekdays;\n    proto$1.weekdaysMin = localeWeekdaysMin;\n    proto$1.weekdaysShort = localeWeekdaysShort;\n    proto$1.weekdaysParse = localeWeekdaysParse;\n\n    proto$1.weekdaysRegex = weekdaysRegex;\n    proto$1.weekdaysShortRegex = weekdaysShortRegex;\n    proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n    proto$1.isPM = localeIsPM;\n    proto$1.meridiem = localeMeridiem;\n\n    function get$1(format, index, field, setter) {\n        var locale = getLocale(),\n            utc = createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl(format, index, field) {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return get$1(format, index, field, 'month');\n        }\n\n        var i,\n            out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = get$1(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl(localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = getLocale(),\n            shift = localeSorted ? locale._week.dow : 0,\n            i,\n            out = [];\n\n        if (index != null) {\n            return get$1(format, (index + shift) % 7, field, 'day');\n        }\n\n        for (i = 0; i < 7; i++) {\n            out[i] = get$1(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function listMonths(format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function listMonthsShort(format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function listWeekdays(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function listWeekdaysShort(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function listWeekdaysMin(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    getSetGlobalLocale('en', {\n        eras: [\n            {\n                since: '0001-01-01',\n                until: +Infinity,\n                offset: 1,\n                name: 'Anno Domini',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: 'Before Christ',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    toInt((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n    });\n\n    // Side effect imports\n\n    hooks.lang = deprecate(\n        'moment.lang is deprecated. Use moment.locale instead.',\n        getSetGlobalLocale\n    );\n    hooks.langData = deprecate(\n        'moment.langData is deprecated. Use moment.localeData instead.',\n        getLocale\n    );\n\n    var mathAbs = Math.abs;\n\n    function abs() {\n        var data = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days = mathAbs(this._days);\n        this._months = mathAbs(this._months);\n\n        data.milliseconds = mathAbs(data.milliseconds);\n        data.seconds = mathAbs(data.seconds);\n        data.minutes = mathAbs(data.minutes);\n        data.hours = mathAbs(data.hours);\n        data.months = mathAbs(data.months);\n        data.years = mathAbs(data.years);\n\n        return this;\n    }\n\n    function addSubtract$1(duration, input, value, direction) {\n        var other = createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days += direction * other._days;\n        duration._months += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function add$1(input, value) {\n        return addSubtract$1(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function subtract$1(input, value) {\n        return addSubtract$1(this, input, value, -1);\n    }\n\n    function absCeil(number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble() {\n        var milliseconds = this._milliseconds,\n            days = this._days,\n            months = this._months,\n            data = this._data,\n            seconds,\n            minutes,\n            hours,\n            years,\n            monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (\n            !(\n                (milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0)\n            )\n        ) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds = absFloor(milliseconds / 1000);\n        data.seconds = seconds % 60;\n\n        minutes = absFloor(seconds / 60);\n        data.minutes = minutes % 60;\n\n        hours = absFloor(minutes / 60);\n        data.hours = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days = days;\n        data.months = months;\n        data.years = years;\n\n        return this;\n    }\n\n    function daysToMonths(days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return (days * 4800) / 146097;\n    }\n\n    function monthsToDays(months) {\n        // the reverse of daysToMonths\n        return (months * 146097) / 4800;\n    }\n\n    function as(units) {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        var days,\n            months,\n            milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'quarter' || units === 'year') {\n            days = this._days + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            switch (units) {\n                case 'month':\n                    return months;\n                case 'quarter':\n                    return months / 3;\n                case 'year':\n                    return months / 12;\n            }\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week':\n                    return days / 7 + milliseconds / 6048e5;\n                case 'day':\n                    return days + milliseconds / 864e5;\n                case 'hour':\n                    return days * 24 + milliseconds / 36e5;\n                case 'minute':\n                    return days * 1440 + milliseconds / 6e4;\n                case 'second':\n                    return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond':\n                    return Math.floor(days * 864e5) + milliseconds;\n                default:\n                    throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    function makeAs(alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms'),\n        asSeconds = makeAs('s'),\n        asMinutes = makeAs('m'),\n        asHours = makeAs('h'),\n        asDays = makeAs('d'),\n        asWeeks = makeAs('w'),\n        asMonths = makeAs('M'),\n        asQuarters = makeAs('Q'),\n        asYears = makeAs('y'),\n        valueOf$1 = asMilliseconds;\n\n    function clone$1() {\n        return createDuration(this);\n    }\n\n    function get$2(units) {\n        units = normalizeUnits(units);\n        return this.isValid() ? this[units + 's']() : NaN;\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this.isValid() ? this._data[name] : NaN;\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds'),\n        seconds = makeGetter('seconds'),\n        minutes = makeGetter('minutes'),\n        hours = makeGetter('hours'),\n        days = makeGetter('days'),\n        months = makeGetter('months'),\n        years = makeGetter('years');\n\n    function weeks() {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round,\n        thresholds = {\n            ss: 44, // a few seconds to seconds\n            s: 45, // seconds to minute\n            m: 45, // minutes to hour\n            h: 22, // hours to day\n            d: 26, // days to month/week\n            w: null, // weeks to month\n            M: 11, // months to year\n        };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n        var duration = createDuration(posNegDuration).abs(),\n            seconds = round(duration.as('s')),\n            minutes = round(duration.as('m')),\n            hours = round(duration.as('h')),\n            days = round(duration.as('d')),\n            months = round(duration.as('M')),\n            weeks = round(duration.as('w')),\n            years = round(duration.as('y')),\n            a =\n                (seconds <= thresholds.ss && ['s', seconds]) ||\n                (seconds < thresholds.s && ['ss', seconds]) ||\n                (minutes <= 1 && ['m']) ||\n                (minutes < thresholds.m && ['mm', minutes]) ||\n                (hours <= 1 && ['h']) ||\n                (hours < thresholds.h && ['hh', hours]) ||\n                (days <= 1 && ['d']) ||\n                (days < thresholds.d && ['dd', days]);\n\n        if (thresholds.w != null) {\n            a =\n                a ||\n                (weeks <= 1 && ['w']) ||\n                (weeks < thresholds.w && ['ww', weeks]);\n        }\n        a = a ||\n            (months <= 1 && ['M']) ||\n            (months < thresholds.M && ['MM', months]) ||\n            (years <= 1 && ['y']) || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function getSetRelativeTimeRounding(roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof roundingFunction === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function getSetRelativeTimeThreshold(threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        if (threshold === 's') {\n            thresholds.ss = limit - 1;\n        }\n        return true;\n    }\n\n    function humanize(argWithSuffix, argThresholds) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var withSuffix = false,\n            th = thresholds,\n            locale,\n            output;\n\n        if (typeof argWithSuffix === 'object') {\n            argThresholds = argWithSuffix;\n            argWithSuffix = false;\n        }\n        if (typeof argWithSuffix === 'boolean') {\n            withSuffix = argWithSuffix;\n        }\n        if (typeof argThresholds === 'object') {\n            th = Object.assign({}, thresholds, argThresholds);\n            if (argThresholds.s != null && argThresholds.ss == null) {\n                th.ss = argThresholds.s - 1;\n            }\n        }\n\n        locale = this.localeData();\n        output = relativeTime$1(this, !withSuffix, th, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var abs$1 = Math.abs;\n\n    function sign(x) {\n        return (x > 0) - (x < 0) || +x;\n    }\n\n    function toISOString$1() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var seconds = abs$1(this._milliseconds) / 1000,\n            days = abs$1(this._days),\n            months = abs$1(this._months),\n            minutes,\n            hours,\n            years,\n            s,\n            total = this.asSeconds(),\n            totalSign,\n            ymSign,\n            daysSign,\n            hmsSign;\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes = absFloor(seconds / 60);\n        hours = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n\n        totalSign = total < 0 ? '-' : '';\n        ymSign = sign(this._months) !== sign(total) ? '-' : '';\n        daysSign = sign(this._days) !== sign(total) ? '-' : '';\n        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n        return (\n            totalSign +\n            'P' +\n            (years ? ymSign + years + 'Y' : '') +\n            (months ? ymSign + months + 'M' : '') +\n            (days ? daysSign + days + 'D' : '') +\n            (hours || minutes || seconds ? 'T' : '') +\n            (hours ? hmsSign + hours + 'H' : '') +\n            (minutes ? hmsSign + minutes + 'M' : '') +\n            (seconds ? hmsSign + s + 'S' : '')\n        );\n    }\n\n    var proto$2 = Duration.prototype;\n\n    proto$2.isValid = isValid$1;\n    proto$2.abs = abs;\n    proto$2.add = add$1;\n    proto$2.subtract = subtract$1;\n    proto$2.as = as;\n    proto$2.asMilliseconds = asMilliseconds;\n    proto$2.asSeconds = asSeconds;\n    proto$2.asMinutes = asMinutes;\n    proto$2.asHours = asHours;\n    proto$2.asDays = asDays;\n    proto$2.asWeeks = asWeeks;\n    proto$2.asMonths = asMonths;\n    proto$2.asQuarters = asQuarters;\n    proto$2.asYears = asYears;\n    proto$2.valueOf = valueOf$1;\n    proto$2._bubble = bubble;\n    proto$2.clone = clone$1;\n    proto$2.get = get$2;\n    proto$2.milliseconds = milliseconds;\n    proto$2.seconds = seconds;\n    proto$2.minutes = minutes;\n    proto$2.hours = hours;\n    proto$2.days = days;\n    proto$2.weeks = weeks;\n    proto$2.months = months;\n    proto$2.years = years;\n    proto$2.humanize = humanize;\n    proto$2.toISOString = toISOString$1;\n    proto$2.toString = toISOString$1;\n    proto$2.toJSON = toISOString$1;\n    proto$2.locale = locale;\n    proto$2.localeData = localeData;\n\n    proto$2.toIsoString = deprecate(\n        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',\n        toISOString$1\n    );\n    proto$2.lang = lang;\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    //! moment.js\n\n    hooks.version = '2.30.1';\n\n    setHookCallback(createLocal);\n\n    hooks.fn = proto;\n    hooks.min = min;\n    hooks.max = max;\n    hooks.now = now;\n    hooks.utc = createUTC;\n    hooks.unix = createUnix;\n    hooks.months = listMonths;\n    hooks.isDate = isDate;\n    hooks.locale = getSetGlobalLocale;\n    hooks.invalid = createInvalid;\n    hooks.duration = createDuration;\n    hooks.isMoment = isMoment;\n    hooks.weekdays = listWeekdays;\n    hooks.parseZone = createInZone;\n    hooks.localeData = getLocale;\n    hooks.isDuration = isDuration;\n    hooks.monthsShort = listMonthsShort;\n    hooks.weekdaysMin = listWeekdaysMin;\n    hooks.defineLocale = defineLocale;\n    hooks.updateLocale = updateLocale;\n    hooks.locales = listLocales;\n    hooks.weekdaysShort = listWeekdaysShort;\n    hooks.normalizeUnits = normalizeUnits;\n    hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n    hooks.calendarFormat = getCalendarFormat;\n    hooks.prototype = proto;\n\n    // currently HTML5 input type only supports 24-hour formats\n    hooks.HTML5_FMT = {\n        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type=\"datetime-local\" />\n        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type=\"datetime-local\" step=\"1\" />\n        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type=\"datetime-local\" step=\"0.001\" />\n        DATE: 'YYYY-MM-DD', // <input type=\"date\" />\n        TIME: 'HH:mm', // <input type=\"time\" />\n        TIME_SECONDS: 'HH:mm:ss', // <input type=\"time\" step=\"1\" />\n        TIME_MS: 'HH:mm:ss.SSS', // <input type=\"time\" step=\"0.001\" />\n        WEEK: 'GGGG-[W]WW', // <input type=\"week\" />\n        MONTH: 'YYYY-MM', // <input type=\"month\" />\n    };\n\n    return hooks;\n\n})));\n", "var moment = require('moment');\n\nfunction isValidMoment(testMoment) {\n  if (typeof moment.isMoment === 'function' && !moment.isMoment(testMoment)) {\n    return false;\n  }\n\n  /* istanbul ignore else  */\n  if (typeof testMoment.isValid === 'function') {\n    // moment 1.7.0+\n    return testMoment.isValid();\n  }\n\n  /* istanbul ignore next */\n  return !isNaN(testMoment);\n}\n\nmodule.exports = {\n  isValidMoment : isValidMoment,\n};\n", "var messages = {\n  invalidPredicate: '`predicate` must be a function',\n  invalidPropValidator: '`propValidator` must be a function',\n  requiredCore: 'is marked as required',\n  invalidTypeCore: 'Invalid input type',\n  predicateFailureCore: 'Failed to succeed with predicate',\n  anonymousMessage: '<<anonymous>>',\n  baseInvalidMessage: 'Invalid ',\n};\n\nfunction constructPropValidatorVariations(propValidator) {\n  if (typeof propValidator !== 'function') {\n    throw new Error(messages.invalidPropValidator);\n  }\n\n  var requiredPropValidator = propValidator.bind(null, false, null);\n  requiredPropValidator.isRequired = propValidator.bind(null, true, null);\n\n  requiredPropValidator.withPredicate = function predicateApplication(predicate) {\n    if (typeof predicate !== 'function') {\n      throw new Error(messages.invalidPredicate);\n    }\n    var basePropValidator = propValidator.bind(null, false, predicate);\n    basePropValidator.isRequired = propValidator.bind(null, true, predicate);\n    return basePropValidator;\n  };\n\n  return requiredPropValidator;\n}\n\nfunction createInvalidRequiredErrorMessage(propName, componentName, value) {\n  return new Error(\n    'The prop `' + propName + '` ' + messages.requiredCore +\n    ' in `' + componentName + '`, but its value is `' + value + '`.'\n  );\n}\n\nvar independentGuardianValue = -1;\n\nfunction preValidationRequireCheck(isRequired, componentName, propFullName, propValue) {\n  var isPropValueUndefined = typeof propValue === 'undefined';\n  var isPropValueNull = propValue === null;\n\n  if (isRequired) {\n    if (isPropValueUndefined) {\n      return createInvalidRequiredErrorMessage(propFullName, componentName, 'undefined');\n    } else if (isPropValueNull) {\n      return createInvalidRequiredErrorMessage(propFullName, componentName, 'null');\n    }\n  }\n\n  if (isPropValueUndefined || isPropValueNull) {\n    return null;\n  }\n\n  return independentGuardianValue;\n}\n\nfunction createMomentChecker(type, typeValidator, validator, momentType) {\n\n  function propValidator(\n    isRequired, // Bound parameter to indicate with the propType is required\n    predicate, // Bound parameter to allow user to add dynamic validation\n    props,\n    propName,\n    componentName,\n    location,\n    propFullName\n  ) {\n    var propValue = props[ propName ];\n    var propType = typeof propValue;\n\n    componentName = componentName || messages.anonymousMessage;\n    propFullName = propFullName || propName;\n\n    var preValidationRequireCheckValue = preValidationRequireCheck(\n      isRequired, componentName, propFullName, propValue\n    );\n\n    if (preValidationRequireCheckValue !== independentGuardianValue) {\n      return preValidationRequireCheckValue;\n    }\n\n    if (typeValidator && !typeValidator(propValue)) {\n      return new Error(\n        messages.invalidTypeCore + ': `' + propName + '` of type `' + propType + '` ' +\n        'supplied to `' + componentName + '`, expected `' + type + '`.'\n      );\n    }\n\n    if (!validator(propValue)) {\n      return new Error(\n        messages.baseInvalidMessage + location + ' `' + propName + '` of type `' + propType + '` ' +\n        'supplied to `' + componentName + '`, expected `' + momentType + '`.'\n      );\n    }\n\n    if (predicate && !predicate(propValue)) {\n      var predicateName = predicate.name || messages.anonymousMessage;\n      return new Error(\n        messages.baseInvalidMessage + location + ' `' + propName + '` of type `' + propType + '` ' +\n        'supplied to `' + componentName + '`. ' + messages.predicateFailureCore + ' `' +\n        predicateName + '`.'\n      );\n    }\n\n    return null;\n\n  }\n\n  return constructPropValidatorVariations(propValidator);\n\n}\n\nmodule.exports = {\n  constructPropValidatorVariations: constructPropValidatorVariations,\n  createMomentChecker: createMomentChecker,\n  messages: messages,\n};\n", "var moment = require('moment');\nvar momentValidationWrapper = require('./moment-validation-wrapper');\nvar core = require('./core');\n\nmodule.exports = {\n\n  momentObj : core.createMomentChecker(\n    'object',\n    function(obj) {\n      return typeof obj === 'object';\n    },\n    function isValid(value) {\n      return momentValidationWrapper.isValidMoment(value);\n    },\n    'Moment'\n  ),\n\n  momentString : core.createMomentChecker(\n    'string',\n    function(str) {\n      return typeof str === 'string';\n    },\n    function isValid(value) {\n      return momentValidationWrapper.isValidMoment(moment(value));\n    },\n    'Moment'\n  ),\n\n  momentDurationObj : core.createMomentChecker(\n    'object',\n    function(obj) {\n      return typeof obj === 'object';\n    },\n    function isValid(value) {\n      return moment.isDuration(value);\n    },\n    'Duration'\n  ),\n\n};\n", "function noop() { return null; }\nnoop.isRequired = noop;\nfunction noopThunk() { return noop; }\n\nmodule.exports = {\n  and: noopThunk,\n  between: noopThunk,\n  booleanSome: noopThunk,\n  childrenHavePropXorChildren: noopThunk,\n  childrenOf: noopThunk,\n  childrenOfType: noopThunk,\n  childrenSequenceOf: noopThunk,\n  componentWithName: noopThunk,\n  disallowedIf: noopThunk,\n  elementType: noopThunk,\n  empty: noopThunk,\n  explicitNull: noopThunk,\n  forbidExtraProps: Object,\n  integer: noopThunk,\n  keysOf: noopThunk,\n  mutuallyExclusiveProps: noopThunk,\n  mutuallyExclusiveTrueProps: noopThunk,\n  nChildren: noopThunk,\n  nonNegativeInteger: noop,\n  nonNegativeNumber: noopThunk,\n  numericString: noopThunk,\n  object: noopThunk,\n  or: noopThunk,\n  predicate: noopThunk,\n  range: noopThunk,\n  ref: noopThunk,\n  requiredBy: noopThunk,\n  restrictedProp: noopThunk,\n  sequenceOf: noopThunk,\n  shape: noopThunk,\n  stringEndsWith: noopThunk,\n  stringStartsWith: noopThunk,\n  uniqueArray: noopThunk,\n  uniqueArrayOf: noopThunk,\n  valuesOf: noopThunk,\n  withShape: noopThunk,\n};\n", "module.exports = process.env.NODE_ENV === 'production' ? require('./build/mocks') : require('./build');\n\n", "var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _interopRequireWildcard(e, t) {\n  if (\"function\" == typeof WeakMap) var r = new WeakMap(),\n    n = new WeakMap();\n  return (module.exports = _interopRequireWildcard = function _interopRequireWildcard(e, t) {\n    if (!t && e && e.__esModule) return e;\n    var o,\n      i,\n      f = {\n        __proto__: null,\n        \"default\": e\n      };\n    if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return f;\n    if (o = t ? n : r) {\n      if (o.has(e)) return o.get(e);\n      o.set(e, f);\n    }\n    for (var _t in e) \"default\" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]);\n    return f;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)(e, t);\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-is.production.min.js');\n} else {\n  module.exports = require('./cjs/react-is.development.js');\n}\n", "'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n", "'use strict';\n\nvar fnToStr = Function.prototype.toString;\nvar reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;\nvar badArrayLike;\nvar isCallableMarker;\nif (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {\n\ttry {\n\t\tbadArrayLike = Object.defineProperty({}, 'length', {\n\t\t\tget: function () {\n\t\t\t\tthrow isCallableMarker;\n\t\t\t}\n\t\t});\n\t\tisCallableMarker = {};\n\t\t// eslint-disable-next-line no-throw-literal\n\t\treflectApply(function () { throw 42; }, null, badArrayLike);\n\t} catch (_) {\n\t\tif (_ !== isCallableMarker) {\n\t\t\treflectApply = null;\n\t\t}\n\t}\n} else {\n\treflectApply = null;\n}\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n/* globals document: false */\nvar documentDotAll = typeof document === 'object' && typeof document.all === 'undefined' && document.all !== undefined ? document.all : {};\n\nmodule.exports = reflectApply\n\t? function isCallable(value) {\n\t\tif (value === documentDotAll) { return true; }\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (typeof value === 'function' && !value.prototype) { return true; }\n\t\ttry {\n\t\t\treflectApply(value, null, badArrayLike);\n\t\t} catch (e) {\n\t\t\tif (e !== isCallableMarker) { return false; }\n\t\t}\n\t\treturn !isES6ClassFn(value);\n\t}\n\t: function isCallable(value) {\n\t\tif (value === documentDotAll) { return true; }\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (typeof value === 'function' && !value.prototype) { return true; }\n\t\tif (hasToStringTag) { return tryFunctionObject(value); }\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tvar strClass = toStr.call(value);\n\t\treturn strClass === fnClass || strClass === genClass;\n\t};\n", "'use strict';\n\n// http://262.ecma-international.org/5.1/#sec-9.11\n\nmodule.exports = require('is-callable');\n", "'use strict';\n\nvar functionsHaveNames = function functionsHaveNames() {\n\treturn typeof function f() {}.name === 'string';\n};\n\nvar gOPD = Object.getOwnPropertyDescriptor;\nif (gOPD) {\n\ttry {\n\t\tgOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\tgOPD = null;\n\t}\n}\n\nfunctionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {\n\treturn functionsHaveNames() && gOPD && !!gOPD(function () {}, 'name').configurable;\n};\n\nvar $bind = Function.prototype.bind;\n\nfunctionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {\n\treturn functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';\n};\n\nmodule.exports = functionsHaveNames;\n", "'use strict';\n\nvar IsCallable = require('es-abstract/2020/IsCallable');\nvar functionsHaveNames = require('functions-have-names')();\nvar callBound = require('call-bind/callBound');\nvar $functionToString = callBound('Function.prototype.toString');\nvar $stringMatch = callBound('String.prototype.match');\n\nvar classRegex = /^class /;\n\nvar isClass = function isClassConstructor(fn) {\n\tif (IsCallable(fn)) {\n\t\treturn false;\n\t}\n\tif (typeof fn !== 'function') {\n\t\treturn false;\n\t}\n\ttry {\n\t\tvar match = $stringMatch($functionToString(fn), classRegex);\n\t\treturn !!match;\n\t} catch (e) {}\n\treturn false;\n};\n\nvar regex = /\\s*function\\s+([^(\\s]*)\\s*/;\n\nvar functionProto = Function.prototype;\n\nmodule.exports = function getName() {\n\tif (!isClass(this) && !IsCallable(this)) {\n\t\tthrow new TypeError('Function.prototype.name sham getter called on non-function');\n\t}\n\tif (functionsHaveNames) {\n\t\treturn this.name;\n\t}\n\tif (this === functionProto) {\n\t\treturn '';\n\t}\n\tvar str = $functionToString(this);\n\tvar match = $stringMatch(str, regex);\n\tvar name = match && match[1];\n\treturn name;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn implementation;\n};\n", "'use strict';\n\nvar supportsDescriptors = require('define-properties').supportsDescriptors;\nvar functionsHaveNames = require('functions-have-names')();\nvar getPolyfill = require('./polyfill');\nvar defineProperty = Object.defineProperty;\nvar TypeErr = TypeError;\n\nmodule.exports = function shimName() {\n\tvar polyfill = getPolyfill();\n\tif (functionsHaveNames) {\n\t\treturn polyfill;\n\t}\n\tif (!supportsDescriptors) {\n\t\tthrow new TypeErr('Shimming Function.prototype.name support requires ES5 property descriptor support.');\n\t}\n\tvar functionProto = Function.prototype;\n\tdefineProperty(functionProto, 'name', {\n\t\tconfigurable: true,\n\t\tenumerable: false,\n\t\tget: function () {\n\t\t\tvar name = polyfill.call(this);\n\t\t\tif (this !== functionProto) {\n\t\t\t\tdefineProperty(this, 'name', {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: name,\n\t\t\t\t\twritable: false\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn name;\n\t\t}\n\t});\n\treturn polyfill;\n};\n", "'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar bound = callBind(implementation);\n\ndefine(bound, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = bound;\n", "import getFunctionName from 'function.prototype.name';\nimport { isForwardRef, Element, isMemo } from 'react-is';\n\nexport default function getComponentName(Component) {\n  if (typeof Component === 'string') {\n    return Component;\n  }\n  if (typeof Component === 'function') {\n    return Component.displayName || getFunctionName(Component);\n  }\n  if (isForwardRef({ type: Component, $$typeof: Element })) {\n    return Component.displayName;\n  }\n  if (isMemo(Component)) {\n    return getComponentName(Component.type);\n  }\n  return null;\n}\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\nvar EMPTY_STYLES = {};\n\nvar EMPTY_STYLES_FN = function EMPTY_STYLES_FN() {\n  return EMPTY_STYLES;\n};\n\nvar _default = EMPTY_STYLES_FN;\nexports[\"default\"] = _default;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.perfStart = perfStart;\nexports.perfEnd = perfEnd;\nexports[\"default\"] = withPerf;\n\nfunction perfStart(startMark) {\n  if (typeof performance !== 'undefined' && performance.mark !== undefined && typeof performance.clearMarks === 'function' && startMark) {\n    performance.clearMarks(startMark);\n    performance.mark(startMark);\n  }\n}\n\nfunction perfEnd(startMark, endMark, measureName) {\n  if (typeof performance !== 'undefined' && performance.mark !== undefined && typeof performance.clearMarks === 'function') {\n    performance.clearMarks(endMark);\n    performance.mark(endMark);\n    performance.measure(measureName, startMark, endMark);\n    performance.clearMarks(measureName);\n  }\n}\n\nfunction withPerf(methodName) {\n  var startMark = \"react-with-styles.\".concat(methodName, \".start\");\n  var endMark = \"react-with-styles.\".concat(methodName, \".end\");\n  var measureName = \"\\uD83D\\uDC69\\u200D\\uD83C\\uDFA8 [\".concat(methodName, \"]\");\n  return function (fn) {\n    return function () {\n      if (process.env.NODE_ENV !== 'production') {\n        perfStart(startMark);\n      }\n\n      var result = fn.apply(void 0, arguments);\n\n      if (process.env.NODE_ENV !== 'production') {\n        perfEnd(startMark, endMark, measureName);\n      }\n\n      return result;\n    };\n  };\n}", "'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n    return Array.isArray(val) ? [] : {}\n}\n\nfunction cloneIfNecessary(value, optionsArgument) {\n    var clone = optionsArgument && optionsArgument.clone === true;\n    return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n}\n\nfunction defaultArrayMerge(target, source, optionsArgument) {\n    var destination = target.slice();\n    source.forEach(function(e, i) {\n        if (typeof destination[i] === 'undefined') {\n            destination[i] = cloneIfNecessary(e, optionsArgument);\n        } else if (isMergeableObject(e)) {\n            destination[i] = deepmerge(target[i], e, optionsArgument);\n        } else if (target.indexOf(e) === -1) {\n            destination.push(cloneIfNecessary(e, optionsArgument));\n        }\n    });\n    return destination\n}\n\nfunction mergeObject(target, source, optionsArgument) {\n    var destination = {};\n    if (isMergeableObject(target)) {\n        Object.keys(target).forEach(function(key) {\n            destination[key] = cloneIfNecessary(target[key], optionsArgument);\n        });\n    }\n    Object.keys(source).forEach(function(key) {\n        if (!isMergeableObject(source[key]) || !target[key]) {\n            destination[key] = cloneIfNecessary(source[key], optionsArgument);\n        } else {\n            destination[key] = deepmerge(target[key], source[key], optionsArgument);\n        }\n    });\n    return destination\n}\n\nfunction deepmerge(target, source, optionsArgument) {\n    var sourceIsArray = Array.isArray(source);\n    var targetIsArray = Array.isArray(target);\n    var options = optionsArgument || { arrayMerge: defaultArrayMerge };\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    if (!sourceAndTargetTypesMatch) {\n        return cloneIfNecessary(source, optionsArgument)\n    } else if (sourceIsArray) {\n        var arrayMerge = options.arrayMerge || defaultArrayMerge;\n        return arrayMerge(target, source, optionsArgument)\n    } else {\n        return mergeObject(target, source, optionsArgument)\n    }\n}\n\ndeepmerge.all = function deepmergeAll(array, optionsArgument) {\n    if (!Array.isArray(array) || array.length < 2) {\n        throw new Error('first argument should be an array with at least two elements')\n    }\n\n    // we are sure there are at least 2 values, so it is safe to have no initial value\n    return array.reduce(function(prev, next) {\n        return deepmerge(prev, next, optionsArgument)\n    })\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar CHANNEL = exports.CHANNEL = '__direction__';\n\nvar DIRECTIONS = exports.DIRECTIONS = {\n  LTR: 'ltr',\n  RTL: 'rtl'\n};", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = _propTypes2['default'].shape({\n  getState: _propTypes2['default'].func,\n  setState: _propTypes2['default'].func,\n  subscribe: _propTypes2['default'].func\n});", "'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\n// http://262.ecma-international.org/5.1/#sec-9.10\n\nmodule.exports = function CheckObjectCoercible(value, optMessage) {\n\tif (value == null) {\n\t\tthrow new $TypeError(optMessage || ('Cannot call method on ' + value));\n\t}\n\treturn value;\n};\n", "'use strict';\n\nmodule.exports = require('../5/CheckObjectCoercible');\n", "'use strict';\n\nvar has = require('has');\nvar RequireObjectCoercible = require('es-abstract/2020/RequireObjectCoercible');\nvar callBound = require('call-bind/callBound');\n\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\n\nmodule.exports = function values(O) {\n\tvar obj = RequireObjectCoercible(O);\n\tvar vals = [];\n\tfor (var key in obj) {\n\t\tif (has(obj, key) && $isEnumerable(obj, key)) {\n\t\t\tvals.push(obj[key]);\n\t\t}\n\t}\n\treturn vals;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.values === 'function' ? Object.values : implementation;\n};\n", "'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimValues() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { values: polyfill }, {\n\t\tvalues: function testValues() {\n\t\t\treturn Object.values !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n", "'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Object);\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _object = require('object.values');\n\nvar _object2 = _interopRequireDefault(_object);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _constants = require('../constants');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nexports['default'] = _propTypes2['default'].oneOf((0, _object2['default'])(_constants.DIRECTIONS));", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.withDirectionPropTypes = exports.DIRECTIONS = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports['default'] = withDirection;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _hoistNonReactStatics = require('hoist-non-react-statics');\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _deepmerge = require('deepmerge');\n\nvar _deepmerge2 = _interopRequireDefault(_deepmerge);\n\nvar _getComponentName = require('airbnb-prop-types/build/helpers/getComponentName');\n\nvar _getComponentName2 = _interopRequireDefault(_getComponentName);\n\nvar _constants = require('./constants');\n\nvar _brcast = require('./proptypes/brcast');\n\nvar _brcast2 = _interopRequireDefault(_brcast);\n\nvar _direction = require('./proptypes/direction');\n\nvar _direction2 = _interopRequireDefault(_direction);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /* eslint-disable react/forbid-foreign-prop-types */\n// This higher-order component consumes a string from React context that is\n// provided by the DirectionProvider component.\n// We can use this to conditionally switch layout/direction for right-to-left layouts.\n\nvar contextTypes = _defineProperty({}, _constants.CHANNEL, _brcast2['default']);\n\nexports.DIRECTIONS = _constants.DIRECTIONS;\n\n// set a default direction so that a component wrapped with this HOC can be\n// used even without a DirectionProvider ancestor in its react tree.\n\nvar defaultDirection = _constants.DIRECTIONS.LTR;\n\n// export for convenience, in order for components to spread these onto their propTypes\nvar withDirectionPropTypes = exports.withDirectionPropTypes = {\n  direction: _direction2['default'].isRequired\n};\n\nfunction withDirection(WrappedComponent) {\n  var WithDirection = function (_React$Component) {\n    _inherits(WithDirection, _React$Component);\n\n    function WithDirection(props, context) {\n      _classCallCheck(this, WithDirection);\n\n      var _this = _possibleConstructorReturn(this, (WithDirection.__proto__ || Object.getPrototypeOf(WithDirection)).call(this, props, context));\n\n      _this.state = {\n        direction: context[_constants.CHANNEL] ? context[_constants.CHANNEL].getState() : defaultDirection\n      };\n      return _this;\n    }\n\n    _createClass(WithDirection, [{\n      key: 'componentDidMount',\n      value: function () {\n        function componentDidMount() {\n          var _this2 = this;\n\n          if (this.context[_constants.CHANNEL]) {\n            // subscribe to future direction changes\n            this.channelUnsubscribe = this.context[_constants.CHANNEL].subscribe(function (direction) {\n              _this2.setState({ direction: direction });\n            });\n          }\n        }\n\n        return componentDidMount;\n      }()\n    }, {\n      key: 'componentWillUnmount',\n      value: function () {\n        function componentWillUnmount() {\n          if (this.channelUnsubscribe) {\n            this.channelUnsubscribe();\n          }\n        }\n\n        return componentWillUnmount;\n      }()\n    }, {\n      key: 'render',\n      value: function () {\n        function render() {\n          var direction = this.state.direction;\n\n\n          return _react2['default'].createElement(WrappedComponent, _extends({}, this.props, {\n            direction: direction\n          }));\n        }\n\n        return render;\n      }()\n    }]);\n\n    return WithDirection;\n  }(_react2['default'].Component);\n\n  var wrappedComponentName = (0, _getComponentName2['default'])(WrappedComponent) || 'Component';\n\n  WithDirection.WrappedComponent = WrappedComponent;\n  WithDirection.contextTypes = contextTypes;\n  WithDirection.displayName = 'withDirection(' + String(wrappedComponentName) + ')';\n  if (WrappedComponent.propTypes) {\n    WithDirection.propTypes = (0, _deepmerge2['default'])({}, WrappedComponent.propTypes);\n    delete WithDirection.propTypes.direction;\n  }\n  if (WrappedComponent.defaultProps) {\n    WithDirection.defaultProps = (0, _deepmerge2['default'])({}, WrappedComponent.defaultProps);\n  }\n\n  return (0, _hoistNonReactStatics2['default'])(WithDirection, WrappedComponent);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"DIRECTIONS\", {\n  enumerable: true,\n  get: function get() {\n    return _reactWithDirection.DIRECTIONS;\n  }\n});\nexports[\"default\"] = void 0;\n\nvar _react = require(\"react\");\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactWithDirection = require(\"react-with-direction\");\n\nfunction detectAndCreateContext(defaultValue) {\n  if (_react.createContext) {\n    return (0, _react.createContext)(defaultValue);\n  }\n\n  return {\n    Provider: function Provider() {\n      throw new ReferenceError('WithStylesContext requires React 16.3 or later');\n    },\n    Consumer: function Consumer() {\n      throw new ReferenceError('WithStylesContext requires React 16.3 or later');\n    }\n  };\n}\n\nvar WithStylesContext = detectAndCreateContext({\n  stylesInterface: null,\n  stylesTheme: null,\n  direction: null\n});\nWithStylesContext.Provider.propTypes = {\n  stylesInterface: _propTypes[\"default\"].object,\n  // eslint-disable-line react/forbid-prop-types\n  stylesTheme: _propTypes[\"default\"].object,\n  // eslint-disable-line react/forbid-prop-types\n  direction: _propTypes[\"default\"].oneOf([_reactWithDirection.DIRECTIONS.LTR, _reactWithDirection.DIRECTIONS.RTL])\n};\nvar _default = WithStylesContext;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = exports.withStylesPropTypes = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar withStylesPropTypes = {\n  styles: _propTypes[\"default\"].object.isRequired,\n  theme: _propTypes[\"default\"].object.isRequired,\n  css: _propTypes[\"default\"].func.isRequired\n};\nexports.withStylesPropTypes = withStylesPropTypes;\nvar _default = withStylesPropTypes;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.withStyles = withStyles;\nObject.defineProperty(exports, \"withStylesPropTypes\", {\n  enumerable: true,\n  get: function get() {\n    return _withStylesPropTypes.withStylesPropTypes;\n  }\n});\nexports.css = exports[\"default\"] = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _hoistNonReactStatics = _interopRequireDefault(require(\"hoist-non-react-statics\"));\n\nvar _getComponentName = _interopRequireDefault(require(\"airbnb-prop-types/build/helpers/getComponentName\"));\n\nvar _emptyStylesFn = _interopRequireDefault(require(\"./utils/emptyStylesFn\"));\n\nvar _perf = _interopRequireDefault(require(\"./utils/perf\"));\n\nvar _WithStylesContext = _interopRequireWildcard(require(\"./WithStylesContext\"));\n\nvar _ThemedStyleSheet = _interopRequireWildcard(require(\"./ThemedStyleSheet\"));\n\nvar _withStylesPropTypes = require(\"./withStylesPropTypes\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n/**\n * A higher order function that returns a higher order class component that injects\n * CSS-in-JS props derived from the react-with-styles theme, interface, and\n * direction provided through the WithStylesContext provider.\n *\n * The function should be used as follows:\n * `withStyles((theme) => styles, options)(Component)`\n *\n * Options can be used to rename the injected props, memoize the component, and flush\n * the styles to the styles tag (or whatever the interface implements as flush) before\n * rendering.\n *\n * @export\n * @param {Function|null|undefined} [stylesFn=EMPTY_STYLES_FN]\n * @param {Object} [{\n *     stylesPropName = 'styles',\n *     themePropName = 'theme',\n *     cssPropName = 'css',\n *     flushBefore = false,\n *     pureComponent = false,\n *   }={}]\n * @returns a higher order component that wraps the provided component and injects\n * the react-with-styles css, styles, and theme props.\n */\nfunction withStyles() {\n  var stylesFn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emptyStylesFn[\"default\"];\n\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$stylesPropName = _ref.stylesPropName,\n      stylesPropName = _ref$stylesPropName === void 0 ? 'styles' : _ref$stylesPropName,\n      _ref$themePropName = _ref.themePropName,\n      themePropName = _ref$themePropName === void 0 ? 'theme' : _ref$themePropName,\n      _ref$cssPropName = _ref.cssPropName,\n      cssPropName = _ref$cssPropName === void 0 ? 'css' : _ref$cssPropName,\n      _ref$flushBefore = _ref.flushBefore,\n      flushBefore = _ref$flushBefore === void 0 ? false : _ref$flushBefore,\n      _ref$pureComponent = _ref.pureComponent,\n      pureComponent = _ref$pureComponent === void 0 ? false : _ref$pureComponent;\n\n  stylesFn = stylesFn || _emptyStylesFn[\"default\"];\n  var BaseClass = pureComponent ? _react[\"default\"].PureComponent : _react[\"default\"].Component;\n  /** Cache for storing the result of stylesFn(theme) for all themes. */\n\n  var stylesFnResultCacheMap = typeof WeakMap === 'undefined' ? new Map() : new WeakMap();\n\n  function getOrCreateStylesFnResultCache(theme) {\n    // Get and store the result in the stylesFnResultsCache for the component\n    // -- not the instance -- so we only apply the theme to the stylesFn\n    // once per theme for this component.\n    var cachedResultForTheme = stylesFnResultCacheMap.get(theme);\n    var stylesFnResult = cachedResultForTheme || stylesFn(theme) || {};\n    stylesFnResultCacheMap.set(theme, stylesFnResult); // cache the result of stylesFn(theme)\n\n    return stylesFnResult;\n  }\n  /**\n   * Cache for storing the results of computations:\n   * `WeakMap<Theme, WeakMap<typeof WithStyles, { ltr: {}, rtl: {} }>>`\n   * Falling back to `Map` whenever `WeakMap` is not supported\n   */\n\n\n  var withStylesCache = typeof WeakMap === 'undefined' ? new Map() : new WeakMap();\n\n  function getComponentCache(theme, component, direction) {\n    var themeCache = withStylesCache.get(theme);\n\n    if (!themeCache) {\n      return null;\n    }\n\n    var componentCache = themeCache.get(component);\n\n    if (!componentCache) {\n      return null;\n    }\n\n    return componentCache[direction];\n  }\n\n  function updateComponentCache(theme, component, direction, results) {\n    var themeCache = withStylesCache.get(theme);\n\n    if (!themeCache) {\n      themeCache = typeof WeakMap === 'undefined' ? new Map() : new WeakMap();\n      withStylesCache.set(theme, themeCache);\n    }\n\n    var componentCache = themeCache.get(component);\n\n    if (!componentCache) {\n      componentCache = {\n        ltr: {},\n        rtl: {}\n      };\n      themeCache.set(component, componentCache);\n    }\n\n    componentCache[direction] = results;\n  }\n  /** Derive the create function from the interface and direction */\n\n\n  function makeCreateFn(direction, stylesInterface) {\n    var directionSelector = direction === _WithStylesContext.DIRECTIONS.RTL ? 'RTL' : 'LTR';\n    var create = stylesInterface[\"create\".concat(directionSelector)] || stylesInterface.create;\n\n    if (process.env.NODE_ENV !== 'production') {\n      create = (0, _perf[\"default\"])('create')(create);\n    }\n\n    return create;\n  }\n  /** Derive the resolve function from the interface and direction */\n\n\n  function makeResolveFn(direction, stylesInterface) {\n    var directionSelector = direction === _WithStylesContext.DIRECTIONS.RTL ? 'RTL' : 'LTR';\n    var resolve = stylesInterface[\"resolve\".concat(directionSelector)] || stylesInterface.resolve;\n\n    if (process.env.NODE_ENV !== 'production') {\n      resolve = (0, _perf[\"default\"])('resolve')(resolve);\n    }\n\n    return resolve;\n  } // The function that wraps the provided component in a wrapper\n  // component that injects the withStyles props\n\n\n  return function withStylesHOC(WrappedComponent) {\n    var wrappedComponentName = (0, _getComponentName[\"default\"])(WrappedComponent); // The wrapper component that injects the withStyles props\n\n    var WithStyles =\n    /*#__PURE__*/\n    function (_BaseClass) {\n      (0, _inheritsLoose2[\"default\"])(WithStyles, _BaseClass);\n\n      function WithStyles() {\n        return _BaseClass.apply(this, arguments) || this;\n      }\n\n      var _proto = WithStyles.prototype;\n\n      _proto.getCurrentInterface = function getCurrentInterface() {\n        // Fallback to the singleton implementation\n        return this.context && this.context.stylesInterface || (0, _ThemedStyleSheet._getInterface)();\n      };\n\n      _proto.getCurrentTheme = function getCurrentTheme() {\n        // Fallback to the singleton implementation\n        return this.context && this.context.stylesTheme || (0, _ThemedStyleSheet._getTheme)();\n      };\n\n      _proto.getCurrentDirection = function getCurrentDirection() {\n        return this.context && this.context.direction || _WithStylesContext.DIRECTIONS.LTR;\n      };\n\n      _proto.getProps = function getProps() {\n        // Get the styles interface, theme, and direction from context\n        var stylesInterface = this.getCurrentInterface();\n        var theme = this.getCurrentTheme();\n        var direction = this.getCurrentDirection(); // Use a cache to store the interface methods and created styles by direction.\n        // This way, if the theme and the interface don't change, we do not recalculate\n        // styles or any other interface derivations. They are effectively only calculated\n        // once per direction, until the theme or interface change.\n        // Assume: always an object.\n\n        var componentCache = getComponentCache(theme, WithStyles, direction); // Determine what's changed\n\n        var interfaceChanged = !componentCache || !componentCache.stylesInterface || stylesInterface && componentCache.stylesInterface !== stylesInterface;\n        var themeChanged = !componentCache || componentCache.theme !== theme; // If the interface and theme haven't changed for this direction,\n        // we return the cached props immediately.\n\n        if (!interfaceChanged && !themeChanged) {\n          return componentCache.props;\n        } // If the theme or the interface changed, then there are some values\n        // we need to recalculate. We avoid recalculating the ones we already\n        // calculated in the past if the objects they're derived from have not\n        // changed.\n\n\n        var create = interfaceChanged && makeCreateFn(direction, stylesInterface) || componentCache.create;\n        var resolve = interfaceChanged && makeResolveFn(direction, stylesInterface) || componentCache.resolve; // Derive the css function prop\n\n        var css = interfaceChanged && function () {\n          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n            args[_key] = arguments[_key];\n          }\n\n          return resolve(args);\n        } || componentCache.props.css; // Get or calculate the themed styles from the stylesFn:\n        // Uses a separate cache at the component level, not at the instance level,\n        // to only apply the theme to the stylesFn once per component class per theme.\n\n\n        var stylesFnResult = getOrCreateStylesFnResultCache(theme); // Derive the styles prop: recalculate it if create changed, or stylesFnResult changed\n\n        var styles = (interfaceChanged || stylesFnResult !== componentCache.stylesFnResult) && create(stylesFnResult) || componentCache.props.styles; // Put the new props together\n\n        var props = {\n          css: css,\n          styles: styles,\n          theme: theme\n        }; // Update the cache with all the new values\n\n        updateComponentCache(theme, WithStyles, direction, {\n          stylesInterface: stylesInterface,\n          theme: theme,\n          create: create,\n          resolve: resolve,\n          stylesFnResult: stylesFnResult,\n          props: props\n        });\n        return props;\n      };\n\n      _proto.flush = function flush() {\n        var stylesInterface = this.getCurrentInterface();\n\n        if (stylesInterface && stylesInterface.flush) {\n          stylesInterface.flush();\n        }\n      };\n\n      _proto.render = function render() {\n        var _ref2;\n\n        // We only want to re-render if the theme, stylesInterface, or direction change.\n        // These values are in context so we're listening for their updates.\n        // this.getProps() derives the props from the theme, stylesInterface, and direction in\n        // context, and memoizes them on the instance per direction.\n        var _this$getProps = this.getProps(),\n            theme = _this$getProps.theme,\n            styles = _this$getProps.styles,\n            css = _this$getProps.css; // Flush if specified\n\n\n        if (flushBefore) {\n          this.flush();\n        }\n\n        return _react[\"default\"].createElement(WrappedComponent, (0, _extends2[\"default\"])({}, this.props, (_ref2 = {}, (0, _defineProperty2[\"default\"])(_ref2, themePropName, theme), (0, _defineProperty2[\"default\"])(_ref2, stylesPropName, styles), (0, _defineProperty2[\"default\"])(_ref2, cssPropName, css), _ref2)));\n      };\n\n      return WithStyles;\n    }(BaseClass); // Copy the wrapped component's prop types and default props on WithStyles\n\n\n    if (WrappedComponent.propTypes) {\n      WithStyles.propTypes = _objectSpread({}, WrappedComponent.propTypes);\n      delete WithStyles.propTypes[stylesPropName];\n      delete WithStyles.propTypes[themePropName];\n      delete WithStyles.propTypes[cssPropName];\n    }\n\n    if (WrappedComponent.defaultProps) {\n      WithStyles.defaultProps = _objectSpread({}, WrappedComponent.defaultProps);\n    }\n\n    WithStyles.contextType = _WithStylesContext[\"default\"];\n    WithStyles.WrappedComponent = WrappedComponent;\n    WithStyles.displayName = \"withStyles(\".concat(wrappedComponentName, \")\");\n    return (0, _hoistNonReactStatics[\"default\"])(WithStyles, WrappedComponent);\n  };\n}\n\nvar _default = withStyles;\n/**\n * Deprecated: Do not use directly. Please wrap your component in `withStyles` and use the `css`\n * prop injected via props instead.\n */\n\nexports[\"default\"] = _default;\nvar css = _ThemedStyleSheet[\"default\"].resolveLTR;\nexports.css = css;", "if performance? and performance.now\n  module.exports = -> performance.now()\nelse if process? and process.hrtime\n  module.exports = -> (getNanoSeconds() - nodeLoadTime) / 1e6\n  hrtime = process.hrtime\n  getNanoSeconds = ->\n    hr = hrtime()\n    hr[0] * 1e9 + hr[1]\n  moduleLoadTime = getNanoSeconds()\n  upTime = process.uptime() * 1e9\n  nodeLoadTime = moduleLoadTime - upTime\nelse if Date.now\n  module.exports = -> Date.now() - loadTime\n  loadTime = Date.now()\nelse\n  module.exports = -> new Date().getTime() - loadTime\n  loadTime = new Date().getTime()\n", "var now = require('performance-now')\n  , root = typeof window === 'undefined' ? global : window\n  , vendors = ['moz', 'webkit']\n  , suffix = 'AnimationFrame'\n  , raf = root['request' + suffix]\n  , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n  raf = root[vendors[i] + 'Request' + suffix]\n  caf = root[vendors[i] + 'Cancel' + suffix]\n      || root[vendors[i] + 'CancelRequest' + suffix]\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n  var last = 0\n    , id = 0\n    , queue = []\n    , frameDuration = 1000 / 60\n\n  raf = function(callback) {\n    if(queue.length === 0) {\n      var _now = now()\n        , next = Math.max(0, frameDuration - (_now - last))\n      last = next + _now\n      setTimeout(function() {\n        var cp = queue.slice(0)\n        // Clear queue here to prevent\n        // callbacks from appending listeners\n        // to the current frame's queue\n        queue.length = 0\n        for(var i = 0; i < cp.length; i++) {\n          if(!cp[i].cancelled) {\n            try{\n              cp[i].callback(last)\n            } catch(e) {\n              setTimeout(function() { throw e }, 0)\n            }\n          }\n        }\n      }, Math.round(next))\n    }\n    queue.push({\n      handle: ++id,\n      callback: callback,\n      cancelled: false\n    })\n    return id\n  }\n\n  caf = function(handle) {\n    for(var i = 0; i < queue.length; i++) {\n      if(queue[i].handle === handle) {\n        queue[i].cancelled = true\n      }\n    }\n  }\n}\n\nmodule.exports = function(fn) {\n  // Wrap in a new function to prevent\n  // `cancel` potentially being assigned\n  // to the native rAF function\n  return raf.call(root, fn)\n}\nmodule.exports.cancel = function() {\n  caf.apply(root, arguments)\n}\nmodule.exports.polyfill = function(object) {\n  if (!object) {\n    object = root;\n  }\n  object.requestAnimationFrame = raf\n  object.cancelAnimationFrame = caf\n}\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CalendarDayPhrases = exports.DayPickerNavigationPhrases = exports.DayPickerKeyboardShortcutsPhrases = exports.DayPickerPhrases = exports.SingleDatePickerInputPhrases = exports.SingleDatePickerPhrases = exports.DateRangePickerInputPhrases = exports.DateRangePickerPhrases = exports[\"default\"] = void 0;\nvar calendarLabel = 'Calendar';\nvar roleDescription = 'datepicker';\nvar closeDatePicker = 'Close';\nvar focusStartDate = 'Interact with the calendar and add the check-in date for your trip.';\nvar clearDate = 'Clear Date';\nvar clearDates = 'Clear Dates';\nvar jumpToPrevMonth = 'Move backward to switch to the previous month.';\nvar jumpToNextMonth = 'Move forward to switch to the next month.';\nvar keyboardShortcuts = 'Keyboard Shortcuts';\nvar showKeyboardShortcutsPanel = 'Open the keyboard shortcuts panel.';\nvar hideKeyboardShortcutsPanel = 'Close the shortcuts panel.';\nvar openThisPanel = 'Open this panel.';\nvar enterKey = 'Enter key';\nvar leftArrowRightArrow = 'Right and left arrow keys';\nvar upArrowDownArrow = 'up and down arrow keys';\nvar pageUpPageDown = 'page up and page down keys';\nvar homeEnd = 'Home and end keys';\nvar escape = 'Escape key';\nvar questionMark = 'Question mark';\nvar selectFocusedDate = 'Select the date in focus.';\nvar moveFocusByOneDay = 'Move backward (left) and forward (right) by one day.';\nvar moveFocusByOneWeek = 'Move backward (up) and forward (down) by one week.';\nvar moveFocusByOneMonth = 'Switch months.';\nvar moveFocustoStartAndEndOfWeek = 'Go to the first or last day of a week.';\nvar returnFocusToInput = 'Return to the date input field.';\nvar keyboardForwardNavigationInstructions = 'Navigate forward to interact with the calendar and select a date. Press the question mark key to get the keyboard shortcuts for changing dates.';\nvar keyboardBackwardNavigationInstructions = 'Navigate backward to interact with the calendar and select a date. Press the question mark key to get the keyboard shortcuts for changing dates.';\n\nvar chooseAvailableStartDate = function chooseAvailableStartDate(_ref) {\n  var date = _ref.date;\n  return \"Choose \".concat(date, \" as your check-in date. It\\u2019s available.\");\n};\n\nvar chooseAvailableEndDate = function chooseAvailableEndDate(_ref2) {\n  var date = _ref2.date;\n  return \"Choose \".concat(date, \" as your check-out date. It\\u2019s available.\");\n};\n\nvar chooseAvailableDate = function chooseAvailableDate(_ref3) {\n  var date = _ref3.date;\n  return date;\n};\n\nvar dateIsUnavailable = function dateIsUnavailable(_ref4) {\n  var date = _ref4.date;\n  return \"Not available. \".concat(date);\n};\n\nvar dateIsSelected = function dateIsSelected(_ref5) {\n  var date = _ref5.date;\n  return \"Selected. \".concat(date);\n};\n\nvar dateIsSelectedAsStartDate = function dateIsSelectedAsStartDate(_ref6) {\n  var date = _ref6.date;\n  return \"Selected as start date. \".concat(date);\n};\n\nvar dateIsSelectedAsEndDate = function dateIsSelectedAsEndDate(_ref7) {\n  var date = _ref7.date;\n  return \"Selected as end date. \".concat(date);\n};\n\nvar _default = {\n  calendarLabel: calendarLabel,\n  roleDescription: roleDescription,\n  closeDatePicker: closeDatePicker,\n  focusStartDate: focusStartDate,\n  clearDate: clearDate,\n  clearDates: clearDates,\n  jumpToPrevMonth: jumpToPrevMonth,\n  jumpToNextMonth: jumpToNextMonth,\n  keyboardShortcuts: keyboardShortcuts,\n  showKeyboardShortcutsPanel: showKeyboardShortcutsPanel,\n  hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n  openThisPanel: openThisPanel,\n  enterKey: enterKey,\n  leftArrowRightArrow: leftArrowRightArrow,\n  upArrowDownArrow: upArrowDownArrow,\n  pageUpPageDown: pageUpPageDown,\n  homeEnd: homeEnd,\n  escape: escape,\n  questionMark: questionMark,\n  selectFocusedDate: selectFocusedDate,\n  moveFocusByOneDay: moveFocusByOneDay,\n  moveFocusByOneWeek: moveFocusByOneWeek,\n  moveFocusByOneMonth: moveFocusByOneMonth,\n  moveFocustoStartAndEndOfWeek: moveFocustoStartAndEndOfWeek,\n  returnFocusToInput: returnFocusToInput,\n  keyboardForwardNavigationInstructions: keyboardForwardNavigationInstructions,\n  keyboardBackwardNavigationInstructions: keyboardBackwardNavigationInstructions,\n  chooseAvailableStartDate: chooseAvailableStartDate,\n  chooseAvailableEndDate: chooseAvailableEndDate,\n  dateIsUnavailable: dateIsUnavailable,\n  dateIsSelected: dateIsSelected,\n  dateIsSelectedAsStartDate: dateIsSelectedAsStartDate,\n  dateIsSelectedAsEndDate: dateIsSelectedAsEndDate\n};\nexports[\"default\"] = _default;\nvar DateRangePickerPhrases = {\n  calendarLabel: calendarLabel,\n  roleDescription: roleDescription,\n  closeDatePicker: closeDatePicker,\n  clearDates: clearDates,\n  focusStartDate: focusStartDate,\n  jumpToPrevMonth: jumpToPrevMonth,\n  jumpToNextMonth: jumpToNextMonth,\n  keyboardShortcuts: keyboardShortcuts,\n  showKeyboardShortcutsPanel: showKeyboardShortcutsPanel,\n  hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n  openThisPanel: openThisPanel,\n  enterKey: enterKey,\n  leftArrowRightArrow: leftArrowRightArrow,\n  upArrowDownArrow: upArrowDownArrow,\n  pageUpPageDown: pageUpPageDown,\n  homeEnd: homeEnd,\n  escape: escape,\n  questionMark: questionMark,\n  selectFocusedDate: selectFocusedDate,\n  moveFocusByOneDay: moveFocusByOneDay,\n  moveFocusByOneWeek: moveFocusByOneWeek,\n  moveFocusByOneMonth: moveFocusByOneMonth,\n  moveFocustoStartAndEndOfWeek: moveFocustoStartAndEndOfWeek,\n  returnFocusToInput: returnFocusToInput,\n  keyboardForwardNavigationInstructions: keyboardForwardNavigationInstructions,\n  keyboardBackwardNavigationInstructions: keyboardBackwardNavigationInstructions,\n  chooseAvailableStartDate: chooseAvailableStartDate,\n  chooseAvailableEndDate: chooseAvailableEndDate,\n  dateIsUnavailable: dateIsUnavailable,\n  dateIsSelected: dateIsSelected,\n  dateIsSelectedAsStartDate: dateIsSelectedAsStartDate,\n  dateIsSelectedAsEndDate: dateIsSelectedAsEndDate\n};\nexports.DateRangePickerPhrases = DateRangePickerPhrases;\nvar DateRangePickerInputPhrases = {\n  focusStartDate: focusStartDate,\n  clearDates: clearDates,\n  keyboardForwardNavigationInstructions: keyboardForwardNavigationInstructions,\n  keyboardBackwardNavigationInstructions: keyboardBackwardNavigationInstructions\n};\nexports.DateRangePickerInputPhrases = DateRangePickerInputPhrases;\nvar SingleDatePickerPhrases = {\n  calendarLabel: calendarLabel,\n  roleDescription: roleDescription,\n  closeDatePicker: closeDatePicker,\n  clearDate: clearDate,\n  jumpToPrevMonth: jumpToPrevMonth,\n  jumpToNextMonth: jumpToNextMonth,\n  keyboardShortcuts: keyboardShortcuts,\n  showKeyboardShortcutsPanel: showKeyboardShortcutsPanel,\n  hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n  openThisPanel: openThisPanel,\n  enterKey: enterKey,\n  leftArrowRightArrow: leftArrowRightArrow,\n  upArrowDownArrow: upArrowDownArrow,\n  pageUpPageDown: pageUpPageDown,\n  homeEnd: homeEnd,\n  escape: escape,\n  questionMark: questionMark,\n  selectFocusedDate: selectFocusedDate,\n  moveFocusByOneDay: moveFocusByOneDay,\n  moveFocusByOneWeek: moveFocusByOneWeek,\n  moveFocusByOneMonth: moveFocusByOneMonth,\n  moveFocustoStartAndEndOfWeek: moveFocustoStartAndEndOfWeek,\n  returnFocusToInput: returnFocusToInput,\n  keyboardForwardNavigationInstructions: keyboardForwardNavigationInstructions,\n  keyboardBackwardNavigationInstructions: keyboardBackwardNavigationInstructions,\n  chooseAvailableDate: chooseAvailableDate,\n  dateIsUnavailable: dateIsUnavailable,\n  dateIsSelected: dateIsSelected\n};\nexports.SingleDatePickerPhrases = SingleDatePickerPhrases;\nvar SingleDatePickerInputPhrases = {\n  clearDate: clearDate,\n  keyboardForwardNavigationInstructions: keyboardForwardNavigationInstructions,\n  keyboardBackwardNavigationInstructions: keyboardBackwardNavigationInstructions\n};\nexports.SingleDatePickerInputPhrases = SingleDatePickerInputPhrases;\nvar DayPickerPhrases = {\n  calendarLabel: calendarLabel,\n  roleDescription: roleDescription,\n  jumpToPrevMonth: jumpToPrevMonth,\n  jumpToNextMonth: jumpToNextMonth,\n  keyboardShortcuts: keyboardShortcuts,\n  showKeyboardShortcutsPanel: showKeyboardShortcutsPanel,\n  hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n  openThisPanel: openThisPanel,\n  enterKey: enterKey,\n  leftArrowRightArrow: leftArrowRightArrow,\n  upArrowDownArrow: upArrowDownArrow,\n  pageUpPageDown: pageUpPageDown,\n  homeEnd: homeEnd,\n  escape: escape,\n  questionMark: questionMark,\n  selectFocusedDate: selectFocusedDate,\n  moveFocusByOneDay: moveFocusByOneDay,\n  moveFocusByOneWeek: moveFocusByOneWeek,\n  moveFocusByOneMonth: moveFocusByOneMonth,\n  moveFocustoStartAndEndOfWeek: moveFocustoStartAndEndOfWeek,\n  returnFocusToInput: returnFocusToInput,\n  chooseAvailableStartDate: chooseAvailableStartDate,\n  chooseAvailableEndDate: chooseAvailableEndDate,\n  chooseAvailableDate: chooseAvailableDate,\n  dateIsUnavailable: dateIsUnavailable,\n  dateIsSelected: dateIsSelected,\n  dateIsSelectedAsStartDate: dateIsSelectedAsStartDate,\n  dateIsSelectedAsEndDate: dateIsSelectedAsEndDate\n};\nexports.DayPickerPhrases = DayPickerPhrases;\nvar DayPickerKeyboardShortcutsPhrases = {\n  keyboardShortcuts: keyboardShortcuts,\n  showKeyboardShortcutsPanel: showKeyboardShortcutsPanel,\n  hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n  openThisPanel: openThisPanel,\n  enterKey: enterKey,\n  leftArrowRightArrow: leftArrowRightArrow,\n  upArrowDownArrow: upArrowDownArrow,\n  pageUpPageDown: pageUpPageDown,\n  homeEnd: homeEnd,\n  escape: escape,\n  questionMark: questionMark,\n  selectFocusedDate: selectFocusedDate,\n  moveFocusByOneDay: moveFocusByOneDay,\n  moveFocusByOneWeek: moveFocusByOneWeek,\n  moveFocusByOneMonth: moveFocusByOneMonth,\n  moveFocustoStartAndEndOfWeek: moveFocustoStartAndEndOfWeek,\n  returnFocusToInput: returnFocusToInput\n};\nexports.DayPickerKeyboardShortcutsPhrases = DayPickerKeyboardShortcutsPhrases;\nvar DayPickerNavigationPhrases = {\n  jumpToPrevMonth: jumpToPrevMonth,\n  jumpToNextMonth: jumpToNextMonth\n};\nexports.DayPickerNavigationPhrases = DayPickerNavigationPhrases;\nvar CalendarDayPhrases = {\n  chooseAvailableDate: chooseAvailableDate,\n  dateIsUnavailable: dateIsUnavailable,\n  dateIsSelected: dateIsSelected,\n  dateIsSelectedAsStartDate: dateIsSelectedAsStartDate,\n  dateIsSelectedAsEndDate: dateIsSelectedAsEndDate\n};\nexports.CalendarDayPhrases = CalendarDayPhrases;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getPhrasePropTypes;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction getPhrasePropTypes(defaultPhrases) {\n  return Object.keys(defaultPhrases).reduce(function (phrases, key) {\n    return _objectSpread({}, phrases, (0, _defineProperty2[\"default\"])({}, key, _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].string, _propTypes[\"default\"].func, _propTypes[\"default\"].node])));\n  }, {});\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getPhrase;\n\nfunction getPhrase(phrase, args) {\n  if (typeof phrase === 'string') return phrase;\n\n  if (typeof phrase === 'function') {\n    return phrase(args);\n  }\n\n  return '';\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MODIFIER_KEY_NAMES = exports.DEFAULT_VERTICAL_SPACING = exports.FANG_HEIGHT_PX = exports.FANG_WIDTH_PX = exports.WEEKDAYS = exports.BLOCKED_MODIFIER = exports.DAY_SIZE = exports.OPEN_UP = exports.OPEN_DOWN = exports.ANCHOR_RIGHT = exports.ANCHOR_LEFT = exports.INFO_POSITION_AFTER = exports.INFO_POSITION_BEFORE = exports.INFO_POSITION_BOTTOM = exports.INFO_POSITION_TOP = exports.ICON_AFTER_POSITION = exports.ICON_BEFORE_POSITION = exports.NAV_POSITION_TOP = exports.NAV_POSITION_BOTTOM = exports.VERTICAL_SCROLLABLE = exports.VERTICAL_ORIENTATION = exports.HORIZONTAL_ORIENTATION = exports.END_DATE = exports.START_DATE = exports.ISO_MONTH_FORMAT = exports.ISO_FORMAT = exports.DISPLAY_FORMAT = void 0;\nvar DISPLAY_FORMAT = 'L';\nexports.DISPLAY_FORMAT = DISPLAY_FORMAT;\nvar ISO_FORMAT = 'YYYY-MM-DD';\nexports.ISO_FORMAT = ISO_FORMAT;\nvar ISO_MONTH_FORMAT = 'YYYY-MM'; // TODO delete this line of dead code on next breaking change\n\nexports.ISO_MONTH_FORMAT = ISO_MONTH_FORMAT;\nvar START_DATE = 'startDate';\nexports.START_DATE = START_DATE;\nvar END_DATE = 'endDate';\nexports.END_DATE = END_DATE;\nvar HORIZONTAL_ORIENTATION = 'horizontal';\nexports.HORIZONTAL_ORIENTATION = HORIZONTAL_ORIENTATION;\nvar VERTICAL_ORIENTATION = 'vertical';\nexports.VERTICAL_ORIENTATION = VERTICAL_ORIENTATION;\nvar VERTICAL_SCROLLABLE = 'verticalScrollable';\nexports.VERTICAL_SCROLLABLE = VERTICAL_SCROLLABLE;\nvar NAV_POSITION_BOTTOM = 'navPositionBottom';\nexports.NAV_POSITION_BOTTOM = NAV_POSITION_BOTTOM;\nvar NAV_POSITION_TOP = 'navPositionTop';\nexports.NAV_POSITION_TOP = NAV_POSITION_TOP;\nvar ICON_BEFORE_POSITION = 'before';\nexports.ICON_BEFORE_POSITION = ICON_BEFORE_POSITION;\nvar ICON_AFTER_POSITION = 'after';\nexports.ICON_AFTER_POSITION = ICON_AFTER_POSITION;\nvar INFO_POSITION_TOP = 'top';\nexports.INFO_POSITION_TOP = INFO_POSITION_TOP;\nvar INFO_POSITION_BOTTOM = 'bottom';\nexports.INFO_POSITION_BOTTOM = INFO_POSITION_BOTTOM;\nvar INFO_POSITION_BEFORE = 'before';\nexports.INFO_POSITION_BEFORE = INFO_POSITION_BEFORE;\nvar INFO_POSITION_AFTER = 'after';\nexports.INFO_POSITION_AFTER = INFO_POSITION_AFTER;\nvar ANCHOR_LEFT = 'left';\nexports.ANCHOR_LEFT = ANCHOR_LEFT;\nvar ANCHOR_RIGHT = 'right';\nexports.ANCHOR_RIGHT = ANCHOR_RIGHT;\nvar OPEN_DOWN = 'down';\nexports.OPEN_DOWN = OPEN_DOWN;\nvar OPEN_UP = 'up';\nexports.OPEN_UP = OPEN_UP;\nvar DAY_SIZE = 39;\nexports.DAY_SIZE = DAY_SIZE;\nvar BLOCKED_MODIFIER = 'blocked';\nexports.BLOCKED_MODIFIER = BLOCKED_MODIFIER;\nvar WEEKDAYS = [0, 1, 2, 3, 4, 5, 6];\nexports.WEEKDAYS = WEEKDAYS;\nvar FANG_WIDTH_PX = 20;\nexports.FANG_WIDTH_PX = FANG_WIDTH_PX;\nvar FANG_HEIGHT_PX = 10;\nexports.FANG_HEIGHT_PX = FANG_HEIGHT_PX;\nvar DEFAULT_VERTICAL_SPACING = 22;\nexports.DEFAULT_VERTICAL_SPACING = DEFAULT_VERTICAL_SPACING;\nvar MODIFIER_KEY_NAMES = new Set(['Shift', 'Control', 'Alt', 'Meta']);\nexports.MODIFIER_KEY_NAMES = MODIFIER_KEY_NAMES;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getCalendarDaySettings;\n\nvar _getPhrase = _interopRequireDefault(require(\"./getPhrase\"));\n\nvar _constants = require(\"../constants\");\n\nfunction isSelected(modifiers) {\n  return modifiers.has('selected') || modifiers.has('selected-span') || modifiers.has('selected-start') || modifiers.has('selected-end');\n}\n\nfunction shouldUseDefaultCursor(modifiers) {\n  return modifiers.has('blocked-minimum-nights') || modifiers.has('blocked-calendar') || modifiers.has('blocked-out-of-range');\n}\n\nfunction isHoveredSpan(modifiers) {\n  if (isSelected(modifiers)) return false;\n  return modifiers.has('hovered-span') || modifiers.has('after-hovered-start') || modifiers.has('before-hovered-end');\n}\n\nfunction getAriaLabel(phrases, modifiers, day, ariaLabelFormat) {\n  var chooseAvailableDate = phrases.chooseAvailableDate,\n      dateIsUnavailable = phrases.dateIsUnavailable,\n      dateIsSelected = phrases.dateIsSelected,\n      dateIsSelectedAsStartDate = phrases.dateIsSelectedAsStartDate,\n      dateIsSelectedAsEndDate = phrases.dateIsSelectedAsEndDate;\n  var formattedDate = {\n    date: day.format(ariaLabelFormat)\n  };\n\n  if (modifiers.has('selected-start') && dateIsSelectedAsStartDate) {\n    return (0, _getPhrase[\"default\"])(dateIsSelectedAsStartDate, formattedDate);\n  }\n\n  if (modifiers.has('selected-end') && dateIsSelectedAsEndDate) {\n    return (0, _getPhrase[\"default\"])(dateIsSelectedAsEndDate, formattedDate);\n  }\n\n  if (isSelected(modifiers) && dateIsSelected) {\n    return (0, _getPhrase[\"default\"])(dateIsSelected, formattedDate);\n  }\n\n  if (modifiers.has(_constants.BLOCKED_MODIFIER)) {\n    return (0, _getPhrase[\"default\"])(dateIsUnavailable, formattedDate);\n  }\n\n  return (0, _getPhrase[\"default\"])(chooseAvailableDate, formattedDate);\n}\n\nfunction getCalendarDaySettings(day, ariaLabelFormat, daySize, modifiers, phrases) {\n  return {\n    ariaLabel: getAriaLabel(phrases, modifiers, day, ariaLabelFormat),\n    hoveredSpan: isHoveredSpan(modifiers),\n    isOutsideRange: modifiers.has('blocked-out-of-range'),\n    selected: isSelected(modifiers),\n    useDefaultCursor: shouldUseDefaultCursor(modifiers),\n    daySizeStyles: {\n      width: daySize,\n      height: daySize - 1\n    }\n  };\n}", "function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _arrayWithoutHoles(r) {\n  if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nmodule.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _iterableToArray(r) {\n  if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nmodule.exports = _iterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayWithoutHoles = require(\"./arrayWithoutHoles.js\");\nvar iterableToArray = require(\"./iterableToArray.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableSpread = require(\"./nonIterableSpread.js\");\nfunction _toConsumableArray(r) {\n  return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nmodule.exports = _toConsumableArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _default = (0, _airbnbPropTypes.and)([_propTypes[\"default\"].instanceOf(Set), function modifiers(props, propName) {\n  for (var _len = arguments.length, rest = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n    rest[_key - 2] = arguments[_key];\n  }\n\n  var propValue = props[propName];\n  var firstError;\n  (0, _toConsumableArray2[\"default\"])(propValue).some(function (v, i) {\n    var _PropTypes$string;\n\n    var fakePropName = \"\".concat(propName, \": index \").concat(i);\n    firstError = (_PropTypes$string = _propTypes[\"default\"].string).isRequired.apply(_PropTypes$string, [(0, _defineProperty2[\"default\"])({}, fakePropName, v), fakePropName].concat(rest));\n    return firstError != null;\n  });\n  return firstError == null ? null : firstError;\n}], 'Modifiers (Set of Strings)');\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = exports.PureCalendarDay = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _raf = _interopRequireDefault(require(\"raf\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _getCalendarDaySettings = _interopRequireDefault(require(\"../utils/getCalendarDaySettings\"));\n\nvar _ModifiersShape = _interopRequireDefault(require(\"../shapes/ModifiersShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  day: _reactMomentProptypes[\"default\"].momentObj,\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  isOutsideDay: _propTypes[\"default\"].bool,\n  modifiers: _ModifiersShape[\"default\"],\n  isFocused: _propTypes[\"default\"].bool,\n  tabIndex: _propTypes[\"default\"].oneOf([0, -1]),\n  onDayClick: _propTypes[\"default\"].func,\n  onDayMouseEnter: _propTypes[\"default\"].func,\n  onDayMouseLeave: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  ariaLabelFormat: _propTypes[\"default\"].string,\n  // internationalization\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.CalendarDayPhrases))\n})) : {};\nvar defaultProps = {\n  day: (0, _moment[\"default\"])(),\n  daySize: _constants.DAY_SIZE,\n  isOutsideDay: false,\n  modifiers: new Set(),\n  isFocused: false,\n  tabIndex: -1,\n  onDayClick: function onDayClick() {},\n  onDayMouseEnter: function onDayMouseEnter() {},\n  onDayMouseLeave: function onDayMouseLeave() {},\n  renderDayContents: null,\n  ariaLabelFormat: 'dddd, LL',\n  // internationalization\n  phrases: _defaultPhrases.CalendarDayPhrases\n};\n\nvar CalendarDay =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(CalendarDay, _ref);\n  var _proto = CalendarDay.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function CalendarDay() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _ref.call.apply(_ref, [this].concat(args)) || this;\n    _this.setButtonRef = _this.setButtonRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var _this2 = this;\n\n    var _this$props = this.props,\n        isFocused = _this$props.isFocused,\n        tabIndex = _this$props.tabIndex;\n\n    if (tabIndex === 0) {\n      if (isFocused || tabIndex !== prevProps.tabIndex) {\n        (0, _raf[\"default\"])(function () {\n          if (_this2.buttonRef) {\n            _this2.buttonRef.focus();\n          }\n        });\n      }\n    }\n  };\n\n  _proto.onDayClick = function onDayClick(day, e) {\n    var onDayClick = this.props.onDayClick;\n    onDayClick(day, e);\n  };\n\n  _proto.onDayMouseEnter = function onDayMouseEnter(day, e) {\n    var onDayMouseEnter = this.props.onDayMouseEnter;\n    onDayMouseEnter(day, e);\n  };\n\n  _proto.onDayMouseLeave = function onDayMouseLeave(day, e) {\n    var onDayMouseLeave = this.props.onDayMouseLeave;\n    onDayMouseLeave(day, e);\n  };\n\n  _proto.onKeyDown = function onKeyDown(day, e) {\n    var onDayClick = this.props.onDayClick;\n    var key = e.key;\n\n    if (key === 'Enter' || key === ' ') {\n      onDayClick(day, e);\n    }\n  };\n\n  _proto.setButtonRef = function setButtonRef(ref) {\n    this.buttonRef = ref;\n  };\n\n  _proto.render = function render() {\n    var _this3 = this;\n\n    var _this$props2 = this.props,\n        day = _this$props2.day,\n        ariaLabelFormat = _this$props2.ariaLabelFormat,\n        daySize = _this$props2.daySize,\n        isOutsideDay = _this$props2.isOutsideDay,\n        modifiers = _this$props2.modifiers,\n        renderDayContents = _this$props2.renderDayContents,\n        tabIndex = _this$props2.tabIndex,\n        styles = _this$props2.styles,\n        phrases = _this$props2.phrases;\n    if (!day) return _react[\"default\"].createElement(\"td\", null);\n\n    var _getCalendarDaySettin = (0, _getCalendarDaySettings[\"default\"])(day, ariaLabelFormat, daySize, modifiers, phrases),\n        daySizeStyles = _getCalendarDaySettin.daySizeStyles,\n        useDefaultCursor = _getCalendarDaySettin.useDefaultCursor,\n        selected = _getCalendarDaySettin.selected,\n        hoveredSpan = _getCalendarDaySettin.hoveredSpan,\n        isOutsideRange = _getCalendarDaySettin.isOutsideRange,\n        ariaLabel = _getCalendarDaySettin.ariaLabel;\n\n    return _react[\"default\"].createElement(\"td\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.CalendarDay, useDefaultCursor && styles.CalendarDay__defaultCursor, styles.CalendarDay__default, isOutsideDay && styles.CalendarDay__outside, modifiers.has('today') && styles.CalendarDay__today, modifiers.has('first-day-of-week') && styles.CalendarDay__firstDayOfWeek, modifiers.has('last-day-of-week') && styles.CalendarDay__lastDayOfWeek, modifiers.has('hovered-offset') && styles.CalendarDay__hovered_offset, modifiers.has('hovered-start-first-possible-end') && styles.CalendarDay__hovered_start_first_possible_end, modifiers.has('hovered-start-blocked-minimum-nights') && styles.CalendarDay__hovered_start_blocked_min_nights, modifiers.has('highlighted-calendar') && styles.CalendarDay__highlighted_calendar, modifiers.has('blocked-minimum-nights') && styles.CalendarDay__blocked_minimum_nights, modifiers.has('blocked-calendar') && styles.CalendarDay__blocked_calendar, hoveredSpan && styles.CalendarDay__hovered_span, modifiers.has('after-hovered-start') && styles.CalendarDay__after_hovered_start, modifiers.has('selected-span') && styles.CalendarDay__selected_span, modifiers.has('selected-start') && styles.CalendarDay__selected_start, modifiers.has('selected-end') && styles.CalendarDay__selected_end, selected && !modifiers.has('selected-span') && styles.CalendarDay__selected, modifiers.has('before-hovered-end') && styles.CalendarDay__before_hovered_end, modifiers.has('no-selected-start-before-selected-end') && styles.CalendarDay__no_selected_start_before_selected_end, modifiers.has('selected-start-in-hovered-span') && styles.CalendarDay__selected_start_in_hovered_span, modifiers.has('selected-end-in-hovered-span') && styles.CalendarDay__selected_end_in_hovered_span, modifiers.has('selected-start-no-selected-end') && styles.CalendarDay__selected_start_no_selected_end, modifiers.has('selected-end-no-selected-start') && styles.CalendarDay__selected_end_no_selected_start, isOutsideRange && styles.CalendarDay__blocked_out_of_range, daySizeStyles), {\n      role: \"button\" // eslint-disable-line jsx-a11y/no-noninteractive-element-to-interactive-role\n      ,\n      ref: this.setButtonRef,\n      \"aria-disabled\": modifiers.has('blocked'),\n      \"aria-label\": ariaLabel,\n      onMouseEnter: function onMouseEnter(e) {\n        _this3.onDayMouseEnter(day, e);\n      },\n      onMouseLeave: function onMouseLeave(e) {\n        _this3.onDayMouseLeave(day, e);\n      },\n      onMouseUp: function onMouseUp(e) {\n        e.currentTarget.blur();\n      },\n      onClick: function onClick(e) {\n        _this3.onDayClick(day, e);\n      },\n      onKeyDown: function onKeyDown(e) {\n        _this3.onKeyDown(day, e);\n      },\n      tabIndex: tabIndex\n    }), renderDayContents ? renderDayContents(day, modifiers) : day.format('D'));\n  };\n\n  return CalendarDay;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports.PureCalendarDay = CalendarDay;\nCalendarDay.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nCalendarDay.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      color = _ref2$reactDates.color,\n      font = _ref2$reactDates.font;\n  return {\n    CalendarDay: {\n      boxSizing: 'border-box',\n      cursor: 'pointer',\n      fontSize: font.size,\n      textAlign: 'center',\n      ':active': {\n        outline: 0\n      }\n    },\n    CalendarDay__defaultCursor: {\n      cursor: 'default'\n    },\n    CalendarDay__default: {\n      border: \"1px solid \".concat(color.core.borderLight),\n      color: color.text,\n      background: color.background,\n      ':hover': {\n        background: color.core.borderLight,\n        border: \"1px solid \".concat(color.core.borderLight),\n        color: 'inherit'\n      }\n    },\n    CalendarDay__hovered_offset: {\n      background: color.core.borderBright,\n      border: \"1px double \".concat(color.core.borderLight),\n      color: 'inherit'\n    },\n    CalendarDay__outside: {\n      border: 0,\n      background: color.outside.backgroundColor,\n      color: color.outside.color,\n      ':hover': {\n        border: 0\n      }\n    },\n    CalendarDay__blocked_minimum_nights: {\n      background: color.minimumNights.backgroundColor,\n      border: \"1px solid \".concat(color.minimumNights.borderColor),\n      color: color.minimumNights.color,\n      ':hover': {\n        background: color.minimumNights.backgroundColor_hover,\n        color: color.minimumNights.color_active\n      },\n      ':active': {\n        background: color.minimumNights.backgroundColor_active,\n        color: color.minimumNights.color_active\n      }\n    },\n    CalendarDay__highlighted_calendar: {\n      background: color.highlighted.backgroundColor,\n      color: color.highlighted.color,\n      ':hover': {\n        background: color.highlighted.backgroundColor_hover,\n        color: color.highlighted.color_active\n      },\n      ':active': {\n        background: color.highlighted.backgroundColor_active,\n        color: color.highlighted.color_active\n      }\n    },\n    CalendarDay__selected_span: {\n      background: color.selectedSpan.backgroundColor,\n      border: \"1px double \".concat(color.selectedSpan.borderColor),\n      color: color.selectedSpan.color,\n      ':hover': {\n        background: color.selectedSpan.backgroundColor_hover,\n        border: \"1px double \".concat(color.selectedSpan.borderColor),\n        color: color.selectedSpan.color_active\n      },\n      ':active': {\n        background: color.selectedSpan.backgroundColor_active,\n        border: \"1px double \".concat(color.selectedSpan.borderColor),\n        color: color.selectedSpan.color_active\n      }\n    },\n    CalendarDay__selected: {\n      background: color.selected.backgroundColor,\n      border: \"1px double \".concat(color.selected.borderColor),\n      color: color.selected.color,\n      ':hover': {\n        background: color.selected.backgroundColor_hover,\n        border: \"1px double \".concat(color.selected.borderColor),\n        color: color.selected.color_active\n      },\n      ':active': {\n        background: color.selected.backgroundColor_active,\n        border: \"1px double \".concat(color.selected.borderColor),\n        color: color.selected.color_active\n      }\n    },\n    CalendarDay__hovered_span: {\n      background: color.hoveredSpan.backgroundColor,\n      border: \"1px double \".concat(color.hoveredSpan.borderColor),\n      color: color.hoveredSpan.color,\n      ':hover': {\n        background: color.hoveredSpan.backgroundColor_hover,\n        border: \"1px double \".concat(color.hoveredSpan.borderColor),\n        color: color.hoveredSpan.color_active\n      },\n      ':active': {\n        background: color.hoveredSpan.backgroundColor_active,\n        border: \"1px double \".concat(color.hoveredSpan.borderColor),\n        color: color.hoveredSpan.color_active\n      }\n    },\n    CalendarDay__blocked_calendar: {\n      background: color.blocked_calendar.backgroundColor,\n      border: \"1px solid \".concat(color.blocked_calendar.borderColor),\n      color: color.blocked_calendar.color,\n      ':hover': {\n        background: color.blocked_calendar.backgroundColor_hover,\n        border: \"1px solid \".concat(color.blocked_calendar.borderColor),\n        color: color.blocked_calendar.color_active\n      },\n      ':active': {\n        background: color.blocked_calendar.backgroundColor_active,\n        border: \"1px solid \".concat(color.blocked_calendar.borderColor),\n        color: color.blocked_calendar.color_active\n      }\n    },\n    CalendarDay__blocked_out_of_range: {\n      background: color.blocked_out_of_range.backgroundColor,\n      border: \"1px solid \".concat(color.blocked_out_of_range.borderColor),\n      color: color.blocked_out_of_range.color,\n      ':hover': {\n        background: color.blocked_out_of_range.backgroundColor_hover,\n        border: \"1px solid \".concat(color.blocked_out_of_range.borderColor),\n        color: color.blocked_out_of_range.color_active\n      },\n      ':active': {\n        background: color.blocked_out_of_range.backgroundColor_active,\n        border: \"1px solid \".concat(color.blocked_out_of_range.borderColor),\n        color: color.blocked_out_of_range.color_active\n      }\n    },\n    CalendarDay__hovered_start_first_possible_end: {\n      background: color.core.borderLighter,\n      border: \"1px double \".concat(color.core.borderLighter)\n    },\n    CalendarDay__hovered_start_blocked_min_nights: {\n      background: color.core.borderLighter,\n      border: \"1px double \".concat(color.core.borderLight)\n    },\n    CalendarDay__selected_start: {},\n    CalendarDay__selected_end: {},\n    CalendarDay__today: {},\n    CalendarDay__firstDayOfWeek: {},\n    CalendarDay__lastDayOfWeek: {},\n    CalendarDay__after_hovered_start: {},\n    CalendarDay__before_hovered_end: {},\n    CalendarDay__no_selected_start_before_selected_end: {},\n    CalendarDay__selected_start_in_hovered_span: {},\n    CalendarDay__selected_end_in_hovered_span: {},\n    CalendarDay__selected_start_no_selected_end: {},\n    CalendarDay__selected_end_no_selected_start: {}\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(CalendarDay);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = CalendarWeek;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)({\n  children: _propTypes[\"default\"].node.isRequired\n}) : {};\n\nfunction CalendarWeek(_ref) {\n  var children = _ref.children;\n  return _react[\"default\"].createElement(\"tr\", null, children);\n}\n\nCalendarWeek.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = calculateDimension;\n\nfunction calculateDimension(el, axis) {\n  var borderBox = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var withMargin = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n  if (!el) {\n    return 0;\n  }\n\n  var axisStart = axis === 'width' ? 'Left' : 'Top';\n  var axisEnd = axis === 'width' ? 'Right' : 'Bottom'; // Only read styles if we need to\n\n  var style = !borderBox || withMargin ? window.getComputedStyle(el) : null; // Offset includes border and padding\n\n  var offsetWidth = el.offsetWidth,\n      offsetHeight = el.offsetHeight;\n  var size = axis === 'width' ? offsetWidth : offsetHeight; // Get the inner size\n\n  if (!borderBox) {\n    size -= parseFloat(style[\"padding\".concat(axisStart)]) + parseFloat(style[\"padding\".concat(axisEnd)]) + parseFloat(style[\"border\".concat(axisStart, \"Width\")]) + parseFloat(style[\"border\".concat(axisEnd, \"Width\")]);\n  } // Apply margin\n\n\n  if (withMargin) {\n    size += parseFloat(style[\"margin\".concat(axisStart)]) + parseFloat(style[\"margin\".concat(axisEnd)]);\n  }\n\n  return size;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getCalendarMonthWeeks;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _constants = require(\"../constants\");\n\nfunction getCalendarMonthWeeks(month, enableOutsideDays) {\n  var firstDayOfWeek = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _moment[\"default\"].localeData().firstDayOfWeek();\n\n  if (!_moment[\"default\"].isMoment(month) || !month.isValid()) {\n    throw new TypeError('`month` must be a valid moment object');\n  }\n\n  if (_constants.WEEKDAYS.indexOf(firstDayOfWeek) === -1) {\n    throw new TypeError('`firstDayOfWeek` must be an integer between 0 and 6');\n  } // set utc offset to get correct dates in future (when timezone changes)\n\n\n  var firstOfMonth = month.clone().startOf('month').hour(12);\n  var lastOfMonth = month.clone().endOf('month').hour(12); // calculate the exact first and last days to fill the entire matrix\n  // (considering days outside month)\n\n  var prevDays = (firstOfMonth.day() + 7 - firstDayOfWeek) % 7;\n  var nextDays = (firstDayOfWeek + 6 - lastOfMonth.day()) % 7;\n  var firstDay = firstOfMonth.clone().subtract(prevDays, 'day');\n  var lastDay = lastOfMonth.clone().add(nextDays, 'day');\n  var totalDays = lastDay.diff(firstDay, 'days') + 1;\n  var currentDay = firstDay.clone();\n  var weeksInMonth = [];\n\n  for (var i = 0; i < totalDays; i += 1) {\n    if (i % 7 === 0) {\n      weeksInMonth.push([]);\n    }\n\n    var day = null;\n\n    if (i >= prevDays && i < totalDays - nextDays || enableOutsideDays) {\n      day = currentDay.clone();\n    }\n\n    weeksInMonth[weeksInMonth.length - 1].push(day);\n    currentDay.add(1, 'day');\n  }\n\n  return weeksInMonth;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isSameDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nfunction isSameDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false; // Compare least significant, most likely to change units first\n  // Moment's isSame clones moment inputs and is a tad slow\n\n  return a.date() === b.date() && a.month() === b.month() && a.year() === b.year();\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = toMomentObject;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _constants = require(\"../constants\");\n\nfunction toMomentObject(dateString, customFormat) {\n  var dateFormats = customFormat ? [customFormat, _constants.DISPLAY_FORMAT, _constants.ISO_FORMAT] : [_constants.DISPLAY_FORMAT, _constants.ISO_FORMAT];\n  var date = (0, _moment[\"default\"])(dateString, dateFormats, true);\n  return date.isValid() ? date.hour(12) : null;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = toISODateString;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _toMomentObject = _interopRequireDefault(require(\"./toMomentObject\"));\n\nfunction toISODateString(date, currentFormat) {\n  var dateObj = _moment[\"default\"].isMoment(date) ? date : (0, _toMomentObject[\"default\"])(date, currentFormat);\n  if (!dateObj) return null; // Template strings compiled in strict mode uses concat, which is slow. Since\n  // this code is in a hot path and we want it to be as fast as possible, we\n  // want to use old-fashioned +.\n  // eslint-disable-next-line prefer-template\n\n  return dateObj.year() + '-' + String(dateObj.month() + 1).padStart(2, '0') + '-' + String(dateObj.date()).padStart(2, '0');\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.HORIZONTAL_ORIENTATION, _constants.VERTICAL_ORIENTATION, _constants.VERTICAL_SCROLLABLE]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf(_constants.WEEKDAYS);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _CalendarWeek = _interopRequireDefault(require(\"./CalendarWeek\"));\n\nvar _CalendarDay = _interopRequireDefault(require(\"./CalendarDay\"));\n\nvar _calculateDimension = _interopRequireDefault(require(\"../utils/calculateDimension\"));\n\nvar _getCalendarMonthWeeks = _interopRequireDefault(require(\"../utils/getCalendarMonthWeeks\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"../utils/isSameDay\"));\n\nvar _toISODateString = _interopRequireDefault(require(\"../utils/toISODateString\"));\n\nvar _ModifiersShape = _interopRequireDefault(require(\"../shapes/ModifiersShape\"));\n\nvar _ScrollableOrientationShape = _interopRequireDefault(require(\"../shapes/ScrollableOrientationShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"../shapes/DayOfWeekShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  month: _reactMomentProptypes[\"default\"].momentObj,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  isVisible: _propTypes[\"default\"].bool,\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  modifiers: _propTypes[\"default\"].objectOf(_ModifiersShape[\"default\"]),\n  orientation: _ScrollableOrientationShape[\"default\"],\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  onDayClick: _propTypes[\"default\"].func,\n  onDayMouseEnter: _propTypes[\"default\"].func,\n  onDayMouseLeave: _propTypes[\"default\"].func,\n  onMonthSelect: _propTypes[\"default\"].func,\n  onYearSelect: _propTypes[\"default\"].func,\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  setMonthTitleHeight: _propTypes[\"default\"].func,\n  verticalBorderSpacing: _airbnbPropTypes.nonNegativeInteger,\n  focusedDate: _reactMomentProptypes[\"default\"].momentObj,\n  // indicates focusable day\n  isFocused: _propTypes[\"default\"].bool,\n  // indicates whether or not to move focus to focusable day\n  // i18n\n  monthFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.CalendarDayPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string\n})) : {};\nvar defaultProps = {\n  month: (0, _moment[\"default\"])(),\n  horizontalMonthPadding: 13,\n  isVisible: true,\n  enableOutsideDays: false,\n  modifiers: {},\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  daySize: _constants.DAY_SIZE,\n  onDayClick: function onDayClick() {},\n  onDayMouseEnter: function onDayMouseEnter() {},\n  onDayMouseLeave: function onDayMouseLeave() {},\n  onMonthSelect: function onMonthSelect() {},\n  onYearSelect: function onYearSelect() {},\n  renderMonthText: null,\n  renderCalendarDay: function renderCalendarDay(props) {\n    return _react[\"default\"].createElement(_CalendarDay[\"default\"], props);\n  },\n  renderDayContents: null,\n  renderMonthElement: null,\n  firstDayOfWeek: null,\n  setMonthTitleHeight: null,\n  focusedDate: null,\n  isFocused: false,\n  // i18n\n  monthFormat: 'MMMM YYYY',\n  // english locale\n  phrases: _defaultPhrases.CalendarDayPhrases,\n  dayAriaLabelFormat: undefined,\n  verticalBorderSpacing: undefined\n};\n\nvar CalendarMonth =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(CalendarMonth, _ref);\n  var _proto = CalendarMonth.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function CalendarMonth(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.state = {\n      weeks: (0, _getCalendarMonthWeeks[\"default\"])(props.month, props.enableOutsideDays, props.firstDayOfWeek == null ? _moment[\"default\"].localeData().firstDayOfWeek() : props.firstDayOfWeek)\n    };\n    _this.setCaptionRef = _this.setCaptionRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setMonthTitleHeight = _this.setMonthTitleHeight.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.setMonthTitleHeightTimeout = setTimeout(this.setMonthTitleHeight, 0);\n  };\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var month = nextProps.month,\n        enableOutsideDays = nextProps.enableOutsideDays,\n        firstDayOfWeek = nextProps.firstDayOfWeek;\n    var _this$props = this.props,\n        prevMonth = _this$props.month,\n        prevEnableOutsideDays = _this$props.enableOutsideDays,\n        prevFirstDayOfWeek = _this$props.firstDayOfWeek;\n\n    if (!month.isSame(prevMonth) || enableOutsideDays !== prevEnableOutsideDays || firstDayOfWeek !== prevFirstDayOfWeek) {\n      this.setState({\n        weeks: (0, _getCalendarMonthWeeks[\"default\"])(month, enableOutsideDays, firstDayOfWeek == null ? _moment[\"default\"].localeData().firstDayOfWeek() : firstDayOfWeek)\n      });\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.setMonthTitleHeightTimeout) {\n      clearTimeout(this.setMonthTitleHeightTimeout);\n    }\n  };\n\n  _proto.setMonthTitleHeight = function setMonthTitleHeight() {\n    var setMonthTitleHeight = this.props.setMonthTitleHeight;\n\n    if (setMonthTitleHeight) {\n      var captionHeight = (0, _calculateDimension[\"default\"])(this.captionRef, 'height', true, true);\n      setMonthTitleHeight(captionHeight);\n    }\n  };\n\n  _proto.setCaptionRef = function setCaptionRef(ref) {\n    this.captionRef = ref;\n  };\n\n  _proto.render = function render() {\n    var _this$props2 = this.props,\n        dayAriaLabelFormat = _this$props2.dayAriaLabelFormat,\n        daySize = _this$props2.daySize,\n        focusedDate = _this$props2.focusedDate,\n        horizontalMonthPadding = _this$props2.horizontalMonthPadding,\n        isFocused = _this$props2.isFocused,\n        isVisible = _this$props2.isVisible,\n        modifiers = _this$props2.modifiers,\n        month = _this$props2.month,\n        monthFormat = _this$props2.monthFormat,\n        onDayClick = _this$props2.onDayClick,\n        onDayMouseEnter = _this$props2.onDayMouseEnter,\n        onDayMouseLeave = _this$props2.onDayMouseLeave,\n        onMonthSelect = _this$props2.onMonthSelect,\n        onYearSelect = _this$props2.onYearSelect,\n        orientation = _this$props2.orientation,\n        phrases = _this$props2.phrases,\n        renderCalendarDay = _this$props2.renderCalendarDay,\n        renderDayContents = _this$props2.renderDayContents,\n        renderMonthElement = _this$props2.renderMonthElement,\n        renderMonthText = _this$props2.renderMonthText,\n        styles = _this$props2.styles,\n        verticalBorderSpacing = _this$props2.verticalBorderSpacing;\n    var weeks = this.state.weeks;\n    var monthTitle = renderMonthText ? renderMonthText(month) : month.format(monthFormat);\n    var verticalScrollable = orientation === _constants.VERTICAL_SCROLLABLE;\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.CalendarMonth, {\n      padding: \"0 \".concat(horizontalMonthPadding, \"px\")\n    }), {\n      \"data-visible\": isVisible\n    }), _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      ref: this.setCaptionRef\n    }, (0, _reactWithStyles.css)(styles.CalendarMonth_caption, verticalScrollable && styles.CalendarMonth_caption__verticalScrollable)), renderMonthElement ? renderMonthElement({\n      month: month,\n      onMonthSelect: onMonthSelect,\n      onYearSelect: onYearSelect,\n      isVisible: isVisible\n    }) : _react[\"default\"].createElement(\"strong\", null, monthTitle)), _react[\"default\"].createElement(\"table\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(!verticalBorderSpacing && styles.CalendarMonth_table, verticalBorderSpacing && styles.CalendarMonth_verticalSpacing, verticalBorderSpacing && {\n      borderSpacing: \"0px \".concat(verticalBorderSpacing, \"px\")\n    }), {\n      role: \"presentation\"\n    }), _react[\"default\"].createElement(\"tbody\", null, weeks.map(function (week, i) {\n      return _react[\"default\"].createElement(_CalendarWeek[\"default\"], {\n        key: i\n      }, week.map(function (day, dayOfWeek) {\n        return renderCalendarDay({\n          key: dayOfWeek,\n          day: day,\n          daySize: daySize,\n          isOutsideDay: !day || day.month() !== month.month(),\n          tabIndex: isVisible && (0, _isSameDay[\"default\"])(day, focusedDate) ? 0 : -1,\n          isFocused: isFocused,\n          onDayMouseEnter: onDayMouseEnter,\n          onDayMouseLeave: onDayMouseLeave,\n          onDayClick: onDayClick,\n          renderDayContents: renderDayContents,\n          phrases: phrases,\n          modifiers: modifiers[(0, _toISODateString[\"default\"])(day)],\n          ariaLabelFormat: dayAriaLabelFormat\n        });\n      }));\n    }))));\n  };\n\n  return CalendarMonth;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nCalendarMonth.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nCalendarMonth.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      color = _ref2$reactDates.color,\n      font = _ref2$reactDates.font,\n      spacing = _ref2$reactDates.spacing;\n  return {\n    CalendarMonth: {\n      background: color.background,\n      textAlign: 'center',\n      verticalAlign: 'top',\n      userSelect: 'none'\n    },\n    CalendarMonth_table: {\n      borderCollapse: 'collapse',\n      borderSpacing: 0\n    },\n    CalendarMonth_verticalSpacing: {\n      borderCollapse: 'separate'\n    },\n    CalendarMonth_caption: {\n      color: color.text,\n      fontSize: font.captionSize,\n      textAlign: 'center',\n      paddingTop: spacing.captionPaddingTop,\n      paddingBottom: spacing.captionPaddingBottom,\n      captionSide: 'initial'\n    },\n    CalendarMonth_caption__verticalScrollable: {\n      paddingTop: 12,\n      paddingBottom: 7\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(CalendarMonth);\n\nexports[\"default\"] = _default;", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar CAN_USE_DOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n// Adapted from Modernizr\n// https://github.com/Modernizr/Modernizr/blob/acb3f0d9/feature-detects/dom/passiveeventlisteners.js#L26-L37\nfunction testPassiveEventListeners() {\n  if (!CAN_USE_DOM) {\n    return false;\n  }\n\n  if (!window.addEventListener || !window.removeEventListener || !Object.defineProperty) {\n    return false;\n  }\n\n  var supportsPassiveOption = false;\n  try {\n    var opts = Object.defineProperty({}, 'passive', {\n      // eslint-disable-next-line getter-return\n      get: function () {\n        function get() {\n          supportsPassiveOption = true;\n        }\n\n        return get;\n      }()\n    });\n    var noop = function noop() {};\n    window.addEventListener('testPassiveEventSupport', noop, opts);\n    window.removeEventListener('testPassiveEventSupport', noop, opts);\n  } catch (e) {\n    // do nothing\n  }\n\n  return supportsPassiveOption;\n}\n\nvar memoized = void 0;\n\nfunction canUsePassiveEventListeners() {\n  if (memoized === undefined) {\n    memoized = testPassiveEventListeners();\n  }\n  return memoized;\n}\n\nfunction normalizeEventOptions(eventOptions) {\n  if (!eventOptions) {\n    return undefined;\n  }\n\n  if (!canUsePassiveEventListeners()) {\n    // If the browser does not support the passive option, then it is expecting\n    // a boolean for the options argument to specify whether it should use\n    // capture or not. In more modern browsers, this is passed via the `capture`\n    // option, so let's just hoist that value up.\n    return !!eventOptions.capture;\n  }\n\n  return eventOptions;\n}\n\n/* eslint-disable no-bitwise */\n\n/**\n * Generate a unique key for any set of event options\n */\nfunction eventOptionsKey(normalizedEventOptions) {\n  if (!normalizedEventOptions) {\n    return 0;\n  }\n\n  // If the browser does not support passive event listeners, the normalized\n  // event options will be a boolean.\n  if (normalizedEventOptions === true) {\n    return 100;\n  }\n\n  // At this point, the browser supports passive event listeners, so we expect\n  // the event options to be an object with possible properties of capture,\n  // passive, and once.\n  //\n  // We want to consistently return the same value, regardless of the order of\n  // these properties, so let's use binary maths to assign each property to a\n  // bit, and then add those together (with an offset to account for the\n  // booleans at the beginning of this function).\n  var capture = normalizedEventOptions.capture << 0;\n  var passive = normalizedEventOptions.passive << 1;\n  var once = normalizedEventOptions.once << 2;\n  return capture + passive + once;\n}\n\nfunction ensureCanMutateNextEventHandlers(eventHandlers) {\n  if (eventHandlers.handlers === eventHandlers.nextHandlers) {\n    // eslint-disable-next-line no-param-reassign\n    eventHandlers.nextHandlers = eventHandlers.handlers.slice();\n  }\n}\n\nfunction TargetEventHandlers(target) {\n  this.target = target;\n  this.events = {};\n}\n\nTargetEventHandlers.prototype.getEventHandlers = function () {\n  function getEventHandlers(eventName, options) {\n    var key = String(eventName) + ' ' + String(eventOptionsKey(options));\n\n    if (!this.events[key]) {\n      this.events[key] = {\n        handlers: [],\n        handleEvent: undefined\n      };\n      this.events[key].nextHandlers = this.events[key].handlers;\n    }\n\n    return this.events[key];\n  }\n\n  return getEventHandlers;\n}();\n\nTargetEventHandlers.prototype.handleEvent = function () {\n  function handleEvent(eventName, options, event) {\n    var eventHandlers = this.getEventHandlers(eventName, options);\n    eventHandlers.handlers = eventHandlers.nextHandlers;\n    eventHandlers.handlers.forEach(function (handler) {\n      if (handler) {\n        // We need to check for presence here because a handler function may\n        // cause later handlers to get removed. This can happen if you for\n        // instance have a waypoint that unmounts another waypoint as part of an\n        // onEnter/onLeave handler.\n        handler(event);\n      }\n    });\n  }\n\n  return handleEvent;\n}();\n\nTargetEventHandlers.prototype.add = function () {\n  function add(eventName, listener, options) {\n    var _this = this;\n\n    // options has already been normalized at this point.\n    var eventHandlers = this.getEventHandlers(eventName, options);\n\n    ensureCanMutateNextEventHandlers(eventHandlers);\n\n    if (eventHandlers.nextHandlers.length === 0) {\n      eventHandlers.handleEvent = this.handleEvent.bind(this, eventName, options);\n\n      this.target.addEventListener(eventName, eventHandlers.handleEvent, options);\n    }\n\n    eventHandlers.nextHandlers.push(listener);\n\n    var isSubscribed = true;\n    var unsubscribe = function () {\n      function unsubscribe() {\n        if (!isSubscribed) {\n          return;\n        }\n\n        isSubscribed = false;\n\n        ensureCanMutateNextEventHandlers(eventHandlers);\n        var index = eventHandlers.nextHandlers.indexOf(listener);\n        eventHandlers.nextHandlers.splice(index, 1);\n\n        if (eventHandlers.nextHandlers.length === 0) {\n          // All event handlers have been removed, so we want to remove the event\n          // listener from the target node.\n\n          if (_this.target) {\n            // There can be a race condition where the target may no longer exist\n            // when this function is called, e.g. when a React component is\n            // unmounting. Guarding against this prevents the following error:\n            //\n            //   Cannot read property 'removeEventListener' of undefined\n            _this.target.removeEventListener(eventName, eventHandlers.handleEvent, options);\n          }\n\n          eventHandlers.handleEvent = undefined;\n        }\n      }\n\n      return unsubscribe;\n    }();\n    return unsubscribe;\n  }\n\n  return add;\n}();\n\nvar EVENT_HANDLERS_KEY = '__consolidated_events_handlers__';\n\n// eslint-disable-next-line import/prefer-default-export\nfunction addEventListener(target, eventName, listener, options) {\n  if (!target[EVENT_HANDLERS_KEY]) {\n    // eslint-disable-next-line no-param-reassign\n    target[EVENT_HANDLERS_KEY] = new TargetEventHandlers(target);\n  }\n  var normalizedEventOptions = normalizeEventOptions(options);\n  return target[EVENT_HANDLERS_KEY].add(eventName, listener, normalizedEventOptions);\n}\n\nexports.addEventListener = addEventListener;\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = noflip;\nvar NOFLIP = '/* @noflip */'; // Appends a noflip comment to a style rule in order to prevent it from being automatically\n// flipped in RTL contexts. This should be used only in situations where the style must remain\n// unflipped regardless of direction context. See: https://github.com/kentcdodds/rtl-css-js#usage\n\nfunction noflip(value) {\n  if (typeof value === 'number') return \"\".concat(value, \"px \").concat(NOFLIP);\n  if (typeof value === 'string') return \"\".concat(value, \" \").concat(NOFLIP);\n  throw new TypeError('noflip expects a string or a number');\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isTransitionEndSupported;\n\nfunction isTransitionEndSupported() {\n  return !!(typeof window !== 'undefined' && 'TransitionEvent' in window);\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getTransformStyles;\n\nfunction getTransformStyles(transformValue) {\n  return {\n    transform: transformValue,\n    msTransform: transformValue,\n    MozTransform: transformValue,\n    WebkitTransform: transformValue\n  };\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getCalendarMonthWidth;\n\nfunction getCalendarMonthWidth(daySize) {\n  var calendarMonthPadding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  return 7 * daySize + 2 * calendarMonthPadding + 1;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = toISOMonthString;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _toMomentObject = _interopRequireDefault(require(\"./toMomentObject\"));\n\nfunction toISOMonthString(date, currentFormat) {\n  var dateObj = _moment[\"default\"].isMoment(date) ? date : (0, _toMomentObject[\"default\"])(date, currentFormat);\n  if (!dateObj) return null; // Template strings compiled in strict mode uses concat, which is slow. Since\n  // this code is in a hot path and we want it to be as fast as possible, we\n  // want to use old-fashioned +.\n  // eslint-disable-next-line prefer-template\n\n  return dateObj.year() + '-' + String(dateObj.month() + 1).padStart(2, '0');\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isSameMonth;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nfunction isSameMonth(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false; // Compare least significant, most likely to change units first\n  // Moment's isSame clones moment inputs and is a tad slow\n\n  return a.month() === b.month() && a.year() === b.year();\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isPrevMonth;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isSameMonth = _interopRequireDefault(require(\"./isSameMonth\"));\n\nfunction isPrevMonth(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  return (0, _isSameMonth[\"default\"])(a.clone().subtract(1, 'month'), b);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isNextMonth;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isSameMonth = _interopRequireDefault(require(\"./isSameMonth\"));\n\nfunction isNextMonth(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  return (0, _isSameMonth[\"default\"])(a.clone().add(1, 'month'), b);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _consolidatedEvents = require(\"consolidated-events\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _CalendarMonth = _interopRequireDefault(require(\"./CalendarMonth\"));\n\nvar _isTransitionEndSupported = _interopRequireDefault(require(\"../utils/isTransitionEndSupported\"));\n\nvar _getTransformStyles = _interopRequireDefault(require(\"../utils/getTransformStyles\"));\n\nvar _getCalendarMonthWidth = _interopRequireDefault(require(\"../utils/getCalendarMonthWidth\"));\n\nvar _toISOMonthString = _interopRequireDefault(require(\"../utils/toISOMonthString\"));\n\nvar _isPrevMonth = _interopRequireDefault(require(\"../utils/isPrevMonth\"));\n\nvar _isNextMonth = _interopRequireDefault(require(\"../utils/isNextMonth\"));\n\nvar _ModifiersShape = _interopRequireDefault(require(\"../shapes/ModifiersShape\"));\n\nvar _ScrollableOrientationShape = _interopRequireDefault(require(\"../shapes/ScrollableOrientationShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"../shapes/DayOfWeekShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  firstVisibleMonthIndex: _propTypes[\"default\"].number,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  initialMonth: _reactMomentProptypes[\"default\"].momentObj,\n  isAnimating: _propTypes[\"default\"].bool,\n  numberOfMonths: _propTypes[\"default\"].number,\n  modifiers: _propTypes[\"default\"].objectOf(_propTypes[\"default\"].objectOf(_ModifiersShape[\"default\"])),\n  orientation: _ScrollableOrientationShape[\"default\"],\n  onDayClick: _propTypes[\"default\"].func,\n  onDayMouseEnter: _propTypes[\"default\"].func,\n  onDayMouseLeave: _propTypes[\"default\"].func,\n  onMonthTransitionEnd: _propTypes[\"default\"].func,\n  onMonthChange: _propTypes[\"default\"].func,\n  onYearChange: _propTypes[\"default\"].func,\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  translationValue: _propTypes[\"default\"].number,\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  focusedDate: _reactMomentProptypes[\"default\"].momentObj,\n  // indicates focusable day\n  isFocused: _propTypes[\"default\"].bool,\n  // indicates whether or not to move focus to focusable day\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  setMonthTitleHeight: _propTypes[\"default\"].func,\n  isRTL: _propTypes[\"default\"].bool,\n  transitionDuration: _airbnbPropTypes.nonNegativeInteger,\n  verticalBorderSpacing: _airbnbPropTypes.nonNegativeInteger,\n  // i18n\n  monthFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.CalendarDayPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string\n})) : {};\nvar defaultProps = {\n  enableOutsideDays: false,\n  firstVisibleMonthIndex: 0,\n  horizontalMonthPadding: 13,\n  initialMonth: (0, _moment[\"default\"])(),\n  isAnimating: false,\n  numberOfMonths: 1,\n  modifiers: {},\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  onDayClick: function onDayClick() {},\n  onDayMouseEnter: function onDayMouseEnter() {},\n  onDayMouseLeave: function onDayMouseLeave() {},\n  onMonthChange: function onMonthChange() {},\n  onYearChange: function onYearChange() {},\n  onMonthTransitionEnd: function onMonthTransitionEnd() {},\n  renderMonthText: null,\n  renderCalendarDay: undefined,\n  renderDayContents: null,\n  translationValue: null,\n  renderMonthElement: null,\n  daySize: _constants.DAY_SIZE,\n  focusedDate: null,\n  isFocused: false,\n  firstDayOfWeek: null,\n  setMonthTitleHeight: null,\n  isRTL: false,\n  transitionDuration: 200,\n  verticalBorderSpacing: undefined,\n  // i18n\n  monthFormat: 'MMMM YYYY',\n  // english locale\n  phrases: _defaultPhrases.CalendarDayPhrases,\n  dayAriaLabelFormat: undefined\n};\n\nfunction getMonths(initialMonth, numberOfMonths, withoutTransitionMonths) {\n  var month = initialMonth.clone();\n  if (!withoutTransitionMonths) month = month.subtract(1, 'month');\n  var months = [];\n\n  for (var i = 0; i < (withoutTransitionMonths ? numberOfMonths : numberOfMonths + 2); i += 1) {\n    months.push(month);\n    month = month.clone().add(1, 'month');\n  }\n\n  return months;\n}\n\nvar CalendarMonthGrid =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(CalendarMonthGrid, _ref);\n  var _proto = CalendarMonthGrid.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function CalendarMonthGrid(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    var withoutTransitionMonths = props.orientation === _constants.VERTICAL_SCROLLABLE;\n    _this.state = {\n      months: getMonths(props.initialMonth, props.numberOfMonths, withoutTransitionMonths)\n    };\n    _this.isTransitionEndSupported = (0, _isTransitionEndSupported[\"default\"])();\n    _this.onTransitionEnd = _this.onTransitionEnd.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setContainerRef = _this.setContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.locale = _moment[\"default\"].locale();\n    _this.onMonthSelect = _this.onMonthSelect.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onYearSelect = _this.onYearSelect.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.removeEventListener = (0, _consolidatedEvents.addEventListener)(this.container, 'transitionend', this.onTransitionEnd);\n  };\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var _this2 = this;\n\n    var initialMonth = nextProps.initialMonth,\n        numberOfMonths = nextProps.numberOfMonths,\n        orientation = nextProps.orientation;\n    var months = this.state.months;\n    var _this$props = this.props,\n        prevInitialMonth = _this$props.initialMonth,\n        prevNumberOfMonths = _this$props.numberOfMonths;\n    var hasMonthChanged = !prevInitialMonth.isSame(initialMonth, 'month');\n    var hasNumberOfMonthsChanged = prevNumberOfMonths !== numberOfMonths;\n    var newMonths = months;\n\n    if (hasMonthChanged && !hasNumberOfMonthsChanged) {\n      if ((0, _isNextMonth[\"default\"])(prevInitialMonth, initialMonth)) {\n        newMonths = months.slice(1);\n        newMonths.push(months[months.length - 1].clone().add(1, 'month'));\n      } else if ((0, _isPrevMonth[\"default\"])(prevInitialMonth, initialMonth)) {\n        newMonths = months.slice(0, months.length - 1);\n        newMonths.unshift(months[0].clone().subtract(1, 'month'));\n      } else {\n        var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n        newMonths = getMonths(initialMonth, numberOfMonths, withoutTransitionMonths);\n      }\n    }\n\n    if (hasNumberOfMonthsChanged) {\n      var _withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n\n      newMonths = getMonths(initialMonth, numberOfMonths, _withoutTransitionMonths);\n    }\n\n    var momentLocale = _moment[\"default\"].locale();\n\n    if (this.locale !== momentLocale) {\n      this.locale = momentLocale;\n      newMonths = newMonths.map(function (m) {\n        return m.locale(_this2.locale);\n      });\n    }\n\n    this.setState({\n      months: newMonths\n    });\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate() {\n    var _this$props2 = this.props,\n        isAnimating = _this$props2.isAnimating,\n        transitionDuration = _this$props2.transitionDuration,\n        onMonthTransitionEnd = _this$props2.onMonthTransitionEnd; // For IE9, immediately call onMonthTransitionEnd instead of\n    // waiting for the animation to complete. Similarly, if transitionDuration\n    // is set to 0, also immediately invoke the onMonthTransitionEnd callback\n\n    if ((!this.isTransitionEndSupported || !transitionDuration) && isAnimating) {\n      onMonthTransitionEnd();\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.removeEventListener) this.removeEventListener();\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd() {\n    var onMonthTransitionEnd = this.props.onMonthTransitionEnd;\n    onMonthTransitionEnd();\n  };\n\n  _proto.onMonthSelect = function onMonthSelect(currentMonth, newMonthVal) {\n    var newMonth = currentMonth.clone();\n    var _this$props3 = this.props,\n        onMonthChange = _this$props3.onMonthChange,\n        orientation = _this$props3.orientation;\n    var months = this.state.months;\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var initialMonthSubtraction = months.indexOf(currentMonth);\n\n    if (!withoutTransitionMonths) {\n      initialMonthSubtraction -= 1;\n    }\n\n    newMonth.set('month', newMonthVal).subtract(initialMonthSubtraction, 'months');\n    onMonthChange(newMonth);\n  };\n\n  _proto.onYearSelect = function onYearSelect(currentMonth, newYearVal) {\n    var newMonth = currentMonth.clone();\n    var _this$props4 = this.props,\n        onYearChange = _this$props4.onYearChange,\n        orientation = _this$props4.orientation;\n    var months = this.state.months;\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var initialMonthSubtraction = months.indexOf(currentMonth);\n\n    if (!withoutTransitionMonths) {\n      initialMonthSubtraction -= 1;\n    }\n\n    newMonth.set('year', newYearVal).subtract(initialMonthSubtraction, 'months');\n    onYearChange(newMonth);\n  };\n\n  _proto.setContainerRef = function setContainerRef(ref) {\n    this.container = ref;\n  };\n\n  _proto.render = function render() {\n    var _this3 = this;\n\n    var _this$props5 = this.props,\n        enableOutsideDays = _this$props5.enableOutsideDays,\n        firstVisibleMonthIndex = _this$props5.firstVisibleMonthIndex,\n        horizontalMonthPadding = _this$props5.horizontalMonthPadding,\n        isAnimating = _this$props5.isAnimating,\n        modifiers = _this$props5.modifiers,\n        numberOfMonths = _this$props5.numberOfMonths,\n        monthFormat = _this$props5.monthFormat,\n        orientation = _this$props5.orientation,\n        translationValue = _this$props5.translationValue,\n        daySize = _this$props5.daySize,\n        onDayMouseEnter = _this$props5.onDayMouseEnter,\n        onDayMouseLeave = _this$props5.onDayMouseLeave,\n        onDayClick = _this$props5.onDayClick,\n        renderMonthText = _this$props5.renderMonthText,\n        renderCalendarDay = _this$props5.renderCalendarDay,\n        renderDayContents = _this$props5.renderDayContents,\n        renderMonthElement = _this$props5.renderMonthElement,\n        onMonthTransitionEnd = _this$props5.onMonthTransitionEnd,\n        firstDayOfWeek = _this$props5.firstDayOfWeek,\n        focusedDate = _this$props5.focusedDate,\n        isFocused = _this$props5.isFocused,\n        isRTL = _this$props5.isRTL,\n        styles = _this$props5.styles,\n        phrases = _this$props5.phrases,\n        dayAriaLabelFormat = _this$props5.dayAriaLabelFormat,\n        transitionDuration = _this$props5.transitionDuration,\n        verticalBorderSpacing = _this$props5.verticalBorderSpacing,\n        setMonthTitleHeight = _this$props5.setMonthTitleHeight;\n    var months = this.state.months;\n    var isVertical = orientation === _constants.VERTICAL_ORIENTATION;\n    var isVerticalScrollable = orientation === _constants.VERTICAL_SCROLLABLE;\n    var isHorizontal = orientation === _constants.HORIZONTAL_ORIENTATION;\n    var calendarMonthWidth = (0, _getCalendarMonthWidth[\"default\"])(daySize, horizontalMonthPadding);\n    var width = isVertical || isVerticalScrollable ? calendarMonthWidth : (numberOfMonths + 2) * calendarMonthWidth;\n    var transformType = isVertical || isVerticalScrollable ? 'translateY' : 'translateX';\n    var transformValue = \"\".concat(transformType, \"(\").concat(translationValue, \"px)\");\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.CalendarMonthGrid, isHorizontal && styles.CalendarMonthGrid__horizontal, isVertical && styles.CalendarMonthGrid__vertical, isVerticalScrollable && styles.CalendarMonthGrid__vertical_scrollable, isAnimating && styles.CalendarMonthGrid__animating, isAnimating && transitionDuration && {\n      transition: \"transform \".concat(transitionDuration, \"ms ease-in-out\")\n    }, _objectSpread({}, (0, _getTransformStyles[\"default\"])(transformValue), {\n      width: width\n    })), {\n      ref: this.setContainerRef,\n      onTransitionEnd: onMonthTransitionEnd\n    }), months.map(function (month, i) {\n      var isVisible = i >= firstVisibleMonthIndex && i < firstVisibleMonthIndex + numberOfMonths;\n      var hideForAnimation = i === 0 && !isVisible;\n      var showForAnimation = i === 0 && isAnimating && isVisible;\n      var monthString = (0, _toISOMonthString[\"default\"])(month);\n      return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n        key: monthString\n      }, (0, _reactWithStyles.css)(isHorizontal && styles.CalendarMonthGrid_month__horizontal, hideForAnimation && styles.CalendarMonthGrid_month__hideForAnimation, showForAnimation && !isVertical && !isRTL && {\n        position: 'absolute',\n        left: -calendarMonthWidth\n      }, showForAnimation && !isVertical && isRTL && {\n        position: 'absolute',\n        right: 0\n      }, showForAnimation && isVertical && {\n        position: 'absolute',\n        top: -translationValue\n      }, !isVisible && !isAnimating && styles.CalendarMonthGrid_month__hidden)), _react[\"default\"].createElement(_CalendarMonth[\"default\"], {\n        month: month,\n        isVisible: isVisible,\n        enableOutsideDays: enableOutsideDays,\n        modifiers: modifiers[monthString],\n        monthFormat: monthFormat,\n        orientation: orientation,\n        onDayMouseEnter: onDayMouseEnter,\n        onDayMouseLeave: onDayMouseLeave,\n        onDayClick: onDayClick,\n        onMonthSelect: _this3.onMonthSelect,\n        onYearSelect: _this3.onYearSelect,\n        renderMonthText: renderMonthText,\n        renderCalendarDay: renderCalendarDay,\n        renderDayContents: renderDayContents,\n        renderMonthElement: renderMonthElement,\n        firstDayOfWeek: firstDayOfWeek,\n        daySize: daySize,\n        focusedDate: isVisible ? focusedDate : null,\n        isFocused: isFocused,\n        phrases: phrases,\n        setMonthTitleHeight: setMonthTitleHeight,\n        dayAriaLabelFormat: dayAriaLabelFormat,\n        verticalBorderSpacing: verticalBorderSpacing,\n        horizontalMonthPadding: horizontalMonthPadding\n      }));\n    }));\n  };\n\n  return CalendarMonthGrid;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nCalendarMonthGrid.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nCalendarMonthGrid.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      color = _ref2$reactDates.color,\n      spacing = _ref2$reactDates.spacing,\n      zIndex = _ref2$reactDates.zIndex;\n  return {\n    CalendarMonthGrid: {\n      background: color.background,\n      textAlign: (0, _noflip[\"default\"])('left'),\n      zIndex: zIndex\n    },\n    CalendarMonthGrid__animating: {\n      zIndex: zIndex + 1\n    },\n    CalendarMonthGrid__horizontal: {\n      position: 'absolute',\n      left: (0, _noflip[\"default\"])(spacing.dayPickerHorizontalPadding)\n    },\n    CalendarMonthGrid__vertical: {\n      margin: '0 auto'\n    },\n    CalendarMonthGrid__vertical_scrollable: {\n      margin: '0 auto'\n    },\n    CalendarMonthGrid_month__horizontal: {\n      display: 'inline-block',\n      verticalAlign: 'top',\n      minHeight: '100%'\n    },\n    CalendarMonthGrid_month__hideForAnimation: {\n      position: 'absolute',\n      zIndex: zIndex - 1,\n      opacity: 0,\n      pointerEvents: 'none'\n    },\n    CalendarMonthGrid_month__hidden: {\n      visibility: 'hidden'\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(CalendarMonthGrid);\n\nexports[\"default\"] = _default;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar canUseDOM = exports.canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _utils = require('./utils');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Portal = function (_React$Component) {\n  _inherits(Portal, _React$Component);\n\n  function Portal() {\n    _classCallCheck(this, Portal);\n\n    return _possibleConstructorReturn(this, (Portal.__proto__ || Object.getPrototypeOf(Portal)).apply(this, arguments));\n  }\n\n  _createClass(Portal, [{\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      if (this.defaultNode) {\n        document.body.removeChild(this.defaultNode);\n      }\n      this.defaultNode = null;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      if (!_utils.canUseDOM) {\n        return null;\n      }\n      if (!this.props.node && !this.defaultNode) {\n        this.defaultNode = document.createElement('div');\n        document.body.appendChild(this.defaultNode);\n      }\n      return _reactDom2.default.createPortal(this.props.children, this.props.node || this.defaultNode);\n    }\n  }]);\n\n  return Portal;\n}(_react2.default.Component);\n\nPortal.propTypes = {\n  children: _propTypes2.default.node.isRequired,\n  node: _propTypes2.default.any\n};\n\nexports.default = Portal;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // This file is a fallback for a consumer who is not yet on React 16\n// as createPortal was introduced in React 16\n\nvar Portal = function (_React$Component) {\n  _inherits(Portal, _React$Component);\n\n  function Portal() {\n    _classCallCheck(this, Portal);\n\n    return _possibleConstructorReturn(this, (Portal.__proto__ || Object.getPrototypeOf(Portal)).apply(this, arguments));\n  }\n\n  _createClass(Portal, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.renderPortal();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(props) {\n      this.renderPortal();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      _reactDom2.default.unmountComponentAtNode(this.defaultNode || this.props.node);\n      if (this.defaultNode) {\n        document.body.removeChild(this.defaultNode);\n      }\n      this.defaultNode = null;\n      this.portal = null;\n    }\n  }, {\n    key: 'renderPortal',\n    value: function renderPortal(props) {\n      if (!this.props.node && !this.defaultNode) {\n        this.defaultNode = document.createElement('div');\n        document.body.appendChild(this.defaultNode);\n      }\n\n      var children = this.props.children;\n      // https://gist.github.com/jimfb/d99e0678e9da715ccf6454961ef04d1b\n      if (typeof this.props.children.type === 'function') {\n        children = _react2.default.cloneElement(this.props.children);\n      }\n\n      this.portal = _reactDom2.default.unstable_renderSubtreeIntoContainer(this, children, this.props.node || this.defaultNode);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Portal;\n}(_react2.default.Component);\n\nexports.default = Portal;\n\n\nPortal.propTypes = {\n  children: _propTypes2.default.node.isRequired,\n  node: _propTypes2.default.any\n};", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _Portal = require('./Portal');\n\nvar _Portal2 = _interopRequireDefault(_Portal);\n\nvar _LegacyPortal = require('./LegacyPortal');\n\nvar _LegacyPortal2 = _interopRequireDefault(_LegacyPortal);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Portal = void 0;\n\nif (_reactDom2.default.createPortal) {\n  Portal = _Portal2.default;\n} else {\n  Portal = _LegacyPortal2.default;\n}\n\nexports.default = Portal;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _PortalCompat = require('./PortalCompat');\n\nvar _PortalCompat2 = _interopRequireDefault(_PortalCompat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar KEYCODES = {\n  ESCAPE: 27\n};\n\nvar PortalWithState = function (_React$Component) {\n  _inherits(PortalWithState, _React$Component);\n\n  function PortalWithState(props) {\n    _classCallCheck(this, PortalWithState);\n\n    var _this = _possibleConstructorReturn(this, (PortalWithState.__proto__ || Object.getPrototypeOf(PortalWithState)).call(this, props));\n\n    _this.portalNode = null;\n    _this.state = { active: !!props.defaultOpen };\n    _this.openPortal = _this.openPortal.bind(_this);\n    _this.closePortal = _this.closePortal.bind(_this);\n    _this.wrapWithPortal = _this.wrapWithPortal.bind(_this);\n    _this.handleOutsideMouseClick = _this.handleOutsideMouseClick.bind(_this);\n    _this.handleKeydown = _this.handleKeydown.bind(_this);\n    return _this;\n  }\n\n  _createClass(PortalWithState, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      if (this.props.closeOnEsc) {\n        document.addEventListener('keydown', this.handleKeydown);\n      }\n      if (this.props.closeOnOutsideClick) {\n        document.addEventListener('click', this.handleOutsideMouseClick);\n      }\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      if (this.props.closeOnEsc) {\n        document.removeEventListener('keydown', this.handleKeydown);\n      }\n      if (this.props.closeOnOutsideClick) {\n        document.removeEventListener('click', this.handleOutsideMouseClick);\n      }\n    }\n  }, {\n    key: 'openPortal',\n    value: function openPortal(e) {\n      if (this.state.active) {\n        return;\n      }\n      if (e && e.nativeEvent) {\n        e.nativeEvent.stopImmediatePropagation();\n      }\n      this.setState({ active: true }, this.props.onOpen);\n    }\n  }, {\n    key: 'closePortal',\n    value: function closePortal() {\n      if (!this.state.active) {\n        return;\n      }\n      this.setState({ active: false }, this.props.onClose);\n    }\n  }, {\n    key: 'wrapWithPortal',\n    value: function wrapWithPortal(children) {\n      var _this2 = this;\n\n      if (!this.state.active) {\n        return null;\n      }\n      return _react2.default.createElement(\n        _PortalCompat2.default,\n        {\n          node: this.props.node,\n          key: 'react-portal',\n          ref: function ref(portalNode) {\n            return _this2.portalNode = portalNode;\n          }\n        },\n        children\n      );\n    }\n  }, {\n    key: 'handleOutsideMouseClick',\n    value: function handleOutsideMouseClick(e) {\n      if (!this.state.active) {\n        return;\n      }\n      var root = this.portalNode && (this.portalNode.props.node || this.portalNode.defaultNode);\n      if (!root || root.contains(e.target) || e.button && e.button !== 0) {\n        return;\n      }\n      this.closePortal();\n    }\n  }, {\n    key: 'handleKeydown',\n    value: function handleKeydown(e) {\n      if (e.keyCode === KEYCODES.ESCAPE && this.state.active) {\n        this.closePortal();\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return this.props.children({\n        openPortal: this.openPortal,\n        closePortal: this.closePortal,\n        portal: this.wrapWithPortal,\n        isOpen: this.state.active\n      });\n    }\n  }]);\n\n  return PortalWithState;\n}(_react2.default.Component);\n\nPortalWithState.propTypes = {\n  children: _propTypes2.default.func.isRequired,\n  defaultOpen: _propTypes2.default.bool,\n  node: _propTypes2.default.any,\n  closeOnEsc: _propTypes2.default.bool,\n  closeOnOutsideClick: _propTypes2.default.bool,\n  onOpen: _propTypes2.default.func,\n  onClose: _propTypes2.default.func\n};\n\nPortalWithState.defaultProps = {\n  onOpen: function onOpen() {},\n  onClose: function onClose() {}\n};\n\nexports.default = PortalWithState;", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PortalWithState = exports.Portal = undefined;\n\nvar _PortalCompat = require('./PortalCompat');\n\nvar _PortalCompat2 = _interopRequireDefault(_PortalCompat);\n\nvar _PortalWithState = require('./PortalWithState');\n\nvar _PortalWithState2 = _interopRequireDefault(_PortalWithState);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Portal = _PortalCompat2.default;\nexports.PortalWithState = _PortalWithState2.default;", "Object.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports['default'] = isTouchDevice;\nfunction isTouchDevice() {\n  return !!(typeof window !== 'undefined' && ('ontouchstart' in window || window.DocumentTouch && typeof document !== 'undefined' && document instanceof window.DocumentTouch)) || !!(typeof navigator !== 'undefined' && (navigator.maxTouchPoints || navigator.msMaxTouchPoints));\n}\nmodule.exports = exports['default'];", "'use strict';\n\n/* globals\n\tAtomics,\n\tSharedArrayBuffer,\n*/\n\nvar undefined;\n\nvar $TypeError = TypeError;\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () { throw new $TypeError(); };\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar generator; // = function * () {};\nvar generatorFunction = generator ? getProto(generator) : undefined;\nvar asyncFn; // async function() {};\nvar asyncFunction = asyncFn ? asyncFn.constructor : undefined;\nvar asyncGen; // async function * () {};\nvar asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;\nvar asyncGenIterator = asyncGen ? asyncGen() : undefined;\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%ArrayPrototype%': Array.prototype,\n\t'%ArrayProto_entries%': Array.prototype.entries,\n\t'%ArrayProto_forEach%': Array.prototype.forEach,\n\t'%ArrayProto_keys%': Array.prototype.keys,\n\t'%ArrayProto_values%': Array.prototype.values,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': asyncFunction,\n\t'%AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,\n\t'%AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,\n\t'%AsyncGeneratorFunction%': asyncGenFunction,\n\t'%AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,\n\t'%AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%Boolean%': Boolean,\n\t'%BooleanPrototype%': Boolean.prototype,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,\n\t'%Date%': Date,\n\t'%DatePrototype%': Date.prototype,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%ErrorPrototype%': Error.prototype,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%EvalErrorPrototype%': EvalError.prototype,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,\n\t'%Function%': Function,\n\t'%FunctionPrototype%': Function.prototype,\n\t'%Generator%': generator ? getProto(generator()) : undefined,\n\t'%GeneratorFunction%': generatorFunction,\n\t'%GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%JSONParse%': typeof JSON === 'object' ? JSON.parse : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%NumberPrototype%': Number.prototype,\n\t'%Object%': Object,\n\t'%ObjectPrototype%': Object.prototype,\n\t'%ObjProto_toString%': Object.prototype.toString,\n\t'%ObjProto_valueOf%': Object.prototype.valueOf,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,\n\t'%PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,\n\t'%Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,\n\t'%Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,\n\t'%Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%RangeErrorPrototype%': RangeError.prototype,\n\t'%ReferenceError%': ReferenceError,\n\t'%ReferenceErrorPrototype%': ReferenceError.prototype,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%RegExpPrototype%': RegExp.prototype,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%StringPrototype%': String.prototype,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,\n\t'%SyntaxError%': SyntaxError,\n\t'%SyntaxErrorPrototype%': SyntaxError.prototype,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,\n\t'%TypeError%': $TypeError,\n\t'%TypeErrorPrototype%': $TypeError.prototype,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,\n\t'%URIError%': URIError,\n\t'%URIErrorPrototype%': URIError.prototype,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\t'%WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype\n};\n\nvar bind = require('function-bind');\nvar $replace = bind.call(Function.call, String.prototype.replace);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : (number || match);\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tif (!(name in INTRINSICS)) {\n\t\tthrow new SyntaxError('intrinsic ' + name + ' does not exist!');\n\t}\n\n\t// istanbul ignore if // hopefully this is impossible to test :-)\n\tif (typeof INTRINSICS[name] === 'undefined' && !allowMissing) {\n\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t}\n\n\treturn INTRINSICS[name];\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar parts = stringToPath(name);\n\n\tvar value = getBaseIntrinsic('%' + (parts.length > 0 ? parts[0] : '') + '%', allowMissing);\n\tfor (var i = 1; i < parts.length; i += 1) {\n\t\tif (value != null) {\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, parts[i]);\n\t\t\t\tif (!allowMissing && !(parts[i] in value)) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\tvalue = desc ? (desc.get || desc.value) : value[parts[i]];\n\t\t\t} else {\n\t\t\t\tvalue = value[parts[i]];\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\n\n// http://www.ecma-international.org/ecma-262/5.1/#sec-9.10\n\nmodule.exports = function CheckObjectCoercible(value, optMessage) {\n\tif (value == null) {\n\t\tthrow new $TypeError(optMessage || ('Cannot call method on ' + value));\n\t}\n\treturn value;\n};\n", "'use strict';\n\nmodule.exports = require('../5/CheckObjectCoercible');\n", "'use strict';\n\nvar bind = require('function-bind');\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nmodule.exports = function callBind() {\n\treturn $reflectApply(bind, $call, arguments);\n};\n\nmodule.exports.apply = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n", "'use strict';\n\nvar GetIntrinsic = require('../GetIntrinsic');\n\nvar callBind = require('./callBind');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n", "'use strict';\n\nvar has = require('has');\nvar RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');\nvar callBound = require('es-abstract/helpers/callBound');\n\nvar $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');\n\nmodule.exports = function values(O) {\n\tvar obj = RequireObjectCoercible(O);\n\tvar vals = [];\n\tfor (var key in obj) {\n\t\tif (has(obj, key) && $isEnumerable(obj, key)) {\n\t\t\tvals.push(obj[key]);\n\t\t}\n\t}\n\treturn vals;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.values === 'function' ? Object.values : implementation;\n};\n", "'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimValues() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { values: polyfill }, {\n\t\tvalues: function testValues() {\n\t\t\treturn Object.values !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n", "'use strict';\n\nvar define = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = getPolyfill();\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n", "'use strict';\n\nmodule.exports = function contains(other) {\n\tif (arguments.length < 1) {\n\t\tthrow new TypeError('1 argument is required');\n\t}\n\tif (typeof other !== 'object') {\n\t\tthrow new TypeError('Argument 1 (\u201Dother\u201C) to Node.contains must be an instance of Node');\n\t}\n\n\tvar node = other;\n\tdo {\n\t\tif (this === node) {\n\t\t\treturn true;\n\t\t}\n\t\tif (node) {\n\t\t\tnode = node.parentNode;\n\t\t}\n\t} while (node);\n\n\treturn false;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (typeof document !== 'undefined') {\n\t\tif (document.contains) {\n\t\t\treturn document.contains;\n\t\t}\n\t\tif (document.body && document.body.contains) {\n\t\t\ttry {\n\t\t\t\tif (typeof document.body.contains.call(document, '') === 'boolean') {\n\t\t\t\t\treturn document.body.contains;\n\t\t\t\t}\n\t\t\t} catch (e) { /**/ }\n\t\t}\n\t}\n\treturn implementation;\n};\n", "'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimContains() {\n\tvar polyfill = getPolyfill();\n\tif (typeof document !== 'undefined') {\n\t\tdefine(\n\t\t\tdocument,\n\t\t\t{ contains: polyfill },\n\t\t\t{ contains: function () { return document.contains !== polyfill; } }\n\t\t);\n\t\tif (typeof Element !== 'undefined') {\n\t\t\tdefine(\n\t\t\t\tElement.prototype,\n\t\t\t\t{ contains: polyfill },\n\t\t\t\t{ contains: function () { return Element.prototype.contains !== polyfill; } }\n\t\t\t);\n\t\t}\n\t}\n\treturn polyfill;\n};\n", "'use strict';\n\nvar define = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar polyfill = getPolyfill();\nvar shim = require('./shim');\n\nvar boundContains = function contains(node, other) {\n\treturn polyfill.apply(node, [other]);\n};\n\ndefine(boundContains, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = boundContains;\n", "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _airbnbPropTypes = require('airbnb-prop-types');\n\nvar _consolidatedEvents = require('consolidated-events');\n\nvar _object = require('object.values');\n\nvar _object2 = _interopRequireDefault(_object);\n\nvar _document = require('document.contains');\n\nvar _document2 = _interopRequireDefault(_document);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DISPLAY = {\n  BLOCK: 'block',\n  FLEX: 'flex',\n  INLINE: 'inline',\n  INLINE_BLOCK: 'inline-block',\n  CONTENTS: 'contents'\n};\n\nvar propTypes = (0, _airbnbPropTypes.forbidExtraProps)({\n  children: _propTypes2['default'].node.isRequired,\n  onOutsideClick: _propTypes2['default'].func.isRequired,\n  disabled: _propTypes2['default'].bool,\n  useCapture: _propTypes2['default'].bool,\n  display: _propTypes2['default'].oneOf((0, _object2['default'])(DISPLAY))\n});\n\nvar defaultProps = {\n  disabled: false,\n\n  // `useCapture` is set to true by default so that a `stopPropagation` in the\n  // children will not prevent all outside click handlers from firing - maja\n  useCapture: true,\n  display: DISPLAY.BLOCK\n};\n\nvar OutsideClickHandler = function (_React$Component) {\n  _inherits(OutsideClickHandler, _React$Component);\n\n  function OutsideClickHandler() {\n    var _ref;\n\n    _classCallCheck(this, OutsideClickHandler);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var _this = _possibleConstructorReturn(this, (_ref = OutsideClickHandler.__proto__ || Object.getPrototypeOf(OutsideClickHandler)).call.apply(_ref, [this].concat(args)));\n\n    _this.onMouseDown = _this.onMouseDown.bind(_this);\n    _this.onMouseUp = _this.onMouseUp.bind(_this);\n    _this.setChildNodeRef = _this.setChildNodeRef.bind(_this);\n    return _this;\n  }\n\n  _createClass(OutsideClickHandler, [{\n    key: 'componentDidMount',\n    value: function () {\n      function componentDidMount() {\n        var _props = this.props,\n            disabled = _props.disabled,\n            useCapture = _props.useCapture;\n\n\n        if (!disabled) this.addMouseDownEventListener(useCapture);\n      }\n\n      return componentDidMount;\n    }()\n  }, {\n    key: 'componentDidUpdate',\n    value: function () {\n      function componentDidUpdate(_ref2) {\n        var prevDisabled = _ref2.disabled;\n        var _props2 = this.props,\n            disabled = _props2.disabled,\n            useCapture = _props2.useCapture;\n\n        if (prevDisabled !== disabled) {\n          if (disabled) {\n            this.removeEventListeners();\n          } else {\n            this.addMouseDownEventListener(useCapture);\n          }\n        }\n      }\n\n      return componentDidUpdate;\n    }()\n  }, {\n    key: 'componentWillUnmount',\n    value: function () {\n      function componentWillUnmount() {\n        this.removeEventListeners();\n      }\n\n      return componentWillUnmount;\n    }()\n\n    // Use mousedown/mouseup to enforce that clicks remain outside the root's\n    // descendant tree, even when dragged. This should also get triggered on\n    // touch devices.\n\n  }, {\n    key: 'onMouseDown',\n    value: function () {\n      function onMouseDown(e) {\n        var useCapture = this.props.useCapture;\n\n\n        var isDescendantOfRoot = this.childNode && (0, _document2['default'])(this.childNode, e.target);\n        if (!isDescendantOfRoot) {\n          if (this.removeMouseUp) {\n            this.removeMouseUp();\n            this.removeMouseUp = null;\n          }\n          this.removeMouseUp = (0, _consolidatedEvents.addEventListener)(document, 'mouseup', this.onMouseUp, { capture: useCapture });\n        }\n      }\n\n      return onMouseDown;\n    }()\n\n    // Use mousedown/mouseup to enforce that clicks remain outside the root's\n    // descendant tree, even when dragged. This should also get triggered on\n    // touch devices.\n\n  }, {\n    key: 'onMouseUp',\n    value: function () {\n      function onMouseUp(e) {\n        var onOutsideClick = this.props.onOutsideClick;\n\n\n        var isDescendantOfRoot = this.childNode && (0, _document2['default'])(this.childNode, e.target);\n        if (this.removeMouseUp) {\n          this.removeMouseUp();\n          this.removeMouseUp = null;\n        }\n\n        if (!isDescendantOfRoot) {\n          onOutsideClick(e);\n        }\n      }\n\n      return onMouseUp;\n    }()\n  }, {\n    key: 'setChildNodeRef',\n    value: function () {\n      function setChildNodeRef(ref) {\n        this.childNode = ref;\n      }\n\n      return setChildNodeRef;\n    }()\n  }, {\n    key: 'addMouseDownEventListener',\n    value: function () {\n      function addMouseDownEventListener(useCapture) {\n        this.removeMouseDown = (0, _consolidatedEvents.addEventListener)(document, 'mousedown', this.onMouseDown, { capture: useCapture });\n      }\n\n      return addMouseDownEventListener;\n    }()\n  }, {\n    key: 'removeEventListeners',\n    value: function () {\n      function removeEventListeners() {\n        if (this.removeMouseDown) this.removeMouseDown();\n        if (this.removeMouseUp) this.removeMouseUp();\n      }\n\n      return removeEventListeners;\n    }()\n  }, {\n    key: 'render',\n    value: function () {\n      function render() {\n        var _props3 = this.props,\n            children = _props3.children,\n            display = _props3.display;\n\n\n        return _react2['default'].createElement(\n          'div',\n          {\n            ref: this.setChildNodeRef,\n            style: display !== DISPLAY.BLOCK && (0, _object2['default'])(DISPLAY).includes(display) ? { display: display } : undefined\n          },\n          children\n        );\n      }\n\n      return render;\n    }()\n  }]);\n\n  return OutsideClickHandler;\n}(_react2['default'].Component);\n\nexports['default'] = OutsideClickHandler;\n\n\nOutsideClickHandler.propTypes = propTypes;\nOutsideClickHandler.defaultProps = defaultProps;", "// eslint-disable-next-line import/no-unresolved\nmodule.exports = require('./build/OutsideClickHandler');\n", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.START_DATE, _constants.END_DATE]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.ICON_BEFORE_POSITION, _constants.ICON_AFTER_POSITION]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.HORIZONTAL_ORIENTATION, _constants.VERTICAL_ORIENTATION]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].bool, _propTypes[\"default\"].oneOf([_constants.START_DATE, _constants.END_DATE])]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.ANCHOR_LEFT, _constants.ANCHOR_RIGHT]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.OPEN_DOWN, _constants.OPEN_UP]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.INFO_POSITION_TOP, _constants.INFO_POSITION_BOTTOM, _constants.INFO_POSITION_BEFORE, _constants.INFO_POSITION_AFTER]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _constants = require(\"../constants\");\n\nvar _default = _propTypes[\"default\"].oneOf([_constants.NAV_POSITION_BOTTOM, _constants.NAV_POSITION_TOP]);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _FocusedInputShape = _interopRequireDefault(require(\"./FocusedInputShape\"));\n\nvar _IconPositionShape = _interopRequireDefault(require(\"./IconPositionShape\"));\n\nvar _OrientationShape = _interopRequireDefault(require(\"./OrientationShape\"));\n\nvar _DisabledShape = _interopRequireDefault(require(\"./DisabledShape\"));\n\nvar _AnchorDirectionShape = _interopRequireDefault(require(\"./AnchorDirectionShape\"));\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"./OpenDirectionShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"./DayOfWeekShape\"));\n\nvar _CalendarInfoPositionShape = _interopRequireDefault(require(\"./CalendarInfoPositionShape\"));\n\nvar _NavPositionShape = _interopRequireDefault(require(\"./NavPositionShape\"));\n\nvar _default = {\n  // required props for a functional interactive DateRangePicker\n  startDate: _reactMomentProptypes[\"default\"].momentObj,\n  endDate: _reactMomentProptypes[\"default\"].momentObj,\n  onDatesChange: _propTypes[\"default\"].func.isRequired,\n  focusedInput: _FocusedInputShape[\"default\"],\n  onFocusChange: _propTypes[\"default\"].func.isRequired,\n  onClose: _propTypes[\"default\"].func,\n  // input related props\n  startDateId: _propTypes[\"default\"].string.isRequired,\n  startDatePlaceholderText: _propTypes[\"default\"].string,\n  startDateOffset: _propTypes[\"default\"].func,\n  endDateOffset: _propTypes[\"default\"].func,\n  endDateId: _propTypes[\"default\"].string.isRequired,\n  endDatePlaceholderText: _propTypes[\"default\"].string,\n  startDateAriaLabel: _propTypes[\"default\"].string,\n  endDateAriaLabel: _propTypes[\"default\"].string,\n  disabled: _DisabledShape[\"default\"],\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  screenReaderInputMessage: _propTypes[\"default\"].string,\n  showClearDates: _propTypes[\"default\"].bool,\n  showDefaultInputIcon: _propTypes[\"default\"].bool,\n  inputIconPosition: _IconPositionShape[\"default\"],\n  customInputIcon: _propTypes[\"default\"].node,\n  customArrowIcon: _propTypes[\"default\"].node,\n  customCloseIcon: _propTypes[\"default\"].node,\n  noBorder: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  small: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  keepFocusOnInput: _propTypes[\"default\"].bool,\n  // calendar presentation and interaction related props\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderWeekHeaderElement: _propTypes[\"default\"].func,\n  orientation: _OrientationShape[\"default\"],\n  anchorDirection: _AnchorDirectionShape[\"default\"],\n  openDirection: _OpenDirectionShape[\"default\"],\n  horizontalMargin: _propTypes[\"default\"].number,\n  withPortal: _propTypes[\"default\"].bool,\n  withFullScreenPortal: _propTypes[\"default\"].bool,\n  appendToBody: _propTypes[\"default\"].bool,\n  disableScroll: _propTypes[\"default\"].bool,\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  isRTL: _propTypes[\"default\"].bool,\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  initialVisibleMonth: _propTypes[\"default\"].func,\n  numberOfMonths: _propTypes[\"default\"].number,\n  keepOpenOnDateSelect: _propTypes[\"default\"].bool,\n  reopenPickerOnClearDates: _propTypes[\"default\"].bool,\n  renderCalendarInfo: _propTypes[\"default\"].func,\n  calendarInfoPosition: _CalendarInfoPositionShape[\"default\"],\n  hideKeyboardShortcutsPanel: _propTypes[\"default\"].bool,\n  verticalHeight: _airbnbPropTypes.nonNegativeInteger,\n  transitionDuration: _airbnbPropTypes.nonNegativeInteger,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  // navigation related props\n  dayPickerNavigationInlineStyles: _propTypes[\"default\"].object,\n  navPosition: _NavPositionShape[\"default\"],\n  navPrev: _propTypes[\"default\"].node,\n  navNext: _propTypes[\"default\"].node,\n  renderNavPrevButton: _propTypes[\"default\"].func,\n  renderNavNextButton: _propTypes[\"default\"].func,\n  onPrevMonthClick: _propTypes[\"default\"].func,\n  onNextMonthClick: _propTypes[\"default\"].func,\n  // day presentation and interaction related props\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  minimumNights: _propTypes[\"default\"].number,\n  minDate: _reactMomentProptypes[\"default\"].momentObj,\n  maxDate: _reactMomentProptypes[\"default\"].momentObj,\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  isDayBlocked: _propTypes[\"default\"].func,\n  isOutsideRange: _propTypes[\"default\"].func,\n  isDayHighlighted: _propTypes[\"default\"].func,\n  // internationalization props\n  displayFormat: _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].string, _propTypes[\"default\"].func]),\n  monthFormat: _propTypes[\"default\"].string,\n  weekDayFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DateRangePickerPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string\n};\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getResponsiveContainerStyles;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _constants = require(\"../constants\");\n\nfunction getResponsiveContainerStyles(anchorDirection, currentOffset, containerEdge, margin) {\n  var windowWidth = typeof window !== 'undefined' ? window.innerWidth : 0;\n  var calculatedOffset = anchorDirection === _constants.ANCHOR_LEFT ? windowWidth - containerEdge : containerEdge;\n  var calculatedMargin = margin || 0;\n  return (0, _defineProperty2[\"default\"])({}, anchorDirection, Math.min(currentOffset + calculatedOffset - calculatedMargin, 0));\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getDetachedContainerStyles;\n\nvar _constants = require(\"../constants\");\n\n/**\n * Calculate and return a CSS transform style to position a detached element\n * next to a reference element. The open and anchor direction indicate wether\n * it should be positioned above/below and/or to the left/right of the\n * reference element.\n *\n * Assuming r(0,0), r(1,1), d(0,0), d(1,1) for the bottom-left and top-right\n * corners of the reference and detached elements, respectively:\n *  - openDirection = DOWN, anchorDirection = LEFT => d(0,1) == r(0,1)\n *  - openDirection = UP, anchorDirection = LEFT => d(0,0) == r(0,0)\n *  - openDirection = DOWN, anchorDirection = RIGHT => d(1,1) == r(1,1)\n *  - openDirection = UP, anchorDirection = RIGHT => d(1,0) == r(1,0)\n *\n * By using a CSS transform, we allow to further position it using\n * top/bottom CSS properties for the anchor gutter.\n *\n * @param {string} openDirection The vertical positioning of the popup\n * @param {string} anchorDirection The horizontal position of the popup\n * @param {HTMLElement} referenceEl The reference element\n */\nfunction getDetachedContainerStyles(openDirection, anchorDirection, referenceEl) {\n  var referenceRect = referenceEl.getBoundingClientRect();\n  var offsetX = referenceRect.left;\n  var offsetY = referenceRect.top;\n\n  if (openDirection === _constants.OPEN_UP) {\n    offsetY = -(window.innerHeight - referenceRect.bottom);\n  }\n\n  if (anchorDirection === _constants.ANCHOR_RIGHT) {\n    offsetX = -(window.innerWidth - referenceRect.right);\n  }\n\n  return {\n    transform: \"translate3d(\".concat(Math.round(offsetX), \"px, \").concat(Math.round(offsetY), \"px, 0)\")\n  };\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getInputHeight;\n\n/* eslint-disable camelcase */\nfunction getPadding(vertical, top, bottom) {\n  var isTopDefined = typeof top === 'number';\n  var isBottomDefined = typeof bottom === 'number';\n  var isVerticalDefined = typeof vertical === 'number';\n\n  if (isTopDefined && isBottomDefined) {\n    return top + bottom;\n  }\n\n  if (isTopDefined && isVerticalDefined) {\n    return top + vertical;\n  }\n\n  if (isTopDefined) {\n    return top;\n  }\n\n  if (isBottomDefined && isVerticalDefined) {\n    return bottom + vertical;\n  }\n\n  if (isBottomDefined) {\n    return bottom;\n  }\n\n  if (isVerticalDefined) {\n    return 2 * vertical;\n  }\n\n  return 0;\n}\n\nfunction getInputHeight(_ref, small) {\n  var _ref$font$input = _ref.font.input,\n      lineHeight = _ref$font$input.lineHeight,\n      lineHeight_small = _ref$font$input.lineHeight_small,\n      _ref$spacing = _ref.spacing,\n      inputPadding = _ref$spacing.inputPadding,\n      displayTextPaddingVertical = _ref$spacing.displayTextPaddingVertical,\n      displayTextPaddingTop = _ref$spacing.displayTextPaddingTop,\n      displayTextPaddingBottom = _ref$spacing.displayTextPaddingBottom,\n      displayTextPaddingVertical_small = _ref$spacing.displayTextPaddingVertical_small,\n      displayTextPaddingTop_small = _ref$spacing.displayTextPaddingTop_small,\n      displayTextPaddingBottom_small = _ref$spacing.displayTextPaddingBottom_small;\n  var calcLineHeight = small ? lineHeight_small : lineHeight;\n  var padding = small ? getPadding(displayTextPaddingVertical_small, displayTextPaddingTop_small, displayTextPaddingBottom_small) : getPadding(displayTextPaddingVertical, displayTextPaddingTop, displayTextPaddingBottom);\n  return parseInt(calcLineHeight, 10) + 2 * inputPadding + padding;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isBeforeDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nfunction isBeforeDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  var aYear = a.year();\n  var aMonth = a.month();\n  var bYear = b.year();\n  var bMonth = b.month();\n  var isSameYear = aYear === bYear;\n  var isSameMonth = aMonth === bMonth;\n  if (isSameYear && isSameMonth) return a.date() < b.date();\n  if (isSameYear) return aMonth < bMonth;\n  return aYear < bYear;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isInclusivelyAfterDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isBeforeDay = _interopRequireDefault(require(\"./isBeforeDay\"));\n\nfunction isInclusivelyAfterDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  return !(0, _isBeforeDay[\"default\"])(a, b);\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getScrollParent = getScrollParent;\nexports.getScrollAncestorsOverflowY = getScrollAncestorsOverflowY;\nexports[\"default\"] = disableScroll;\n\nvar getScrollingRoot = function getScrollingRoot() {\n  return document.scrollingElement || document.documentElement;\n};\n/**\n * Recursively finds the scroll parent of a node. The scroll parrent of a node\n * is the closest node that is scrollable. A node is scrollable if:\n *  - it is allowed to scroll via CSS ('overflow-y' not visible or hidden);\n *  - and its children/content are \"bigger\" than the node's box height.\n *\n * The root of the document always scrolls by default.\n *\n * @param {HTMLElement} node Any DOM element.\n * @return {HTMLElement} The scroll parent element.\n */\n\n\nfunction getScrollParent(node) {\n  var parent = node.parentElement;\n  if (parent == null) return getScrollingRoot();\n\n  var _window$getComputedSt = window.getComputedStyle(parent),\n      overflowY = _window$getComputedSt.overflowY;\n\n  var canScroll = overflowY !== 'visible' && overflowY !== 'hidden';\n\n  if (canScroll && parent.scrollHeight > parent.clientHeight) {\n    return parent;\n  }\n\n  return getScrollParent(parent);\n}\n/**\n * Recursively traverses the tree upwards from the given node, capturing all\n * ancestor nodes that scroll along with their current 'overflow-y' CSS\n * property.\n *\n * @param {HTMLElement} node Any DOM element.\n * @param {Map<HTMLElement,string>} [acc] Accumulator map.\n * @return {Map<HTMLElement,string>} Map of ancestors with their 'overflow-y' value.\n */\n\n\nfunction getScrollAncestorsOverflowY(node) {\n  var acc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Map();\n  var scrollingRoot = getScrollingRoot();\n  var scrollParent = getScrollParent(node);\n  acc.set(scrollParent, scrollParent.style.overflowY);\n  if (scrollParent === scrollingRoot) return acc;\n  return getScrollAncestorsOverflowY(scrollParent, acc);\n}\n/**\n * Disabling the scroll on a node involves finding all the scrollable ancestors\n * and set their 'overflow-y' CSS property to 'hidden'. When all ancestors have\n * 'overflow-y: hidden' (up to the document element) there is no scroll\n * container, thus all the scroll outside of the node is disabled. In order to\n * enable scroll again, we store the previous value of the 'overflow-y' for\n * every ancestor in a closure and reset it back.\n *\n * @param {HTMLElement} node Any DOM element.\n */\n\n\nfunction disableScroll(node) {\n  var scrollAncestorsOverflowY = getScrollAncestorsOverflowY(node);\n\n  var toggle = function toggle(on) {\n    return scrollAncestorsOverflowY.forEach(function (overflowY, ancestor) {\n      ancestor.style.setProperty('overflow-y', on ? 'hidden' : overflowY);\n    });\n  };\n\n  toggle(true);\n  return function () {\n    return toggle(false);\n  };\n}", "/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n", "/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n", "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n", "var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\nmodule.exports = now;\n", "/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nmodule.exports = trimmedEndIndex;\n", "var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nmodule.exports = baseTrim;\n", "var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n", "var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n", "var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n", "/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n", "var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n", "var baseTrim = require('./_baseTrim'),\n    isObject = require('./isObject'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = baseTrim(value);\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n", "var isObject = require('./isObject'),\n    now = require('./now'),\n    toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nmodule.exports = debounce;\n", "var debounce = require('./debounce'),\n    isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\nmodule.exports = throttle;\n", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _throttle = _interopRequireDefault(require(\"lodash/throttle\"));\n\nvar _isTouchDevice = _interopRequireDefault(require(\"is-touch-device\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _getInputHeight = _interopRequireDefault(require(\"../utils/getInputHeight\"));\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"../shapes/OpenDirectionShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar FANG_PATH_TOP = \"M0,\".concat(_constants.FANG_HEIGHT_PX, \" \").concat(_constants.FANG_WIDTH_PX, \",\").concat(_constants.FANG_HEIGHT_PX, \" \").concat(_constants.FANG_WIDTH_PX / 2, \",0z\");\nvar FANG_STROKE_TOP = \"M0,\".concat(_constants.FANG_HEIGHT_PX, \" \").concat(_constants.FANG_WIDTH_PX / 2, \",0 \").concat(_constants.FANG_WIDTH_PX, \",\").concat(_constants.FANG_HEIGHT_PX);\nvar FANG_PATH_BOTTOM = \"M0,0 \".concat(_constants.FANG_WIDTH_PX, \",0 \").concat(_constants.FANG_WIDTH_PX / 2, \",\").concat(_constants.FANG_HEIGHT_PX, \"z\");\nvar FANG_STROKE_BOTTOM = \"M0,0 \".concat(_constants.FANG_WIDTH_PX / 2, \",\").concat(_constants.FANG_HEIGHT_PX, \" \").concat(_constants.FANG_WIDTH_PX, \",0\");\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  id: _propTypes[\"default\"].string.isRequired,\n  placeholder: _propTypes[\"default\"].string,\n  displayValue: _propTypes[\"default\"].string,\n  ariaLabel: _propTypes[\"default\"].string,\n  screenReaderMessage: _propTypes[\"default\"].string,\n  focused: _propTypes[\"default\"].bool,\n  disabled: _propTypes[\"default\"].bool,\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  openDirection: _OpenDirectionShape[\"default\"],\n  showCaret: _propTypes[\"default\"].bool,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  small: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  onChange: _propTypes[\"default\"].func,\n  onFocus: _propTypes[\"default\"].func,\n  onKeyDownShiftTab: _propTypes[\"default\"].func,\n  onKeyDownTab: _propTypes[\"default\"].func,\n  onKeyDownArrowDown: _propTypes[\"default\"].func,\n  onKeyDownQuestionMark: _propTypes[\"default\"].func,\n  // accessibility\n  isFocused: _propTypes[\"default\"].bool // describes actual DOM focus\n\n})) : {};\nvar defaultProps = {\n  placeholder: 'Select Date',\n  displayValue: '',\n  ariaLabel: undefined,\n  screenReaderMessage: '',\n  focused: false,\n  disabled: false,\n  required: false,\n  readOnly: null,\n  openDirection: _constants.OPEN_DOWN,\n  showCaret: false,\n  verticalSpacing: _constants.DEFAULT_VERTICAL_SPACING,\n  small: false,\n  block: false,\n  regular: false,\n  onChange: function onChange() {},\n  onFocus: function onFocus() {},\n  onKeyDownShiftTab: function onKeyDownShiftTab() {},\n  onKeyDownTab: function onKeyDownTab() {},\n  onKeyDownArrowDown: function onKeyDownArrowDown() {},\n  onKeyDownQuestionMark: function onKeyDownQuestionMark() {},\n  // accessibility\n  isFocused: false\n};\n\nvar DateInput =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DateInput, _ref);\n  var _proto = DateInput.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DateInput(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.state = {\n      dateString: '',\n      isTouchDevice: false\n    };\n    _this.onChange = _this.onChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onKeyDown = _this.onKeyDown.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setInputRef = _this.setInputRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.throttledKeyDown = (0, _throttle[\"default\"])(_this.onFinalKeyDown, 300, {\n      trailing: false\n    });\n    return _this;\n  }\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.setState({\n      isTouchDevice: (0, _isTouchDevice[\"default\"])()\n    });\n  };\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var dateString = this.state.dateString;\n\n    if (dateString && nextProps.displayValue) {\n      this.setState({\n        dateString: ''\n      });\n    }\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var _this$props = this.props,\n        focused = _this$props.focused,\n        isFocused = _this$props.isFocused;\n    if (prevProps.focused === focused && prevProps.isFocused === isFocused) return;\n\n    if (focused && isFocused) {\n      this.inputRef.focus();\n    }\n  };\n\n  _proto.onChange = function onChange(e) {\n    var _this$props2 = this.props,\n        onChange = _this$props2.onChange,\n        onKeyDownQuestionMark = _this$props2.onKeyDownQuestionMark;\n    var dateString = e.target.value; // In Safari, onKeyDown does not consistently fire ahead of onChange. As a result, we need to\n    // special case the `?` key so that it always triggers the appropriate callback, instead of\n    // modifying the input value\n\n    if (dateString[dateString.length - 1] === '?') {\n      onKeyDownQuestionMark(e);\n    } else {\n      this.setState({\n        dateString: dateString\n      }, function () {\n        return onChange(dateString);\n      });\n    }\n  };\n\n  _proto.onKeyDown = function onKeyDown(e) {\n    e.stopPropagation();\n\n    if (!_constants.MODIFIER_KEY_NAMES.has(e.key)) {\n      this.throttledKeyDown(e);\n    }\n  };\n\n  _proto.onFinalKeyDown = function onFinalKeyDown(e) {\n    var _this$props3 = this.props,\n        onKeyDownShiftTab = _this$props3.onKeyDownShiftTab,\n        onKeyDownTab = _this$props3.onKeyDownTab,\n        onKeyDownArrowDown = _this$props3.onKeyDownArrowDown,\n        onKeyDownQuestionMark = _this$props3.onKeyDownQuestionMark;\n    var key = e.key;\n\n    if (key === 'Tab') {\n      if (e.shiftKey) {\n        onKeyDownShiftTab(e);\n      } else {\n        onKeyDownTab(e);\n      }\n    } else if (key === 'ArrowDown') {\n      onKeyDownArrowDown(e);\n    } else if (key === '?') {\n      e.preventDefault();\n      onKeyDownQuestionMark(e);\n    }\n  };\n\n  _proto.setInputRef = function setInputRef(ref) {\n    this.inputRef = ref;\n  };\n\n  _proto.render = function render() {\n    var _this$state = this.state,\n        dateString = _this$state.dateString,\n        isTouch = _this$state.isTouchDevice;\n    var _this$props4 = this.props,\n        id = _this$props4.id,\n        placeholder = _this$props4.placeholder,\n        ariaLabel = _this$props4.ariaLabel,\n        displayValue = _this$props4.displayValue,\n        screenReaderMessage = _this$props4.screenReaderMessage,\n        focused = _this$props4.focused,\n        showCaret = _this$props4.showCaret,\n        onFocus = _this$props4.onFocus,\n        disabled = _this$props4.disabled,\n        required = _this$props4.required,\n        readOnly = _this$props4.readOnly,\n        openDirection = _this$props4.openDirection,\n        verticalSpacing = _this$props4.verticalSpacing,\n        small = _this$props4.small,\n        regular = _this$props4.regular,\n        block = _this$props4.block,\n        styles = _this$props4.styles,\n        reactDates = _this$props4.theme.reactDates;\n    var value = dateString || displayValue || '';\n    var screenReaderMessageId = \"DateInput__screen-reader-message-\".concat(id);\n    var withFang = showCaret && focused;\n    var inputHeight = (0, _getInputHeight[\"default\"])(reactDates, small);\n    return _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.DateInput, small && styles.DateInput__small, block && styles.DateInput__block, withFang && styles.DateInput__withFang, disabled && styles.DateInput__disabled, withFang && openDirection === _constants.OPEN_DOWN && styles.DateInput__openDown, withFang && openDirection === _constants.OPEN_UP && styles.DateInput__openUp), _react[\"default\"].createElement(\"input\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateInput_input, small && styles.DateInput_input__small, regular && styles.DateInput_input__regular, readOnly && styles.DateInput_input__readOnly, focused && styles.DateInput_input__focused, disabled && styles.DateInput_input__disabled), {\n      \"aria-label\": ariaLabel === undefined ? placeholder : ariaLabel,\n      type: \"text\",\n      id: id,\n      name: id,\n      ref: this.setInputRef,\n      value: value,\n      onChange: this.onChange,\n      onKeyDown: this.onKeyDown,\n      onFocus: onFocus,\n      placeholder: placeholder,\n      autoComplete: \"off\",\n      disabled: disabled,\n      readOnly: typeof readOnly === 'boolean' ? readOnly : isTouch,\n      required: required,\n      \"aria-describedby\": screenReaderMessage && screenReaderMessageId\n    })), withFang && _react[\"default\"].createElement(\"svg\", (0, _extends2[\"default\"])({\n      role: \"presentation\",\n      focusable: \"false\"\n    }, (0, _reactWithStyles.css)(styles.DateInput_fang, openDirection === _constants.OPEN_DOWN && {\n      top: inputHeight + verticalSpacing - _constants.FANG_HEIGHT_PX - 1\n    }, openDirection === _constants.OPEN_UP && {\n      bottom: inputHeight + verticalSpacing - _constants.FANG_HEIGHT_PX - 1\n    })), _react[\"default\"].createElement(\"path\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateInput_fangShape), {\n      d: openDirection === _constants.OPEN_DOWN ? FANG_PATH_TOP : FANG_PATH_BOTTOM\n    })), _react[\"default\"].createElement(\"path\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateInput_fangStroke), {\n      d: openDirection === _constants.OPEN_DOWN ? FANG_STROKE_TOP : FANG_STROKE_BOTTOM\n    }))), screenReaderMessage && _react[\"default\"].createElement(\"p\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateInput_screenReaderMessage), {\n      id: screenReaderMessageId\n    }), screenReaderMessage));\n  };\n\n  return DateInput;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nDateInput.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDateInput.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      border = _ref2$reactDates.border,\n      color = _ref2$reactDates.color,\n      sizing = _ref2$reactDates.sizing,\n      spacing = _ref2$reactDates.spacing,\n      font = _ref2$reactDates.font,\n      zIndex = _ref2$reactDates.zIndex;\n  return {\n    DateInput: {\n      margin: 0,\n      padding: spacing.inputPadding,\n      background: color.background,\n      position: 'relative',\n      display: 'inline-block',\n      width: sizing.inputWidth,\n      verticalAlign: 'middle'\n    },\n    DateInput__small: {\n      width: sizing.inputWidth_small\n    },\n    DateInput__block: {\n      width: '100%'\n    },\n    DateInput__disabled: {\n      background: color.disabled,\n      color: color.textDisabled\n    },\n    DateInput_input: {\n      fontWeight: font.input.weight,\n      fontSize: font.input.size,\n      lineHeight: font.input.lineHeight,\n      color: color.text,\n      backgroundColor: color.background,\n      width: '100%',\n      padding: \"\".concat(spacing.displayTextPaddingVertical, \"px \").concat(spacing.displayTextPaddingHorizontal, \"px\"),\n      paddingTop: spacing.displayTextPaddingTop,\n      paddingBottom: spacing.displayTextPaddingBottom,\n      paddingLeft: (0, _noflip[\"default\"])(spacing.displayTextPaddingLeft),\n      paddingRight: (0, _noflip[\"default\"])(spacing.displayTextPaddingRight),\n      border: border.input.border,\n      borderTop: border.input.borderTop,\n      borderRight: (0, _noflip[\"default\"])(border.input.borderRight),\n      borderBottom: border.input.borderBottom,\n      borderLeft: (0, _noflip[\"default\"])(border.input.borderLeft),\n      borderRadius: border.input.borderRadius\n    },\n    DateInput_input__small: {\n      fontSize: font.input.size_small,\n      lineHeight: font.input.lineHeight_small,\n      letterSpacing: font.input.letterSpacing_small,\n      padding: \"\".concat(spacing.displayTextPaddingVertical_small, \"px \").concat(spacing.displayTextPaddingHorizontal_small, \"px\"),\n      paddingTop: spacing.displayTextPaddingTop_small,\n      paddingBottom: spacing.displayTextPaddingBottom_small,\n      paddingLeft: (0, _noflip[\"default\"])(spacing.displayTextPaddingLeft_small),\n      paddingRight: (0, _noflip[\"default\"])(spacing.displayTextPaddingRight_small)\n    },\n    DateInput_input__regular: {\n      fontWeight: 'auto'\n    },\n    DateInput_input__readOnly: {\n      userSelect: 'none'\n    },\n    DateInput_input__focused: {\n      outline: border.input.outlineFocused,\n      background: color.backgroundFocused,\n      border: border.input.borderFocused,\n      borderTop: border.input.borderTopFocused,\n      borderRight: (0, _noflip[\"default\"])(border.input.borderRightFocused),\n      borderBottom: border.input.borderBottomFocused,\n      borderLeft: (0, _noflip[\"default\"])(border.input.borderLeftFocused)\n    },\n    DateInput_input__disabled: {\n      background: color.disabled,\n      fontStyle: font.input.styleDisabled\n    },\n    DateInput_screenReaderMessage: {\n      border: 0,\n      clip: 'rect(0, 0, 0, 0)',\n      height: 1,\n      margin: -1,\n      overflow: 'hidden',\n      padding: 0,\n      position: 'absolute',\n      width: 1\n    },\n    DateInput_fang: {\n      position: 'absolute',\n      width: _constants.FANG_WIDTH_PX,\n      height: _constants.FANG_HEIGHT_PX,\n      left: 22,\n      // TODO: should be noflip wrapped and handled by an isRTL prop\n      zIndex: zIndex + 2\n    },\n    DateInput_fangShape: {\n      fill: color.background\n    },\n    DateInput_fangStroke: {\n      stroke: color.core.border,\n      fill: 'transparent'\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(DateInput);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar RightArrow = function RightArrow(props) {\n  return _react[\"default\"].createElement(\"svg\", props, _react[\"default\"].createElement(\"path\", {\n    d: \"M694 242l249 250c12 11 12 21 1 32L694 773c-5 5-10 7-16 7s-11-2-16-7c-11-11-11-21 0-32l210-210H68c-13 0-23-10-23-23s10-23 23-23h806L662 275c-21-22 11-54 32-33z\"\n  }));\n};\n\nRightArrow.defaultProps = {\n  focusable: \"false\",\n  viewBox: \"0 0 1000 1000\"\n};\nvar _default = RightArrow;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar LeftArrow = function LeftArrow(props) {\n  return _react[\"default\"].createElement(\"svg\", props, _react[\"default\"].createElement(\"path\", {\n    d: \"M336 275L126 485h806c13 0 23 10 23 23s-10 23-23 23H126l210 210c11 11 11 21 0 32-5 5-10 7-16 7s-11-2-16-7L55 524c-11-11-11-21 0-32l249-249c21-22 53 10 32 32z\"\n  }));\n};\n\nLeftArrow.defaultProps = {\n  focusable: \"false\",\n  viewBox: \"0 0 1000 1000\"\n};\nvar _default = LeftArrow;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar CloseButton = function CloseButton(props) {\n  return _react[\"default\"].createElement(\"svg\", props, _react[\"default\"].createElement(\"path\", {\n    fillRule: \"evenodd\",\n    d: \"M11.53.47a.75.75 0 0 0-1.061 0l-4.47 4.47L1.529.47A.75.75 0 1 0 .468 1.531l4.47 4.47-4.47 4.47a.75.75 0 1 0 1.061 1.061l4.47-4.47 4.47 4.47a.75.75 0 1 0 1.061-1.061l-4.47-4.47 4.47-4.47a.75.75 0 0 0 0-1.061z\"\n  }));\n};\n\nCloseButton.defaultProps = {\n  focusable: \"false\",\n  viewBox: \"0 0 12 12\"\n};\nvar _default = CloseButton;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar CalendarIcon = function CalendarIcon(props) {\n  return _react[\"default\"].createElement(\"svg\", props, _react[\"default\"].createElement(\"path\", {\n    d: \"m107 1393h241v-241h-241zm295 0h268v-241h-268zm-295-295h241v-268h-241zm295 0h268v-268h-268zm-295-321h241v-241h-241zm616 616h268v-241h-268zm-321-616h268v-241h-268zm643 616h241v-241h-241zm-322-295h268v-268h-268zm-294-723v-241c0-7-3-14-8-19-6-5-12-8-19-8h-54c-7 0-13 3-19 8-5 5-8 12-8 19v241c0 7 3 14 8 19 6 5 12 8 19 8h54c7 0 13-3 19-8 5-5 8-12 8-19zm616 723h241v-268h-241zm-322-321h268v-241h-268zm322 0h241v-241h-241zm27-402v-241c0-7-3-14-8-19-6-5-12-8-19-8h-54c-7 0-13 3-19 8-5 5-8 12-8 19v241c0 7 3 14 8 19 6 5 12 8 19 8h54c7 0 13-3 19-8 5-5 8-12 8-19zm321-54v1072c0 29-11 54-32 75s-46 32-75 32h-1179c-29 0-54-11-75-32s-32-46-32-75v-1072c0-29 11-54 32-75s46-32 75-32h107v-80c0-37 13-68 40-95s57-39 94-39h54c37 0 68 13 95 39 26 26 39 58 39 95v80h321v-80c0-37 13-69 40-95 26-26 57-39 94-39h54c37 0 68 13 94 39s40 58 40 95v80h107c29 0 54 11 75 32s32 46 32 75z\"\n  }));\n};\n\nCalendarIcon.defaultProps = {\n  focusable: \"false\",\n  viewBox: \"0 0 1393.1 1500\"\n};\nvar _default = CalendarIcon;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"../shapes/OpenDirectionShape\"));\n\nvar _DateInput = _interopRequireDefault(require(\"./DateInput\"));\n\nvar _IconPositionShape = _interopRequireDefault(require(\"../shapes/IconPositionShape\"));\n\nvar _DisabledShape = _interopRequireDefault(require(\"../shapes/DisabledShape\"));\n\nvar _RightArrow = _interopRequireDefault(require(\"./RightArrow\"));\n\nvar _LeftArrow = _interopRequireDefault(require(\"./LeftArrow\"));\n\nvar _CloseButton = _interopRequireDefault(require(\"./CloseButton\"));\n\nvar _CalendarIcon = _interopRequireDefault(require(\"./CalendarIcon\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  children: _propTypes[\"default\"].node,\n  startDateId: _propTypes[\"default\"].string,\n  startDatePlaceholderText: _propTypes[\"default\"].string,\n  startDateAriaLabel: _propTypes[\"default\"].string,\n  screenReaderMessage: _propTypes[\"default\"].string,\n  endDateId: _propTypes[\"default\"].string,\n  endDatePlaceholderText: _propTypes[\"default\"].string,\n  endDateAriaLabel: _propTypes[\"default\"].string,\n  onStartDateFocus: _propTypes[\"default\"].func,\n  onEndDateFocus: _propTypes[\"default\"].func,\n  onStartDateChange: _propTypes[\"default\"].func,\n  onEndDateChange: _propTypes[\"default\"].func,\n  onStartDateShiftTab: _propTypes[\"default\"].func,\n  onEndDateTab: _propTypes[\"default\"].func,\n  onClearDates: _propTypes[\"default\"].func,\n  onKeyDownArrowDown: _propTypes[\"default\"].func,\n  onKeyDownQuestionMark: _propTypes[\"default\"].func,\n  startDate: _propTypes[\"default\"].string,\n  endDate: _propTypes[\"default\"].string,\n  isStartDateFocused: _propTypes[\"default\"].bool,\n  isEndDateFocused: _propTypes[\"default\"].bool,\n  showClearDates: _propTypes[\"default\"].bool,\n  disabled: _DisabledShape[\"default\"],\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  openDirection: _OpenDirectionShape[\"default\"],\n  showCaret: _propTypes[\"default\"].bool,\n  showDefaultInputIcon: _propTypes[\"default\"].bool,\n  inputIconPosition: _IconPositionShape[\"default\"],\n  customInputIcon: _propTypes[\"default\"].node,\n  customArrowIcon: _propTypes[\"default\"].node,\n  customCloseIcon: _propTypes[\"default\"].node,\n  noBorder: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  small: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  // accessibility\n  isFocused: _propTypes[\"default\"].bool,\n  // describes actual DOM focus\n  // i18n\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DateRangePickerInputPhrases)),\n  isRTL: _propTypes[\"default\"].bool\n})) : {};\nvar defaultProps = {\n  children: null,\n  startDateId: _constants.START_DATE,\n  endDateId: _constants.END_DATE,\n  startDatePlaceholderText: 'Start Date',\n  endDatePlaceholderText: 'End Date',\n  startDateAriaLabel: undefined,\n  endDateAriaLabel: undefined,\n  screenReaderMessage: '',\n  onStartDateFocus: function onStartDateFocus() {},\n  onEndDateFocus: function onEndDateFocus() {},\n  onStartDateChange: function onStartDateChange() {},\n  onEndDateChange: function onEndDateChange() {},\n  onStartDateShiftTab: function onStartDateShiftTab() {},\n  onEndDateTab: function onEndDateTab() {},\n  onClearDates: function onClearDates() {},\n  onKeyDownArrowDown: function onKeyDownArrowDown() {},\n  onKeyDownQuestionMark: function onKeyDownQuestionMark() {},\n  startDate: '',\n  endDate: '',\n  isStartDateFocused: false,\n  isEndDateFocused: false,\n  showClearDates: false,\n  disabled: false,\n  required: false,\n  readOnly: false,\n  openDirection: _constants.OPEN_DOWN,\n  showCaret: false,\n  showDefaultInputIcon: false,\n  inputIconPosition: _constants.ICON_BEFORE_POSITION,\n  customInputIcon: null,\n  customArrowIcon: null,\n  customCloseIcon: null,\n  noBorder: false,\n  block: false,\n  small: false,\n  regular: false,\n  verticalSpacing: undefined,\n  // accessibility\n  isFocused: false,\n  // i18n\n  phrases: _defaultPhrases.DateRangePickerInputPhrases,\n  isRTL: false\n};\n\nfunction DateRangePickerInput(_ref) {\n  var children = _ref.children,\n      startDate = _ref.startDate,\n      startDateId = _ref.startDateId,\n      startDatePlaceholderText = _ref.startDatePlaceholderText,\n      screenReaderMessage = _ref.screenReaderMessage,\n      isStartDateFocused = _ref.isStartDateFocused,\n      onStartDateChange = _ref.onStartDateChange,\n      onStartDateFocus = _ref.onStartDateFocus,\n      onStartDateShiftTab = _ref.onStartDateShiftTab,\n      startDateAriaLabel = _ref.startDateAriaLabel,\n      endDate = _ref.endDate,\n      endDateId = _ref.endDateId,\n      endDatePlaceholderText = _ref.endDatePlaceholderText,\n      isEndDateFocused = _ref.isEndDateFocused,\n      onEndDateChange = _ref.onEndDateChange,\n      onEndDateFocus = _ref.onEndDateFocus,\n      onEndDateTab = _ref.onEndDateTab,\n      endDateAriaLabel = _ref.endDateAriaLabel,\n      onKeyDownArrowDown = _ref.onKeyDownArrowDown,\n      onKeyDownQuestionMark = _ref.onKeyDownQuestionMark,\n      onClearDates = _ref.onClearDates,\n      showClearDates = _ref.showClearDates,\n      disabled = _ref.disabled,\n      required = _ref.required,\n      readOnly = _ref.readOnly,\n      showCaret = _ref.showCaret,\n      openDirection = _ref.openDirection,\n      showDefaultInputIcon = _ref.showDefaultInputIcon,\n      inputIconPosition = _ref.inputIconPosition,\n      customInputIcon = _ref.customInputIcon,\n      customArrowIcon = _ref.customArrowIcon,\n      customCloseIcon = _ref.customCloseIcon,\n      isFocused = _ref.isFocused,\n      phrases = _ref.phrases,\n      isRTL = _ref.isRTL,\n      noBorder = _ref.noBorder,\n      block = _ref.block,\n      verticalSpacing = _ref.verticalSpacing,\n      small = _ref.small,\n      regular = _ref.regular,\n      styles = _ref.styles;\n\n  var calendarIcon = customInputIcon || _react[\"default\"].createElement(_CalendarIcon[\"default\"], (0, _reactWithStyles.css)(styles.DateRangePickerInput_calendarIcon_svg));\n\n  var arrowIcon = customArrowIcon || _react[\"default\"].createElement(_RightArrow[\"default\"], (0, _reactWithStyles.css)(styles.DateRangePickerInput_arrow_svg));\n\n  if (isRTL) arrowIcon = _react[\"default\"].createElement(_LeftArrow[\"default\"], (0, _reactWithStyles.css)(styles.DateRangePickerInput_arrow_svg));\n  if (small) arrowIcon = '-';\n\n  var closeIcon = customCloseIcon || _react[\"default\"].createElement(_CloseButton[\"default\"], (0, _reactWithStyles.css)(styles.DateRangePickerInput_clearDates_svg, small && styles.DateRangePickerInput_clearDates_svg__small));\n\n  var screenReaderStartDateText = screenReaderMessage || phrases.keyboardForwardNavigationInstructions;\n  var screenReaderEndDateText = screenReaderMessage || phrases.keyboardBackwardNavigationInstructions;\n\n  var inputIcon = (showDefaultInputIcon || customInputIcon !== null) && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateRangePickerInput_calendarIcon), {\n    type: \"button\",\n    disabled: disabled,\n    \"aria-label\": phrases.focusStartDate,\n    onClick: onKeyDownArrowDown\n  }), calendarIcon);\n\n  var startDateDisabled = disabled === _constants.START_DATE || disabled === true;\n  var endDateDisabled = disabled === _constants.END_DATE || disabled === true;\n  return _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.DateRangePickerInput, disabled && styles.DateRangePickerInput__disabled, isRTL && styles.DateRangePickerInput__rtl, !noBorder && styles.DateRangePickerInput__withBorder, block && styles.DateRangePickerInput__block, showClearDates && styles.DateRangePickerInput__showClearDates), inputIconPosition === _constants.ICON_BEFORE_POSITION && inputIcon, _react[\"default\"].createElement(_DateInput[\"default\"], {\n    id: startDateId,\n    placeholder: startDatePlaceholderText,\n    ariaLabel: startDateAriaLabel,\n    displayValue: startDate,\n    screenReaderMessage: screenReaderStartDateText,\n    focused: isStartDateFocused,\n    isFocused: isFocused,\n    disabled: startDateDisabled,\n    required: required,\n    readOnly: readOnly,\n    showCaret: showCaret,\n    openDirection: openDirection,\n    onChange: onStartDateChange,\n    onFocus: onStartDateFocus,\n    onKeyDownShiftTab: onStartDateShiftTab,\n    onKeyDownArrowDown: onKeyDownArrowDown,\n    onKeyDownQuestionMark: onKeyDownQuestionMark,\n    verticalSpacing: verticalSpacing,\n    small: small,\n    regular: regular\n  }), children, _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateRangePickerInput_arrow), {\n    \"aria-hidden\": \"true\",\n    role: \"presentation\"\n  }), arrowIcon), _react[\"default\"].createElement(_DateInput[\"default\"], {\n    id: endDateId,\n    placeholder: endDatePlaceholderText,\n    ariaLabel: endDateAriaLabel,\n    displayValue: endDate,\n    screenReaderMessage: screenReaderEndDateText,\n    focused: isEndDateFocused,\n    isFocused: isFocused,\n    disabled: endDateDisabled,\n    required: required,\n    readOnly: readOnly,\n    showCaret: showCaret,\n    openDirection: openDirection,\n    onChange: onEndDateChange,\n    onFocus: onEndDateFocus,\n    onKeyDownArrowDown: onKeyDownArrowDown,\n    onKeyDownQuestionMark: onKeyDownQuestionMark,\n    onKeyDownTab: onEndDateTab,\n    verticalSpacing: verticalSpacing,\n    small: small,\n    regular: regular\n  }), showClearDates && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({\n    type: \"button\",\n    \"aria-label\": phrases.clearDates\n  }, (0, _reactWithStyles.css)(styles.DateRangePickerInput_clearDates, small && styles.DateRangePickerInput_clearDates__small, !customCloseIcon && styles.DateRangePickerInput_clearDates_default, !(startDate || endDate) && styles.DateRangePickerInput_clearDates__hide), {\n    onClick: onClearDates,\n    disabled: disabled\n  }), closeIcon), inputIconPosition === _constants.ICON_AFTER_POSITION && inputIcon);\n}\n\nDateRangePickerInput.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDateRangePickerInput.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      border = _ref2$reactDates.border,\n      color = _ref2$reactDates.color,\n      sizing = _ref2$reactDates.sizing;\n  return {\n    DateRangePickerInput: {\n      backgroundColor: color.background,\n      display: 'inline-block'\n    },\n    DateRangePickerInput__disabled: {\n      background: color.disabled\n    },\n    DateRangePickerInput__withBorder: {\n      borderColor: color.border,\n      borderWidth: border.pickerInput.borderWidth,\n      borderStyle: border.pickerInput.borderStyle,\n      borderRadius: border.pickerInput.borderRadius\n    },\n    DateRangePickerInput__rtl: {\n      direction: (0, _noflip[\"default\"])('rtl')\n    },\n    DateRangePickerInput__block: {\n      display: 'block'\n    },\n    DateRangePickerInput__showClearDates: {\n      paddingRight: 30 // TODO: should be noflip wrapped and handled by an isRTL prop\n\n    },\n    DateRangePickerInput_arrow: {\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      color: color.text\n    },\n    DateRangePickerInput_arrow_svg: {\n      verticalAlign: 'middle',\n      fill: color.text,\n      height: sizing.arrowWidth,\n      width: sizing.arrowWidth\n    },\n    DateRangePickerInput_clearDates: {\n      background: 'none',\n      border: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      cursor: 'pointer',\n      padding: 10,\n      margin: '0 10px 0 5px',\n      // TODO: should be noflip wrapped and handled by an isRTL prop\n      position: 'absolute',\n      right: 0,\n      // TODO: should be noflip wrapped and handled by an isRTL prop\n      top: '50%',\n      transform: 'translateY(-50%)'\n    },\n    DateRangePickerInput_clearDates__small: {\n      padding: 6\n    },\n    DateRangePickerInput_clearDates_default: {\n      ':focus': {\n        background: color.core.border,\n        borderRadius: '50%'\n      },\n      ':hover': {\n        background: color.core.border,\n        borderRadius: '50%'\n      }\n    },\n    DateRangePickerInput_clearDates__hide: {\n      visibility: 'hidden'\n    },\n    DateRangePickerInput_clearDates_svg: {\n      fill: color.core.grayLight,\n      height: 12,\n      width: 15,\n      verticalAlign: 'middle'\n    },\n    DateRangePickerInput_clearDates_svg__small: {\n      height: 9\n    },\n    DateRangePickerInput_calendarIcon: {\n      background: 'none',\n      border: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      cursor: 'pointer',\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      padding: 10,\n      margin: '0 5px 0 10px' // TODO: should be noflip wrapped and handled by an isRTL prop\n\n    },\n    DateRangePickerInput_calendarIcon_svg: {\n      fill: color.core.grayLight,\n      height: 15,\n      width: 14,\n      verticalAlign: 'middle'\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(DateRangePickerInput);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = toLocalizedDateString;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _toMomentObject = _interopRequireDefault(require(\"./toMomentObject\"));\n\nvar _constants = require(\"../constants\");\n\nfunction toLocalizedDateString(date, currentFormat) {\n  var dateObj = _moment[\"default\"].isMoment(date) ? date : (0, _toMomentObject[\"default\"])(date, currentFormat);\n  if (!dateObj) return null;\n  return dateObj.format(_constants.DISPLAY_FORMAT);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"../shapes/OpenDirectionShape\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _DateRangePickerInput = _interopRequireDefault(require(\"./DateRangePickerInput\"));\n\nvar _IconPositionShape = _interopRequireDefault(require(\"../shapes/IconPositionShape\"));\n\nvar _DisabledShape = _interopRequireDefault(require(\"../shapes/DisabledShape\"));\n\nvar _toMomentObject = _interopRequireDefault(require(\"../utils/toMomentObject\"));\n\nvar _toLocalizedDateString = _interopRequireDefault(require(\"../utils/toLocalizedDateString\"));\n\nvar _isInclusivelyAfterDay = _interopRequireDefault(require(\"../utils/isInclusivelyAfterDay\"));\n\nvar _isBeforeDay = _interopRequireDefault(require(\"../utils/isBeforeDay\"));\n\nvar _constants = require(\"../constants\");\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)({\n  children: _propTypes[\"default\"].node,\n  startDate: _reactMomentProptypes[\"default\"].momentObj,\n  startDateId: _propTypes[\"default\"].string,\n  startDatePlaceholderText: _propTypes[\"default\"].string,\n  isStartDateFocused: _propTypes[\"default\"].bool,\n  startDateAriaLabel: _propTypes[\"default\"].string,\n  endDate: _reactMomentProptypes[\"default\"].momentObj,\n  endDateId: _propTypes[\"default\"].string,\n  endDatePlaceholderText: _propTypes[\"default\"].string,\n  isEndDateFocused: _propTypes[\"default\"].bool,\n  endDateAriaLabel: _propTypes[\"default\"].string,\n  screenReaderMessage: _propTypes[\"default\"].string,\n  showClearDates: _propTypes[\"default\"].bool,\n  showCaret: _propTypes[\"default\"].bool,\n  showDefaultInputIcon: _propTypes[\"default\"].bool,\n  inputIconPosition: _IconPositionShape[\"default\"],\n  disabled: _DisabledShape[\"default\"],\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  openDirection: _OpenDirectionShape[\"default\"],\n  noBorder: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  small: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  keepOpenOnDateSelect: _propTypes[\"default\"].bool,\n  reopenPickerOnClearDates: _propTypes[\"default\"].bool,\n  withFullScreenPortal: _propTypes[\"default\"].bool,\n  minimumNights: _airbnbPropTypes.nonNegativeInteger,\n  isOutsideRange: _propTypes[\"default\"].func,\n  displayFormat: _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].string, _propTypes[\"default\"].func]),\n  onFocusChange: _propTypes[\"default\"].func,\n  onClose: _propTypes[\"default\"].func,\n  onDatesChange: _propTypes[\"default\"].func,\n  onKeyDownArrowDown: _propTypes[\"default\"].func,\n  onKeyDownQuestionMark: _propTypes[\"default\"].func,\n  customInputIcon: _propTypes[\"default\"].node,\n  customArrowIcon: _propTypes[\"default\"].node,\n  customCloseIcon: _propTypes[\"default\"].node,\n  // accessibility\n  isFocused: _propTypes[\"default\"].bool,\n  // i18n\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DateRangePickerInputPhrases)),\n  isRTL: _propTypes[\"default\"].bool\n}) : {};\nvar defaultProps = {\n  children: null,\n  startDate: null,\n  startDateId: _constants.START_DATE,\n  startDatePlaceholderText: 'Start Date',\n  isStartDateFocused: false,\n  startDateAriaLabel: undefined,\n  endDate: null,\n  endDateId: _constants.END_DATE,\n  endDatePlaceholderText: 'End Date',\n  isEndDateFocused: false,\n  endDateAriaLabel: undefined,\n  screenReaderMessage: '',\n  showClearDates: false,\n  showCaret: false,\n  showDefaultInputIcon: false,\n  inputIconPosition: _constants.ICON_BEFORE_POSITION,\n  disabled: false,\n  required: false,\n  readOnly: false,\n  openDirection: _constants.OPEN_DOWN,\n  noBorder: false,\n  block: false,\n  small: false,\n  regular: false,\n  verticalSpacing: undefined,\n  keepOpenOnDateSelect: false,\n  reopenPickerOnClearDates: false,\n  withFullScreenPortal: false,\n  minimumNights: 1,\n  isOutsideRange: function isOutsideRange(day) {\n    return !(0, _isInclusivelyAfterDay[\"default\"])(day, (0, _moment[\"default\"])());\n  },\n  displayFormat: function displayFormat() {\n    return _moment[\"default\"].localeData().longDateFormat('L');\n  },\n  onFocusChange: function onFocusChange() {},\n  onClose: function onClose() {},\n  onDatesChange: function onDatesChange() {},\n  onKeyDownArrowDown: function onKeyDownArrowDown() {},\n  onKeyDownQuestionMark: function onKeyDownQuestionMark() {},\n  customInputIcon: null,\n  customArrowIcon: null,\n  customCloseIcon: null,\n  // accessibility\n  isFocused: false,\n  // i18n\n  phrases: _defaultPhrases.DateRangePickerInputPhrases,\n  isRTL: false\n};\n\nvar DateRangePickerInputController =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DateRangePickerInputController, _ref);\n  var _proto = DateRangePickerInputController.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DateRangePickerInputController(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.onClearFocus = _this.onClearFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onStartDateChange = _this.onStartDateChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onStartDateFocus = _this.onStartDateFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onEndDateChange = _this.onEndDateChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onEndDateFocus = _this.onEndDateFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.clearDates = _this.clearDates.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.onClearFocus = function onClearFocus() {\n    var _this$props = this.props,\n        onFocusChange = _this$props.onFocusChange,\n        onClose = _this$props.onClose,\n        startDate = _this$props.startDate,\n        endDate = _this$props.endDate;\n    onFocusChange(null);\n    onClose({\n      startDate: startDate,\n      endDate: endDate\n    });\n  };\n\n  _proto.onEndDateChange = function onEndDateChange(endDateString) {\n    var _this$props2 = this.props,\n        startDate = _this$props2.startDate,\n        isOutsideRange = _this$props2.isOutsideRange,\n        minimumNights = _this$props2.minimumNights,\n        keepOpenOnDateSelect = _this$props2.keepOpenOnDateSelect,\n        onDatesChange = _this$props2.onDatesChange;\n    var endDate = (0, _toMomentObject[\"default\"])(endDateString, this.getDisplayFormat());\n    var isEndDateValid = endDate && !isOutsideRange(endDate) && !(startDate && (0, _isBeforeDay[\"default\"])(endDate, startDate.clone().add(minimumNights, 'days')));\n\n    if (isEndDateValid) {\n      onDatesChange({\n        startDate: startDate,\n        endDate: endDate\n      });\n      if (!keepOpenOnDateSelect) this.onClearFocus();\n    } else {\n      onDatesChange({\n        startDate: startDate,\n        endDate: null\n      });\n    }\n  };\n\n  _proto.onEndDateFocus = function onEndDateFocus() {\n    var _this$props3 = this.props,\n        startDate = _this$props3.startDate,\n        onFocusChange = _this$props3.onFocusChange,\n        withFullScreenPortal = _this$props3.withFullScreenPortal,\n        disabled = _this$props3.disabled;\n\n    if (!startDate && withFullScreenPortal && (!disabled || disabled === _constants.END_DATE)) {\n      // When the datepicker is full screen, we never want to focus the end date first\n      // because there's no indication that that is the case once the datepicker is open and it\n      // might confuse the user\n      onFocusChange(_constants.START_DATE);\n    } else if (!disabled || disabled === _constants.START_DATE) {\n      onFocusChange(_constants.END_DATE);\n    }\n  };\n\n  _proto.onStartDateChange = function onStartDateChange(startDateString) {\n    var endDate = this.props.endDate;\n    var _this$props4 = this.props,\n        isOutsideRange = _this$props4.isOutsideRange,\n        minimumNights = _this$props4.minimumNights,\n        onDatesChange = _this$props4.onDatesChange,\n        onFocusChange = _this$props4.onFocusChange,\n        disabled = _this$props4.disabled;\n    var startDate = (0, _toMomentObject[\"default\"])(startDateString, this.getDisplayFormat());\n    var isEndDateBeforeStartDate = startDate && (0, _isBeforeDay[\"default\"])(endDate, startDate.clone().add(minimumNights, 'days'));\n    var isStartDateValid = startDate && !isOutsideRange(startDate) && !(disabled === _constants.END_DATE && isEndDateBeforeStartDate);\n\n    if (isStartDateValid) {\n      if (isEndDateBeforeStartDate) {\n        endDate = null;\n      }\n\n      onDatesChange({\n        startDate: startDate,\n        endDate: endDate\n      });\n      onFocusChange(_constants.END_DATE);\n    } else {\n      onDatesChange({\n        startDate: null,\n        endDate: endDate\n      });\n    }\n  };\n\n  _proto.onStartDateFocus = function onStartDateFocus() {\n    var _this$props5 = this.props,\n        disabled = _this$props5.disabled,\n        onFocusChange = _this$props5.onFocusChange;\n\n    if (!disabled || disabled === _constants.END_DATE) {\n      onFocusChange(_constants.START_DATE);\n    }\n  };\n\n  _proto.getDisplayFormat = function getDisplayFormat() {\n    var displayFormat = this.props.displayFormat;\n    return typeof displayFormat === 'string' ? displayFormat : displayFormat();\n  };\n\n  _proto.getDateString = function getDateString(date) {\n    var displayFormat = this.getDisplayFormat();\n\n    if (date && displayFormat) {\n      return date && date.format(displayFormat);\n    }\n\n    return (0, _toLocalizedDateString[\"default\"])(date);\n  };\n\n  _proto.clearDates = function clearDates() {\n    var _this$props6 = this.props,\n        onDatesChange = _this$props6.onDatesChange,\n        reopenPickerOnClearDates = _this$props6.reopenPickerOnClearDates,\n        onFocusChange = _this$props6.onFocusChange;\n    onDatesChange({\n      startDate: null,\n      endDate: null\n    });\n\n    if (reopenPickerOnClearDates) {\n      onFocusChange(_constants.START_DATE);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props7 = this.props,\n        children = _this$props7.children,\n        startDate = _this$props7.startDate,\n        startDateId = _this$props7.startDateId,\n        startDatePlaceholderText = _this$props7.startDatePlaceholderText,\n        isStartDateFocused = _this$props7.isStartDateFocused,\n        startDateAriaLabel = _this$props7.startDateAriaLabel,\n        endDate = _this$props7.endDate,\n        endDateId = _this$props7.endDateId,\n        endDatePlaceholderText = _this$props7.endDatePlaceholderText,\n        endDateAriaLabel = _this$props7.endDateAriaLabel,\n        isEndDateFocused = _this$props7.isEndDateFocused,\n        screenReaderMessage = _this$props7.screenReaderMessage,\n        showClearDates = _this$props7.showClearDates,\n        showCaret = _this$props7.showCaret,\n        showDefaultInputIcon = _this$props7.showDefaultInputIcon,\n        inputIconPosition = _this$props7.inputIconPosition,\n        customInputIcon = _this$props7.customInputIcon,\n        customArrowIcon = _this$props7.customArrowIcon,\n        customCloseIcon = _this$props7.customCloseIcon,\n        disabled = _this$props7.disabled,\n        required = _this$props7.required,\n        readOnly = _this$props7.readOnly,\n        openDirection = _this$props7.openDirection,\n        isFocused = _this$props7.isFocused,\n        phrases = _this$props7.phrases,\n        onKeyDownArrowDown = _this$props7.onKeyDownArrowDown,\n        onKeyDownQuestionMark = _this$props7.onKeyDownQuestionMark,\n        isRTL = _this$props7.isRTL,\n        noBorder = _this$props7.noBorder,\n        block = _this$props7.block,\n        small = _this$props7.small,\n        regular = _this$props7.regular,\n        verticalSpacing = _this$props7.verticalSpacing;\n    var startDateString = this.getDateString(startDate);\n    var endDateString = this.getDateString(endDate);\n    return _react[\"default\"].createElement(_DateRangePickerInput[\"default\"], {\n      startDate: startDateString,\n      startDateId: startDateId,\n      startDatePlaceholderText: startDatePlaceholderText,\n      isStartDateFocused: isStartDateFocused,\n      startDateAriaLabel: startDateAriaLabel,\n      endDate: endDateString,\n      endDateId: endDateId,\n      endDatePlaceholderText: endDatePlaceholderText,\n      isEndDateFocused: isEndDateFocused,\n      endDateAriaLabel: endDateAriaLabel,\n      isFocused: isFocused,\n      disabled: disabled,\n      required: required,\n      readOnly: readOnly,\n      openDirection: openDirection,\n      showCaret: showCaret,\n      showDefaultInputIcon: showDefaultInputIcon,\n      inputIconPosition: inputIconPosition,\n      customInputIcon: customInputIcon,\n      customArrowIcon: customArrowIcon,\n      customCloseIcon: customCloseIcon,\n      phrases: phrases,\n      onStartDateChange: this.onStartDateChange,\n      onStartDateFocus: this.onStartDateFocus,\n      onStartDateShiftTab: this.onClearFocus,\n      onEndDateChange: this.onEndDateChange,\n      onEndDateFocus: this.onEndDateFocus,\n      showClearDates: showClearDates,\n      onClearDates: this.clearDates,\n      screenReaderMessage: screenReaderMessage,\n      onKeyDownArrowDown: onKeyDownArrowDown,\n      onKeyDownQuestionMark: onKeyDownQuestionMark,\n      isRTL: isRTL,\n      noBorder: noBorder,\n      block: block,\n      small: small,\n      regular: regular,\n      verticalSpacing: verticalSpacing\n    }, children);\n  };\n\n  return DateRangePickerInputController;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports[\"default\"] = DateRangePickerInputController;\nDateRangePickerInputController.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDateRangePickerInputController.defaultProps = defaultProps;", "function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nmodule.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nmodule.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(r, e) {\n  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isNextDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"./isSameDay\"));\n\nfunction isNextDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  var nextDay = (0, _moment[\"default\"])(a).add(1, 'day');\n  return (0, _isSameDay[\"default\"])(nextDay, b);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isAfterDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isBeforeDay = _interopRequireDefault(require(\"./isBeforeDay\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"./isSameDay\"));\n\nfunction isAfterDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  return !(0, _isBeforeDay[\"default\"])(a, b) && !(0, _isSameDay[\"default\"])(a, b);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isPreviousDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"./isSameDay\"));\n\nfunction isPreviousDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  var dayBefore = (0, _moment[\"default\"])(a).subtract(1, 'day');\n  return (0, _isSameDay[\"default\"])(dayBefore, b);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getVisibleDays;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _toISOMonthString = _interopRequireDefault(require(\"./toISOMonthString\"));\n\nfunction getVisibleDays(month, numberOfMonths, enableOutsideDays, withoutTransitionMonths) {\n  if (!_moment[\"default\"].isMoment(month)) return {};\n  var visibleDaysByMonth = {};\n  var currentMonth = withoutTransitionMonths ? month.clone() : month.clone().subtract(1, 'month');\n\n  for (var i = 0; i < (withoutTransitionMonths ? numberOfMonths : numberOfMonths + 2); i += 1) {\n    var visibleDays = []; // set utc offset to get correct dates in future (when timezone changes)\n\n    var baseDate = currentMonth.clone();\n    var firstOfMonth = baseDate.clone().startOf('month').hour(12);\n    var lastOfMonth = baseDate.clone().endOf('month').hour(12);\n    var currentDay = firstOfMonth.clone(); // days belonging to the previous month\n\n    if (enableOutsideDays) {\n      for (var j = 0; j < currentDay.weekday(); j += 1) {\n        var prevDay = currentDay.clone().subtract(j + 1, 'day');\n        visibleDays.unshift(prevDay);\n      }\n    }\n\n    while (currentDay < lastOfMonth) {\n      visibleDays.push(currentDay.clone());\n      currentDay.add(1, 'day');\n    }\n\n    if (enableOutsideDays) {\n      // weekday() returns the index of the day of the week according to the locale\n      // this means if the week starts on Monday, weekday() will return 0 for a Monday date, not 1\n      if (currentDay.weekday() !== 0) {\n        // days belonging to the next month\n        for (var k = currentDay.weekday(), count = 0; k < 7; k += 1, count += 1) {\n          var nextDay = currentDay.clone().add(count, 'day');\n          visibleDays.push(nextDay);\n        }\n      }\n    }\n\n    visibleDaysByMonth[(0, _toISOMonthString[\"default\"])(currentMonth)] = visibleDays;\n    currentMonth = currentMonth.clone().add(1, 'month');\n  }\n\n  return visibleDaysByMonth;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isDayVisible;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isBeforeDay = _interopRequireDefault(require(\"./isBeforeDay\"));\n\nvar _isAfterDay = _interopRequireDefault(require(\"./isAfterDay\"));\n\nvar _toISOMonthString = _interopRequireDefault(require(\"./toISOMonthString\"));\n\nvar startCacheOutsideDays = new Map();\nvar endCacheOutsideDays = new Map();\nvar startCacheInsideDays = new Map();\nvar endCacheInsideDays = new Map();\n\nfunction isDayVisible(day, month, numberOfMonths, enableOutsideDays) {\n  if (!_moment[\"default\"].isMoment(day)) return false; // Cloning is a little expensive, so we want to do it as little as possible.\n\n  var startKey = (0, _toISOMonthString[\"default\"])(month); // eslint-disable-next-line prefer-template\n\n  var endKey = startKey + '+' + numberOfMonths;\n\n  if (enableOutsideDays) {\n    if (!startCacheOutsideDays.has(startKey)) {\n      startCacheOutsideDays.set(startKey, month.clone().startOf('month').startOf('week'));\n    }\n\n    if ((0, _isBeforeDay[\"default\"])(day, startCacheOutsideDays.get(startKey))) return false;\n\n    if (!endCacheOutsideDays.has(endKey)) {\n      endCacheOutsideDays.set(endKey, month.clone().endOf('week').add(numberOfMonths - 1, 'months').endOf('month').endOf('week'));\n    }\n\n    return !(0, _isAfterDay[\"default\"])(day, endCacheOutsideDays.get(endKey));\n  } // !enableOutsideDays\n\n\n  if (!startCacheInsideDays.has(startKey)) {\n    startCacheInsideDays.set(startKey, month.clone().startOf('month'));\n  }\n\n  if ((0, _isBeforeDay[\"default\"])(day, startCacheInsideDays.get(startKey))) return false;\n\n  if (!endCacheInsideDays.has(endKey)) {\n    endCacheInsideDays.set(endKey, month.clone().add(numberOfMonths - 1, 'months').endOf('month'));\n  }\n\n  return !(0, _isAfterDay[\"default\"])(day, endCacheInsideDays.get(endKey));\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getSelectedDateOffset;\n\nvar defaultModifier = function defaultModifier(day) {\n  return day;\n};\n\nfunction getSelectedDateOffset(fn, day) {\n  var modifier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultModifier;\n  if (!fn) return day;\n  return modifier(fn(day.clone()));\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getPreviousMonthMemoLast;\nvar getPreviousMonthMemoKey;\nvar getPreviousMonthMemoValue;\n\nfunction getPreviousMonthMemoLast(month) {\n  if (month !== getPreviousMonthMemoKey) {\n    getPreviousMonthMemoKey = month;\n    getPreviousMonthMemoValue = month.clone().subtract(1, 'month');\n  }\n\n  return getPreviousMonthMemoValue;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.addModifier = addModifier;\nexports.deleteModifier = deleteModifier;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _isDayVisible = _interopRequireDefault(require(\"./isDayVisible\"));\n\nvar _toISODateString = _interopRequireDefault(require(\"./toISODateString\"));\n\nvar _toISOMonthString = _interopRequireDefault(require(\"./toISOMonthString\"));\n\nvar _getPreviousMonthMemoLast = _interopRequireDefault(require(\"./getPreviousMonthMemoLast\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction addModifier(updatedDays, day, modifier, props, state) {\n  var numberOfVisibleMonths = props.numberOfMonths,\n      enableOutsideDays = props.enableOutsideDays,\n      orientation = props.orientation;\n  var firstVisibleMonth = state.currentMonth,\n      visibleDays = state.visibleDays;\n  var currentMonth = firstVisibleMonth;\n  var numberOfMonths = numberOfVisibleMonths;\n\n  if (orientation === _constants.VERTICAL_SCROLLABLE) {\n    numberOfMonths = Object.keys(visibleDays).length;\n  } else {\n    currentMonth = (0, _getPreviousMonthMemoLast[\"default\"])(currentMonth);\n    numberOfMonths += 2;\n  }\n\n  if (!day || !(0, _isDayVisible[\"default\"])(day, currentMonth, numberOfMonths, enableOutsideDays)) {\n    return updatedDays;\n  }\n\n  var iso = (0, _toISODateString[\"default\"])(day);\n\n  var updatedDaysAfterAddition = _objectSpread({}, updatedDays);\n\n  if (enableOutsideDays) {\n    var monthsToUpdate = Object.keys(visibleDays).filter(function (monthKey) {\n      return Object.keys(visibleDays[monthKey]).indexOf(iso) > -1;\n    });\n    updatedDaysAfterAddition = monthsToUpdate.reduce(function (acc, monthIso) {\n      var month = updatedDays[monthIso] || visibleDays[monthIso];\n\n      if (!month[iso] || !month[iso].has(modifier)) {\n        var modifiers = new Set(month[iso]);\n        modifiers.add(modifier);\n        acc[monthIso] = _objectSpread({}, month, (0, _defineProperty2[\"default\"])({}, iso, modifiers));\n      }\n\n      return acc;\n    }, updatedDaysAfterAddition);\n  } else {\n    var monthIso = (0, _toISOMonthString[\"default\"])(day);\n    var month = updatedDays[monthIso] || visibleDays[monthIso] || {};\n\n    if (!month[iso] || !month[iso].has(modifier)) {\n      var modifiers = new Set(month[iso]);\n      modifiers.add(modifier);\n      updatedDaysAfterAddition[monthIso] = _objectSpread({}, month, (0, _defineProperty2[\"default\"])({}, iso, modifiers));\n    }\n  }\n\n  return updatedDaysAfterAddition;\n}\n\nfunction deleteModifier(updatedDays, day, modifier, props, state) {\n  var numberOfVisibleMonths = props.numberOfMonths,\n      enableOutsideDays = props.enableOutsideDays,\n      orientation = props.orientation;\n  var firstVisibleMonth = state.currentMonth,\n      visibleDays = state.visibleDays;\n  var currentMonth = firstVisibleMonth;\n  var numberOfMonths = numberOfVisibleMonths;\n\n  if (orientation === _constants.VERTICAL_SCROLLABLE) {\n    numberOfMonths = Object.keys(visibleDays).length;\n  } else {\n    currentMonth = (0, _getPreviousMonthMemoLast[\"default\"])(currentMonth);\n    numberOfMonths += 2;\n  }\n\n  if (!day || !(0, _isDayVisible[\"default\"])(day, currentMonth, numberOfMonths, enableOutsideDays)) {\n    return updatedDays;\n  }\n\n  var iso = (0, _toISODateString[\"default\"])(day);\n\n  var updatedDaysAfterDeletion = _objectSpread({}, updatedDays);\n\n  if (enableOutsideDays) {\n    var monthsToUpdate = Object.keys(visibleDays).filter(function (monthKey) {\n      return Object.keys(visibleDays[monthKey]).indexOf(iso) > -1;\n    });\n    updatedDaysAfterDeletion = monthsToUpdate.reduce(function (acc, monthIso) {\n      var month = updatedDays[monthIso] || visibleDays[monthIso];\n\n      if (month[iso] && month[iso].has(modifier)) {\n        var modifiers = new Set(month[iso]);\n        modifiers[\"delete\"](modifier);\n        acc[monthIso] = _objectSpread({}, month, (0, _defineProperty2[\"default\"])({}, iso, modifiers));\n      }\n\n      return acc;\n    }, updatedDaysAfterDeletion);\n  } else {\n    var monthIso = (0, _toISOMonthString[\"default\"])(day);\n    var month = updatedDays[monthIso] || visibleDays[monthIso] || {};\n\n    if (month[iso] && month[iso].has(modifier)) {\n      var modifiers = new Set(month[iso]);\n      modifiers[\"delete\"](modifier);\n      updatedDaysAfterDeletion[monthIso] = _objectSpread({}, month, (0, _defineProperty2[\"default\"])({}, iso, modifiers));\n    }\n  }\n\n  return updatedDaysAfterDeletion;\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar ChevronUp = function ChevronUp(props) {\n  return _react[\"default\"].createElement(\"svg\", props, _react[\"default\"].createElement(\"path\", {\n    d: \"M32 713l453-453c11-11 21-11 32 0l453 453c5 5 7 10 7 16 0 13-10 23-22 23-7 0-12-2-16-7L501 309 64 745c-4 5-9 7-15 7-7 0-12-2-17-7-9-11-9-21 0-32z\"\n  }));\n};\n\nChevronUp.defaultProps = {\n  focusable: \"false\",\n  viewBox: \"0 0 1000 1000\"\n};\nvar _default = ChevronUp;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar ChevronDown = function ChevronDown(props) {\n  return _react[\"default\"].createElement(\"svg\", props, _react[\"default\"].createElement(\"path\", {\n    d: \"M968 289L514 741c-11 11-21 11-32 0L29 289c-4-5-6-11-6-16 0-13 10-23 23-23 6 0 11 2 15 7l437 436 438-436c4-5 9-7 16-7 6 0 11 2 16 7 9 10 9 21 0 32z\"\n  }));\n};\n\nChevronDown.defaultProps = {\n  focusable: \"false\",\n  viewBox: \"0 0 1000 1000\"\n};\nvar _default = ChevronDown;\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _LeftArrow = _interopRequireDefault(require(\"./LeftArrow\"));\n\nvar _RightArrow = _interopRequireDefault(require(\"./RightArrow\"));\n\nvar _ChevronUp = _interopRequireDefault(require(\"./ChevronUp\"));\n\nvar _ChevronDown = _interopRequireDefault(require(\"./ChevronDown\"));\n\nvar _NavPositionShape = _interopRequireDefault(require(\"../shapes/NavPositionShape\"));\n\nvar _ScrollableOrientationShape = _interopRequireDefault(require(\"../shapes/ScrollableOrientationShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  disablePrev: _propTypes[\"default\"].bool,\n  disableNext: _propTypes[\"default\"].bool,\n  inlineStyles: _propTypes[\"default\"].object,\n  isRTL: _propTypes[\"default\"].bool,\n  navPosition: _NavPositionShape[\"default\"],\n  navPrev: _propTypes[\"default\"].node,\n  navNext: _propTypes[\"default\"].node,\n  orientation: _ScrollableOrientationShape[\"default\"],\n  onPrevMonthClick: _propTypes[\"default\"].func,\n  onNextMonthClick: _propTypes[\"default\"].func,\n  // internationalization\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DayPickerNavigationPhrases)),\n  renderNavPrevButton: _propTypes[\"default\"].func,\n  renderNavNextButton: _propTypes[\"default\"].func,\n  showNavPrevButton: _propTypes[\"default\"].bool,\n  showNavNextButton: _propTypes[\"default\"].bool\n})) : {};\nvar defaultProps = {\n  disablePrev: false,\n  disableNext: false,\n  inlineStyles: null,\n  isRTL: false,\n  navPosition: _constants.NAV_POSITION_TOP,\n  navPrev: null,\n  navNext: null,\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  onPrevMonthClick: function onPrevMonthClick() {},\n  onNextMonthClick: function onNextMonthClick() {},\n  // internationalization\n  phrases: _defaultPhrases.DayPickerNavigationPhrases,\n  renderNavPrevButton: null,\n  renderNavNextButton: null,\n  showNavPrevButton: true,\n  showNavNextButton: true\n};\n\nvar DayPickerNavigation =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DayPickerNavigation, _ref);\n\n  function DayPickerNavigation() {\n    return _ref.apply(this, arguments) || this;\n  }\n\n  var _proto = DayPickerNavigation.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        inlineStyles = _this$props.inlineStyles,\n        isRTL = _this$props.isRTL,\n        disablePrev = _this$props.disablePrev,\n        disableNext = _this$props.disableNext,\n        navPosition = _this$props.navPosition,\n        navPrev = _this$props.navPrev,\n        navNext = _this$props.navNext,\n        onPrevMonthClick = _this$props.onPrevMonthClick,\n        onNextMonthClick = _this$props.onNextMonthClick,\n        orientation = _this$props.orientation,\n        phrases = _this$props.phrases,\n        renderNavPrevButton = _this$props.renderNavPrevButton,\n        renderNavNextButton = _this$props.renderNavNextButton,\n        showNavPrevButton = _this$props.showNavPrevButton,\n        showNavNextButton = _this$props.showNavNextButton,\n        styles = _this$props.styles;\n\n    if (!showNavNextButton && !showNavPrevButton) {\n      return null;\n    }\n\n    var isHorizontal = orientation === _constants.HORIZONTAL_ORIENTATION;\n    var isVertical = orientation !== _constants.HORIZONTAL_ORIENTATION;\n    var isVerticalScrollable = orientation === _constants.VERTICAL_SCROLLABLE;\n    var isBottomNavPosition = navPosition === _constants.NAV_POSITION_BOTTOM;\n    var hasInlineStyles = !!inlineStyles;\n    var navPrevIcon = navPrev;\n    var navNextIcon = navNext;\n    var isDefaultNavPrev = false;\n    var isDefaultNavNext = false;\n    var navPrevTabIndex = {};\n    var navNextTabIndex = {};\n\n    if (!navPrevIcon && !renderNavPrevButton && showNavPrevButton) {\n      navPrevTabIndex = {\n        tabIndex: '0'\n      };\n      isDefaultNavPrev = true;\n      var Icon = isVertical ? _ChevronUp[\"default\"] : _LeftArrow[\"default\"];\n\n      if (isRTL && !isVertical) {\n        Icon = _RightArrow[\"default\"];\n      }\n\n      navPrevIcon = _react[\"default\"].createElement(Icon, (0, _reactWithStyles.css)(isHorizontal && styles.DayPickerNavigation_svg__horizontal, isVertical && styles.DayPickerNavigation_svg__vertical, disablePrev && styles.DayPickerNavigation_svg__disabled));\n    }\n\n    if (!navNextIcon && !renderNavNextButton && showNavNextButton) {\n      navNextTabIndex = {\n        tabIndex: '0'\n      };\n      isDefaultNavNext = true;\n\n      var _Icon = isVertical ? _ChevronDown[\"default\"] : _RightArrow[\"default\"];\n\n      if (isRTL && !isVertical) {\n        _Icon = _LeftArrow[\"default\"];\n      }\n\n      navNextIcon = _react[\"default\"].createElement(_Icon, (0, _reactWithStyles.css)(isHorizontal && styles.DayPickerNavigation_svg__horizontal, isVertical && styles.DayPickerNavigation_svg__vertical, disableNext && styles.DayPickerNavigation_svg__disabled));\n    }\n\n    var isDefaultNav = isDefaultNavNext || isDefaultNavPrev;\n    return _react[\"default\"].createElement(\"div\", _reactWithStyles.css.apply(void 0, [styles.DayPickerNavigation, isHorizontal && styles.DayPickerNavigation__horizontal].concat((0, _toConsumableArray2[\"default\"])(isVertical ? [styles.DayPickerNavigation__vertical, isDefaultNav && styles.DayPickerNavigation__verticalDefault] : []), (0, _toConsumableArray2[\"default\"])(isVerticalScrollable ? [styles.DayPickerNavigation__verticalScrollable, isDefaultNav && styles.DayPickerNavigation__verticalScrollableDefault, showNavPrevButton && styles.DayPickerNavigation__verticalScrollable_prevNav] : []), (0, _toConsumableArray2[\"default\"])(isBottomNavPosition ? [styles.DayPickerNavigation__bottom, isDefaultNav && styles.DayPickerNavigation__bottomDefault] : []), [hasInlineStyles && inlineStyles])), showNavPrevButton && (renderNavPrevButton ? renderNavPrevButton({\n      ariaLabel: phrases.jumpToPrevMonth,\n      disabled: disablePrev,\n      onClick: disablePrev ? undefined : onPrevMonthClick,\n      onKeyUp: disablePrev ? undefined : function (e) {\n        var key = e.key;\n\n        if (key === 'Enter' || key === ' ') {\n          onPrevMonthClick(e);\n        }\n      },\n      onMouseUp: disablePrev ? undefined : function (e) {\n        e.currentTarget.blur();\n      }\n    }) : _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      // eslint-disable-line jsx-a11y/interactive-supports-focus\n      role: \"button\"\n    }, navPrevTabIndex, _reactWithStyles.css.apply(void 0, [styles.DayPickerNavigation_button, isDefaultNavPrev && styles.DayPickerNavigation_button__default, disablePrev && styles.DayPickerNavigation_button__disabled].concat((0, _toConsumableArray2[\"default\"])(isHorizontal ? [styles.DayPickerNavigation_button__horizontal].concat((0, _toConsumableArray2[\"default\"])(isDefaultNavPrev ? [styles.DayPickerNavigation_button__horizontalDefault, isBottomNavPosition && styles.DayPickerNavigation_bottomButton__horizontalDefault, !isRTL && styles.DayPickerNavigation_leftButton__horizontalDefault, isRTL && styles.DayPickerNavigation_rightButton__horizontalDefault] : [])) : []), (0, _toConsumableArray2[\"default\"])(isVertical ? [styles.DayPickerNavigation_button__vertical].concat((0, _toConsumableArray2[\"default\"])(isDefaultNavPrev ? [styles.DayPickerNavigation_button__verticalDefault, styles.DayPickerNavigation_prevButton__verticalDefault, isVerticalScrollable && styles.DayPickerNavigation_prevButton__verticalScrollableDefault] : [])) : []))), {\n      \"aria-disabled\": disablePrev ? true : undefined,\n      \"aria-label\": phrases.jumpToPrevMonth,\n      onClick: disablePrev ? undefined : onPrevMonthClick,\n      onKeyUp: disablePrev ? undefined : function (e) {\n        var key = e.key;\n\n        if (key === 'Enter' || key === ' ') {\n          onPrevMonthClick(e);\n        }\n      },\n      onMouseUp: disablePrev ? undefined : function (e) {\n        e.currentTarget.blur();\n      }\n    }), navPrevIcon)), showNavNextButton && (renderNavNextButton ? renderNavNextButton({\n      ariaLabel: phrases.jumpToNextMonth,\n      disabled: disableNext,\n      onClick: disableNext ? undefined : onNextMonthClick,\n      onKeyUp: disableNext ? undefined : function (e) {\n        var key = e.key;\n\n        if (key === 'Enter' || key === ' ') {\n          onNextMonthClick(e);\n        }\n      },\n      onMouseUp: disableNext ? undefined : function (e) {\n        e.currentTarget.blur();\n      }\n    }) : _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      // eslint-disable-line jsx-a11y/interactive-supports-focus\n      role: \"button\"\n    }, navNextTabIndex, _reactWithStyles.css.apply(void 0, [styles.DayPickerNavigation_button, isDefaultNavNext && styles.DayPickerNavigation_button__default, disableNext && styles.DayPickerNavigation_button__disabled].concat((0, _toConsumableArray2[\"default\"])(isHorizontal ? [styles.DayPickerNavigation_button__horizontal].concat((0, _toConsumableArray2[\"default\"])(isDefaultNavNext ? [styles.DayPickerNavigation_button__horizontalDefault, isBottomNavPosition && styles.DayPickerNavigation_bottomButton__horizontalDefault, isRTL && styles.DayPickerNavigation_leftButton__horizontalDefault, !isRTL && styles.DayPickerNavigation_rightButton__horizontalDefault] : [])) : []), (0, _toConsumableArray2[\"default\"])(isVertical ? [styles.DayPickerNavigation_button__vertical].concat((0, _toConsumableArray2[\"default\"])(isDefaultNavNext ? [styles.DayPickerNavigation_button__verticalDefault, styles.DayPickerNavigation_nextButton__verticalDefault, isVerticalScrollable && styles.DayPickerNavigation_nextButton__verticalScrollableDefault] : [])) : []))), {\n      \"aria-disabled\": disableNext ? true : undefined,\n      \"aria-label\": phrases.jumpToNextMonth,\n      onClick: disableNext ? undefined : onNextMonthClick,\n      onKeyUp: disableNext ? undefined : function (e) {\n        var key = e.key;\n\n        if (key === 'Enter' || key === ' ') {\n          onNextMonthClick(e);\n        }\n      },\n      onMouseUp: disableNext ? undefined : function (e) {\n        e.currentTarget.blur();\n      }\n    }), navNextIcon)));\n  };\n\n  return DayPickerNavigation;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nDayPickerNavigation.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDayPickerNavigation.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      color = _ref2$reactDates.color,\n      zIndex = _ref2$reactDates.zIndex;\n  return {\n    DayPickerNavigation: {\n      position: 'relative',\n      zIndex: zIndex + 2\n    },\n    DayPickerNavigation__horizontal: {\n      height: 0\n    },\n    DayPickerNavigation__vertical: {},\n    DayPickerNavigation__verticalScrollable: {},\n    DayPickerNavigation__verticalScrollable_prevNav: {\n      zIndex: zIndex + 1 // zIndex + 2 causes the button to show on top of the day of week headers\n\n    },\n    DayPickerNavigation__verticalDefault: {\n      position: 'absolute',\n      width: '100%',\n      height: 52,\n      bottom: 0,\n      left: (0, _noflip[\"default\"])(0)\n    },\n    DayPickerNavigation__verticalScrollableDefault: {\n      position: 'relative'\n    },\n    DayPickerNavigation__bottom: {\n      height: 'auto'\n    },\n    DayPickerNavigation__bottomDefault: {\n      display: 'flex',\n      justifyContent: 'space-between'\n    },\n    DayPickerNavigation_button: {\n      cursor: 'pointer',\n      userSelect: 'none',\n      border: 0,\n      padding: 0,\n      margin: 0\n    },\n    DayPickerNavigation_button__default: {\n      border: \"1px solid \".concat(color.core.borderLight),\n      backgroundColor: color.background,\n      color: color.placeholderText,\n      ':focus': {\n        border: \"1px solid \".concat(color.core.borderMedium)\n      },\n      ':hover': {\n        border: \"1px solid \".concat(color.core.borderMedium)\n      },\n      ':active': {\n        background: color.backgroundDark\n      }\n    },\n    DayPickerNavigation_button__disabled: {\n      cursor: 'default',\n      border: \"1px solid \".concat(color.disabled),\n      ':focus': {\n        border: \"1px solid \".concat(color.disabled)\n      },\n      ':hover': {\n        border: \"1px solid \".concat(color.disabled)\n      },\n      ':active': {\n        background: 'none'\n      }\n    },\n    DayPickerNavigation_button__horizontal: {},\n    DayPickerNavigation_button__horizontalDefault: {\n      position: 'absolute',\n      top: 18,\n      lineHeight: 0.78,\n      borderRadius: 3,\n      padding: '6px 9px'\n    },\n    DayPickerNavigation_bottomButton__horizontalDefault: {\n      position: 'static',\n      marginLeft: 22,\n      marginRight: 22,\n      marginBottom: 30,\n      marginTop: -10\n    },\n    DayPickerNavigation_leftButton__horizontalDefault: {\n      left: (0, _noflip[\"default\"])(22)\n    },\n    DayPickerNavigation_rightButton__horizontalDefault: {\n      right: (0, _noflip[\"default\"])(22)\n    },\n    DayPickerNavigation_button__vertical: {},\n    DayPickerNavigation_button__verticalDefault: {\n      padding: 5,\n      background: color.background,\n      boxShadow: (0, _noflip[\"default\"])('0 0 5px 2px rgba(0, 0, 0, 0.1)'),\n      position: 'relative',\n      display: 'inline-block',\n      textAlign: 'center',\n      height: '100%',\n      width: '50%'\n    },\n    DayPickerNavigation_prevButton__verticalDefault: {},\n    DayPickerNavigation_nextButton__verticalDefault: {\n      borderLeft: (0, _noflip[\"default\"])(0)\n    },\n    DayPickerNavigation_nextButton__verticalScrollableDefault: {\n      width: '100%'\n    },\n    DayPickerNavigation_prevButton__verticalScrollableDefault: {\n      width: '100%'\n    },\n    DayPickerNavigation_svg__horizontal: {\n      height: 19,\n      width: 19,\n      fill: color.core.grayLight,\n      display: 'block'\n    },\n    DayPickerNavigation_svg__vertical: {\n      height: 42,\n      width: 42,\n      fill: color.text\n    },\n    DayPickerNavigation_svg__disabled: {\n      fill: color.disabled\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(DayPickerNavigation);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  unicode: _propTypes[\"default\"].string.isRequired,\n  label: _propTypes[\"default\"].string.isRequired,\n  action: _propTypes[\"default\"].string.isRequired,\n  block: _propTypes[\"default\"].bool\n})) : {};\nvar defaultProps = {\n  block: false\n};\n\nfunction KeyboardShortcutRow(_ref) {\n  var unicode = _ref.unicode,\n      label = _ref.label,\n      action = _ref.action,\n      block = _ref.block,\n      styles = _ref.styles;\n  return _react[\"default\"].createElement(\"li\", (0, _reactWithStyles.css)(styles.KeyboardShortcutRow, block && styles.KeyboardShortcutRow__block), _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.KeyboardShortcutRow_keyContainer, block && styles.KeyboardShortcutRow_keyContainer__block), _react[\"default\"].createElement(\"span\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.KeyboardShortcutRow_key), {\n    role: \"img\",\n    \"aria-label\": \"\".concat(label, \",\") // add comma so screen readers will pause before reading action\n\n  }), unicode)), _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.KeyboardShortcutRow_action), action));\n}\n\nKeyboardShortcutRow.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nKeyboardShortcutRow.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var color = _ref2.reactDates.color;\n  return {\n    KeyboardShortcutRow: {\n      listStyle: 'none',\n      margin: '6px 0'\n    },\n    KeyboardShortcutRow__block: {\n      marginBottom: 16\n    },\n    KeyboardShortcutRow_keyContainer: {\n      display: 'inline-block',\n      whiteSpace: 'nowrap',\n      textAlign: 'right',\n      // is not handled by isRTL\n      marginRight: 6 // is not handled by isRTL\n\n    },\n    KeyboardShortcutRow_keyContainer__block: {\n      textAlign: 'left',\n      // is not handled by isRTL\n      display: 'inline'\n    },\n    KeyboardShortcutRow_key: {\n      fontFamily: 'monospace',\n      fontSize: 12,\n      textTransform: 'uppercase',\n      background: color.core.grayLightest,\n      padding: '2px 6px'\n    },\n    KeyboardShortcutRow_action: {\n      display: 'inline',\n      wordBreak: 'break-word',\n      marginLeft: 8 // is not handled by isRTL\n\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(KeyboardShortcutRow);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = exports.BOTTOM_RIGHT = exports.TOP_RIGHT = exports.TOP_LEFT = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _KeyboardShortcutRow = _interopRequireDefault(require(\"./KeyboardShortcutRow\"));\n\nvar _CloseButton = _interopRequireDefault(require(\"./CloseButton\"));\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar TOP_LEFT = 'top-left';\nexports.TOP_LEFT = TOP_LEFT;\nvar TOP_RIGHT = 'top-right';\nexports.TOP_RIGHT = TOP_RIGHT;\nvar BOTTOM_RIGHT = 'bottom-right';\nexports.BOTTOM_RIGHT = BOTTOM_RIGHT;\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  block: _propTypes[\"default\"].bool,\n  // TODO: rename button location to be direction-agnostic\n  buttonLocation: _propTypes[\"default\"].oneOf([TOP_LEFT, TOP_RIGHT, BOTTOM_RIGHT]),\n  showKeyboardShortcutsPanel: _propTypes[\"default\"].bool,\n  openKeyboardShortcutsPanel: _propTypes[\"default\"].func,\n  closeKeyboardShortcutsPanel: _propTypes[\"default\"].func,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DayPickerKeyboardShortcutsPhrases)),\n  renderKeyboardShortcutsButton: _propTypes[\"default\"].func,\n  renderKeyboardShortcutsPanel: _propTypes[\"default\"].func\n})) : {};\nvar defaultProps = {\n  block: false,\n  buttonLocation: BOTTOM_RIGHT,\n  showKeyboardShortcutsPanel: false,\n  openKeyboardShortcutsPanel: function openKeyboardShortcutsPanel() {},\n  closeKeyboardShortcutsPanel: function closeKeyboardShortcutsPanel() {},\n  phrases: _defaultPhrases.DayPickerKeyboardShortcutsPhrases,\n  renderKeyboardShortcutsButton: undefined,\n  renderKeyboardShortcutsPanel: undefined\n};\n\nfunction getKeyboardShortcuts(phrases) {\n  return [{\n    unicode: '\u21B5',\n    label: phrases.enterKey,\n    action: phrases.selectFocusedDate\n  }, {\n    unicode: '\u2190/\u2192',\n    label: phrases.leftArrowRightArrow,\n    action: phrases.moveFocusByOneDay\n  }, {\n    unicode: '\u2191/\u2193',\n    label: phrases.upArrowDownArrow,\n    action: phrases.moveFocusByOneWeek\n  }, {\n    unicode: 'PgUp/PgDn',\n    label: phrases.pageUpPageDown,\n    action: phrases.moveFocusByOneMonth\n  }, {\n    unicode: 'Home/End',\n    label: phrases.homeEnd,\n    action: phrases.moveFocustoStartAndEndOfWeek\n  }, {\n    unicode: 'Esc',\n    label: phrases.escape,\n    action: phrases.returnFocusToInput\n  }, {\n    unicode: '?',\n    label: phrases.questionMark,\n    action: phrases.openThisPanel\n  }];\n}\n\nvar DayPickerKeyboardShortcuts =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DayPickerKeyboardShortcuts, _ref);\n  var _proto = DayPickerKeyboardShortcuts.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DayPickerKeyboardShortcuts() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _ref.call.apply(_ref, [this].concat(args)) || this;\n    var phrases = _this.props.phrases;\n    _this.keyboardShortcuts = getKeyboardShortcuts(phrases);\n    _this.onShowKeyboardShortcutsButtonClick = _this.onShowKeyboardShortcutsButtonClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setShowKeyboardShortcutsButtonRef = _this.setShowKeyboardShortcutsButtonRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setHideKeyboardShortcutsButtonRef = _this.setHideKeyboardShortcutsButtonRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.handleFocus = _this.handleFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onKeyDown = _this.onKeyDown.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var phrases = this.props.phrases;\n\n    if (nextProps.phrases !== phrases) {\n      this.keyboardShortcuts = getKeyboardShortcuts(nextProps.phrases);\n    }\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate() {\n    this.handleFocus();\n  };\n\n  _proto.onKeyDown = function onKeyDown(e) {\n    e.stopPropagation();\n    var closeKeyboardShortcutsPanel = this.props.closeKeyboardShortcutsPanel; // Because the close button is the only focusable element inside of the panel, this\n    // amounts to a very basic focus trap. The user can exit the panel by \"pressing\" the\n    // close button or hitting escape\n\n    switch (e.key) {\n      case 'Escape':\n        closeKeyboardShortcutsPanel();\n        break;\n      // do nothing - this allows the up and down arrows continue their\n      // default behavior of scrolling the content of the Keyboard Shortcuts Panel\n      // which is needed when only a single month is shown for instance.\n\n      case 'ArrowUp':\n      case 'ArrowDown':\n        break;\n      // completely block the rest of the keys that have functionality outside of this panel\n\n      case 'Tab':\n      case 'Home':\n      case 'End':\n      case 'PageUp':\n      case 'PageDown':\n      case 'ArrowLeft':\n      case 'ArrowRight':\n        e.preventDefault();\n        break;\n\n      default:\n        break;\n    }\n  };\n\n  _proto.onShowKeyboardShortcutsButtonClick = function onShowKeyboardShortcutsButtonClick() {\n    var _this2 = this;\n\n    var openKeyboardShortcutsPanel = this.props.openKeyboardShortcutsPanel; // we want to return focus to this button after closing the keyboard shortcuts panel\n\n    openKeyboardShortcutsPanel(function () {\n      _this2.showKeyboardShortcutsButton.focus();\n    });\n  };\n\n  _proto.setShowKeyboardShortcutsButtonRef = function setShowKeyboardShortcutsButtonRef(ref) {\n    this.showKeyboardShortcutsButton = ref;\n  };\n\n  _proto.setHideKeyboardShortcutsButtonRef = function setHideKeyboardShortcutsButtonRef(ref) {\n    this.hideKeyboardShortcutsButton = ref;\n  };\n\n  _proto.handleFocus = function handleFocus() {\n    if (this.hideKeyboardShortcutsButton) {\n      // automatically move focus into the dialog by moving\n      // to the only interactive element, the hide button\n      this.hideKeyboardShortcutsButton.focus();\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        block = _this$props.block,\n        buttonLocation = _this$props.buttonLocation,\n        showKeyboardShortcutsPanel = _this$props.showKeyboardShortcutsPanel,\n        closeKeyboardShortcutsPanel = _this$props.closeKeyboardShortcutsPanel,\n        styles = _this$props.styles,\n        phrases = _this$props.phrases,\n        renderKeyboardShortcutsButton = _this$props.renderKeyboardShortcutsButton,\n        renderKeyboardShortcutsPanel = _this$props.renderKeyboardShortcutsPanel;\n    var toggleButtonText = showKeyboardShortcutsPanel ? phrases.hideKeyboardShortcutsPanel : phrases.showKeyboardShortcutsPanel;\n    var bottomRight = buttonLocation === BOTTOM_RIGHT;\n    var topRight = buttonLocation === TOP_RIGHT;\n    var topLeft = buttonLocation === TOP_LEFT;\n    return _react[\"default\"].createElement(\"div\", null, renderKeyboardShortcutsButton && renderKeyboardShortcutsButton({\n      // passing in context-specific props\n      ref: this.setShowKeyboardShortcutsButtonRef,\n      onClick: this.onShowKeyboardShortcutsButtonClick,\n      ariaLabel: toggleButtonText\n    }), !renderKeyboardShortcutsButton && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({\n      ref: this.setShowKeyboardShortcutsButtonRef\n    }, (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_buttonReset, styles.DayPickerKeyboardShortcuts_show, bottomRight && styles.DayPickerKeyboardShortcuts_show__bottomRight, topRight && styles.DayPickerKeyboardShortcuts_show__topRight, topLeft && styles.DayPickerKeyboardShortcuts_show__topLeft), {\n      type: \"button\",\n      \"aria-label\": toggleButtonText,\n      onClick: this.onShowKeyboardShortcutsButtonClick,\n      onMouseUp: function onMouseUp(e) {\n        e.currentTarget.blur();\n      }\n    }), _react[\"default\"].createElement(\"span\", (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_showSpan, bottomRight && styles.DayPickerKeyboardShortcuts_showSpan__bottomRight, topRight && styles.DayPickerKeyboardShortcuts_showSpan__topRight, topLeft && styles.DayPickerKeyboardShortcuts_showSpan__topLeft), \"?\")), showKeyboardShortcutsPanel && (renderKeyboardShortcutsPanel ? renderKeyboardShortcutsPanel({\n      closeButtonAriaLabel: phrases.hideKeyboardShortcutsPanel,\n      keyboardShortcuts: this.keyboardShortcuts,\n      onCloseButtonClick: closeKeyboardShortcutsPanel,\n      onKeyDown: this.onKeyDown,\n      title: phrases.keyboardShortcuts\n    }) : _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_panel), {\n      role: \"dialog\",\n      \"aria-labelledby\": \"DayPickerKeyboardShortcuts_title\",\n      \"aria-describedby\": \"DayPickerKeyboardShortcuts_description\"\n    }), _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_title), {\n      id: \"DayPickerKeyboardShortcuts_title\"\n    }), phrases.keyboardShortcuts), _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({\n      ref: this.setHideKeyboardShortcutsButtonRef\n    }, (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_buttonReset, styles.DayPickerKeyboardShortcuts_close), {\n      type: \"button\",\n      tabIndex: \"0\",\n      \"aria-label\": phrases.hideKeyboardShortcutsPanel,\n      onClick: closeKeyboardShortcutsPanel,\n      onKeyDown: this.onKeyDown\n    }), _react[\"default\"].createElement(_CloseButton[\"default\"], (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_closeSvg))), _react[\"default\"].createElement(\"ul\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPickerKeyboardShortcuts_list), {\n      id: \"DayPickerKeyboardShortcuts_description\"\n    }), this.keyboardShortcuts.map(function (_ref2) {\n      var unicode = _ref2.unicode,\n          label = _ref2.label,\n          action = _ref2.action;\n      return _react[\"default\"].createElement(_KeyboardShortcutRow[\"default\"], {\n        key: label,\n        unicode: unicode,\n        label: label,\n        action: action,\n        block: block\n      });\n    })))));\n  };\n\n  return DayPickerKeyboardShortcuts;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nDayPickerKeyboardShortcuts.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDayPickerKeyboardShortcuts.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref3) {\n  var _ref3$reactDates = _ref3.reactDates,\n      color = _ref3$reactDates.color,\n      font = _ref3$reactDates.font,\n      zIndex = _ref3$reactDates.zIndex;\n  return {\n    DayPickerKeyboardShortcuts_buttonReset: {\n      background: 'none',\n      border: 0,\n      borderRadius: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      padding: 0,\n      cursor: 'pointer',\n      fontSize: font.size,\n      ':active': {\n        outline: 'none'\n      }\n    },\n    DayPickerKeyboardShortcuts_show: {\n      width: 33,\n      height: 26,\n      position: 'absolute',\n      zIndex: zIndex + 2,\n      '::before': {\n        content: '\"\"',\n        display: 'block',\n        position: 'absolute'\n      }\n    },\n    DayPickerKeyboardShortcuts_show__bottomRight: {\n      bottom: 0,\n      right: 0,\n      '::before': {\n        borderTop: '26px solid transparent',\n        borderRight: \"33px solid \".concat(color.core.primary),\n        bottom: 0,\n        right: 0\n      },\n      ':hover::before': {\n        borderRight: \"33px solid \".concat(color.core.primary_dark)\n      }\n    },\n    DayPickerKeyboardShortcuts_show__topRight: {\n      top: 0,\n      right: 0,\n      '::before': {\n        borderBottom: '26px solid transparent',\n        borderRight: \"33px solid \".concat(color.core.primary),\n        top: 0,\n        right: 0\n      },\n      ':hover::before': {\n        borderRight: \"33px solid \".concat(color.core.primary_dark)\n      }\n    },\n    DayPickerKeyboardShortcuts_show__topLeft: {\n      top: 0,\n      left: 0,\n      '::before': {\n        borderBottom: '26px solid transparent',\n        borderLeft: \"33px solid \".concat(color.core.primary),\n        top: 0,\n        left: 0\n      },\n      ':hover::before': {\n        borderLeft: \"33px solid \".concat(color.core.primary_dark)\n      }\n    },\n    DayPickerKeyboardShortcuts_showSpan: {\n      color: color.core.white,\n      position: 'absolute'\n    },\n    DayPickerKeyboardShortcuts_showSpan__bottomRight: {\n      bottom: 0,\n      right: 5\n    },\n    DayPickerKeyboardShortcuts_showSpan__topRight: {\n      top: 1,\n      right: 5\n    },\n    DayPickerKeyboardShortcuts_showSpan__topLeft: {\n      top: 1,\n      left: 5\n    },\n    DayPickerKeyboardShortcuts_panel: {\n      overflow: 'auto',\n      background: color.background,\n      border: \"1px solid \".concat(color.core.border),\n      borderRadius: 2,\n      position: 'absolute',\n      top: 0,\n      bottom: 0,\n      right: 0,\n      left: 0,\n      zIndex: zIndex + 2,\n      padding: 22,\n      margin: 33,\n      textAlign: 'left' // TODO: investigate use of text-align throughout the library\n\n    },\n    DayPickerKeyboardShortcuts_title: {\n      fontSize: 16,\n      fontWeight: 'bold',\n      margin: 0\n    },\n    DayPickerKeyboardShortcuts_list: {\n      listStyle: 'none',\n      padding: 0,\n      fontSize: font.size\n    },\n    DayPickerKeyboardShortcuts_close: {\n      position: 'absolute',\n      right: 22,\n      top: 22,\n      zIndex: zIndex + 2,\n      ':active': {\n        outline: 'none'\n      }\n    },\n    DayPickerKeyboardShortcuts_closeSvg: {\n      height: 15,\n      width: 15,\n      fill: color.core.grayLighter,\n      ':hover': {\n        fill: color.core.grayLight\n      },\n      ':focus': {\n        fill: color.core.grayLight\n      }\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(DayPickerKeyboardShortcuts);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getNumberOfCalendarMonthWeeks;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nfunction getBlankDaysBeforeFirstDay(firstDayOfMonth, firstDayOfWeek) {\n  var weekDayDiff = firstDayOfMonth.day() - firstDayOfWeek;\n  return (weekDayDiff + 7) % 7;\n}\n\nfunction getNumberOfCalendarMonthWeeks(month) {\n  var firstDayOfWeek = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _moment[\"default\"].localeData().firstDayOfWeek();\n  var firstDayOfMonth = month.clone().startOf('month');\n  var numBlankDays = getBlankDaysBeforeFirstDay(firstDayOfMonth, firstDayOfWeek);\n  return Math.ceil((numBlankDays + month.daysInMonth()) / 7);\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getActiveElement;\n\nfunction getActiveElement() {\n  return typeof document !== 'undefined' && document.activeElement;\n}", "\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = exports.PureDayPicker = exports.defaultProps = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/toConsumableArray\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _throttle = _interopRequireDefault(require(\"lodash/throttle\"));\n\nvar _isTouchDevice = _interopRequireDefault(require(\"is-touch-device\"));\n\nvar _reactOutsideClickHandler = _interopRequireDefault(require(\"react-outside-click-handler\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _CalendarMonthGrid = _interopRequireDefault(require(\"./CalendarMonthGrid\"));\n\nvar _DayPickerNavigation = _interopRequireDefault(require(\"./DayPickerNavigation\"));\n\nvar _DayPickerKeyboardShortcuts = _interopRequireWildcard(require(\"./DayPickerKeyboardShortcuts\"));\n\nvar _getNumberOfCalendarMonthWeeks = _interopRequireDefault(require(\"../utils/getNumberOfCalendarMonthWeeks\"));\n\nvar _getCalendarMonthWidth = _interopRequireDefault(require(\"../utils/getCalendarMonthWidth\"));\n\nvar _calculateDimension = _interopRequireDefault(require(\"../utils/calculateDimension\"));\n\nvar _getActiveElement = _interopRequireDefault(require(\"../utils/getActiveElement\"));\n\nvar _isDayVisible = _interopRequireDefault(require(\"../utils/isDayVisible\"));\n\nvar _isSameMonth = _interopRequireDefault(require(\"../utils/isSameMonth\"));\n\nvar _ModifiersShape = _interopRequireDefault(require(\"../shapes/ModifiersShape\"));\n\nvar _NavPositionShape = _interopRequireDefault(require(\"../shapes/NavPositionShape\"));\n\nvar _ScrollableOrientationShape = _interopRequireDefault(require(\"../shapes/ScrollableOrientationShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"../shapes/DayOfWeekShape\"));\n\nvar _CalendarInfoPositionShape = _interopRequireDefault(require(\"../shapes/CalendarInfoPositionShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar MONTH_PADDING = 23;\nvar PREV_TRANSITION = 'prev';\nvar NEXT_TRANSITION = 'next';\nvar MONTH_SELECTION_TRANSITION = 'month_selection';\nvar YEAR_SELECTION_TRANSITION = 'year_selection';\nvar PREV_NAV = 'prev_nav';\nvar NEXT_NAV = 'next_nav';\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  // calendar presentation props\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  numberOfMonths: _propTypes[\"default\"].number,\n  orientation: _ScrollableOrientationShape[\"default\"],\n  withPortal: _propTypes[\"default\"].bool,\n  onOutsideClick: _propTypes[\"default\"].func,\n  hidden: _propTypes[\"default\"].bool,\n  initialVisibleMonth: _propTypes[\"default\"].func,\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  renderCalendarInfo: _propTypes[\"default\"].func,\n  calendarInfoPosition: _CalendarInfoPositionShape[\"default\"],\n  hideKeyboardShortcutsPanel: _propTypes[\"default\"].bool,\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  isRTL: _propTypes[\"default\"].bool,\n  verticalHeight: _airbnbPropTypes.nonNegativeInteger,\n  noBorder: _propTypes[\"default\"].bool,\n  transitionDuration: _airbnbPropTypes.nonNegativeInteger,\n  verticalBorderSpacing: _airbnbPropTypes.nonNegativeInteger,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  renderKeyboardShortcutsButton: _propTypes[\"default\"].func,\n  renderKeyboardShortcutsPanel: _propTypes[\"default\"].func,\n  // navigation props\n  dayPickerNavigationInlineStyles: _propTypes[\"default\"].object,\n  disablePrev: _propTypes[\"default\"].bool,\n  disableNext: _propTypes[\"default\"].bool,\n  navPosition: _NavPositionShape[\"default\"],\n  navPrev: _propTypes[\"default\"].node,\n  navNext: _propTypes[\"default\"].node,\n  renderNavPrevButton: _propTypes[\"default\"].func,\n  renderNavNextButton: _propTypes[\"default\"].func,\n  noNavButtons: _propTypes[\"default\"].bool,\n  noNavNextButton: _propTypes[\"default\"].bool,\n  noNavPrevButton: _propTypes[\"default\"].bool,\n  onPrevMonthClick: _propTypes[\"default\"].func,\n  onNextMonthClick: _propTypes[\"default\"].func,\n  onMonthChange: _propTypes[\"default\"].func,\n  onYearChange: _propTypes[\"default\"].func,\n  onGetNextScrollableMonths: _propTypes[\"default\"].func,\n  // VERTICAL_SCROLLABLE daypickers only\n  onGetPrevScrollableMonths: _propTypes[\"default\"].func,\n  // VERTICAL_SCROLLABLE daypickers only\n  // month props\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderWeekHeaderElement: _propTypes[\"default\"].func,\n  // day props\n  modifiers: _propTypes[\"default\"].objectOf(_propTypes[\"default\"].objectOf(_ModifiersShape[\"default\"])),\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  onDayClick: _propTypes[\"default\"].func,\n  onDayMouseEnter: _propTypes[\"default\"].func,\n  onDayMouseLeave: _propTypes[\"default\"].func,\n  // accessibility props\n  isFocused: _propTypes[\"default\"].bool,\n  getFirstFocusableDay: _propTypes[\"default\"].func,\n  onBlur: _propTypes[\"default\"].func,\n  showKeyboardShortcuts: _propTypes[\"default\"].bool,\n  onTab: _propTypes[\"default\"].func,\n  onShiftTab: _propTypes[\"default\"].func,\n  // internationalization\n  monthFormat: _propTypes[\"default\"].string,\n  weekDayFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DayPickerPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string\n})) : {};\nvar defaultProps = {\n  // calendar presentation props\n  enableOutsideDays: false,\n  numberOfMonths: 2,\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  withPortal: false,\n  onOutsideClick: function onOutsideClick() {},\n  hidden: false,\n  initialVisibleMonth: function initialVisibleMonth() {\n    return (0, _moment[\"default\"])();\n  },\n  firstDayOfWeek: null,\n  renderCalendarInfo: null,\n  calendarInfoPosition: _constants.INFO_POSITION_BOTTOM,\n  hideKeyboardShortcutsPanel: false,\n  daySize: _constants.DAY_SIZE,\n  isRTL: false,\n  verticalHeight: null,\n  noBorder: false,\n  transitionDuration: undefined,\n  verticalBorderSpacing: undefined,\n  horizontalMonthPadding: 13,\n  renderKeyboardShortcutsButton: undefined,\n  renderKeyboardShortcutsPanel: undefined,\n  // navigation props\n  dayPickerNavigationInlineStyles: null,\n  disablePrev: false,\n  disableNext: false,\n  navPosition: _constants.NAV_POSITION_TOP,\n  navPrev: null,\n  navNext: null,\n  renderNavPrevButton: null,\n  renderNavNextButton: null,\n  noNavButtons: false,\n  noNavNextButton: false,\n  noNavPrevButton: false,\n  onPrevMonthClick: function onPrevMonthClick() {},\n  onNextMonthClick: function onNextMonthClick() {},\n  onMonthChange: function onMonthChange() {},\n  onYearChange: function onYearChange() {},\n  onGetNextScrollableMonths: function onGetNextScrollableMonths() {},\n  onGetPrevScrollableMonths: function onGetPrevScrollableMonths() {},\n  // month props\n  renderMonthText: null,\n  renderMonthElement: null,\n  renderWeekHeaderElement: null,\n  // day props\n  modifiers: {},\n  renderCalendarDay: undefined,\n  renderDayContents: null,\n  onDayClick: function onDayClick() {},\n  onDayMouseEnter: function onDayMouseEnter() {},\n  onDayMouseLeave: function onDayMouseLeave() {},\n  // accessibility props\n  isFocused: false,\n  getFirstFocusableDay: null,\n  onBlur: function onBlur() {},\n  showKeyboardShortcuts: false,\n  onTab: function onTab() {},\n  onShiftTab: function onShiftTab() {},\n  // internationalization\n  monthFormat: 'MMMM YYYY',\n  weekDayFormat: 'dd',\n  phrases: _defaultPhrases.DayPickerPhrases,\n  dayAriaLabelFormat: undefined\n};\nexports.defaultProps = defaultProps;\n\nvar DayPicker =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DayPicker, _ref);\n  var _proto = DayPicker.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DayPicker(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    var currentMonth = props.hidden ? (0, _moment[\"default\"])() : props.initialVisibleMonth();\n    var focusedDate = currentMonth.clone().startOf('month');\n\n    if (props.getFirstFocusableDay) {\n      focusedDate = props.getFirstFocusableDay(currentMonth);\n    }\n\n    var horizontalMonthPadding = props.horizontalMonthPadding;\n    var translationValue = props.isRTL && _this.isHorizontal() ? -(0, _getCalendarMonthWidth[\"default\"])(props.daySize, horizontalMonthPadding) : 0;\n    _this.hasSetInitialVisibleMonth = !props.hidden;\n    _this.state = {\n      currentMonthScrollTop: null,\n      currentMonth: currentMonth,\n      monthTransition: null,\n      translationValue: translationValue,\n      scrollableMonthMultiple: 1,\n      calendarMonthWidth: (0, _getCalendarMonthWidth[\"default\"])(props.daySize, horizontalMonthPadding),\n      focusedDate: !props.hidden || props.isFocused ? focusedDate : null,\n      nextFocusedDate: null,\n      showKeyboardShortcuts: props.showKeyboardShortcuts,\n      onKeyboardShortcutsPanelClose: function onKeyboardShortcutsPanelClose() {},\n      isTouchDevice: (0, _isTouchDevice[\"default\"])(),\n      withMouseInteractions: true,\n      calendarInfoWidth: 0,\n      monthTitleHeight: null,\n      hasSetHeight: false\n    };\n\n    _this.setCalendarMonthWeeks(currentMonth);\n\n    _this.calendarMonthGridHeight = 0;\n    _this.setCalendarInfoWidthTimeout = null;\n    _this.setCalendarMonthGridHeightTimeout = null;\n    _this.onKeyDown = _this.onKeyDown.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.throttledKeyDown = (0, _throttle[\"default\"])(_this.onFinalKeyDown, 200, {\n      trailing: false\n    });\n    _this.onPrevMonthClick = _this.onPrevMonthClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onPrevMonthTransition = _this.onPrevMonthTransition.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onNextMonthClick = _this.onNextMonthClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onNextMonthTransition = _this.onNextMonthTransition.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onMonthChange = _this.onMonthChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onYearChange = _this.onYearChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.getNextScrollableMonths = _this.getNextScrollableMonths.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.getPrevScrollableMonths = _this.getPrevScrollableMonths.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.updateStateAfterMonthTransition = _this.updateStateAfterMonthTransition.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.openKeyboardShortcutsPanel = _this.openKeyboardShortcutsPanel.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.closeKeyboardShortcutsPanel = _this.closeKeyboardShortcutsPanel.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setCalendarInfoRef = _this.setCalendarInfoRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setContainerRef = _this.setContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setTransitionContainerRef = _this.setTransitionContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setMonthTitleHeight = _this.setMonthTitleHeight.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentDidMount = function componentDidMount() {\n    var orientation = this.props.orientation;\n    var currentMonth = this.state.currentMonth;\n    var calendarInfoWidth = this.calendarInfo ? (0, _calculateDimension[\"default\"])(this.calendarInfo, 'width', true, true) : 0;\n    var currentMonthScrollTop = this.transitionContainer && orientation === _constants.VERTICAL_SCROLLABLE ? this.transitionContainer.scrollHeight - this.transitionContainer.scrollTop : null;\n    this.setState({\n      isTouchDevice: (0, _isTouchDevice[\"default\"])(),\n      calendarInfoWidth: calendarInfoWidth,\n      currentMonthScrollTop: currentMonthScrollTop\n    });\n    this.setCalendarMonthWeeks(currentMonth);\n  };\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps, nextState) {\n    var hidden = nextProps.hidden,\n        isFocused = nextProps.isFocused,\n        showKeyboardShortcuts = nextProps.showKeyboardShortcuts,\n        onBlur = nextProps.onBlur,\n        orientation = nextProps.orientation,\n        renderMonthText = nextProps.renderMonthText,\n        horizontalMonthPadding = nextProps.horizontalMonthPadding;\n    var currentMonth = this.state.currentMonth;\n    var nextCurrentMonth = nextState.currentMonth;\n\n    if (!hidden) {\n      if (!this.hasSetInitialVisibleMonth) {\n        this.hasSetInitialVisibleMonth = true;\n        this.setState({\n          currentMonth: nextProps.initialVisibleMonth()\n        });\n      }\n    }\n\n    var _this$props = this.props,\n        daySize = _this$props.daySize,\n        prevIsFocused = _this$props.isFocused,\n        prevRenderMonthText = _this$props.renderMonthText;\n\n    if (nextProps.daySize !== daySize) {\n      this.setState({\n        calendarMonthWidth: (0, _getCalendarMonthWidth[\"default\"])(nextProps.daySize, horizontalMonthPadding)\n      });\n    }\n\n    if (isFocused !== prevIsFocused) {\n      if (isFocused) {\n        var focusedDate = this.getFocusedDay(currentMonth);\n        var onKeyboardShortcutsPanelClose = this.state.onKeyboardShortcutsPanelClose;\n\n        if (nextProps.showKeyboardShortcuts) {\n          // the ? shortcut came from the input and we should return input there once it is close\n          onKeyboardShortcutsPanelClose = onBlur;\n        }\n\n        this.setState({\n          showKeyboardShortcuts: showKeyboardShortcuts,\n          onKeyboardShortcutsPanelClose: onKeyboardShortcutsPanelClose,\n          focusedDate: focusedDate,\n          withMouseInteractions: false\n        });\n      } else {\n        this.setState({\n          focusedDate: null\n        });\n      }\n    }\n\n    if (renderMonthText !== prevRenderMonthText) {\n      this.setState({\n        monthTitleHeight: null\n      });\n    } // Capture the scroll position so when previous months are rendered above the current month\n    // we can adjust scroll after the component has updated and the previous current month\n    // stays in view.\n\n\n    if (orientation === _constants.VERTICAL_SCROLLABLE && this.transitionContainer && !(0, _isSameMonth[\"default\"])(currentMonth, nextCurrentMonth)) {\n      this.setState({\n        currentMonthScrollTop: this.transitionContainer.scrollHeight - this.transitionContainer.scrollTop\n      });\n    }\n  };\n\n  _proto.componentWillUpdate = function componentWillUpdate() {\n    var _this2 = this;\n\n    var transitionDuration = this.props.transitionDuration; // Calculating the dimensions trigger a DOM repaint which\n    // breaks the CSS transition.\n    // The setTimeout will wait until the transition ends.\n\n    if (this.calendarInfo) {\n      this.setCalendarInfoWidthTimeout = setTimeout(function () {\n        var calendarInfoWidth = _this2.state.calendarInfoWidth;\n        var calendarInfoPanelWidth = (0, _calculateDimension[\"default\"])(_this2.calendarInfo, 'width', true, true);\n\n        if (calendarInfoWidth !== calendarInfoPanelWidth) {\n          _this2.setState({\n            calendarInfoWidth: calendarInfoPanelWidth\n          });\n        }\n      }, transitionDuration);\n    }\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    var _this$props2 = this.props,\n        orientation = _this$props2.orientation,\n        daySize = _this$props2.daySize,\n        isFocused = _this$props2.isFocused,\n        numberOfMonths = _this$props2.numberOfMonths;\n    var _this$state = this.state,\n        currentMonth = _this$state.currentMonth,\n        currentMonthScrollTop = _this$state.currentMonthScrollTop,\n        focusedDate = _this$state.focusedDate,\n        monthTitleHeight = _this$state.monthTitleHeight;\n\n    if (this.isHorizontal() && (orientation !== prevProps.orientation || daySize !== prevProps.daySize)) {\n      var visibleCalendarWeeks = this.calendarMonthWeeks.slice(1, numberOfMonths + 1);\n      var calendarMonthWeeksHeight = Math.max.apply(Math, [0].concat((0, _toConsumableArray2[\"default\"])(visibleCalendarWeeks))) * (daySize - 1);\n      var newMonthHeight = monthTitleHeight + calendarMonthWeeksHeight + 1;\n      this.adjustDayPickerHeight(newMonthHeight);\n    }\n\n    if (!prevProps.isFocused && isFocused && !focusedDate) {\n      this.container.focus();\n    } // If orientation is VERTICAL_SCROLLABLE and currentMonth has changed adjust scrollTop so the\n    // new months rendered above the current month don't push the current month out of view.\n\n\n    if (orientation === _constants.VERTICAL_SCROLLABLE && !(0, _isSameMonth[\"default\"])(prevState.currentMonth, currentMonth) && currentMonthScrollTop && this.transitionContainer) {\n      this.transitionContainer.scrollTop = this.transitionContainer.scrollHeight - currentMonthScrollTop;\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    clearTimeout(this.setCalendarInfoWidthTimeout);\n    clearTimeout(this.setCalendarMonthGridHeightTimeout);\n  };\n\n  _proto.onKeyDown = function onKeyDown(e) {\n    e.stopPropagation();\n\n    if (!_constants.MODIFIER_KEY_NAMES.has(e.key)) {\n      this.throttledKeyDown(e);\n    }\n  };\n\n  _proto.onFinalKeyDown = function onFinalKeyDown(e) {\n    this.setState({\n      withMouseInteractions: false\n    });\n    var _this$props3 = this.props,\n        onBlur = _this$props3.onBlur,\n        onTab = _this$props3.onTab,\n        onShiftTab = _this$props3.onShiftTab,\n        isRTL = _this$props3.isRTL;\n    var _this$state2 = this.state,\n        focusedDate = _this$state2.focusedDate,\n        showKeyboardShortcuts = _this$state2.showKeyboardShortcuts;\n    if (!focusedDate) return;\n    var newFocusedDate = focusedDate.clone();\n    var didTransitionMonth = false; // focus might be anywhere when the keyboard shortcuts panel is opened so we want to\n    // return it to wherever it was before when the panel was opened\n\n    var activeElement = (0, _getActiveElement[\"default\"])();\n\n    var onKeyboardShortcutsPanelClose = function onKeyboardShortcutsPanelClose() {\n      if (activeElement) activeElement.focus();\n    };\n\n    switch (e.key) {\n      case 'ArrowUp':\n        e.preventDefault();\n        newFocusedDate.subtract(1, 'week');\n        didTransitionMonth = this.maybeTransitionPrevMonth(newFocusedDate);\n        break;\n\n      case 'ArrowLeft':\n        e.preventDefault();\n\n        if (isRTL) {\n          newFocusedDate.add(1, 'day');\n        } else {\n          newFocusedDate.subtract(1, 'day');\n        }\n\n        didTransitionMonth = this.maybeTransitionPrevMonth(newFocusedDate);\n        break;\n\n      case 'Home':\n        e.preventDefault();\n        newFocusedDate.startOf('week');\n        didTransitionMonth = this.maybeTransitionPrevMonth(newFocusedDate);\n        break;\n\n      case 'PageUp':\n        e.preventDefault();\n        newFocusedDate.subtract(1, 'month');\n        didTransitionMonth = this.maybeTransitionPrevMonth(newFocusedDate);\n        break;\n\n      case 'ArrowDown':\n        e.preventDefault();\n        newFocusedDate.add(1, 'week');\n        didTransitionMonth = this.maybeTransitionNextMonth(newFocusedDate);\n        break;\n\n      case 'ArrowRight':\n        e.preventDefault();\n\n        if (isRTL) {\n          newFocusedDate.subtract(1, 'day');\n        } else {\n          newFocusedDate.add(1, 'day');\n        }\n\n        didTransitionMonth = this.maybeTransitionNextMonth(newFocusedDate);\n        break;\n\n      case 'End':\n        e.preventDefault();\n        newFocusedDate.endOf('week');\n        didTransitionMonth = this.maybeTransitionNextMonth(newFocusedDate);\n        break;\n\n      case 'PageDown':\n        e.preventDefault();\n        newFocusedDate.add(1, 'month');\n        didTransitionMonth = this.maybeTransitionNextMonth(newFocusedDate);\n        break;\n\n      case '?':\n        this.openKeyboardShortcutsPanel(onKeyboardShortcutsPanelClose);\n        break;\n\n      case 'Escape':\n        if (showKeyboardShortcuts) {\n          this.closeKeyboardShortcutsPanel();\n        } else {\n          onBlur(e);\n        }\n\n        break;\n\n      case 'Tab':\n        if (e.shiftKey) {\n          onShiftTab();\n        } else {\n          onTab(e);\n        }\n\n        break;\n\n      default:\n        break;\n    } // If there was a month transition, do not update the focused date until the transition has\n    // completed. Otherwise, attempting to focus on a DOM node may interrupt the CSS animation. If\n    // didTransitionMonth is true, the focusedDate gets updated in #updateStateAfterMonthTransition\n\n\n    if (!didTransitionMonth) {\n      this.setState({\n        focusedDate: newFocusedDate\n      });\n    }\n  };\n\n  _proto.onPrevMonthClick = function onPrevMonthClick(e) {\n    if (e) e.preventDefault();\n    this.onPrevMonthTransition();\n  };\n\n  _proto.onPrevMonthTransition = function onPrevMonthTransition(nextFocusedDate) {\n    var _this$props4 = this.props,\n        daySize = _this$props4.daySize,\n        isRTL = _this$props4.isRTL,\n        numberOfMonths = _this$props4.numberOfMonths;\n    var _this$state3 = this.state,\n        calendarMonthWidth = _this$state3.calendarMonthWidth,\n        monthTitleHeight = _this$state3.monthTitleHeight;\n    var translationValue;\n\n    if (this.isVertical()) {\n      var calendarMonthWeeksHeight = this.calendarMonthWeeks[0] * (daySize - 1);\n      translationValue = monthTitleHeight + calendarMonthWeeksHeight + 1;\n    } else if (this.isHorizontal()) {\n      translationValue = calendarMonthWidth;\n\n      if (isRTL) {\n        translationValue = -2 * calendarMonthWidth;\n      }\n\n      var visibleCalendarWeeks = this.calendarMonthWeeks.slice(0, numberOfMonths);\n\n      var _calendarMonthWeeksHeight = Math.max.apply(Math, [0].concat((0, _toConsumableArray2[\"default\"])(visibleCalendarWeeks))) * (daySize - 1);\n\n      var newMonthHeight = monthTitleHeight + _calendarMonthWeeksHeight + 1;\n      this.adjustDayPickerHeight(newMonthHeight);\n    }\n\n    this.setState({\n      monthTransition: PREV_TRANSITION,\n      translationValue: translationValue,\n      focusedDate: null,\n      nextFocusedDate: nextFocusedDate\n    });\n  };\n\n  _proto.onMonthChange = function onMonthChange(currentMonth) {\n    this.setCalendarMonthWeeks(currentMonth);\n    this.calculateAndSetDayPickerHeight(); // Translation value is a hack to force an invisible transition that\n    // properly rerenders the CalendarMonthGrid\n\n    this.setState({\n      monthTransition: MONTH_SELECTION_TRANSITION,\n      translationValue: 0.00001,\n      focusedDate: null,\n      nextFocusedDate: currentMonth,\n      currentMonth: currentMonth\n    });\n  };\n\n  _proto.onYearChange = function onYearChange(currentMonth) {\n    this.setCalendarMonthWeeks(currentMonth);\n    this.calculateAndSetDayPickerHeight(); // Translation value is a hack to force an invisible transition that\n    // properly rerenders the CalendarMonthGrid\n\n    this.setState({\n      monthTransition: YEAR_SELECTION_TRANSITION,\n      translationValue: 0.0001,\n      focusedDate: null,\n      nextFocusedDate: currentMonth,\n      currentMonth: currentMonth\n    });\n  };\n\n  _proto.onNextMonthClick = function onNextMonthClick(e) {\n    if (e) e.preventDefault();\n    this.onNextMonthTransition();\n  };\n\n  _proto.onNextMonthTransition = function onNextMonthTransition(nextFocusedDate) {\n    var _this$props5 = this.props,\n        isRTL = _this$props5.isRTL,\n        numberOfMonths = _this$props5.numberOfMonths,\n        daySize = _this$props5.daySize;\n    var _this$state4 = this.state,\n        calendarMonthWidth = _this$state4.calendarMonthWidth,\n        monthTitleHeight = _this$state4.monthTitleHeight;\n    var translationValue;\n\n    if (this.isVertical()) {\n      var firstVisibleMonthWeeks = this.calendarMonthWeeks[1];\n      var calendarMonthWeeksHeight = firstVisibleMonthWeeks * (daySize - 1);\n      translationValue = -(monthTitleHeight + calendarMonthWeeksHeight + 1);\n    }\n\n    if (this.isHorizontal()) {\n      translationValue = -calendarMonthWidth;\n\n      if (isRTL) {\n        translationValue = 0;\n      }\n\n      var visibleCalendarWeeks = this.calendarMonthWeeks.slice(2, numberOfMonths + 2);\n\n      var _calendarMonthWeeksHeight2 = Math.max.apply(Math, [0].concat((0, _toConsumableArray2[\"default\"])(visibleCalendarWeeks))) * (daySize - 1);\n\n      var newMonthHeight = monthTitleHeight + _calendarMonthWeeksHeight2 + 1;\n      this.adjustDayPickerHeight(newMonthHeight);\n    }\n\n    this.setState({\n      monthTransition: NEXT_TRANSITION,\n      translationValue: translationValue,\n      focusedDate: null,\n      nextFocusedDate: nextFocusedDate\n    });\n  };\n\n  _proto.getFirstDayOfWeek = function getFirstDayOfWeek() {\n    var firstDayOfWeek = this.props.firstDayOfWeek;\n\n    if (firstDayOfWeek == null) {\n      return _moment[\"default\"].localeData().firstDayOfWeek();\n    }\n\n    return firstDayOfWeek;\n  };\n\n  _proto.getWeekHeaders = function getWeekHeaders() {\n    var weekDayFormat = this.props.weekDayFormat;\n    var currentMonth = this.state.currentMonth;\n    var firstDayOfWeek = this.getFirstDayOfWeek();\n    var weekHeaders = [];\n\n    for (var i = 0; i < 7; i += 1) {\n      weekHeaders.push(currentMonth.clone().day((i + firstDayOfWeek) % 7).format(weekDayFormat));\n    }\n\n    return weekHeaders;\n  };\n\n  _proto.getFirstVisibleIndex = function getFirstVisibleIndex() {\n    var orientation = this.props.orientation;\n    var monthTransition = this.state.monthTransition;\n    if (orientation === _constants.VERTICAL_SCROLLABLE) return 0;\n    var firstVisibleMonthIndex = 1;\n\n    if (monthTransition === PREV_TRANSITION) {\n      firstVisibleMonthIndex -= 1;\n    } else if (monthTransition === NEXT_TRANSITION) {\n      firstVisibleMonthIndex += 1;\n    }\n\n    return firstVisibleMonthIndex;\n  };\n\n  _proto.getFocusedDay = function getFocusedDay(newMonth) {\n    var _this$props6 = this.props,\n        getFirstFocusableDay = _this$props6.getFirstFocusableDay,\n        numberOfMonths = _this$props6.numberOfMonths;\n    var focusedDate;\n\n    if (getFirstFocusableDay) {\n      focusedDate = getFirstFocusableDay(newMonth);\n    }\n\n    if (newMonth && (!focusedDate || !(0, _isDayVisible[\"default\"])(focusedDate, newMonth, numberOfMonths))) {\n      focusedDate = newMonth.clone().startOf('month');\n    }\n\n    return focusedDate;\n  };\n\n  _proto.setMonthTitleHeight = function setMonthTitleHeight(monthTitleHeight) {\n    var _this3 = this;\n\n    this.setState({\n      monthTitleHeight: monthTitleHeight\n    }, function () {\n      _this3.calculateAndSetDayPickerHeight();\n    });\n  };\n\n  _proto.setCalendarMonthWeeks = function setCalendarMonthWeeks(currentMonth) {\n    var numberOfMonths = this.props.numberOfMonths;\n    this.calendarMonthWeeks = [];\n    var month = currentMonth.clone().subtract(1, 'months');\n    var firstDayOfWeek = this.getFirstDayOfWeek();\n\n    for (var i = 0; i < numberOfMonths + 2; i += 1) {\n      var numberOfWeeks = (0, _getNumberOfCalendarMonthWeeks[\"default\"])(month, firstDayOfWeek);\n      this.calendarMonthWeeks.push(numberOfWeeks);\n      month = month.add(1, 'months');\n    }\n  };\n\n  _proto.setContainerRef = function setContainerRef(ref) {\n    this.container = ref;\n  };\n\n  _proto.setCalendarInfoRef = function setCalendarInfoRef(ref) {\n    this.calendarInfo = ref;\n  };\n\n  _proto.setTransitionContainerRef = function setTransitionContainerRef(ref) {\n    this.transitionContainer = ref;\n  };\n\n  _proto.getNextScrollableMonths = function getNextScrollableMonths(e) {\n    var onGetNextScrollableMonths = this.props.onGetNextScrollableMonths;\n    if (e) e.preventDefault();\n    if (onGetNextScrollableMonths) onGetNextScrollableMonths(e);\n    this.setState(function (_ref2) {\n      var scrollableMonthMultiple = _ref2.scrollableMonthMultiple;\n      return {\n        scrollableMonthMultiple: scrollableMonthMultiple + 1\n      };\n    });\n  };\n\n  _proto.getPrevScrollableMonths = function getPrevScrollableMonths(e) {\n    var _this$props7 = this.props,\n        numberOfMonths = _this$props7.numberOfMonths,\n        onGetPrevScrollableMonths = _this$props7.onGetPrevScrollableMonths;\n    if (e) e.preventDefault();\n    if (onGetPrevScrollableMonths) onGetPrevScrollableMonths(e);\n    this.setState(function (_ref3) {\n      var currentMonth = _ref3.currentMonth,\n          scrollableMonthMultiple = _ref3.scrollableMonthMultiple;\n      return {\n        currentMonth: currentMonth.clone().subtract(numberOfMonths, 'month'),\n        scrollableMonthMultiple: scrollableMonthMultiple + 1\n      };\n    });\n  };\n\n  _proto.maybeTransitionNextMonth = function maybeTransitionNextMonth(newFocusedDate) {\n    var numberOfMonths = this.props.numberOfMonths;\n    var _this$state5 = this.state,\n        currentMonth = _this$state5.currentMonth,\n        focusedDate = _this$state5.focusedDate;\n    var newFocusedDateMonth = newFocusedDate.month();\n    var focusedDateMonth = focusedDate.month();\n    var isNewFocusedDateVisible = (0, _isDayVisible[\"default\"])(newFocusedDate, currentMonth, numberOfMonths);\n\n    if (newFocusedDateMonth !== focusedDateMonth && !isNewFocusedDateVisible) {\n      this.onNextMonthTransition(newFocusedDate);\n      return true;\n    }\n\n    return false;\n  };\n\n  _proto.maybeTransitionPrevMonth = function maybeTransitionPrevMonth(newFocusedDate) {\n    var numberOfMonths = this.props.numberOfMonths;\n    var _this$state6 = this.state,\n        currentMonth = _this$state6.currentMonth,\n        focusedDate = _this$state6.focusedDate;\n    var newFocusedDateMonth = newFocusedDate.month();\n    var focusedDateMonth = focusedDate.month();\n    var isNewFocusedDateVisible = (0, _isDayVisible[\"default\"])(newFocusedDate, currentMonth, numberOfMonths);\n\n    if (newFocusedDateMonth !== focusedDateMonth && !isNewFocusedDateVisible) {\n      this.onPrevMonthTransition(newFocusedDate);\n      return true;\n    }\n\n    return false;\n  };\n\n  _proto.isHorizontal = function isHorizontal() {\n    var orientation = this.props.orientation;\n    return orientation === _constants.HORIZONTAL_ORIENTATION;\n  };\n\n  _proto.isVertical = function isVertical() {\n    var orientation = this.props.orientation;\n    return orientation === _constants.VERTICAL_ORIENTATION || orientation === _constants.VERTICAL_SCROLLABLE;\n  };\n\n  _proto.updateStateAfterMonthTransition = function updateStateAfterMonthTransition() {\n    var _this4 = this;\n\n    var _this$props8 = this.props,\n        onPrevMonthClick = _this$props8.onPrevMonthClick,\n        onNextMonthClick = _this$props8.onNextMonthClick,\n        numberOfMonths = _this$props8.numberOfMonths,\n        onMonthChange = _this$props8.onMonthChange,\n        onYearChange = _this$props8.onYearChange,\n        isRTL = _this$props8.isRTL;\n    var _this$state7 = this.state,\n        currentMonth = _this$state7.currentMonth,\n        monthTransition = _this$state7.monthTransition,\n        focusedDate = _this$state7.focusedDate,\n        nextFocusedDate = _this$state7.nextFocusedDate,\n        withMouseInteractions = _this$state7.withMouseInteractions,\n        calendarMonthWidth = _this$state7.calendarMonthWidth;\n    if (!monthTransition) return;\n    var newMonth = currentMonth.clone();\n    var firstDayOfWeek = this.getFirstDayOfWeek();\n\n    if (monthTransition === PREV_TRANSITION) {\n      newMonth.subtract(1, 'month');\n      if (onPrevMonthClick) onPrevMonthClick(newMonth);\n      var newInvisibleMonth = newMonth.clone().subtract(1, 'month');\n      var numberOfWeeks = (0, _getNumberOfCalendarMonthWeeks[\"default\"])(newInvisibleMonth, firstDayOfWeek);\n      this.calendarMonthWeeks = [numberOfWeeks].concat((0, _toConsumableArray2[\"default\"])(this.calendarMonthWeeks.slice(0, -1)));\n    } else if (monthTransition === NEXT_TRANSITION) {\n      newMonth.add(1, 'month');\n      if (onNextMonthClick) onNextMonthClick(newMonth);\n\n      var _newInvisibleMonth = newMonth.clone().add(numberOfMonths, 'month');\n\n      var _numberOfWeeks = (0, _getNumberOfCalendarMonthWeeks[\"default\"])(_newInvisibleMonth, firstDayOfWeek);\n\n      this.calendarMonthWeeks = [].concat((0, _toConsumableArray2[\"default\"])(this.calendarMonthWeeks.slice(1)), [_numberOfWeeks]);\n    } else if (monthTransition === MONTH_SELECTION_TRANSITION) {\n      if (onMonthChange) onMonthChange(newMonth);\n    } else if (monthTransition === YEAR_SELECTION_TRANSITION) {\n      if (onYearChange) onYearChange(newMonth);\n    }\n\n    var newFocusedDate = null;\n\n    if (nextFocusedDate) {\n      newFocusedDate = nextFocusedDate;\n    } else if (!focusedDate && !withMouseInteractions) {\n      newFocusedDate = this.getFocusedDay(newMonth);\n    }\n\n    this.setState({\n      currentMonth: newMonth,\n      monthTransition: null,\n      translationValue: isRTL && this.isHorizontal() ? -calendarMonthWidth : 0,\n      nextFocusedDate: null,\n      focusedDate: newFocusedDate\n    }, function () {\n      // we don't want to focus on the relevant calendar day after a month transition\n      // if the user is navigating around using a mouse\n      if (withMouseInteractions) {\n        var activeElement = (0, _getActiveElement[\"default\"])();\n\n        if (activeElement && activeElement !== document.body && _this4.container.contains(activeElement) && activeElement.blur) {\n          activeElement.blur();\n        }\n      }\n    });\n  };\n\n  _proto.adjustDayPickerHeight = function adjustDayPickerHeight(newMonthHeight) {\n    var _this5 = this;\n\n    var monthHeight = newMonthHeight + MONTH_PADDING;\n\n    if (monthHeight !== this.calendarMonthGridHeight) {\n      this.transitionContainer.style.height = \"\".concat(monthHeight, \"px\");\n\n      if (!this.calendarMonthGridHeight) {\n        this.setCalendarMonthGridHeightTimeout = setTimeout(function () {\n          _this5.setState({\n            hasSetHeight: true\n          });\n        }, 0);\n      }\n\n      this.calendarMonthGridHeight = monthHeight;\n    }\n  };\n\n  _proto.calculateAndSetDayPickerHeight = function calculateAndSetDayPickerHeight() {\n    var _this$props9 = this.props,\n        daySize = _this$props9.daySize,\n        numberOfMonths = _this$props9.numberOfMonths;\n    var monthTitleHeight = this.state.monthTitleHeight;\n    var visibleCalendarWeeks = this.calendarMonthWeeks.slice(1, numberOfMonths + 1);\n    var calendarMonthWeeksHeight = Math.max.apply(Math, [0].concat((0, _toConsumableArray2[\"default\"])(visibleCalendarWeeks))) * (daySize - 1);\n    var newMonthHeight = monthTitleHeight + calendarMonthWeeksHeight + 1;\n\n    if (this.isHorizontal()) {\n      this.adjustDayPickerHeight(newMonthHeight);\n    }\n  };\n\n  _proto.openKeyboardShortcutsPanel = function openKeyboardShortcutsPanel(onCloseCallBack) {\n    this.setState({\n      showKeyboardShortcuts: true,\n      onKeyboardShortcutsPanelClose: onCloseCallBack\n    });\n  };\n\n  _proto.closeKeyboardShortcutsPanel = function closeKeyboardShortcutsPanel() {\n    var onKeyboardShortcutsPanelClose = this.state.onKeyboardShortcutsPanelClose;\n\n    if (onKeyboardShortcutsPanelClose) {\n      onKeyboardShortcutsPanelClose();\n    }\n\n    this.setState({\n      onKeyboardShortcutsPanelClose: null,\n      showKeyboardShortcuts: false\n    });\n  };\n\n  _proto.renderNavigation = function renderNavigation(navDirection) {\n    var _this$props10 = this.props,\n        dayPickerNavigationInlineStyles = _this$props10.dayPickerNavigationInlineStyles,\n        disablePrev = _this$props10.disablePrev,\n        disableNext = _this$props10.disableNext,\n        navPosition = _this$props10.navPosition,\n        navPrev = _this$props10.navPrev,\n        navNext = _this$props10.navNext,\n        noNavButtons = _this$props10.noNavButtons,\n        noNavNextButton = _this$props10.noNavNextButton,\n        noNavPrevButton = _this$props10.noNavPrevButton,\n        orientation = _this$props10.orientation,\n        phrases = _this$props10.phrases,\n        renderNavPrevButton = _this$props10.renderNavPrevButton,\n        renderNavNextButton = _this$props10.renderNavNextButton,\n        isRTL = _this$props10.isRTL;\n\n    if (noNavButtons) {\n      return null;\n    }\n\n    var onPrevMonthClick = orientation === _constants.VERTICAL_SCROLLABLE ? this.getPrevScrollableMonths : this.onPrevMonthClick;\n    var onNextMonthClick = orientation === _constants.VERTICAL_SCROLLABLE ? this.getNextScrollableMonths : this.onNextMonthClick;\n    return _react[\"default\"].createElement(_DayPickerNavigation[\"default\"], {\n      disablePrev: disablePrev,\n      disableNext: disableNext,\n      inlineStyles: dayPickerNavigationInlineStyles,\n      onPrevMonthClick: onPrevMonthClick,\n      onNextMonthClick: onNextMonthClick,\n      navPosition: navPosition,\n      navPrev: navPrev,\n      navNext: navNext,\n      renderNavPrevButton: renderNavPrevButton,\n      renderNavNextButton: renderNavNextButton,\n      orientation: orientation,\n      phrases: phrases,\n      isRTL: isRTL,\n      showNavNextButton: !(noNavNextButton || orientation === _constants.VERTICAL_SCROLLABLE && navDirection === PREV_NAV),\n      showNavPrevButton: !(noNavPrevButton || orientation === _constants.VERTICAL_SCROLLABLE && navDirection === NEXT_NAV)\n    });\n  };\n\n  _proto.renderWeekHeader = function renderWeekHeader(index) {\n    var _this$props11 = this.props,\n        daySize = _this$props11.daySize,\n        horizontalMonthPadding = _this$props11.horizontalMonthPadding,\n        orientation = _this$props11.orientation,\n        renderWeekHeaderElement = _this$props11.renderWeekHeaderElement,\n        styles = _this$props11.styles;\n    var calendarMonthWidth = this.state.calendarMonthWidth;\n    var verticalScrollable = orientation === _constants.VERTICAL_SCROLLABLE;\n    var horizontalStyle = {\n      left: index * calendarMonthWidth\n    };\n    var verticalStyle = {\n      marginLeft: -calendarMonthWidth / 2\n    };\n    var weekHeaderStyle = {}; // no styles applied to the vertical-scrollable orientation\n\n    if (this.isHorizontal()) {\n      weekHeaderStyle = horizontalStyle;\n    } else if (this.isVertical() && !verticalScrollable) {\n      weekHeaderStyle = verticalStyle;\n    }\n\n    var weekHeaders = this.getWeekHeaders();\n    var header = weekHeaders.map(function (day) {\n      return _react[\"default\"].createElement(\"li\", (0, _extends2[\"default\"])({\n        key: day\n      }, (0, _reactWithStyles.css)(styles.DayPicker_weekHeader_li, {\n        width: daySize\n      })), renderWeekHeaderElement ? renderWeekHeaderElement(day) : _react[\"default\"].createElement(\"small\", null, day));\n    });\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPicker_weekHeader, this.isVertical() && styles.DayPicker_weekHeader__vertical, verticalScrollable && styles.DayPicker_weekHeader__verticalScrollable, weekHeaderStyle, {\n      padding: \"0 \".concat(horizontalMonthPadding, \"px\")\n    }), {\n      key: \"week-\".concat(index)\n    }), _react[\"default\"].createElement(\"ul\", (0, _reactWithStyles.css)(styles.DayPicker_weekHeader_ul), header));\n  };\n\n  _proto.render = function render() {\n    var _this6 = this;\n\n    var _this$state8 = this.state,\n        calendarMonthWidth = _this$state8.calendarMonthWidth,\n        currentMonth = _this$state8.currentMonth,\n        monthTransition = _this$state8.monthTransition,\n        translationValue = _this$state8.translationValue,\n        scrollableMonthMultiple = _this$state8.scrollableMonthMultiple,\n        focusedDate = _this$state8.focusedDate,\n        showKeyboardShortcuts = _this$state8.showKeyboardShortcuts,\n        isTouch = _this$state8.isTouchDevice,\n        hasSetHeight = _this$state8.hasSetHeight,\n        calendarInfoWidth = _this$state8.calendarInfoWidth,\n        monthTitleHeight = _this$state8.monthTitleHeight;\n    var _this$props12 = this.props,\n        enableOutsideDays = _this$props12.enableOutsideDays,\n        numberOfMonths = _this$props12.numberOfMonths,\n        orientation = _this$props12.orientation,\n        modifiers = _this$props12.modifiers,\n        withPortal = _this$props12.withPortal,\n        onDayClick = _this$props12.onDayClick,\n        onDayMouseEnter = _this$props12.onDayMouseEnter,\n        onDayMouseLeave = _this$props12.onDayMouseLeave,\n        firstDayOfWeek = _this$props12.firstDayOfWeek,\n        renderMonthText = _this$props12.renderMonthText,\n        renderCalendarDay = _this$props12.renderCalendarDay,\n        renderDayContents = _this$props12.renderDayContents,\n        renderCalendarInfo = _this$props12.renderCalendarInfo,\n        renderMonthElement = _this$props12.renderMonthElement,\n        renderKeyboardShortcutsButton = _this$props12.renderKeyboardShortcutsButton,\n        renderKeyboardShortcutsPanel = _this$props12.renderKeyboardShortcutsPanel,\n        calendarInfoPosition = _this$props12.calendarInfoPosition,\n        hideKeyboardShortcutsPanel = _this$props12.hideKeyboardShortcutsPanel,\n        onOutsideClick = _this$props12.onOutsideClick,\n        monthFormat = _this$props12.monthFormat,\n        daySize = _this$props12.daySize,\n        isFocused = _this$props12.isFocused,\n        isRTL = _this$props12.isRTL,\n        styles = _this$props12.styles,\n        theme = _this$props12.theme,\n        phrases = _this$props12.phrases,\n        verticalHeight = _this$props12.verticalHeight,\n        dayAriaLabelFormat = _this$props12.dayAriaLabelFormat,\n        noBorder = _this$props12.noBorder,\n        transitionDuration = _this$props12.transitionDuration,\n        verticalBorderSpacing = _this$props12.verticalBorderSpacing,\n        horizontalMonthPadding = _this$props12.horizontalMonthPadding,\n        navPosition = _this$props12.navPosition;\n    var dayPickerHorizontalPadding = theme.reactDates.spacing.dayPickerHorizontalPadding;\n    var isHorizontal = this.isHorizontal();\n    var numOfWeekHeaders = this.isVertical() ? 1 : numberOfMonths;\n    var weekHeaders = [];\n\n    for (var i = 0; i < numOfWeekHeaders; i += 1) {\n      weekHeaders.push(this.renderWeekHeader(i));\n    }\n\n    var verticalScrollable = orientation === _constants.VERTICAL_SCROLLABLE;\n    var height;\n\n    if (isHorizontal) {\n      height = this.calendarMonthGridHeight;\n    } else if (this.isVertical() && !verticalScrollable && !withPortal) {\n      // If the user doesn't set a desired height,\n      // we default back to this kind of made-up value that generally looks good\n      height = verticalHeight || 1.75 * calendarMonthWidth;\n    }\n\n    var isCalendarMonthGridAnimating = monthTransition !== null;\n    var shouldFocusDate = !isCalendarMonthGridAnimating && isFocused;\n    var keyboardShortcutButtonLocation = _DayPickerKeyboardShortcuts.BOTTOM_RIGHT;\n\n    if (this.isVertical()) {\n      keyboardShortcutButtonLocation = withPortal ? _DayPickerKeyboardShortcuts.TOP_LEFT : _DayPickerKeyboardShortcuts.TOP_RIGHT;\n    }\n\n    var shouldAnimateHeight = isHorizontal && hasSetHeight;\n    var calendarInfoPositionTop = calendarInfoPosition === _constants.INFO_POSITION_TOP;\n    var calendarInfoPositionBottom = calendarInfoPosition === _constants.INFO_POSITION_BOTTOM;\n    var calendarInfoPositionBefore = calendarInfoPosition === _constants.INFO_POSITION_BEFORE;\n    var calendarInfoPositionAfter = calendarInfoPosition === _constants.INFO_POSITION_AFTER;\n    var calendarInfoIsInline = calendarInfoPositionBefore || calendarInfoPositionAfter;\n\n    var calendarInfo = renderCalendarInfo && _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      ref: this.setCalendarInfoRef\n    }, (0, _reactWithStyles.css)(calendarInfoIsInline && styles.DayPicker_calendarInfo__horizontal)), renderCalendarInfo());\n\n    var calendarInfoPanelWidth = renderCalendarInfo && calendarInfoIsInline ? calendarInfoWidth : 0;\n    var firstVisibleMonthIndex = this.getFirstVisibleIndex();\n    var wrapperHorizontalWidth = calendarMonthWidth * numberOfMonths + 2 * dayPickerHorizontalPadding; // Adding `1px` because of whitespace between 2 inline-block\n\n    var fullHorizontalWidth = wrapperHorizontalWidth + calendarInfoPanelWidth + 1;\n    var transitionContainerStyle = {\n      width: isHorizontal && wrapperHorizontalWidth,\n      height: height\n    };\n    var dayPickerWrapperStyle = {\n      width: isHorizontal && wrapperHorizontalWidth\n    };\n    var dayPickerStyle = {\n      width: isHorizontal && fullHorizontalWidth,\n      // These values are to center the datepicker (approximately) on the page\n      marginLeft: isHorizontal && withPortal ? -fullHorizontalWidth / 2 : null,\n      marginTop: isHorizontal && withPortal ? -calendarMonthWidth / 2 : null\n    };\n    return _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.DayPicker, isHorizontal && styles.DayPicker__horizontal, verticalScrollable && styles.DayPicker__verticalScrollable, isHorizontal && withPortal && styles.DayPicker_portal__horizontal, this.isVertical() && withPortal && styles.DayPicker_portal__vertical, dayPickerStyle, !monthTitleHeight && styles.DayPicker__hidden, !noBorder && styles.DayPicker__withBorder), _react[\"default\"].createElement(_reactOutsideClickHandler[\"default\"], {\n      onOutsideClick: onOutsideClick\n    }, (calendarInfoPositionTop || calendarInfoPositionBefore) && calendarInfo, _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(dayPickerWrapperStyle, calendarInfoIsInline && isHorizontal && styles.DayPicker_wrapper__horizontal), _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPicker_weekHeaders, isHorizontal && styles.DayPicker_weekHeaders__horizontal), {\n      \"aria-hidden\": \"true\",\n      role: \"presentation\"\n    }), weekHeaders), _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPicker_focusRegion), {\n      ref: this.setContainerRef,\n      onClick: function onClick(e) {\n        e.stopPropagation();\n      },\n      onKeyDown: this.onKeyDown,\n      onMouseUp: function onMouseUp() {\n        _this6.setState({\n          withMouseInteractions: true\n        });\n      },\n      tabIndex: -1,\n      role: \"application\",\n      \"aria-roledescription\": phrases.roleDescription,\n      \"aria-label\": phrases.calendarLabel\n    }), !verticalScrollable && navPosition === _constants.NAV_POSITION_TOP && this.renderNavigation(), _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DayPicker_transitionContainer, shouldAnimateHeight && styles.DayPicker_transitionContainer__horizontal, this.isVertical() && styles.DayPicker_transitionContainer__vertical, verticalScrollable && styles.DayPicker_transitionContainer__verticalScrollable, transitionContainerStyle), {\n      ref: this.setTransitionContainerRef\n    }), verticalScrollable && this.renderNavigation(PREV_NAV), _react[\"default\"].createElement(_CalendarMonthGrid[\"default\"], {\n      setMonthTitleHeight: !monthTitleHeight ? this.setMonthTitleHeight : undefined,\n      translationValue: translationValue,\n      enableOutsideDays: enableOutsideDays,\n      firstVisibleMonthIndex: firstVisibleMonthIndex,\n      initialMonth: currentMonth,\n      isAnimating: isCalendarMonthGridAnimating,\n      modifiers: modifiers,\n      orientation: orientation,\n      numberOfMonths: numberOfMonths * scrollableMonthMultiple,\n      onDayClick: onDayClick,\n      onDayMouseEnter: onDayMouseEnter,\n      onDayMouseLeave: onDayMouseLeave,\n      onMonthChange: this.onMonthChange,\n      onYearChange: this.onYearChange,\n      renderMonthText: renderMonthText,\n      renderCalendarDay: renderCalendarDay,\n      renderDayContents: renderDayContents,\n      renderMonthElement: renderMonthElement,\n      onMonthTransitionEnd: this.updateStateAfterMonthTransition,\n      monthFormat: monthFormat,\n      daySize: daySize,\n      firstDayOfWeek: firstDayOfWeek,\n      isFocused: shouldFocusDate,\n      focusedDate: focusedDate,\n      phrases: phrases,\n      isRTL: isRTL,\n      dayAriaLabelFormat: dayAriaLabelFormat,\n      transitionDuration: transitionDuration,\n      verticalBorderSpacing: verticalBorderSpacing,\n      horizontalMonthPadding: horizontalMonthPadding\n    }), verticalScrollable && this.renderNavigation(NEXT_NAV)), !verticalScrollable && navPosition === _constants.NAV_POSITION_BOTTOM && this.renderNavigation(), !isTouch && !hideKeyboardShortcutsPanel && _react[\"default\"].createElement(_DayPickerKeyboardShortcuts[\"default\"], {\n      block: this.isVertical() && !withPortal,\n      buttonLocation: keyboardShortcutButtonLocation,\n      showKeyboardShortcutsPanel: showKeyboardShortcuts,\n      openKeyboardShortcutsPanel: this.openKeyboardShortcutsPanel,\n      closeKeyboardShortcutsPanel: this.closeKeyboardShortcutsPanel,\n      phrases: phrases,\n      renderKeyboardShortcutsButton: renderKeyboardShortcutsButton,\n      renderKeyboardShortcutsPanel: renderKeyboardShortcutsPanel\n    }))), (calendarInfoPositionBottom || calendarInfoPositionAfter) && calendarInfo));\n  };\n\n  return DayPicker;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports.PureDayPicker = DayPicker;\nDayPicker.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDayPicker.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref4) {\n  var _ref4$reactDates = _ref4.reactDates,\n      color = _ref4$reactDates.color,\n      font = _ref4$reactDates.font,\n      noScrollBarOnVerticalScrollable = _ref4$reactDates.noScrollBarOnVerticalScrollable,\n      spacing = _ref4$reactDates.spacing,\n      zIndex = _ref4$reactDates.zIndex;\n  return {\n    DayPicker: {\n      background: color.background,\n      position: 'relative',\n      textAlign: (0, _noflip[\"default\"])('left')\n    },\n    DayPicker__horizontal: {\n      background: color.background\n    },\n    DayPicker__verticalScrollable: {\n      height: '100%'\n    },\n    DayPicker__hidden: {\n      visibility: 'hidden'\n    },\n    DayPicker__withBorder: {\n      boxShadow: (0, _noflip[\"default\"])('0 2px 6px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.07)'),\n      borderRadius: 3\n    },\n    DayPicker_portal__horizontal: {\n      boxShadow: 'none',\n      position: 'absolute',\n      left: (0, _noflip[\"default\"])('50%'),\n      top: '50%'\n    },\n    DayPicker_portal__vertical: {\n      position: 'initial'\n    },\n    DayPicker_focusRegion: {\n      outline: 'none'\n    },\n    DayPicker_calendarInfo__horizontal: {\n      display: 'inline-block',\n      verticalAlign: 'top'\n    },\n    DayPicker_wrapper__horizontal: {\n      display: 'inline-block',\n      verticalAlign: 'top'\n    },\n    DayPicker_weekHeaders: {\n      position: 'relative'\n    },\n    DayPicker_weekHeaders__horizontal: {\n      marginLeft: (0, _noflip[\"default\"])(spacing.dayPickerHorizontalPadding)\n    },\n    DayPicker_weekHeader: {\n      color: color.placeholderText,\n      position: 'absolute',\n      top: 62,\n      zIndex: zIndex + 2,\n      textAlign: (0, _noflip[\"default\"])('left')\n    },\n    DayPicker_weekHeader__vertical: {\n      left: (0, _noflip[\"default\"])('50%')\n    },\n    DayPicker_weekHeader__verticalScrollable: {\n      top: 0,\n      display: 'table-row',\n      borderBottom: \"1px solid \".concat(color.core.border),\n      background: color.background,\n      marginLeft: (0, _noflip[\"default\"])(0),\n      left: (0, _noflip[\"default\"])(0),\n      width: '100%',\n      textAlign: 'center'\n    },\n    DayPicker_weekHeader_ul: {\n      listStyle: 'none',\n      margin: '1px 0',\n      paddingLeft: (0, _noflip[\"default\"])(0),\n      paddingRight: (0, _noflip[\"default\"])(0),\n      fontSize: font.size\n    },\n    DayPicker_weekHeader_li: {\n      display: 'inline-block',\n      textAlign: 'center'\n    },\n    DayPicker_transitionContainer: {\n      position: 'relative',\n      overflow: 'hidden',\n      borderRadius: 3\n    },\n    DayPicker_transitionContainer__horizontal: {\n      transition: 'height 0.2s ease-in-out'\n    },\n    DayPicker_transitionContainer__vertical: {\n      width: '100%'\n    },\n    DayPicker_transitionContainer__verticalScrollable: _objectSpread({\n      paddingTop: 20,\n      height: '100%',\n      position: 'absolute',\n      top: 0,\n      bottom: 0,\n      right: (0, _noflip[\"default\"])(0),\n      left: (0, _noflip[\"default\"])(0),\n      overflowY: 'scroll'\n    }, noScrollBarOnVerticalScrollable && {\n      '-webkitOverflowScrolling': 'touch',\n      '::-webkit-scrollbar': {\n        '-webkit-appearance': 'none',\n        display: 'none'\n      }\n    })\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(DayPicker);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = getPooledMoment;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar momentPool = new Map();\n\nfunction getPooledMoment(dayString) {\n  if (!momentPool.has(dayString)) {\n    momentPool.set(dayString, (0, _moment[\"default\"])(dayString));\n  }\n\n  return momentPool.get(dayString);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/slicedToArray\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _object = _interopRequireDefault(require(\"object.values\"));\n\nvar _isTouchDevice = _interopRequireDefault(require(\"is-touch-device\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _isInclusivelyAfterDay = _interopRequireDefault(require(\"../utils/isInclusivelyAfterDay\"));\n\nvar _isNextDay = _interopRequireDefault(require(\"../utils/isNextDay\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"../utils/isSameDay\"));\n\nvar _isAfterDay = _interopRequireDefault(require(\"../utils/isAfterDay\"));\n\nvar _isBeforeDay = _interopRequireDefault(require(\"../utils/isBeforeDay\"));\n\nvar _isPreviousDay = _interopRequireDefault(require(\"../utils/isPreviousDay\"));\n\nvar _getVisibleDays = _interopRequireDefault(require(\"../utils/getVisibleDays\"));\n\nvar _isDayVisible = _interopRequireDefault(require(\"../utils/isDayVisible\"));\n\nvar _getSelectedDateOffset = _interopRequireDefault(require(\"../utils/getSelectedDateOffset\"));\n\nvar _toISODateString = _interopRequireDefault(require(\"../utils/toISODateString\"));\n\nvar _modifiers = require(\"../utils/modifiers\");\n\nvar _DisabledShape = _interopRequireDefault(require(\"../shapes/DisabledShape\"));\n\nvar _FocusedInputShape = _interopRequireDefault(require(\"../shapes/FocusedInputShape\"));\n\nvar _ScrollableOrientationShape = _interopRequireDefault(require(\"../shapes/ScrollableOrientationShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"../shapes/DayOfWeekShape\"));\n\nvar _CalendarInfoPositionShape = _interopRequireDefault(require(\"../shapes/CalendarInfoPositionShape\"));\n\nvar _NavPositionShape = _interopRequireDefault(require(\"../shapes/NavPositionShape\"));\n\nvar _constants = require(\"../constants\");\n\nvar _DayPicker = _interopRequireDefault(require(\"./DayPicker\"));\n\nvar _getPooledMoment = _interopRequireDefault(require(\"../utils/getPooledMoment\"));\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)({\n  startDate: _reactMomentProptypes[\"default\"].momentObj,\n  endDate: _reactMomentProptypes[\"default\"].momentObj,\n  onDatesChange: _propTypes[\"default\"].func,\n  startDateOffset: _propTypes[\"default\"].func,\n  endDateOffset: _propTypes[\"default\"].func,\n  minDate: _reactMomentProptypes[\"default\"].momentObj,\n  maxDate: _reactMomentProptypes[\"default\"].momentObj,\n  focusedInput: _FocusedInputShape[\"default\"],\n  onFocusChange: _propTypes[\"default\"].func,\n  onClose: _propTypes[\"default\"].func,\n  keepOpenOnDateSelect: _propTypes[\"default\"].bool,\n  minimumNights: _propTypes[\"default\"].number,\n  disabled: _DisabledShape[\"default\"],\n  isOutsideRange: _propTypes[\"default\"].func,\n  isDayBlocked: _propTypes[\"default\"].func,\n  isDayHighlighted: _propTypes[\"default\"].func,\n  getMinNightsForHoverDate: _propTypes[\"default\"].func,\n  daysViolatingMinNightsCanBeClicked: _propTypes[\"default\"].bool,\n  // DayPicker props\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderWeekHeaderElement: _propTypes[\"default\"].func,\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  numberOfMonths: _propTypes[\"default\"].number,\n  orientation: _ScrollableOrientationShape[\"default\"],\n  withPortal: _propTypes[\"default\"].bool,\n  initialVisibleMonth: _propTypes[\"default\"].func,\n  hideKeyboardShortcutsPanel: _propTypes[\"default\"].bool,\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  noBorder: _propTypes[\"default\"].bool,\n  verticalBorderSpacing: _airbnbPropTypes.nonNegativeInteger,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  dayPickerNavigationInlineStyles: _propTypes[\"default\"].object,\n  navPosition: _NavPositionShape[\"default\"],\n  navPrev: _propTypes[\"default\"].node,\n  navNext: _propTypes[\"default\"].node,\n  renderNavPrevButton: _propTypes[\"default\"].func,\n  renderNavNextButton: _propTypes[\"default\"].func,\n  noNavButtons: _propTypes[\"default\"].bool,\n  noNavNextButton: _propTypes[\"default\"].bool,\n  noNavPrevButton: _propTypes[\"default\"].bool,\n  onPrevMonthClick: _propTypes[\"default\"].func,\n  onNextMonthClick: _propTypes[\"default\"].func,\n  onOutsideClick: _propTypes[\"default\"].func,\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  renderCalendarInfo: _propTypes[\"default\"].func,\n  renderKeyboardShortcutsButton: _propTypes[\"default\"].func,\n  renderKeyboardShortcutsPanel: _propTypes[\"default\"].func,\n  calendarInfoPosition: _CalendarInfoPositionShape[\"default\"],\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  verticalHeight: _airbnbPropTypes.nonNegativeInteger,\n  transitionDuration: _airbnbPropTypes.nonNegativeInteger,\n  // accessibility\n  onBlur: _propTypes[\"default\"].func,\n  isFocused: _propTypes[\"default\"].bool,\n  showKeyboardShortcuts: _propTypes[\"default\"].bool,\n  onTab: _propTypes[\"default\"].func,\n  onShiftTab: _propTypes[\"default\"].func,\n  // i18n\n  monthFormat: _propTypes[\"default\"].string,\n  weekDayFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DayPickerPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string,\n  isRTL: _propTypes[\"default\"].bool\n}) : {};\nvar defaultProps = {\n  startDate: undefined,\n  // TODO: use null\n  endDate: undefined,\n  // TODO: use null\n  minDate: null,\n  maxDate: null,\n  onDatesChange: function onDatesChange() {},\n  startDateOffset: undefined,\n  endDateOffset: undefined,\n  focusedInput: null,\n  onFocusChange: function onFocusChange() {},\n  onClose: function onClose() {},\n  keepOpenOnDateSelect: false,\n  minimumNights: 1,\n  disabled: false,\n  isOutsideRange: function isOutsideRange() {},\n  isDayBlocked: function isDayBlocked() {},\n  isDayHighlighted: function isDayHighlighted() {},\n  getMinNightsForHoverDate: function getMinNightsForHoverDate() {},\n  daysViolatingMinNightsCanBeClicked: false,\n  // DayPicker props\n  renderMonthText: null,\n  renderWeekHeaderElement: null,\n  enableOutsideDays: false,\n  numberOfMonths: 1,\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  withPortal: false,\n  hideKeyboardShortcutsPanel: false,\n  initialVisibleMonth: null,\n  daySize: _constants.DAY_SIZE,\n  dayPickerNavigationInlineStyles: null,\n  navPosition: _constants.NAV_POSITION_TOP,\n  navPrev: null,\n  navNext: null,\n  renderNavPrevButton: null,\n  renderNavNextButton: null,\n  noNavButtons: false,\n  noNavNextButton: false,\n  noNavPrevButton: false,\n  onPrevMonthClick: function onPrevMonthClick() {},\n  onNextMonthClick: function onNextMonthClick() {},\n  onOutsideClick: function onOutsideClick() {},\n  renderCalendarDay: undefined,\n  renderDayContents: null,\n  renderCalendarInfo: null,\n  renderMonthElement: null,\n  renderKeyboardShortcutsButton: undefined,\n  renderKeyboardShortcutsPanel: undefined,\n  calendarInfoPosition: _constants.INFO_POSITION_BOTTOM,\n  firstDayOfWeek: null,\n  verticalHeight: null,\n  noBorder: false,\n  transitionDuration: undefined,\n  verticalBorderSpacing: undefined,\n  horizontalMonthPadding: 13,\n  // accessibility\n  onBlur: function onBlur() {},\n  isFocused: false,\n  showKeyboardShortcuts: false,\n  onTab: function onTab() {},\n  onShiftTab: function onShiftTab() {},\n  // i18n\n  monthFormat: 'MMMM YYYY',\n  weekDayFormat: 'dd',\n  phrases: _defaultPhrases.DayPickerPhrases,\n  dayAriaLabelFormat: undefined,\n  isRTL: false\n};\n\nvar getChooseAvailableDatePhrase = function getChooseAvailableDatePhrase(phrases, focusedInput) {\n  if (focusedInput === _constants.START_DATE) {\n    return phrases.chooseAvailableStartDate;\n  }\n\n  if (focusedInput === _constants.END_DATE) {\n    return phrases.chooseAvailableEndDate;\n  }\n\n  return phrases.chooseAvailableDate;\n};\n\nvar DayPickerRangeController =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DayPickerRangeController, _ref);\n  var _proto = DayPickerRangeController.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DayPickerRangeController(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.isTouchDevice = (0, _isTouchDevice[\"default\"])();\n    _this.today = (0, _moment[\"default\"])();\n    _this.modifiers = {\n      today: function today(day) {\n        return _this.isToday(day);\n      },\n      blocked: function blocked(day) {\n        return _this.isBlocked(day);\n      },\n      'blocked-calendar': function blockedCalendar(day) {\n        return props.isDayBlocked(day);\n      },\n      'blocked-out-of-range': function blockedOutOfRange(day) {\n        return props.isOutsideRange(day);\n      },\n      'highlighted-calendar': function highlightedCalendar(day) {\n        return props.isDayHighlighted(day);\n      },\n      valid: function valid(day) {\n        return !_this.isBlocked(day);\n      },\n      'selected-start': function selectedStart(day) {\n        return _this.isStartDate(day);\n      },\n      'selected-end': function selectedEnd(day) {\n        return _this.isEndDate(day);\n      },\n      'blocked-minimum-nights': function blockedMinimumNights(day) {\n        return _this.doesNotMeetMinimumNights(day);\n      },\n      'selected-span': function selectedSpan(day) {\n        return _this.isInSelectedSpan(day);\n      },\n      'last-in-range': function lastInRange(day) {\n        return _this.isLastInRange(day);\n      },\n      hovered: function hovered(day) {\n        return _this.isHovered(day);\n      },\n      'hovered-span': function hoveredSpan(day) {\n        return _this.isInHoveredSpan(day);\n      },\n      'hovered-offset': function hoveredOffset(day) {\n        return _this.isInHoveredSpan(day);\n      },\n      'after-hovered-start': function afterHoveredStart(day) {\n        return _this.isDayAfterHoveredStartDate(day);\n      },\n      'first-day-of-week': function firstDayOfWeek(day) {\n        return _this.isFirstDayOfWeek(day);\n      },\n      'last-day-of-week': function lastDayOfWeek(day) {\n        return _this.isLastDayOfWeek(day);\n      },\n      'hovered-start-first-possible-end': function hoveredStartFirstPossibleEnd(day, hoverDate) {\n        return _this.isFirstPossibleEndDateForHoveredStartDate(day, hoverDate);\n      },\n      'hovered-start-blocked-minimum-nights': function hoveredStartBlockedMinimumNights(day, hoverDate) {\n        return _this.doesNotMeetMinNightsForHoveredStartDate(day, hoverDate);\n      },\n      'before-hovered-end': function beforeHoveredEnd(day) {\n        return _this.isDayBeforeHoveredEndDate(day);\n      },\n      'no-selected-start-before-selected-end': function noSelectedStartBeforeSelectedEnd(day) {\n        return _this.beforeSelectedEnd(day) && !props.startDate;\n      },\n      'selected-start-in-hovered-span': function selectedStartInHoveredSpan(day, hoverDate) {\n        return _this.isStartDate(day) && (0, _isAfterDay[\"default\"])(hoverDate, day);\n      },\n      'selected-start-no-selected-end': function selectedStartNoSelectedEnd(day) {\n        return _this.isStartDate(day) && !props.endDate;\n      },\n      'selected-end-no-selected-start': function selectedEndNoSelectedStart(day) {\n        return _this.isEndDate(day) && !props.startDate;\n      }\n    };\n\n    var _this$getStateForNewM = _this.getStateForNewMonth(props),\n        currentMonth = _this$getStateForNewM.currentMonth,\n        visibleDays = _this$getStateForNewM.visibleDays; // initialize phrases\n    // set the appropriate CalendarDay phrase based on focusedInput\n\n\n    var chooseAvailableDate = getChooseAvailableDatePhrase(props.phrases, props.focusedInput);\n    _this.state = {\n      hoverDate: null,\n      currentMonth: currentMonth,\n      phrases: _objectSpread({}, props.phrases, {\n        chooseAvailableDate: chooseAvailableDate\n      }),\n      visibleDays: visibleDays,\n      disablePrev: _this.shouldDisableMonthNavigation(props.minDate, currentMonth),\n      disableNext: _this.shouldDisableMonthNavigation(props.maxDate, currentMonth)\n    };\n    _this.onDayClick = _this.onDayClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayMouseEnter = _this.onDayMouseEnter.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayMouseLeave = _this.onDayMouseLeave.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onPrevMonthClick = _this.onPrevMonthClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onNextMonthClick = _this.onNextMonthClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onMonthChange = _this.onMonthChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onYearChange = _this.onYearChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onGetNextScrollableMonths = _this.onGetNextScrollableMonths.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onGetPrevScrollableMonths = _this.onGetPrevScrollableMonths.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.getFirstFocusableDay = _this.getFirstFocusableDay.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var _this2 = this;\n\n    var startDate = nextProps.startDate,\n        endDate = nextProps.endDate,\n        focusedInput = nextProps.focusedInput,\n        getMinNightsForHoverDate = nextProps.getMinNightsForHoverDate,\n        minimumNights = nextProps.minimumNights,\n        isOutsideRange = nextProps.isOutsideRange,\n        isDayBlocked = nextProps.isDayBlocked,\n        isDayHighlighted = nextProps.isDayHighlighted,\n        phrases = nextProps.phrases,\n        initialVisibleMonth = nextProps.initialVisibleMonth,\n        numberOfMonths = nextProps.numberOfMonths,\n        enableOutsideDays = nextProps.enableOutsideDays;\n    var _this$props = this.props,\n        prevStartDate = _this$props.startDate,\n        prevEndDate = _this$props.endDate,\n        prevFocusedInput = _this$props.focusedInput,\n        prevMinimumNights = _this$props.minimumNights,\n        prevIsOutsideRange = _this$props.isOutsideRange,\n        prevIsDayBlocked = _this$props.isDayBlocked,\n        prevIsDayHighlighted = _this$props.isDayHighlighted,\n        prevPhrases = _this$props.phrases,\n        prevInitialVisibleMonth = _this$props.initialVisibleMonth,\n        prevNumberOfMonths = _this$props.numberOfMonths,\n        prevEnableOutsideDays = _this$props.enableOutsideDays;\n    var hoverDate = this.state.hoverDate;\n    var visibleDays = this.state.visibleDays;\n    var recomputeOutsideRange = false;\n    var recomputeDayBlocked = false;\n    var recomputeDayHighlighted = false;\n\n    if (isOutsideRange !== prevIsOutsideRange) {\n      this.modifiers['blocked-out-of-range'] = function (day) {\n        return isOutsideRange(day);\n      };\n\n      recomputeOutsideRange = true;\n    }\n\n    if (isDayBlocked !== prevIsDayBlocked) {\n      this.modifiers['blocked-calendar'] = function (day) {\n        return isDayBlocked(day);\n      };\n\n      recomputeDayBlocked = true;\n    }\n\n    if (isDayHighlighted !== prevIsDayHighlighted) {\n      this.modifiers['highlighted-calendar'] = function (day) {\n        return isDayHighlighted(day);\n      };\n\n      recomputeDayHighlighted = true;\n    }\n\n    var recomputePropModifiers = recomputeOutsideRange || recomputeDayBlocked || recomputeDayHighlighted;\n    var didStartDateChange = startDate !== prevStartDate;\n    var didEndDateChange = endDate !== prevEndDate;\n    var didFocusChange = focusedInput !== prevFocusedInput;\n\n    if (numberOfMonths !== prevNumberOfMonths || enableOutsideDays !== prevEnableOutsideDays || initialVisibleMonth !== prevInitialVisibleMonth && !prevFocusedInput && didFocusChange) {\n      var newMonthState = this.getStateForNewMonth(nextProps);\n      var currentMonth = newMonthState.currentMonth;\n      visibleDays = newMonthState.visibleDays;\n      this.setState({\n        currentMonth: currentMonth,\n        visibleDays: visibleDays\n      });\n    }\n\n    var modifiers = {};\n\n    if (didStartDateChange) {\n      modifiers = this.deleteModifier(modifiers, prevStartDate, 'selected-start');\n      modifiers = this.addModifier(modifiers, startDate, 'selected-start');\n\n      if (prevStartDate) {\n        var startSpan = prevStartDate.clone().add(1, 'day');\n        var endSpan = prevStartDate.clone().add(prevMinimumNights + 1, 'days');\n        modifiers = this.deleteModifierFromRange(modifiers, startSpan, endSpan, 'after-hovered-start');\n\n        if (!endDate || !prevEndDate) {\n          modifiers = this.deleteModifier(modifiers, prevStartDate, 'selected-start-no-selected-end');\n        }\n      }\n\n      if (!prevStartDate && endDate && startDate) {\n        modifiers = this.deleteModifier(modifiers, endDate, 'selected-end-no-selected-start');\n        modifiers = this.deleteModifier(modifiers, endDate, 'selected-end-in-hovered-span');\n        (0, _object[\"default\"])(visibleDays).forEach(function (days) {\n          Object.keys(days).forEach(function (day) {\n            var momentObj = (0, _moment[\"default\"])(day);\n            modifiers = _this2.deleteModifier(modifiers, momentObj, 'no-selected-start-before-selected-end');\n          });\n        });\n      }\n    }\n\n    if (didEndDateChange) {\n      modifiers = this.deleteModifier(modifiers, prevEndDate, 'selected-end');\n      modifiers = this.addModifier(modifiers, endDate, 'selected-end');\n\n      if (prevEndDate && (!startDate || !prevStartDate)) {\n        modifiers = this.deleteModifier(modifiers, prevEndDate, 'selected-end-no-selected-start');\n      }\n    }\n\n    if (didStartDateChange || didEndDateChange) {\n      if (prevStartDate && prevEndDate) {\n        modifiers = this.deleteModifierFromRange(modifiers, prevStartDate, prevEndDate.clone().add(1, 'day'), 'selected-span');\n      }\n\n      if (startDate && endDate) {\n        modifiers = this.deleteModifierFromRange(modifiers, startDate, endDate.clone().add(1, 'day'), 'hovered-span');\n        modifiers = this.addModifierToRange(modifiers, startDate.clone().add(1, 'day'), endDate, 'selected-span');\n      }\n\n      if (startDate && !endDate) {\n        modifiers = this.addModifier(modifiers, startDate, 'selected-start-no-selected-end');\n      }\n\n      if (endDate && !startDate) {\n        modifiers = this.addModifier(modifiers, endDate, 'selected-end-no-selected-start');\n      }\n\n      if (!startDate && endDate) {\n        (0, _object[\"default\"])(visibleDays).forEach(function (days) {\n          Object.keys(days).forEach(function (day) {\n            var momentObj = (0, _moment[\"default\"])(day);\n\n            if ((0, _isBeforeDay[\"default\"])(momentObj, endDate)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'no-selected-start-before-selected-end');\n            }\n          });\n        });\n      }\n    }\n\n    if (!this.isTouchDevice && didStartDateChange && startDate && !endDate) {\n      var _startSpan = startDate.clone().add(1, 'day');\n\n      var _endSpan = startDate.clone().add(minimumNights + 1, 'days');\n\n      modifiers = this.addModifierToRange(modifiers, _startSpan, _endSpan, 'after-hovered-start');\n    }\n\n    if (!this.isTouchDevice && didEndDateChange && !startDate && endDate) {\n      var _startSpan2 = endDate.clone().subtract(minimumNights, 'days');\n\n      var _endSpan2 = endDate.clone();\n\n      modifiers = this.addModifierToRange(modifiers, _startSpan2, _endSpan2, 'before-hovered-end');\n    }\n\n    if (prevMinimumNights > 0) {\n      if (didFocusChange || didStartDateChange || minimumNights !== prevMinimumNights) {\n        var _startSpan3 = prevStartDate || this.today;\n\n        modifiers = this.deleteModifierFromRange(modifiers, _startSpan3, _startSpan3.clone().add(prevMinimumNights, 'days'), 'blocked-minimum-nights');\n        modifiers = this.deleteModifierFromRange(modifiers, _startSpan3, _startSpan3.clone().add(prevMinimumNights, 'days'), 'blocked');\n      }\n    }\n\n    if (didFocusChange || recomputePropModifiers) {\n      (0, _object[\"default\"])(visibleDays).forEach(function (days) {\n        Object.keys(days).forEach(function (day) {\n          var momentObj = (0, _getPooledMoment[\"default\"])(day);\n          var isBlocked = false;\n\n          if (didFocusChange || recomputeOutsideRange) {\n            if (isOutsideRange(momentObj)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'blocked-out-of-range');\n              isBlocked = true;\n            } else {\n              modifiers = _this2.deleteModifier(modifiers, momentObj, 'blocked-out-of-range');\n            }\n          }\n\n          if (didFocusChange || recomputeDayBlocked) {\n            if (isDayBlocked(momentObj)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'blocked-calendar');\n              isBlocked = true;\n            } else {\n              modifiers = _this2.deleteModifier(modifiers, momentObj, 'blocked-calendar');\n            }\n          }\n\n          if (isBlocked) {\n            modifiers = _this2.addModifier(modifiers, momentObj, 'blocked');\n          } else {\n            modifiers = _this2.deleteModifier(modifiers, momentObj, 'blocked');\n          }\n\n          if (didFocusChange || recomputeDayHighlighted) {\n            if (isDayHighlighted(momentObj)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'highlighted-calendar');\n            } else {\n              modifiers = _this2.deleteModifier(modifiers, momentObj, 'highlighted-calendar');\n            }\n          }\n        });\n      });\n    }\n\n    if (!this.isTouchDevice && didFocusChange && hoverDate && !this.isBlocked(hoverDate)) {\n      var minNightsForHoverDate = getMinNightsForHoverDate(hoverDate);\n\n      if (minNightsForHoverDate > 0 && focusedInput === _constants.END_DATE) {\n        modifiers = this.deleteModifierFromRange(modifiers, hoverDate.clone().add(1, 'days'), hoverDate.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-blocked-minimum-nights');\n        modifiers = this.deleteModifier(modifiers, hoverDate.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-first-possible-end');\n      }\n\n      if (minNightsForHoverDate > 0 && focusedInput === _constants.START_DATE) {\n        modifiers = this.addModifierToRange(modifiers, hoverDate.clone().add(1, 'days'), hoverDate.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-blocked-minimum-nights');\n        modifiers = this.addModifier(modifiers, hoverDate.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-first-possible-end');\n      }\n    }\n\n    if (minimumNights > 0 && startDate && focusedInput === _constants.END_DATE) {\n      modifiers = this.addModifierToRange(modifiers, startDate, startDate.clone().add(minimumNights, 'days'), 'blocked-minimum-nights');\n      modifiers = this.addModifierToRange(modifiers, startDate, startDate.clone().add(minimumNights, 'days'), 'blocked');\n    }\n\n    var today = (0, _moment[\"default\"])();\n\n    if (!(0, _isSameDay[\"default\"])(this.today, today)) {\n      modifiers = this.deleteModifier(modifiers, this.today, 'today');\n      modifiers = this.addModifier(modifiers, today, 'today');\n      this.today = today;\n    }\n\n    if (Object.keys(modifiers).length > 0) {\n      this.setState({\n        visibleDays: _objectSpread({}, visibleDays, {}, modifiers)\n      });\n    }\n\n    if (didFocusChange || phrases !== prevPhrases) {\n      // set the appropriate CalendarDay phrase based on focusedInput\n      var chooseAvailableDate = getChooseAvailableDatePhrase(phrases, focusedInput);\n      this.setState({\n        phrases: _objectSpread({}, phrases, {\n          chooseAvailableDate: chooseAvailableDate\n        })\n      });\n    }\n  };\n\n  _proto.onDayClick = function onDayClick(day, e) {\n    var _this$props2 = this.props,\n        keepOpenOnDateSelect = _this$props2.keepOpenOnDateSelect,\n        minimumNights = _this$props2.minimumNights,\n        onBlur = _this$props2.onBlur,\n        focusedInput = _this$props2.focusedInput,\n        onFocusChange = _this$props2.onFocusChange,\n        onClose = _this$props2.onClose,\n        onDatesChange = _this$props2.onDatesChange,\n        startDateOffset = _this$props2.startDateOffset,\n        endDateOffset = _this$props2.endDateOffset,\n        disabled = _this$props2.disabled,\n        daysViolatingMinNightsCanBeClicked = _this$props2.daysViolatingMinNightsCanBeClicked;\n    if (e) e.preventDefault();\n    if (this.isBlocked(day, !daysViolatingMinNightsCanBeClicked)) return;\n    var _this$props3 = this.props,\n        startDate = _this$props3.startDate,\n        endDate = _this$props3.endDate;\n\n    if (startDateOffset || endDateOffset) {\n      startDate = (0, _getSelectedDateOffset[\"default\"])(startDateOffset, day);\n      endDate = (0, _getSelectedDateOffset[\"default\"])(endDateOffset, day);\n\n      if (this.isBlocked(startDate) || this.isBlocked(endDate)) {\n        return;\n      }\n\n      onDatesChange({\n        startDate: startDate,\n        endDate: endDate\n      });\n\n      if (!keepOpenOnDateSelect) {\n        onFocusChange(null);\n        onClose({\n          startDate: startDate,\n          endDate: endDate\n        });\n      }\n    } else if (focusedInput === _constants.START_DATE) {\n      var lastAllowedStartDate = endDate && endDate.clone().subtract(minimumNights, 'days');\n      var isStartDateAfterEndDate = (0, _isBeforeDay[\"default\"])(lastAllowedStartDate, day) || (0, _isAfterDay[\"default\"])(startDate, endDate);\n      var isEndDateDisabled = disabled === _constants.END_DATE;\n\n      if (!isEndDateDisabled || !isStartDateAfterEndDate) {\n        startDate = day;\n\n        if (isStartDateAfterEndDate) {\n          endDate = null;\n        }\n      }\n\n      onDatesChange({\n        startDate: startDate,\n        endDate: endDate\n      });\n\n      if (isEndDateDisabled && !isStartDateAfterEndDate) {\n        onFocusChange(null);\n        onClose({\n          startDate: startDate,\n          endDate: endDate\n        });\n      } else if (!isEndDateDisabled) {\n        onFocusChange(_constants.END_DATE);\n      }\n    } else if (focusedInput === _constants.END_DATE) {\n      var firstAllowedEndDate = startDate && startDate.clone().add(minimumNights, 'days');\n\n      if (!startDate) {\n        endDate = day;\n        onDatesChange({\n          startDate: startDate,\n          endDate: endDate\n        });\n        onFocusChange(_constants.START_DATE);\n      } else if ((0, _isInclusivelyAfterDay[\"default\"])(day, firstAllowedEndDate)) {\n        endDate = day;\n        onDatesChange({\n          startDate: startDate,\n          endDate: endDate\n        });\n\n        if (!keepOpenOnDateSelect) {\n          onFocusChange(null);\n          onClose({\n            startDate: startDate,\n            endDate: endDate\n          });\n        }\n      } else if (daysViolatingMinNightsCanBeClicked && this.doesNotMeetMinimumNights(day)) {\n        endDate = day;\n        onDatesChange({\n          startDate: startDate,\n          endDate: endDate\n        });\n      } else if (disabled !== _constants.START_DATE) {\n        startDate = day;\n        endDate = null;\n        onDatesChange({\n          startDate: startDate,\n          endDate: endDate\n        });\n      } else {\n        onDatesChange({\n          startDate: startDate,\n          endDate: endDate\n        });\n      }\n    } else {\n      onDatesChange({\n        startDate: startDate,\n        endDate: endDate\n      });\n    }\n\n    onBlur();\n  };\n\n  _proto.onDayMouseEnter = function onDayMouseEnter(day) {\n    /* eslint react/destructuring-assignment: 1 */\n    if (this.isTouchDevice) return;\n    var _this$props4 = this.props,\n        startDate = _this$props4.startDate,\n        endDate = _this$props4.endDate,\n        focusedInput = _this$props4.focusedInput,\n        getMinNightsForHoverDate = _this$props4.getMinNightsForHoverDate,\n        minimumNights = _this$props4.minimumNights,\n        startDateOffset = _this$props4.startDateOffset,\n        endDateOffset = _this$props4.endDateOffset;\n    var _this$state = this.state,\n        hoverDate = _this$state.hoverDate,\n        visibleDays = _this$state.visibleDays,\n        dateOffset = _this$state.dateOffset;\n    var nextDateOffset = null;\n\n    if (focusedInput) {\n      var hasOffset = startDateOffset || endDateOffset;\n      var modifiers = {};\n\n      if (hasOffset) {\n        var start = (0, _getSelectedDateOffset[\"default\"])(startDateOffset, day);\n        var end = (0, _getSelectedDateOffset[\"default\"])(endDateOffset, day, function (rangeDay) {\n          return rangeDay.add(1, 'day');\n        });\n        nextDateOffset = {\n          start: start,\n          end: end\n        }; // eslint-disable-next-line react/destructuring-assignment\n\n        if (dateOffset && dateOffset.start && dateOffset.end) {\n          modifiers = this.deleteModifierFromRange(modifiers, dateOffset.start, dateOffset.end, 'hovered-offset');\n        }\n\n        modifiers = this.addModifierToRange(modifiers, start, end, 'hovered-offset');\n      }\n\n      if (!hasOffset) {\n        modifiers = this.deleteModifier(modifiers, hoverDate, 'hovered');\n        modifiers = this.addModifier(modifiers, day, 'hovered');\n\n        if (startDate && !endDate && focusedInput === _constants.END_DATE) {\n          if ((0, _isAfterDay[\"default\"])(hoverDate, startDate)) {\n            var endSpan = hoverDate.clone().add(1, 'day');\n            modifiers = this.deleteModifierFromRange(modifiers, startDate, endSpan, 'hovered-span');\n          }\n\n          if ((0, _isBeforeDay[\"default\"])(day, startDate) || (0, _isSameDay[\"default\"])(day, startDate)) {\n            modifiers = this.deleteModifier(modifiers, startDate, 'selected-start-in-hovered-span');\n          }\n\n          if (!this.isBlocked(day) && (0, _isAfterDay[\"default\"])(day, startDate)) {\n            var _endSpan3 = day.clone().add(1, 'day');\n\n            modifiers = this.addModifierToRange(modifiers, startDate, _endSpan3, 'hovered-span');\n            modifiers = this.addModifier(modifiers, startDate, 'selected-start-in-hovered-span');\n          }\n        }\n\n        if (!startDate && endDate && focusedInput === _constants.START_DATE) {\n          if ((0, _isBeforeDay[\"default\"])(hoverDate, endDate)) {\n            modifiers = this.deleteModifierFromRange(modifiers, hoverDate, endDate, 'hovered-span');\n          }\n\n          if ((0, _isAfterDay[\"default\"])(day, endDate) || (0, _isSameDay[\"default\"])(day, endDate)) {\n            modifiers = this.deleteModifier(modifiers, endDate, 'selected-end-in-hovered-span');\n          }\n\n          if (!this.isBlocked(day) && (0, _isBeforeDay[\"default\"])(day, endDate)) {\n            modifiers = this.addModifierToRange(modifiers, day, endDate, 'hovered-span');\n            modifiers = this.addModifier(modifiers, endDate, 'selected-end-in-hovered-span');\n          }\n        }\n\n        if (startDate) {\n          var startSpan = startDate.clone().add(1, 'day');\n\n          var _endSpan4 = startDate.clone().add(minimumNights + 1, 'days');\n\n          modifiers = this.deleteModifierFromRange(modifiers, startSpan, _endSpan4, 'after-hovered-start');\n\n          if ((0, _isSameDay[\"default\"])(day, startDate)) {\n            var newStartSpan = startDate.clone().add(1, 'day');\n            var newEndSpan = startDate.clone().add(minimumNights + 1, 'days');\n            modifiers = this.addModifierToRange(modifiers, newStartSpan, newEndSpan, 'after-hovered-start');\n          }\n        }\n\n        if (endDate) {\n          var _startSpan4 = endDate.clone().subtract(minimumNights, 'days');\n\n          modifiers = this.deleteModifierFromRange(modifiers, _startSpan4, endDate, 'before-hovered-end');\n\n          if ((0, _isSameDay[\"default\"])(day, endDate)) {\n            var _newStartSpan = endDate.clone().subtract(minimumNights, 'days');\n\n            modifiers = this.addModifierToRange(modifiers, _newStartSpan, endDate, 'before-hovered-end');\n          }\n        }\n\n        if (hoverDate && !this.isBlocked(hoverDate)) {\n          var minNightsForPrevHoverDate = getMinNightsForHoverDate(hoverDate);\n\n          if (minNightsForPrevHoverDate > 0 && focusedInput === _constants.START_DATE) {\n            modifiers = this.deleteModifierFromRange(modifiers, hoverDate.clone().add(1, 'days'), hoverDate.clone().add(minNightsForPrevHoverDate, 'days'), 'hovered-start-blocked-minimum-nights');\n            modifiers = this.deleteModifier(modifiers, hoverDate.clone().add(minNightsForPrevHoverDate, 'days'), 'hovered-start-first-possible-end');\n          }\n        }\n\n        if (!this.isBlocked(day)) {\n          var minNightsForHoverDate = getMinNightsForHoverDate(day);\n\n          if (minNightsForHoverDate > 0 && focusedInput === _constants.START_DATE) {\n            modifiers = this.addModifierToRange(modifiers, day.clone().add(1, 'days'), day.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-blocked-minimum-nights');\n            modifiers = this.addModifier(modifiers, day.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-first-possible-end');\n          }\n        }\n      }\n\n      this.setState({\n        hoverDate: day,\n        dateOffset: nextDateOffset,\n        visibleDays: _objectSpread({}, visibleDays, {}, modifiers)\n      });\n    }\n  };\n\n  _proto.onDayMouseLeave = function onDayMouseLeave(day) {\n    var _this$props5 = this.props,\n        startDate = _this$props5.startDate,\n        endDate = _this$props5.endDate,\n        focusedInput = _this$props5.focusedInput,\n        getMinNightsForHoverDate = _this$props5.getMinNightsForHoverDate,\n        minimumNights = _this$props5.minimumNights;\n    var _this$state2 = this.state,\n        hoverDate = _this$state2.hoverDate,\n        visibleDays = _this$state2.visibleDays,\n        dateOffset = _this$state2.dateOffset;\n    if (this.isTouchDevice || !hoverDate) return;\n    var modifiers = {};\n    modifiers = this.deleteModifier(modifiers, hoverDate, 'hovered');\n\n    if (dateOffset) {\n      modifiers = this.deleteModifierFromRange(modifiers, dateOffset.start, dateOffset.end, 'hovered-offset');\n    }\n\n    if (startDate && !endDate) {\n      if ((0, _isAfterDay[\"default\"])(hoverDate, startDate)) {\n        var endSpan = hoverDate.clone().add(1, 'day');\n        modifiers = this.deleteModifierFromRange(modifiers, startDate, endSpan, 'hovered-span');\n      }\n\n      if ((0, _isAfterDay[\"default\"])(day, startDate)) {\n        modifiers = this.deleteModifier(modifiers, startDate, 'selected-start-in-hovered-span');\n      }\n    }\n\n    if (!startDate && endDate) {\n      if ((0, _isAfterDay[\"default\"])(endDate, hoverDate)) {\n        modifiers = this.deleteModifierFromRange(modifiers, hoverDate, endDate, 'hovered-span');\n      }\n\n      if ((0, _isBeforeDay[\"default\"])(day, endDate)) {\n        modifiers = this.deleteModifier(modifiers, endDate, 'selected-end-in-hovered-span');\n      }\n    }\n\n    if (startDate && (0, _isSameDay[\"default\"])(day, startDate)) {\n      var startSpan = startDate.clone().add(1, 'day');\n\n      var _endSpan5 = startDate.clone().add(minimumNights + 1, 'days');\n\n      modifiers = this.deleteModifierFromRange(modifiers, startSpan, _endSpan5, 'after-hovered-start');\n    }\n\n    if (endDate && (0, _isSameDay[\"default\"])(day, endDate)) {\n      var _startSpan5 = endDate.clone().subtract(minimumNights, 'days');\n\n      modifiers = this.deleteModifierFromRange(modifiers, _startSpan5, endDate, 'before-hovered-end');\n    }\n\n    if (!this.isBlocked(hoverDate)) {\n      var minNightsForHoverDate = getMinNightsForHoverDate(hoverDate);\n\n      if (minNightsForHoverDate > 0 && focusedInput === _constants.START_DATE) {\n        modifiers = this.deleteModifierFromRange(modifiers, hoverDate.clone().add(1, 'days'), hoverDate.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-blocked-minimum-nights');\n        modifiers = this.deleteModifier(modifiers, hoverDate.clone().add(minNightsForHoverDate, 'days'), 'hovered-start-first-possible-end');\n      }\n    }\n\n    this.setState({\n      hoverDate: null,\n      visibleDays: _objectSpread({}, visibleDays, {}, modifiers)\n    });\n  };\n\n  _proto.onPrevMonthClick = function onPrevMonthClick() {\n    var _this$props6 = this.props,\n        enableOutsideDays = _this$props6.enableOutsideDays,\n        maxDate = _this$props6.maxDate,\n        minDate = _this$props6.minDate,\n        numberOfMonths = _this$props6.numberOfMonths,\n        onPrevMonthClick = _this$props6.onPrevMonthClick;\n    var _this$state3 = this.state,\n        currentMonth = _this$state3.currentMonth,\n        visibleDays = _this$state3.visibleDays;\n    var newVisibleDays = {};\n    Object.keys(visibleDays).sort().slice(0, numberOfMonths + 1).forEach(function (month) {\n      newVisibleDays[month] = visibleDays[month];\n    });\n    var prevMonth = currentMonth.clone().subtract(2, 'months');\n    var prevMonthVisibleDays = (0, _getVisibleDays[\"default\"])(prevMonth, 1, enableOutsideDays, true);\n    var newCurrentMonth = currentMonth.clone().subtract(1, 'month');\n    this.setState({\n      currentMonth: newCurrentMonth,\n      disablePrev: this.shouldDisableMonthNavigation(minDate, newCurrentMonth),\n      disableNext: this.shouldDisableMonthNavigation(maxDate, newCurrentMonth),\n      visibleDays: _objectSpread({}, newVisibleDays, {}, this.getModifiers(prevMonthVisibleDays))\n    }, function () {\n      onPrevMonthClick(newCurrentMonth.clone());\n    });\n  };\n\n  _proto.onNextMonthClick = function onNextMonthClick() {\n    var _this$props7 = this.props,\n        enableOutsideDays = _this$props7.enableOutsideDays,\n        maxDate = _this$props7.maxDate,\n        minDate = _this$props7.minDate,\n        numberOfMonths = _this$props7.numberOfMonths,\n        onNextMonthClick = _this$props7.onNextMonthClick;\n    var _this$state4 = this.state,\n        currentMonth = _this$state4.currentMonth,\n        visibleDays = _this$state4.visibleDays;\n    var newVisibleDays = {};\n    Object.keys(visibleDays).sort().slice(1).forEach(function (month) {\n      newVisibleDays[month] = visibleDays[month];\n    });\n    var nextMonth = currentMonth.clone().add(numberOfMonths + 1, 'month');\n    var nextMonthVisibleDays = (0, _getVisibleDays[\"default\"])(nextMonth, 1, enableOutsideDays, true);\n    var newCurrentMonth = currentMonth.clone().add(1, 'month');\n    this.setState({\n      currentMonth: newCurrentMonth,\n      disablePrev: this.shouldDisableMonthNavigation(minDate, newCurrentMonth),\n      disableNext: this.shouldDisableMonthNavigation(maxDate, newCurrentMonth),\n      visibleDays: _objectSpread({}, newVisibleDays, {}, this.getModifiers(nextMonthVisibleDays))\n    }, function () {\n      onNextMonthClick(newCurrentMonth.clone());\n    });\n  };\n\n  _proto.onMonthChange = function onMonthChange(newMonth) {\n    var _this$props8 = this.props,\n        numberOfMonths = _this$props8.numberOfMonths,\n        enableOutsideDays = _this$props8.enableOutsideDays,\n        orientation = _this$props8.orientation;\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(newMonth, numberOfMonths, enableOutsideDays, withoutTransitionMonths);\n    this.setState({\n      currentMonth: newMonth.clone(),\n      visibleDays: this.getModifiers(newVisibleDays)\n    });\n  };\n\n  _proto.onYearChange = function onYearChange(newMonth) {\n    var _this$props9 = this.props,\n        numberOfMonths = _this$props9.numberOfMonths,\n        enableOutsideDays = _this$props9.enableOutsideDays,\n        orientation = _this$props9.orientation;\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(newMonth, numberOfMonths, enableOutsideDays, withoutTransitionMonths);\n    this.setState({\n      currentMonth: newMonth.clone(),\n      visibleDays: this.getModifiers(newVisibleDays)\n    });\n  };\n\n  _proto.onGetNextScrollableMonths = function onGetNextScrollableMonths() {\n    var _this$props10 = this.props,\n        numberOfMonths = _this$props10.numberOfMonths,\n        enableOutsideDays = _this$props10.enableOutsideDays;\n    var _this$state5 = this.state,\n        currentMonth = _this$state5.currentMonth,\n        visibleDays = _this$state5.visibleDays;\n    var numberOfVisibleMonths = Object.keys(visibleDays).length;\n    var nextMonth = currentMonth.clone().add(numberOfVisibleMonths, 'month');\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(nextMonth, numberOfMonths, enableOutsideDays, true);\n    this.setState({\n      visibleDays: _objectSpread({}, visibleDays, {}, this.getModifiers(newVisibleDays))\n    });\n  };\n\n  _proto.onGetPrevScrollableMonths = function onGetPrevScrollableMonths() {\n    var _this$props11 = this.props,\n        numberOfMonths = _this$props11.numberOfMonths,\n        enableOutsideDays = _this$props11.enableOutsideDays;\n    var _this$state6 = this.state,\n        currentMonth = _this$state6.currentMonth,\n        visibleDays = _this$state6.visibleDays;\n    var firstPreviousMonth = currentMonth.clone().subtract(numberOfMonths, 'month');\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(firstPreviousMonth, numberOfMonths, enableOutsideDays, true);\n    this.setState({\n      currentMonth: firstPreviousMonth.clone(),\n      visibleDays: _objectSpread({}, visibleDays, {}, this.getModifiers(newVisibleDays))\n    });\n  };\n\n  _proto.getFirstFocusableDay = function getFirstFocusableDay(newMonth) {\n    var _this3 = this;\n\n    var _this$props12 = this.props,\n        startDate = _this$props12.startDate,\n        endDate = _this$props12.endDate,\n        focusedInput = _this$props12.focusedInput,\n        minimumNights = _this$props12.minimumNights,\n        numberOfMonths = _this$props12.numberOfMonths;\n    var focusedDate = newMonth.clone().startOf('month');\n\n    if (focusedInput === _constants.START_DATE && startDate) {\n      focusedDate = startDate.clone();\n    } else if (focusedInput === _constants.END_DATE && !endDate && startDate) {\n      focusedDate = startDate.clone().add(minimumNights, 'days');\n    } else if (focusedInput === _constants.END_DATE && endDate) {\n      focusedDate = endDate.clone();\n    }\n\n    if (this.isBlocked(focusedDate)) {\n      var days = [];\n      var lastVisibleDay = newMonth.clone().add(numberOfMonths - 1, 'months').endOf('month');\n      var currentDay = focusedDate.clone();\n\n      while (!(0, _isAfterDay[\"default\"])(currentDay, lastVisibleDay)) {\n        currentDay = currentDay.clone().add(1, 'day');\n        days.push(currentDay);\n      }\n\n      var viableDays = days.filter(function (day) {\n        return !_this3.isBlocked(day);\n      });\n\n      if (viableDays.length > 0) {\n        var _viableDays = (0, _slicedToArray2[\"default\"])(viableDays, 1);\n\n        focusedDate = _viableDays[0];\n      }\n    }\n\n    return focusedDate;\n  };\n\n  _proto.getModifiers = function getModifiers(visibleDays) {\n    var _this4 = this;\n\n    var modifiers = {};\n    Object.keys(visibleDays).forEach(function (month) {\n      modifiers[month] = {};\n      visibleDays[month].forEach(function (day) {\n        modifiers[month][(0, _toISODateString[\"default\"])(day)] = _this4.getModifiersForDay(day);\n      });\n    });\n    return modifiers;\n  };\n\n  _proto.getModifiersForDay = function getModifiersForDay(day) {\n    var _this5 = this;\n\n    return new Set(Object.keys(this.modifiers).filter(function (modifier) {\n      return _this5.modifiers[modifier](day);\n    }));\n  };\n\n  _proto.getStateForNewMonth = function getStateForNewMonth(nextProps) {\n    var _this6 = this;\n\n    var initialVisibleMonth = nextProps.initialVisibleMonth,\n        numberOfMonths = nextProps.numberOfMonths,\n        enableOutsideDays = nextProps.enableOutsideDays,\n        orientation = nextProps.orientation,\n        startDate = nextProps.startDate;\n    var initialVisibleMonthThunk = initialVisibleMonth || (startDate ? function () {\n      return startDate;\n    } : function () {\n      return _this6.today;\n    });\n    var currentMonth = initialVisibleMonthThunk();\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var visibleDays = this.getModifiers((0, _getVisibleDays[\"default\"])(currentMonth, numberOfMonths, enableOutsideDays, withoutTransitionMonths));\n    return {\n      currentMonth: currentMonth,\n      visibleDays: visibleDays\n    };\n  };\n\n  _proto.shouldDisableMonthNavigation = function shouldDisableMonthNavigation(date, visibleMonth) {\n    if (!date) return false;\n    var _this$props13 = this.props,\n        numberOfMonths = _this$props13.numberOfMonths,\n        enableOutsideDays = _this$props13.enableOutsideDays;\n    return (0, _isDayVisible[\"default\"])(date, visibleMonth, numberOfMonths, enableOutsideDays);\n  };\n\n  _proto.addModifier = function addModifier(updatedDays, day, modifier) {\n    return (0, _modifiers.addModifier)(updatedDays, day, modifier, this.props, this.state);\n  };\n\n  _proto.addModifierToRange = function addModifierToRange(updatedDays, start, end, modifier) {\n    var days = updatedDays;\n    var spanStart = start.clone();\n\n    while ((0, _isBeforeDay[\"default\"])(spanStart, end)) {\n      days = this.addModifier(days, spanStart, modifier);\n      spanStart = spanStart.clone().add(1, 'day');\n    }\n\n    return days;\n  };\n\n  _proto.deleteModifier = function deleteModifier(updatedDays, day, modifier) {\n    return (0, _modifiers.deleteModifier)(updatedDays, day, modifier, this.props, this.state);\n  };\n\n  _proto.deleteModifierFromRange = function deleteModifierFromRange(updatedDays, start, end, modifier) {\n    var days = updatedDays;\n    var spanStart = start.clone();\n\n    while ((0, _isBeforeDay[\"default\"])(spanStart, end)) {\n      days = this.deleteModifier(days, spanStart, modifier);\n      spanStart = spanStart.clone().add(1, 'day');\n    }\n\n    return days;\n  };\n\n  _proto.doesNotMeetMinimumNights = function doesNotMeetMinimumNights(day) {\n    var _this$props14 = this.props,\n        startDate = _this$props14.startDate,\n        isOutsideRange = _this$props14.isOutsideRange,\n        focusedInput = _this$props14.focusedInput,\n        minimumNights = _this$props14.minimumNights;\n    if (focusedInput !== _constants.END_DATE) return false;\n\n    if (startDate) {\n      var dayDiff = day.diff(startDate.clone().startOf('day').hour(12), 'days');\n      return dayDiff < minimumNights && dayDiff >= 0;\n    }\n\n    return isOutsideRange((0, _moment[\"default\"])(day).subtract(minimumNights, 'days'));\n  };\n\n  _proto.doesNotMeetMinNightsForHoveredStartDate = function doesNotMeetMinNightsForHoveredStartDate(day, hoverDate) {\n    var _this$props15 = this.props,\n        focusedInput = _this$props15.focusedInput,\n        getMinNightsForHoverDate = _this$props15.getMinNightsForHoverDate;\n    if (focusedInput !== _constants.END_DATE) return false;\n\n    if (hoverDate && !this.isBlocked(hoverDate)) {\n      var minNights = getMinNightsForHoverDate(hoverDate);\n      var dayDiff = day.diff(hoverDate.clone().startOf('day').hour(12), 'days');\n      return dayDiff < minNights && dayDiff >= 0;\n    }\n\n    return false;\n  };\n\n  _proto.isDayAfterHoveredStartDate = function isDayAfterHoveredStartDate(day) {\n    var _this$props16 = this.props,\n        startDate = _this$props16.startDate,\n        endDate = _this$props16.endDate,\n        minimumNights = _this$props16.minimumNights;\n\n    var _ref2 = this.state || {},\n        hoverDate = _ref2.hoverDate;\n\n    return !!startDate && !endDate && !this.isBlocked(day) && (0, _isNextDay[\"default\"])(hoverDate, day) && minimumNights > 0 && (0, _isSameDay[\"default\"])(hoverDate, startDate);\n  };\n\n  _proto.isEndDate = function isEndDate(day) {\n    var endDate = this.props.endDate;\n    return (0, _isSameDay[\"default\"])(day, endDate);\n  };\n\n  _proto.isHovered = function isHovered(day) {\n    var _ref3 = this.state || {},\n        hoverDate = _ref3.hoverDate;\n\n    var focusedInput = this.props.focusedInput;\n    return !!focusedInput && (0, _isSameDay[\"default\"])(day, hoverDate);\n  };\n\n  _proto.isInHoveredSpan = function isInHoveredSpan(day) {\n    var _this$props17 = this.props,\n        startDate = _this$props17.startDate,\n        endDate = _this$props17.endDate;\n\n    var _ref4 = this.state || {},\n        hoverDate = _ref4.hoverDate;\n\n    var isForwardRange = !!startDate && !endDate && (day.isBetween(startDate, hoverDate) || (0, _isSameDay[\"default\"])(hoverDate, day));\n    var isBackwardRange = !!endDate && !startDate && (day.isBetween(hoverDate, endDate) || (0, _isSameDay[\"default\"])(hoverDate, day));\n    var isValidDayHovered = hoverDate && !this.isBlocked(hoverDate);\n    return (isForwardRange || isBackwardRange) && isValidDayHovered;\n  };\n\n  _proto.isInSelectedSpan = function isInSelectedSpan(day) {\n    var _this$props18 = this.props,\n        startDate = _this$props18.startDate,\n        endDate = _this$props18.endDate;\n    return day.isBetween(startDate, endDate, 'days');\n  };\n\n  _proto.isLastInRange = function isLastInRange(day) {\n    var endDate = this.props.endDate;\n    return this.isInSelectedSpan(day) && (0, _isNextDay[\"default\"])(day, endDate);\n  };\n\n  _proto.isStartDate = function isStartDate(day) {\n    var startDate = this.props.startDate;\n    return (0, _isSameDay[\"default\"])(day, startDate);\n  };\n\n  _proto.isBlocked = function isBlocked(day) {\n    var blockDaysViolatingMinNights = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var _this$props19 = this.props,\n        isDayBlocked = _this$props19.isDayBlocked,\n        isOutsideRange = _this$props19.isOutsideRange;\n    return isDayBlocked(day) || isOutsideRange(day) || blockDaysViolatingMinNights && this.doesNotMeetMinimumNights(day);\n  };\n\n  _proto.isToday = function isToday(day) {\n    return (0, _isSameDay[\"default\"])(day, this.today);\n  };\n\n  _proto.isFirstDayOfWeek = function isFirstDayOfWeek(day) {\n    var firstDayOfWeek = this.props.firstDayOfWeek;\n    return day.day() === (firstDayOfWeek || _moment[\"default\"].localeData().firstDayOfWeek());\n  };\n\n  _proto.isLastDayOfWeek = function isLastDayOfWeek(day) {\n    var firstDayOfWeek = this.props.firstDayOfWeek;\n    return day.day() === ((firstDayOfWeek || _moment[\"default\"].localeData().firstDayOfWeek()) + 6) % 7;\n  };\n\n  _proto.isFirstPossibleEndDateForHoveredStartDate = function isFirstPossibleEndDateForHoveredStartDate(day, hoverDate) {\n    var _this$props20 = this.props,\n        focusedInput = _this$props20.focusedInput,\n        getMinNightsForHoverDate = _this$props20.getMinNightsForHoverDate;\n    if (focusedInput !== _constants.END_DATE || !hoverDate || this.isBlocked(hoverDate)) return false;\n    var minNights = getMinNightsForHoverDate(hoverDate);\n    var firstAvailableEndDate = hoverDate.clone().add(minNights, 'days');\n    return (0, _isSameDay[\"default\"])(day, firstAvailableEndDate);\n  };\n\n  _proto.beforeSelectedEnd = function beforeSelectedEnd(day) {\n    var endDate = this.props.endDate;\n    return (0, _isBeforeDay[\"default\"])(day, endDate);\n  };\n\n  _proto.isDayBeforeHoveredEndDate = function isDayBeforeHoveredEndDate(day) {\n    var _this$props21 = this.props,\n        startDate = _this$props21.startDate,\n        endDate = _this$props21.endDate,\n        minimumNights = _this$props21.minimumNights;\n\n    var _ref5 = this.state || {},\n        hoverDate = _ref5.hoverDate;\n\n    return !!endDate && !startDate && !this.isBlocked(day) && (0, _isPreviousDay[\"default\"])(hoverDate, day) && minimumNights > 0 && (0, _isSameDay[\"default\"])(hoverDate, endDate);\n  };\n\n  _proto.render = function render() {\n    var _this$props22 = this.props,\n        numberOfMonths = _this$props22.numberOfMonths,\n        orientation = _this$props22.orientation,\n        monthFormat = _this$props22.monthFormat,\n        renderMonthText = _this$props22.renderMonthText,\n        renderWeekHeaderElement = _this$props22.renderWeekHeaderElement,\n        dayPickerNavigationInlineStyles = _this$props22.dayPickerNavigationInlineStyles,\n        navPosition = _this$props22.navPosition,\n        navPrev = _this$props22.navPrev,\n        navNext = _this$props22.navNext,\n        renderNavPrevButton = _this$props22.renderNavPrevButton,\n        renderNavNextButton = _this$props22.renderNavNextButton,\n        noNavButtons = _this$props22.noNavButtons,\n        noNavNextButton = _this$props22.noNavNextButton,\n        noNavPrevButton = _this$props22.noNavPrevButton,\n        onOutsideClick = _this$props22.onOutsideClick,\n        withPortal = _this$props22.withPortal,\n        enableOutsideDays = _this$props22.enableOutsideDays,\n        firstDayOfWeek = _this$props22.firstDayOfWeek,\n        renderKeyboardShortcutsButton = _this$props22.renderKeyboardShortcutsButton,\n        renderKeyboardShortcutsPanel = _this$props22.renderKeyboardShortcutsPanel,\n        hideKeyboardShortcutsPanel = _this$props22.hideKeyboardShortcutsPanel,\n        daySize = _this$props22.daySize,\n        focusedInput = _this$props22.focusedInput,\n        renderCalendarDay = _this$props22.renderCalendarDay,\n        renderDayContents = _this$props22.renderDayContents,\n        renderCalendarInfo = _this$props22.renderCalendarInfo,\n        renderMonthElement = _this$props22.renderMonthElement,\n        calendarInfoPosition = _this$props22.calendarInfoPosition,\n        onBlur = _this$props22.onBlur,\n        onShiftTab = _this$props22.onShiftTab,\n        onTab = _this$props22.onTab,\n        isFocused = _this$props22.isFocused,\n        showKeyboardShortcuts = _this$props22.showKeyboardShortcuts,\n        isRTL = _this$props22.isRTL,\n        weekDayFormat = _this$props22.weekDayFormat,\n        dayAriaLabelFormat = _this$props22.dayAriaLabelFormat,\n        verticalHeight = _this$props22.verticalHeight,\n        noBorder = _this$props22.noBorder,\n        transitionDuration = _this$props22.transitionDuration,\n        verticalBorderSpacing = _this$props22.verticalBorderSpacing,\n        horizontalMonthPadding = _this$props22.horizontalMonthPadding;\n    var _this$state7 = this.state,\n        currentMonth = _this$state7.currentMonth,\n        phrases = _this$state7.phrases,\n        visibleDays = _this$state7.visibleDays,\n        disablePrev = _this$state7.disablePrev,\n        disableNext = _this$state7.disableNext;\n    return _react[\"default\"].createElement(_DayPicker[\"default\"], {\n      orientation: orientation,\n      enableOutsideDays: enableOutsideDays,\n      modifiers: visibleDays,\n      numberOfMonths: numberOfMonths,\n      onDayClick: this.onDayClick,\n      onDayMouseEnter: this.onDayMouseEnter,\n      onDayMouseLeave: this.onDayMouseLeave,\n      onPrevMonthClick: this.onPrevMonthClick,\n      onNextMonthClick: this.onNextMonthClick,\n      onMonthChange: this.onMonthChange,\n      onTab: onTab,\n      onShiftTab: onShiftTab,\n      onYearChange: this.onYearChange,\n      onGetNextScrollableMonths: this.onGetNextScrollableMonths,\n      onGetPrevScrollableMonths: this.onGetPrevScrollableMonths,\n      monthFormat: monthFormat,\n      renderMonthText: renderMonthText,\n      renderWeekHeaderElement: renderWeekHeaderElement,\n      withPortal: withPortal,\n      hidden: !focusedInput,\n      initialVisibleMonth: function initialVisibleMonth() {\n        return currentMonth;\n      },\n      daySize: daySize,\n      onOutsideClick: onOutsideClick,\n      disablePrev: disablePrev,\n      disableNext: disableNext,\n      dayPickerNavigationInlineStyles: dayPickerNavigationInlineStyles,\n      navPosition: navPosition,\n      navPrev: navPrev,\n      navNext: navNext,\n      renderNavPrevButton: renderNavPrevButton,\n      renderNavNextButton: renderNavNextButton,\n      noNavButtons: noNavButtons,\n      noNavPrevButton: noNavPrevButton,\n      noNavNextButton: noNavNextButton,\n      renderCalendarDay: renderCalendarDay,\n      renderDayContents: renderDayContents,\n      renderCalendarInfo: renderCalendarInfo,\n      renderMonthElement: renderMonthElement,\n      renderKeyboardShortcutsButton: renderKeyboardShortcutsButton,\n      renderKeyboardShortcutsPanel: renderKeyboardShortcutsPanel,\n      calendarInfoPosition: calendarInfoPosition,\n      firstDayOfWeek: firstDayOfWeek,\n      hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n      isFocused: isFocused,\n      getFirstFocusableDay: this.getFirstFocusableDay,\n      onBlur: onBlur,\n      showKeyboardShortcuts: showKeyboardShortcuts,\n      phrases: phrases,\n      isRTL: isRTL,\n      weekDayFormat: weekDayFormat,\n      dayAriaLabelFormat: dayAriaLabelFormat,\n      verticalHeight: verticalHeight,\n      verticalBorderSpacing: verticalBorderSpacing,\n      noBorder: noBorder,\n      transitionDuration: transitionDuration,\n      horizontalMonthPadding: horizontalMonthPadding\n    });\n  };\n\n  return DayPickerRangeController;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports[\"default\"] = DayPickerRangeController;\nDayPickerRangeController.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDayPickerRangeController.defaultProps = defaultProps;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = exports.PureDateRangePicker = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _reactPortal = require(\"react-portal\");\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _consolidatedEvents = require(\"consolidated-events\");\n\nvar _isTouchDevice = _interopRequireDefault(require(\"is-touch-device\"));\n\nvar _reactOutsideClickHandler = _interopRequireDefault(require(\"react-outside-click-handler\"));\n\nvar _DateRangePickerShape = _interopRequireDefault(require(\"../shapes/DateRangePickerShape\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getResponsiveContainerStyles = _interopRequireDefault(require(\"../utils/getResponsiveContainerStyles\"));\n\nvar _getDetachedContainerStyles = _interopRequireDefault(require(\"../utils/getDetachedContainerStyles\"));\n\nvar _getInputHeight = _interopRequireDefault(require(\"../utils/getInputHeight\"));\n\nvar _isInclusivelyAfterDay = _interopRequireDefault(require(\"../utils/isInclusivelyAfterDay\"));\n\nvar _disableScroll2 = _interopRequireDefault(require(\"../utils/disableScroll\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _DateRangePickerInputController = _interopRequireDefault(require(\"./DateRangePickerInputController\"));\n\nvar _DayPickerRangeController = _interopRequireDefault(require(\"./DayPickerRangeController\"));\n\nvar _CloseButton = _interopRequireDefault(require(\"./CloseButton\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {}, _DateRangePickerShape[\"default\"])) : {};\nvar defaultProps = {\n  // required props for a functional interactive DateRangePicker\n  startDate: null,\n  endDate: null,\n  focusedInput: null,\n  // input related props\n  startDatePlaceholderText: 'Start Date',\n  endDatePlaceholderText: 'End Date',\n  startDateAriaLabel: undefined,\n  endDateAriaLabel: undefined,\n  startDateOffset: undefined,\n  endDateOffset: undefined,\n  disabled: false,\n  required: false,\n  readOnly: false,\n  screenReaderInputMessage: '',\n  showClearDates: false,\n  showDefaultInputIcon: false,\n  inputIconPosition: _constants.ICON_BEFORE_POSITION,\n  customInputIcon: null,\n  customArrowIcon: null,\n  customCloseIcon: null,\n  noBorder: false,\n  block: false,\n  small: false,\n  regular: false,\n  keepFocusOnInput: false,\n  // calendar presentation and interaction related props\n  renderMonthText: null,\n  renderWeekHeaderElement: null,\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  anchorDirection: _constants.ANCHOR_LEFT,\n  openDirection: _constants.OPEN_DOWN,\n  horizontalMargin: 0,\n  withPortal: false,\n  withFullScreenPortal: false,\n  appendToBody: false,\n  disableScroll: false,\n  initialVisibleMonth: null,\n  numberOfMonths: 2,\n  keepOpenOnDateSelect: false,\n  reopenPickerOnClearDates: false,\n  renderCalendarInfo: null,\n  calendarInfoPosition: _constants.INFO_POSITION_BOTTOM,\n  hideKeyboardShortcutsPanel: false,\n  daySize: _constants.DAY_SIZE,\n  isRTL: false,\n  firstDayOfWeek: null,\n  verticalHeight: null,\n  transitionDuration: undefined,\n  verticalSpacing: _constants.DEFAULT_VERTICAL_SPACING,\n  horizontalMonthPadding: undefined,\n  // navigation related props\n  dayPickerNavigationInlineStyles: null,\n  navPosition: _constants.NAV_POSITION_TOP,\n  navPrev: null,\n  navNext: null,\n  renderNavPrevButton: null,\n  renderNavNextButton: null,\n  onPrevMonthClick: function onPrevMonthClick() {},\n  onNextMonthClick: function onNextMonthClick() {},\n  onClose: function onClose() {},\n  // day presentation and interaction related props\n  renderCalendarDay: undefined,\n  renderDayContents: null,\n  renderMonthElement: null,\n  minimumNights: 1,\n  enableOutsideDays: false,\n  isDayBlocked: function isDayBlocked() {\n    return false;\n  },\n  isOutsideRange: function isOutsideRange(day) {\n    return !(0, _isInclusivelyAfterDay[\"default\"])(day, (0, _moment[\"default\"])());\n  },\n  isDayHighlighted: function isDayHighlighted() {\n    return false;\n  },\n  minDate: undefined,\n  maxDate: undefined,\n  // internationalization\n  displayFormat: function displayFormat() {\n    return _moment[\"default\"].localeData().longDateFormat('L');\n  },\n  monthFormat: 'MMMM YYYY',\n  weekDayFormat: 'dd',\n  phrases: _defaultPhrases.DateRangePickerPhrases,\n  dayAriaLabelFormat: undefined\n};\n\nvar DateRangePicker =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DateRangePicker, _ref);\n  var _proto = DateRangePicker.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DateRangePicker(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.state = {\n      dayPickerContainerStyles: {},\n      isDateRangePickerInputFocused: false,\n      isDayPickerFocused: false,\n      showKeyboardShortcuts: false\n    };\n    _this.isTouchDevice = false;\n    _this.onOutsideClick = _this.onOutsideClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDateRangePickerInputFocus = _this.onDateRangePickerInputFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayPickerFocus = _this.onDayPickerFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayPickerFocusOut = _this.onDayPickerFocusOut.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayPickerBlur = _this.onDayPickerBlur.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.showKeyboardShortcutsPanel = _this.showKeyboardShortcutsPanel.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.responsivizePickerPosition = _this.responsivizePickerPosition.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.disableScroll = _this.disableScroll.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setDayPickerContainerRef = _this.setDayPickerContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setContainerRef = _this.setContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.removeEventListener = (0, _consolidatedEvents.addEventListener)(window, 'resize', this.responsivizePickerPosition, {\n      passive: true\n    });\n    this.responsivizePickerPosition();\n    this.disableScroll();\n    var focusedInput = this.props.focusedInput;\n\n    if (focusedInput) {\n      this.setState({\n        isDateRangePickerInputFocused: true\n      });\n    }\n\n    this.isTouchDevice = (0, _isTouchDevice[\"default\"])();\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var focusedInput = this.props.focusedInput;\n\n    if (!prevProps.focusedInput && focusedInput && this.isOpened()) {\n      // The date picker just changed from being closed to being open.\n      this.responsivizePickerPosition();\n      this.disableScroll();\n    } else if (prevProps.focusedInput && !focusedInput && !this.isOpened()) {\n      // The date picker just changed from being open to being closed.\n      if (this.enableScroll) this.enableScroll();\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.removeDayPickerEventListeners();\n    if (this.removeEventListener) this.removeEventListener();\n    if (this.enableScroll) this.enableScroll();\n  };\n\n  _proto.onOutsideClick = function onOutsideClick(event) {\n    var _this$props = this.props,\n        onFocusChange = _this$props.onFocusChange,\n        onClose = _this$props.onClose,\n        startDate = _this$props.startDate,\n        endDate = _this$props.endDate,\n        appendToBody = _this$props.appendToBody;\n    if (!this.isOpened()) return;\n    if (appendToBody && this.dayPickerContainer.contains(event.target)) return;\n    this.setState({\n      isDateRangePickerInputFocused: false,\n      isDayPickerFocused: false,\n      showKeyboardShortcuts: false\n    });\n    onFocusChange(null);\n    onClose({\n      startDate: startDate,\n      endDate: endDate\n    });\n  };\n\n  _proto.onDateRangePickerInputFocus = function onDateRangePickerInputFocus(focusedInput) {\n    var _this$props2 = this.props,\n        onFocusChange = _this$props2.onFocusChange,\n        readOnly = _this$props2.readOnly,\n        withPortal = _this$props2.withPortal,\n        withFullScreenPortal = _this$props2.withFullScreenPortal,\n        keepFocusOnInput = _this$props2.keepFocusOnInput;\n\n    if (focusedInput) {\n      var withAnyPortal = withPortal || withFullScreenPortal;\n      var moveFocusToDayPicker = withAnyPortal || readOnly && !keepFocusOnInput || this.isTouchDevice && !keepFocusOnInput;\n\n      if (moveFocusToDayPicker) {\n        this.onDayPickerFocus();\n      } else {\n        this.onDayPickerBlur();\n      }\n    }\n\n    onFocusChange(focusedInput);\n  };\n\n  _proto.onDayPickerFocus = function onDayPickerFocus() {\n    var _this$props3 = this.props,\n        focusedInput = _this$props3.focusedInput,\n        onFocusChange = _this$props3.onFocusChange;\n    if (!focusedInput) onFocusChange(_constants.START_DATE);\n    this.setState({\n      isDateRangePickerInputFocused: false,\n      isDayPickerFocused: true,\n      showKeyboardShortcuts: false\n    });\n  };\n\n  _proto.onDayPickerFocusOut = function onDayPickerFocusOut(event) {\n    // In cases where **relatedTarget** is not null, it points to the right\n    // element here. However, in cases where it is null (such as clicking on a\n    // specific day) or it is **document.body** (IE11), the appropriate value is **event.target**.\n    //\n    // We handle both situations here by using the ` || ` operator to fallback\n    // to *event.target** when **relatedTarget** is not provided.\n    var relatedTarget = event.relatedTarget === document.body ? event.target : event.relatedTarget || event.target;\n    if (this.dayPickerContainer.contains(relatedTarget)) return;\n    this.onOutsideClick(event);\n  };\n\n  _proto.onDayPickerBlur = function onDayPickerBlur() {\n    this.setState({\n      isDateRangePickerInputFocused: true,\n      isDayPickerFocused: false,\n      showKeyboardShortcuts: false\n    });\n  };\n\n  _proto.setDayPickerContainerRef = function setDayPickerContainerRef(ref) {\n    if (ref === this.dayPickerContainer) return;\n    if (this.dayPickerContainer) this.removeDayPickerEventListeners();\n    this.dayPickerContainer = ref;\n    if (!ref) return;\n    this.addDayPickerEventListeners();\n  };\n\n  _proto.setContainerRef = function setContainerRef(ref) {\n    this.container = ref;\n  };\n\n  _proto.addDayPickerEventListeners = function addDayPickerEventListeners() {\n    // NOTE: We are using a manual event listener here, because React doesn't\n    // provide FocusOut, while blur and keydown don't provide the information\n    // needed in order to know whether we have left focus or not.\n    //\n    // For reference, this issue is further described here:\n    // - https://github.com/facebook/react/issues/6410\n    this.removeDayPickerFocusOut = (0, _consolidatedEvents.addEventListener)(this.dayPickerContainer, 'focusout', this.onDayPickerFocusOut);\n  };\n\n  _proto.removeDayPickerEventListeners = function removeDayPickerEventListeners() {\n    if (this.removeDayPickerFocusOut) this.removeDayPickerFocusOut();\n  };\n\n  _proto.isOpened = function isOpened() {\n    var focusedInput = this.props.focusedInput;\n    return focusedInput === _constants.START_DATE || focusedInput === _constants.END_DATE;\n  };\n\n  _proto.disableScroll = function disableScroll() {\n    var _this$props4 = this.props,\n        appendToBody = _this$props4.appendToBody,\n        propDisableScroll = _this$props4.disableScroll;\n    if (!appendToBody && !propDisableScroll) return;\n    if (!this.isOpened()) return; // Disable scroll for every ancestor of this DateRangePicker up to the\n    // document level. This ensures the input and the picker never move. Other\n    // sibling elements or the picker itself can scroll.\n\n    this.enableScroll = (0, _disableScroll2[\"default\"])(this.container);\n  };\n\n  _proto.responsivizePickerPosition = function responsivizePickerPosition() {\n    // It's possible the portal props have been changed in response to window resizes\n    // So let's ensure we reset this back to the base state each time\n    var dayPickerContainerStyles = this.state.dayPickerContainerStyles;\n\n    if (Object.keys(dayPickerContainerStyles).length > 0) {\n      this.setState({\n        dayPickerContainerStyles: {}\n      });\n    }\n\n    if (!this.isOpened()) {\n      return;\n    }\n\n    var _this$props5 = this.props,\n        openDirection = _this$props5.openDirection,\n        anchorDirection = _this$props5.anchorDirection,\n        horizontalMargin = _this$props5.horizontalMargin,\n        withPortal = _this$props5.withPortal,\n        withFullScreenPortal = _this$props5.withFullScreenPortal,\n        appendToBody = _this$props5.appendToBody;\n    var isAnchoredLeft = anchorDirection === _constants.ANCHOR_LEFT;\n\n    if (!withPortal && !withFullScreenPortal) {\n      var containerRect = this.dayPickerContainer.getBoundingClientRect();\n      var currentOffset = dayPickerContainerStyles[anchorDirection] || 0;\n      var containerEdge = isAnchoredLeft ? containerRect[_constants.ANCHOR_RIGHT] : containerRect[_constants.ANCHOR_LEFT];\n      this.setState({\n        dayPickerContainerStyles: _objectSpread({}, (0, _getResponsiveContainerStyles[\"default\"])(anchorDirection, currentOffset, containerEdge, horizontalMargin), {}, appendToBody && (0, _getDetachedContainerStyles[\"default\"])(openDirection, anchorDirection, this.container))\n      });\n    }\n  };\n\n  _proto.showKeyboardShortcutsPanel = function showKeyboardShortcutsPanel() {\n    this.setState({\n      isDateRangePickerInputFocused: false,\n      isDayPickerFocused: true,\n      showKeyboardShortcuts: true\n    });\n  };\n\n  _proto.maybeRenderDayPickerWithPortal = function maybeRenderDayPickerWithPortal() {\n    var _this$props6 = this.props,\n        withPortal = _this$props6.withPortal,\n        withFullScreenPortal = _this$props6.withFullScreenPortal,\n        appendToBody = _this$props6.appendToBody;\n\n    if (!this.isOpened()) {\n      return null;\n    }\n\n    if (withPortal || withFullScreenPortal || appendToBody) {\n      return _react[\"default\"].createElement(_reactPortal.Portal, null, this.renderDayPicker());\n    }\n\n    return this.renderDayPicker();\n  };\n\n  _proto.renderDayPicker = function renderDayPicker() {\n    var _this$props7 = this.props,\n        anchorDirection = _this$props7.anchorDirection,\n        openDirection = _this$props7.openDirection,\n        isDayBlocked = _this$props7.isDayBlocked,\n        isDayHighlighted = _this$props7.isDayHighlighted,\n        isOutsideRange = _this$props7.isOutsideRange,\n        numberOfMonths = _this$props7.numberOfMonths,\n        orientation = _this$props7.orientation,\n        monthFormat = _this$props7.monthFormat,\n        renderMonthText = _this$props7.renderMonthText,\n        renderWeekHeaderElement = _this$props7.renderWeekHeaderElement,\n        dayPickerNavigationInlineStyles = _this$props7.dayPickerNavigationInlineStyles,\n        navPosition = _this$props7.navPosition,\n        navPrev = _this$props7.navPrev,\n        navNext = _this$props7.navNext,\n        renderNavPrevButton = _this$props7.renderNavPrevButton,\n        renderNavNextButton = _this$props7.renderNavNextButton,\n        onPrevMonthClick = _this$props7.onPrevMonthClick,\n        onNextMonthClick = _this$props7.onNextMonthClick,\n        onDatesChange = _this$props7.onDatesChange,\n        onFocusChange = _this$props7.onFocusChange,\n        withPortal = _this$props7.withPortal,\n        withFullScreenPortal = _this$props7.withFullScreenPortal,\n        daySize = _this$props7.daySize,\n        enableOutsideDays = _this$props7.enableOutsideDays,\n        focusedInput = _this$props7.focusedInput,\n        startDate = _this$props7.startDate,\n        startDateOffset = _this$props7.startDateOffset,\n        endDate = _this$props7.endDate,\n        endDateOffset = _this$props7.endDateOffset,\n        minDate = _this$props7.minDate,\n        maxDate = _this$props7.maxDate,\n        minimumNights = _this$props7.minimumNights,\n        keepOpenOnDateSelect = _this$props7.keepOpenOnDateSelect,\n        renderCalendarDay = _this$props7.renderCalendarDay,\n        renderDayContents = _this$props7.renderDayContents,\n        renderCalendarInfo = _this$props7.renderCalendarInfo,\n        renderMonthElement = _this$props7.renderMonthElement,\n        calendarInfoPosition = _this$props7.calendarInfoPosition,\n        firstDayOfWeek = _this$props7.firstDayOfWeek,\n        initialVisibleMonth = _this$props7.initialVisibleMonth,\n        hideKeyboardShortcutsPanel = _this$props7.hideKeyboardShortcutsPanel,\n        customCloseIcon = _this$props7.customCloseIcon,\n        onClose = _this$props7.onClose,\n        phrases = _this$props7.phrases,\n        dayAriaLabelFormat = _this$props7.dayAriaLabelFormat,\n        isRTL = _this$props7.isRTL,\n        weekDayFormat = _this$props7.weekDayFormat,\n        styles = _this$props7.styles,\n        verticalHeight = _this$props7.verticalHeight,\n        transitionDuration = _this$props7.transitionDuration,\n        verticalSpacing = _this$props7.verticalSpacing,\n        horizontalMonthPadding = _this$props7.horizontalMonthPadding,\n        small = _this$props7.small,\n        disabled = _this$props7.disabled,\n        reactDates = _this$props7.theme.reactDates;\n    var _this$state = this.state,\n        dayPickerContainerStyles = _this$state.dayPickerContainerStyles,\n        isDayPickerFocused = _this$state.isDayPickerFocused,\n        showKeyboardShortcuts = _this$state.showKeyboardShortcuts;\n    var onOutsideClick = !withFullScreenPortal && withPortal ? this.onOutsideClick : undefined;\n\n    var initialVisibleMonthThunk = initialVisibleMonth || function () {\n      return startDate || endDate || (0, _moment[\"default\"])();\n    };\n\n    var closeIcon = customCloseIcon || _react[\"default\"].createElement(_CloseButton[\"default\"], (0, _reactWithStyles.css)(styles.DateRangePicker_closeButton_svg));\n\n    var inputHeight = (0, _getInputHeight[\"default\"])(reactDates, small);\n    var withAnyPortal = withPortal || withFullScreenPortal;\n    /* eslint-disable jsx-a11y/no-static-element-interactions */\n\n    /* eslint-disable jsx-a11y/click-events-have-key-events */\n\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      ref: this.setDayPickerContainerRef\n    }, (0, _reactWithStyles.css)(styles.DateRangePicker_picker, anchorDirection === _constants.ANCHOR_LEFT && styles.DateRangePicker_picker__directionLeft, anchorDirection === _constants.ANCHOR_RIGHT && styles.DateRangePicker_picker__directionRight, orientation === _constants.HORIZONTAL_ORIENTATION && styles.DateRangePicker_picker__horizontal, orientation === _constants.VERTICAL_ORIENTATION && styles.DateRangePicker_picker__vertical, !withAnyPortal && openDirection === _constants.OPEN_DOWN && {\n      top: inputHeight + verticalSpacing\n    }, !withAnyPortal && openDirection === _constants.OPEN_UP && {\n      bottom: inputHeight + verticalSpacing\n    }, withAnyPortal && styles.DateRangePicker_picker__portal, withFullScreenPortal && styles.DateRangePicker_picker__fullScreenPortal, isRTL && styles.DateRangePicker_picker__rtl, dayPickerContainerStyles), {\n      onClick: onOutsideClick\n    }), _react[\"default\"].createElement(_DayPickerRangeController[\"default\"], {\n      orientation: orientation,\n      enableOutsideDays: enableOutsideDays,\n      numberOfMonths: numberOfMonths,\n      onPrevMonthClick: onPrevMonthClick,\n      onNextMonthClick: onNextMonthClick,\n      onDatesChange: onDatesChange,\n      onFocusChange: onFocusChange,\n      onClose: onClose,\n      focusedInput: focusedInput,\n      startDate: startDate,\n      startDateOffset: startDateOffset,\n      endDate: endDate,\n      endDateOffset: endDateOffset,\n      minDate: minDate,\n      maxDate: maxDate,\n      monthFormat: monthFormat,\n      renderMonthText: renderMonthText,\n      renderWeekHeaderElement: renderWeekHeaderElement,\n      withPortal: withAnyPortal,\n      daySize: daySize,\n      initialVisibleMonth: initialVisibleMonthThunk,\n      hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n      dayPickerNavigationInlineStyles: dayPickerNavigationInlineStyles,\n      navPosition: navPosition,\n      navPrev: navPrev,\n      navNext: navNext,\n      renderNavPrevButton: renderNavPrevButton,\n      renderNavNextButton: renderNavNextButton,\n      minimumNights: minimumNights,\n      isOutsideRange: isOutsideRange,\n      isDayHighlighted: isDayHighlighted,\n      isDayBlocked: isDayBlocked,\n      keepOpenOnDateSelect: keepOpenOnDateSelect,\n      renderCalendarDay: renderCalendarDay,\n      renderDayContents: renderDayContents,\n      renderCalendarInfo: renderCalendarInfo,\n      renderMonthElement: renderMonthElement,\n      calendarInfoPosition: calendarInfoPosition,\n      isFocused: isDayPickerFocused,\n      showKeyboardShortcuts: showKeyboardShortcuts,\n      onBlur: this.onDayPickerBlur,\n      phrases: phrases,\n      dayAriaLabelFormat: dayAriaLabelFormat,\n      isRTL: isRTL,\n      firstDayOfWeek: firstDayOfWeek,\n      weekDayFormat: weekDayFormat,\n      verticalHeight: verticalHeight,\n      transitionDuration: transitionDuration,\n      disabled: disabled,\n      horizontalMonthPadding: horizontalMonthPadding\n    }), withFullScreenPortal && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.DateRangePicker_closeButton), {\n      type: \"button\",\n      onClick: this.onOutsideClick,\n      \"aria-label\": phrases.closeDatePicker\n    }), closeIcon));\n    /* eslint-enable jsx-a11y/no-static-element-interactions */\n\n    /* eslint-enable jsx-a11y/click-events-have-key-events */\n  };\n\n  _proto.render = function render() {\n    var _this$props8 = this.props,\n        startDate = _this$props8.startDate,\n        startDateId = _this$props8.startDateId,\n        startDatePlaceholderText = _this$props8.startDatePlaceholderText,\n        startDateAriaLabel = _this$props8.startDateAriaLabel,\n        endDate = _this$props8.endDate,\n        endDateId = _this$props8.endDateId,\n        endDatePlaceholderText = _this$props8.endDatePlaceholderText,\n        endDateAriaLabel = _this$props8.endDateAriaLabel,\n        focusedInput = _this$props8.focusedInput,\n        screenReaderInputMessage = _this$props8.screenReaderInputMessage,\n        showClearDates = _this$props8.showClearDates,\n        showDefaultInputIcon = _this$props8.showDefaultInputIcon,\n        inputIconPosition = _this$props8.inputIconPosition,\n        customInputIcon = _this$props8.customInputIcon,\n        customArrowIcon = _this$props8.customArrowIcon,\n        customCloseIcon = _this$props8.customCloseIcon,\n        disabled = _this$props8.disabled,\n        required = _this$props8.required,\n        readOnly = _this$props8.readOnly,\n        openDirection = _this$props8.openDirection,\n        phrases = _this$props8.phrases,\n        isOutsideRange = _this$props8.isOutsideRange,\n        minimumNights = _this$props8.minimumNights,\n        withPortal = _this$props8.withPortal,\n        withFullScreenPortal = _this$props8.withFullScreenPortal,\n        displayFormat = _this$props8.displayFormat,\n        reopenPickerOnClearDates = _this$props8.reopenPickerOnClearDates,\n        keepOpenOnDateSelect = _this$props8.keepOpenOnDateSelect,\n        onDatesChange = _this$props8.onDatesChange,\n        onClose = _this$props8.onClose,\n        isRTL = _this$props8.isRTL,\n        noBorder = _this$props8.noBorder,\n        block = _this$props8.block,\n        verticalSpacing = _this$props8.verticalSpacing,\n        small = _this$props8.small,\n        regular = _this$props8.regular,\n        styles = _this$props8.styles;\n    var isDateRangePickerInputFocused = this.state.isDateRangePickerInputFocused;\n    var enableOutsideClick = !withPortal && !withFullScreenPortal;\n    var hideFang = verticalSpacing < _constants.FANG_HEIGHT_PX;\n\n    var input = _react[\"default\"].createElement(_DateRangePickerInputController[\"default\"], {\n      startDate: startDate,\n      startDateId: startDateId,\n      startDatePlaceholderText: startDatePlaceholderText,\n      isStartDateFocused: focusedInput === _constants.START_DATE,\n      startDateAriaLabel: startDateAriaLabel,\n      endDate: endDate,\n      endDateId: endDateId,\n      endDatePlaceholderText: endDatePlaceholderText,\n      isEndDateFocused: focusedInput === _constants.END_DATE,\n      endDateAriaLabel: endDateAriaLabel,\n      displayFormat: displayFormat,\n      showClearDates: showClearDates,\n      showCaret: !withPortal && !withFullScreenPortal && !hideFang,\n      showDefaultInputIcon: showDefaultInputIcon,\n      inputIconPosition: inputIconPosition,\n      customInputIcon: customInputIcon,\n      customArrowIcon: customArrowIcon,\n      customCloseIcon: customCloseIcon,\n      disabled: disabled,\n      required: required,\n      readOnly: readOnly,\n      openDirection: openDirection,\n      reopenPickerOnClearDates: reopenPickerOnClearDates,\n      keepOpenOnDateSelect: keepOpenOnDateSelect,\n      isOutsideRange: isOutsideRange,\n      minimumNights: minimumNights,\n      withFullScreenPortal: withFullScreenPortal,\n      onDatesChange: onDatesChange,\n      onFocusChange: this.onDateRangePickerInputFocus,\n      onKeyDownArrowDown: this.onDayPickerFocus,\n      onKeyDownQuestionMark: this.showKeyboardShortcutsPanel,\n      onClose: onClose,\n      phrases: phrases,\n      screenReaderMessage: screenReaderInputMessage,\n      isFocused: isDateRangePickerInputFocused,\n      isRTL: isRTL,\n      noBorder: noBorder,\n      block: block,\n      small: small,\n      regular: regular,\n      verticalSpacing: verticalSpacing\n    }, this.maybeRenderDayPickerWithPortal());\n\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      ref: this.setContainerRef\n    }, (0, _reactWithStyles.css)(styles.DateRangePicker, block && styles.DateRangePicker__block)), enableOutsideClick && _react[\"default\"].createElement(_reactOutsideClickHandler[\"default\"], {\n      onOutsideClick: this.onOutsideClick\n    }, input), enableOutsideClick || input);\n  };\n\n  return DateRangePicker;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports.PureDateRangePicker = DateRangePicker;\nDateRangePicker.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDateRangePicker.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      color = _ref2$reactDates.color,\n      zIndex = _ref2$reactDates.zIndex;\n  return {\n    DateRangePicker: {\n      position: 'relative',\n      display: 'inline-block'\n    },\n    DateRangePicker__block: {\n      display: 'block'\n    },\n    DateRangePicker_picker: {\n      zIndex: zIndex + 1,\n      backgroundColor: color.background,\n      position: 'absolute'\n    },\n    DateRangePicker_picker__rtl: {\n      direction: (0, _noflip[\"default\"])('rtl')\n    },\n    DateRangePicker_picker__directionLeft: {\n      left: (0, _noflip[\"default\"])(0)\n    },\n    DateRangePicker_picker__directionRight: {\n      right: (0, _noflip[\"default\"])(0)\n    },\n    DateRangePicker_picker__portal: {\n      backgroundColor: 'rgba(0, 0, 0, 0.3)',\n      position: 'fixed',\n      top: 0,\n      left: (0, _noflip[\"default\"])(0),\n      height: '100%',\n      width: '100%'\n    },\n    DateRangePicker_picker__fullScreenPortal: {\n      backgroundColor: color.background\n    },\n    DateRangePicker_closeButton: {\n      background: 'none',\n      border: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      cursor: 'pointer',\n      position: 'absolute',\n      top: 0,\n      right: (0, _noflip[\"default\"])(0),\n      padding: 15,\n      zIndex: zIndex + 2,\n      ':hover': {\n        color: \"darken(\".concat(color.core.grayLighter, \", 10%)\"),\n        textDecoration: 'none'\n      },\n      ':focus': {\n        color: \"darken(\".concat(color.core.grayLighter, \", 10%)\"),\n        textDecoration: 'none'\n      }\n    },\n    DateRangePicker_closeButton_svg: {\n      height: 15,\n      width: 15,\n      fill: color.core.grayLighter\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(DateRangePicker);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/slicedToArray\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _object = _interopRequireDefault(require(\"object.values\"));\n\nvar _isTouchDevice = _interopRequireDefault(require(\"is-touch-device\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"../utils/isSameDay\"));\n\nvar _isAfterDay = _interopRequireDefault(require(\"../utils/isAfterDay\"));\n\nvar _getVisibleDays = _interopRequireDefault(require(\"../utils/getVisibleDays\"));\n\nvar _toISODateString = _interopRequireDefault(require(\"../utils/toISODateString\"));\n\nvar _modifiers = require(\"../utils/modifiers\");\n\nvar _ScrollableOrientationShape = _interopRequireDefault(require(\"../shapes/ScrollableOrientationShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"../shapes/DayOfWeekShape\"));\n\nvar _CalendarInfoPositionShape = _interopRequireDefault(require(\"../shapes/CalendarInfoPositionShape\"));\n\nvar _NavPositionShape = _interopRequireDefault(require(\"../shapes/NavPositionShape\"));\n\nvar _constants = require(\"../constants\");\n\nvar _DayPicker = _interopRequireDefault(require(\"./DayPicker\"));\n\nvar _getPooledMoment = _interopRequireDefault(require(\"../utils/getPooledMoment\"));\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)({\n  date: _reactMomentProptypes[\"default\"].momentObj,\n  onDateChange: _propTypes[\"default\"].func,\n  focused: _propTypes[\"default\"].bool,\n  onFocusChange: _propTypes[\"default\"].func,\n  onClose: _propTypes[\"default\"].func,\n  keepOpenOnDateSelect: _propTypes[\"default\"].bool,\n  isOutsideRange: _propTypes[\"default\"].func,\n  isDayBlocked: _propTypes[\"default\"].func,\n  isDayHighlighted: _propTypes[\"default\"].func,\n  // DayPicker props\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderWeekHeaderElement: _propTypes[\"default\"].func,\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  numberOfMonths: _propTypes[\"default\"].number,\n  orientation: _ScrollableOrientationShape[\"default\"],\n  withPortal: _propTypes[\"default\"].bool,\n  initialVisibleMonth: _propTypes[\"default\"].func,\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  hideKeyboardShortcutsPanel: _propTypes[\"default\"].bool,\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  verticalHeight: _airbnbPropTypes.nonNegativeInteger,\n  noBorder: _propTypes[\"default\"].bool,\n  verticalBorderSpacing: _airbnbPropTypes.nonNegativeInteger,\n  transitionDuration: _airbnbPropTypes.nonNegativeInteger,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  dayPickerNavigationInlineStyles: _propTypes[\"default\"].object,\n  navPosition: _NavPositionShape[\"default\"],\n  navPrev: _propTypes[\"default\"].node,\n  navNext: _propTypes[\"default\"].node,\n  renderNavPrevButton: _propTypes[\"default\"].func,\n  renderNavNextButton: _propTypes[\"default\"].func,\n  noNavButtons: _propTypes[\"default\"].bool,\n  noNavNextButton: _propTypes[\"default\"].bool,\n  noNavPrevButton: _propTypes[\"default\"].bool,\n  onPrevMonthClick: _propTypes[\"default\"].func,\n  onNextMonthClick: _propTypes[\"default\"].func,\n  onOutsideClick: _propTypes[\"default\"].func,\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  renderCalendarInfo: _propTypes[\"default\"].func,\n  calendarInfoPosition: _CalendarInfoPositionShape[\"default\"],\n  // accessibility\n  onBlur: _propTypes[\"default\"].func,\n  isFocused: _propTypes[\"default\"].bool,\n  showKeyboardShortcuts: _propTypes[\"default\"].bool,\n  onTab: _propTypes[\"default\"].func,\n  onShiftTab: _propTypes[\"default\"].func,\n  // i18n\n  monthFormat: _propTypes[\"default\"].string,\n  weekDayFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.DayPickerPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string,\n  isRTL: _propTypes[\"default\"].bool\n}) : {};\nvar defaultProps = {\n  date: undefined,\n  // TODO: use null\n  onDateChange: function onDateChange() {},\n  focused: false,\n  onFocusChange: function onFocusChange() {},\n  onClose: function onClose() {},\n  keepOpenOnDateSelect: false,\n  isOutsideRange: function isOutsideRange() {},\n  isDayBlocked: function isDayBlocked() {},\n  isDayHighlighted: function isDayHighlighted() {},\n  // DayPicker props\n  renderMonthText: null,\n  renderWeekHeaderElement: null,\n  enableOutsideDays: false,\n  numberOfMonths: 1,\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  withPortal: false,\n  hideKeyboardShortcutsPanel: false,\n  initialVisibleMonth: null,\n  firstDayOfWeek: null,\n  daySize: _constants.DAY_SIZE,\n  verticalHeight: null,\n  noBorder: false,\n  verticalBorderSpacing: undefined,\n  transitionDuration: undefined,\n  horizontalMonthPadding: 13,\n  dayPickerNavigationInlineStyles: null,\n  navPosition: _constants.NAV_POSITION_TOP,\n  navPrev: null,\n  navNext: null,\n  renderNavPrevButton: null,\n  renderNavNextButton: null,\n  noNavButtons: false,\n  noNavNextButton: false,\n  noNavPrevButton: false,\n  onPrevMonthClick: function onPrevMonthClick() {},\n  onNextMonthClick: function onNextMonthClick() {},\n  onOutsideClick: function onOutsideClick() {},\n  renderCalendarDay: undefined,\n  renderDayContents: null,\n  renderCalendarInfo: null,\n  renderMonthElement: null,\n  calendarInfoPosition: _constants.INFO_POSITION_BOTTOM,\n  // accessibility\n  onBlur: function onBlur() {},\n  isFocused: false,\n  showKeyboardShortcuts: false,\n  onTab: function onTab() {},\n  onShiftTab: function onShiftTab() {},\n  // i18n\n  monthFormat: 'MMMM YYYY',\n  weekDayFormat: 'dd',\n  phrases: _defaultPhrases.DayPickerPhrases,\n  dayAriaLabelFormat: undefined,\n  isRTL: false\n};\n\nvar DayPickerSingleDateController =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(DayPickerSingleDateController, _ref);\n  var _proto = DayPickerSingleDateController.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function DayPickerSingleDateController(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.isTouchDevice = false;\n    _this.today = (0, _moment[\"default\"])();\n    _this.modifiers = {\n      today: function today(day) {\n        return _this.isToday(day);\n      },\n      blocked: function blocked(day) {\n        return _this.isBlocked(day);\n      },\n      'blocked-calendar': function blockedCalendar(day) {\n        return props.isDayBlocked(day);\n      },\n      'blocked-out-of-range': function blockedOutOfRange(day) {\n        return props.isOutsideRange(day);\n      },\n      'highlighted-calendar': function highlightedCalendar(day) {\n        return props.isDayHighlighted(day);\n      },\n      valid: function valid(day) {\n        return !_this.isBlocked(day);\n      },\n      hovered: function hovered(day) {\n        return _this.isHovered(day);\n      },\n      selected: function selected(day) {\n        return _this.isSelected(day);\n      },\n      'first-day-of-week': function firstDayOfWeek(day) {\n        return _this.isFirstDayOfWeek(day);\n      },\n      'last-day-of-week': function lastDayOfWeek(day) {\n        return _this.isLastDayOfWeek(day);\n      }\n    };\n\n    var _this$getStateForNewM = _this.getStateForNewMonth(props),\n        currentMonth = _this$getStateForNewM.currentMonth,\n        visibleDays = _this$getStateForNewM.visibleDays;\n\n    _this.state = {\n      hoverDate: null,\n      currentMonth: currentMonth,\n      visibleDays: visibleDays\n    };\n    _this.onDayMouseEnter = _this.onDayMouseEnter.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayMouseLeave = _this.onDayMouseLeave.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayClick = _this.onDayClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onPrevMonthClick = _this.onPrevMonthClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onNextMonthClick = _this.onNextMonthClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onMonthChange = _this.onMonthChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onYearChange = _this.onYearChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onGetNextScrollableMonths = _this.onGetNextScrollableMonths.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onGetPrevScrollableMonths = _this.onGetPrevScrollableMonths.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.getFirstFocusableDay = _this.getFirstFocusableDay.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.isTouchDevice = (0, _isTouchDevice[\"default\"])();\n  };\n\n  _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var _this2 = this;\n\n    var date = nextProps.date,\n        focused = nextProps.focused,\n        isOutsideRange = nextProps.isOutsideRange,\n        isDayBlocked = nextProps.isDayBlocked,\n        isDayHighlighted = nextProps.isDayHighlighted,\n        initialVisibleMonth = nextProps.initialVisibleMonth,\n        numberOfMonths = nextProps.numberOfMonths,\n        enableOutsideDays = nextProps.enableOutsideDays;\n    var _this$props = this.props,\n        prevIsOutsideRange = _this$props.isOutsideRange,\n        prevIsDayBlocked = _this$props.isDayBlocked,\n        prevIsDayHighlighted = _this$props.isDayHighlighted,\n        prevNumberOfMonths = _this$props.numberOfMonths,\n        prevEnableOutsideDays = _this$props.enableOutsideDays,\n        prevInitialVisibleMonth = _this$props.initialVisibleMonth,\n        prevFocused = _this$props.focused,\n        prevDate = _this$props.date;\n    var visibleDays = this.state.visibleDays;\n    var recomputeOutsideRange = false;\n    var recomputeDayBlocked = false;\n    var recomputeDayHighlighted = false;\n\n    if (isOutsideRange !== prevIsOutsideRange) {\n      this.modifiers['blocked-out-of-range'] = function (day) {\n        return isOutsideRange(day);\n      };\n\n      recomputeOutsideRange = true;\n    }\n\n    if (isDayBlocked !== prevIsDayBlocked) {\n      this.modifiers['blocked-calendar'] = function (day) {\n        return isDayBlocked(day);\n      };\n\n      recomputeDayBlocked = true;\n    }\n\n    if (isDayHighlighted !== prevIsDayHighlighted) {\n      this.modifiers['highlighted-calendar'] = function (day) {\n        return isDayHighlighted(day);\n      };\n\n      recomputeDayHighlighted = true;\n    }\n\n    var recomputePropModifiers = recomputeOutsideRange || recomputeDayBlocked || recomputeDayHighlighted;\n\n    if (numberOfMonths !== prevNumberOfMonths || enableOutsideDays !== prevEnableOutsideDays || initialVisibleMonth !== prevInitialVisibleMonth && !prevFocused && focused) {\n      var newMonthState = this.getStateForNewMonth(nextProps);\n      var currentMonth = newMonthState.currentMonth;\n      visibleDays = newMonthState.visibleDays;\n      this.setState({\n        currentMonth: currentMonth,\n        visibleDays: visibleDays\n      });\n    }\n\n    var didDateChange = date !== prevDate;\n    var didFocusChange = focused !== prevFocused;\n    var modifiers = {};\n\n    if (didDateChange) {\n      modifiers = this.deleteModifier(modifiers, prevDate, 'selected');\n      modifiers = this.addModifier(modifiers, date, 'selected');\n    }\n\n    if (didFocusChange || recomputePropModifiers) {\n      (0, _object[\"default\"])(visibleDays).forEach(function (days) {\n        Object.keys(days).forEach(function (day) {\n          var momentObj = (0, _getPooledMoment[\"default\"])(day);\n\n          if (_this2.isBlocked(momentObj)) {\n            modifiers = _this2.addModifier(modifiers, momentObj, 'blocked');\n          } else {\n            modifiers = _this2.deleteModifier(modifiers, momentObj, 'blocked');\n          }\n\n          if (didFocusChange || recomputeOutsideRange) {\n            if (isOutsideRange(momentObj)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'blocked-out-of-range');\n            } else {\n              modifiers = _this2.deleteModifier(modifiers, momentObj, 'blocked-out-of-range');\n            }\n          }\n\n          if (didFocusChange || recomputeDayBlocked) {\n            if (isDayBlocked(momentObj)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'blocked-calendar');\n            } else {\n              modifiers = _this2.deleteModifier(modifiers, momentObj, 'blocked-calendar');\n            }\n          }\n\n          if (didFocusChange || recomputeDayHighlighted) {\n            if (isDayHighlighted(momentObj)) {\n              modifiers = _this2.addModifier(modifiers, momentObj, 'highlighted-calendar');\n            } else {\n              modifiers = _this2.deleteModifier(modifiers, momentObj, 'highlighted-calendar');\n            }\n          }\n        });\n      });\n    }\n\n    var today = (0, _moment[\"default\"])();\n\n    if (!(0, _isSameDay[\"default\"])(this.today, today)) {\n      modifiers = this.deleteModifier(modifiers, this.today, 'today');\n      modifiers = this.addModifier(modifiers, today, 'today');\n      this.today = today;\n    }\n\n    if (Object.keys(modifiers).length > 0) {\n      this.setState({\n        visibleDays: _objectSpread({}, visibleDays, {}, modifiers)\n      });\n    }\n  };\n\n  _proto.componentWillUpdate = function componentWillUpdate() {\n    this.today = (0, _moment[\"default\"])();\n  };\n\n  _proto.onDayClick = function onDayClick(day, e) {\n    if (e) e.preventDefault();\n    if (this.isBlocked(day)) return;\n    var _this$props2 = this.props,\n        onDateChange = _this$props2.onDateChange,\n        keepOpenOnDateSelect = _this$props2.keepOpenOnDateSelect,\n        onFocusChange = _this$props2.onFocusChange,\n        onClose = _this$props2.onClose;\n    onDateChange(day);\n\n    if (!keepOpenOnDateSelect) {\n      onFocusChange({\n        focused: false\n      });\n      onClose({\n        date: day\n      });\n    }\n  };\n\n  _proto.onDayMouseEnter = function onDayMouseEnter(day) {\n    if (this.isTouchDevice) return;\n    var _this$state = this.state,\n        hoverDate = _this$state.hoverDate,\n        visibleDays = _this$state.visibleDays;\n    var modifiers = this.deleteModifier({}, hoverDate, 'hovered');\n    modifiers = this.addModifier(modifiers, day, 'hovered');\n    this.setState({\n      hoverDate: day,\n      visibleDays: _objectSpread({}, visibleDays, {}, modifiers)\n    });\n  };\n\n  _proto.onDayMouseLeave = function onDayMouseLeave() {\n    var _this$state2 = this.state,\n        hoverDate = _this$state2.hoverDate,\n        visibleDays = _this$state2.visibleDays;\n    if (this.isTouchDevice || !hoverDate) return;\n    var modifiers = this.deleteModifier({}, hoverDate, 'hovered');\n    this.setState({\n      hoverDate: null,\n      visibleDays: _objectSpread({}, visibleDays, {}, modifiers)\n    });\n  };\n\n  _proto.onPrevMonthClick = function onPrevMonthClick() {\n    var _this$props3 = this.props,\n        onPrevMonthClick = _this$props3.onPrevMonthClick,\n        numberOfMonths = _this$props3.numberOfMonths,\n        enableOutsideDays = _this$props3.enableOutsideDays;\n    var _this$state3 = this.state,\n        currentMonth = _this$state3.currentMonth,\n        visibleDays = _this$state3.visibleDays;\n    var newVisibleDays = {};\n    Object.keys(visibleDays).sort().slice(0, numberOfMonths + 1).forEach(function (month) {\n      newVisibleDays[month] = visibleDays[month];\n    });\n    var prevMonth = currentMonth.clone().subtract(1, 'month');\n    var prevMonthVisibleDays = (0, _getVisibleDays[\"default\"])(prevMonth, 1, enableOutsideDays);\n    this.setState({\n      currentMonth: prevMonth,\n      visibleDays: _objectSpread({}, newVisibleDays, {}, this.getModifiers(prevMonthVisibleDays))\n    }, function () {\n      onPrevMonthClick(prevMonth.clone());\n    });\n  };\n\n  _proto.onNextMonthClick = function onNextMonthClick() {\n    var _this$props4 = this.props,\n        onNextMonthClick = _this$props4.onNextMonthClick,\n        numberOfMonths = _this$props4.numberOfMonths,\n        enableOutsideDays = _this$props4.enableOutsideDays;\n    var _this$state4 = this.state,\n        currentMonth = _this$state4.currentMonth,\n        visibleDays = _this$state4.visibleDays;\n    var newVisibleDays = {};\n    Object.keys(visibleDays).sort().slice(1).forEach(function (month) {\n      newVisibleDays[month] = visibleDays[month];\n    });\n    var nextMonth = currentMonth.clone().add(numberOfMonths, 'month');\n    var nextMonthVisibleDays = (0, _getVisibleDays[\"default\"])(nextMonth, 1, enableOutsideDays);\n    var newCurrentMonth = currentMonth.clone().add(1, 'month');\n    this.setState({\n      currentMonth: newCurrentMonth,\n      visibleDays: _objectSpread({}, newVisibleDays, {}, this.getModifiers(nextMonthVisibleDays))\n    }, function () {\n      onNextMonthClick(newCurrentMonth.clone());\n    });\n  };\n\n  _proto.onMonthChange = function onMonthChange(newMonth) {\n    var _this$props5 = this.props,\n        numberOfMonths = _this$props5.numberOfMonths,\n        enableOutsideDays = _this$props5.enableOutsideDays,\n        orientation = _this$props5.orientation;\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(newMonth, numberOfMonths, enableOutsideDays, withoutTransitionMonths);\n    this.setState({\n      currentMonth: newMonth.clone(),\n      visibleDays: this.getModifiers(newVisibleDays)\n    });\n  };\n\n  _proto.onYearChange = function onYearChange(newMonth) {\n    var _this$props6 = this.props,\n        numberOfMonths = _this$props6.numberOfMonths,\n        enableOutsideDays = _this$props6.enableOutsideDays,\n        orientation = _this$props6.orientation;\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(newMonth, numberOfMonths, enableOutsideDays, withoutTransitionMonths);\n    this.setState({\n      currentMonth: newMonth.clone(),\n      visibleDays: this.getModifiers(newVisibleDays)\n    });\n  };\n\n  _proto.onGetNextScrollableMonths = function onGetNextScrollableMonths() {\n    var _this$props7 = this.props,\n        numberOfMonths = _this$props7.numberOfMonths,\n        enableOutsideDays = _this$props7.enableOutsideDays;\n    var _this$state5 = this.state,\n        currentMonth = _this$state5.currentMonth,\n        visibleDays = _this$state5.visibleDays;\n    var numberOfVisibleMonths = Object.keys(visibleDays).length;\n    var nextMonth = currentMonth.clone().add(numberOfVisibleMonths, 'month');\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(nextMonth, numberOfMonths, enableOutsideDays, true);\n    this.setState({\n      visibleDays: _objectSpread({}, visibleDays, {}, this.getModifiers(newVisibleDays))\n    });\n  };\n\n  _proto.onGetPrevScrollableMonths = function onGetPrevScrollableMonths() {\n    var _this$props8 = this.props,\n        numberOfMonths = _this$props8.numberOfMonths,\n        enableOutsideDays = _this$props8.enableOutsideDays;\n    var _this$state6 = this.state,\n        currentMonth = _this$state6.currentMonth,\n        visibleDays = _this$state6.visibleDays;\n    var firstPreviousMonth = currentMonth.clone().subtract(numberOfMonths, 'month');\n    var newVisibleDays = (0, _getVisibleDays[\"default\"])(firstPreviousMonth, numberOfMonths, enableOutsideDays, true);\n    this.setState({\n      currentMonth: firstPreviousMonth.clone(),\n      visibleDays: _objectSpread({}, visibleDays, {}, this.getModifiers(newVisibleDays))\n    });\n  };\n\n  _proto.getFirstFocusableDay = function getFirstFocusableDay(newMonth) {\n    var _this3 = this;\n\n    var _this$props9 = this.props,\n        date = _this$props9.date,\n        numberOfMonths = _this$props9.numberOfMonths;\n    var focusedDate = newMonth.clone().startOf('month');\n\n    if (date) {\n      focusedDate = date.clone();\n    }\n\n    if (this.isBlocked(focusedDate)) {\n      var days = [];\n      var lastVisibleDay = newMonth.clone().add(numberOfMonths - 1, 'months').endOf('month');\n      var currentDay = focusedDate.clone();\n\n      while (!(0, _isAfterDay[\"default\"])(currentDay, lastVisibleDay)) {\n        currentDay = currentDay.clone().add(1, 'day');\n        days.push(currentDay);\n      }\n\n      var viableDays = days.filter(function (day) {\n        return !_this3.isBlocked(day) && (0, _isAfterDay[\"default\"])(day, focusedDate);\n      });\n\n      if (viableDays.length > 0) {\n        var _viableDays = (0, _slicedToArray2[\"default\"])(viableDays, 1);\n\n        focusedDate = _viableDays[0];\n      }\n    }\n\n    return focusedDate;\n  };\n\n  _proto.getModifiers = function getModifiers(visibleDays) {\n    var _this4 = this;\n\n    var modifiers = {};\n    Object.keys(visibleDays).forEach(function (month) {\n      modifiers[month] = {};\n      visibleDays[month].forEach(function (day) {\n        modifiers[month][(0, _toISODateString[\"default\"])(day)] = _this4.getModifiersForDay(day);\n      });\n    });\n    return modifiers;\n  };\n\n  _proto.getModifiersForDay = function getModifiersForDay(day) {\n    var _this5 = this;\n\n    return new Set(Object.keys(this.modifiers).filter(function (modifier) {\n      return _this5.modifiers[modifier](day);\n    }));\n  };\n\n  _proto.getStateForNewMonth = function getStateForNewMonth(nextProps) {\n    var _this6 = this;\n\n    var initialVisibleMonth = nextProps.initialVisibleMonth,\n        date = nextProps.date,\n        numberOfMonths = nextProps.numberOfMonths,\n        orientation = nextProps.orientation,\n        enableOutsideDays = nextProps.enableOutsideDays;\n    var initialVisibleMonthThunk = initialVisibleMonth || (date ? function () {\n      return date;\n    } : function () {\n      return _this6.today;\n    });\n    var currentMonth = initialVisibleMonthThunk();\n    var withoutTransitionMonths = orientation === _constants.VERTICAL_SCROLLABLE;\n    var visibleDays = this.getModifiers((0, _getVisibleDays[\"default\"])(currentMonth, numberOfMonths, enableOutsideDays, withoutTransitionMonths));\n    return {\n      currentMonth: currentMonth,\n      visibleDays: visibleDays\n    };\n  };\n\n  _proto.addModifier = function addModifier(updatedDays, day, modifier) {\n    return (0, _modifiers.addModifier)(updatedDays, day, modifier, this.props, this.state);\n  };\n\n  _proto.deleteModifier = function deleteModifier(updatedDays, day, modifier) {\n    return (0, _modifiers.deleteModifier)(updatedDays, day, modifier, this.props, this.state);\n  };\n\n  _proto.isBlocked = function isBlocked(day) {\n    var _this$props10 = this.props,\n        isDayBlocked = _this$props10.isDayBlocked,\n        isOutsideRange = _this$props10.isOutsideRange;\n    return isDayBlocked(day) || isOutsideRange(day);\n  };\n\n  _proto.isHovered = function isHovered(day) {\n    var _ref2 = this.state || {},\n        hoverDate = _ref2.hoverDate;\n\n    return (0, _isSameDay[\"default\"])(day, hoverDate);\n  };\n\n  _proto.isSelected = function isSelected(day) {\n    var date = this.props.date;\n    return (0, _isSameDay[\"default\"])(day, date);\n  };\n\n  _proto.isToday = function isToday(day) {\n    return (0, _isSameDay[\"default\"])(day, this.today);\n  };\n\n  _proto.isFirstDayOfWeek = function isFirstDayOfWeek(day) {\n    var firstDayOfWeek = this.props.firstDayOfWeek;\n    return day.day() === (firstDayOfWeek || _moment[\"default\"].localeData().firstDayOfWeek());\n  };\n\n  _proto.isLastDayOfWeek = function isLastDayOfWeek(day) {\n    var firstDayOfWeek = this.props.firstDayOfWeek;\n    return day.day() === ((firstDayOfWeek || _moment[\"default\"].localeData().firstDayOfWeek()) + 6) % 7;\n  };\n\n  _proto.render = function render() {\n    var _this$props11 = this.props,\n        numberOfMonths = _this$props11.numberOfMonths,\n        orientation = _this$props11.orientation,\n        monthFormat = _this$props11.monthFormat,\n        renderMonthText = _this$props11.renderMonthText,\n        renderWeekHeaderElement = _this$props11.renderWeekHeaderElement,\n        dayPickerNavigationInlineStyles = _this$props11.dayPickerNavigationInlineStyles,\n        navPosition = _this$props11.navPosition,\n        navPrev = _this$props11.navPrev,\n        navNext = _this$props11.navNext,\n        renderNavPrevButton = _this$props11.renderNavPrevButton,\n        renderNavNextButton = _this$props11.renderNavNextButton,\n        noNavButtons = _this$props11.noNavButtons,\n        noNavPrevButton = _this$props11.noNavPrevButton,\n        noNavNextButton = _this$props11.noNavNextButton,\n        onOutsideClick = _this$props11.onOutsideClick,\n        onShiftTab = _this$props11.onShiftTab,\n        onTab = _this$props11.onTab,\n        withPortal = _this$props11.withPortal,\n        focused = _this$props11.focused,\n        enableOutsideDays = _this$props11.enableOutsideDays,\n        hideKeyboardShortcutsPanel = _this$props11.hideKeyboardShortcutsPanel,\n        daySize = _this$props11.daySize,\n        firstDayOfWeek = _this$props11.firstDayOfWeek,\n        renderCalendarDay = _this$props11.renderCalendarDay,\n        renderDayContents = _this$props11.renderDayContents,\n        renderCalendarInfo = _this$props11.renderCalendarInfo,\n        renderMonthElement = _this$props11.renderMonthElement,\n        calendarInfoPosition = _this$props11.calendarInfoPosition,\n        isFocused = _this$props11.isFocused,\n        isRTL = _this$props11.isRTL,\n        phrases = _this$props11.phrases,\n        dayAriaLabelFormat = _this$props11.dayAriaLabelFormat,\n        onBlur = _this$props11.onBlur,\n        showKeyboardShortcuts = _this$props11.showKeyboardShortcuts,\n        weekDayFormat = _this$props11.weekDayFormat,\n        verticalHeight = _this$props11.verticalHeight,\n        noBorder = _this$props11.noBorder,\n        transitionDuration = _this$props11.transitionDuration,\n        verticalBorderSpacing = _this$props11.verticalBorderSpacing,\n        horizontalMonthPadding = _this$props11.horizontalMonthPadding;\n    var _this$state7 = this.state,\n        currentMonth = _this$state7.currentMonth,\n        visibleDays = _this$state7.visibleDays;\n    return _react[\"default\"].createElement(_DayPicker[\"default\"], {\n      orientation: orientation,\n      enableOutsideDays: enableOutsideDays,\n      modifiers: visibleDays,\n      numberOfMonths: numberOfMonths,\n      onDayClick: this.onDayClick,\n      onDayMouseEnter: this.onDayMouseEnter,\n      onDayMouseLeave: this.onDayMouseLeave,\n      onPrevMonthClick: this.onPrevMonthClick,\n      onNextMonthClick: this.onNextMonthClick,\n      onMonthChange: this.onMonthChange,\n      onYearChange: this.onYearChange,\n      onGetNextScrollableMonths: this.onGetNextScrollableMonths,\n      onGetPrevScrollableMonths: this.onGetPrevScrollableMonths,\n      monthFormat: monthFormat,\n      withPortal: withPortal,\n      hidden: !focused,\n      hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n      initialVisibleMonth: function initialVisibleMonth() {\n        return currentMonth;\n      },\n      firstDayOfWeek: firstDayOfWeek,\n      onOutsideClick: onOutsideClick,\n      dayPickerNavigationInlineStyles: dayPickerNavigationInlineStyles,\n      navPosition: navPosition,\n      navPrev: navPrev,\n      navNext: navNext,\n      renderNavPrevButton: renderNavPrevButton,\n      renderNavNextButton: renderNavNextButton,\n      noNavButtons: noNavButtons,\n      noNavNextButton: noNavNextButton,\n      noNavPrevButton: noNavPrevButton,\n      renderMonthText: renderMonthText,\n      renderWeekHeaderElement: renderWeekHeaderElement,\n      renderCalendarDay: renderCalendarDay,\n      renderDayContents: renderDayContents,\n      renderCalendarInfo: renderCalendarInfo,\n      renderMonthElement: renderMonthElement,\n      calendarInfoPosition: calendarInfoPosition,\n      isFocused: isFocused,\n      getFirstFocusableDay: this.getFirstFocusableDay,\n      onBlur: onBlur,\n      onTab: onTab,\n      onShiftTab: onShiftTab,\n      phrases: phrases,\n      daySize: daySize,\n      isRTL: isRTL,\n      showKeyboardShortcuts: showKeyboardShortcuts,\n      weekDayFormat: weekDayFormat,\n      dayAriaLabelFormat: dayAriaLabelFormat,\n      verticalHeight: verticalHeight,\n      noBorder: noBorder,\n      transitionDuration: transitionDuration,\n      verticalBorderSpacing: verticalBorderSpacing,\n      horizontalMonthPadding: horizontalMonthPadding\n    });\n  };\n\n  return DayPickerSingleDateController;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports[\"default\"] = DayPickerSingleDateController;\nDayPickerSingleDateController.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nDayPickerSingleDateController.defaultProps = defaultProps;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _IconPositionShape = _interopRequireDefault(require(\"./IconPositionShape\"));\n\nvar _OrientationShape = _interopRequireDefault(require(\"./OrientationShape\"));\n\nvar _AnchorDirectionShape = _interopRequireDefault(require(\"./AnchorDirectionShape\"));\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"./OpenDirectionShape\"));\n\nvar _DayOfWeekShape = _interopRequireDefault(require(\"./DayOfWeekShape\"));\n\nvar _CalendarInfoPositionShape = _interopRequireDefault(require(\"./CalendarInfoPositionShape\"));\n\nvar _NavPositionShape = _interopRequireDefault(require(\"./NavPositionShape\"));\n\nvar _default = {\n  // required props for a functional interactive SingleDatePicker\n  date: _reactMomentProptypes[\"default\"].momentObj,\n  onDateChange: _propTypes[\"default\"].func.isRequired,\n  focused: _propTypes[\"default\"].bool,\n  onFocusChange: _propTypes[\"default\"].func.isRequired,\n  // input related props\n  id: _propTypes[\"default\"].string.isRequired,\n  placeholder: _propTypes[\"default\"].string,\n  ariaLabel: _propTypes[\"default\"].string,\n  disabled: _propTypes[\"default\"].bool,\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  screenReaderInputMessage: _propTypes[\"default\"].string,\n  showClearDate: _propTypes[\"default\"].bool,\n  customCloseIcon: _propTypes[\"default\"].node,\n  showDefaultInputIcon: _propTypes[\"default\"].bool,\n  inputIconPosition: _IconPositionShape[\"default\"],\n  customInputIcon: _propTypes[\"default\"].node,\n  noBorder: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  small: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  keepFocusOnInput: _propTypes[\"default\"].bool,\n  // calendar presentation and interaction related props\n  renderMonthText: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderMonthElement: (0, _airbnbPropTypes.mutuallyExclusiveProps)(_propTypes[\"default\"].func, 'renderMonthText', 'renderMonthElement'),\n  renderWeekHeaderElement: _propTypes[\"default\"].func,\n  orientation: _OrientationShape[\"default\"],\n  anchorDirection: _AnchorDirectionShape[\"default\"],\n  openDirection: _OpenDirectionShape[\"default\"],\n  horizontalMargin: _propTypes[\"default\"].number,\n  withPortal: _propTypes[\"default\"].bool,\n  withFullScreenPortal: _propTypes[\"default\"].bool,\n  appendToBody: _propTypes[\"default\"].bool,\n  disableScroll: _propTypes[\"default\"].bool,\n  initialVisibleMonth: _propTypes[\"default\"].func,\n  firstDayOfWeek: _DayOfWeekShape[\"default\"],\n  numberOfMonths: _propTypes[\"default\"].number,\n  keepOpenOnDateSelect: _propTypes[\"default\"].bool,\n  reopenPickerOnClearDate: _propTypes[\"default\"].bool,\n  renderCalendarInfo: _propTypes[\"default\"].func,\n  calendarInfoPosition: _CalendarInfoPositionShape[\"default\"],\n  hideKeyboardShortcutsPanel: _propTypes[\"default\"].bool,\n  daySize: _airbnbPropTypes.nonNegativeInteger,\n  isRTL: _propTypes[\"default\"].bool,\n  verticalHeight: _airbnbPropTypes.nonNegativeInteger,\n  transitionDuration: _airbnbPropTypes.nonNegativeInteger,\n  horizontalMonthPadding: _airbnbPropTypes.nonNegativeInteger,\n  // navigation related props\n  dayPickerNavigationInlineStyles: _propTypes[\"default\"].object,\n  navPosition: _NavPositionShape[\"default\"],\n  navPrev: _propTypes[\"default\"].node,\n  navNext: _propTypes[\"default\"].node,\n  renderNavPrevButton: _propTypes[\"default\"].func,\n  renderNavNextButton: _propTypes[\"default\"].func,\n  onPrevMonthClick: _propTypes[\"default\"].func,\n  onNextMonthClick: _propTypes[\"default\"].func,\n  onClose: _propTypes[\"default\"].func,\n  // day presentation and interaction related props\n  renderCalendarDay: _propTypes[\"default\"].func,\n  renderDayContents: _propTypes[\"default\"].func,\n  enableOutsideDays: _propTypes[\"default\"].bool,\n  isDayBlocked: _propTypes[\"default\"].func,\n  isOutsideRange: _propTypes[\"default\"].func,\n  isDayHighlighted: _propTypes[\"default\"].func,\n  // internationalization props\n  displayFormat: _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].string, _propTypes[\"default\"].func]),\n  monthFormat: _propTypes[\"default\"].string,\n  weekDayFormat: _propTypes[\"default\"].string,\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.SingleDatePickerPhrases)),\n  dayAriaLabelFormat: _propTypes[\"default\"].string\n};\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _DateInput = _interopRequireDefault(require(\"./DateInput\"));\n\nvar _IconPositionShape = _interopRequireDefault(require(\"../shapes/IconPositionShape\"));\n\nvar _CloseButton = _interopRequireDefault(require(\"./CloseButton\"));\n\nvar _CalendarIcon = _interopRequireDefault(require(\"./CalendarIcon\"));\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"../shapes/OpenDirectionShape\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {\n  id: _propTypes[\"default\"].string.isRequired,\n  children: _propTypes[\"default\"].node,\n  placeholder: _propTypes[\"default\"].string,\n  ariaLabel: _propTypes[\"default\"].string,\n  displayValue: _propTypes[\"default\"].string,\n  screenReaderMessage: _propTypes[\"default\"].string,\n  focused: _propTypes[\"default\"].bool,\n  isFocused: _propTypes[\"default\"].bool,\n  // describes actual DOM focus\n  disabled: _propTypes[\"default\"].bool,\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  openDirection: _OpenDirectionShape[\"default\"],\n  showCaret: _propTypes[\"default\"].bool,\n  showClearDate: _propTypes[\"default\"].bool,\n  customCloseIcon: _propTypes[\"default\"].node,\n  showDefaultInputIcon: _propTypes[\"default\"].bool,\n  inputIconPosition: _IconPositionShape[\"default\"],\n  customInputIcon: _propTypes[\"default\"].node,\n  isRTL: _propTypes[\"default\"].bool,\n  noBorder: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  small: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  onChange: _propTypes[\"default\"].func,\n  onClearDate: _propTypes[\"default\"].func,\n  onFocus: _propTypes[\"default\"].func,\n  onKeyDownShiftTab: _propTypes[\"default\"].func,\n  onKeyDownTab: _propTypes[\"default\"].func,\n  onKeyDownArrowDown: _propTypes[\"default\"].func,\n  onKeyDownQuestionMark: _propTypes[\"default\"].func,\n  // i18n\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.SingleDatePickerInputPhrases))\n})) : {};\nvar defaultProps = {\n  children: null,\n  placeholder: 'Select Date',\n  ariaLabel: undefined,\n  displayValue: '',\n  screenReaderMessage: '',\n  focused: false,\n  isFocused: false,\n  disabled: false,\n  required: false,\n  readOnly: false,\n  openDirection: _constants.OPEN_DOWN,\n  showCaret: false,\n  showClearDate: false,\n  showDefaultInputIcon: false,\n  inputIconPosition: _constants.ICON_BEFORE_POSITION,\n  customCloseIcon: null,\n  customInputIcon: null,\n  isRTL: false,\n  noBorder: false,\n  block: false,\n  small: false,\n  regular: false,\n  verticalSpacing: undefined,\n  onChange: function onChange() {},\n  onClearDate: function onClearDate() {},\n  onFocus: function onFocus() {},\n  onKeyDownShiftTab: function onKeyDownShiftTab() {},\n  onKeyDownTab: function onKeyDownTab() {},\n  onKeyDownArrowDown: function onKeyDownArrowDown() {},\n  onKeyDownQuestionMark: function onKeyDownQuestionMark() {},\n  // i18n\n  phrases: _defaultPhrases.SingleDatePickerInputPhrases\n};\n\nfunction SingleDatePickerInput(_ref) {\n  var id = _ref.id,\n      children = _ref.children,\n      placeholder = _ref.placeholder,\n      ariaLabel = _ref.ariaLabel,\n      displayValue = _ref.displayValue,\n      focused = _ref.focused,\n      isFocused = _ref.isFocused,\n      disabled = _ref.disabled,\n      required = _ref.required,\n      readOnly = _ref.readOnly,\n      showCaret = _ref.showCaret,\n      showClearDate = _ref.showClearDate,\n      showDefaultInputIcon = _ref.showDefaultInputIcon,\n      inputIconPosition = _ref.inputIconPosition,\n      phrases = _ref.phrases,\n      onClearDate = _ref.onClearDate,\n      onChange = _ref.onChange,\n      onFocus = _ref.onFocus,\n      onKeyDownShiftTab = _ref.onKeyDownShiftTab,\n      onKeyDownTab = _ref.onKeyDownTab,\n      onKeyDownArrowDown = _ref.onKeyDownArrowDown,\n      onKeyDownQuestionMark = _ref.onKeyDownQuestionMark,\n      screenReaderMessage = _ref.screenReaderMessage,\n      customCloseIcon = _ref.customCloseIcon,\n      customInputIcon = _ref.customInputIcon,\n      openDirection = _ref.openDirection,\n      isRTL = _ref.isRTL,\n      noBorder = _ref.noBorder,\n      block = _ref.block,\n      small = _ref.small,\n      regular = _ref.regular,\n      verticalSpacing = _ref.verticalSpacing,\n      styles = _ref.styles;\n\n  var calendarIcon = customInputIcon || _react[\"default\"].createElement(_CalendarIcon[\"default\"], (0, _reactWithStyles.css)(styles.SingleDatePickerInput_calendarIcon_svg));\n\n  var closeIcon = customCloseIcon || _react[\"default\"].createElement(_CloseButton[\"default\"], (0, _reactWithStyles.css)(styles.SingleDatePickerInput_clearDate_svg, small && styles.SingleDatePickerInput_clearDate_svg__small));\n\n  var screenReaderText = screenReaderMessage || phrases.keyboardForwardNavigationInstructions;\n\n  var inputIcon = (showDefaultInputIcon || customInputIcon !== null) && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.SingleDatePickerInput_calendarIcon), {\n    type: \"button\",\n    disabled: disabled,\n    \"aria-label\": phrases.focusStartDate,\n    onClick: onFocus\n  }), calendarIcon);\n\n  return _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.SingleDatePickerInput, disabled && styles.SingleDatePickerInput__disabled, isRTL && styles.SingleDatePickerInput__rtl, !noBorder && styles.SingleDatePickerInput__withBorder, block && styles.SingleDatePickerInput__block, showClearDate && styles.SingleDatePickerInput__showClearDate), inputIconPosition === _constants.ICON_BEFORE_POSITION && inputIcon, _react[\"default\"].createElement(_DateInput[\"default\"], {\n    id: id,\n    placeholder: placeholder,\n    ariaLabel: ariaLabel,\n    displayValue: displayValue,\n    screenReaderMessage: screenReaderText,\n    focused: focused,\n    isFocused: isFocused,\n    disabled: disabled,\n    required: required,\n    readOnly: readOnly,\n    showCaret: showCaret,\n    onChange: onChange,\n    onFocus: onFocus,\n    onKeyDownShiftTab: onKeyDownShiftTab,\n    onKeyDownTab: onKeyDownTab,\n    onKeyDownArrowDown: onKeyDownArrowDown,\n    onKeyDownQuestionMark: onKeyDownQuestionMark,\n    openDirection: openDirection,\n    verticalSpacing: verticalSpacing,\n    small: small,\n    regular: regular,\n    block: block\n  }), children, showClearDate && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.SingleDatePickerInput_clearDate, small && styles.SingleDatePickerInput_clearDate__small, !customCloseIcon && styles.SingleDatePickerInput_clearDate__default, !displayValue && styles.SingleDatePickerInput_clearDate__hide), {\n    type: \"button\",\n    \"aria-label\": phrases.clearDate,\n    disabled: disabled,\n    onClick: onClearDate\n  }), closeIcon), inputIconPosition === _constants.ICON_AFTER_POSITION && inputIcon);\n}\n\nSingleDatePickerInput.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nSingleDatePickerInput.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref2) {\n  var _ref2$reactDates = _ref2.reactDates,\n      border = _ref2$reactDates.border,\n      color = _ref2$reactDates.color;\n  return {\n    SingleDatePickerInput: {\n      display: 'inline-block',\n      backgroundColor: color.background\n    },\n    SingleDatePickerInput__withBorder: {\n      borderColor: color.border,\n      borderWidth: border.pickerInput.borderWidth,\n      borderStyle: border.pickerInput.borderStyle,\n      borderRadius: border.pickerInput.borderRadius\n    },\n    SingleDatePickerInput__rtl: {\n      direction: (0, _noflip[\"default\"])('rtl')\n    },\n    SingleDatePickerInput__disabled: {\n      backgroundColor: color.disabled\n    },\n    SingleDatePickerInput__block: {\n      display: 'block'\n    },\n    SingleDatePickerInput__showClearDate: {\n      paddingRight: 30 // TODO: should be noflip wrapped and handled by an isRTL prop\n\n    },\n    SingleDatePickerInput_clearDate: {\n      background: 'none',\n      border: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      cursor: 'pointer',\n      padding: 10,\n      margin: '0 10px 0 5px',\n      // TODO: should be noflip wrapped and handled by an isRTL prop\n      position: 'absolute',\n      right: 0,\n      // TODO: should be noflip wrapped and handled by an isRTL prop\n      top: '50%',\n      transform: 'translateY(-50%)'\n    },\n    SingleDatePickerInput_clearDate__default: {\n      ':focus': {\n        background: color.core.border,\n        borderRadius: '50%'\n      },\n      ':hover': {\n        background: color.core.border,\n        borderRadius: '50%'\n      }\n    },\n    SingleDatePickerInput_clearDate__small: {\n      padding: 6\n    },\n    SingleDatePickerInput_clearDate__hide: {\n      visibility: 'hidden'\n    },\n    SingleDatePickerInput_clearDate_svg: {\n      fill: color.core.grayLight,\n      height: 12,\n      width: 15,\n      verticalAlign: 'middle'\n    },\n    SingleDatePickerInput_clearDate_svg__small: {\n      height: 9\n    },\n    SingleDatePickerInput_calendarIcon: {\n      background: 'none',\n      border: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      cursor: 'pointer',\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      padding: 10,\n      margin: '0 5px 0 10px' // TODO: should be noflip wrapped and handled by an isRTL prop\n\n    },\n    SingleDatePickerInput_calendarIcon_svg: {\n      fill: color.core.grayLight,\n      height: 15,\n      width: 14,\n      verticalAlign: 'middle'\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(SingleDatePickerInput);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _reactMomentProptypes = _interopRequireDefault(require(\"react-moment-proptypes\"));\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _OpenDirectionShape = _interopRequireDefault(require(\"../shapes/OpenDirectionShape\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getPhrasePropTypes = _interopRequireDefault(require(\"../utils/getPhrasePropTypes\"));\n\nvar _SingleDatePickerInput = _interopRequireDefault(require(\"./SingleDatePickerInput\"));\n\nvar _IconPositionShape = _interopRequireDefault(require(\"../shapes/IconPositionShape\"));\n\nvar _DisabledShape = _interopRequireDefault(require(\"../shapes/DisabledShape\"));\n\nvar _toMomentObject = _interopRequireDefault(require(\"../utils/toMomentObject\"));\n\nvar _toLocalizedDateString = _interopRequireDefault(require(\"../utils/toLocalizedDateString\"));\n\nvar _isInclusivelyAfterDay = _interopRequireDefault(require(\"../utils/isInclusivelyAfterDay\"));\n\nvar _constants = require(\"../constants\");\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)({\n  children: _propTypes[\"default\"].node,\n  date: _reactMomentProptypes[\"default\"].momentObj,\n  onDateChange: _propTypes[\"default\"].func.isRequired,\n  focused: _propTypes[\"default\"].bool,\n  onFocusChange: _propTypes[\"default\"].func.isRequired,\n  id: _propTypes[\"default\"].string.isRequired,\n  placeholder: _propTypes[\"default\"].string,\n  ariaLabel: _propTypes[\"default\"].string,\n  screenReaderMessage: _propTypes[\"default\"].string,\n  showClearDate: _propTypes[\"default\"].bool,\n  showCaret: _propTypes[\"default\"].bool,\n  showDefaultInputIcon: _propTypes[\"default\"].bool,\n  inputIconPosition: _IconPositionShape[\"default\"],\n  disabled: _DisabledShape[\"default\"],\n  required: _propTypes[\"default\"].bool,\n  readOnly: _propTypes[\"default\"].bool,\n  openDirection: _OpenDirectionShape[\"default\"],\n  noBorder: _propTypes[\"default\"].bool,\n  block: _propTypes[\"default\"].bool,\n  small: _propTypes[\"default\"].bool,\n  regular: _propTypes[\"default\"].bool,\n  verticalSpacing: _airbnbPropTypes.nonNegativeInteger,\n  keepOpenOnDateSelect: _propTypes[\"default\"].bool,\n  reopenPickerOnClearDate: _propTypes[\"default\"].bool,\n  isOutsideRange: _propTypes[\"default\"].func,\n  displayFormat: _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].string, _propTypes[\"default\"].func]),\n  onClose: _propTypes[\"default\"].func,\n  onKeyDownArrowDown: _propTypes[\"default\"].func,\n  onKeyDownQuestionMark: _propTypes[\"default\"].func,\n  customInputIcon: _propTypes[\"default\"].node,\n  customCloseIcon: _propTypes[\"default\"].node,\n  // accessibility\n  isFocused: _propTypes[\"default\"].bool,\n  // i18n\n  phrases: _propTypes[\"default\"].shape((0, _getPhrasePropTypes[\"default\"])(_defaultPhrases.SingleDatePickerInputPhrases)),\n  isRTL: _propTypes[\"default\"].bool\n}) : {};\nvar defaultProps = {\n  children: null,\n  date: null,\n  focused: false,\n  placeholder: '',\n  ariaLabel: undefined,\n  screenReaderMessage: 'Date',\n  showClearDate: false,\n  showCaret: false,\n  showDefaultInputIcon: false,\n  inputIconPosition: _constants.ICON_BEFORE_POSITION,\n  disabled: false,\n  required: false,\n  readOnly: false,\n  openDirection: _constants.OPEN_DOWN,\n  noBorder: false,\n  block: false,\n  small: false,\n  regular: false,\n  verticalSpacing: undefined,\n  keepOpenOnDateSelect: false,\n  reopenPickerOnClearDate: false,\n  isOutsideRange: function isOutsideRange(day) {\n    return !(0, _isInclusivelyAfterDay[\"default\"])(day, (0, _moment[\"default\"])());\n  },\n  displayFormat: function displayFormat() {\n    return _moment[\"default\"].localeData().longDateFormat('L');\n  },\n  onClose: function onClose() {},\n  onKeyDownArrowDown: function onKeyDownArrowDown() {},\n  onKeyDownQuestionMark: function onKeyDownQuestionMark() {},\n  customInputIcon: null,\n  customCloseIcon: null,\n  // accessibility\n  isFocused: false,\n  // i18n\n  phrases: _defaultPhrases.SingleDatePickerInputPhrases,\n  isRTL: false\n};\n\nvar SingleDatePickerInputController =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(SingleDatePickerInputController, _ref);\n  var _proto = SingleDatePickerInputController.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function SingleDatePickerInputController(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.onChange = _this.onChange.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onFocus = _this.onFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onClearFocus = _this.onClearFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.clearDate = _this.clearDate.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n\n  _proto.onChange = function onChange(dateString) {\n    var _this$props = this.props,\n        isOutsideRange = _this$props.isOutsideRange,\n        keepOpenOnDateSelect = _this$props.keepOpenOnDateSelect,\n        onDateChange = _this$props.onDateChange,\n        onFocusChange = _this$props.onFocusChange,\n        onClose = _this$props.onClose;\n    var newDate = (0, _toMomentObject[\"default\"])(dateString, this.getDisplayFormat());\n    var isValid = newDate && !isOutsideRange(newDate);\n\n    if (isValid) {\n      onDateChange(newDate);\n\n      if (!keepOpenOnDateSelect) {\n        onFocusChange({\n          focused: false\n        });\n        onClose({\n          date: newDate\n        });\n      }\n    } else {\n      onDateChange(null);\n    }\n  };\n\n  _proto.onFocus = function onFocus() {\n    var _this$props2 = this.props,\n        onFocusChange = _this$props2.onFocusChange,\n        disabled = _this$props2.disabled;\n\n    if (!disabled) {\n      onFocusChange({\n        focused: true\n      });\n    }\n  };\n\n  _proto.onClearFocus = function onClearFocus() {\n    var _this$props3 = this.props,\n        focused = _this$props3.focused,\n        onFocusChange = _this$props3.onFocusChange,\n        onClose = _this$props3.onClose,\n        date = _this$props3.date;\n    if (!focused) return;\n    onFocusChange({\n      focused: false\n    });\n    onClose({\n      date: date\n    });\n  };\n\n  _proto.getDisplayFormat = function getDisplayFormat() {\n    var displayFormat = this.props.displayFormat;\n    return typeof displayFormat === 'string' ? displayFormat : displayFormat();\n  };\n\n  _proto.getDateString = function getDateString(date) {\n    var displayFormat = this.getDisplayFormat();\n\n    if (date && displayFormat) {\n      return date && date.format(displayFormat);\n    }\n\n    return (0, _toLocalizedDateString[\"default\"])(date);\n  };\n\n  _proto.clearDate = function clearDate() {\n    var _this$props4 = this.props,\n        onDateChange = _this$props4.onDateChange,\n        reopenPickerOnClearDate = _this$props4.reopenPickerOnClearDate,\n        onFocusChange = _this$props4.onFocusChange;\n    onDateChange(null);\n\n    if (reopenPickerOnClearDate) {\n      onFocusChange({\n        focused: true\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props5 = this.props,\n        children = _this$props5.children,\n        id = _this$props5.id,\n        placeholder = _this$props5.placeholder,\n        ariaLabel = _this$props5.ariaLabel,\n        disabled = _this$props5.disabled,\n        focused = _this$props5.focused,\n        isFocused = _this$props5.isFocused,\n        required = _this$props5.required,\n        readOnly = _this$props5.readOnly,\n        openDirection = _this$props5.openDirection,\n        showClearDate = _this$props5.showClearDate,\n        showCaret = _this$props5.showCaret,\n        showDefaultInputIcon = _this$props5.showDefaultInputIcon,\n        inputIconPosition = _this$props5.inputIconPosition,\n        customCloseIcon = _this$props5.customCloseIcon,\n        customInputIcon = _this$props5.customInputIcon,\n        date = _this$props5.date,\n        phrases = _this$props5.phrases,\n        onKeyDownArrowDown = _this$props5.onKeyDownArrowDown,\n        onKeyDownQuestionMark = _this$props5.onKeyDownQuestionMark,\n        screenReaderMessage = _this$props5.screenReaderMessage,\n        isRTL = _this$props5.isRTL,\n        noBorder = _this$props5.noBorder,\n        block = _this$props5.block,\n        small = _this$props5.small,\n        regular = _this$props5.regular,\n        verticalSpacing = _this$props5.verticalSpacing;\n    var displayValue = this.getDateString(date);\n    return _react[\"default\"].createElement(_SingleDatePickerInput[\"default\"], {\n      id: id,\n      placeholder: placeholder,\n      ariaLabel: ariaLabel,\n      focused: focused,\n      isFocused: isFocused,\n      disabled: disabled,\n      required: required,\n      readOnly: readOnly,\n      openDirection: openDirection,\n      showCaret: showCaret,\n      onClearDate: this.clearDate,\n      showClearDate: showClearDate,\n      showDefaultInputIcon: showDefaultInputIcon,\n      inputIconPosition: inputIconPosition,\n      customCloseIcon: customCloseIcon,\n      customInputIcon: customInputIcon,\n      displayValue: displayValue,\n      onChange: this.onChange,\n      onFocus: this.onFocus,\n      onKeyDownShiftTab: this.onClearFocus,\n      onKeyDownArrowDown: onKeyDownArrowDown,\n      onKeyDownQuestionMark: onKeyDownQuestionMark,\n      screenReaderMessage: screenReaderMessage,\n      phrases: phrases,\n      isRTL: isRTL,\n      noBorder: noBorder,\n      block: block,\n      small: small,\n      regular: regular,\n      verticalSpacing: verticalSpacing\n    }, children);\n  };\n\n  return SingleDatePickerInputController;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports[\"default\"] = SingleDatePickerInputController;\nSingleDatePickerInputController.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nSingleDatePickerInputController.defaultProps = defaultProps;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = exports.PureSingleDatePicker = void 0;\n\nvar _enzymeShallowEqual = _interopRequireDefault(require(\"enzyme-shallow-equal\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _reactWithStyles = require(\"react-with-styles\");\n\nvar _reactPortal = require(\"react-portal\");\n\nvar _airbnbPropTypes = require(\"airbnb-prop-types\");\n\nvar _consolidatedEvents = require(\"consolidated-events\");\n\nvar _isTouchDevice = _interopRequireDefault(require(\"is-touch-device\"));\n\nvar _reactOutsideClickHandler = _interopRequireDefault(require(\"react-outside-click-handler\"));\n\nvar _SingleDatePickerShape = _interopRequireDefault(require(\"../shapes/SingleDatePickerShape\"));\n\nvar _defaultPhrases = require(\"../defaultPhrases\");\n\nvar _getResponsiveContainerStyles = _interopRequireDefault(require(\"../utils/getResponsiveContainerStyles\"));\n\nvar _getDetachedContainerStyles = _interopRequireDefault(require(\"../utils/getDetachedContainerStyles\"));\n\nvar _getInputHeight = _interopRequireDefault(require(\"../utils/getInputHeight\"));\n\nvar _isInclusivelyAfterDay = _interopRequireDefault(require(\"../utils/isInclusivelyAfterDay\"));\n\nvar _disableScroll2 = _interopRequireDefault(require(\"../utils/disableScroll\"));\n\nvar _noflip = _interopRequireDefault(require(\"../utils/noflip\"));\n\nvar _SingleDatePickerInputController = _interopRequireDefault(require(\"./SingleDatePickerInputController\"));\n\nvar _DayPickerSingleDateController = _interopRequireDefault(require(\"./DayPickerSingleDateController\"));\n\nvar _CloseButton = _interopRequireDefault(require(\"./CloseButton\"));\n\nvar _constants = require(\"../constants\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar propTypes = process.env.NODE_ENV !== \"production\" ? (0, _airbnbPropTypes.forbidExtraProps)(_objectSpread({}, _reactWithStyles.withStylesPropTypes, {}, _SingleDatePickerShape[\"default\"])) : {};\nvar defaultProps = {\n  // required props for a functional interactive SingleDatePicker\n  date: null,\n  focused: false,\n  // input related props\n  id: 'date',\n  placeholder: 'Date',\n  ariaLabel: undefined,\n  disabled: false,\n  required: false,\n  readOnly: false,\n  screenReaderInputMessage: '',\n  showClearDate: false,\n  showDefaultInputIcon: false,\n  inputIconPosition: _constants.ICON_BEFORE_POSITION,\n  customInputIcon: null,\n  customCloseIcon: null,\n  noBorder: false,\n  block: false,\n  small: false,\n  regular: false,\n  verticalSpacing: _constants.DEFAULT_VERTICAL_SPACING,\n  keepFocusOnInput: false,\n  // calendar presentation and interaction related props\n  orientation: _constants.HORIZONTAL_ORIENTATION,\n  anchorDirection: _constants.ANCHOR_LEFT,\n  openDirection: _constants.OPEN_DOWN,\n  horizontalMargin: 0,\n  withPortal: false,\n  withFullScreenPortal: false,\n  appendToBody: false,\n  disableScroll: false,\n  initialVisibleMonth: null,\n  firstDayOfWeek: null,\n  numberOfMonths: 2,\n  keepOpenOnDateSelect: false,\n  reopenPickerOnClearDate: false,\n  renderCalendarInfo: null,\n  calendarInfoPosition: _constants.INFO_POSITION_BOTTOM,\n  hideKeyboardShortcutsPanel: false,\n  daySize: _constants.DAY_SIZE,\n  isRTL: false,\n  verticalHeight: null,\n  transitionDuration: undefined,\n  horizontalMonthPadding: 13,\n  // navigation related props\n  dayPickerNavigationInlineStyles: null,\n  navPosition: _constants.NAV_POSITION_TOP,\n  navPrev: null,\n  navNext: null,\n  renderNavPrevButton: null,\n  renderNavNextButton: null,\n  onPrevMonthClick: function onPrevMonthClick() {},\n  onNextMonthClick: function onNextMonthClick() {},\n  onClose: function onClose() {},\n  // month presentation and interaction related props\n  renderMonthText: null,\n  renderWeekHeaderElement: null,\n  // day presentation and interaction related props\n  renderCalendarDay: undefined,\n  renderDayContents: null,\n  renderMonthElement: null,\n  enableOutsideDays: false,\n  isDayBlocked: function isDayBlocked() {\n    return false;\n  },\n  isOutsideRange: function isOutsideRange(day) {\n    return !(0, _isInclusivelyAfterDay[\"default\"])(day, (0, _moment[\"default\"])());\n  },\n  isDayHighlighted: function isDayHighlighted() {},\n  // internationalization props\n  displayFormat: function displayFormat() {\n    return _moment[\"default\"].localeData().longDateFormat('L');\n  },\n  monthFormat: 'MMMM YYYY',\n  weekDayFormat: 'dd',\n  phrases: _defaultPhrases.SingleDatePickerPhrases,\n  dayAriaLabelFormat: undefined\n};\n\nvar SingleDatePicker =\n/*#__PURE__*/\nfunction (_ref) {\n  (0, _inheritsLoose2[\"default\"])(SingleDatePicker, _ref);\n  var _proto = SingleDatePicker.prototype;\n\n  _proto[!_react[\"default\"].PureComponent && \"shouldComponentUpdate\"] = function (nextProps, nextState) {\n    return !(0, _enzymeShallowEqual[\"default\"])(this.props, nextProps) || !(0, _enzymeShallowEqual[\"default\"])(this.state, nextState);\n  };\n\n  function SingleDatePicker(props) {\n    var _this;\n\n    _this = _ref.call(this, props) || this;\n    _this.isTouchDevice = false;\n    _this.state = {\n      dayPickerContainerStyles: {},\n      isDayPickerFocused: false,\n      isInputFocused: false,\n      showKeyboardShortcuts: false\n    };\n    _this.onFocusOut = _this.onFocusOut.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onOutsideClick = _this.onOutsideClick.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onInputFocus = _this.onInputFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayPickerFocus = _this.onDayPickerFocus.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.onDayPickerBlur = _this.onDayPickerBlur.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.showKeyboardShortcutsPanel = _this.showKeyboardShortcutsPanel.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.responsivizePickerPosition = _this.responsivizePickerPosition.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.disableScroll = _this.disableScroll.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setDayPickerContainerRef = _this.setDayPickerContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    _this.setContainerRef = _this.setContainerRef.bind((0, _assertThisInitialized2[\"default\"])(_this));\n    return _this;\n  }\n  /* istanbul ignore next */\n\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.removeResizeEventListener = (0, _consolidatedEvents.addEventListener)(window, 'resize', this.responsivizePickerPosition, {\n      passive: true\n    });\n    this.responsivizePickerPosition();\n    this.disableScroll();\n    var focused = this.props.focused;\n\n    if (focused) {\n      this.setState({\n        isInputFocused: true\n      });\n    }\n\n    this.isTouchDevice = (0, _isTouchDevice[\"default\"])();\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var focused = this.props.focused;\n\n    if (!prevProps.focused && focused) {\n      this.responsivizePickerPosition();\n      this.disableScroll();\n    } else if (prevProps.focused && !focused) {\n      if (this.enableScroll) this.enableScroll();\n    }\n  }\n  /* istanbul ignore next */\n  ;\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.removeResizeEventListener) this.removeResizeEventListener();\n    if (this.removeFocusOutEventListener) this.removeFocusOutEventListener();\n    if (this.enableScroll) this.enableScroll();\n  };\n\n  _proto.onOutsideClick = function onOutsideClick(event) {\n    var _this$props = this.props,\n        focused = _this$props.focused,\n        onFocusChange = _this$props.onFocusChange,\n        onClose = _this$props.onClose,\n        date = _this$props.date,\n        appendToBody = _this$props.appendToBody;\n    if (!focused) return;\n    if (appendToBody && this.dayPickerContainer.contains(event.target)) return;\n    this.setState({\n      isInputFocused: false,\n      isDayPickerFocused: false,\n      showKeyboardShortcuts: false\n    });\n    onFocusChange({\n      focused: false\n    });\n    onClose({\n      date: date\n    });\n  };\n\n  _proto.onInputFocus = function onInputFocus(_ref2) {\n    var focused = _ref2.focused;\n    var _this$props2 = this.props,\n        onFocusChange = _this$props2.onFocusChange,\n        readOnly = _this$props2.readOnly,\n        withPortal = _this$props2.withPortal,\n        withFullScreenPortal = _this$props2.withFullScreenPortal,\n        keepFocusOnInput = _this$props2.keepFocusOnInput;\n\n    if (focused) {\n      var withAnyPortal = withPortal || withFullScreenPortal;\n      var moveFocusToDayPicker = withAnyPortal || readOnly && !keepFocusOnInput || this.isTouchDevice && !keepFocusOnInput;\n\n      if (moveFocusToDayPicker) {\n        this.onDayPickerFocus();\n      } else {\n        this.onDayPickerBlur();\n      }\n    }\n\n    onFocusChange({\n      focused: focused\n    });\n  };\n\n  _proto.onDayPickerFocus = function onDayPickerFocus() {\n    this.setState({\n      isInputFocused: false,\n      isDayPickerFocused: true,\n      showKeyboardShortcuts: false\n    });\n  };\n\n  _proto.onDayPickerBlur = function onDayPickerBlur() {\n    this.setState({\n      isInputFocused: true,\n      isDayPickerFocused: false,\n      showKeyboardShortcuts: false\n    });\n  };\n\n  _proto.onFocusOut = function onFocusOut(e) {\n    var onFocusChange = this.props.onFocusChange; // In cases where **relatedTarget** is not null, it points to the right\n    // element here. However, in cases where it is null (such as clicking on a\n    // specific day) or it is **document.body** (IE11), the appropriate value is **event.target**.\n    //\n    // We handle both situations here by using the ` || ` operator to fallback\n    // to *event.target** when **relatedTarget** is not provided.\n\n    var relatedTarget = e.relatedTarget === document.body ? e.target : e.relatedTarget || e.target;\n    if (this.dayPickerContainer.contains(relatedTarget)) return;\n    onFocusChange({\n      focused: false\n    });\n  };\n\n  _proto.setDayPickerContainerRef = function setDayPickerContainerRef(ref) {\n    if (ref === this.dayPickerContainer) return;\n    this.removeEventListeners();\n    this.dayPickerContainer = ref;\n    if (!ref) return;\n    this.addEventListeners();\n  };\n\n  _proto.setContainerRef = function setContainerRef(ref) {\n    this.container = ref;\n  };\n\n  _proto.addEventListeners = function addEventListeners() {\n    // We manually set event because React has not implemented onFocusIn/onFocusOut.\n    // Keep an eye on https://github.com/facebook/react/issues/6410 for updates\n    // We use \"blur w/ useCapture param\" vs \"onfocusout\" for FF browser support\n    this.removeFocusOutEventListener = (0, _consolidatedEvents.addEventListener)(this.dayPickerContainer, 'focusout', this.onFocusOut);\n  };\n\n  _proto.removeEventListeners = function removeEventListeners() {\n    if (this.removeFocusOutEventListener) this.removeFocusOutEventListener();\n  };\n\n  _proto.disableScroll = function disableScroll() {\n    var _this$props3 = this.props,\n        appendToBody = _this$props3.appendToBody,\n        propDisableScroll = _this$props3.disableScroll,\n        focused = _this$props3.focused;\n    if (!appendToBody && !propDisableScroll) return;\n    if (!focused) return; // Disable scroll for every ancestor of this <SingleDatePicker> up to the\n    // document level. This ensures the input and the picker never move. Other\n    // sibling elements or the picker itself can scroll.\n\n    this.enableScroll = (0, _disableScroll2[\"default\"])(this.container);\n  }\n  /* istanbul ignore next */\n  ;\n\n  _proto.responsivizePickerPosition = function responsivizePickerPosition() {\n    // It's possible the portal props have been changed in response to window resizes\n    // So let's ensure we reset this back to the base state each time\n    this.setState({\n      dayPickerContainerStyles: {}\n    });\n    var _this$props4 = this.props,\n        openDirection = _this$props4.openDirection,\n        anchorDirection = _this$props4.anchorDirection,\n        horizontalMargin = _this$props4.horizontalMargin,\n        withPortal = _this$props4.withPortal,\n        withFullScreenPortal = _this$props4.withFullScreenPortal,\n        appendToBody = _this$props4.appendToBody,\n        focused = _this$props4.focused;\n    var dayPickerContainerStyles = this.state.dayPickerContainerStyles;\n\n    if (!focused) {\n      return;\n    }\n\n    var isAnchoredLeft = anchorDirection === _constants.ANCHOR_LEFT;\n\n    if (!withPortal && !withFullScreenPortal) {\n      var containerRect = this.dayPickerContainer.getBoundingClientRect();\n      var currentOffset = dayPickerContainerStyles[anchorDirection] || 0;\n      var containerEdge = isAnchoredLeft ? containerRect[_constants.ANCHOR_RIGHT] : containerRect[_constants.ANCHOR_LEFT];\n      this.setState({\n        dayPickerContainerStyles: _objectSpread({}, (0, _getResponsiveContainerStyles[\"default\"])(anchorDirection, currentOffset, containerEdge, horizontalMargin), {}, appendToBody && (0, _getDetachedContainerStyles[\"default\"])(openDirection, anchorDirection, this.container))\n      });\n    }\n  };\n\n  _proto.showKeyboardShortcutsPanel = function showKeyboardShortcutsPanel() {\n    this.setState({\n      isInputFocused: false,\n      isDayPickerFocused: true,\n      showKeyboardShortcuts: true\n    });\n  };\n\n  _proto.maybeRenderDayPickerWithPortal = function maybeRenderDayPickerWithPortal() {\n    var _this$props5 = this.props,\n        focused = _this$props5.focused,\n        withPortal = _this$props5.withPortal,\n        withFullScreenPortal = _this$props5.withFullScreenPortal,\n        appendToBody = _this$props5.appendToBody;\n\n    if (!focused) {\n      return null;\n    }\n\n    if (withPortal || withFullScreenPortal || appendToBody) {\n      return _react[\"default\"].createElement(_reactPortal.Portal, null, this.renderDayPicker());\n    }\n\n    return this.renderDayPicker();\n  };\n\n  _proto.renderDayPicker = function renderDayPicker() {\n    var _this$props6 = this.props,\n        anchorDirection = _this$props6.anchorDirection,\n        openDirection = _this$props6.openDirection,\n        onDateChange = _this$props6.onDateChange,\n        date = _this$props6.date,\n        onFocusChange = _this$props6.onFocusChange,\n        focused = _this$props6.focused,\n        enableOutsideDays = _this$props6.enableOutsideDays,\n        numberOfMonths = _this$props6.numberOfMonths,\n        orientation = _this$props6.orientation,\n        monthFormat = _this$props6.monthFormat,\n        dayPickerNavigationInlineStyles = _this$props6.dayPickerNavigationInlineStyles,\n        navPosition = _this$props6.navPosition,\n        navPrev = _this$props6.navPrev,\n        navNext = _this$props6.navNext,\n        renderNavPrevButton = _this$props6.renderNavPrevButton,\n        renderNavNextButton = _this$props6.renderNavNextButton,\n        onPrevMonthClick = _this$props6.onPrevMonthClick,\n        onNextMonthClick = _this$props6.onNextMonthClick,\n        onClose = _this$props6.onClose,\n        withPortal = _this$props6.withPortal,\n        withFullScreenPortal = _this$props6.withFullScreenPortal,\n        keepOpenOnDateSelect = _this$props6.keepOpenOnDateSelect,\n        initialVisibleMonth = _this$props6.initialVisibleMonth,\n        renderMonthText = _this$props6.renderMonthText,\n        renderWeekHeaderElement = _this$props6.renderWeekHeaderElement,\n        renderCalendarDay = _this$props6.renderCalendarDay,\n        renderDayContents = _this$props6.renderDayContents,\n        renderCalendarInfo = _this$props6.renderCalendarInfo,\n        renderMonthElement = _this$props6.renderMonthElement,\n        calendarInfoPosition = _this$props6.calendarInfoPosition,\n        hideKeyboardShortcutsPanel = _this$props6.hideKeyboardShortcutsPanel,\n        firstDayOfWeek = _this$props6.firstDayOfWeek,\n        customCloseIcon = _this$props6.customCloseIcon,\n        phrases = _this$props6.phrases,\n        dayAriaLabelFormat = _this$props6.dayAriaLabelFormat,\n        daySize = _this$props6.daySize,\n        isRTL = _this$props6.isRTL,\n        isOutsideRange = _this$props6.isOutsideRange,\n        isDayBlocked = _this$props6.isDayBlocked,\n        isDayHighlighted = _this$props6.isDayHighlighted,\n        weekDayFormat = _this$props6.weekDayFormat,\n        styles = _this$props6.styles,\n        verticalHeight = _this$props6.verticalHeight,\n        transitionDuration = _this$props6.transitionDuration,\n        verticalSpacing = _this$props6.verticalSpacing,\n        horizontalMonthPadding = _this$props6.horizontalMonthPadding,\n        small = _this$props6.small,\n        reactDates = _this$props6.theme.reactDates;\n    var _this$state = this.state,\n        dayPickerContainerStyles = _this$state.dayPickerContainerStyles,\n        isDayPickerFocused = _this$state.isDayPickerFocused,\n        showKeyboardShortcuts = _this$state.showKeyboardShortcuts;\n    var onOutsideClick = !withFullScreenPortal && withPortal ? this.onOutsideClick : undefined;\n\n    var closeIcon = customCloseIcon || _react[\"default\"].createElement(_CloseButton[\"default\"], null);\n\n    var inputHeight = (0, _getInputHeight[\"default\"])(reactDates, small);\n    var withAnyPortal = withPortal || withFullScreenPortal;\n    /* eslint-disable jsx-a11y/no-static-element-interactions */\n\n    /* eslint-disable jsx-a11y/click-events-have-key-events */\n\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      ref: this.setDayPickerContainerRef\n    }, (0, _reactWithStyles.css)(styles.SingleDatePicker_picker, anchorDirection === _constants.ANCHOR_LEFT && styles.SingleDatePicker_picker__directionLeft, anchorDirection === _constants.ANCHOR_RIGHT && styles.SingleDatePicker_picker__directionRight, openDirection === _constants.OPEN_DOWN && styles.SingleDatePicker_picker__openDown, openDirection === _constants.OPEN_UP && styles.SingleDatePicker_picker__openUp, !withAnyPortal && openDirection === _constants.OPEN_DOWN && {\n      top: inputHeight + verticalSpacing\n    }, !withAnyPortal && openDirection === _constants.OPEN_UP && {\n      bottom: inputHeight + verticalSpacing\n    }, orientation === _constants.HORIZONTAL_ORIENTATION && styles.SingleDatePicker_picker__horizontal, orientation === _constants.VERTICAL_ORIENTATION && styles.SingleDatePicker_picker__vertical, withAnyPortal && styles.SingleDatePicker_picker__portal, withFullScreenPortal && styles.SingleDatePicker_picker__fullScreenPortal, isRTL && styles.SingleDatePicker_picker__rtl, dayPickerContainerStyles), {\n      onClick: onOutsideClick\n    }), _react[\"default\"].createElement(_DayPickerSingleDateController[\"default\"], {\n      date: date,\n      onDateChange: onDateChange,\n      onFocusChange: onFocusChange,\n      orientation: orientation,\n      enableOutsideDays: enableOutsideDays,\n      numberOfMonths: numberOfMonths,\n      monthFormat: monthFormat,\n      withPortal: withAnyPortal,\n      focused: focused,\n      keepOpenOnDateSelect: keepOpenOnDateSelect,\n      hideKeyboardShortcutsPanel: hideKeyboardShortcutsPanel,\n      initialVisibleMonth: initialVisibleMonth,\n      dayPickerNavigationInlineStyles: dayPickerNavigationInlineStyles,\n      navPosition: navPosition,\n      navPrev: navPrev,\n      navNext: navNext,\n      renderNavPrevButton: renderNavPrevButton,\n      renderNavNextButton: renderNavNextButton,\n      onPrevMonthClick: onPrevMonthClick,\n      onNextMonthClick: onNextMonthClick,\n      onClose: onClose,\n      renderMonthText: renderMonthText,\n      renderWeekHeaderElement: renderWeekHeaderElement,\n      renderCalendarDay: renderCalendarDay,\n      renderDayContents: renderDayContents,\n      renderCalendarInfo: renderCalendarInfo,\n      renderMonthElement: renderMonthElement,\n      calendarInfoPosition: calendarInfoPosition,\n      isFocused: isDayPickerFocused,\n      showKeyboardShortcuts: showKeyboardShortcuts,\n      onBlur: this.onDayPickerBlur,\n      phrases: phrases,\n      dayAriaLabelFormat: dayAriaLabelFormat,\n      daySize: daySize,\n      isRTL: isRTL,\n      isOutsideRange: isOutsideRange,\n      isDayBlocked: isDayBlocked,\n      isDayHighlighted: isDayHighlighted,\n      firstDayOfWeek: firstDayOfWeek,\n      weekDayFormat: weekDayFormat,\n      verticalHeight: verticalHeight,\n      transitionDuration: transitionDuration,\n      horizontalMonthPadding: horizontalMonthPadding\n    }), withFullScreenPortal && _react[\"default\"].createElement(\"button\", (0, _extends2[\"default\"])({}, (0, _reactWithStyles.css)(styles.SingleDatePicker_closeButton), {\n      \"aria-label\": phrases.closeDatePicker,\n      type: \"button\",\n      onClick: this.onOutsideClick\n    }), _react[\"default\"].createElement(\"div\", (0, _reactWithStyles.css)(styles.SingleDatePicker_closeButton_svg), closeIcon)));\n    /* eslint-enable jsx-a11y/no-static-element-interactions */\n\n    /* eslint-enable jsx-a11y/click-events-have-key-events */\n  };\n\n  _proto.render = function render() {\n    var _this$props7 = this.props,\n        id = _this$props7.id,\n        placeholder = _this$props7.placeholder,\n        ariaLabel = _this$props7.ariaLabel,\n        disabled = _this$props7.disabled,\n        focused = _this$props7.focused,\n        required = _this$props7.required,\n        readOnly = _this$props7.readOnly,\n        openDirection = _this$props7.openDirection,\n        showClearDate = _this$props7.showClearDate,\n        showDefaultInputIcon = _this$props7.showDefaultInputIcon,\n        inputIconPosition = _this$props7.inputIconPosition,\n        customCloseIcon = _this$props7.customCloseIcon,\n        customInputIcon = _this$props7.customInputIcon,\n        date = _this$props7.date,\n        onDateChange = _this$props7.onDateChange,\n        displayFormat = _this$props7.displayFormat,\n        phrases = _this$props7.phrases,\n        withPortal = _this$props7.withPortal,\n        withFullScreenPortal = _this$props7.withFullScreenPortal,\n        screenReaderInputMessage = _this$props7.screenReaderInputMessage,\n        isRTL = _this$props7.isRTL,\n        noBorder = _this$props7.noBorder,\n        block = _this$props7.block,\n        small = _this$props7.small,\n        regular = _this$props7.regular,\n        verticalSpacing = _this$props7.verticalSpacing,\n        reopenPickerOnClearDate = _this$props7.reopenPickerOnClearDate,\n        keepOpenOnDateSelect = _this$props7.keepOpenOnDateSelect,\n        styles = _this$props7.styles,\n        isOutsideRange = _this$props7.isOutsideRange;\n    var isInputFocused = this.state.isInputFocused;\n    var enableOutsideClick = !withPortal && !withFullScreenPortal;\n    var hideFang = verticalSpacing < _constants.FANG_HEIGHT_PX;\n\n    var input = _react[\"default\"].createElement(_SingleDatePickerInputController[\"default\"], {\n      id: id,\n      placeholder: placeholder,\n      ariaLabel: ariaLabel,\n      focused: focused,\n      isFocused: isInputFocused,\n      disabled: disabled,\n      required: required,\n      readOnly: readOnly,\n      openDirection: openDirection,\n      showCaret: !withPortal && !withFullScreenPortal && !hideFang,\n      showClearDate: showClearDate,\n      showDefaultInputIcon: showDefaultInputIcon,\n      inputIconPosition: inputIconPosition,\n      isOutsideRange: isOutsideRange,\n      customCloseIcon: customCloseIcon,\n      customInputIcon: customInputIcon,\n      date: date,\n      onDateChange: onDateChange,\n      displayFormat: displayFormat,\n      onFocusChange: this.onInputFocus,\n      onKeyDownArrowDown: this.onDayPickerFocus,\n      onKeyDownQuestionMark: this.showKeyboardShortcutsPanel,\n      screenReaderMessage: screenReaderInputMessage,\n      phrases: phrases,\n      isRTL: isRTL,\n      noBorder: noBorder,\n      block: block,\n      small: small,\n      regular: regular,\n      verticalSpacing: verticalSpacing,\n      reopenPickerOnClearDate: reopenPickerOnClearDate,\n      keepOpenOnDateSelect: keepOpenOnDateSelect\n    }, this.maybeRenderDayPickerWithPortal());\n\n    return _react[\"default\"].createElement(\"div\", (0, _extends2[\"default\"])({\n      ref: this.setContainerRef\n    }, (0, _reactWithStyles.css)(styles.SingleDatePicker, block && styles.SingleDatePicker__block)), enableOutsideClick && _react[\"default\"].createElement(_reactOutsideClickHandler[\"default\"], {\n      onOutsideClick: this.onOutsideClick\n    }, input), enableOutsideClick || input);\n  };\n\n  return SingleDatePicker;\n}(_react[\"default\"].PureComponent || _react[\"default\"].Component);\n\nexports.PureSingleDatePicker = SingleDatePicker;\nSingleDatePicker.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nSingleDatePicker.defaultProps = defaultProps;\n\nvar _default = (0, _reactWithStyles.withStyles)(function (_ref3) {\n  var _ref3$reactDates = _ref3.reactDates,\n      color = _ref3$reactDates.color,\n      zIndex = _ref3$reactDates.zIndex;\n  return {\n    SingleDatePicker: {\n      position: 'relative',\n      display: 'inline-block'\n    },\n    SingleDatePicker__block: {\n      display: 'block'\n    },\n    SingleDatePicker_picker: {\n      zIndex: zIndex + 1,\n      backgroundColor: color.background,\n      position: 'absolute'\n    },\n    SingleDatePicker_picker__rtl: {\n      direction: (0, _noflip[\"default\"])('rtl')\n    },\n    SingleDatePicker_picker__directionLeft: {\n      left: (0, _noflip[\"default\"])(0)\n    },\n    SingleDatePicker_picker__directionRight: {\n      right: (0, _noflip[\"default\"])(0)\n    },\n    SingleDatePicker_picker__portal: {\n      backgroundColor: 'rgba(0, 0, 0, 0.3)',\n      position: 'fixed',\n      top: 0,\n      left: (0, _noflip[\"default\"])(0),\n      height: '100%',\n      width: '100%'\n    },\n    SingleDatePicker_picker__fullScreenPortal: {\n      backgroundColor: color.background\n    },\n    SingleDatePicker_closeButton: {\n      background: 'none',\n      border: 0,\n      color: 'inherit',\n      font: 'inherit',\n      lineHeight: 'normal',\n      overflow: 'visible',\n      cursor: 'pointer',\n      position: 'absolute',\n      top: 0,\n      right: (0, _noflip[\"default\"])(0),\n      padding: 15,\n      zIndex: zIndex + 2,\n      ':hover': {\n        color: \"darken(\".concat(color.core.grayLighter, \", 10%)\"),\n        textDecoration: 'none'\n      },\n      ':focus': {\n        color: \"darken(\".concat(color.core.grayLighter, \", 10%)\"),\n        textDecoration: 'none'\n      }\n    },\n    SingleDatePicker_closeButton_svg: {\n      height: 15,\n      width: 15,\n      fill: color.core.grayLighter\n    }\n  };\n}, {\n  pureComponent: typeof _react[\"default\"].PureComponent !== 'undefined'\n})(SingleDatePicker);\n\nexports[\"default\"] = _default;", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = isInclusivelyBeforeDay;\n\nvar _moment = _interopRequireDefault(require(\"moment\"));\n\nvar _isAfterDay = _interopRequireDefault(require(\"./isAfterDay\"));\n\nfunction isInclusivelyBeforeDay(a, b) {\n  if (!_moment[\"default\"].isMoment(a) || !_moment[\"default\"].isMoment(b)) return false;\n  return !(0, _isAfterDay[\"default\"])(a, b);\n}", "\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"CalendarDay\", {\n  enumerable: true,\n  get: function get() {\n    return _CalendarDay[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"CalendarMonth\", {\n  enumerable: true,\n  get: function get() {\n    return _CalendarMonth[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"CalendarMonthGrid\", {\n  enumerable: true,\n  get: function get() {\n    return _CalendarMonthGrid[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DateRangePicker\", {\n  enumerable: true,\n  get: function get() {\n    return _DateRangePicker[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DateRangePickerInput\", {\n  enumerable: true,\n  get: function get() {\n    return _DateRangePickerInput[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DateRangePickerInputController\", {\n  enumerable: true,\n  get: function get() {\n    return _DateRangePickerInputController[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DateRangePickerShape\", {\n  enumerable: true,\n  get: function get() {\n    return _DateRangePickerShape[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DayPicker\", {\n  enumerable: true,\n  get: function get() {\n    return _DayPicker[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DayPickerRangeController\", {\n  enumerable: true,\n  get: function get() {\n    return _DayPickerRangeController[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"DayPickerSingleDateController\", {\n  enumerable: true,\n  get: function get() {\n    return _DayPickerSingleDateController[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"SingleDatePicker\", {\n  enumerable: true,\n  get: function get() {\n    return _SingleDatePicker[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"SingleDatePickerInput\", {\n  enumerable: true,\n  get: function get() {\n    return _SingleDatePickerInput[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"SingleDatePickerShape\", {\n  enumerable: true,\n  get: function get() {\n    return _SingleDatePickerShape[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"isInclusivelyAfterDay\", {\n  enumerable: true,\n  get: function get() {\n    return _isInclusivelyAfterDay[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"isInclusivelyBeforeDay\", {\n  enumerable: true,\n  get: function get() {\n    return _isInclusivelyBeforeDay[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"isNextDay\", {\n  enumerable: true,\n  get: function get() {\n    return _isNextDay[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"isSameDay\", {\n  enumerable: true,\n  get: function get() {\n    return _isSameDay[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"toISODateString\", {\n  enumerable: true,\n  get: function get() {\n    return _toISODateString[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"toLocalizedDateString\", {\n  enumerable: true,\n  get: function get() {\n    return _toLocalizedDateString[\"default\"];\n  }\n});\nObject.defineProperty(exports, \"toMomentObject\", {\n  enumerable: true,\n  get: function get() {\n    return _toMomentObject[\"default\"];\n  }\n});\n\nvar _CalendarDay = _interopRequireDefault(require(\"./components/CalendarDay\"));\n\nvar _CalendarMonth = _interopRequireDefault(require(\"./components/CalendarMonth\"));\n\nvar _CalendarMonthGrid = _interopRequireDefault(require(\"./components/CalendarMonthGrid\"));\n\nvar _DateRangePicker = _interopRequireDefault(require(\"./components/DateRangePicker\"));\n\nvar _DateRangePickerInput = _interopRequireDefault(require(\"./components/DateRangePickerInput\"));\n\nvar _DateRangePickerInputController = _interopRequireDefault(require(\"./components/DateRangePickerInputController\"));\n\nvar _DateRangePickerShape = _interopRequireDefault(require(\"./shapes/DateRangePickerShape\"));\n\nvar _DayPicker = _interopRequireDefault(require(\"./components/DayPicker\"));\n\nvar _DayPickerRangeController = _interopRequireDefault(require(\"./components/DayPickerRangeController\"));\n\nvar _DayPickerSingleDateController = _interopRequireDefault(require(\"./components/DayPickerSingleDateController\"));\n\nvar _SingleDatePicker = _interopRequireDefault(require(\"./components/SingleDatePicker\"));\n\nvar _SingleDatePickerInput = _interopRequireDefault(require(\"./components/SingleDatePickerInput\"));\n\nvar _SingleDatePickerShape = _interopRequireDefault(require(\"./shapes/SingleDatePickerShape\"));\n\nvar _isInclusivelyAfterDay = _interopRequireDefault(require(\"./utils/isInclusivelyAfterDay\"));\n\nvar _isInclusivelyBeforeDay = _interopRequireDefault(require(\"./utils/isInclusivelyBeforeDay\"));\n\nvar _isNextDay = _interopRequireDefault(require(\"./utils/isNextDay\"));\n\nvar _isSameDay = _interopRequireDefault(require(\"./utils/isSameDay\"));\n\nvar _toISODateString = _interopRequireDefault(require(\"./utils/toISODateString\"));\n\nvar _toLocalizedDateString = _interopRequireDefault(require(\"./utils/toLocalizedDateString\"));\n\nvar _toMomentObject = _interopRequireDefault(require(\"./utils/toMomentObject\"));", "// eslint-disable-next-line import/no-unresolved\nmodule.exports = require('./lib');\n", "//! moment.js locale configuration\n//! locale : Dutch [nl]\n//! author : Joris R\u00F6ling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortWithDots =\n            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n        monthsShortWithoutDots =\n            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        monthsParse = [\n            /^jan/i,\n            /^feb/i,\n            /^(maart|mrt\\.?)$/i,\n            /^apr/i,\n            /^mei$/i,\n            /^jun[i.]?$/i,\n            /^jul[i.]?$/i,\n            /^aug/i,\n            /^sep/i,\n            /^okt/i,\n            /^nov/i,\n            /^dec/i,\n        ],\n        monthsRegex =\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\n    var nl = moment.defineLocale('nl', {\n        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortWithDots;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShortWithoutDots[m.month()];\n            } else {\n                return monthsShortWithDots[m.month()];\n            }\n        },\n\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n        monthsShortStrictRegex:\n            /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n\n        weekdays:\n            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD-MM-YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[vandaag om] LT',\n            nextDay: '[morgen om] LT',\n            nextWeek: 'dddd [om] LT',\n            lastDay: '[gisteren om] LT',\n            lastWeek: '[afgelopen] dddd [om] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'over %s',\n            past: '%s geleden',\n            s: 'een paar seconden',\n            ss: '%d seconden',\n            m: '\u00E9\u00E9n minuut',\n            mm: '%d minuten',\n            h: '\u00E9\u00E9n uur',\n            hh: '%d uur',\n            d: '\u00E9\u00E9n dag',\n            dd: '%d dagen',\n            w: '\u00E9\u00E9n week',\n            ww: '%d weken',\n            M: '\u00E9\u00E9n maand',\n            MM: '%d maanden',\n            y: '\u00E9\u00E9n jaar',\n            yy: '%d jaar',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n        ordinal: function (number) {\n            return (\n                number +\n                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n            );\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nl;\n\n})));\n", "//! moment.js locale configuration\n//! locale : English (United Kingdom) [en-gb]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var enGb = moment.defineLocale('en-gb', {\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Today at] LT',\n            nextDay: '[Tomorrow at] LT',\n            nextWeek: 'dddd [at] LT',\n            lastDay: '[Yesterday at] LT',\n            lastWeek: '[Last] dddd [at] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: '%s ago',\n            s: 'a few seconds',\n            ss: '%d seconds',\n            m: 'a minute',\n            mm: '%d minutes',\n            h: 'an hour',\n            hh: '%d hours',\n            d: 'a day',\n            dd: '%d days',\n            M: 'a month',\n            MM: '%d months',\n            y: 'a year',\n            yy: '%d years',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    ~~((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                          ? 'st'\n                          : b === 2\n                            ? 'nd'\n                            : b === 3\n                              ? 'rd'\n                              : 'th';\n            return number + output;\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return enGb;\n\n})));\n", "//! moment.js locale configuration\n//! locale : German [de]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elens\u00FAle: https://github.com/Oire\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    function processRelativeTime(number, withoutSuffix, key, isFuture) {\n        var format = {\n            m: ['eine Minute', 'einer Minute'],\n            h: ['eine Stunde', 'einer Stunde'],\n            d: ['ein Tag', 'einem Tag'],\n            dd: [number + ' Tage', number + ' Tagen'],\n            w: ['eine Woche', 'einer Woche'],\n            M: ['ein Monat', 'einem Monat'],\n            MM: [number + ' Monate', number + ' Monaten'],\n            y: ['ein Jahr', 'einem Jahr'],\n            yy: [number + ' Jahre', number + ' Jahren'],\n        };\n        return withoutSuffix ? format[key][0] : format[key][1];\n    }\n\n    var de = moment.defineLocale('de', {\n        months: 'Januar_Februar_M\u00E4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n            '_'\n        ),\n        monthsShort:\n            'Jan._Feb._M\u00E4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n        monthsParseExact: true,\n        weekdays:\n            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n                '_'\n            ),\n        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd, D. MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[heute um] LT [Uhr]',\n            sameElse: 'L',\n            nextDay: '[morgen um] LT [Uhr]',\n            nextWeek: 'dddd [um] LT [Uhr]',\n            lastDay: '[gestern um] LT [Uhr]',\n            lastWeek: '[letzten] dddd [um] LT [Uhr]',\n        },\n        relativeTime: {\n            future: 'in %s',\n            past: 'vor %s',\n            s: 'ein paar Sekunden',\n            ss: '%d Sekunden',\n            m: processRelativeTime,\n            mm: '%d Minuten',\n            h: processRelativeTime,\n            hh: '%d Stunden',\n            d: processRelativeTime,\n            dd: processRelativeTime,\n            w: processRelativeTime,\n            ww: '%d Wochen',\n            M: processRelativeTime,\n            MM: processRelativeTime,\n            y: processRelativeTime,\n            yy: processRelativeTime,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return de;\n\n})));\n", "//! moment.js locale configuration\n//! locale : French [fr]\n//! author : John Fischer : https://github.com/jfroffice\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsStrictRegex =\n            /^(janvier|f\u00E9vrier|mars|avril|mai|juin|juillet|ao\u00FBt|septembre|octobre|novembre|d\u00E9cembre)/i,\n        monthsShortStrictRegex =\n            /(janv\\.?|f\u00E9vr\\.?|mars|avr\\.?|mai|juin|juil\\.?|ao\u00FBt|sept\\.?|oct\\.?|nov\\.?|d\u00E9c\\.?)/i,\n        monthsRegex =\n            /(janv\\.?|f\u00E9vr\\.?|mars|avr\\.?|mai|juin|juil\\.?|ao\u00FBt|sept\\.?|oct\\.?|nov\\.?|d\u00E9c\\.?|janvier|f\u00E9vrier|mars|avril|mai|juin|juillet|ao\u00FBt|septembre|octobre|novembre|d\u00E9cembre)/i,\n        monthsParse = [\n            /^janv/i,\n            /^f\u00E9vr/i,\n            /^mars/i,\n            /^avr/i,\n            /^mai/i,\n            /^juin/i,\n            /^juil/i,\n            /^ao\u00FBt/i,\n            /^sept/i,\n            /^oct/i,\n            /^nov/i,\n            /^d\u00E9c/i,\n        ];\n\n    var fr = moment.defineLocale('fr', {\n        months: 'janvier_f\u00E9vrier_mars_avril_mai_juin_juillet_ao\u00FBt_septembre_octobre_novembre_d\u00E9cembre'.split(\n            '_'\n        ),\n        monthsShort:\n            'janv._f\u00E9vr._mars_avr._mai_juin_juil._ao\u00FBt_sept._oct._nov._d\u00E9c.'.split(\n                '_'\n            ),\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex: monthsStrictRegex,\n        monthsShortStrictRegex: monthsShortStrictRegex,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Aujourd\u2019hui \u00E0] LT',\n            nextDay: '[Demain \u00E0] LT',\n            nextWeek: 'dddd [\u00E0] LT',\n            lastDay: '[Hier \u00E0] LT',\n            lastWeek: 'dddd [dernier \u00E0] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'dans %s',\n            past: 'il y a %s',\n            s: 'quelques secondes',\n            ss: '%d secondes',\n            m: 'une minute',\n            mm: '%d minutes',\n            h: 'une heure',\n            hh: '%d heures',\n            d: 'un jour',\n            dd: '%d jours',\n            w: 'une semaine',\n            ww: '%d semaines',\n            M: 'un mois',\n            MM: '%d mois',\n            y: 'un an',\n            yy: '%d ans',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n        ordinal: function (number, period) {\n            switch (period) {\n                // TODO: Return 'e' when day of month > 1. Move this case inside\n                // block for masculine words below.\n                // See https://github.com/moment/moment/issues/3375\n                case 'D':\n                    return number + (number === 1 ? 'er' : '');\n\n                // Words with masculine grammatical gender: mois, trimestre, jour\n                default:\n                case 'M':\n                case 'Q':\n                case 'DDD':\n                case 'd':\n                    return number + (number === 1 ? 'er' : 'e');\n\n                // Words with feminine grammatical gender: semaine\n                case 'w':\n                case 'W':\n                    return number + (number === 1 ? 're' : 'e');\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return fr;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Czech [cs]\n//! author : petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var months = {\n            standalone:\n                'leden_\u00FAnor_b\u0159ezen_duben_kv\u011Bten_\u010Derven_\u010Dervenec_srpen_z\u00E1\u0159\u00ED_\u0159\u00EDjen_listopad_prosinec'.split(\n                    '_'\n                ),\n            format: 'ledna_\u00FAnora_b\u0159ezna_dubna_kv\u011Btna_\u010Dervna_\u010Dervence_srpna_z\u00E1\u0159\u00ED_\u0159\u00EDjna_listopadu_prosince'.split(\n                '_'\n            ),\n            isFormat: /DD?[o.]?(\\[[^\\[\\]]*\\]|\\s)+MMMM/,\n        },\n        monthsShort = 'led_\u00FAno_b\u0159e_dub_kv\u011B_\u010Dvn_\u010Dvc_srp_z\u00E1\u0159_\u0159\u00EDj_lis_pro'.split('_'),\n        monthsParse = [\n            /^led/i,\n            /^\u00FAno/i,\n            /^b\u0159e/i,\n            /^dub/i,\n            /^kv\u011B/i,\n            /^(\u010Dvn|\u010Derven$|\u010Dervna)/i,\n            /^(\u010Dvc|\u010Dervenec|\u010Dervence)/i,\n            /^srp/i,\n            /^z\u00E1\u0159/i,\n            /^\u0159\u00EDj/i,\n            /^lis/i,\n            /^pro/i,\n        ],\n        // NOTE: '\u010Derven' is substring of '\u010Dervenec'; therefore '\u010Dervenec' must precede '\u010Derven' in the regex to be fully matched.\n        // Otherwise parser matches '1. \u010Dervenec' as '1. \u010Derven' + 'ec'.\n        monthsRegex =\n            /^(leden|\u00FAnor|b\u0159ezen|duben|kv\u011Bten|\u010Dervenec|\u010Dervence|\u010Derven|\u010Dervna|srpen|z\u00E1\u0159\u00ED|\u0159\u00EDjen|listopad|prosinec|led|\u00FAno|b\u0159e|dub|kv\u011B|\u010Dvn|\u010Dvc|srp|z\u00E1\u0159|\u0159\u00EDj|lis|pro)/i;\n\n    function plural(n) {\n        return n > 1 && n < 5 && ~~(n / 10) !== 1;\n    }\n    function translate(number, withoutSuffix, key, isFuture) {\n        var result = number + ' ';\n        switch (key) {\n            case 's': // a few seconds / in a few seconds / a few seconds ago\n                return withoutSuffix || isFuture ? 'p\u00E1r sekund' : 'p\u00E1r sekundami';\n            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'sekundy' : 'sekund');\n                } else {\n                    return result + 'sekundami';\n                }\n            case 'm': // a minute / in a minute / a minute ago\n                return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';\n            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'minuty' : 'minut');\n                } else {\n                    return result + 'minutami';\n                }\n            case 'h': // an hour / in an hour / an hour ago\n                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n            case 'hh': // 9 hours / in 9 hours / 9 hours ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'hodiny' : 'hodin');\n                } else {\n                    return result + 'hodinami';\n                }\n            case 'd': // a day / in a day / a day ago\n                return withoutSuffix || isFuture ? 'den' : 'dnem';\n            case 'dd': // 9 days / in 9 days / 9 days ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'dny' : 'dn\u00ED');\n                } else {\n                    return result + 'dny';\n                }\n            case 'M': // a month / in a month / a month ago\n                return withoutSuffix || isFuture ? 'm\u011Bs\u00EDc' : 'm\u011Bs\u00EDcem';\n            case 'MM': // 9 months / in 9 months / 9 months ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'm\u011Bs\u00EDce' : 'm\u011Bs\u00EDc\u016F');\n                } else {\n                    return result + 'm\u011Bs\u00EDci';\n                }\n            case 'y': // a year / in a year / a year ago\n                return withoutSuffix || isFuture ? 'rok' : 'rokem';\n            case 'yy': // 9 years / in 9 years / 9 years ago\n                if (withoutSuffix || isFuture) {\n                    return result + (plural(number) ? 'roky' : 'let');\n                } else {\n                    return result + 'lety';\n                }\n        }\n    }\n\n    var cs = moment.defineLocale('cs', {\n        months: months,\n        monthsShort: monthsShort,\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        // NOTE: '\u010Derven' is substring of '\u010Dervenec'; therefore '\u010Dervenec' must precede '\u010Derven' in the regex to be fully matched.\n        // Otherwise parser matches '1. \u010Dervenec' as '1. \u010Derven' + 'ec'.\n        monthsStrictRegex:\n            /^(leden|ledna|\u00FAnora|\u00FAnor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011Bten|kv\u011Btna|\u010Dervenec|\u010Dervence|\u010Derven|\u010Dervna|srpen|srpna|z\u00E1\u0159\u00ED|\u0159\u00EDjen|\u0159\u00EDjna|listopadu|listopad|prosinec|prosince)/i,\n        monthsShortStrictRegex:\n            /^(led|\u00FAno|b\u0159e|dub|kv\u011B|\u010Dvn|\u010Dvc|srp|z\u00E1\u0159|\u0159\u00EDj|lis|pro)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'ned\u011Ble_pond\u011Bl\u00ED_\u00FAter\u00FD_st\u0159eda_\u010Dtvrtek_p\u00E1tek_sobota'.split('_'),\n        weekdaysShort: 'ne_po_\u00FAt_st_\u010Dt_p\u00E1_so'.split('_'),\n        weekdaysMin: 'ne_po_\u00FAt_st_\u010Dt_p\u00E1_so'.split('_'),\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY H:mm',\n            LLLL: 'dddd D. MMMM YYYY H:mm',\n            l: 'D. M. YYYY',\n        },\n        calendar: {\n            sameDay: '[dnes v] LT',\n            nextDay: '[z\u00EDtra v] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[v ned\u011Bli v] LT';\n                    case 1:\n                    case 2:\n                        return '[v] dddd [v] LT';\n                    case 3:\n                        return '[ve st\u0159edu v] LT';\n                    case 4:\n                        return '[ve \u010Dtvrtek v] LT';\n                    case 5:\n                        return '[v p\u00E1tek v] LT';\n                    case 6:\n                        return '[v sobotu v] LT';\n                }\n            },\n            lastDay: '[v\u010Dera v] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[minulou ned\u011Bli v] LT';\n                    case 1:\n                    case 2:\n                        return '[minul\u00E9] dddd [v] LT';\n                    case 3:\n                        return '[minulou st\u0159edu v] LT';\n                    case 4:\n                    case 5:\n                        return '[minul\u00FD] dddd [v] LT';\n                    case 6:\n                        return '[minulou sobotu v] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: 'p\u0159ed %s',\n            s: translate,\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: translate,\n            dd: translate,\n            M: translate,\n            MM: translate,\n            y: translate,\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return cs;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Danish [da]\n//! author : Ulrik Nielsen : https://github.com/mrbase\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var da = moment.defineLocale('da', {\n        months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(\n            '_'\n        ),\n        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n        weekdays: 's\u00F8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\u00F8rdag'.split('_'),\n        weekdaysShort: 's\u00F8n_man_tir_ons_tor_fre_l\u00F8r'.split('_'),\n        weekdaysMin: 's\u00F8_ma_ti_on_to_fr_l\u00F8'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY HH:mm',\n            LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i dag kl.] LT',\n            nextDay: '[i morgen kl.] LT',\n            nextWeek: 'p\u00E5 dddd [kl.] LT',\n            lastDay: '[i g\u00E5r kl.] LT',\n            lastWeek: '[i] dddd[s kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s siden',\n            s: 'f\u00E5 sekunder',\n            ss: '%d sekunder',\n            m: 'et minut',\n            mm: '%d minutter',\n            h: 'en time',\n            hh: '%d timer',\n            d: 'en dag',\n            dd: '%d dage',\n            M: 'en m\u00E5ned',\n            MM: '%d m\u00E5neder',\n            y: 'et \u00E5r',\n            yy: '%d \u00E5r',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return da;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Spanish [es]\n//! author : Julio Napur\u00ED : https://github.com/julionc\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsShortDot =\n            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n                '_'\n            ),\n        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n        monthsParse = [\n            /^ene/i,\n            /^feb/i,\n            /^mar/i,\n            /^abr/i,\n            /^may/i,\n            /^jun/i,\n            /^jul/i,\n            /^ago/i,\n            /^sep/i,\n            /^oct/i,\n            /^nov/i,\n            /^dic/i,\n        ],\n        monthsRegex =\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n    var es = moment.defineLocale('es', {\n        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n            '_'\n        ),\n        monthsShort: function (m, format) {\n            if (!m) {\n                return monthsShortDot;\n            } else if (/-MMM-/.test(format)) {\n                return monthsShort[m.month()];\n            } else {\n                return monthsShortDot[m.month()];\n            }\n        },\n        monthsRegex: monthsRegex,\n        monthsShortRegex: monthsRegex,\n        monthsStrictRegex:\n            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n        monthsShortStrictRegex:\n            /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays: 'domingo_lunes_martes_mi\u00E9rcoles_jueves_viernes_s\u00E1bado'.split('_'),\n        weekdaysShort: 'dom._lun._mar._mi\u00E9._jue._vie._s\u00E1b.'.split('_'),\n        weekdaysMin: 'do_lu_ma_mi_ju_vi_s\u00E1'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'H:mm',\n            LTS: 'H:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY H:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextDay: function () {\n                return '[ma\u00F1ana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            nextWeek: function () {\n                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastDay: function () {\n                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n            },\n            lastWeek: function () {\n                return (\n                    '[el] dddd [pasado a la' +\n                    (this.hours() !== 1 ? 's' : '') +\n                    '] LT'\n                );\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'en %s',\n            past: 'hace %s',\n            s: 'unos segundos',\n            ss: '%d segundos',\n            m: 'un minuto',\n            mm: '%d minutos',\n            h: 'una hora',\n            hh: '%d horas',\n            d: 'un d\u00EDa',\n            dd: '%d d\u00EDas',\n            w: 'una semana',\n            ww: '%d semanas',\n            M: 'un mes',\n            MM: '%d meses',\n            y: 'un a\u00F1o',\n            yy: '%d a\u00F1os',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\u00BA/,\n        ordinal: '%d\u00BA',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n        invalidDate: 'Fecha inv\u00E1lida',\n    });\n\n    return es;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Italian [it]\n//! author : Lorenzo : https://github.com/aliem\n//! author: Mattia Larentis: https://github.com/nostalgiaz\n//! author: Marco : https://github.com/Manfre98\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var it = moment.defineLocale('it', {\n        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(\n            '_'\n        ),\n        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n        weekdays: 'domenica_luned\u00EC_marted\u00EC_mercoled\u00EC_gioved\u00EC_venerd\u00EC_sabato'.split(\n            '_'\n        ),\n        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: function () {\n                return (\n                    '[Oggi a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            nextDay: function () {\n                return (\n                    '[Domani a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            nextWeek: function () {\n                return (\n                    'dddd [a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            lastDay: function () {\n                return (\n                    '[Ieri a' +\n                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : \"ll'\") +\n                    ']LT'\n                );\n            },\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return (\n                            '[La scorsa] dddd [a' +\n                            (this.hours() > 1\n                                ? 'lle '\n                                : this.hours() === 0\n                                  ? ' '\n                                  : \"ll'\") +\n                            ']LT'\n                        );\n                    default:\n                        return (\n                            '[Lo scorso] dddd [a' +\n                            (this.hours() > 1\n                                ? 'lle '\n                                : this.hours() === 0\n                                  ? ' '\n                                  : \"ll'\") +\n                            ']LT'\n                        );\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'tra %s',\n            past: '%s fa',\n            s: 'alcuni secondi',\n            ss: '%d secondi',\n            m: 'un minuto',\n            mm: '%d minuti',\n            h: \"un'ora\",\n            hh: '%d ore',\n            d: 'un giorno',\n            dd: '%d giorni',\n            w: 'una settimana',\n            ww: '%d settimane',\n            M: 'un mese',\n            MM: '%d mesi',\n            y: 'un anno',\n            yy: '%d anni',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\u00BA/,\n        ordinal: '%d\u00BA',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return it;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Norwegian Bokm\u00E5l [nb]\n//! authors : Espen Hovlandsdal : https://github.com/rexxars\n//!           Sigurd Gartmann : https://github.com/sigurdga\n//!           Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var nb = moment.defineLocale('nb', {\n        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n            '_'\n        ),\n        monthsShort:\n            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n        monthsParseExact: true,\n        weekdays: 's\u00F8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\u00F8rdag'.split('_'),\n        weekdaysShort: 's\u00F8._ma._ti._on._to._fr._l\u00F8.'.split('_'),\n        weekdaysMin: 's\u00F8_ma_ti_on_to_fr_l\u00F8'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D. MMMM YYYY',\n            LLL: 'D. MMMM YYYY [kl.] HH:mm',\n            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n        },\n        calendar: {\n            sameDay: '[i dag kl.] LT',\n            nextDay: '[i morgen kl.] LT',\n            nextWeek: 'dddd [kl.] LT',\n            lastDay: '[i g\u00E5r kl.] LT',\n            lastWeek: '[forrige] dddd [kl.] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'om %s',\n            past: '%s siden',\n            s: 'noen sekunder',\n            ss: '%d sekunder',\n            m: 'ett minutt',\n            mm: '%d minutter',\n            h: '\u00E9n time',\n            hh: '%d timer',\n            d: '\u00E9n dag',\n            dd: '%d dager',\n            w: '\u00E9n uke',\n            ww: '%d uker',\n            M: '\u00E9n m\u00E5ned',\n            MM: '%d m\u00E5neder',\n            y: 'ett \u00E5r',\n            yy: '%d \u00E5r',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return nb;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Polish [pl]\n//! author : Rafal Hirsz : https://github.com/evoL\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var monthsNominative =\n            'stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017Adziernik_listopad_grudzie\u0144'.split(\n                '_'\n            ),\n        monthsSubjective =\n            'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015Bnia_pa\u017Adziernika_listopada_grudnia'.split(\n                '_'\n            ),\n        monthsParse = [\n            /^sty/i,\n            /^lut/i,\n            /^mar/i,\n            /^kwi/i,\n            /^maj/i,\n            /^cze/i,\n            /^lip/i,\n            /^sie/i,\n            /^wrz/i,\n            /^pa\u017A/i,\n            /^lis/i,\n            /^gru/i,\n        ];\n    function plural(n) {\n        return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;\n    }\n    function translate(number, withoutSuffix, key) {\n        var result = number + ' ';\n        switch (key) {\n            case 'ss':\n                return result + (plural(number) ? 'sekundy' : 'sekund');\n            case 'm':\n                return withoutSuffix ? 'minuta' : 'minut\u0119';\n            case 'mm':\n                return result + (plural(number) ? 'minuty' : 'minut');\n            case 'h':\n                return withoutSuffix ? 'godzina' : 'godzin\u0119';\n            case 'hh':\n                return result + (plural(number) ? 'godziny' : 'godzin');\n            case 'ww':\n                return result + (plural(number) ? 'tygodnie' : 'tygodni');\n            case 'MM':\n                return result + (plural(number) ? 'miesi\u0105ce' : 'miesi\u0119cy');\n            case 'yy':\n                return result + (plural(number) ? 'lata' : 'lat');\n        }\n    }\n\n    var pl = moment.defineLocale('pl', {\n        months: function (momentToFormat, format) {\n            if (!momentToFormat) {\n                return monthsNominative;\n            } else if (/D MMMM/.test(format)) {\n                return monthsSubjective[momentToFormat.month()];\n            } else {\n                return monthsNominative[momentToFormat.month()];\n            }\n        },\n        monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017A_lis_gru'.split('_'),\n        monthsParse: monthsParse,\n        longMonthsParse: monthsParse,\n        shortMonthsParse: monthsParse,\n        weekdays:\n            'niedziela_poniedzia\u0142ek_wtorek_\u015Broda_czwartek_pi\u0105tek_sobota'.split('_'),\n        weekdaysShort: 'ndz_pon_wt_\u015Br_czw_pt_sob'.split('_'),\n        weekdaysMin: 'Nd_Pn_Wt_\u015Ar_Cz_Pt_So'.split('_'),\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Dzi\u015B o] LT',\n            nextDay: '[Jutro o] LT',\n            nextWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[W niedziel\u0119 o] LT';\n\n                    case 2:\n                        return '[We wtorek o] LT';\n\n                    case 3:\n                        return '[W \u015Brod\u0119 o] LT';\n\n                    case 6:\n                        return '[W sobot\u0119 o] LT';\n\n                    default:\n                        return '[W] dddd [o] LT';\n                }\n            },\n            lastDay: '[Wczoraj o] LT',\n            lastWeek: function () {\n                switch (this.day()) {\n                    case 0:\n                        return '[W zesz\u0142\u0105 niedziel\u0119 o] LT';\n                    case 3:\n                        return '[W zesz\u0142\u0105 \u015Brod\u0119 o] LT';\n                    case 6:\n                        return '[W zesz\u0142\u0105 sobot\u0119 o] LT';\n                    default:\n                        return '[W zesz\u0142y] dddd [o] LT';\n                }\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'za %s',\n            past: '%s temu',\n            s: 'kilka sekund',\n            ss: translate,\n            m: translate,\n            mm: translate,\n            h: translate,\n            hh: translate,\n            d: '1 dzie\u0144',\n            dd: '%d dni',\n            w: 'tydzie\u0144',\n            ww: translate,\n            M: 'miesi\u0105c',\n            MM: translate,\n            y: 'rok',\n            yy: translate,\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n        ordinal: '%d.',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return pl;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Portuguese [pt]\n//! author : Jefferson : https://github.com/jalex79\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var pt = moment.defineLocale('pt', {\n        months: 'janeiro_fevereiro_mar\u00E7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(\n            '_'\n        ),\n        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n        weekdays:\n            'Domingo_Segunda-feira_Ter\u00E7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\u00E1bado'.split(\n                '_'\n            ),\n        weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_S\u00E1b'.split('_'),\n        weekdaysMin: 'Do_2\u00AA_3\u00AA_4\u00AA_5\u00AA_6\u00AA_S\u00E1'.split('_'),\n        weekdaysParseExact: true,\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD/MM/YYYY',\n            LL: 'D [de] MMMM [de] YYYY',\n            LLL: 'D [de] MMMM [de] YYYY HH:mm',\n            LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[Hoje \u00E0s] LT',\n            nextDay: '[Amanh\u00E3 \u00E0s] LT',\n            nextWeek: 'dddd [\u00E0s] LT',\n            lastDay: '[Ontem \u00E0s] LT',\n            lastWeek: function () {\n                return this.day() === 0 || this.day() === 6\n                    ? '[\u00DAltimo] dddd [\u00E0s] LT' // Saturday + Sunday\n                    : '[\u00DAltima] dddd [\u00E0s] LT'; // Monday - Friday\n            },\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: 'em %s',\n            past: 'h\u00E1 %s',\n            s: 'segundos',\n            ss: '%d segundos',\n            m: 'um minuto',\n            mm: '%d minutos',\n            h: 'uma hora',\n            hh: '%d horas',\n            d: 'um dia',\n            dd: '%d dias',\n            w: 'uma semana',\n            ww: '%d semanas',\n            M: 'um m\u00EAs',\n            MM: '%d meses',\n            y: 'um ano',\n            yy: '%d anos',\n        },\n        dayOfMonthOrdinalParse: /\\d{1,2}\u00BA/,\n        ordinal: '%d\u00BA',\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 4, // The week that contains Jan 4th is the first week of the year.\n        },\n    });\n\n    return pt;\n\n})));\n", "//! moment.js locale configuration\n//! locale : Turkish [tr]\n//! authors : Erhan Gundogan : https://github.com/erhangundogan,\n//!           Burak Yi\u011Fit Kaya: https://github.com/BYK\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n    //! moment.js locale configuration\n\n    var suffixes = {\n        1: \"'inci\",\n        5: \"'inci\",\n        8: \"'inci\",\n        70: \"'inci\",\n        80: \"'inci\",\n        2: \"'nci\",\n        7: \"'nci\",\n        20: \"'nci\",\n        50: \"'nci\",\n        3: \"'\u00FCnc\u00FC\",\n        4: \"'\u00FCnc\u00FC\",\n        100: \"'\u00FCnc\u00FC\",\n        6: \"'nc\u0131\",\n        9: \"'uncu\",\n        10: \"'uncu\",\n        30: \"'uncu\",\n        60: \"'\u0131nc\u0131\",\n        90: \"'\u0131nc\u0131\",\n    };\n\n    var tr = moment.defineLocale('tr', {\n        months: 'Ocak_\u015Eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011Fustos_Eyl\u00FCl_Ekim_Kas\u0131m_Aral\u0131k'.split(\n            '_'\n        ),\n        monthsShort: 'Oca_\u015Eub_Mar_Nis_May_Haz_Tem_A\u011Fu_Eyl_Eki_Kas_Ara'.split('_'),\n        weekdays: 'Pazar_Pazartesi_Sal\u0131_\u00C7ar\u015Famba_Per\u015Fembe_Cuma_Cumartesi'.split(\n            '_'\n        ),\n        weekdaysShort: 'Paz_Pzt_Sal_\u00C7ar_Per_Cum_Cmt'.split('_'),\n        weekdaysMin: 'Pz_Pt_Sa_\u00C7a_Pe_Cu_Ct'.split('_'),\n        meridiem: function (hours, minutes, isLower) {\n            if (hours < 12) {\n                return isLower ? '\u00F6\u00F6' : '\u00D6\u00D6';\n            } else {\n                return isLower ? '\u00F6s' : '\u00D6S';\n            }\n        },\n        meridiemParse: /\u00F6\u00F6|\u00D6\u00D6|\u00F6s|\u00D6S/,\n        isPM: function (input) {\n            return input === '\u00F6s' || input === '\u00D6S';\n        },\n        longDateFormat: {\n            LT: 'HH:mm',\n            LTS: 'HH:mm:ss',\n            L: 'DD.MM.YYYY',\n            LL: 'D MMMM YYYY',\n            LLL: 'D MMMM YYYY HH:mm',\n            LLLL: 'dddd, D MMMM YYYY HH:mm',\n        },\n        calendar: {\n            sameDay: '[bug\u00FCn saat] LT',\n            nextDay: '[yar\u0131n saat] LT',\n            nextWeek: '[gelecek] dddd [saat] LT',\n            lastDay: '[d\u00FCn] LT',\n            lastWeek: '[ge\u00E7en] dddd [saat] LT',\n            sameElse: 'L',\n        },\n        relativeTime: {\n            future: '%s sonra',\n            past: '%s \u00F6nce',\n            s: 'birka\u00E7 saniye',\n            ss: '%d saniye',\n            m: 'bir dakika',\n            mm: '%d dakika',\n            h: 'bir saat',\n            hh: '%d saat',\n            d: 'bir g\u00FCn',\n            dd: '%d g\u00FCn',\n            w: 'bir hafta',\n            ww: '%d hafta',\n            M: 'bir ay',\n            MM: '%d ay',\n            y: 'bir y\u0131l',\n            yy: '%d y\u0131l',\n        },\n        ordinal: function (number, period) {\n            switch (period) {\n                case 'd':\n                case 'D':\n                case 'Do':\n                case 'DD':\n                    return number;\n                default:\n                    if (number === 0) {\n                        // special case for zero\n                        return number + \"'\u0131nc\u0131\";\n                    }\n                    var a = number % 10,\n                        b = (number % 100) - a,\n                        c = number >= 100 ? 100 : null;\n                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n            }\n        },\n        week: {\n            dow: 1, // Monday is the first day of the week.\n            doy: 7, // The week that contains Jan 7th is the first week of the year.\n        },\n    });\n\n    return tr;\n\n})));\n", "import moment from 'moment';\nimport 'moment/locale/nl.js';\nimport 'moment/locale/en-gb.js';\nimport 'moment/locale/de.js';\nimport 'moment/locale/fr.js';\nimport 'moment/locale/cs.js';\nimport 'moment/locale/da.js';\nimport 'moment/locale/es.js';\nimport 'moment/locale/it.js';\nimport 'moment/locale/nb.js';\nimport 'moment/locale/pl.js';\nimport 'moment/locale/pt.js';\nimport 'moment/locale/tr.js';\n\nif (document.documentElement.lang === 'en-US') {\n  moment.updateLocale('en', { longDateFormat: { L: 'DD-MM-YYYY' }, week: { dow: 1 } });\n} else {\n  moment.locale(document.documentElement.lang);\n}\n\nexport default moment;\n", "import React from 'react';\nimport moment from '../lib/moment';\n\nexport function renderMonthElement({ month, onMonthSelect, onYearSelect }) {\n  const count = 15;\n  // prettier-ignore\n  const years = Array(count * 2).fill().map((_, index) => month.year() - count + index);\n\n  return (\n    <>\n      <div className=\"CalendarMonth_title\">{month.format('MMMM YYYY')}</div>\n      <div className=\"CalendarMonth_selects\">\n        <select className=\"CalendarMonth_select\" value={month.month()} onChange={(e) => onMonthSelect(month, e.target.value)}>\n          {moment.months().map((label, value) => (\n            <option value={value} key={value}>\n              {label}\n            </option>\n          ))}\n        </select>\n        <select className=\"CalendarMonth_select\" value={month.year()} onChange={(e) => onYearSelect(month, e.target.value)}>\n          {years.map((year) => (\n            <option key={year} value={year}>\n              {year}\n            </option>\n          ))}\n        </select>\n      </div>\n    </>\n  );\n}\n", "import React, { useState } from 'react';\nimport 'react-dates/initialize';\nimport { DayPickerSingleDateController } from 'react-dates';\nimport { renderMonthElement } from './react_dates';\nimport moment from '../lib/moment';\n\nfunction DateCalendar({ initialDate, minDate, maxDate, onChange }) {\n  const [date, setDate] = useState(initialDate ? moment(initialDate) : null);\n\n  const handleDateChange = (date) => {\n    setDate(date);\n    onChange(date);\n  };\n\n  const isOutsideRange = (day) => {\n    return (minDate && moment(day).isBefore(minDate)) || (maxDate && moment(day).isAfter(maxDate));\n  };\n\n  return (\n    <DayPickerSingleDateController\n      date={date}\n      onDateChange={handleDateChange}\n      focused\n      initialVisibleMonth={() => moment(date || minDate || new Date())}\n      transitionDuration={0}\n      noBorder\n      hideKeyboardShortcutsPanel\n      isOutsideRange={isOutsideRange}\n      renderMonthElement={renderMonthElement}\n      daySize={40}\n      horizontalMonthPadding={12}\n    />\n  );\n}\n\nexport default DateCalendar;\n", "import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport 'react-dates/initialize';\nimport { DayPickerRangeController } from 'react-dates';\nimport { renderMonthElement } from './react_dates';\nimport moment from '../lib/moment';\nimport { get } from '@rails/request.js';\n\n// Manage daySize via state, so it can be changed after initial render (in Stimulus controller via a ref)\nexport default class DateRangeCalendarWrapper extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = { daySize: this.props.daySize };\n  }\n\n  render() {\n    return <DateRangeCalendar {...this.props} daySize={this.state.daySize} />;\n  }\n}\n\nfunction DateRangeCalendar({\n  daySize,\n  mode,\n  initialStartDate,\n  initialEndDate,\n  minDate,\n  maxDate,\n  minNights,\n  maxDays,\n  numberOfMonths,\n  blockedDatesUrl,\n  onChange,\n  onEndDateChange,\n}) {\n  const [startDate, setStartDate] = useState(initialStartDate ? moment(initialStartDate) : null);\n  const [endDate, setEndDate] = useState(initialEndDate ? moment(initialEndDate) : null);\n  const initialVisibleMonth = { endDate }[mode] || startDate || moment();\n  const [focusedInput, setFocusedInput] = useState(mode);\n  const [currentMonth, setCurrentMonth] = useState(initialVisibleMonth);\n  const [blockedDates, setBlockedDates] = useState({});\n  const fetchTimeoutRef = useRef(null);\n  const enableOutsideDays = outsideDaysEnabled(numberOfMonths);\n\n  const handleDatesChange = ({ startDate, endDate }) => {\n    setStartDate(startDate);\n    setEndDate(endDate);\n    onChange(startDate, endDate);\n    if (focusedInput === 'endDate') onEndDateChange(endDate);\n  };\n\n  const isOutsideRange = (day) => {\n    return (\n      (minDate && moment(day).isBefore(minDate)) ||\n      (maxDate && moment(day).isAfter(maxDate)) ||\n      (maxDays && startDate && focusedInput === 'endDate' && day.isAfter(startDate.clone().add(maxDays, 'days'), 'day'))\n    );\n  };\n\n  const visibleRange = useMemo(() => getVisibleRange(currentMonth, numberOfMonths), [currentMonth, numberOfMonths]);\n  const dateRangeKey = visibleRange.key;\n\n  const isDayBlocked = (day) => {\n    const datesForRange = blockedDates[dateRangeKey];\n    if (!datesForRange) return false;\n    return datesForRange.has(formatDate(day));\n  };\n\n  useEffect(() => {\n    if (!blockedDatesUrl || (mode === 'endDate' && !startDate)) return;\n    if (blockedDates[dateRangeKey]) return;\n\n    const params = buildBlockedDatesParams(visibleRange.start, visibleRange.end, mode, startDate);\n    const controller = new AbortController();\n\n    const fetchBlocked = async () => {\n      try {\n        const response = await get(blockedDatesUrl, { query: params, responseKind: 'json', fetch: { signal: controller.signal } });\n        const dates = await response.json;\n        const dateSet = toDateSet(dates);\n        setBlockedDates((prev) => pruneBlockedDates({ ...prev, [dateRangeKey]: dateSet }, dateRangeKey));\n      } catch (e) {\n        if (e.name !== 'AbortError') throw e;\n      }\n    };\n\n    scheduleDebounce(fetchTimeoutRef, fetchBlocked, 150);\n\n    return () => {\n      cancelDebounce(fetchTimeoutRef);\n      controller.abort();\n    };\n  }, [blockedDatesUrl, dateRangeKey, mode, startDate ? formatDate(startDate) : '']);\n\n  return (\n    <DayPickerRangeController\n      startDate={startDate}\n      endDate={endDate}\n      minimumNights={minNights}\n      isOutsideRange={isOutsideRange}\n      isDayBlocked={isDayBlocked}\n      onDatesChange={handleDatesChange}\n      focusedInput={mode || focusedInput || 'startDate'}\n      onFocusChange={setFocusedInput}\n      initialVisibleMonth={() => initialVisibleMonth}\n      transitionDuration={0}\n      noBorder\n      hideKeyboardShortcutsPanel\n      numberOfMonths={numberOfMonths}\n      renderMonthElement={renderMonthElement}\n      daySize={daySize}\n      horizontalMonthPadding={12}\n      enableOutsideDays={enableOutsideDays}\n      onPrevMonthClick={(month) => setCurrentMonth(month)}\n      onNextMonthClick={(month) => setCurrentMonth(month)}\n    />\n  );\n}\n\nfunction formatDate(date) {\n  return date ? date.format('YYYY-MM-DD') : '';\n}\n\nfunction outsideDaysEnabled(numberOfMonths) {\n  return numberOfMonths === 1;\n}\n\nfunction getVisibleRange(currentMonth, numberOfMonths) {\n  const enableOutsideDays = outsideDaysEnabled(numberOfMonths);\n  let start = currentMonth.clone().startOf('month');\n  let end = currentMonth\n    .clone()\n    .add(numberOfMonths - 1, 'months')\n    .endOf('month');\n\n  // Add outside days to the visible range when enableOutsideDays is true\n  // startOf('week') and endOf('week') automatically add the days from the previous and next month to the visible range\n  if (enableOutsideDays) {\n    start = start.startOf('week');\n    end = end.endOf('week');\n  }\n\n  return { start, end, key: `${formatDate(start)}_${formatDate(end)}` };\n}\n\nfunction buildBlockedDatesParams(rangeStart, rangeEnd, mode, startDate) {\n  const params = new URLSearchParams();\n  params.append('min_date', formatDate(rangeStart));\n  params.append('max_date', formatDate(rangeEnd));\n  if (startDate && mode !== 'startDate') params.append('start_date', formatDate(startDate));\n  return params;\n}\n\nfunction toDateSet(dates) {\n  return new Set(Array.isArray(dates) ? dates : []);\n}\n\nfunction pruneBlockedDates(cache, keepKey, limit = 6) {\n  const keys = Object.keys(cache);\n  if (keys.length <= limit) return cache;\n  const next = { ...cache };\n  const toDelete = keys.filter((k) => k !== keepKey).slice(0, keys.length - limit);\n  toDelete.forEach((k) => {\n    delete next[k];\n  });\n  return next;\n}\n\nfunction scheduleDebounce(timeoutRef, fn, delay) {\n  if (timeoutRef.current) clearTimeout(timeoutRef.current);\n  timeoutRef.current = setTimeout(fn, delay);\n}\n\nfunction cancelDebounce(timeoutRef) {\n  if (timeoutRef.current) {\n    clearTimeout(timeoutRef.current);\n    timeoutRef.current = null;\n  }\n}\n", "const ARROW_EXP = 'ArrowFunctionExpression';\n\nexport default {\n\tname: 'arrow',\n\n\tinit(jsep) {\n\t\t// arrow-function expressions: () => x, v => v, (a, b) => v\n\t\tjsep.addBinaryOp('=>', 0.1, true);\n\n\t\t// this hook searches for the special case () => ...\n\t\t// which would normally throw an error because of the invalid LHS to the bin op\n\t\tjsep.hooks.add('gobble-expression', function gobbleEmptyArrowArg(env) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tif (this.code === jsep.OPAREN_CODE) {\n\t\t\t\tconst backupIndex = this.index;\n\t\t\t\tthis.index++;\n\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tif (this.code === jsep.CPAREN_CODE) {\n\t\t\t\t\tthis.index++;\n\n\t\t\t\t\tconst biop = this.gobbleBinaryOp();\n\t\t\t\t\tif (biop === '=>') {\n\t\t\t\t\t\t// () => ...\n\t\t\t\t\t\tconst body = this.gobbleBinaryExpression();\n\t\t\t\t\t\tif (!body) {\n\t\t\t\t\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node = {\n\t\t\t\t\t\t\ttype: ARROW_EXP,\n\t\t\t\t\t\t\tparams: null,\n\t\t\t\t\t\t\tbody,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.index = backupIndex;\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-expression', function fixBinaryArrow(env) {\n\t\t\tupdateBinariesToArrows(env.node);\n\t\t});\n\n\t\tfunction updateBinariesToArrows(node) {\n\t\t\tif (node) {\n\t\t\t\t// Traverse full tree, converting any sub-object nodes as needed\n\t\t\t\tObject.values(node).forEach((val) => {\n\t\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\t\tupdateBinariesToArrows(val);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (node.operator === '=>') {\n\t\t\t\t\tnode.type = ARROW_EXP;\n\t\t\t\t\tnode.params = node.left ? [node.left] : null;\n\t\t\t\t\tnode.body = node.right;\n\t\t\t\t\tif (node.params && node.params[0].type === jsep.SEQUENCE_EXP) {\n\t\t\t\t\t\tnode.params = node.params[0].expressions;\n\t\t\t\t\t}\n\t\t\t\t\tdelete node.left;\n\t\t\t\t\tdelete node.right;\n\t\t\t\t\tdelete node.operator;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n", "const PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n\tname: 'assignment',\n\n\tassignmentOperators: new Set([\n\t\t'=',\n\t\t'*=',\n\t\t'**=',\n\t\t'/=',\n\t\t'%=',\n\t\t'+=',\n\t\t'-=',\n\t\t'<<=',\n\t\t'>>=',\n\t\t'>>>=',\n\t\t'&=',\n\t\t'^=',\n\t\t'|=',\n\t\t'||=',\n\t\t'&&=',\n\t\t'??=',\n\t]),\n\tupdateOperators: [PLUS_CODE, MINUS_CODE],\n\tassignmentPrecedence: 0.9,\n\n\tinit(jsep) {\n\t\tconst updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n\t\tplugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n\n\t\tjsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n\t\t\tconst code = this.code;\n\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\tthis.index += 2;\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\targument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n\t\t\t\t\tprefix: true,\n\t\t\t\t};\n\t\t\t\tif (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n\t\t\tif (env.node) {\n\t\t\t\tconst code = this.code;\n\t\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\t\tif (!updateNodeTypes.includes(env.node.type)) {\n\t\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += 2;\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\t\targument: env.node,\n\t\t\t\t\t\tprefix: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-expression', function gobbleAssignment(env) {\n\t\t\tif (env.node) {\n\t\t\t\t// Note: Binaries can be chained in a single expression to respect\n\t\t\t\t// operator precedence (i.e. a = b = 1 + 2 + 3)\n\t\t\t\t// Update all binary assignment nodes in the tree\n\t\t\t\tupdateBinariesToAssignments(env.node);\n\t\t\t}\n\t\t});\n\n\t\tfunction updateBinariesToAssignments(node) {\n\t\t\tif (plugin.assignmentOperators.has(node.operator)) {\n\t\t\t\tnode.type = 'AssignmentExpression';\n\t\t\t\tupdateBinariesToAssignments(node.left);\n\t\t\t\tupdateBinariesToAssignments(node.right);\n\t\t\t}\n\t\t\telse if (!node.operator) {\n\t\t\t\tObject.values(node).forEach((val) => {\n\t\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\t\tupdateBinariesToAssignments(val);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n};\nexport default plugin;\n", "const ARROW_EXP = 'ArrowFunctionExpression';\nconst A_CODE = 97; // a (start of 'async')\n\nexport default {\n\tname: 'asyncAwait',\n\n\tinit(jsep) {\n\t\tjsep.hooks.add('gobble-token', function gobbleAsync(env) {\n\t\t\tif (this.code === A_CODE && !jsep.isIdentifierStart(this.expr.charCodeAt(this.index + 5))) {\n\t\t\t\tconst sub = this.expr.substr(this.index + 1, 4);\n\t\t\t\tif (sub === 'wait') {\n\t\t\t\t\t// found 'await'\n\t\t\t\t\tthis.index += 5;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('unexpected \\'await\\'');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: 'AwaitExpression',\n\t\t\t\t\t\targument,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (sub === 'sync') {\n\t\t\t\t\t// found 'async'\n\t\t\t\t\tthis.index += 5;\n\t\t\t\t\tenv.node = this.gobbleExpression();\n\t\t\t\t\tif (env.node && env.node.type === ARROW_EXP) {\n\t\t\t\t\t\tenv.node.async = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow new Error('unexpected \\'async\\'');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n", "export default {\n\tname: 'new',\n\n\tinit(jsep) {\n\t\tjsep.addUnaryOp('new');\n\n\t\tjsep.hooks.add('after-token', function gobbleNew(env) {\n\t\t\tconst node = env.node;\n\t\t\tif (node && node.operator === 'new') {\n\t\t\t\tif (!node.argument || ![jsep.CALL_EXP, jsep.MEMBER_EXP].includes(node.argument.type)) {\n\t\t\t\t\tthis.throwError('Expected new function()');\n\t\t\t\t}\n\t\t\t\tenv.node = node.argument;\n\n\t\t\t\t// Change CALL_EXP to NewExpression (could be a nested member, even within a call expr)\n\t\t\t\tlet callNode = env.node;\n\t\t\t\twhile (callNode.type === jsep.MEMBER_EXP || (\n\t\t\t\t\tcallNode.type === jsep.CALL_EXP && callNode.callee.type === jsep.MEMBER_EXP)) {\n\t\t\t\t\tcallNode = callNode.type === jsep.MEMBER_EXP\n\t\t\t\t\t\t? callNode.object\n\t\t\t\t\t\t: callNode.callee.object;\n\t\t\t\t}\n\t\t\t\tcallNode.type = 'NewExpression';\n\t\t\t}\n\t\t});\n\t}\n};\n", "const OCURLY_CODE = 123; // {\nconst CCURLY_CODE = 125; // }\nconst OBJECT_EXP  = 'ObjectExpression';\nconst PROPERTY    = 'Property';\n\nexport default {\n\tname: 'object',\n\n\tinit(jsep) {\n\t\t// Object literal support\n\t\tfunction gobbleObjectExpression(env) {\n\t\t\tif (this.code === OCURLY_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst properties = [];\n\n\t\t\t\twhile (!isNaN(this.code)) {\n\t\t\t\t\tthis.gobbleSpaces();\n\t\t\t\t\tif (this.code === CCURLY_CODE) {\n\t\t\t\t\t\tthis.index++;\n\t\t\t\t\t\tenv.node = this.gobbleTokenProperty({\n\t\t\t\t\t\t\ttype: OBJECT_EXP,\n\t\t\t\t\t\t\tproperties,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: using gobbleExpression instead of gobbleToken to support object destructuring\n\t\t\t\t\tconst key = this.gobbleExpression();\n\t\t\t\t\tif (!key) {\n\t\t\t\t\t\tbreak; // missing }\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.gobbleSpaces();\n\t\t\t\t\tif (key.type === jsep.IDENTIFIER && (this.code === jsep.COMMA_CODE || this.code === CCURLY_CODE)) {\n\t\t\t\t\t\t// property value shorthand\n\t\t\t\t\t\tproperties.push({\n\t\t\t\t\t\t\ttype: PROPERTY,\n\t\t\t\t\t\t\tcomputed: false,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\t\tshorthand: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.code === jsep.COLON_CODE) {\n\t\t\t\t\t\tthis.index++;\n\t\t\t\t\t\tconst value = this.gobbleExpression();\n\n\t\t\t\t\t\tif (!value) {\n\t\t\t\t\t\t\tthis.throwError('unexpected object property');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst computed = key.type === jsep.ARRAY_EXP;\n\t\t\t\t\t\tproperties.push({\n\t\t\t\t\t\t\ttype: PROPERTY,\n\t\t\t\t\t\t\tcomputed,\n\t\t\t\t\t\t\tkey: computed\n\t\t\t\t\t\t\t\t? key.elements[0]\n\t\t\t\t\t\t\t\t: key,\n\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\tshorthand: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.gobbleSpaces();\n\t\t\t\t\t}\n\t\t\t\t\telse if (key) {\n\t\t\t\t\t\t// spread, assignment (object destructuring with defaults), etc.\n\t\t\t\t\t\tproperties.push(key);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.code === jsep.COMMA_CODE) {\n\t\t\t\t\t\tthis.index++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.throwError('missing }');\n\t\t\t}\n\t\t}\n\n\t\tjsep.hooks.add('gobble-token', gobbleObjectExpression);\n\t}\n};\n", "const FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nexport default {\n\tname: 'regex',\n\n\tinit(jsep) {\n\t\t// Regex literal: /abc123/ig\n\t\tjsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n\t\t\tif (this.code === FSLASH_CODE) {\n\t\t\t\tconst patternIndex = ++this.index;\n\n\t\t\t\tlet inCharSet = false;\n\t\t\t\twhile (this.index < this.expr.length) {\n\t\t\t\t\tif (this.code === FSLASH_CODE && !inCharSet) {\n\t\t\t\t\t\tconst pattern = this.expr.slice(patternIndex, this.index);\n\n\t\t\t\t\t\tlet flags = '';\n\t\t\t\t\t\twhile (++this.index < this.expr.length) {\n\t\t\t\t\t\t\tconst code = this.code;\n\t\t\t\t\t\t\tif ((code >= 97 && code <= 122) // a...z\n\t\t\t\t\t\t\t\t|| (code >= 65 && code <= 90) // A...Z\n\t\t\t\t\t\t\t\t|| (code >= 48 && code <= 57)) { // 0-9\n\t\t\t\t\t\t\t\tflags += this.char;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet value;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvalue = new RegExp(pattern, flags);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\t\tthis.throwError(e.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tenv.node = {\n\t\t\t\t\t\t\ttype: jsep.LITERAL,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\traw: this.expr.slice(patternIndex - 1, this.index),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// allow . [] and () after regex: /regex/.test(a)\n\t\t\t\t\t\tenv.node = this.gobbleTokenProperty(env.node);\n\t\t\t\t\t\treturn env.node;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.code === jsep.OBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (inCharSet && this.code === jsep.CBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += this.code === BSLASH_CODE ? 2 : 1;\n\t\t\t\t}\n\t\t\t\tthis.throwError('Unclosed Regex');\n\t\t\t}\n\t\t});\n\t},\n};\n", "export default {\n\tname: 'jsepSpread',\n\n\tinit(jsep) {\n\t\t// Spread operator: ...a\n\t\t// Works in objects { ...a }, arrays [...a], function args fn(...a)\n\t\t// NOTE: does not prevent `a ? ...b : ...c` or `...123`\n\t\tjsep.hooks.add('gobble-token', function gobbleSpread(env) {\n\t\t\tif ([0, 1, 2].every(i => this.expr.charCodeAt(this.index + i) === jsep.PERIOD_CODE)) {\n\t\t\t\tthis.index += 3;\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: 'SpreadElement',\n\t\t\t\t\targument: this.gobbleExpression(),\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t},\n};\n", "const BTICK_CODE = 96; // `\nconst CCURLY_CODE = 125; // }\nconst TAGGED_TEMPLATE_EXPRESSION = 'TaggedTemplateExpression';\nconst TEMPLATE_LITERAL = 'TemplateLiteral';\nconst TEMPLATE_ELEMENT = 'TemplateElement';\n\nexport default {\n\tname: 'jsepTemplateLiteral',\n\n\tinit(jsep) {\n\t\tfunction gobbleTemplateLiteral(env, gobbleMember = true) {\n\t\t\tif (this.code === BTICK_CODE) {\n\t\t\t\tconst node = {\n\t\t\t\t\ttype: TEMPLATE_LITERAL,\n\t\t\t\t\tquasis: [],\n\t\t\t\t\texpressions: [],\n\t\t\t\t};\n\t\t\t\tlet cooked = '';\n\t\t\t\tlet raw = '';\n\t\t\t\tlet closed = false;\n\t\t\t\tconst length = this.expr.length;\n\t\t\t\tconst pushQuasi = () => node.quasis.push({\n\t\t\t\t\ttype: TEMPLATE_ELEMENT,\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\traw,\n\t\t\t\t\t\tcooked,\n\t\t\t\t\t},\n\t\t\t\t\ttail: closed,\n\t\t\t\t});\n\n\t\t\t\twhile (this.index < length) {\n\t\t\t\t\tlet ch = this.expr.charAt(++this.index);\n\n\t\t\t\t\tif (ch === '`') {\n\t\t\t\t\t\tthis.index += 1;\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tpushQuasi();\n\n\t\t\t\t\t\tenv.node = node;\n\n\t\t\t\t\t\tif (gobbleMember) {\n\t\t\t\t\t\t  // allow . [] and () after template: `foo`.length\n\t\t\t\t\t\t  env.node = this.gobbleTokenProperty(env.node);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn env.node;\n\t\t\t\t\t}\n\t\t\t\t\telse if (ch === '$' && this.expr.charAt(this.index + 1) === '{') {\n\t\t\t\t\t\tthis.index += 2;\n\t\t\t\t\t\tpushQuasi();\n\t\t\t\t\t\traw = '';\n\t\t\t\t\t\tcooked = '';\n\t\t\t\t\t\tnode.expressions.push(...this.gobbleExpressions(CCURLY_CODE));\n\t\t\t\t\t\tif (this.code !== CCURLY_CODE) {\n\t\t\t\t\t\t\tthis.throwError('unclosed ${');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (ch === '\\\\') {\n\t\t\t\t\t\t// Check for all of the common escape codes\n\t\t\t\t\t\traw += ch;\n\t\t\t\t\t\tch = this.expr.charAt(++this.index);\n\t\t\t\t\t\traw += ch;\n\n\t\t\t\t\t\tswitch (ch) {\n\t\t\t\t\t\t\tcase 'n': cooked += '\\n'; break;\n\t\t\t\t\t\t\tcase 'r': cooked += '\\r'; break;\n\t\t\t\t\t\t\tcase 't': cooked += '\\t'; break;\n\t\t\t\t\t\t\tcase 'b': cooked += '\\b'; break;\n\t\t\t\t\t\t\tcase 'f': cooked += '\\f'; break;\n\t\t\t\t\t\t\tcase 'v': cooked += '\\x0B'; break;\n\t\t\t\t\t\t\tdefault : cooked += ch;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcooked += ch;\n\t\t\t\t\t\traw += ch;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.throwError('Unclosed `');\n\t\t\t}\n\t\t}\n\n\t\tjsep.hooks.add('gobble-token', gobbleTemplateLiteral);\n\n\t\tjsep.hooks.add('after-token', function gobbleTaggedTemplateIdentifier(env) {\n\t\t\tif ((env.node.type === jsep.IDENTIFIER || env.node.type === jsep.MEMBER_EXP) && this.code === BTICK_CODE) {\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: TAGGED_TEMPLATE_EXPRESSION,\n\t\t\t\t\ttag: env.node,\n\t\t\t\t\tquasi: gobbleTemplateLiteral.bind(this)(env, false),\n\t\t\t\t};\n\n\t\t\t\t// allow . [] and () after tagged template: bar`foo`.length\n\t\t\t\tenv.node = this.gobbleTokenProperty(env.node);\n\n\t\t\t\treturn env.node;\n\t\t\t}\n\t\t});\n\t}\n};\n", "const CONDITIONAL_EXP = 'ConditionalExpression';\n\nexport default {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n", "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"scrollLock\"] = factory();\n\telse\n\t\troot[\"scrollLock\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});", "/*!\nTurbo 8.0.21\nCopyright \u00A9 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\nconst { cache, navigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  navigator: navigator,\n  session: session,\n  cache: cache,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  static observedAttributes = [\"channel\", \"signed-stream-name\"]\n\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n    this.subscriptionDisconnected()\n  }\n\n  attributeChangedCallback() {\n    if (this.subscription) {\n      this.disconnectedCallback()\n      this.connectedCallback()\n    }\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    // Rails 7 ActionView::Helpers::FormBuilder#button method has an override\n    // for formmethod if the button does not have name or value attributes\n    // set, which is the default. This means that if you use <%= f.button\n    // formmethod: :delete %>, it will generate a <button name=\"_method\"\n    // value=\"delete\" formmethod=\"post\">. Therefore, if the submitter's name\n    // is already _method, it's value attribute already contains the desired\n    // method.\n    if (submitter.name === '_method') {\n      return submitter.value\n    } else if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\nwindow.Turbo = Turbo\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "/*\nStimulus 3.2.1\nCopyright \u00A9 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    this.element.addEventListener('period-select:change', this.handlePeriodSelectChange);\n  }\n\n  disconnect() {\n    this.element.removeEventListener('period-select:change', this.handlePeriodSelectChange);\n  }\n\n  handlePeriodSelectChange = () => {\n    $(this.element).trigger('filter.parkcms');\n  };\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static values = { margin: { type: Number, default: 16 } };\n\n  connect() {\n    const options = { rootMargin: `${this.marginValue}px 0px` };\n    this.observer = new IntersectionObserver((entries) => entries.forEach(this.handleIntersection), options);\n    this.observer.observe(this.trackedElement);\n  }\n\n  disconnect() {\n    this.observer.disconnect();\n  }\n\n  get trackedElement() {\n    return document.querySelector(this.data.get('tracked-element'));\n  }\n\n  handleIntersection = (entry) => {\n    $(this.element).stop(true, true);\n    $(this.element)[entry.isIntersecting ? 'fadeOut' : 'fadeIn'](150);\n  };\n}\n", "export function camelize(str: string, firstCharUppercase = false): string {\n  const pattern1: RegExp = /(?:^\\w|[A-Z]|\\b\\w)/g\n  const pattern2: RegExp = /\\s+/g\n  const result: string = str\n    .replace(pattern1, (word, index) =>\n      index === 0 && !firstCharUppercase\n        ? word.toLowerCase()\n        : word.toUpperCase(),\n    )\n    .replace(pattern2, '')\n  return result\n}\n", "import type { StoreController, StoreValue, Subscription } from 'types'\nimport { checkStores } from '../errors/useStoreErrorHandlers'\nimport { warnDirectAccess } from '../errors/useStoreWarningHandlers'\nimport type { Store } from '../store/store'\nimport { camelize } from '../utils/camelize'\n/**\n * useStore Function\n * The useStore function simplifies the process of subscribing to and handling updates from multiple store instances\n * within a Stimulus controller. It also allows direct access to store values on the controller.\n * How It Works:\n * 1. Retrieves the stores from the controller's constructor.\n * 2. Iterates over the stores.\n * 3. Identifies the type of each store and constructs an update method name.\n * 4. Creates update methods for stores if corresponding onStoreUpdate methods exist on the controller.\n * 5. Dynamically assigns update methods to the controller with specific names based on store types.\n * 6. Subscribes update methods to stores to handle updates.\n * 7. Allows direct access to store values on the controller.\n * 8. Enhances the controller's disconnect method to include cleanup for all subscriptions.\n *\n * Usage Example:\n * ```javascript\n * import { Controller } from \"@hotwired/stimulus\";\n * import { useStore } from \"stimulus-store\";\n * import { myStore } from \"./stores/myStore\"; // Import your store class\n *\n * export default class extends Controller {\n *  static stores = [myStore];\n *\n *   connect() {\n *     // Use the useStore function to subscribe to specific stores\n *     useStore(this);\n *   }\n *\n *   // Implement specific update methods for each store\n *   onMyStoreUpdate() {\n *     // Handle updates for MyStore\n *     console.log(\"MyStore updated:\", this.myStoreValue);\n *   }\n * }\n * ```\n * @param {Object} controller - The Stimulus controller instance that wants to subscribe to the stores.\n * @template T - The type of data stored in the stores.\n */\n\nexport function useStore(controller: StoreController) {\n  const stores: Store[] | undefined = controller.constructor?.stores\n  const unsubscribeFunctions: (() => void)[] = []\n\n  // If 'stores' is undefined or empty, throw an error\n  checkStores(stores)\n\n  stores?.forEach((store) => {\n    const storeName: symbol = store.name\n    const storeNameAsString: string = storeName.toString().slice(7, -1)\n    const camelizedName: string = camelize(storeNameAsString)\n    const onStoreUpdateMethodName: string = `on${camelize(\n      storeNameAsString,\n      true,\n    )}Update`\n    const onStoreUpdateMethod = controller[onStoreUpdateMethodName] as (\n      value: StoreValue,\n    ) => void\n    const subscription: Subscription = store.getSubscription()\n\n    if (onStoreUpdateMethod) {\n      const updateMethod: (value: StoreValue) => void = (value) => {\n        onStoreUpdateMethod.call(controller, value)\n      }\n\n      const methodName = `update${camelize(storeNameAsString, true)}`\n      controller[methodName] = updateMethod\n\n      unsubscribeFunctions.push(subscription.subscribe(updateMethod))\n    }\n\n    // Add a helper method to set the store value\n    const setStoreValueMethodName = `set${camelize(\n      storeNameAsString,\n      true,\n    )}Value`\n    controller[setStoreValueMethodName] = (\n      value:\n        | StoreValue\n        | Promise<StoreValue>\n        | ((prev: StoreValue) => StoreValue),\n    ) => {\n      store.set(value)\n    }\n\n    // Add a helper method to reset the store value\n    const resetStoreMethodName = `reset${camelize(storeNameAsString, true)}`\n    controller[resetStoreMethodName] = () => {\n      store.resetValue()\n    }\n\n    const storeGetterMethodName: string = `${camelizedName}Value`\n\n    Object.defineProperty(controller, storeGetterMethodName, {\n      get: () => store.get(),\n      enumerable: true,\n      configurable: true,\n    })\n\n    let isWarned = false\n\n    // Wrap the store in a Proxy to intercept direct access\n    const storeProxy = new Proxy(store, {\n      get: (target, prop, receiver) => {\n        isWarned = warnDirectAccess(camelizedName, isWarned)\n        return Reflect.get(target, prop, receiver)\n      },\n    })\n\n    Object.defineProperty(controller, camelizedName, {\n      get: () => storeProxy,\n      enumerable: true,\n      configurable: true,\n    })\n  })\n\n  const originalDisconnect = controller.disconnect.bind(controller)\n  controller.disconnect = () => {\n    unsubscribeFunctions.forEach((unsubscribe) => {\n      if (unsubscribe) {\n        unsubscribe()\n      }\n    })\n    originalDisconnect()\n  }\n}\n", "/**\n * Checks if the stores array is defined, not empty, and is an array.\n * @param {unknown} stores - The stores array to check.\n * @throws {Error} If the stores array is undefined, empty, or not an array.\n */\nexport function checkStores(stores: unknown): void {\n  if (!stores) {\n    throw new Error(\n      `'useStore' was called on a controller without a 'stores' static property. The 'stores' property is undefined.`,\n    )\n  }\n\n  if (!Array.isArray(stores)) {\n    throw new Error(\n      `'useStore' was called on a controller with a 'stores' static property that is not an array.`,\n    )\n  }\n\n  if (stores.length === 0) {\n    throw new Error(\n      `'useStore' was called on a controller with an empty 'stores' static property. The 'stores' array should contain at least one store.`,\n    )\n  }\n}\n", "/**\n * Logs a warning message if the store is accessed directly and `isWarned` is false.\n * @param {string} camelizedName - The camelized name of the store.\n * @param {boolean} isWarned - A flag indicating if the warning has already been logged.\n * @returns {boolean} Returns true if the warning was logged, otherwise returns the original `isWarned` value.\n */\nexport function warnDirectAccess(\n  camelizedName: string,\n  isWarned: boolean,\n): boolean {\n  if (!isWarned) {\n    console.warn(\n      `Warning: You are accessing the '${camelizedName}' instance directly. Consider using 'on${\n        camelizedName.charAt(0).toUpperCase() + camelizedName.slice(1)\n      }Update' and '${camelizedName}Value' instead.`,\n    )\n    return true\n  }\n  return isWarned\n}\n", "import type { TypeKey } from '../types/typeKey'\n\n/**\n * A mapping from type names to their corresponding constructor types.\n * - Allows type checking values at runtime.\n * - Allows the use of the following types: String, Number, Array, Object, Boolean.\n * - Each type has its own constructor type: StringConstructor, NumberConstructor, ArrayConstructor, ObjectConstructor, BooleanConstructor.\n * - TypeKey is a union of all the constructor types.\n * @type {Record<string, TypeKey>}\n *\n */\n\nexport const typeMap: Record<string, TypeKey> = {\n  String: String,\n  Number: Number,\n  Array: Array,\n  Object: Object,\n  Boolean: Boolean,\n}\n", "import type {\n  CurrentValueCallback,\n  NotifySubscriberOptions,\n  SetOptions,\n  StoreValue,\n  Subscription,\n  TypeKey,\n  UnsubscribeFunction,\n  UpdateMethod,\n} from 'types'\nimport { checkValue, handlePromiseError } from '../errors/storeErrorHandlers'\n/**\n * @template T The type of the value that the store holds.\n * Store Class Explanation:\n *\n * The `Store` class is a versatile class for managing and subscribing to data updates in JavaScript applications.\n * It provides a structured way to store data and notify subscribers when the data changes.\n *\n * Key Features:\n * - Generic Class: Can work with different types of data (specified when creating an instance).\n * - Constructor: Sets the initial value of the store.\n * - `set` Method: Updates the value and notifies subscribers.\n * - `get` Method: Gets the current value.\n * - `subscribe` Method: Subscribes to updates and calls a callback function when data changes.\n * - `unsubscribe` Method: Removes a subscription.\n * - `notifySubscribers` Method: Notifies subscribers when data changes.\n */\n\nexport class Store {\n  readonly name: symbol\n  private value!: StoreValue\n  private initialValue!: StoreValue\n  private subscribers: Set<UpdateMethod>\n  private type: TypeKey\n\n  /**\n   * Creates a new store.\n   *\n   * @param {symbol} name - The name of the store.\n   * @param {TypeKey} type - The type of the store's value.\n   */\n  constructor(name: symbol, type: TypeKey) {\n    this.name = name\n    this.subscribers = new Set()\n    this.type = type\n  }\n\n  /**\n   * Sets the value of the store and notifies subscribers.\n   *\n   * @param {T | CurrentValueCallback | Promise<T | CurrentValueCallback>} newValue - The new value.\n   * @param {SetOptions} [options={ filter: () => true }] - The options for setting the value.\n   */\n  async set(\n    newValue:\n      | StoreValue\n      | CurrentValueCallback\n      | Promise<StoreValue | CurrentValueCallback>,\n    options: SetOptions = { filter: () => true },\n  ) {\n    if (newValue instanceof Promise)\n      return this.resolvePromise(newValue, options)\n    if (newValue === this.get()) return\n    const finalValue: StoreValue =\n      typeof newValue === 'function'\n        ? (newValue as CurrentValueCallback)(this.get())\n        : newValue\n    checkValue(finalValue, this.type)\n    this.setInitialValue(finalValue)\n    this.setValue(finalValue)\n    this.notifySubscribers(options)\n  }\n\n  /**\n   * Gets the current value of the store.\n   *\n   * @returns {StoreValue} The current value.\n   */\n  get(): StoreValue {\n    return this.value\n  }\n\n  /**\n   * Resets the store to its initial value.\n   */\n  resetValue(): void {\n    this.setValue(this.initialValue)\n  }\n\n  private setValue(value: StoreValue): void {\n    this.value = value\n  }\n\n  private setInitialValue(value: StoreValue): void {\n    if (this.value === undefined) this.initialValue = value\n  }\n\n  /**\n   * Subscribes to the store.\n   *\n   * @param {UpdateMethod} callback - The function to call when the store's value changes.\n   * @returns {UnsubscribeFunction} A function that unsubscribes the callback.\n   */\n  private subscribe(callback: UpdateMethod): UnsubscribeFunction {\n    this.subscribers.add(callback)\n    callback(this.get()) // Immediate call for initial value\n    return () => this.unsubscribe(callback) // Return an unsubscribe function\n  }\n\n  /**\n   * Unsubscribes from the store.\n   *\n   * @param {UpdateMethod} callback - The function to unsubscribe.\n   */\n  private unsubscribe(callback: UpdateMethod) {\n    this.subscribers.delete(callback)\n  }\n\n  /**\n   * Gets a subscription object with subscribe, when invoked subscribe returns an unsubscribe function.\n   *\n   * @returns {Subscription} A subscription object.\n   */\n  public getSubscription(): Subscription {\n    return {\n      subscribe: (callback: UpdateMethod) => this.subscribe(callback),\n    }\n  }\n\n  private notifySubscribers(options: NotifySubscriberOptions) {\n    Array.from(this.subscribers)\n      .filter(() => options.filter(this.get()))\n      .forEach((callback) => callback(this.get()))\n  }\n\n  private async resolvePromise(\n    newValue: Promise<StoreValue | CurrentValueCallback>,\n    options: SetOptions,\n  ) {\n    try {\n      const resolvedValue = await newValue\n      this.set(resolvedValue, options)\n    } catch (error) {\n      handlePromiseError(error)\n    }\n  }\n}\n", "/**\n * Checks if the value is of the specified type.\n * @param {unknown} value - The value to check.\n * @param {new (...args: unknown[]) => unknown} type - The type constructor for the expected type.\n * @throws {Error} If the value is not of the expected type.\n */\nexport function checkValue(\n  value: unknown,\n  type: new (...args: unknown[]) => unknown,\n): void {\n  if (Object.getPrototypeOf(value).constructor !== type) {\n    throw new Error(`Value '${value}' must be of type ${type.name}`)\n  }\n}\n\n/**\n * Handles errors that occur when a promise fails to resolve.\n * @param {unknown} error - The error that occurred.\n * @throws {Error} A new error with a message indicating that the promise failed to resolve.\n */\nexport function handlePromiseError(error: unknown): never {\n  throw new Error(`Failed to resolve promise:\\n${error}`)\n}\n", "import {\n  checkInitialValue,\n  checkName,\n  checkTypeConstructor,\n  handleStoreSetError,\n} from '../errors/createStoreErrorHandlers'\nimport type { StoreOptions } from '../types/storeOptions'\nimport type { StoreValue } from '../types/storeValue'\nimport type { TypeKey } from '../types/typeKey'\nimport { Store } from './store'\n\n/**\n * The createStore function is a factory function that creates and returns a new instance of the Store class.\n * It takes an options object as a parameter, which should include the name, initialValue, and type for the new store.\n *\n * Here's a technical breakdown of how it works:\n * - The function destructure's the name, type, and initialValue properties from the options object.\n * - It checks if initialValue is undefined. If it is, the function throws an error because a store must be initialized with a value.\n * - It checks if name is not a string. If it isn't, the function throws an error because the store's name must be a string. This name is used to create a unique Symbol which serves as the identifier for the store.\n * - It creates a new Symbol using the name and assigns it to symbolName.\n * - It creates a new instance of the Store class, passing symbolName, initialValue, and type to the Store constructor, and returns this new instance.\n *\n * The Store class encapsulates the state (the initialValue) and provides methods to get and set that state. The type is used for type checking to ensure that the store's value always matches the expected type.\n *\n * Usage Example:\n * ```javascript\n * const countStore = createStore({ name: 'count', initialValue: 0, type: Number });\n * ```\n *\n * @param {StoreOptions<T>} options - The options for the store.\n * @param {string} options.name - The name of the store. This will be used to create a unique Symbol.\n * @param {T} options.initialValue - The initial value of the store. This must be provided.\n * @param {TypeKey} options.type - The type of the store's value. This is used for type checking [String, Number, Boolean, Array, Object].\n *\n * @returns {Store<T>} The new store.\n *\n * @throws {Error} If no initial value is provided.\n * @throws {Error} If the name is not a string.\n */\n\nexport function createStore(options: StoreOptions): Store {\n  const name: string = options.name\n  const type: TypeKey = options.type\n  const initialValue: StoreValue = options.initialValue\n  checkInitialValue(initialValue)\n  checkName(name)\n  checkTypeConstructor(type.name)\n  const symbolName = Symbol(name)\n\n  const store: Store = new Store(symbolName, type)\n  store.set(initialValue).catch((error) => handleStoreSetError(error))\n  return store\n}\n", "import { typeMap } from '../store/storeValuesTypeMap'\n\n/**\n * Checks if the initial value is defined.\n * @param {T} initialValue - The initial value of the store.\n * @throws {Error} If the initial value is undefined.\n */\nexport function checkInitialValue<T>(initialValue: T): void {\n  if (typeof initialValue === 'undefined') {\n    throw new Error('Store must be initialized with a value')\n  }\n}\n\n/**\n * Checks if the store name is a string.\n * @param {string} name - The name of the store.\n * @throws {Error} If the store name is not a string.\n */\nexport function checkName(name: string): void {\n  if (typeof name !== 'string') {\n    throw new Error('Store name must be of Type string')\n  }\n}\n\n/**\n * Checks if the type constructor exists in the type map.\n * @param {string} type - The type of the store value.\n * @throws {Error} If the type constructor does not exist in the type map.\n */\nexport function checkTypeConstructor(type: string): void {\n  const typeConstructor = typeMap[type]\n  if (typeof typeConstructor !== 'function') {\n    throw new Error(`Invalid type: ${type}`)\n  }\n}\n\n/**\n * Handles errors that occur when setting the store value.\n * @param {unknown} error - The error that occurred.\n * @throws {Error} A new error with the same message if the original error is an instance of Error.\n * @throws {Error} A new error with a generic message if the original error is not an instance of Error.\n */\nexport function handleStoreSetError(error: unknown): never {\n  if (error instanceof Error) {\n    throw new Error(`Failed to create store: ${error.message}`)\n  }\n  throw new Error('An unknown error occurred while creating the store')\n}\n", "import { createStore } from 'stimulus-store';\n\nexport const initialValue = {};\n\nexport const locationFilterStore = createStore({\n  name: 'locationFilterStore',\n  type: Object,\n  initialValue,\n});\n", "import { Controller } from '@hotwired/stimulus';\nimport { locationFilterStore, initialValue } from './location_filter_store';\nimport { useStore } from 'stimulus-store';\n\nexport default class extends Controller {\n  static stores = [locationFilterStore];\n  static targets = ['label', 'input', 'resetButton'];\n  static values = { placeholder: String };\n\n  connect() {\n    useStore(this);\n  }\n\n  onLocationFilterStoreUpdate(newValue) {\n    if (newValue === initialValue) return;\n    if ((newValue.value || '').replace('subsite_', 'park_') === this.inputTarget.value) return;\n\n    this.labelTarget.textContent = newValue.label || this.placeholderValue;\n    this.inputTarget.value = newValue.value || '';\n    this.inputTarget.dispatchEvent(new Event('change', { bubbles: true }));\n    this.tippy.hide();\n  }\n\n  reset = (event) => {\n    event.stopPropagation();\n    this.setLocationFilterStoreValue({});\n  };\n\n  get tippy() {\n    return this.element._tippy;\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport { locationFilterStore, initialValue } from './location_filter_store';\nimport { useStore } from 'stimulus-store';\n\nexport default class extends Controller {\n  static stores = [locationFilterStore];\n  static targets = ['check'];\n  static values = { label: String, value: String };\n\n  connect() {\n    useStore(this);\n  }\n\n  onLocationFilterStoreUpdate(newValue) {\n    if (newValue === initialValue) return;\n\n    const isActive = this.valueValue === newValue.value;\n    this.element.ariaSelected = isActive;\n    this.checkTarget.ariaChecked = isActive;\n  }\n\n  select() {\n    this.setLocationFilterStoreValue({ label: this.labelValue, value: this.valueValue });\n  }\n\n  toggleActive(isActive) {\n    this.element.ariaSelected = isActive;\n    this.checkTarget.ariaChecked = isActive;\n  }\n}\n", "export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];", "export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}", "export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}", "import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };", "import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect,\n  requires: ['computeStyles']\n};", "import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')[0];\n}", "export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;", "export default function getUAString() {\n  var uaData = navigator.userAgentData;\n\n  if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(function (item) {\n      return item.brand + \"/\" + item.version;\n    }).join(' ');\n  }\n\n  return navigator.userAgent;\n}", "import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n  return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}", "import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n\n  var clientRect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1;\n\n  if (includeScale && isHTMLElement(element)) {\n    scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n    scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n  }\n\n  var _ref = isElement(element) ? getWindow(element) : window,\n      visualViewport = _ref.visualViewport;\n\n  var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n  var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n  var width = clientRect.width / scaleX;\n  var height = clientRect.height / scaleY;\n  return {\n    width: width,\n    height: height,\n    top: y,\n    right: x + width,\n    bottom: y + height,\n    left: x,\n    x: x,\n    y: y\n  };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}", "import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}", "import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}", "import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}", "import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}", "import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}", "import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = /firefox/i.test(getUAString());\n  var isIE = /Trident/i.test(getUAString());\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  if (isShadowRoot(currentNode)) {\n    currentNode = currentNode.host;\n  }\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}", "export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}", "import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n  return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n  var v = within(min, value, max);\n  return v > max ? max : v;\n}", "export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}", "import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}", "export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};", "export default function getVariation(placement) {\n  return placement.split('-')[1];\n}", "import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n  var x = _ref.x,\n      y = _ref.y;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(x * dpr) / dpr || 0,\n    y: round(y * dpr) / dpr || 0\n  };\n}\n\nexport function mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets,\n      isFixed = _ref2.isFixed;\n  var _offsets$x = offsets.x,\n      x = _offsets$x === void 0 ? 0 : _offsets$x,\n      _offsets$y = offsets.y,\n      y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n    x: x,\n    y: y\n  }) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref3.x;\n  y = _ref3.y;\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom;\n      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n      offsetParent[heightProp];\n      y -= offsetY - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right;\n      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n      offsetParent[widthProp];\n      x -= offsetX - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n    x: x,\n    y: y\n  }, getWindow(popper)) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref4.x;\n  y = _ref4.y;\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n  var state = _ref5.state,\n      options = _ref5.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration,\n    isFixed: state.options.strategy === 'fixed'\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};", "import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n  passive: true\n};\n\nfunction effect(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect,\n  data: {}\n};", "var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}", "var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}", "import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}", "import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0;\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    var layoutViewport = isLayoutViewport();\n\n    if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}", "import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}", "import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}", "import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}", "import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}", "export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}", "import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n  var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}", "import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n\n      default:\n    }\n  }\n\n  return offsets;\n}", "import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$strategy = _options.strategy,\n      strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}", "import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements;\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}", "import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases \u2013 research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};", "import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n  if (preventedOffsets === void 0) {\n    preventedOffsets = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  return {\n    top: overflow.top - rect.height - preventedOffsets.y,\n    right: overflow.right - rect.width + preventedOffsets.x,\n    bottom: overflow.bottom - rect.height + preventedOffsets.y,\n    left: overflow.left - rect.width - preventedOffsets.x\n  };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n  return [top, right, bottom, left].some(function (side) {\n    return overflow[side] >= 0;\n  });\n}\n\nfunction hide(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var preventedOffsets = state.modifiersData.preventOverflow;\n  var referenceOverflow = detectOverflow(state, {\n    elementContext: 'reference'\n  });\n  var popperAltOverflow = detectOverflow(state, {\n    altBoundary: true\n  });\n  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n  state.modifiersData[name] = {\n    referenceClippingOffsets: referenceClippingOffsets,\n    popperEscapeOffsets: popperEscapeOffsets,\n    isReferenceHidden: isReferenceHidden,\n    hasPopperEscaped: hasPopperEscaped\n  };\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-reference-hidden': isReferenceHidden,\n    'data-popper-escaped': hasPopperEscaped\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'hide',\n  enabled: true,\n  phase: 'main',\n  requiresIfExists: ['preventOverflow'],\n  fn: hide\n};", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};", "import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};", "export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}", "import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n    mainAxis: tetherOffsetValue,\n    altAxis: tetherOffsetValue\n  } : Object.assign({\n    mainAxis: 0,\n    altAxis: 0\n  }, tetherOffsetValue);\n  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis) {\n    var _offsetModifierState$;\n\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min = offset + overflow[mainSide];\n    var max = offset - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = offset + maxOffset - offsetModifierValue;\n    var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n    popperOffsets[mainAxis] = preventedOffset;\n    data[mainAxis] = preventedOffset - offset;\n  }\n\n  if (checkAltAxis) {\n    var _offsetModifierState$2;\n\n    var _mainSide = mainAxis === 'x' ? top : left;\n\n    var _altSide = mainAxis === 'x' ? bottom : right;\n\n    var _offset = popperOffsets[altAxis];\n\n    var _len = altAxis === 'y' ? 'height' : 'width';\n\n    var _min = _offset + overflow[_mainSide];\n\n    var _max = _offset - overflow[_altSide];\n\n    var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n    popperOffsets[altAxis] = _preventedOffset;\n    data[altAxis] = _preventedOffset - _offset;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};", "export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}", "import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = round(rect.width) / element.offsetWidth || 1;\n  var scaleY = round(rect.height) / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent, true);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}", "import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nexport default function orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}", "export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}", "export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}", "import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nexport function popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        });\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update \u2013 it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update \u2013 it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref) {\n        var name = _ref.name,\n            _ref$options = _ref.options,\n            options = _ref$options === void 0 ? {} : _ref$options,\n            effect = _ref.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };", "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";", "export const ROUND_ARROW =\n  '<svg width=\"16\" height=\"6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z\"></svg>';\n\nexport const BOX_CLASS = `__NAMESPACE_PREFIX__-box`;\nexport const CONTENT_CLASS = `__NAMESPACE_PREFIX__-content`;\nexport const BACKDROP_CLASS = `__NAMESPACE_PREFIX__-backdrop`;\nexport const ARROW_CLASS = `__NAMESPACE_PREFIX__-arrow`;\nexport const SVG_ARROW_CLASS = `__NAMESPACE_PREFIX__-svg-arrow`;\n\nexport const TOUCH_OPTIONS = {passive: true, capture: true};\n\nexport const TIPPY_DEFAULT_APPEND_TO = () => document.body;\n", "import {BasePlacement, Placement} from './types';\n\nexport function hasOwnProperty(\n  obj: Record<string, unknown>,\n  key: string\n): boolean {\n  return {}.hasOwnProperty.call(obj, key);\n}\n\nexport function getValueAtIndexOrReturn<T>(\n  value: T | [T | null, T | null],\n  index: number,\n  defaultValue: T | [T, T]\n): T {\n  if (Array.isArray(value)) {\n    const v = value[index];\n    return v == null\n      ? Array.isArray(defaultValue)\n        ? defaultValue[index]\n        : defaultValue\n      : v;\n  }\n\n  return value;\n}\n\nexport function isType(value: any, type: string): boolean {\n  const str = {}.toString.call(value);\n  return str.indexOf('[object') === 0 && str.indexOf(`${type}]`) > -1;\n}\n\nexport function invokeWithArgsOrReturn(value: any, args: any[]): any {\n  return typeof value === 'function' ? value(...args) : value;\n}\n\nexport function debounce<T>(\n  fn: (arg: T) => void,\n  ms: number\n): (arg: T) => void {\n  // Avoid wrapping in `setTimeout` if ms is 0 anyway\n  if (ms === 0) {\n    return fn;\n  }\n\n  let timeout: any;\n\n  return (arg): void => {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => {\n      fn(arg);\n    }, ms);\n  };\n}\n\nexport function removeProperties<T>(obj: T, keys: string[]): Partial<T> {\n  const clone = {...obj};\n  keys.forEach((key) => {\n    delete (clone as any)[key];\n  });\n  return clone;\n}\n\nexport function splitBySpaces(value: string): string[] {\n  return value.split(/\\s+/).filter(Boolean);\n}\n\nexport function normalizeToArray<T>(value: T | T[]): T[] {\n  return ([] as T[]).concat(value);\n}\n\nexport function pushIfUnique<T>(arr: T[], value: T): void {\n  if (arr.indexOf(value) === -1) {\n    arr.push(value);\n  }\n}\n\nexport function appendPxIfNumber(value: string | number): string {\n  return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function unique<T>(arr: T[]): T[] {\n  return arr.filter((item, index) => arr.indexOf(item) === index);\n}\n\nexport function getNumber(value: string | number): number {\n  return typeof value === 'number' ? value : parseFloat(value);\n}\n\nexport function getBasePlacement(placement: Placement): BasePlacement {\n  return placement.split('-')[0] as BasePlacement;\n}\n\nexport function arrayFrom(value: ArrayLike<any>): any[] {\n  return [].slice.call(value);\n}\n\nexport function removeUndefinedProps(\n  obj: Record<string, unknown>\n): Partial<Record<string, unknown>> {\n  return Object.keys(obj).reduce((acc, key) => {\n    if (obj[key] !== undefined) {\n      (acc as any)[key] = obj[key];\n    }\n\n    return acc;\n  }, {});\n}\n", "import {ReferenceElement, Targets} from './types';\nimport {PopperTreeData} from './types-internal';\nimport {arrayFrom, isType, normalizeToArray, getBasePlacement} from './utils';\n\nexport function div(): HTMLDivElement {\n  return document.createElement('div');\n}\n\nexport function isElement(value: unknown): value is Element | DocumentFragment {\n  return ['Element', 'Fragment'].some((type) => isType(value, type));\n}\n\nexport function isNodeList(value: unknown): value is NodeList {\n  return isType(value, 'NodeList');\n}\n\nexport function isMouseEvent(value: unknown): value is MouseEvent {\n  return isType(value, 'MouseEvent');\n}\n\nexport function isReferenceElement(value: any): value is ReferenceElement {\n  return !!(value && value._tippy && value._tippy.reference === value);\n}\n\nexport function getArrayOfElements(value: Targets): Element[] {\n  if (isElement(value)) {\n    return [value];\n  }\n\n  if (isNodeList(value)) {\n    return arrayFrom(value);\n  }\n\n  if (Array.isArray(value)) {\n    return value;\n  }\n\n  return arrayFrom(document.querySelectorAll(value));\n}\n\nexport function setTransitionDuration(\n  els: (HTMLDivElement | null)[],\n  value: number\n): void {\n  els.forEach((el) => {\n    if (el) {\n      el.style.transitionDuration = `${value}ms`;\n    }\n  });\n}\n\nexport function setVisibilityState(\n  els: (HTMLDivElement | null)[],\n  state: 'visible' | 'hidden'\n): void {\n  els.forEach((el) => {\n    if (el) {\n      el.setAttribute('data-state', state);\n    }\n  });\n}\n\nexport function getOwnerDocument(\n  elementOrElements: Element | Element[]\n): Document {\n  const [element] = normalizeToArray(elementOrElements);\n\n  // Elements created via a <template> have an ownerDocument with no reference to the body\n  return element?.ownerDocument?.body ? element.ownerDocument : document;\n}\n\nexport function isCursorOutsideInteractiveBorder(\n  popperTreeData: PopperTreeData[],\n  event: MouseEvent\n): boolean {\n  const {clientX, clientY} = event;\n\n  return popperTreeData.every(({popperRect, popperState, props}) => {\n    const {interactiveBorder} = props;\n    const basePlacement = getBasePlacement(popperState.placement);\n    const offsetData = popperState.modifiersData.offset;\n\n    if (!offsetData) {\n      return true;\n    }\n\n    const topDistance = basePlacement === 'bottom' ? offsetData.top!.y : 0;\n    const bottomDistance = basePlacement === 'top' ? offsetData.bottom!.y : 0;\n    const leftDistance = basePlacement === 'right' ? offsetData.left!.x : 0;\n    const rightDistance = basePlacement === 'left' ? offsetData.right!.x : 0;\n\n    const exceedsTop =\n      popperRect.top - clientY + topDistance > interactiveBorder;\n    const exceedsBottom =\n      clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n    const exceedsLeft =\n      popperRect.left - clientX + leftDistance > interactiveBorder;\n    const exceedsRight =\n      clientX - popperRect.right - rightDistance > interactiveBorder;\n\n    return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n  });\n}\n\nexport function updateTransitionEndListener(\n  box: HTMLDivElement,\n  action: 'add' | 'remove',\n  listener: (event: TransitionEvent) => void\n): void {\n  const method = `${action}EventListener` as\n    | 'addEventListener'\n    | 'removeEventListener';\n\n  // some browsers apparently support `transition` (unprefixed) but only fire\n  // `webkitTransitionEnd`...\n  ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n    box[method](event, listener as EventListener);\n  });\n}\n\n/**\n * Compared to xxx.contains, this function works for dom structures with shadow\n * dom\n */\nexport function actualContains(parent: Element, child: Element): boolean {\n  let target = child;\n  while (target) {\n    if (parent.contains(target)) {\n      return true;\n    }\n    target = (target.getRootNode?.() as any)?.host;\n  }\n  return false;\n}\n", "import {TOUCH_OPTIONS} from './constants';\nimport {isReferenceElement} from './dom-utils';\n\nexport const currentInput = {isTouch: false};\nlet lastMouseMoveTime = 0;\n\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\nexport function onDocumentTouchStart(): void {\n  if (currentInput.isTouch) {\n    return;\n  }\n\n  currentInput.isTouch = true;\n\n  if (window.performance) {\n    document.addEventListener('mousemove', onDocumentMouseMove);\n  }\n}\n\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\nexport function onDocumentMouseMove(): void {\n  const now = performance.now();\n\n  if (now - lastMouseMoveTime < 20) {\n    currentInput.isTouch = false;\n\n    document.removeEventListener('mousemove', onDocumentMouseMove);\n  }\n\n  lastMouseMoveTime = now;\n}\n\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\nexport function onWindowBlur(): void {\n  const activeElement = document.activeElement as HTMLElement | null;\n\n  if (isReferenceElement(activeElement)) {\n    const instance = activeElement._tippy!;\n\n    if (activeElement.blur && !instance.state.isVisible) {\n      activeElement.blur();\n    }\n  }\n}\n\nexport default function bindGlobalEventListeners(): void {\n  document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n  window.addEventListener('blur', onWindowBlur);\n}\n", "export const isBrowser =\n  typeof window !== 'undefined' && typeof document !== 'undefined';\n\nexport const isIE11 = isBrowser\n  ? // @ts-ignore\n    !!window.msCrypto\n  : false;\n", "import {Targets} from './types';\n\nexport function createMemoryLeakWarning(method: string): string {\n  const txt = method === 'destroy' ? 'n already-' : ' ';\n\n  return [\n    `${method}() was called on a${txt}destroyed instance. This is a no-op but`,\n    'indicates a potential memory leak.',\n  ].join(' ');\n}\n\nexport function clean(value: string): string {\n  const spacesAndTabs = /[ \\t]{2,}/g;\n  const lineStartWithSpaces = /^[ \\t]*/gm;\n\n  return value\n    .replace(spacesAndTabs, ' ')\n    .replace(lineStartWithSpaces, '')\n    .trim();\n}\n\nfunction getDevMessage(message: string): string {\n  return clean(`\n  %ctippy.js\n\n  %c${clean(message)}\n\n  %c👷‍ This is a development-only message. It will be removed in production.\n  `);\n}\n\nexport function getFormattedMessage(message: string): string[] {\n  return [\n    getDevMessage(message),\n    // title\n    'color: #00C584; font-size: 1.3em; font-weight: bold;',\n    // message\n    'line-height: 1.5',\n    // footer\n    'color: #a6a095;',\n  ];\n}\n\n// Assume warnings and errors never have the same message\nlet visitedMessages: Set<string>;\nif (__DEV__) {\n  resetVisitedMessages();\n}\n\nexport function resetVisitedMessages(): void {\n  visitedMessages = new Set();\n}\n\nexport function warnWhen(condition: boolean, message: string): void {\n  if (condition && !visitedMessages.has(message)) {\n    visitedMessages.add(message);\n    console.warn(...getFormattedMessage(message));\n  }\n}\n\nexport function errorWhen(condition: boolean, message: string): void {\n  if (condition && !visitedMessages.has(message)) {\n    visitedMessages.add(message);\n    console.error(...getFormattedMessage(message));\n  }\n}\n\nexport function validateTargets(targets: Targets): void {\n  const didPassFalsyValue = !targets;\n  const didPassPlainObject =\n    Object.prototype.toString.call(targets) === '[object Object]' &&\n    !(targets as any).addEventListener;\n\n  errorWhen(\n    didPassFalsyValue,\n    [\n      'tippy() was passed',\n      '`' + String(targets) + '`',\n      'as its targets (first) argument. Valid types are: String, Element,',\n      'Element[], or NodeList.',\n    ].join(' ')\n  );\n\n  errorWhen(\n    didPassPlainObject,\n    [\n      'tippy() was passed a plain object which is not supported as an argument',\n      'for virtual positioning. Use props.getReferenceClientRect instead.',\n    ].join(' ')\n  );\n}\n", "import {DefaultProps, Plugin, Props, ReferenceElement, Tippy} from './types';\nimport {\n  hasOwnProperty,\n  removeProperties,\n  invokeWithArgsOrReturn,\n} from './utils';\nimport {warnWhen} from './validation';\nimport {TIPPY_DEFAULT_APPEND_TO} from './constants';\n\nconst pluginProps = {\n  animateFill: false,\n  followCursor: false,\n  inlinePositioning: false,\n  sticky: false,\n};\n\nconst renderProps = {\n  allowHTML: false,\n  animation: 'fade',\n  arrow: true,\n  content: '',\n  inertia: false,\n  maxWidth: 350,\n  role: 'tooltip',\n  theme: '',\n  zIndex: 9999,\n};\n\nexport const defaultProps: DefaultProps = {\n  appendTo: TIPPY_DEFAULT_APPEND_TO,\n  aria: {\n    content: 'auto',\n    expanded: 'auto',\n  },\n  delay: 0,\n  duration: [300, 250],\n  getReferenceClientRect: null,\n  hideOnClick: true,\n  ignoreAttributes: false,\n  interactive: false,\n  interactiveBorder: 2,\n  interactiveDebounce: 0,\n  moveTransition: '',\n  offset: [0, 10],\n  onAfterUpdate() {},\n  onBeforeUpdate() {},\n  onCreate() {},\n  onDestroy() {},\n  onHidden() {},\n  onHide() {},\n  onMount() {},\n  onShow() {},\n  onShown() {},\n  onTrigger() {},\n  onUntrigger() {},\n  onClickOutside() {},\n  placement: 'top',\n  plugins: [],\n  popperOptions: {},\n  render: null,\n  showOnCreate: false,\n  touch: true,\n  trigger: 'mouseenter focus',\n  triggerTarget: null,\n  ...pluginProps,\n  ...renderProps,\n};\n\nconst defaultKeys = Object.keys(defaultProps);\n\nexport const setDefaultProps: Tippy['setDefaultProps'] = (partialProps) => {\n  /* istanbul ignore else */\n  if (__DEV__) {\n    validateProps(partialProps, []);\n  }\n\n  const keys = Object.keys(partialProps) as Array<keyof DefaultProps>;\n  keys.forEach((key) => {\n    (defaultProps as any)[key] = partialProps[key];\n  });\n};\n\nexport function getExtendedPassedProps(\n  passedProps: Partial<Props> & Record<string, unknown>\n): Partial<Props> {\n  const plugins = passedProps.plugins || [];\n  const pluginProps = plugins.reduce<Record<string, unknown>>((acc, plugin) => {\n    const {name, defaultValue} = plugin;\n\n    if (name) {\n      acc[name] =\n        passedProps[name] !== undefined\n          ? passedProps[name]\n          : (defaultProps as any)[name] ?? defaultValue;\n    }\n\n    return acc;\n  }, {});\n\n  return {\n    ...passedProps,\n    ...pluginProps,\n  };\n}\n\nexport function getDataAttributeProps(\n  reference: ReferenceElement,\n  plugins: Plugin[]\n): Record<string, unknown> {\n  const propKeys = plugins\n    ? Object.keys(getExtendedPassedProps({...defaultProps, plugins}))\n    : defaultKeys;\n\n  const props = propKeys.reduce(\n    (acc: Partial<Props> & Record<string, unknown>, key) => {\n      const valueAsString = (\n        reference.getAttribute(`data-tippy-${key}`) || ''\n      ).trim();\n\n      if (!valueAsString) {\n        return acc;\n      }\n\n      if (key === 'content') {\n        acc[key] = valueAsString;\n      } else {\n        try {\n          acc[key] = JSON.parse(valueAsString);\n        } catch (e) {\n          acc[key] = valueAsString;\n        }\n      }\n\n      return acc;\n    },\n    {}\n  );\n\n  return props;\n}\n\nexport function evaluateProps(\n  reference: ReferenceElement,\n  props: Props\n): Props {\n  const out = {\n    ...props,\n    content: invokeWithArgsOrReturn(props.content, [reference]),\n    ...(props.ignoreAttributes\n      ? {}\n      : getDataAttributeProps(reference, props.plugins)),\n  };\n\n  out.aria = {\n    ...defaultProps.aria,\n    ...out.aria,\n  };\n\n  out.aria = {\n    expanded:\n      out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n    content:\n      out.aria.content === 'auto'\n        ? props.interactive\n          ? null\n          : 'describedby'\n        : out.aria.content,\n  };\n\n  return out;\n}\n\nexport function validateProps(\n  partialProps: Partial<Props> = {},\n  plugins: Plugin[] = []\n): void {\n  const keys = Object.keys(partialProps) as Array<keyof Props>;\n  keys.forEach((prop) => {\n    const nonPluginProps = removeProperties(\n      defaultProps,\n      Object.keys(pluginProps)\n    );\n\n    let didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop);\n\n    // Check if the prop exists in `plugins`\n    if (didPassUnknownProp) {\n      didPassUnknownProp =\n        plugins.filter((plugin) => plugin.name === prop).length === 0;\n    }\n\n    warnWhen(\n      didPassUnknownProp,\n      [\n        `\\`${prop}\\``,\n        \"is not a valid prop. You may have spelled it incorrectly, or if it's\",\n        'a plugin, forgot to pass it in an array as props.plugins.',\n        '\\n\\n',\n        'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n',\n        'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/',\n      ].join(' ')\n    );\n  });\n}\n", "import {\n  ARROW_CLASS,\n  BACKDROP_CLASS,\n  BOX_CLASS,\n  CONTENT_CLASS,\n  SVG_ARROW_CLASS,\n} from './constants';\nimport {div, isElement} from './dom-utils';\nimport {Instance, PopperElement, Props} from './types';\nimport {PopperChildren} from './types-internal';\nimport {arrayFrom} from './utils';\n\n// Firefox extensions don't allow .innerHTML = \"...\" property. This tricks it.\nconst innerHTML = (): 'innerHTML' => 'innerHTML';\n\nfunction dangerouslySetInnerHTML(element: Element, html: string): void {\n  element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value: Props['arrow']): HTMLDivElement {\n  const arrow = div();\n\n  if (value === true) {\n    arrow.className = ARROW_CLASS;\n  } else {\n    arrow.className = SVG_ARROW_CLASS;\n\n    if (isElement(value)) {\n      arrow.appendChild(value);\n    } else {\n      dangerouslySetInnerHTML(arrow, value as string);\n    }\n  }\n\n  return arrow;\n}\n\nexport function setContent(content: HTMLDivElement, props: Props): void {\n  if (isElement(props.content)) {\n    dangerouslySetInnerHTML(content, '');\n    content.appendChild(props.content);\n  } else if (typeof props.content !== 'function') {\n    if (props.allowHTML) {\n      dangerouslySetInnerHTML(content, props.content);\n    } else {\n      content.textContent = props.content;\n    }\n  }\n}\n\nexport function getChildren(popper: PopperElement): PopperChildren {\n  const box = popper.firstElementChild as HTMLDivElement;\n  const boxChildren = arrayFrom(box.children);\n\n  return {\n    box,\n    content: boxChildren.find((node) => node.classList.contains(CONTENT_CLASS)),\n    arrow: boxChildren.find(\n      (node) =>\n        node.classList.contains(ARROW_CLASS) ||\n        node.classList.contains(SVG_ARROW_CLASS)\n    ),\n    backdrop: boxChildren.find((node) =>\n      node.classList.contains(BACKDROP_CLASS)\n    ),\n  };\n}\n\nexport function render(\n  instance: Instance\n): {\n  popper: PopperElement;\n  onUpdate?: (prevProps: Props, nextProps: Props) => void;\n} {\n  const popper = div();\n\n  const box = div();\n  box.className = BOX_CLASS;\n  box.setAttribute('data-state', 'hidden');\n  box.setAttribute('tabindex', '-1');\n\n  const content = div();\n  content.className = CONTENT_CLASS;\n  content.setAttribute('data-state', 'hidden');\n\n  setContent(content, instance.props);\n\n  popper.appendChild(box);\n  box.appendChild(content);\n\n  onUpdate(instance.props, instance.props);\n\n  function onUpdate(prevProps: Props, nextProps: Props): void {\n    const {box, content, arrow} = getChildren(popper);\n\n    if (nextProps.theme) {\n      box.setAttribute('data-theme', nextProps.theme);\n    } else {\n      box.removeAttribute('data-theme');\n    }\n\n    if (typeof nextProps.animation === 'string') {\n      box.setAttribute('data-animation', nextProps.animation);\n    } else {\n      box.removeAttribute('data-animation');\n    }\n\n    if (nextProps.inertia) {\n      box.setAttribute('data-inertia', '');\n    } else {\n      box.removeAttribute('data-inertia');\n    }\n\n    box.style.maxWidth =\n      typeof nextProps.maxWidth === 'number'\n        ? `${nextProps.maxWidth}px`\n        : nextProps.maxWidth;\n\n    if (nextProps.role) {\n      box.setAttribute('role', nextProps.role);\n    } else {\n      box.removeAttribute('role');\n    }\n\n    if (\n      prevProps.content !== nextProps.content ||\n      prevProps.allowHTML !== nextProps.allowHTML\n    ) {\n      setContent(content, instance.props);\n    }\n\n    if (nextProps.arrow) {\n      if (!arrow) {\n        box.appendChild(createArrowElement(nextProps.arrow));\n      } else if (prevProps.arrow !== nextProps.arrow) {\n        box.removeChild(arrow);\n        box.appendChild(createArrowElement(nextProps.arrow));\n      }\n    } else if (arrow) {\n      box.removeChild(arrow!);\n    }\n  }\n\n  return {\n    popper,\n    onUpdate,\n  };\n}\n\n// Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\nrender.$$tippy = true;\n", "import {createPopper, StrictModifiers, Modifier} from '@popperjs/core';\nimport {currentInput} from './bindGlobalEventListeners';\nimport {isIE11} from './browser';\nimport {TIPPY_DEFAULT_APPEND_TO, TOUCH_OPTIONS} from './constants';\nimport {\n  actualContains,\n  div,\n  getOwnerDocument,\n  isCursorOutsideInteractiveBorder,\n  isMouseEvent,\n  setTransitionDuration,\n  setVisibilityState,\n  updateTransitionEndListener,\n} from './dom-utils';\nimport {defaultProps, evaluateProps, getExtendedPassedProps} from './props';\nimport {getChildren} from './template';\nimport {\n  Content,\n  Instance,\n  LifecycleHooks,\n  PopperElement,\n  Props,\n  ReferenceElement,\n} from './types';\nimport {ListenerObject, PopperTreeData, PopperChildren} from './types-internal';\nimport {\n  arrayFrom,\n  debounce,\n  getValueAtIndexOrReturn,\n  invokeWithArgsOrReturn,\n  normalizeToArray,\n  pushIfUnique,\n  splitBySpaces,\n  unique,\n  removeUndefinedProps,\n} from './utils';\nimport {createMemoryLeakWarning, errorWhen, warnWhen} from './validation';\n\nlet idCounter = 1;\nlet mouseMoveListeners: ((event: MouseEvent) => void)[] = [];\n\n// Used by `hideAll()`\nexport let mountedInstances: Instance[] = [];\n\nexport default function createTippy(\n  reference: ReferenceElement,\n  passedProps: Partial<Props>\n): Instance {\n  const props = evaluateProps(reference, {\n    ...defaultProps,\n    ...getExtendedPassedProps(removeUndefinedProps(passedProps)),\n  });\n\n  // ===========================================================================\n  // 🔒 Private members\n  // ===========================================================================\n  let showTimeout: any;\n  let hideTimeout: any;\n  let scheduleHideAnimationFrame: number;\n  let isVisibleFromClick = false;\n  let didHideDueToDocumentMouseDown = false;\n  let didTouchMove = false;\n  let ignoreOnFirstUpdate = false;\n  let lastTriggerEvent: Event | undefined;\n  let currentTransitionEndListener: (event: TransitionEvent) => void;\n  let onFirstUpdate: () => void;\n  let listeners: ListenerObject[] = [];\n  let debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n  let currentTarget: Element;\n\n  // ===========================================================================\n  // 🔑 Public members\n  // ===========================================================================\n  const id = idCounter++;\n  const popperInstance = null;\n  const plugins = unique(props.plugins);\n\n  const state = {\n    // Is the instance currently enabled?\n    isEnabled: true,\n    // Is the tippy currently showing and not transitioning out?\n    isVisible: false,\n    // Has the instance been destroyed?\n    isDestroyed: false,\n    // Is the tippy currently mounted to the DOM?\n    isMounted: false,\n    // Has the tippy finished transitioning in?\n    isShown: false,\n  };\n\n  const instance: Instance = {\n    // properties\n    id,\n    reference,\n    popper: div(),\n    popperInstance,\n    props,\n    state,\n    plugins,\n    // methods\n    clearDelayTimeouts,\n    setProps,\n    setContent,\n    show,\n    hide,\n    hideWithInteractivity,\n    enable,\n    disable,\n    unmount,\n    destroy,\n  };\n\n  // TODO: Investigate why this early return causes a TDZ error in the tests —\n  // it doesn't seem to happen in the browser\n  /* istanbul ignore if */\n  if (!props.render) {\n    if (__DEV__) {\n      errorWhen(true, 'render() function has not been supplied.');\n    }\n\n    return instance;\n  }\n\n  // ===========================================================================\n  // Initial mutations\n  // ===========================================================================\n  const {popper, onUpdate} = props.render(instance);\n\n  popper.setAttribute('data-__NAMESPACE_PREFIX__-root', '');\n  popper.id = `__NAMESPACE_PREFIX__-${instance.id}`;\n\n  instance.popper = popper;\n  reference._tippy = instance;\n  popper._tippy = instance;\n\n  const pluginsHooks = plugins.map((plugin) => plugin.fn(instance));\n  const hasAriaExpanded = reference.hasAttribute('aria-expanded');\n\n  addListeners();\n  handleAriaExpandedAttribute();\n  handleStyles();\n\n  invokeHook('onCreate', [instance]);\n\n  if (props.showOnCreate) {\n    scheduleShow();\n  }\n\n  // Prevent a tippy with a delay from hiding if the cursor left then returned\n  // before it started hiding\n  popper.addEventListener('mouseenter', () => {\n    if (instance.props.interactive && instance.state.isVisible) {\n      instance.clearDelayTimeouts();\n    }\n  });\n\n  popper.addEventListener('mouseleave', () => {\n    if (\n      instance.props.interactive &&\n      instance.props.trigger.indexOf('mouseenter') >= 0\n    ) {\n      getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n    }\n  });\n\n  return instance;\n\n  // ===========================================================================\n  // 🔒 Private methods\n  // ===========================================================================\n  function getNormalizedTouchSettings(): [string | boolean, number] {\n    const {touch} = instance.props;\n    return Array.isArray(touch) ? touch : [touch, 0];\n  }\n\n  function getIsCustomTouchBehavior(): boolean {\n    return getNormalizedTouchSettings()[0] === 'hold';\n  }\n\n  function getIsDefaultRenderFn(): boolean {\n    // @ts-ignore\n    return !!instance.props.render?.$$tippy;\n  }\n\n  function getCurrentTarget(): Element {\n    return currentTarget || reference;\n  }\n\n  function getDocument(): Document {\n    const parent = getCurrentTarget().parentNode as Element;\n    return parent ? getOwnerDocument(parent) : document;\n  }\n\n  function getDefaultTemplateChildren(): PopperChildren {\n    return getChildren(popper);\n  }\n\n  function getDelay(isShow: boolean): number {\n    // For touch or keyboard input, force `0` delay for UX reasons\n    // Also if the instance is mounted but not visible (transitioning out),\n    // ignore delay\n    if (\n      (instance.state.isMounted && !instance.state.isVisible) ||\n      currentInput.isTouch ||\n      (lastTriggerEvent && lastTriggerEvent.type === 'focus')\n    ) {\n      return 0;\n    }\n\n    return getValueAtIndexOrReturn(\n      instance.props.delay,\n      isShow ? 0 : 1,\n      defaultProps.delay\n    );\n  }\n\n  function handleStyles(fromHide = false): void {\n    popper.style.pointerEvents =\n      instance.props.interactive && !fromHide ? '' : 'none';\n    popper.style.zIndex = `${instance.props.zIndex}`;\n  }\n\n  function invokeHook(\n    hook: keyof LifecycleHooks,\n    args: [Instance, any?],\n    shouldInvokePropsHook = true\n  ): void {\n    pluginsHooks.forEach((pluginHooks) => {\n      if (pluginHooks[hook]) {\n        pluginHooks[hook]!(...args);\n      }\n    });\n\n    if (shouldInvokePropsHook) {\n      instance.props[hook](...args);\n    }\n  }\n\n  function handleAriaContentAttribute(): void {\n    const {aria} = instance.props;\n\n    if (!aria.content) {\n      return;\n    }\n\n    const attr = `aria-${aria.content}`;\n    const id = popper.id;\n    const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n\n    nodes.forEach((node) => {\n      const currentValue = node.getAttribute(attr);\n\n      if (instance.state.isVisible) {\n        node.setAttribute(attr, currentValue ? `${currentValue} ${id}` : id);\n      } else {\n        const nextValue = currentValue && currentValue.replace(id, '').trim();\n\n        if (nextValue) {\n          node.setAttribute(attr, nextValue);\n        } else {\n          node.removeAttribute(attr);\n        }\n      }\n    });\n  }\n\n  function handleAriaExpandedAttribute(): void {\n    if (hasAriaExpanded || !instance.props.aria.expanded) {\n      return;\n    }\n\n    const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n\n    nodes.forEach((node) => {\n      if (instance.props.interactive) {\n        node.setAttribute(\n          'aria-expanded',\n          instance.state.isVisible && node === getCurrentTarget()\n            ? 'true'\n            : 'false'\n        );\n      } else {\n        node.removeAttribute('aria-expanded');\n      }\n    });\n  }\n\n  function cleanupInteractiveMouseListeners(): void {\n    getDocument().removeEventListener('mousemove', debouncedOnMouseMove);\n    mouseMoveListeners = mouseMoveListeners.filter(\n      (listener) => listener !== debouncedOnMouseMove\n    );\n  }\n\n  function onDocumentPress(event: MouseEvent | TouchEvent): void {\n    // Moved finger to scroll instead of an intentional tap outside\n    if (currentInput.isTouch) {\n      if (didTouchMove || event.type === 'mousedown') {\n        return;\n      }\n    }\n\n    const actualTarget =\n      (event.composedPath && event.composedPath()[0]) || event.target;\n\n    // Clicked on interactive popper\n    if (\n      instance.props.interactive &&\n      actualContains(popper, actualTarget as Element)\n    ) {\n      return;\n    }\n\n    // Clicked on the event listeners target\n    if (\n      normalizeToArray(instance.props.triggerTarget || reference).some((el) =>\n        actualContains(el, actualTarget as Element)\n      )\n    ) {\n      if (currentInput.isTouch) {\n        return;\n      }\n\n      if (\n        instance.state.isVisible &&\n        instance.props.trigger.indexOf('click') >= 0\n      ) {\n        return;\n      }\n    } else {\n      invokeHook('onClickOutside', [instance, event]);\n    }\n\n    if (instance.props.hideOnClick === true) {\n      instance.clearDelayTimeouts();\n      instance.hide();\n\n      // `mousedown` event is fired right before `focus` if pressing the\n      // currentTarget. This lets a tippy with `focus` trigger know that it\n      // should not show\n      didHideDueToDocumentMouseDown = true;\n      setTimeout(() => {\n        didHideDueToDocumentMouseDown = false;\n      });\n\n      // The listener gets added in `scheduleShow()`, but this may be hiding it\n      // before it shows, and hide()'s early bail-out behavior can prevent it\n      // from being cleaned up\n      if (!instance.state.isMounted) {\n        removeDocumentPress();\n      }\n    }\n  }\n\n  function onTouchMove(): void {\n    didTouchMove = true;\n  }\n\n  function onTouchStart(): void {\n    didTouchMove = false;\n  }\n\n  function addDocumentPress(): void {\n    const doc = getDocument();\n    doc.addEventListener('mousedown', onDocumentPress, true);\n    doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n    doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n    doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n  }\n\n  function removeDocumentPress(): void {\n    const doc = getDocument();\n    doc.removeEventListener('mousedown', onDocumentPress, true);\n    doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n    doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n    doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n  }\n\n  function onTransitionedOut(duration: number, callback: () => void): void {\n    onTransitionEnd(duration, () => {\n      if (\n        !instance.state.isVisible &&\n        popper.parentNode &&\n        popper.parentNode.contains(popper)\n      ) {\n        callback();\n      }\n    });\n  }\n\n  function onTransitionedIn(duration: number, callback: () => void): void {\n    onTransitionEnd(duration, callback);\n  }\n\n  function onTransitionEnd(duration: number, callback: () => void): void {\n    const box = getDefaultTemplateChildren().box;\n\n    function listener(event: TransitionEvent): void {\n      if (event.target === box) {\n        updateTransitionEndListener(box, 'remove', listener);\n        callback();\n      }\n    }\n\n    // Make callback synchronous if duration is 0\n    // `transitionend` won't fire otherwise\n    if (duration === 0) {\n      return callback();\n    }\n\n    updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n    updateTransitionEndListener(box, 'add', listener);\n\n    currentTransitionEndListener = listener;\n  }\n\n  function on(\n    eventType: string,\n    handler: EventListener,\n    options: boolean | Record<string, unknown> = false\n  ): void {\n    const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n    nodes.forEach((node) => {\n      node.addEventListener(eventType, handler, options);\n      listeners.push({node, eventType, handler, options});\n    });\n  }\n\n  function addListeners(): void {\n    if (getIsCustomTouchBehavior()) {\n      on('touchstart', onTrigger, {passive: true});\n      on('touchend', onMouseLeave as EventListener, {passive: true});\n    }\n\n    splitBySpaces(instance.props.trigger).forEach((eventType) => {\n      if (eventType === 'manual') {\n        return;\n      }\n\n      on(eventType, onTrigger);\n\n      switch (eventType) {\n        case 'mouseenter':\n          on('mouseleave', onMouseLeave as EventListener);\n          break;\n        case 'focus':\n          on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut as EventListener);\n          break;\n        case 'focusin':\n          on('focusout', onBlurOrFocusOut as EventListener);\n          break;\n      }\n    });\n  }\n\n  function removeListeners(): void {\n    listeners.forEach(({node, eventType, handler, options}: ListenerObject) => {\n      node.removeEventListener(eventType, handler, options);\n    });\n    listeners = [];\n  }\n\n  function onTrigger(event: Event): void {\n    let shouldScheduleClickHide = false;\n\n    if (\n      !instance.state.isEnabled ||\n      isEventListenerStopped(event) ||\n      didHideDueToDocumentMouseDown\n    ) {\n      return;\n    }\n\n    const wasFocused = lastTriggerEvent?.type === 'focus';\n\n    lastTriggerEvent = event;\n    currentTarget = event.currentTarget as Element;\n\n    handleAriaExpandedAttribute();\n\n    if (!instance.state.isVisible && isMouseEvent(event)) {\n      // If scrolling, `mouseenter` events can be fired if the cursor lands\n      // over a new target, but `mousemove` events don't get fired. This\n      // causes interactive tooltips to get stuck open until the cursor is\n      // moved\n      mouseMoveListeners.forEach((listener) => listener(event));\n    }\n\n    // Toggle show/hide when clicking click-triggered tooltips\n    if (\n      event.type === 'click' &&\n      (instance.props.trigger.indexOf('mouseenter') < 0 ||\n        isVisibleFromClick) &&\n      instance.props.hideOnClick !== false &&\n      instance.state.isVisible\n    ) {\n      shouldScheduleClickHide = true;\n    } else {\n      scheduleShow(event);\n    }\n\n    if (event.type === 'click') {\n      isVisibleFromClick = !shouldScheduleClickHide;\n    }\n\n    if (shouldScheduleClickHide && !wasFocused) {\n      scheduleHide(event);\n    }\n  }\n\n  function onMouseMove(event: MouseEvent): void {\n    const target = event.target as Node;\n    const isCursorOverReferenceOrPopper =\n      getCurrentTarget().contains(target) || popper.contains(target);\n\n    if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n      return;\n    }\n\n    const popperTreeData = getNestedPopperTree()\n      .concat(popper)\n      .map((popper) => {\n        const instance = popper._tippy!;\n        const state = instance.popperInstance?.state;\n\n        if (state) {\n          return {\n            popperRect: popper.getBoundingClientRect(),\n            popperState: state,\n            props,\n          };\n        }\n\n        return null;\n      })\n      .filter(Boolean) as PopperTreeData[];\n\n    if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n      cleanupInteractiveMouseListeners();\n      scheduleHide(event);\n    }\n  }\n\n  function onMouseLeave(event: MouseEvent): void {\n    const shouldBail =\n      isEventListenerStopped(event) ||\n      (instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick);\n\n    if (shouldBail) {\n      return;\n    }\n\n    if (instance.props.interactive) {\n      instance.hideWithInteractivity(event);\n      return;\n    }\n\n    scheduleHide(event);\n  }\n\n  function onBlurOrFocusOut(event: FocusEvent): void {\n    if (\n      instance.props.trigger.indexOf('focusin') < 0 &&\n      event.target !== getCurrentTarget()\n    ) {\n      return;\n    }\n\n    // If focus was moved to within the popper\n    if (\n      instance.props.interactive &&\n      event.relatedTarget &&\n      popper.contains(event.relatedTarget as Element)\n    ) {\n      return;\n    }\n\n    scheduleHide(event);\n  }\n\n  function isEventListenerStopped(event: Event): boolean {\n    return currentInput.isTouch\n      ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0\n      : false;\n  }\n\n  function createPopperInstance(): void {\n    destroyPopperInstance();\n\n    const {\n      popperOptions,\n      placement,\n      offset,\n      getReferenceClientRect,\n      moveTransition,\n    } = instance.props;\n\n    const arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n\n    const computedReference = getReferenceClientRect\n      ? {\n          getBoundingClientRect: getReferenceClientRect,\n          contextElement:\n            getReferenceClientRect.contextElement || getCurrentTarget(),\n        }\n      : reference;\n\n    const tippyModifier: Modifier<'$$tippy', Record<string, unknown>> = {\n      name: '$$tippy',\n      enabled: true,\n      phase: 'beforeWrite',\n      requires: ['computeStyles'],\n      fn({state}) {\n        if (getIsDefaultRenderFn()) {\n          const {box} = getDefaultTemplateChildren();\n\n          ['placement', 'reference-hidden', 'escaped'].forEach((attr) => {\n            if (attr === 'placement') {\n              box.setAttribute('data-placement', state.placement);\n            } else {\n              if (state.attributes.popper[`data-popper-${attr}`]) {\n                box.setAttribute(`data-${attr}`, '');\n              } else {\n                box.removeAttribute(`data-${attr}`);\n              }\n            }\n          });\n\n          state.attributes.popper = {};\n        }\n      },\n    };\n\n    type TippyModifier = Modifier<'$$tippy', Record<string, unknown>>;\n    type ExtendedModifiers = StrictModifiers | Partial<TippyModifier>;\n\n    const modifiers: Array<ExtendedModifiers> = [\n      {\n        name: 'offset',\n        options: {\n          offset,\n        },\n      },\n      {\n        name: 'preventOverflow',\n        options: {\n          padding: {\n            top: 2,\n            bottom: 2,\n            left: 5,\n            right: 5,\n          },\n        },\n      },\n      {\n        name: 'flip',\n        options: {\n          padding: 5,\n        },\n      },\n      {\n        name: 'computeStyles',\n        options: {\n          adaptive: !moveTransition,\n        },\n      },\n      tippyModifier,\n    ];\n\n    if (getIsDefaultRenderFn() && arrow) {\n      modifiers.push({\n        name: 'arrow',\n        options: {\n          element: arrow,\n          padding: 3,\n        },\n      });\n    }\n\n    modifiers.push(...(popperOptions?.modifiers || []));\n\n    instance.popperInstance = createPopper<ExtendedModifiers>(\n      computedReference,\n      popper,\n      {\n        ...popperOptions,\n        placement,\n        onFirstUpdate,\n        modifiers,\n      }\n    );\n  }\n\n  function destroyPopperInstance(): void {\n    if (instance.popperInstance) {\n      instance.popperInstance.destroy();\n      instance.popperInstance = null;\n    }\n  }\n\n  function mount(): void {\n    const {appendTo} = instance.props;\n\n    let parentNode: any;\n\n    // By default, we'll append the popper to the triggerTargets's parentNode so\n    // it's directly after the reference element so the elements inside the\n    // tippy can be tabbed to\n    // If there are clipping issues, the user can specify a different appendTo\n    // and ensure focus management is handled correctly manually\n    const node = getCurrentTarget();\n\n    if (\n      (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO) ||\n      appendTo === 'parent'\n    ) {\n      parentNode = node.parentNode;\n    } else {\n      parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n    }\n\n    // The popper element needs to exist on the DOM before its position can be\n    // updated as Popper needs to read its dimensions\n    if (!parentNode.contains(popper)) {\n      parentNode.appendChild(popper);\n    }\n\n    instance.state.isMounted = true;\n\n    createPopperInstance();\n\n    /* istanbul ignore else */\n    if (__DEV__) {\n      // Accessibility check\n      warnWhen(\n        instance.props.interactive &&\n          appendTo === defaultProps.appendTo &&\n          node.nextElementSibling !== popper,\n        [\n          'Interactive tippy element may not be accessible via keyboard',\n          'navigation because it is not directly after the reference element',\n          'in the DOM source order.',\n          '\\n\\n',\n          'Using a wrapper <div> or <span> tag around the reference element',\n          'solves this by creating a new parentNode context.',\n          '\\n\\n',\n          'Specifying `appendTo: document.body` silences this warning, but it',\n          'assumes you are using a focus management solution to handle',\n          'keyboard navigation.',\n          '\\n\\n',\n          'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity',\n        ].join(' ')\n      );\n    }\n  }\n\n  function getNestedPopperTree(): PopperElement[] {\n    return arrayFrom(\n      popper.querySelectorAll('[data-__NAMESPACE_PREFIX__-root]')\n    );\n  }\n\n  function scheduleShow(event?: Event): void {\n    instance.clearDelayTimeouts();\n\n    if (event) {\n      invokeHook('onTrigger', [instance, event]);\n    }\n\n    addDocumentPress();\n\n    let delay = getDelay(true);\n    const [touchValue, touchDelay] = getNormalizedTouchSettings();\n\n    if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n      delay = touchDelay;\n    }\n\n    if (delay) {\n      showTimeout = setTimeout(() => {\n        instance.show();\n      }, delay);\n    } else {\n      instance.show();\n    }\n  }\n\n  function scheduleHide(event: Event): void {\n    instance.clearDelayTimeouts();\n\n    invokeHook('onUntrigger', [instance, event]);\n\n    if (!instance.state.isVisible) {\n      removeDocumentPress();\n\n      return;\n    }\n\n    // For interactive tippies, scheduleHide is added to a document.body handler\n    // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n    // events when trigger contains mouseenter and click, and the tip is\n    // currently shown as a result of a click.\n    if (\n      instance.props.trigger.indexOf('mouseenter') >= 0 &&\n      instance.props.trigger.indexOf('click') >= 0 &&\n      ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 &&\n      isVisibleFromClick\n    ) {\n      return;\n    }\n\n    const delay = getDelay(false);\n\n    if (delay) {\n      hideTimeout = setTimeout(() => {\n        if (instance.state.isVisible) {\n          instance.hide();\n        }\n      }, delay);\n    } else {\n      // Fixes a `transitionend` problem when it fires 1 frame too\n      // late sometimes, we don't want hide() to be called.\n      scheduleHideAnimationFrame = requestAnimationFrame(() => {\n        instance.hide();\n      });\n    }\n  }\n\n  // ===========================================================================\n  // 🔑 Public methods\n  // ===========================================================================\n  function enable(): void {\n    instance.state.isEnabled = true;\n  }\n\n  function disable(): void {\n    // Disabling the instance should also hide it\n    // https://github.com/atomiks/tippy.js-react/issues/106\n    instance.hide();\n    instance.state.isEnabled = false;\n  }\n\n  function clearDelayTimeouts(): void {\n    clearTimeout(showTimeout);\n    clearTimeout(hideTimeout);\n    cancelAnimationFrame(scheduleHideAnimationFrame);\n  }\n\n  function setProps(partialProps: Partial<Props>): void {\n    /* istanbul ignore else */\n    if (__DEV__) {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n    }\n\n    if (instance.state.isDestroyed) {\n      return;\n    }\n\n    invokeHook('onBeforeUpdate', [instance, partialProps]);\n\n    removeListeners();\n\n    const prevProps = instance.props;\n    const nextProps = evaluateProps(reference, {\n      ...prevProps,\n      ...removeUndefinedProps(partialProps),\n      ignoreAttributes: true,\n    });\n\n    instance.props = nextProps;\n\n    addListeners();\n\n    if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n      cleanupInteractiveMouseListeners();\n      debouncedOnMouseMove = debounce(\n        onMouseMove,\n        nextProps.interactiveDebounce\n      );\n    }\n\n    // Ensure stale aria-expanded attributes are removed\n    if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n      normalizeToArray(prevProps.triggerTarget).forEach((node) => {\n        node.removeAttribute('aria-expanded');\n      });\n    } else if (nextProps.triggerTarget) {\n      reference.removeAttribute('aria-expanded');\n    }\n\n    handleAriaExpandedAttribute();\n    handleStyles();\n\n    if (onUpdate) {\n      onUpdate(prevProps, nextProps);\n    }\n\n    if (instance.popperInstance) {\n      createPopperInstance();\n\n      // Fixes an issue with nested tippies if they are all getting re-rendered,\n      // and the nested ones get re-rendered first.\n      // https://github.com/atomiks/tippyjs-react/issues/177\n      // TODO: find a cleaner / more efficient solution(!)\n      getNestedPopperTree().forEach((nestedPopper) => {\n        // React (and other UI libs likely) requires a rAF wrapper as it flushes\n        // its work in one\n        requestAnimationFrame(nestedPopper._tippy!.popperInstance!.forceUpdate);\n      });\n    }\n\n    invokeHook('onAfterUpdate', [instance, partialProps]);\n  }\n\n  function setContent(content: Content): void {\n    instance.setProps({content});\n  }\n\n  function show(): void {\n    /* istanbul ignore else */\n    if (__DEV__) {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n    }\n\n    // Early bail-out\n    const isAlreadyVisible = instance.state.isVisible;\n    const isDestroyed = instance.state.isDestroyed;\n    const isDisabled = !instance.state.isEnabled;\n    const isTouchAndTouchDisabled =\n      currentInput.isTouch && !instance.props.touch;\n    const duration = getValueAtIndexOrReturn(\n      instance.props.duration,\n      0,\n      defaultProps.duration\n    );\n\n    if (\n      isAlreadyVisible ||\n      isDestroyed ||\n      isDisabled ||\n      isTouchAndTouchDisabled\n    ) {\n      return;\n    }\n\n    // Normalize `disabled` behavior across browsers.\n    // Firefox allows events on disabled elements, but Chrome doesn't.\n    // Using a wrapper element (i.e. <span>) is recommended.\n    if (getCurrentTarget().hasAttribute('disabled')) {\n      return;\n    }\n\n    invokeHook('onShow', [instance], false);\n    if (instance.props.onShow(instance) === false) {\n      return;\n    }\n\n    instance.state.isVisible = true;\n\n    if (getIsDefaultRenderFn()) {\n      popper.style.visibility = 'visible';\n    }\n\n    handleStyles();\n    addDocumentPress();\n\n    if (!instance.state.isMounted) {\n      popper.style.transition = 'none';\n    }\n\n    // If flipping to the opposite side after hiding at least once, the\n    // animation will use the wrong placement without resetting the duration\n    if (getIsDefaultRenderFn()) {\n      const {box, content} = getDefaultTemplateChildren();\n      setTransitionDuration([box, content], 0);\n    }\n\n    onFirstUpdate = (): void => {\n      if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n        return;\n      }\n\n      ignoreOnFirstUpdate = true;\n\n      // reflow\n      void popper.offsetHeight;\n\n      popper.style.transition = instance.props.moveTransition;\n\n      if (getIsDefaultRenderFn() && instance.props.animation) {\n        const {box, content} = getDefaultTemplateChildren();\n        setTransitionDuration([box, content], duration);\n        setVisibilityState([box, content], 'visible');\n      }\n\n      handleAriaContentAttribute();\n      handleAriaExpandedAttribute();\n\n      pushIfUnique(mountedInstances, instance);\n\n      // certain modifiers (e.g. `maxSize`) require a second update after the\n      // popper has been positioned for the first time\n      instance.popperInstance?.forceUpdate();\n\n      invokeHook('onMount', [instance]);\n\n      if (instance.props.animation && getIsDefaultRenderFn()) {\n        onTransitionedIn(duration, () => {\n          instance.state.isShown = true;\n          invokeHook('onShown', [instance]);\n        });\n      }\n    };\n\n    mount();\n  }\n\n  function hide(): void {\n    /* istanbul ignore else */\n    if (__DEV__) {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n    }\n\n    // Early bail-out\n    const isAlreadyHidden = !instance.state.isVisible;\n    const isDestroyed = instance.state.isDestroyed;\n    const isDisabled = !instance.state.isEnabled;\n    const duration = getValueAtIndexOrReturn(\n      instance.props.duration,\n      1,\n      defaultProps.duration\n    );\n\n    if (isAlreadyHidden || isDestroyed || isDisabled) {\n      return;\n    }\n\n    invokeHook('onHide', [instance], false);\n    if (instance.props.onHide(instance) === false) {\n      return;\n    }\n\n    instance.state.isVisible = false;\n    instance.state.isShown = false;\n    ignoreOnFirstUpdate = false;\n    isVisibleFromClick = false;\n\n    if (getIsDefaultRenderFn()) {\n      popper.style.visibility = 'hidden';\n    }\n\n    cleanupInteractiveMouseListeners();\n    removeDocumentPress();\n    handleStyles(true);\n\n    if (getIsDefaultRenderFn()) {\n      const {box, content} = getDefaultTemplateChildren();\n\n      if (instance.props.animation) {\n        setTransitionDuration([box, content], duration);\n        setVisibilityState([box, content], 'hidden');\n      }\n    }\n\n    handleAriaContentAttribute();\n    handleAriaExpandedAttribute();\n\n    if (instance.props.animation) {\n      if (getIsDefaultRenderFn()) {\n        onTransitionedOut(duration, instance.unmount);\n      }\n    } else {\n      instance.unmount();\n    }\n  }\n\n  function hideWithInteractivity(event: MouseEvent): void {\n    /* istanbul ignore else */\n    if (__DEV__) {\n      warnWhen(\n        instance.state.isDestroyed,\n        createMemoryLeakWarning('hideWithInteractivity')\n      );\n    }\n\n    getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n    pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n    debouncedOnMouseMove(event);\n  }\n\n  function unmount(): void {\n    /* istanbul ignore else */\n    if (__DEV__) {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n    }\n\n    if (instance.state.isVisible) {\n      instance.hide();\n    }\n\n    if (!instance.state.isMounted) {\n      return;\n    }\n\n    destroyPopperInstance();\n\n    // If a popper is not interactive, it will be appended outside the popper\n    // tree by default. This seems mainly for interactive tippies, but we should\n    // find a workaround if possible\n    getNestedPopperTree().forEach((nestedPopper) => {\n      nestedPopper._tippy!.unmount();\n    });\n\n    if (popper.parentNode) {\n      popper.parentNode.removeChild(popper);\n    }\n\n    mountedInstances = mountedInstances.filter((i) => i !== instance);\n\n    instance.state.isMounted = false;\n    invokeHook('onHidden', [instance]);\n  }\n\n  function destroy(): void {\n    /* istanbul ignore else */\n    if (__DEV__) {\n      warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n    }\n\n    if (instance.state.isDestroyed) {\n      return;\n    }\n\n    instance.clearDelayTimeouts();\n    instance.unmount();\n\n    removeListeners();\n\n    delete reference._tippy;\n\n    instance.state.isDestroyed = true;\n\n    invokeHook('onDestroy', [instance]);\n  }\n}\n", "import bindGlobalEventListeners, {\n  currentInput,\n} from './bindGlobalEventListeners';\nimport createTippy, {mountedInstances} from './createTippy';\nimport {getArrayOfElements, isElement, isReferenceElement} from './dom-utils';\nimport {defaultProps, setDefaultProps, validateProps} from './props';\nimport {HideAll, HideAllOptions, Instance, Props, Targets} from './types';\nimport {validateTargets, warnWhen} from './validation';\n\nfunction tippy(\n  targets: Targets,\n  optionalProps: Partial<Props> = {}\n): Instance | Instance[] {\n  const plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n\n  /* istanbul ignore else */\n  if (__DEV__) {\n    validateTargets(targets);\n    validateProps(optionalProps, plugins);\n  }\n\n  bindGlobalEventListeners();\n\n  const passedProps: Partial<Props> = {...optionalProps, plugins};\n\n  const elements = getArrayOfElements(targets);\n\n  /* istanbul ignore else */\n  if (__DEV__) {\n    const isSingleContentElement = isElement(passedProps.content);\n    const isMoreThanOneReferenceElement = elements.length > 1;\n    warnWhen(\n      isSingleContentElement && isMoreThanOneReferenceElement,\n      [\n        'tippy() was passed an Element as the `content` prop, but more than',\n        'one tippy instance was created by this invocation. This means the',\n        'content element will only be appended to the last tippy instance.',\n        '\\n\\n',\n        'Instead, pass the .innerHTML of the element, or use a function that',\n        'returns a cloned version of the element instead.',\n        '\\n\\n',\n        '1) content: element.innerHTML\\n',\n        '2) content: () => element.cloneNode(true)',\n      ].join(' ')\n    );\n  }\n\n  const instances = elements.reduce<Instance[]>(\n    (acc, reference): Instance[] => {\n      const instance = reference && createTippy(reference, passedProps);\n\n      if (instance) {\n        acc.push(instance);\n      }\n\n      return acc;\n    },\n    []\n  );\n\n  return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\n\nexport default tippy;\n\nexport const hideAll: HideAll = ({\n  exclude: excludedReferenceOrInstance,\n  duration,\n}: HideAllOptions = {}) => {\n  mountedInstances.forEach((instance) => {\n    let isExcluded = false;\n\n    if (excludedReferenceOrInstance) {\n      isExcluded = isReferenceElement(excludedReferenceOrInstance)\n        ? instance.reference === excludedReferenceOrInstance\n        : instance.popper === (excludedReferenceOrInstance as Instance).popper;\n    }\n\n    if (!isExcluded) {\n      const originalDuration = instance.props.duration;\n\n      instance.setProps({duration});\n      instance.hide();\n\n      if (!instance.state.isDestroyed) {\n        instance.setProps({duration: originalDuration});\n      }\n    }\n  });\n};\n", "import tippy from '..';\nimport {div} from '../dom-utils';\nimport {\n  CreateSingleton,\n  Plugin,\n  CreateSingletonProps,\n  ReferenceElement,\n  CreateSingletonInstance,\n  Instance,\n  Props,\n} from '../types';\nimport {normalizeToArray, removeProperties} from '../utils';\nimport {errorWhen} from '../validation';\nimport {applyStyles, Modifier} from '@popperjs/core';\n\n// The default `applyStyles` modifier has a cleanup function that gets called\n// every time the popper is destroyed (i.e. a new target), removing the styles\n// and causing transitions to break for singletons when the console is open, but\n// most notably for non-transform styles being used, `gpuAcceleration: false`.\nconst applyStylesModifier: Modifier<'applyStyles', Record<string, unknown>> = {\n  ...applyStyles,\n  effect({state}) {\n    const initialStyles = {\n      popper: {\n        position: state.options.strategy,\n        left: '0',\n        top: '0',\n        margin: '0',\n      },\n      arrow: {\n        position: 'absolute',\n      },\n      reference: {},\n    };\n\n    Object.assign(state.elements.popper.style, initialStyles.popper);\n    state.styles = initialStyles;\n\n    if (state.elements.arrow) {\n      Object.assign(state.elements.arrow.style, initialStyles.arrow);\n    }\n\n    // intentionally return no cleanup function\n    // return () => { ... }\n  },\n};\n\nconst createSingleton: CreateSingleton = (\n  tippyInstances,\n  optionalProps = {}\n) => {\n  /* istanbul ignore else */\n  if (__DEV__) {\n    errorWhen(\n      !Array.isArray(tippyInstances),\n      [\n        'The first argument passed to createSingleton() must be an array of',\n        'tippy instances. The passed value was',\n        String(tippyInstances),\n      ].join(' ')\n    );\n  }\n\n  let individualInstances = tippyInstances;\n  let references: Array<ReferenceElement> = [];\n  let triggerTargets: Array<Element> = [];\n  let currentTarget: Element | null;\n  let overrides = optionalProps.overrides;\n  let interceptSetPropsCleanups: Array<() => void> = [];\n  let shownOnCreate = false;\n\n  function setTriggerTargets(): void {\n    triggerTargets = individualInstances\n      .map((instance) =>\n        normalizeToArray(instance.props.triggerTarget || instance.reference)\n      )\n      .reduce((acc, item) => acc.concat(item), []);\n  }\n\n  function setReferences(): void {\n    references = individualInstances.map((instance) => instance.reference);\n  }\n\n  function enableInstances(isEnabled: boolean): void {\n    individualInstances.forEach((instance) => {\n      if (isEnabled) {\n        instance.enable();\n      } else {\n        instance.disable();\n      }\n    });\n  }\n\n  function interceptSetProps(singleton: Instance): Array<() => void> {\n    return individualInstances.map((instance) => {\n      const originalSetProps = instance.setProps;\n\n      instance.setProps = (props): void => {\n        originalSetProps(props);\n\n        if (instance.reference === currentTarget) {\n          singleton.setProps(props);\n        }\n      };\n\n      return (): void => {\n        instance.setProps = originalSetProps;\n      };\n    });\n  }\n\n  // have to pass singleton, as it maybe undefined on first call\n  function prepareInstance(\n    singleton: Instance,\n    target: ReferenceElement\n  ): void {\n    const index = triggerTargets.indexOf(target);\n\n    // bail-out\n    if (target === currentTarget) {\n      return;\n    }\n\n    currentTarget = target;\n\n    const overrideProps: Partial<Props> = (overrides || [])\n      .concat('content')\n      .reduce((acc, prop) => {\n        (acc as any)[prop] = individualInstances[index].props[prop];\n        return acc;\n      }, {});\n\n    singleton.setProps({\n      ...overrideProps,\n      getReferenceClientRect:\n        typeof overrideProps.getReferenceClientRect === 'function'\n          ? overrideProps.getReferenceClientRect\n          : (): ClientRect => references[index]?.getBoundingClientRect(),\n    });\n  }\n\n  enableInstances(false);\n  setReferences();\n  setTriggerTargets();\n\n  const plugin: Plugin = {\n    fn() {\n      return {\n        onDestroy(): void {\n          enableInstances(true);\n        },\n        onHidden(): void {\n          currentTarget = null;\n        },\n        onClickOutside(instance): void {\n          if (instance.props.showOnCreate && !shownOnCreate) {\n            shownOnCreate = true;\n            currentTarget = null;\n          }\n        },\n        onShow(instance): void {\n          if (instance.props.showOnCreate && !shownOnCreate) {\n            shownOnCreate = true;\n            prepareInstance(instance, references[0]);\n          }\n        },\n        onTrigger(instance, event): void {\n          prepareInstance(instance, event.currentTarget as Element);\n        },\n      };\n    },\n  };\n\n  const singleton = tippy(div(), {\n    ...removeProperties(optionalProps, ['overrides']),\n    plugins: [plugin, ...(optionalProps.plugins || [])],\n    triggerTarget: triggerTargets,\n    popperOptions: {\n      ...optionalProps.popperOptions,\n      modifiers: [\n        ...(optionalProps.popperOptions?.modifiers || []),\n        applyStylesModifier,\n      ],\n    },\n  }) as CreateSingletonInstance<CreateSingletonProps>;\n\n  const originalShow = singleton.show;\n\n  singleton.show = (target?: ReferenceElement | Instance | number): void => {\n    originalShow();\n\n    // first time, showOnCreate or programmatic call with no params\n    // default to showing first instance\n    if (!currentTarget && target == null) {\n      return prepareInstance(singleton, references[0]);\n    }\n\n    // triggered from event (do nothing as prepareInstance already called by onTrigger)\n    // programmatic call with no params when already visible (do nothing again)\n    if (currentTarget && target == null) {\n      return;\n    }\n\n    // target is index of instance\n    if (typeof target === 'number') {\n      return (\n        references[target] && prepareInstance(singleton, references[target])\n      );\n    }\n\n    // target is a child tippy instance\n    if (individualInstances.indexOf(target as Instance) >= 0) {\n      const ref = (target as Instance).reference;\n      return prepareInstance(singleton, ref);\n    }\n\n    // target is a ReferenceElement\n    if (references.indexOf(target as ReferenceElement) >= 0) {\n      return prepareInstance(singleton, target as ReferenceElement);\n    }\n  };\n\n  singleton.showNext = (): void => {\n    const first = references[0];\n    if (!currentTarget) {\n      return singleton.show(0);\n    }\n    const index = references.indexOf(currentTarget);\n    singleton.show(references[index + 1] || first);\n  };\n\n  singleton.showPrevious = (): void => {\n    const last = references[references.length - 1];\n    if (!currentTarget) {\n      return singleton.show(last);\n    }\n    const index = references.indexOf(currentTarget);\n    const target = references[index - 1] || last;\n    singleton.show(target);\n  };\n\n  const originalSetProps = singleton.setProps;\n\n  singleton.setProps = (props): void => {\n    overrides = props.overrides || overrides;\n    originalSetProps(props);\n  };\n\n  singleton.setInstances = (nextInstances): void => {\n    enableInstances(true);\n    interceptSetPropsCleanups.forEach((fn) => fn());\n\n    individualInstances = nextInstances;\n\n    enableInstances(false);\n    setReferences();\n    setTriggerTargets();\n    interceptSetPropsCleanups = interceptSetProps(singleton);\n\n    singleton.setProps({triggerTarget: triggerTargets});\n  };\n\n  interceptSetPropsCleanups = interceptSetProps(singleton);\n\n  return singleton;\n};\n\nexport default createSingleton;\n", "import tippy from '..';\nimport {TOUCH_OPTIONS} from '../constants';\nimport {defaultProps} from '../props';\nimport {Instance, Props, Targets} from '../types';\nimport {ListenerObject} from '../types-internal';\nimport {normalizeToArray, removeProperties} from '../utils';\nimport {errorWhen} from '../validation';\n\nconst BUBBLING_EVENTS_MAP = {\n  mouseover: 'mouseenter',\n  focusin: 'focus',\n  click: 'click',\n};\n\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\nfunction delegate(\n  targets: Targets,\n  props: Partial<Props> & {target: string}\n): Instance | Instance[] {\n  /* istanbul ignore else */\n  if (__DEV__) {\n    errorWhen(\n      !(props && props.target),\n      [\n        'You must specity a `target` prop indicating a CSS selector string matching',\n        'the target elements that should receive a tippy.',\n      ].join(' ')\n    );\n  }\n\n  let listeners: ListenerObject[] = [];\n  let childTippyInstances: Instance[] = [];\n  let disabled = false;\n\n  const {target} = props;\n\n  const nativeProps = removeProperties(props, ['target']);\n  const parentProps = {...nativeProps, trigger: 'manual', touch: false};\n  const childProps = {\n    touch: defaultProps.touch,\n    ...nativeProps,\n    showOnCreate: true,\n  };\n\n  const returnValue = tippy(targets, parentProps);\n  const normalizedReturnValue = normalizeToArray(returnValue);\n\n  function onTrigger(event: Event): void {\n    if (!event.target || disabled) {\n      return;\n    }\n\n    const targetNode = (event.target as Element).closest(target);\n\n    if (!targetNode) {\n      return;\n    }\n\n    // Get relevant trigger with fallbacks:\n    // 1. Check `data-tippy-trigger` attribute on target node\n    // 2. Fallback to `trigger` passed to `delegate()`\n    // 3. Fallback to `defaultProps.trigger`\n    const trigger =\n      targetNode.getAttribute('data-tippy-trigger') ||\n      props.trigger ||\n      defaultProps.trigger;\n\n    // @ts-ignore\n    if (targetNode._tippy) {\n      return;\n    }\n\n    if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n      return;\n    }\n\n    if (\n      event.type !== 'touchstart' &&\n      trigger.indexOf((BUBBLING_EVENTS_MAP as any)[event.type]) < 0\n    ) {\n      return;\n    }\n\n    const instance = tippy(targetNode, childProps);\n\n    if (instance) {\n      childTippyInstances = childTippyInstances.concat(instance);\n    }\n  }\n\n  function on(\n    node: Element,\n    eventType: string,\n    handler: EventListener,\n    options: boolean | Record<string, unknown> = false\n  ): void {\n    node.addEventListener(eventType, handler, options);\n    listeners.push({node, eventType, handler, options});\n  }\n\n  function addEventListeners(instance: Instance): void {\n    const {reference} = instance;\n\n    on(reference, 'touchstart', onTrigger, TOUCH_OPTIONS);\n    on(reference, 'mouseover', onTrigger);\n    on(reference, 'focusin', onTrigger);\n    on(reference, 'click', onTrigger);\n  }\n\n  function removeEventListeners(): void {\n    listeners.forEach(({node, eventType, handler, options}: ListenerObject) => {\n      node.removeEventListener(eventType, handler, options);\n    });\n    listeners = [];\n  }\n\n  function applyMutations(instance: Instance): void {\n    const originalDestroy = instance.destroy;\n    const originalEnable = instance.enable;\n    const originalDisable = instance.disable;\n\n    instance.destroy = (shouldDestroyChildInstances = true): void => {\n      if (shouldDestroyChildInstances) {\n        childTippyInstances.forEach((instance) => {\n          instance.destroy();\n        });\n      }\n\n      childTippyInstances = [];\n\n      removeEventListeners();\n      originalDestroy();\n    };\n\n    instance.enable = (): void => {\n      originalEnable();\n      childTippyInstances.forEach((instance) => instance.enable());\n      disabled = false;\n    };\n\n    instance.disable = (): void => {\n      originalDisable();\n      childTippyInstances.forEach((instance) => instance.disable());\n      disabled = true;\n    };\n\n    addEventListeners(instance);\n  }\n\n  normalizedReturnValue.forEach(applyMutations);\n\n  return returnValue;\n}\n\nexport default delegate;\n", "import {BACKDROP_CLASS} from '../constants';\nimport {div, setVisibilityState} from '../dom-utils';\nimport {getChildren} from '../template';\nimport {AnimateFill} from '../types';\nimport {errorWhen} from '../validation';\n\nconst animateFill: AnimateFill = {\n  name: 'animateFill',\n  defaultValue: false,\n  fn(instance) {\n    // @ts-ignore\n    if (!instance.props.render?.$$tippy) {\n      if (__DEV__) {\n        errorWhen(\n          instance.props.animateFill,\n          'The `animateFill` plugin requires the default render function.'\n        );\n      }\n\n      return {};\n    }\n\n    const {box, content} = getChildren(instance.popper);\n\n    const backdrop = instance.props.animateFill\n      ? createBackdropElement()\n      : null;\n\n    return {\n      onCreate(): void {\n        if (backdrop) {\n          box.insertBefore(backdrop, box.firstElementChild!);\n          box.setAttribute('data-animatefill', '');\n          box.style.overflow = 'hidden';\n\n          instance.setProps({arrow: false, animation: 'shift-away'});\n        }\n      },\n      onMount(): void {\n        if (backdrop) {\n          const {transitionDuration} = box.style;\n          const duration = Number(transitionDuration.replace('ms', ''));\n\n          // The content should fade in after the backdrop has mostly filled the\n          // tooltip element. `clip-path` is the other alternative but is not\n          // well-supported and is buggy on some devices.\n          content.style.transitionDelay = `${Math.round(duration / 10)}ms`;\n\n          backdrop.style.transitionDuration = transitionDuration;\n          setVisibilityState([backdrop], 'visible');\n        }\n      },\n      onShow(): void {\n        if (backdrop) {\n          backdrop.style.transitionDuration = '0ms';\n        }\n      },\n      onHide(): void {\n        if (backdrop) {\n          setVisibilityState([backdrop], 'hidden');\n        }\n      },\n    };\n  },\n};\n\nexport default animateFill;\n\nfunction createBackdropElement(): HTMLDivElement {\n  const backdrop = div();\n  backdrop.className = BACKDROP_CLASS;\n  setVisibilityState([backdrop], 'hidden');\n  return backdrop;\n}\n", "import {getOwnerDocument, isMouseEvent} from '../dom-utils';\nimport {FollowCursor, Instance} from '../types';\n\nlet mouseCoords = {clientX: 0, clientY: 0};\nlet activeInstances: Array<{instance: Instance; doc: Document}> = [];\n\nfunction storeMouseCoords({clientX, clientY}: MouseEvent): void {\n  mouseCoords = {clientX, clientY};\n}\n\nfunction addMouseCoordsListener(doc: Document): void {\n  doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc: Document): void {\n  doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nconst followCursor: FollowCursor = {\n  name: 'followCursor',\n  defaultValue: false,\n  fn(instance) {\n    const reference = instance.reference;\n    const doc = getOwnerDocument(instance.props.triggerTarget || reference);\n\n    let isInternalUpdate = false;\n    let wasFocusEvent = false;\n    let isUnmounted = true;\n    let prevProps = instance.props;\n\n    function getIsInitialBehavior(): boolean {\n      return (\n        instance.props.followCursor === 'initial' && instance.state.isVisible\n      );\n    }\n\n    function addListener(): void {\n      doc.addEventListener('mousemove', onMouseMove);\n    }\n\n    function removeListener(): void {\n      doc.removeEventListener('mousemove', onMouseMove);\n    }\n\n    function unsetGetReferenceClientRect(): void {\n      isInternalUpdate = true;\n      instance.setProps({getReferenceClientRect: null});\n      isInternalUpdate = false;\n    }\n\n    function onMouseMove(event: MouseEvent): void {\n      // If the instance is interactive, avoid updating the position unless it's\n      // over the reference element\n      const isCursorOverReference = event.target\n        ? reference.contains(event.target as Node)\n        : true;\n      const {followCursor} = instance.props;\n      const {clientX, clientY} = event;\n\n      const rect = reference.getBoundingClientRect();\n      const relativeX = clientX - rect.left;\n      const relativeY = clientY - rect.top;\n\n      if (isCursorOverReference || !instance.props.interactive) {\n        instance.setProps({\n          // @ts-ignore - unneeded DOMRect properties\n          getReferenceClientRect() {\n            const rect = reference.getBoundingClientRect();\n\n            let x = clientX;\n            let y = clientY;\n\n            if (followCursor === 'initial') {\n              x = rect.left + relativeX;\n              y = rect.top + relativeY;\n            }\n\n            const top = followCursor === 'horizontal' ? rect.top : y;\n            const right = followCursor === 'vertical' ? rect.right : x;\n            const bottom = followCursor === 'horizontal' ? rect.bottom : y;\n            const left = followCursor === 'vertical' ? rect.left : x;\n\n            return {\n              width: right - left,\n              height: bottom - top,\n              top,\n              right,\n              bottom,\n              left,\n            };\n          },\n        });\n      }\n    }\n\n    function create(): void {\n      if (instance.props.followCursor) {\n        activeInstances.push({instance, doc});\n        addMouseCoordsListener(doc);\n      }\n    }\n\n    function destroy(): void {\n      activeInstances = activeInstances.filter(\n        (data) => data.instance !== instance\n      );\n\n      if (activeInstances.filter((data) => data.doc === doc).length === 0) {\n        removeMouseCoordsListener(doc);\n      }\n    }\n\n    return {\n      onCreate: create,\n      onDestroy: destroy,\n      onBeforeUpdate(): void {\n        prevProps = instance.props;\n      },\n      onAfterUpdate(_, {followCursor}): void {\n        if (isInternalUpdate) {\n          return;\n        }\n\n        if (\n          followCursor !== undefined &&\n          prevProps.followCursor !== followCursor\n        ) {\n          destroy();\n\n          if (followCursor) {\n            create();\n\n            if (\n              instance.state.isMounted &&\n              !wasFocusEvent &&\n              !getIsInitialBehavior()\n            ) {\n              addListener();\n            }\n          } else {\n            removeListener();\n            unsetGetReferenceClientRect();\n          }\n        }\n      },\n      onMount(): void {\n        if (instance.props.followCursor && !wasFocusEvent) {\n          if (isUnmounted) {\n            onMouseMove(mouseCoords as MouseEvent);\n            isUnmounted = false;\n          }\n\n          if (!getIsInitialBehavior()) {\n            addListener();\n          }\n        }\n      },\n      onTrigger(_, event): void {\n        if (isMouseEvent(event)) {\n          mouseCoords = {clientX: event.clientX, clientY: event.clientY};\n        }\n        wasFocusEvent = event.type === 'focus';\n      },\n      onHidden(): void {\n        if (instance.props.followCursor) {\n          unsetGetReferenceClientRect();\n          removeListener();\n          isUnmounted = true;\n        }\n      },\n    };\n  },\n};\n\nexport default followCursor;\n", "import {Modifier, Placement} from '@popperjs/core';\nimport {isMouseEvent} from '../dom-utils';\nimport {BasePlacement, InlinePositioning, Props} from '../types';\nimport {arrayFrom, getBasePlacement} from '../utils';\n\nfunction getProps(props: Props, modifier: Modifier<any, any>): Partial<Props> {\n  return {\n    popperOptions: {\n      ...props.popperOptions,\n      modifiers: [\n        ...(props.popperOptions?.modifiers || []).filter(\n          ({name}) => name !== modifier.name\n        ),\n        modifier,\n      ],\n    },\n  };\n}\n\nconst inlinePositioning: InlinePositioning = {\n  name: 'inlinePositioning',\n  defaultValue: false,\n  fn(instance) {\n    const {reference} = instance;\n\n    function isEnabled(): boolean {\n      return !!instance.props.inlinePositioning;\n    }\n\n    let placement: Placement;\n    let cursorRectIndex = -1;\n    let isInternalUpdate = false;\n    let triedPlacements: Array<string> = [];\n\n    const modifier: Modifier<\n      'tippyInlinePositioning',\n      Record<string, unknown>\n    > = {\n      name: 'tippyInlinePositioning',\n      enabled: true,\n      phase: 'afterWrite',\n      fn({state}) {\n        if (isEnabled()) {\n          if (triedPlacements.indexOf(state.placement) !== -1) {\n            triedPlacements = [];\n          }\n\n          if (\n            placement !== state.placement &&\n            triedPlacements.indexOf(state.placement) === -1\n          ) {\n            triedPlacements.push(state.placement);\n            instance.setProps({\n              // @ts-ignore - unneeded DOMRect properties\n              getReferenceClientRect: () =>\n                getReferenceClientRect(state.placement),\n            });\n          }\n\n          placement = state.placement;\n        }\n      },\n    };\n\n    function getReferenceClientRect(placement: Placement): Partial<DOMRect> {\n      return getInlineBoundingClientRect(\n        getBasePlacement(placement),\n        reference.getBoundingClientRect(),\n        arrayFrom(reference.getClientRects()),\n        cursorRectIndex\n      );\n    }\n\n    function setInternalProps(partialProps: Partial<Props>): void {\n      isInternalUpdate = true;\n      instance.setProps(partialProps);\n      isInternalUpdate = false;\n    }\n\n    function addModifier(): void {\n      if (!isInternalUpdate) {\n        setInternalProps(getProps(instance.props, modifier));\n      }\n    }\n\n    return {\n      onCreate: addModifier,\n      onAfterUpdate: addModifier,\n      onTrigger(_, event): void {\n        if (isMouseEvent(event)) {\n          const rects = arrayFrom(instance.reference.getClientRects());\n          const cursorRect = rects.find(\n            (rect) =>\n              rect.left - 2 <= event.clientX &&\n              rect.right + 2 >= event.clientX &&\n              rect.top - 2 <= event.clientY &&\n              rect.bottom + 2 >= event.clientY\n          );\n          const index = rects.indexOf(cursorRect);\n          cursorRectIndex = index > -1 ? index : cursorRectIndex;\n        }\n      },\n      onHidden(): void {\n        cursorRectIndex = -1;\n      },\n    };\n  },\n};\n\nexport default inlinePositioning;\n\nexport function getInlineBoundingClientRect(\n  currentBasePlacement: BasePlacement | null,\n  boundingRect: DOMRect,\n  clientRects: DOMRect[],\n  cursorRectIndex: number\n): {\n  top: number;\n  bottom: number;\n  left: number;\n  right: number;\n  width: number;\n  height: number;\n} {\n  // Not an inline element, or placement is not yet known\n  if (clientRects.length < 2 || currentBasePlacement === null) {\n    return boundingRect;\n  }\n\n  // There are two rects and they are disjoined\n  if (\n    clientRects.length === 2 &&\n    cursorRectIndex >= 0 &&\n    clientRects[0].left > clientRects[1].right\n  ) {\n    return clientRects[cursorRectIndex] || boundingRect;\n  }\n\n  switch (currentBasePlacement) {\n    case 'top':\n    case 'bottom': {\n      const firstRect = clientRects[0];\n      const lastRect = clientRects[clientRects.length - 1];\n      const isTop = currentBasePlacement === 'top';\n\n      const top = firstRect.top;\n      const bottom = lastRect.bottom;\n      const left = isTop ? firstRect.left : lastRect.left;\n      const right = isTop ? firstRect.right : lastRect.right;\n      const width = right - left;\n      const height = bottom - top;\n\n      return {top, bottom, left, right, width, height};\n    }\n    case 'left':\n    case 'right': {\n      const minLeft = Math.min(...clientRects.map((rects) => rects.left));\n      const maxRight = Math.max(...clientRects.map((rects) => rects.right));\n      const measureRects = clientRects.filter((rect) =>\n        currentBasePlacement === 'left'\n          ? rect.left === minLeft\n          : rect.right === maxRight\n      );\n\n      const top = measureRects[0].top;\n      const bottom = measureRects[measureRects.length - 1].bottom;\n      const left = minLeft;\n      const right = maxRight;\n      const width = right - left;\n      const height = bottom - top;\n\n      return {top, bottom, left, right, width, height};\n    }\n    default: {\n      return boundingRect;\n    }\n  }\n}\n", "import {VirtualElement} from '@popperjs/core';\nimport {ReferenceElement, Sticky} from '../types';\n\nconst sticky: Sticky = {\n  name: 'sticky',\n  defaultValue: false,\n  fn(instance) {\n    const {reference, popper} = instance;\n\n    function getReference(): ReferenceElement | VirtualElement {\n      return instance.popperInstance\n        ? instance.popperInstance.state.elements.reference\n        : reference;\n    }\n\n    function shouldCheck(value: 'reference' | 'popper'): boolean {\n      return instance.props.sticky === true || instance.props.sticky === value;\n    }\n\n    let prevRefRect: ClientRect | null = null;\n    let prevPopRect: ClientRect | null = null;\n\n    function updatePosition(): void {\n      const currentRefRect = shouldCheck('reference')\n        ? getReference().getBoundingClientRect()\n        : null;\n      const currentPopRect = shouldCheck('popper')\n        ? popper.getBoundingClientRect()\n        : null;\n\n      if (\n        (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect)) ||\n        (currentPopRect && areRectsDifferent(prevPopRect, currentPopRect))\n      ) {\n        if (instance.popperInstance) {\n          instance.popperInstance.update();\n        }\n      }\n\n      prevRefRect = currentRefRect;\n      prevPopRect = currentPopRect;\n\n      if (instance.state.isMounted) {\n        requestAnimationFrame(updatePosition);\n      }\n    }\n\n    return {\n      onMount(): void {\n        if (instance.props.sticky) {\n          updatePosition();\n        }\n      },\n    };\n  },\n};\n\nexport default sticky;\n\nfunction areRectsDifferent(\n  rectA: ClientRect | null,\n  rectB: ClientRect | null\n): boolean {\n  if (rectA && rectB) {\n    return (\n      rectA.top !== rectB.top ||\n      rectA.right !== rectB.right ||\n      rectA.bottom !== rectB.bottom ||\n      rectA.left !== rectB.left\n    );\n  }\n\n  return true;\n}\n", "import tippy from '../src';\nimport {render} from '../src/template';\n\ntippy.setDefaultProps({render});\n\nexport {default, hideAll} from '../src';\nexport {default as createSingleton} from '../src/addons/createSingleton';\nexport {default as delegate} from '../src/addons/delegate';\nexport {default as animateFill} from '../src/plugins/animateFill';\nexport {default as followCursor} from '../src/plugins/followCursor';\nexport {default as inlinePositioning} from '../src/plugins/inlinePositioning';\nexport {default as sticky} from '../src/plugins/sticky';\nexport {ROUND_ARROW as roundArrow} from '../src/constants';\n", "import { Controller } from '@hotwired/stimulus';\nimport tippy, { createSingleton } from 'tippy.js';\n\nconst POPOVER_BREAKPOINT = 768; // Matches with theme('screens.md') in Tailwind\n\nexport default class extends Controller {\n  static targets = ['popoverButton', 'popoverTemplate', 'modalButton', 'modalTemplate', 'group'];\n  static values = { placement: { type: String }, activeFilter: { type: String } };\n  static classes = ['active'];\n\n  connect() {\n    this.tippySingleton = createSingleton(tippy([...this.popoverButtonTargets, ...this.groupTargets]), {\n      allowHTML: true,\n      interactive: true,\n      trigger: 'manual',\n      maxWidth: 'none',\n      duration: 200,\n      offset: [0, 8],\n      zIndex: 0,\n      delay: 200,\n      placement: this.placementValue,\n      theme: 'popover',\n      arrow: false,\n      appendTo: this.portal,\n      hideOnClick: false,\n      animation: false,\n      moveTransition: 'transform 0.2s ease-out',\n      onClickOutside: this.handleClickOutside,\n    });\n  }\n\n  disconnect() {\n    this.tippySingleton.destroy();\n    this.tippySingleton = null;\n  }\n\n  handleClickOutside = () => {\n    this.activeFilterValue = undefined;\n  };\n\n  handlePopoverButtonClick(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.activeFilterValue = event.currentTarget.dataset.key;\n  }\n\n  activeFilterValueChanged() {\n    this.updatePopoverTemplate();\n\n    if (!this.tippySingleton) return;\n\n    const activePopoverButton = this.findByKey(this.popoverButtonTargets, this.activeFilterValue);\n    this.activateButton(this.popoverButtonTargets, activePopoverButton);\n\n    if (!this.activeFilterValue) {\n      this.tippySingleton.hide();\n    } else {\n      if (window.matchMedia(`(width >= ${POPOVER_BREAKPOINT}px)`).matches) {\n        const activeGroup = this.groupTargets.find((group) => group.contains(activePopoverButton));\n        this.tippySingleton.show(activeGroup ?? activePopoverButton);\n        this.tippySingleton.setContent(this.popoverTemplateTarget.content.cloneNode(true));\n        window.requestAnimationFrame(() => this.tippySingleton.popperInstance.update());\n      }\n    }\n  }\n\n  activateButton(buttons, activeButton) {\n    buttons.forEach((button) => button.classList.toggle(this.activeClass, button === activeButton));\n  }\n\n  updatePopoverTemplate() {\n    this.popoverTemplateTarget.content.querySelector('input[name=active_filter]').value = this.activeFilterValue;\n  }\n\n  handleModalButtonClick(event) {\n    this.modalTemplateTarget.content.querySelector('input[name=active_filter]').value = event.currentTarget.dataset.key;\n  }\n\n  findByKey(elements, key) {\n    return elements.find((element) => element.dataset.key === key);\n  }\n\n  get portal() {\n    return document.getElementById('portal');\n  }\n}\n", "import { PointerEventType } from './DragTracker'\n\nexport type WindowType = Window & typeof globalThis\n\nexport function isNumber(subject: unknown): subject is number {\n  return typeof subject === 'number'\n}\n\nexport function isString(subject: unknown): subject is string {\n  return typeof subject === 'string'\n}\n\nexport function isBoolean(subject: unknown): subject is boolean {\n  return typeof subject === 'boolean'\n}\n\nexport function isObject(subject: unknown): subject is Record<string, unknown> {\n  return Object.prototype.toString.call(subject) === '[object Object]'\n}\n\nexport function mathAbs(n: number): number {\n  return Math.abs(n)\n}\n\nexport function mathSign(n: number): number {\n  return Math.sign(n)\n}\n\nexport function deltaAbs(valueB: number, valueA: number): number {\n  return mathAbs(valueB - valueA)\n}\n\nexport function factorAbs(valueB: number, valueA: number): number {\n  if (valueB === 0 || valueA === 0) return 0\n  if (mathAbs(valueB) <= mathAbs(valueA)) return 0\n  const diff = deltaAbs(mathAbs(valueB), mathAbs(valueA))\n  return mathAbs(diff / valueB)\n}\n\nexport function roundToTwoDecimals(num: number): number {\n  return Math.round(num * 100) / 100\n}\n\nexport function arrayKeys<Type>(array: Type[]): number[] {\n  return objectKeys(array).map(Number)\n}\n\nexport function arrayLast<Type>(array: Type[]): Type {\n  return array[arrayLastIndex(array)]\n}\n\nexport function arrayLastIndex<Type>(array: Type[]): number {\n  return Math.max(0, array.length - 1)\n}\n\nexport function arrayIsLastIndex<Type>(array: Type[], index: number): boolean {\n  return index === arrayLastIndex(array)\n}\n\nexport function arrayFromNumber(n: number, startAt: number = 0): number[] {\n  return Array.from(Array(n), (_, i) => startAt + i)\n}\n\nexport function objectKeys<Type extends object>(object: Type): string[] {\n  return Object.keys(object)\n}\n\nexport function objectsMergeDeep(\n  objectA: Record<string, unknown>,\n  objectB: Record<string, unknown>\n): Record<string, unknown> {\n  return [objectA, objectB].reduce((mergedObjects, currentObject) => {\n    objectKeys(currentObject).forEach((key) => {\n      const valueA = mergedObjects[key]\n      const valueB = currentObject[key]\n      const areObjects = isObject(valueA) && isObject(valueB)\n\n      mergedObjects[key] = areObjects\n        ? objectsMergeDeep(valueA, valueB)\n        : valueB\n    })\n    return mergedObjects\n  }, {})\n}\n\nexport function isMouseEvent(\n  evt: PointerEventType,\n  ownerWindow: WindowType\n): evt is MouseEvent {\n  return (\n    typeof ownerWindow.MouseEvent !== 'undefined' &&\n    evt instanceof ownerWindow.MouseEvent\n  )\n}\n", "import { isString } from './utils'\n\nexport type AlignmentOptionType =\n  | 'start'\n  | 'center'\n  | 'end'\n  | ((viewSize: number, snapSize: number, index: number) => number)\n\nexport type AlignmentType = {\n  measure: (n: number, index: number) => number\n}\n\nexport function Alignment(\n  align: AlignmentOptionType,\n  viewSize: number\n): AlignmentType {\n  const predefined = { start, center, end }\n\n  function start(): number {\n    return 0\n  }\n\n  function center(n: number): number {\n    return end(n) / 2\n  }\n\n  function end(n: number): number {\n    return viewSize - n\n  }\n\n  function measure(n: number, index: number): number {\n    if (isString(align)) return predefined[align](n)\n    return align(viewSize, n, index)\n  }\n\n  const self: AlignmentType = {\n    measure\n  }\n  return self\n}\n", "type EventNameType = keyof DocumentEventMap | keyof WindowEventMap\ntype EventHandlerType = (evt: any) => void\ntype EventOptionsType = boolean | AddEventListenerOptions | undefined\ntype EventRemoverType = () => void\n\nexport type EventStoreType = {\n  add: (\n    node: EventTarget,\n    type: EventNameType,\n    handler: EventHandlerType,\n    options?: EventOptionsType\n  ) => EventStoreType\n  clear: () => void\n}\n\nexport function EventStore(): EventStoreType {\n  let listeners: EventRemoverType[] = []\n\n  function add(\n    node: EventTarget,\n    type: EventNameType,\n    handler: EventHandlerType,\n    options: EventOptionsType = { passive: true }\n  ): EventStoreType {\n    let removeListener: EventRemoverType\n\n    if ('addEventListener' in node) {\n      node.addEventListener(type, handler, options)\n      removeListener = () => node.removeEventListener(type, handler, options)\n    } else {\n      const legacyMediaQueryList = <MediaQueryList>node\n      legacyMediaQueryList.addListener(handler)\n      removeListener = () => legacyMediaQueryList.removeListener(handler)\n    }\n\n    listeners.push(removeListener)\n    return self\n  }\n\n  function clear(): void {\n    listeners = listeners.filter((remove) => remove())\n  }\n\n  const self: EventStoreType = {\n    add,\n    clear\n  }\n  return self\n}\n", "import { EngineType } from './Engine'\nimport { EventStore } from './EventStore'\nimport { WindowType } from './utils'\n\nexport type AnimationsUpdateType = (engine: EngineType) => void\nexport type AnimationsRenderType = (engine: EngineType, alpha: number) => void\n\nexport type AnimationsType = {\n  init: () => void\n  destroy: () => void\n  start: () => void\n  stop: () => void\n  update: () => void\n  render: (alpha: number) => void\n}\n\nexport function Animations(\n  ownerDocument: Document,\n  ownerWindow: WindowType,\n  update: () => void,\n  render: (alpha: number) => void\n): AnimationsType {\n  const documentVisibleHandler = EventStore()\n  const fixedTimeStep = 1000 / 60\n\n  let lastTimeStamp: number | null = null\n  let accumulatedTime = 0\n  let animationId = 0\n\n  function init(): void {\n    documentVisibleHandler.add(ownerDocument, 'visibilitychange', () => {\n      if (ownerDocument.hidden) reset()\n    })\n  }\n\n  function destroy(): void {\n    stop()\n    documentVisibleHandler.clear()\n  }\n\n  function animate(timeStamp: DOMHighResTimeStamp): void {\n    if (!animationId) return\n    if (!lastTimeStamp) {\n      lastTimeStamp = timeStamp\n      update()\n      update()\n    }\n\n    const timeElapsed = timeStamp - lastTimeStamp\n    lastTimeStamp = timeStamp\n    accumulatedTime += timeElapsed\n\n    while (accumulatedTime >= fixedTimeStep) {\n      update()\n      accumulatedTime -= fixedTimeStep\n    }\n\n    const alpha = accumulatedTime / fixedTimeStep\n    render(alpha)\n\n    if (animationId) {\n      animationId = ownerWindow.requestAnimationFrame(animate)\n    }\n  }\n\n  function start(): void {\n    if (animationId) return\n    animationId = ownerWindow.requestAnimationFrame(animate)\n  }\n\n  function stop(): void {\n    ownerWindow.cancelAnimationFrame(animationId)\n    lastTimeStamp = null\n    accumulatedTime = 0\n    animationId = 0\n  }\n\n  function reset(): void {\n    lastTimeStamp = null\n    accumulatedTime = 0\n  }\n\n  const self: AnimationsType = {\n    init,\n    destroy,\n    start,\n    stop,\n    update,\n    render\n  }\n  return self\n}\n", "import { NodeRectType } from './NodeRects'\n\nexport type AxisOptionType = 'x' | 'y'\nexport type AxisDirectionOptionType = 'ltr' | 'rtl'\ntype AxisEdgeType = 'top' | 'right' | 'bottom' | 'left'\n\nexport type AxisType = {\n  scroll: AxisOptionType\n  cross: AxisOptionType\n  startEdge: AxisEdgeType\n  endEdge: AxisEdgeType\n  measureSize: (nodeRect: NodeRectType) => number\n  direction: (n: number) => number\n}\n\nexport function Axis(\n  axis: AxisOptionType,\n  contentDirection: AxisDirectionOptionType\n): AxisType {\n  const isRightToLeft = contentDirection === 'rtl'\n  const isVertical = axis === 'y'\n  const scroll = isVertical ? 'y' : 'x'\n  const cross = isVertical ? 'x' : 'y'\n  const sign = !isVertical && isRightToLeft ? -1 : 1\n  const startEdge = getStartEdge()\n  const endEdge = getEndEdge()\n\n  function measureSize(nodeRect: NodeRectType): number {\n    const { height, width } = nodeRect\n    return isVertical ? height : width\n  }\n\n  function getStartEdge(): AxisEdgeType {\n    if (isVertical) return 'top'\n    return isRightToLeft ? 'right' : 'left'\n  }\n\n  function getEndEdge(): AxisEdgeType {\n    if (isVertical) return 'bottom'\n    return isRightToLeft ? 'left' : 'right'\n  }\n\n  function direction(n: number): number {\n    return n * sign\n  }\n\n  const self: AxisType = {\n    scroll,\n    cross,\n    startEdge,\n    endEdge,\n    measureSize,\n    direction\n  }\n  return self\n}\n", "import { mathAbs } from './utils'\n\nexport type LimitType = {\n  min: number\n  max: number\n  length: number\n  constrain: (n: number) => number\n  reachedAny: (n: number) => boolean\n  reachedMax: (n: number) => boolean\n  reachedMin: (n: number) => boolean\n  removeOffset: (n: number) => number\n}\n\nexport function Limit(min: number = 0, max: number = 0): LimitType {\n  const length = mathAbs(min - max)\n\n  function reachedMin(n: number): boolean {\n    return n < min\n  }\n\n  function reachedMax(n: number): boolean {\n    return n > max\n  }\n\n  function reachedAny(n: number): boolean {\n    return reachedMin(n) || reachedMax(n)\n  }\n\n  function constrain(n: number): number {\n    if (!reachedAny(n)) return n\n    return reachedMin(n) ? min : max\n  }\n\n  function removeOffset(n: number): number {\n    if (!length) return n\n    return n - length * Math.ceil((n - max) / length)\n  }\n\n  const self: LimitType = {\n    length,\n    max,\n    min,\n    constrain,\n    reachedAny,\n    reachedMax,\n    reachedMin,\n    removeOffset\n  }\n  return self\n}\n", "import { Limit } from './Limit'\nimport { mathAbs } from './utils'\n\nexport type CounterType = {\n  get: () => number\n  set: (n: number) => CounterType\n  add: (n: number) => CounterType\n  clone: () => CounterType\n}\n\nexport function Counter(\n  max: number,\n  start: number,\n  loop: boolean\n): CounterType {\n  const { constrain } = Limit(0, max)\n  const loopEnd = max + 1\n  let counter = withinLimit(start)\n\n  function withinLimit(n: number): number {\n    return !loop ? constrain(n) : mathAbs((loopEnd + n) % loopEnd)\n  }\n\n  function get(): number {\n    return counter\n  }\n\n  function set(n: number): CounterType {\n    counter = withinLimit(n)\n    return self\n  }\n\n  function add(n: number): CounterType {\n    return clone().set(get() + n)\n  }\n\n  function clone(): CounterType {\n    return Counter(max, get(), loop)\n  }\n\n  const self: CounterType = {\n    get,\n    set,\n    add,\n    clone\n  }\n  return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { AnimationsType } from './Animations'\nimport { CounterType } from './Counter'\nimport { DragTrackerType, PointerEventType } from './DragTracker'\nimport { EventHandlerType } from './EventHandler'\nimport { AxisType } from './Axis'\nimport { EventStore } from './EventStore'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollTargetType } from './ScrollTarget'\nimport { ScrollToType } from './ScrollTo'\nimport { Vector1DType } from './Vector1d'\nimport { PercentOfViewType } from './PercentOfView'\nimport { Limit } from './Limit'\nimport {\n  deltaAbs,\n  factorAbs,\n  isBoolean,\n  isMouseEvent,\n  mathAbs,\n  mathSign,\n  WindowType\n} from './utils'\n\ntype DragHandlerCallbackType = (\n  emblaApi: EmblaCarouselType,\n  evt: PointerEventType\n) => boolean | void\n\nexport type DragHandlerOptionType = boolean | DragHandlerCallbackType\n\nexport type DragHandlerType = {\n  init: (emblaApi: EmblaCarouselType) => void\n  destroy: () => void\n  pointerDown: () => boolean\n}\n\nexport function DragHandler(\n  axis: AxisType,\n  rootNode: HTMLElement,\n  ownerDocument: Document,\n  ownerWindow: WindowType,\n  target: Vector1DType,\n  dragTracker: DragTrackerType,\n  location: Vector1DType,\n  animation: AnimationsType,\n  scrollTo: ScrollToType,\n  scrollBody: ScrollBodyType,\n  scrollTarget: ScrollTargetType,\n  index: CounterType,\n  eventHandler: EventHandlerType,\n  percentOfView: PercentOfViewType,\n  dragFree: boolean,\n  dragThreshold: number,\n  skipSnaps: boolean,\n  baseFriction: number,\n  watchDrag: DragHandlerOptionType\n): DragHandlerType {\n  const { cross: crossAxis, direction } = axis\n  const focusNodes = ['INPUT', 'SELECT', 'TEXTAREA']\n  const nonPassiveEvent = { passive: false }\n  const initEvents = EventStore()\n  const dragEvents = EventStore()\n  const goToNextThreshold = Limit(50, 225).constrain(percentOfView.measure(20))\n  const snapForceBoost = { mouse: 300, touch: 400 }\n  const freeForceBoost = { mouse: 500, touch: 600 }\n  const baseSpeed = dragFree ? 43 : 25\n\n  let isMoving = false\n  let startScroll = 0\n  let startCross = 0\n  let pointerIsDown = false\n  let preventScroll = false\n  let preventClick = false\n  let isMouse = false\n\n  function init(emblaApi: EmblaCarouselType): void {\n    if (!watchDrag) return\n\n    function downIfAllowed(evt: PointerEventType): void {\n      if (isBoolean(watchDrag) || watchDrag(emblaApi, evt)) down(evt)\n    }\n\n    const node = rootNode\n    initEvents\n      .add(node, 'dragstart', (evt) => evt.preventDefault(), nonPassiveEvent)\n      .add(node, 'touchmove', () => undefined, nonPassiveEvent)\n      .add(node, 'touchend', () => undefined)\n      .add(node, 'touchstart', downIfAllowed)\n      .add(node, 'mousedown', downIfAllowed)\n      .add(node, 'touchcancel', up)\n      .add(node, 'contextmenu', up)\n      .add(node, 'click', click, true)\n  }\n\n  function destroy(): void {\n    initEvents.clear()\n    dragEvents.clear()\n  }\n\n  function addDragEvents(): void {\n    const node = isMouse ? ownerDocument : rootNode\n    dragEvents\n      .add(node, 'touchmove', move, nonPassiveEvent)\n      .add(node, 'touchend', up)\n      .add(node, 'mousemove', move, nonPassiveEvent)\n      .add(node, 'mouseup', up)\n  }\n\n  function isFocusNode(node: Element): boolean {\n    const nodeName = node.nodeName || ''\n    return focusNodes.includes(nodeName)\n  }\n\n  function forceBoost(): number {\n    const boost = dragFree ? freeForceBoost : snapForceBoost\n    const type = isMouse ? 'mouse' : 'touch'\n    return boost[type]\n  }\n\n  function allowedForce(force: number, targetChanged: boolean): number {\n    const next = index.add(mathSign(force) * -1)\n    const baseForce = scrollTarget.byDistance(force, !dragFree).distance\n\n    if (dragFree || mathAbs(force) < goToNextThreshold) return baseForce\n    if (skipSnaps && targetChanged) return baseForce * 0.5\n\n    return scrollTarget.byIndex(next.get(), 0).distance\n  }\n\n  function down(evt: PointerEventType): void {\n    const isMouseEvt = isMouseEvent(evt, ownerWindow)\n    isMouse = isMouseEvt\n    preventClick = dragFree && isMouseEvt && !evt.buttons && isMoving\n    isMoving = deltaAbs(target.get(), location.get()) >= 2\n\n    if (isMouseEvt && evt.button !== 0) return\n    if (isFocusNode(evt.target as Element)) return\n\n    pointerIsDown = true\n    dragTracker.pointerDown(evt)\n    scrollBody.useFriction(0).useDuration(0)\n    target.set(location)\n    addDragEvents()\n    startScroll = dragTracker.readPoint(evt)\n    startCross = dragTracker.readPoint(evt, crossAxis)\n    eventHandler.emit('pointerDown')\n  }\n\n  function move(evt: PointerEventType): void {\n    const isTouchEvt = !isMouseEvent(evt, ownerWindow)\n    if (isTouchEvt && evt.touches.length >= 2) return up(evt)\n\n    const lastScroll = dragTracker.readPoint(evt)\n    const lastCross = dragTracker.readPoint(evt, crossAxis)\n    const diffScroll = deltaAbs(lastScroll, startScroll)\n    const diffCross = deltaAbs(lastCross, startCross)\n\n    if (!preventScroll && !isMouse) {\n      if (!evt.cancelable) return up(evt)\n      preventScroll = diffScroll > diffCross\n      if (!preventScroll) return up(evt)\n    }\n    const diff = dragTracker.pointerMove(evt)\n    if (diffScroll > dragThreshold) preventClick = true\n\n    scrollBody.useFriction(0.3).useDuration(0.75)\n    animation.start()\n    target.add(direction(diff))\n    evt.preventDefault()\n  }\n\n  function up(evt: PointerEventType): void {\n    const currentLocation = scrollTarget.byDistance(0, false)\n    const targetChanged = currentLocation.index !== index.get()\n    const rawForce = dragTracker.pointerUp(evt) * forceBoost()\n    const force = allowedForce(direction(rawForce), targetChanged)\n    const forceFactor = factorAbs(rawForce, force)\n    const speed = baseSpeed - 10 * forceFactor\n    const friction = baseFriction + forceFactor / 50\n\n    preventScroll = false\n    pointerIsDown = false\n    dragEvents.clear()\n    scrollBody.useDuration(speed).useFriction(friction)\n    scrollTo.distance(force, !dragFree)\n    isMouse = false\n    eventHandler.emit('pointerUp')\n  }\n\n  function click(evt: MouseEvent): void {\n    if (preventClick) {\n      evt.stopPropagation()\n      evt.preventDefault()\n      preventClick = false\n    }\n  }\n\n  function pointerDown(): boolean {\n    return pointerIsDown\n  }\n\n  const self: DragHandlerType = {\n    init,\n    destroy,\n    pointerDown\n  }\n  return self\n}\n", "import { AxisOptionType, AxisType } from './Axis'\nimport { isMouseEvent, mathAbs, WindowType } from './utils'\n\ntype PointerCoordType = keyof Touch | keyof MouseEvent\nexport type PointerEventType = TouchEvent | MouseEvent\n\nexport type DragTrackerType = {\n  pointerDown: (evt: PointerEventType) => number\n  pointerMove: (evt: PointerEventType) => number\n  pointerUp: (evt: PointerEventType) => number\n  readPoint: (evt: PointerEventType, evtAxis?: AxisOptionType) => number\n}\n\nexport function DragTracker(\n  axis: AxisType,\n  ownerWindow: WindowType\n): DragTrackerType {\n  const logInterval = 170\n\n  let startEvent: PointerEventType\n  let lastEvent: PointerEventType\n\n  function readTime(evt: PointerEventType): number {\n    return evt.timeStamp\n  }\n\n  function readPoint(evt: PointerEventType, evtAxis?: AxisOptionType): number {\n    const property = evtAxis || axis.scroll\n    const coord: PointerCoordType = `client${property === 'x' ? 'X' : 'Y'}`\n    return (isMouseEvent(evt, ownerWindow) ? evt : evt.touches[0])[coord]\n  }\n\n  function pointerDown(evt: PointerEventType): number {\n    startEvent = evt\n    lastEvent = evt\n    return readPoint(evt)\n  }\n\n  function pointerMove(evt: PointerEventType): number {\n    const diff = readPoint(evt) - readPoint(lastEvent)\n    const expired = readTime(evt) - readTime(startEvent) > logInterval\n\n    lastEvent = evt\n    if (expired) startEvent = evt\n    return diff\n  }\n\n  function pointerUp(evt: PointerEventType): number {\n    if (!startEvent || !lastEvent) return 0\n    const diffDrag = readPoint(lastEvent) - readPoint(startEvent)\n    const diffTime = readTime(evt) - readTime(startEvent)\n    const expired = readTime(evt) - readTime(lastEvent) > logInterval\n    const force = diffDrag / diffTime\n    const isFlick = diffTime && !expired && mathAbs(force) > 0.1\n\n    return isFlick ? force : 0\n  }\n\n  const self: DragTrackerType = {\n    pointerDown,\n    pointerMove,\n    pointerUp,\n    readPoint\n  }\n  return self\n}\n", "export type NodeRectType = {\n  top: number\n  right: number\n  bottom: number\n  left: number\n  width: number\n  height: number\n}\n\nexport type NodeRectsType = {\n  measure: (node: HTMLElement) => NodeRectType\n}\n\nexport function NodeRects(): NodeRectsType {\n  function measure(node: HTMLElement): NodeRectType {\n    const { offsetTop, offsetLeft, offsetWidth, offsetHeight } = node\n    const offset: NodeRectType = {\n      top: offsetTop,\n      right: offsetLeft + offsetWidth,\n      bottom: offsetTop + offsetHeight,\n      left: offsetLeft,\n      width: offsetWidth,\n      height: offsetHeight\n    }\n\n    return offset\n  }\n\n  const self: NodeRectsType = {\n    measure\n  }\n  return self\n}\n", "export type PercentOfViewType = {\n  measure: (n: number) => number\n}\n\nexport function PercentOfView(viewSize: number): PercentOfViewType {\n  function measure(n: number): number {\n    return viewSize * (n / 100)\n  }\n\n  const self: PercentOfViewType = {\n    measure\n  }\n  return self\n}\n", "import { AxisType } from './Axis'\nimport { EmblaCarouselType } from './EmblaCarousel'\nimport { EventHandlerType } from './EventHandler'\nimport { NodeRectsType } from './NodeRects'\nimport { isBoolean, mathAbs, WindowType } from './utils'\n\ntype ResizeHandlerCallbackType = (\n  emblaApi: EmblaCarouselType,\n  entries: ResizeObserverEntry[]\n) => boolean | void\n\nexport type ResizeHandlerOptionType = boolean | ResizeHandlerCallbackType\n\nexport type ResizeHandlerType = {\n  init: (emblaApi: EmblaCarouselType) => void\n  destroy: () => void\n}\n\nexport function ResizeHandler(\n  container: HTMLElement,\n  eventHandler: EventHandlerType,\n  ownerWindow: WindowType,\n  slides: HTMLElement[],\n  axis: AxisType,\n  watchResize: ResizeHandlerOptionType,\n  nodeRects: NodeRectsType\n): ResizeHandlerType {\n  const observeNodes = [container].concat(slides)\n  let resizeObserver: ResizeObserver\n  let containerSize: number\n  let slideSizes: number[] = []\n  let destroyed = false\n\n  function readSize(node: HTMLElement): number {\n    return axis.measureSize(nodeRects.measure(node))\n  }\n\n  function init(emblaApi: EmblaCarouselType): void {\n    if (!watchResize) return\n\n    containerSize = readSize(container)\n    slideSizes = slides.map(readSize)\n\n    function defaultCallback(entries: ResizeObserverEntry[]): void {\n      for (const entry of entries) {\n        if (destroyed) return\n\n        const isContainer = entry.target === container\n        const slideIndex = slides.indexOf(<HTMLElement>entry.target)\n        const lastSize = isContainer ? containerSize : slideSizes[slideIndex]\n        const newSize = readSize(isContainer ? container : slides[slideIndex])\n        const diffSize = mathAbs(newSize - lastSize)\n\n        if (diffSize >= 0.5) {\n          emblaApi.reInit()\n          eventHandler.emit('resize')\n\n          break\n        }\n      }\n    }\n\n    resizeObserver = new ResizeObserver((entries) => {\n      if (isBoolean(watchResize) || watchResize(emblaApi, entries)) {\n        defaultCallback(entries)\n      }\n    })\n\n    ownerWindow.requestAnimationFrame(() => {\n      observeNodes.forEach((node) => resizeObserver.observe(node))\n    })\n  }\n\n  function destroy(): void {\n    destroyed = true\n    if (resizeObserver) resizeObserver.disconnect()\n  }\n\n  const self: ResizeHandlerType = {\n    init,\n    destroy\n  }\n  return self\n}\n", "import { mathSign, mathAbs } from './utils'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollBodyType = {\n  direction: () => number\n  duration: () => number\n  velocity: () => number\n  seek: () => ScrollBodyType\n  settled: () => boolean\n  useBaseFriction: () => ScrollBodyType\n  useBaseDuration: () => ScrollBodyType\n  useFriction: (n: number) => ScrollBodyType\n  useDuration: (n: number) => ScrollBodyType\n}\n\nexport function ScrollBody(\n  location: Vector1DType,\n  offsetLocation: Vector1DType,\n  previousLocation: Vector1DType,\n  target: Vector1DType,\n  baseDuration: number,\n  baseFriction: number\n): ScrollBodyType {\n  let scrollVelocity = 0\n  let scrollDirection = 0\n  let scrollDuration = baseDuration\n  let scrollFriction = baseFriction\n  let rawLocation = location.get()\n  let rawLocationPrevious = 0\n\n  function seek(): ScrollBodyType {\n    const displacement = target.get() - location.get()\n    const isInstant = !scrollDuration\n    let scrollDistance = 0\n\n    if (isInstant) {\n      scrollVelocity = 0\n      previousLocation.set(target)\n      location.set(target)\n\n      scrollDistance = displacement\n    } else {\n      previousLocation.set(location)\n\n      scrollVelocity += displacement / scrollDuration\n      scrollVelocity *= scrollFriction\n      rawLocation += scrollVelocity\n      location.add(scrollVelocity)\n\n      scrollDistance = rawLocation - rawLocationPrevious\n    }\n\n    scrollDirection = mathSign(scrollDistance)\n    rawLocationPrevious = rawLocation\n    return self\n  }\n\n  function settled(): boolean {\n    const diff = target.get() - offsetLocation.get()\n    return mathAbs(diff) < 0.001\n  }\n\n  function duration(): number {\n    return scrollDuration\n  }\n\n  function direction(): number {\n    return scrollDirection\n  }\n\n  function velocity(): number {\n    return scrollVelocity\n  }\n\n  function useBaseDuration(): ScrollBodyType {\n    return useDuration(baseDuration)\n  }\n\n  function useBaseFriction(): ScrollBodyType {\n    return useFriction(baseFriction)\n  }\n\n  function useDuration(n: number): ScrollBodyType {\n    scrollDuration = n\n    return self\n  }\n\n  function useFriction(n: number): ScrollBodyType {\n    scrollFriction = n\n    return self\n  }\n\n  const self: ScrollBodyType = {\n    direction,\n    duration,\n    velocity,\n    seek,\n    settled,\n    useBaseFriction,\n    useBaseDuration,\n    useFriction,\n    useDuration\n  }\n  return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { ScrollBodyType } from './ScrollBody'\nimport { Vector1DType } from './Vector1d'\nimport { mathAbs } from './utils'\nimport { PercentOfViewType } from './PercentOfView'\n\nexport type ScrollBoundsType = {\n  shouldConstrain: () => boolean\n  constrain: (pointerDown: boolean) => void\n  toggleActive: (active: boolean) => void\n}\n\nexport function ScrollBounds(\n  limit: LimitType,\n  location: Vector1DType,\n  target: Vector1DType,\n  scrollBody: ScrollBodyType,\n  percentOfView: PercentOfViewType\n): ScrollBoundsType {\n  const pullBackThreshold = percentOfView.measure(10)\n  const edgeOffsetTolerance = percentOfView.measure(50)\n  const frictionLimit = Limit(0.1, 0.99)\n  let disabled = false\n\n  function shouldConstrain(): boolean {\n    if (disabled) return false\n    if (!limit.reachedAny(target.get())) return false\n    if (!limit.reachedAny(location.get())) return false\n    return true\n  }\n\n  function constrain(pointerDown: boolean): void {\n    if (!shouldConstrain()) return\n    const edge = limit.reachedMin(location.get()) ? 'min' : 'max'\n    const diffToEdge = mathAbs(limit[edge] - location.get())\n    const diffToTarget = target.get() - location.get()\n    const friction = frictionLimit.constrain(diffToEdge / edgeOffsetTolerance)\n\n    target.subtract(diffToTarget * friction)\n\n    if (!pointerDown && mathAbs(diffToTarget) < pullBackThreshold) {\n      target.set(limit.constrain(target.get()))\n      scrollBody.useDuration(25).useBaseFriction()\n    }\n  }\n\n  function toggleActive(active: boolean): void {\n    disabled = !active\n  }\n\n  const self: ScrollBoundsType = {\n    shouldConstrain,\n    constrain,\n    toggleActive\n  }\n  return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { arrayIsLastIndex, arrayLast, deltaAbs } from './utils'\n\nexport type ScrollContainOptionType = false | 'trimSnaps' | 'keepSnaps'\n\nexport type ScrollContainType = {\n  snapsContained: number[]\n  scrollContainLimit: LimitType\n}\n\nexport function ScrollContain(\n  viewSize: number,\n  contentSize: number,\n  snapsAligned: number[],\n  containScroll: ScrollContainOptionType,\n  pixelTolerance: number\n): ScrollContainType {\n  const scrollBounds = Limit(-contentSize + viewSize, 0)\n  const snapsBounded = measureBounded()\n  const scrollContainLimit = findScrollContainLimit()\n  const snapsContained = measureContained()\n\n  function usePixelTolerance(bound: number, snap: number): boolean {\n    return deltaAbs(bound, snap) <= 1\n  }\n\n  function findScrollContainLimit(): LimitType {\n    const startSnap = snapsBounded[0]\n    const endSnap = arrayLast(snapsBounded)\n    const min = snapsBounded.lastIndexOf(startSnap)\n    const max = snapsBounded.indexOf(endSnap) + 1\n    return Limit(min, max)\n  }\n\n  function measureBounded(): number[] {\n    return snapsAligned\n      .map((snapAligned, index) => {\n        const { min, max } = scrollBounds\n        const snap = scrollBounds.constrain(snapAligned)\n        const isFirst = !index\n        const isLast = arrayIsLastIndex(snapsAligned, index)\n        if (isFirst) return max\n        if (isLast) return min\n        if (usePixelTolerance(min, snap)) return min\n        if (usePixelTolerance(max, snap)) return max\n        return snap\n      })\n      .map((scrollBound) => parseFloat(scrollBound.toFixed(3)))\n  }\n\n  function measureContained(): number[] {\n    if (contentSize <= viewSize + pixelTolerance) return [scrollBounds.max]\n    if (containScroll === 'keepSnaps') return snapsBounded\n    const { min, max } = scrollContainLimit\n    return snapsBounded.slice(min, max)\n  }\n\n  const self: ScrollContainType = {\n    snapsContained,\n    scrollContainLimit\n  }\n  return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { arrayLast } from './utils'\n\nexport type ScrollLimitType = {\n  limit: LimitType\n}\n\nexport function ScrollLimit(\n  contentSize: number,\n  scrollSnaps: number[],\n  loop: boolean\n): ScrollLimitType {\n  const max = scrollSnaps[0]\n  const min = loop ? max - contentSize : arrayLast(scrollSnaps)\n  const limit = Limit(min, max)\n\n  const self: ScrollLimitType = {\n    limit\n  }\n  return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollLooperType = {\n  loop: (direction: number) => void\n}\n\nexport function ScrollLooper(\n  contentSize: number,\n  limit: LimitType,\n  location: Vector1DType,\n  vectors: Vector1DType[]\n): ScrollLooperType {\n  const jointSafety = 0.1\n  const min = limit.min + jointSafety\n  const max = limit.max + jointSafety\n  const { reachedMin, reachedMax } = Limit(min, max)\n\n  function shouldLoop(direction: number): boolean {\n    if (direction === 1) return reachedMax(location.get())\n    if (direction === -1) return reachedMin(location.get())\n    return false\n  }\n\n  function loop(direction: number): void {\n    if (!shouldLoop(direction)) return\n\n    const loopDistance = contentSize * (direction * -1)\n    vectors.forEach((v) => v.add(loopDistance))\n  }\n\n  const self: ScrollLooperType = {\n    loop\n  }\n  return self\n}\n", "import { LimitType } from './Limit'\n\nexport type ScrollProgressType = {\n  get: (n: number) => number\n}\n\nexport function ScrollProgress(limit: LimitType): ScrollProgressType {\n  const { max, length } = limit\n\n  function get(n: number): number {\n    const currentLocation = n - max\n    return length ? currentLocation / -length : 0\n  }\n\n  const self: ScrollProgressType = {\n    get\n  }\n  return self\n}\n", "import { AlignmentType } from './Alignment'\nimport { AxisType } from './Axis'\nimport { NodeRectType } from './NodeRects'\nimport { SlidesToScrollType } from './SlidesToScroll'\nimport { arrayLast, mathAbs } from './utils'\n\nexport type ScrollSnapsType = {\n  snaps: number[]\n  snapsAligned: number[]\n}\n\nexport function ScrollSnaps(\n  axis: AxisType,\n  alignment: AlignmentType,\n  containerRect: NodeRectType,\n  slideRects: NodeRectType[],\n  slidesToScroll: SlidesToScrollType\n): ScrollSnapsType {\n  const { startEdge, endEdge } = axis\n  const { groupSlides } = slidesToScroll\n  const alignments = measureSizes().map(alignment.measure)\n  const snaps = measureUnaligned()\n  const snapsAligned = measureAligned()\n\n  function measureSizes(): number[] {\n    return groupSlides(slideRects)\n      .map((rects) => arrayLast(rects)[endEdge] - rects[0][startEdge])\n      .map(mathAbs)\n  }\n\n  function measureUnaligned(): number[] {\n    return slideRects\n      .map((rect) => containerRect[startEdge] - rect[startEdge])\n      .map((snap) => -mathAbs(snap))\n  }\n\n  function measureAligned(): number[] {\n    return groupSlides(snaps)\n      .map((g) => g[0])\n      .map((snap, index) => snap + alignments[index])\n  }\n\n  const self: ScrollSnapsType = {\n    snaps,\n    snapsAligned\n  }\n  return self\n}\n", "import { LimitType } from './Limit'\nimport { ScrollContainOptionType } from './ScrollContain'\nimport { SlidesToScrollType } from './SlidesToScroll'\nimport {\n  arrayFromNumber,\n  arrayIsLastIndex,\n  arrayLast,\n  arrayLastIndex\n} from './utils'\n\nexport type SlideRegistryType = {\n  slideRegistry: number[][]\n}\n\nexport function SlideRegistry(\n  containSnaps: boolean,\n  containScroll: ScrollContainOptionType,\n  scrollSnaps: number[],\n  scrollContainLimit: LimitType,\n  slidesToScroll: SlidesToScrollType,\n  slideIndexes: number[]\n): SlideRegistryType {\n  const { groupSlides } = slidesToScroll\n  const { min, max } = scrollContainLimit\n  const slideRegistry = createSlideRegistry()\n\n  function createSlideRegistry(): number[][] {\n    const groupedSlideIndexes = groupSlides(slideIndexes)\n    const doNotContain = !containSnaps || containScroll === 'keepSnaps'\n\n    if (scrollSnaps.length === 1) return [slideIndexes]\n    if (doNotContain) return groupedSlideIndexes\n\n    return groupedSlideIndexes.slice(min, max).map((group, index, groups) => {\n      const isFirst = !index\n      const isLast = arrayIsLastIndex(groups, index)\n\n      if (isFirst) {\n        const range = arrayLast(groups[0]) + 1\n        return arrayFromNumber(range)\n      }\n      if (isLast) {\n        const range = arrayLastIndex(slideIndexes) - arrayLast(groups)[0] + 1\n        return arrayFromNumber(range, arrayLast(groups)[0])\n      }\n      return group\n    })\n  }\n\n  const self: SlideRegistryType = {\n    slideRegistry\n  }\n  return self\n}\n", "import { LimitType } from './Limit'\nimport { Vector1DType } from './Vector1d'\nimport { arrayLast, mathAbs, mathSign } from './utils'\n\nexport type TargetType = {\n  distance: number\n  index: number\n}\n\nexport type ScrollTargetType = {\n  byIndex: (target: number, direction: number) => TargetType\n  byDistance: (force: number, snap: boolean) => TargetType\n  shortcut: (target: number, direction: number) => number\n}\n\nexport function ScrollTarget(\n  loop: boolean,\n  scrollSnaps: number[],\n  contentSize: number,\n  limit: LimitType,\n  targetVector: Vector1DType\n): ScrollTargetType {\n  const { reachedAny, removeOffset, constrain } = limit\n\n  function minDistance(distances: number[]): number {\n    return distances.concat().sort((a, b) => mathAbs(a) - mathAbs(b))[0]\n  }\n\n  function findTargetSnap(target: number): TargetType {\n    const distance = loop ? removeOffset(target) : constrain(target)\n    const ascDiffsToSnaps = scrollSnaps\n      .map((snap, index) => ({ diff: shortcut(snap - distance, 0), index }))\n      .sort((d1, d2) => mathAbs(d1.diff) - mathAbs(d2.diff))\n\n    const { index } = ascDiffsToSnaps[0]\n    return { index, distance }\n  }\n\n  function shortcut(target: number, direction: number): number {\n    const targets = [target, target + contentSize, target - contentSize]\n\n    if (!loop) return target\n    if (!direction) return minDistance(targets)\n\n    const matchingTargets = targets.filter((t) => mathSign(t) === direction)\n    if (matchingTargets.length) return minDistance(matchingTargets)\n    return arrayLast(targets) - contentSize\n  }\n\n  function byIndex(index: number, direction: number): TargetType {\n    const diffToSnap = scrollSnaps[index] - targetVector.get()\n    const distance = shortcut(diffToSnap, direction)\n    return { index, distance }\n  }\n\n  function byDistance(distance: number, snap: boolean): TargetType {\n    const target = targetVector.get() + distance\n    const { index, distance: targetSnapDistance } = findTargetSnap(target)\n    const reachedBound = !loop && reachedAny(target)\n\n    if (!snap || reachedBound) return { index, distance }\n\n    const diffToSnap = scrollSnaps[index] - targetSnapDistance\n    const snapDistance = distance + shortcut(diffToSnap, 0)\n\n    return { index, distance: snapDistance }\n  }\n\n  const self: ScrollTargetType = {\n    byDistance,\n    byIndex,\n    shortcut\n  }\n  return self\n}\n", "import { AnimationsType } from './Animations'\nimport { CounterType } from './Counter'\nimport { EventHandlerType } from './EventHandler'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollTargetType, TargetType } from './ScrollTarget'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollToType = {\n  distance: (n: number, snap: boolean) => void\n  index: (n: number, direction: number) => void\n}\n\nexport function ScrollTo(\n  animation: AnimationsType,\n  indexCurrent: CounterType,\n  indexPrevious: CounterType,\n  scrollBody: ScrollBodyType,\n  scrollTarget: ScrollTargetType,\n  targetVector: Vector1DType,\n  eventHandler: EventHandlerType\n): ScrollToType {\n  function scrollTo(target: TargetType): void {\n    const distanceDiff = target.distance\n    const indexDiff = target.index !== indexCurrent.get()\n\n    targetVector.add(distanceDiff)\n\n    if (distanceDiff) {\n      if (scrollBody.duration()) {\n        animation.start()\n      } else {\n        animation.update()\n        animation.render(1)\n        animation.update()\n      }\n    }\n\n    if (indexDiff) {\n      indexPrevious.set(indexCurrent.get())\n      indexCurrent.set(target.index)\n      eventHandler.emit('select')\n    }\n  }\n\n  function distance(n: number, snap: boolean): void {\n    const target = scrollTarget.byDistance(n, snap)\n    scrollTo(target)\n  }\n\n  function index(n: number, direction: number): void {\n    const targetIndex = indexCurrent.clone().set(n)\n    const target = scrollTarget.byIndex(targetIndex.get(), direction)\n    scrollTo(target)\n  }\n\n  const self: ScrollToType = {\n    distance,\n    index\n  }\n  return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { EventHandlerType } from './EventHandler'\nimport { EventStoreType } from './EventStore'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollToType } from './ScrollTo'\nimport { SlideRegistryType } from './SlideRegistry'\nimport { isBoolean, isNumber } from './utils'\n\ntype FocusHandlerCallbackType = (\n  emblaApi: EmblaCarouselType,\n  evt: FocusEvent\n) => boolean | void\n\nexport type FocusHandlerOptionType = boolean | FocusHandlerCallbackType\n\nexport type SlideFocusType = {\n  init: (emblaApi: EmblaCarouselType) => void\n}\n\nexport function SlideFocus(\n  root: HTMLElement,\n  slides: HTMLElement[],\n  slideRegistry: SlideRegistryType['slideRegistry'],\n  scrollTo: ScrollToType,\n  scrollBody: ScrollBodyType,\n  eventStore: EventStoreType,\n  eventHandler: EventHandlerType,\n  watchFocus: FocusHandlerOptionType\n): SlideFocusType {\n  const focusListenerOptions = { passive: true, capture: true }\n  let lastTabPressTime = 0\n\n  function init(emblaApi: EmblaCarouselType): void {\n    if (!watchFocus) return\n\n    function defaultCallback(index: number): void {\n      const nowTime = new Date().getTime()\n      const diffTime = nowTime - lastTabPressTime\n\n      if (diffTime > 10) return\n\n      eventHandler.emit('slideFocusStart')\n      root.scrollLeft = 0\n\n      const group = slideRegistry.findIndex((group) => group.includes(index))\n\n      if (!isNumber(group)) return\n\n      scrollBody.useDuration(0)\n      scrollTo.index(group, 0)\n\n      eventHandler.emit('slideFocus')\n    }\n\n    eventStore.add(document, 'keydown', registerTabPress, false)\n\n    slides.forEach((slide, slideIndex) => {\n      eventStore.add(\n        slide,\n        'focus',\n        (evt: FocusEvent) => {\n          if (isBoolean(watchFocus) || watchFocus(emblaApi, evt)) {\n            defaultCallback(slideIndex)\n          }\n        },\n        focusListenerOptions\n      )\n    })\n  }\n\n  function registerTabPress(event: KeyboardEvent): void {\n    if (event.code === 'Tab') lastTabPressTime = new Date().getTime()\n  }\n\n  const self: SlideFocusType = {\n    init\n  }\n  return self\n}\n", "import { isNumber } from './utils'\n\nexport type Vector1DType = {\n  get: () => number\n  set: (n: Vector1DType | number) => void\n  add: (n: Vector1DType | number) => void\n  subtract: (n: Vector1DType | number) => void\n}\n\nexport function Vector1D(initialValue: number): Vector1DType {\n  let value = initialValue\n\n  function get(): number {\n    return value\n  }\n\n  function set(n: Vector1DType | number): void {\n    value = normalizeInput(n)\n  }\n\n  function add(n: Vector1DType | number): void {\n    value += normalizeInput(n)\n  }\n\n  function subtract(n: Vector1DType | number): void {\n    value -= normalizeInput(n)\n  }\n\n  function normalizeInput(n: Vector1DType | number): number {\n    return isNumber(n) ? n : n.get()\n  }\n\n  const self: Vector1DType = {\n    get,\n    set,\n    add,\n    subtract\n  }\n  return self\n}\n", "import { AxisType } from './Axis'\nimport { roundToTwoDecimals } from './utils'\n\nexport type TranslateType = {\n  clear: () => void\n  to: (target: number) => void\n  toggleActive: (active: boolean) => void\n}\n\nexport function Translate(\n  axis: AxisType,\n  container: HTMLElement\n): TranslateType {\n  const translate = axis.scroll === 'x' ? x : y\n  const containerStyle = container.style\n  let previousTarget: number | null = null\n  let disabled = false\n\n  function x(n: number): string {\n    return `translate3d(${n}px,0px,0px)`\n  }\n\n  function y(n: number): string {\n    return `translate3d(0px,${n}px,0px)`\n  }\n\n  function to(target: number): void {\n    if (disabled) return\n\n    const newTarget = roundToTwoDecimals(axis.direction(target))\n    if (newTarget === previousTarget) return\n\n    containerStyle.transform = translate(newTarget)\n    previousTarget = newTarget\n  }\n\n  function toggleActive(active: boolean): void {\n    disabled = !active\n  }\n\n  function clear(): void {\n    if (disabled) return\n    containerStyle.transform = ''\n    if (!container.getAttribute('style')) container.removeAttribute('style')\n  }\n\n  const self: TranslateType = {\n    clear,\n    to,\n    toggleActive\n  }\n  return self\n}\n", "import { AxisType } from './Axis'\nimport { arrayKeys } from './utils'\nimport { Vector1D, Vector1DType } from './Vector1d'\nimport { Translate, TranslateType } from './Translate'\n\ntype SlideBoundType = {\n  start: number\n  end: number\n}\n\ntype LoopPointType = {\n  loopPoint: number\n  index: number\n  translate: TranslateType\n  slideLocation: Vector1DType\n  target: () => number\n}\n\nexport type SlideLooperType = {\n  canLoop: () => boolean\n  clear: () => void\n  loop: () => void\n  loopPoints: LoopPointType[]\n}\n\nexport function SlideLooper(\n  axis: AxisType,\n  viewSize: number,\n  contentSize: number,\n  slideSizes: number[],\n  slideSizesWithGaps: number[],\n  snaps: number[],\n  scrollSnaps: number[],\n  location: Vector1DType,\n  slides: HTMLElement[]\n): SlideLooperType {\n  const roundingSafety = 0.5\n  const ascItems = arrayKeys(slideSizesWithGaps)\n  const descItems = arrayKeys(slideSizesWithGaps).reverse()\n  const loopPoints = startPoints().concat(endPoints())\n\n  function removeSlideSizes(indexes: number[], from: number): number {\n    return indexes.reduce((a: number, i) => {\n      return a - slideSizesWithGaps[i]\n    }, from)\n  }\n\n  function slidesInGap(indexes: number[], gap: number): number[] {\n    return indexes.reduce((a: number[], i) => {\n      const remainingGap = removeSlideSizes(a, gap)\n      return remainingGap > 0 ? a.concat([i]) : a\n    }, [])\n  }\n\n  function findSlideBounds(offset: number): SlideBoundType[] {\n    return snaps.map((snap, index) => ({\n      start: snap - slideSizes[index] + roundingSafety + offset,\n      end: snap + viewSize - roundingSafety + offset\n    }))\n  }\n\n  function findLoopPoints(\n    indexes: number[],\n    offset: number,\n    isEndEdge: boolean\n  ): LoopPointType[] {\n    const slideBounds = findSlideBounds(offset)\n\n    return indexes.map((index) => {\n      const initial = isEndEdge ? 0 : -contentSize\n      const altered = isEndEdge ? contentSize : 0\n      const boundEdge = isEndEdge ? 'end' : 'start'\n      const loopPoint = slideBounds[index][boundEdge]\n\n      return {\n        index,\n        loopPoint,\n        slideLocation: Vector1D(-1),\n        translate: Translate(axis, slides[index]),\n        target: () => (location.get() > loopPoint ? initial : altered)\n      }\n    })\n  }\n\n  function startPoints(): LoopPointType[] {\n    const gap = scrollSnaps[0]\n    const indexes = slidesInGap(descItems, gap)\n    return findLoopPoints(indexes, contentSize, false)\n  }\n\n  function endPoints(): LoopPointType[] {\n    const gap = viewSize - scrollSnaps[0] - 1\n    const indexes = slidesInGap(ascItems, gap)\n    return findLoopPoints(indexes, -contentSize, true)\n  }\n\n  function canLoop(): boolean {\n    return loopPoints.every(({ index }) => {\n      const otherIndexes = ascItems.filter((i) => i !== index)\n      return removeSlideSizes(otherIndexes, viewSize) <= 0.1\n    })\n  }\n\n  function loop(): void {\n    loopPoints.forEach((loopPoint) => {\n      const { target, translate, slideLocation } = loopPoint\n      const shiftLocation = target()\n      if (shiftLocation === slideLocation.get()) return\n      translate.to(shiftLocation)\n      slideLocation.set(shiftLocation)\n    })\n  }\n\n  function clear(): void {\n    loopPoints.forEach((loopPoint) => loopPoint.translate.clear())\n  }\n\n  const self: SlideLooperType = {\n    canLoop,\n    clear,\n    loop,\n    loopPoints\n  }\n  return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { EventHandlerType } from './EventHandler'\nimport { isBoolean } from './utils'\n\ntype SlidesHandlerCallbackType = (\n  emblaApi: EmblaCarouselType,\n  mutations: MutationRecord[]\n) => boolean | void\n\nexport type SlidesHandlerOptionType = boolean | SlidesHandlerCallbackType\n\nexport type SlidesHandlerType = {\n  init: (emblaApi: EmblaCarouselType) => void\n  destroy: () => void\n}\n\nexport function SlidesHandler(\n  container: HTMLElement,\n  eventHandler: EventHandlerType,\n  watchSlides: SlidesHandlerOptionType\n): SlidesHandlerType {\n  let mutationObserver: MutationObserver\n  let destroyed = false\n\n  function init(emblaApi: EmblaCarouselType): void {\n    if (!watchSlides) return\n\n    function defaultCallback(mutations: MutationRecord[]): void {\n      for (const mutation of mutations) {\n        if (mutation.type === 'childList') {\n          emblaApi.reInit()\n          eventHandler.emit('slidesChanged')\n          break\n        }\n      }\n    }\n\n    mutationObserver = new MutationObserver((mutations) => {\n      if (destroyed) return\n      if (isBoolean(watchSlides) || watchSlides(emblaApi, mutations)) {\n        defaultCallback(mutations)\n      }\n    })\n\n    mutationObserver.observe(container, { childList: true })\n  }\n\n  function destroy(): void {\n    if (mutationObserver) mutationObserver.disconnect()\n    destroyed = true\n  }\n\n  const self: SlidesHandlerType = {\n    init,\n    destroy\n  }\n  return self\n}\n", "import { EventHandlerType } from './EventHandler'\nimport { objectKeys } from './utils'\n\ntype IntersectionEntryMapType = {\n  [key: number]: IntersectionObserverEntry\n}\n\nexport type SlidesInViewOptionsType = IntersectionObserverInit['threshold']\n\nexport type SlidesInViewType = {\n  init: () => void\n  destroy: () => void\n  get: (inView?: boolean) => number[]\n}\n\nexport function SlidesInView(\n  container: HTMLElement,\n  slides: HTMLElement[],\n  eventHandler: EventHandlerType,\n  threshold: SlidesInViewOptionsType\n): SlidesInViewType {\n  const intersectionEntryMap: IntersectionEntryMapType = {}\n  let inViewCache: number[] | null = null\n  let notInViewCache: number[] | null = null\n  let intersectionObserver: IntersectionObserver\n  let destroyed = false\n\n  function init(): void {\n    intersectionObserver = new IntersectionObserver(\n      (entries) => {\n        if (destroyed) return\n\n        entries.forEach((entry) => {\n          const index = slides.indexOf(<HTMLElement>entry.target)\n          intersectionEntryMap[index] = entry\n        })\n\n        inViewCache = null\n        notInViewCache = null\n        eventHandler.emit('slidesInView')\n      },\n      {\n        root: container.parentElement,\n        threshold\n      }\n    )\n\n    slides.forEach((slide) => intersectionObserver.observe(slide))\n  }\n\n  function destroy(): void {\n    if (intersectionObserver) intersectionObserver.disconnect()\n    destroyed = true\n  }\n\n  function createInViewList(inView: boolean): number[] {\n    return objectKeys(intersectionEntryMap).reduce(\n      (list: number[], slideIndex) => {\n        const index = parseInt(slideIndex)\n        const { isIntersecting } = intersectionEntryMap[index]\n        const inViewMatch = inView && isIntersecting\n        const notInViewMatch = !inView && !isIntersecting\n\n        if (inViewMatch || notInViewMatch) list.push(index)\n        return list\n      },\n      []\n    )\n  }\n\n  function get(inView: boolean = true): number[] {\n    if (inView && inViewCache) return inViewCache\n    if (!inView && notInViewCache) return notInViewCache\n\n    const slideIndexes = createInViewList(inView)\n\n    if (inView) inViewCache = slideIndexes\n    if (!inView) notInViewCache = slideIndexes\n\n    return slideIndexes\n  }\n\n  const self: SlidesInViewType = {\n    init,\n    destroy,\n    get\n  }\n\n  return self\n}\n", "import { AxisType } from './Axis'\nimport { NodeRectType } from './NodeRects'\nimport { arrayIsLastIndex, arrayLast, mathAbs, WindowType } from './utils'\n\nexport type SlideSizesType = {\n  slideSizes: number[]\n  slideSizesWithGaps: number[]\n  startGap: number\n  endGap: number\n}\n\nexport function SlideSizes(\n  axis: AxisType,\n  containerRect: NodeRectType,\n  slideRects: NodeRectType[],\n  slides: HTMLElement[],\n  readEdgeGap: boolean,\n  ownerWindow: WindowType\n): SlideSizesType {\n  const { measureSize, startEdge, endEdge } = axis\n  const withEdgeGap = slideRects[0] && readEdgeGap\n  const startGap = measureStartGap()\n  const endGap = measureEndGap()\n  const slideSizes = slideRects.map(measureSize)\n  const slideSizesWithGaps = measureWithGaps()\n\n  function measureStartGap(): number {\n    if (!withEdgeGap) return 0\n    const slideRect = slideRects[0]\n    return mathAbs(containerRect[startEdge] - slideRect[startEdge])\n  }\n\n  function measureEndGap(): number {\n    if (!withEdgeGap) return 0\n    const style = ownerWindow.getComputedStyle(arrayLast(slides))\n    return parseFloat(style.getPropertyValue(`margin-${endEdge}`))\n  }\n\n  function measureWithGaps(): number[] {\n    return slideRects\n      .map((rect, index, rects) => {\n        const isFirst = !index\n        const isLast = arrayIsLastIndex(rects, index)\n        if (isFirst) return slideSizes[index] + startGap\n        if (isLast) return slideSizes[index] + endGap\n        return rects[index + 1][startEdge] - rect[startEdge]\n      })\n      .map(mathAbs)\n  }\n\n  const self: SlideSizesType = {\n    slideSizes,\n    slideSizesWithGaps,\n    startGap,\n    endGap\n  }\n  return self\n}\n", "import { AxisType } from './Axis'\nimport { NodeRectType } from './NodeRects'\nimport {\n  arrayKeys,\n  arrayLast,\n  arrayLastIndex,\n  isNumber,\n  mathAbs\n} from './utils'\n\nexport type SlidesToScrollOptionType = 'auto' | number\n\nexport type SlidesToScrollType = {\n  groupSlides: <Type>(array: Type[]) => Type[][]\n}\n\nexport function SlidesToScroll(\n  axis: AxisType,\n  viewSize: number,\n  slidesToScroll: SlidesToScrollOptionType,\n  loop: boolean,\n  containerRect: NodeRectType,\n  slideRects: NodeRectType[],\n  startGap: number,\n  endGap: number,\n  pixelTolerance: number\n): SlidesToScrollType {\n  const { startEdge, endEdge, direction } = axis\n  const groupByNumber = isNumber(slidesToScroll)\n\n  function byNumber<Type>(array: Type[], groupSize: number): Type[][] {\n    return arrayKeys(array)\n      .filter((i) => i % groupSize === 0)\n      .map((i) => array.slice(i, i + groupSize))\n  }\n\n  function bySize<Type>(array: Type[]): Type[][] {\n    if (!array.length) return []\n\n    return arrayKeys(array)\n      .reduce((groups: number[], rectB, index) => {\n        const rectA = arrayLast(groups) || 0\n        const isFirst = rectA === 0\n        const isLast = rectB === arrayLastIndex(array)\n\n        const edgeA = containerRect[startEdge] - slideRects[rectA][startEdge]\n        const edgeB = containerRect[startEdge] - slideRects[rectB][endEdge]\n        const gapA = !loop && isFirst ? direction(startGap) : 0\n        const gapB = !loop && isLast ? direction(endGap) : 0\n        const chunkSize = mathAbs(edgeB - gapB - (edgeA + gapA))\n\n        if (index && chunkSize > viewSize + pixelTolerance) groups.push(rectB)\n        if (isLast) groups.push(array.length)\n        return groups\n      }, [])\n      .map((currentSize, index, groups) => {\n        const previousSize = Math.max(groups[index - 1] || 0)\n        return array.slice(previousSize, currentSize)\n      })\n  }\n\n  function groupSlides<Type>(array: Type[]): Type[][] {\n    return groupByNumber ? byNumber(array, slidesToScroll) : bySize(array)\n  }\n\n  const self: SlidesToScrollType = {\n    groupSlides\n  }\n  return self\n}\n", "import { Alignment } from './Alignment'\nimport {\n  Animations,\n  AnimationsType,\n  AnimationsUpdateType,\n  AnimationsRenderType\n} from './Animations'\nimport { Axis, AxisType } from './Axis'\nimport { Counter, CounterType } from './Counter'\nimport { DragHandler, DragHandlerType } from './DragHandler'\nimport { DragTracker } from './DragTracker'\nimport { EventHandlerType } from './EventHandler'\nimport { EventStore, EventStoreType } from './EventStore'\nimport { LimitType } from './Limit'\nimport { NodeRectType, NodeRects } from './NodeRects'\nimport { OptionsType } from './Options'\nimport { PercentOfView, PercentOfViewType } from './PercentOfView'\nimport { ResizeHandler, ResizeHandlerType } from './ResizeHandler'\nimport { ScrollBody, ScrollBodyType } from './ScrollBody'\nimport { ScrollBounds, ScrollBoundsType } from './ScrollBounds'\nimport { ScrollContain } from './ScrollContain'\nimport { ScrollLimit } from './ScrollLimit'\nimport { ScrollLooper, ScrollLooperType } from './ScrollLooper'\nimport { ScrollProgress, ScrollProgressType } from './ScrollProgress'\nimport { ScrollSnaps } from './ScrollSnaps'\nimport { SlideRegistry, SlideRegistryType } from './SlideRegistry'\nimport { ScrollTarget, ScrollTargetType } from './ScrollTarget'\nimport { ScrollTo, ScrollToType } from './ScrollTo'\nimport { SlideFocus, SlideFocusType } from './SlideFocus'\nimport { SlideLooper, SlideLooperType } from './SlideLooper'\nimport { SlidesHandler, SlidesHandlerType } from './SlidesHandler'\nimport { SlidesInView, SlidesInViewType } from './SlidesInView'\nimport { SlideSizes } from './SlideSizes'\nimport { SlidesToScroll, SlidesToScrollType } from './SlidesToScroll'\nimport { Translate, TranslateType } from './Translate'\nimport { arrayKeys, arrayLast, arrayLastIndex, WindowType } from './utils'\nimport { Vector1D, Vector1DType } from './Vector1d'\n\nexport type EngineType = {\n  ownerDocument: Document\n  ownerWindow: WindowType\n  eventHandler: EventHandlerType\n  axis: AxisType\n  animation: AnimationsType\n  scrollBounds: ScrollBoundsType\n  scrollLooper: ScrollLooperType\n  scrollProgress: ScrollProgressType\n  index: CounterType\n  indexPrevious: CounterType\n  limit: LimitType\n  location: Vector1DType\n  offsetLocation: Vector1DType\n  previousLocation: Vector1DType\n  options: OptionsType\n  percentOfView: PercentOfViewType\n  scrollBody: ScrollBodyType\n  dragHandler: DragHandlerType\n  eventStore: EventStoreType\n  slideLooper: SlideLooperType\n  slidesInView: SlidesInViewType\n  slidesToScroll: SlidesToScrollType\n  target: Vector1DType\n  translate: TranslateType\n  resizeHandler: ResizeHandlerType\n  slidesHandler: SlidesHandlerType\n  scrollTo: ScrollToType\n  scrollTarget: ScrollTargetType\n  scrollSnapList: number[]\n  scrollSnaps: number[]\n  slideIndexes: number[]\n  slideFocus: SlideFocusType\n  slideRegistry: SlideRegistryType['slideRegistry']\n  containerRect: NodeRectType\n  slideRects: NodeRectType[]\n}\n\nexport function Engine(\n  root: HTMLElement,\n  container: HTMLElement,\n  slides: HTMLElement[],\n  ownerDocument: Document,\n  ownerWindow: WindowType,\n  options: OptionsType,\n  eventHandler: EventHandlerType\n): EngineType {\n  // Options\n  const {\n    align,\n    axis: scrollAxis,\n    direction,\n    startIndex,\n    loop,\n    duration,\n    dragFree,\n    dragThreshold,\n    inViewThreshold,\n    slidesToScroll: groupSlides,\n    skipSnaps,\n    containScroll,\n    watchResize,\n    watchSlides,\n    watchDrag,\n    watchFocus\n  } = options\n\n  // Measurements\n  const pixelTolerance = 2\n  const nodeRects = NodeRects()\n  const containerRect = nodeRects.measure(container)\n  const slideRects = slides.map(nodeRects.measure)\n  const axis = Axis(scrollAxis, direction)\n  const viewSize = axis.measureSize(containerRect)\n  const percentOfView = PercentOfView(viewSize)\n  const alignment = Alignment(align, viewSize)\n  const containSnaps = !loop && !!containScroll\n  const readEdgeGap = loop || !!containScroll\n  const { slideSizes, slideSizesWithGaps, startGap, endGap } = SlideSizes(\n    axis,\n    containerRect,\n    slideRects,\n    slides,\n    readEdgeGap,\n    ownerWindow\n  )\n  const slidesToScroll = SlidesToScroll(\n    axis,\n    viewSize,\n    groupSlides,\n    loop,\n    containerRect,\n    slideRects,\n    startGap,\n    endGap,\n    pixelTolerance\n  )\n  const { snaps, snapsAligned } = ScrollSnaps(\n    axis,\n    alignment,\n    containerRect,\n    slideRects,\n    slidesToScroll\n  )\n  const contentSize = -arrayLast(snaps) + arrayLast(slideSizesWithGaps)\n  const { snapsContained, scrollContainLimit } = ScrollContain(\n    viewSize,\n    contentSize,\n    snapsAligned,\n    containScroll,\n    pixelTolerance\n  )\n  const scrollSnaps = containSnaps ? snapsContained : snapsAligned\n  const { limit } = ScrollLimit(contentSize, scrollSnaps, loop)\n\n  // Indexes\n  const index = Counter(arrayLastIndex(scrollSnaps), startIndex, loop)\n  const indexPrevious = index.clone()\n  const slideIndexes = arrayKeys(slides)\n\n  // Animation\n  const update: AnimationsUpdateType = ({\n    dragHandler,\n    scrollBody,\n    scrollBounds,\n    options: { loop }\n  }) => {\n    if (!loop) scrollBounds.constrain(dragHandler.pointerDown())\n    scrollBody.seek()\n  }\n\n  const render: AnimationsRenderType = (\n    {\n      scrollBody,\n      translate,\n      location,\n      offsetLocation,\n      previousLocation,\n      scrollLooper,\n      slideLooper,\n      dragHandler,\n      animation,\n      eventHandler,\n      scrollBounds,\n      options: { loop }\n    },\n    alpha\n  ) => {\n    const shouldSettle = scrollBody.settled()\n    const withinBounds = !scrollBounds.shouldConstrain()\n    const hasSettled = loop ? shouldSettle : shouldSettle && withinBounds\n    const hasSettledAndIdle = hasSettled && !dragHandler.pointerDown()\n\n    if (hasSettledAndIdle) animation.stop()\n\n    const interpolatedLocation =\n      location.get() * alpha + previousLocation.get() * (1 - alpha)\n\n    offsetLocation.set(interpolatedLocation)\n\n    if (loop) {\n      scrollLooper.loop(scrollBody.direction())\n      slideLooper.loop()\n    }\n\n    translate.to(offsetLocation.get())\n\n    if (hasSettledAndIdle) eventHandler.emit('settle')\n    if (!hasSettled) eventHandler.emit('scroll')\n  }\n\n  const animation = Animations(\n    ownerDocument,\n    ownerWindow,\n    () => update(engine),\n    (alpha: number) => render(engine, alpha)\n  )\n\n  // Shared\n  const friction = 0.68\n  const startLocation = scrollSnaps[index.get()]\n  const location = Vector1D(startLocation)\n  const previousLocation = Vector1D(startLocation)\n  const offsetLocation = Vector1D(startLocation)\n  const target = Vector1D(startLocation)\n  const scrollBody = ScrollBody(\n    location,\n    offsetLocation,\n    previousLocation,\n    target,\n    duration,\n    friction\n  )\n  const scrollTarget = ScrollTarget(\n    loop,\n    scrollSnaps,\n    contentSize,\n    limit,\n    target\n  )\n  const scrollTo = ScrollTo(\n    animation,\n    index,\n    indexPrevious,\n    scrollBody,\n    scrollTarget,\n    target,\n    eventHandler\n  )\n  const scrollProgress = ScrollProgress(limit)\n  const eventStore = EventStore()\n  const slidesInView = SlidesInView(\n    container,\n    slides,\n    eventHandler,\n    inViewThreshold\n  )\n  const { slideRegistry } = SlideRegistry(\n    containSnaps,\n    containScroll,\n    scrollSnaps,\n    scrollContainLimit,\n    slidesToScroll,\n    slideIndexes\n  )\n  const slideFocus = SlideFocus(\n    root,\n    slides,\n    slideRegistry,\n    scrollTo,\n    scrollBody,\n    eventStore,\n    eventHandler,\n    watchFocus\n  )\n\n  // Engine\n  const engine: EngineType = {\n    ownerDocument,\n    ownerWindow,\n    eventHandler,\n    containerRect,\n    slideRects,\n    animation,\n    axis,\n    dragHandler: DragHandler(\n      axis,\n      root,\n      ownerDocument,\n      ownerWindow,\n      target,\n      DragTracker(axis, ownerWindow),\n      location,\n      animation,\n      scrollTo,\n      scrollBody,\n      scrollTarget,\n      index,\n      eventHandler,\n      percentOfView,\n      dragFree,\n      dragThreshold,\n      skipSnaps,\n      friction,\n      watchDrag\n    ),\n    eventStore,\n    percentOfView,\n    index,\n    indexPrevious,\n    limit,\n    location,\n    offsetLocation,\n    previousLocation,\n    options,\n    resizeHandler: ResizeHandler(\n      container,\n      eventHandler,\n      ownerWindow,\n      slides,\n      axis,\n      watchResize,\n      nodeRects\n    ),\n    scrollBody,\n    scrollBounds: ScrollBounds(\n      limit,\n      offsetLocation,\n      target,\n      scrollBody,\n      percentOfView\n    ),\n    scrollLooper: ScrollLooper(contentSize, limit, offsetLocation, [\n      location,\n      offsetLocation,\n      previousLocation,\n      target\n    ]),\n    scrollProgress,\n    scrollSnapList: scrollSnaps.map(scrollProgress.get),\n    scrollSnaps,\n    scrollTarget,\n    scrollTo,\n    slideLooper: SlideLooper(\n      axis,\n      viewSize,\n      contentSize,\n      slideSizes,\n      slideSizesWithGaps,\n      snaps,\n      scrollSnaps,\n      offsetLocation,\n      slides\n    ),\n    slideFocus,\n    slidesHandler: SlidesHandler(container, eventHandler, watchSlides),\n    slidesInView,\n    slideIndexes,\n    slideRegistry,\n    slidesToScroll,\n    target,\n    translate: Translate(axis, container)\n  }\n\n  return engine\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\n\ntype CallbackType = (emblaApi: EmblaCarouselType, evt: EmblaEventType) => void\ntype ListenersType = Partial<{ [key in EmblaEventType]: CallbackType[] }>\n\nexport type EmblaEventType = EmblaEventListType[keyof EmblaEventListType]\n\nexport interface EmblaEventListType {\n  init: 'init'\n  pointerDown: 'pointerDown'\n  pointerUp: 'pointerUp'\n  slidesChanged: 'slidesChanged'\n  slidesInView: 'slidesInView'\n  scroll: 'scroll'\n  select: 'select'\n  settle: 'settle'\n  destroy: 'destroy'\n  reInit: 'reInit'\n  resize: 'resize'\n  slideFocusStart: 'slideFocusStart'\n  slideFocus: 'slideFocus'\n}\n\nexport type EventHandlerType = {\n  init: (emblaApi: EmblaCarouselType) => void\n  emit: (evt: EmblaEventType) => EventHandlerType\n  on: (evt: EmblaEventType, cb: CallbackType) => EventHandlerType\n  off: (evt: EmblaEventType, cb: CallbackType) => EventHandlerType\n  clear: () => void\n}\n\nexport function EventHandler(): EventHandlerType {\n  let listeners: ListenersType = {}\n  let api: EmblaCarouselType\n\n  function init(emblaApi: EmblaCarouselType): void {\n    api = emblaApi\n  }\n\n  function getListeners(evt: EmblaEventType): CallbackType[] {\n    return listeners[evt] || []\n  }\n\n  function emit(evt: EmblaEventType): EventHandlerType {\n    getListeners(evt).forEach((e) => e(api, evt))\n    return self\n  }\n\n  function on(evt: EmblaEventType, cb: CallbackType): EventHandlerType {\n    listeners[evt] = getListeners(evt).concat([cb])\n    return self\n  }\n\n  function off(evt: EmblaEventType, cb: CallbackType): EventHandlerType {\n    listeners[evt] = getListeners(evt).filter((e) => e !== cb)\n    return self\n  }\n\n  function clear(): void {\n    listeners = {}\n  }\n\n  const self: EventHandlerType = {\n    init,\n    emit,\n    off,\n    on,\n    clear\n  }\n  return self\n}\n", "import { AlignmentOptionType } from './Alignment'\nimport { AxisDirectionOptionType, AxisOptionType } from './Axis'\nimport { SlidesToScrollOptionType } from './SlidesToScroll'\nimport { ScrollContainOptionType } from './ScrollContain'\nimport { DragHandlerOptionType } from './DragHandler'\nimport { ResizeHandlerOptionType } from './ResizeHandler'\nimport { SlidesHandlerOptionType } from './SlidesHandler'\nimport { SlidesInViewOptionsType } from './SlidesInView'\nimport { FocusHandlerOptionType } from './SlideFocus'\n\nexport type LooseOptionsType = {\n  [key: string]: unknown\n}\n\nexport type CreateOptionsType<Type extends LooseOptionsType> = Type & {\n  active: boolean\n  breakpoints: {\n    [key: string]: Omit<Partial<CreateOptionsType<Type>>, 'breakpoints'>\n  }\n}\n\nexport type OptionsType = CreateOptionsType<{\n  align: AlignmentOptionType\n  axis: AxisOptionType\n  container: string | HTMLElement | null\n  slides: string | HTMLElement[] | NodeListOf<HTMLElement> | null\n  containScroll: ScrollContainOptionType\n  direction: AxisDirectionOptionType\n  slidesToScroll: SlidesToScrollOptionType\n  dragFree: boolean\n  dragThreshold: number\n  inViewThreshold: SlidesInViewOptionsType\n  loop: boolean\n  skipSnaps: boolean\n  duration: number\n  startIndex: number\n  watchDrag: DragHandlerOptionType\n  watchResize: ResizeHandlerOptionType\n  watchSlides: SlidesHandlerOptionType\n  watchFocus: FocusHandlerOptionType\n}>\n\nexport const defaultOptions: OptionsType = {\n  align: 'center',\n  axis: 'x',\n  container: null,\n  slides: null,\n  containScroll: 'trimSnaps',\n  direction: 'ltr',\n  slidesToScroll: 1,\n  inViewThreshold: 0,\n  breakpoints: {},\n  dragFree: false,\n  dragThreshold: 10,\n  loop: false,\n  skipSnaps: false,\n  duration: 25,\n  startIndex: 0,\n  active: true,\n  watchDrag: true,\n  watchResize: true,\n  watchSlides: true,\n  watchFocus: true\n}\n\nexport type EmblaOptionsType = Partial<OptionsType>\n", "import { LooseOptionsType, CreateOptionsType } from './Options'\nimport { objectKeys, objectsMergeDeep, WindowType } from './utils'\n\ntype OptionsType = Partial<CreateOptionsType<LooseOptionsType>>\n\nexport type OptionsHandlerType = {\n  mergeOptions: <TypeA extends OptionsType, TypeB extends OptionsType>(\n    optionsA: TypeA,\n    optionsB?: TypeB\n  ) => TypeA\n  optionsAtMedia: <Type extends OptionsType>(options: Type) => Type\n  optionsMediaQueries: (optionsList: OptionsType[]) => MediaQueryList[]\n}\n\nexport function OptionsHandler(ownerWindow: WindowType): OptionsHandlerType {\n  function mergeOptions<TypeA extends OptionsType, TypeB extends OptionsType>(\n    optionsA: TypeA,\n    optionsB?: TypeB\n  ): TypeA {\n    return <TypeA>objectsMergeDeep(optionsA, optionsB || {})\n  }\n\n  function optionsAtMedia<Type extends OptionsType>(options: Type): Type {\n    const optionsAtMedia = options.breakpoints || {}\n    const matchedMediaOptions = objectKeys(optionsAtMedia)\n      .filter((media) => ownerWindow.matchMedia(media).matches)\n      .map((media) => optionsAtMedia[media])\n      .reduce((a, mediaOption) => mergeOptions(a, mediaOption), {})\n\n    return mergeOptions(options, matchedMediaOptions)\n  }\n\n  function optionsMediaQueries(optionsList: OptionsType[]): MediaQueryList[] {\n    return optionsList\n      .map((options) => objectKeys(options.breakpoints || {}))\n      .reduce((acc, mediaQueries) => acc.concat(mediaQueries), [])\n      .map(ownerWindow.matchMedia)\n  }\n\n  const self: OptionsHandlerType = {\n    mergeOptions,\n    optionsAtMedia,\n    optionsMediaQueries\n  }\n  return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { OptionsHandlerType } from './OptionsHandler'\nimport { EmblaPluginsType, EmblaPluginType } from './Plugins'\n\nexport type PluginsHandlerType = {\n  init: (\n    emblaApi: EmblaCarouselType,\n    plugins: EmblaPluginType[]\n  ) => EmblaPluginsType\n  destroy: () => void\n}\n\nexport function PluginsHandler(\n  optionsHandler: OptionsHandlerType\n): PluginsHandlerType {\n  let activePlugins: EmblaPluginType[] = []\n\n  function init(\n    emblaApi: EmblaCarouselType,\n    plugins: EmblaPluginType[]\n  ): EmblaPluginsType {\n    activePlugins = plugins.filter(\n      ({ options }) => optionsHandler.optionsAtMedia(options).active !== false\n    )\n    activePlugins.forEach((plugin) => plugin.init(emblaApi, optionsHandler))\n\n    return plugins.reduce(\n      (map, plugin) => Object.assign(map, { [plugin.name]: plugin }),\n      {}\n    )\n  }\n\n  function destroy(): void {\n    activePlugins = activePlugins.filter((plugin) => plugin.destroy())\n  }\n\n  const self: PluginsHandlerType = {\n    init,\n    destroy\n  }\n  return self\n}\n", "import { Engine, EngineType } from './Engine'\nimport { EventStore } from './EventStore'\nimport { EventHandler, EventHandlerType } from './EventHandler'\nimport { defaultOptions, EmblaOptionsType, OptionsType } from './Options'\nimport { OptionsHandler } from './OptionsHandler'\nimport { PluginsHandler } from './PluginsHandler'\nimport { EmblaPluginsType, EmblaPluginType } from './Plugins'\nimport { isString, WindowType } from './utils'\n\nexport type EmblaCarouselType = {\n  canScrollNext: () => boolean\n  canScrollPrev: () => boolean\n  containerNode: () => HTMLElement\n  internalEngine: () => EngineType\n  destroy: () => void\n  off: EventHandlerType['off']\n  on: EventHandlerType['on']\n  emit: EventHandlerType['emit']\n  plugins: () => EmblaPluginsType\n  previousScrollSnap: () => number\n  reInit: (options?: EmblaOptionsType, plugins?: EmblaPluginType[]) => void\n  rootNode: () => HTMLElement\n  scrollNext: (jump?: boolean) => void\n  scrollPrev: (jump?: boolean) => void\n  scrollProgress: () => number\n  scrollSnapList: () => number[]\n  scrollTo: (index: number, jump?: boolean) => void\n  selectedScrollSnap: () => number\n  slideNodes: () => HTMLElement[]\n  slidesInView: () => number[]\n  slidesNotInView: () => number[]\n}\n\nfunction EmblaCarousel(\n  root: HTMLElement,\n  userOptions?: EmblaOptionsType,\n  userPlugins?: EmblaPluginType[]\n): EmblaCarouselType {\n  const ownerDocument = root.ownerDocument\n  const ownerWindow = <WindowType>ownerDocument.defaultView\n  const optionsHandler = OptionsHandler(ownerWindow)\n  const pluginsHandler = PluginsHandler(optionsHandler)\n  const mediaHandlers = EventStore()\n  const eventHandler = EventHandler()\n  const { mergeOptions, optionsAtMedia, optionsMediaQueries } = optionsHandler\n  const { on, off, emit } = eventHandler\n  const reInit = reActivate\n\n  let destroyed = false\n  let engine: EngineType\n  let optionsBase = mergeOptions(defaultOptions, EmblaCarousel.globalOptions)\n  let options = mergeOptions(optionsBase)\n  let pluginList: EmblaPluginType[] = []\n  let pluginApis: EmblaPluginsType\n\n  let container: HTMLElement\n  let slides: HTMLElement[]\n\n  function storeElements(): void {\n    const { container: userContainer, slides: userSlides } = options\n\n    const customContainer = isString(userContainer)\n      ? root.querySelector(userContainer)\n      : userContainer\n    container = <HTMLElement>(customContainer || root.children[0])\n\n    const customSlides = isString(userSlides)\n      ? container.querySelectorAll(userSlides)\n      : userSlides\n    slides = <HTMLElement[]>[].slice.call(customSlides || container.children)\n  }\n\n  function createEngine(options: OptionsType): EngineType {\n    const engine = Engine(\n      root,\n      container,\n      slides,\n      ownerDocument,\n      ownerWindow,\n      options,\n      eventHandler\n    )\n\n    if (options.loop && !engine.slideLooper.canLoop()) {\n      const optionsWithoutLoop = Object.assign({}, options, { loop: false })\n      return createEngine(optionsWithoutLoop)\n    }\n    return engine\n  }\n\n  function activate(\n    withOptions?: EmblaOptionsType,\n    withPlugins?: EmblaPluginType[]\n  ): void {\n    if (destroyed) return\n\n    optionsBase = mergeOptions(optionsBase, withOptions)\n    options = optionsAtMedia(optionsBase)\n    pluginList = withPlugins || pluginList\n\n    storeElements()\n\n    engine = createEngine(options)\n\n    optionsMediaQueries([\n      optionsBase,\n      ...pluginList.map(({ options }) => options)\n    ]).forEach((query) => mediaHandlers.add(query, 'change', reActivate))\n\n    if (!options.active) return\n\n    engine.translate.to(engine.location.get())\n    engine.animation.init()\n    engine.slidesInView.init()\n    engine.slideFocus.init(self)\n    engine.eventHandler.init(self)\n    engine.resizeHandler.init(self)\n    engine.slidesHandler.init(self)\n\n    if (engine.options.loop) engine.slideLooper.loop()\n    if (container.offsetParent && slides.length) engine.dragHandler.init(self)\n\n    pluginApis = pluginsHandler.init(self, pluginList)\n  }\n\n  function reActivate(\n    withOptions?: EmblaOptionsType,\n    withPlugins?: EmblaPluginType[]\n  ): void {\n    const startIndex = selectedScrollSnap()\n    deActivate()\n    activate(mergeOptions({ startIndex }, withOptions), withPlugins)\n    eventHandler.emit('reInit')\n  }\n\n  function deActivate(): void {\n    engine.dragHandler.destroy()\n    engine.eventStore.clear()\n    engine.translate.clear()\n    engine.slideLooper.clear()\n    engine.resizeHandler.destroy()\n    engine.slidesHandler.destroy()\n    engine.slidesInView.destroy()\n    engine.animation.destroy()\n    pluginsHandler.destroy()\n    mediaHandlers.clear()\n  }\n\n  function destroy(): void {\n    if (destroyed) return\n    destroyed = true\n    mediaHandlers.clear()\n    deActivate()\n    eventHandler.emit('destroy')\n    eventHandler.clear()\n  }\n\n  function scrollTo(index: number, jump?: boolean, direction?: number): void {\n    if (!options.active || destroyed) return\n    engine.scrollBody\n      .useBaseFriction()\n      .useDuration(jump === true ? 0 : options.duration)\n    engine.scrollTo.index(index, direction || 0)\n  }\n\n  function scrollNext(jump?: boolean): void {\n    const next = engine.index.add(1).get()\n    scrollTo(next, jump, -1)\n  }\n\n  function scrollPrev(jump?: boolean): void {\n    const prev = engine.index.add(-1).get()\n    scrollTo(prev, jump, 1)\n  }\n\n  function canScrollNext(): boolean {\n    const next = engine.index.add(1).get()\n    return next !== selectedScrollSnap()\n  }\n\n  function canScrollPrev(): boolean {\n    const prev = engine.index.add(-1).get()\n    return prev !== selectedScrollSnap()\n  }\n\n  function scrollSnapList(): number[] {\n    return engine.scrollSnapList\n  }\n\n  function scrollProgress(): number {\n    return engine.scrollProgress.get(engine.offsetLocation.get())\n  }\n\n  function selectedScrollSnap(): number {\n    return engine.index.get()\n  }\n\n  function previousScrollSnap(): number {\n    return engine.indexPrevious.get()\n  }\n\n  function slidesInView(): number[] {\n    return engine.slidesInView.get()\n  }\n\n  function slidesNotInView(): number[] {\n    return engine.slidesInView.get(false)\n  }\n\n  function plugins(): EmblaPluginsType {\n    return pluginApis\n  }\n\n  function internalEngine(): EngineType {\n    return engine\n  }\n\n  function rootNode(): HTMLElement {\n    return root\n  }\n\n  function containerNode(): HTMLElement {\n    return container\n  }\n\n  function slideNodes(): HTMLElement[] {\n    return slides\n  }\n\n  const self: EmblaCarouselType = {\n    canScrollNext,\n    canScrollPrev,\n    containerNode,\n    internalEngine,\n    destroy,\n    off,\n    on,\n    emit,\n    plugins,\n    previousScrollSnap,\n    reInit,\n    rootNode,\n    scrollNext,\n    scrollPrev,\n    scrollProgress,\n    scrollSnapList,\n    scrollTo,\n    selectedScrollSnap,\n    slideNodes,\n    slidesInView,\n    slidesNotInView\n  }\n\n  activate(userOptions, userPlugins)\n  setTimeout(() => eventHandler.emit('init'), 0)\n  return self\n}\n\ndeclare namespace EmblaCarousel {\n  let globalOptions: EmblaOptionsType | undefined\n}\n\nEmblaCarousel.globalOptions = undefined\n\nexport default EmblaCarousel\n", "import { Controller } from '@hotwired/stimulus';\nimport EmblaCarousel from 'embla-carousel';\n\nexport default class extends Controller {\n  static targets = ['viewport', 'prevButton', 'nextButton', 'buttons', 'slideIndicator', 'centeredButton'];\n\n  connect() {\n    this.emblaApi = EmblaCarousel(this.viewportTarget, {\n      align: 'start',\n      loop: false,\n      skipSnaps: false,\n    });\n\n    this.emblaApi.on('select', this.updateIndicator.bind(this));\n    this.emblaApi.on('reInit', this.updateIndicator.bind(this));\n\n    this.updateIndicator();\n  }\n\n  disconnect() {\n    this.emblaApi.destroy();\n  }\n\n  prev() {\n    this.emblaApi.scrollPrev();\n  }\n\n  next() {\n    this.emblaApi.scrollNext();\n  }\n\n  updateIndicator() {\n    this.toggleButtons();\n    this.updateSlideIndicator();\n  }\n\n  toggleButtons() {\n    const canScrollPrev = this.emblaApi.canScrollPrev();\n    const canScrollNext = this.emblaApi.canScrollNext();\n\n    if (!canScrollPrev && !canScrollNext) {\n      this.buttonsTarget.classList.add('hidden');\n      if (this.hasCenteredButtonTarget) {\n        this.centeredButtonTarget.classList.remove('hidden');\n        this.centeredButtonTarget.classList.add('flex');\n      }\n    } else {\n      this.buttonsTarget.classList.remove('hidden');\n      if (this.hasCenteredButtonTarget) {\n        this.centeredButtonTarget.classList.add('hidden');\n        this.centeredButtonTarget.classList.remove('flex');\n      }\n    }\n\n    this.prevButtonTarget.disabled = !canScrollPrev;\n    this.nextButtonTarget.disabled = !canScrollNext;\n  }\n\n  updateSlideIndicator() {\n    if (!this.hasSlideIndicatorTarget) return;\n\n    const selectedSnap = this.emblaApi.selectedScrollSnap();\n    const snapCount = this.emblaApi.scrollSnapList().length;\n\n    this.slideIndicatorTarget.textContent = `${selectedSnap + 1} / ${snapCount}`;\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nconst PRIVACY_PATHS = [\n  '/privacy',\n  '/privacy_cookies',\n  '/voorwaarden-verblijf',\n  '/declaration-de-confidentialite',\n  '/de/datenschutz-bestimmungen-1',\n  '/datenschutz-und-cookieerklarung',\n  '/cookie-verklaring',\n  '/datenschutzerklearung',\n  '/de/freizeitpark/privacy-datenschutzerklaerung/',\n  '/colophon',\n  '/privacy-verklaring',\n  '/datenschutz-und-cookie-erklaerung',\n  '/privacy-statement',\n  '/privacybeleid/',\n  '/privacy-cookies',\n  '/privacy-policy',\n  '/datenschutzerklarung',\n  '/en/Privacypolicy',\n  '/privacy-beleid',\n  '/privacy-and-cookie-statement',\n  '/de/datenschutzrichtlinie',\n  '/de/datenschutzerklaerung',\n  '/impressum-and-datenschutz',\n  '/de/privacy',\n  '/dichiarazione-sulla-privacy-e-sui-cookie',\n  '/cookies',\n  '/privacy-cookies/',\n  '/privacy-en-cookiestatement',\n  '/attractiepark/privacy-verklaring/',\n  '/fr/politique-de-confidentialite-2',\n  '/nb/personvernerklaering',\n  '/datenschutzerklaerung',\n  '/de/datenschutzerklarung',\n  '/disclaimer-and-privacy-statement',\n  '/privacybeleid',\n  '/datenschutz-bestimmungen',\n  '/cookies-op-website',\n  '/privacystatement',\n  '/nl/privacybeleid-1',\n  '/datenschutz',\n  '/es/privacidad',\n  '/personvernerklaering',\n  '/politique-de-confidentialite',\n  '/nl/privacy',\n  '/de/datenschutzbestimmungen',\n  '/privacy-en-cookieverklaring',\n  '/fr/Politiquedeconfidentialite',\n  '/en/privacy-policy-1',\n  '/en/privacy',\n  '/cookie-policy',\n  '/privacyverklaring',\n  '/cookiestatement',\n];\n\nexport default class extends Controller {\n  static targets = [\n    'customizePanel',\n    'acceptAllButtonPrimary',\n    'acceptAllButtonSecondary',\n    'saveButton',\n    'toggleCustomizePanelButton',\n    'declineButton',\n    'consentNecessary',\n    'consentPreferences',\n    'consentStatistics',\n    'consentMarketing',\n  ];\n\n  connect() {\n    window.dataLayer = window.dataLayer || [];\n\n    const currentPath = window.location.pathname;\n\n    if (!this.consentCookieExists() && !this.isSpider() && !PRIVACY_PATHS.includes(currentPath)) {\n      this.openDialog();\n    } else {\n      const consentValues = this.getConsentCookieValues();\n      if (\n        consentValues &&\n        consentValues.preferences !== undefined &&\n        consentValues.statistics !== undefined &&\n        consentValues.marketing !== undefined\n      ) {\n        this.signalGoogleConsentAPI('dynamic', consentValues.preferences, consentValues.statistics, consentValues.marketing);\n      } else {\n        console.warn('Invalid consent values:', consentValues);\n      }\n    }\n  }\n\n  isSpider() {\n    return /adidxbotc|Applebot\\/|archive.org_bot|asterias\\/|Baiduspider\\/|bingbot\\/|BingPreview\\/|DuckDuckBot\\/|FAST-WebCrawler\\/|Feedspot|Feedspotbot\\/|Google Page Speed Insights|Google PP|Google Search Console|Google Web Preview|Googlebot\\/|Googlebot-Image\\/|Googlebot-Mobile\\/|Googlebot-News|Googlebot-Video\\/|Google-SearchByImage|Google-Structured-Data-Testing-Tool|Chrome-Lighthouse|heritrix\\/|iaskspider\\/|Mediapartners-Google|msnbot\\/|msnbot-media\\/|msnbot-NewsBlogs\\/|msnbot-UDiscovery\\/|PTST\\/|SEMrushBot|special_archiver\\/|Siteimprove|Y!J-ASR\\/|Y!J-BRI\\/|Y!J-BRJ\\/YATS|Y!J-BRO\\/YFSJ|Y!J-BRW\\/|Y!J-BSC\\/|Yahoo! Site Explorer Feed Validator|Yahoo! Slurp|YahooCacheSystem|Yahoo-MMCrawler\\/|YahooSeeker\\/|aabot\\/|compatible; aa\\/|PetalBot\\/|Prerender\\/|webvitals.dev/.test(\n      navigator.userAgent,\n    );\n  }\n\n  acceptAll() {\n    const consent = {\n      necessary: true,\n      preferences: true,\n      statistics: true,\n      marketing: true,\n      method: 'implied',\n      ver: 1,\n      utc: Date.now(),\n    };\n\n    this.handleConsentActions('acceptAll', 'implied', consent);\n  }\n\n  declineAll() {\n    const consent = {\n      necessary: true,\n      preferences: false,\n      statistics: false,\n      marketing: false,\n      method: 'explicit',\n      ver: 1,\n      utc: Date.now(),\n    };\n\n    this.handleConsentActions('declineAll', 'explicit', consent);\n  }\n\n  handleConsentActions(action, method, consent) {\n    this.signalGoogleConsentAPI('dynamic', consent.preferences, consent.statistics, consent.marketing);\n    this.trackConsentChange(action, method, consent.preferences, consent.statistics, consent.marketing);\n    this.updateConsentCookies(consent);\n    this.closeDialog();\n  }\n\n  getConsentValues() {\n    return {\n      necessary: this.consentNecessaryTarget.checked,\n      preferences: this.consentPreferencesTarget.checked,\n      statistics: this.consentStatisticsTarget.checked,\n      marketing: this.consentMarketingTarget.checked,\n      method: 'explicit',\n      ver: 1,\n      utc: Date.now(),\n    };\n  }\n\n  save() {\n    try {\n      const consentValues = this.getConsentValues();\n\n      if (!consentValues || typeof consentValues !== 'object') {\n        throw new Error('Invalid consent values');\n      }\n\n      const { preferences, statistics, marketing } = consentValues;\n\n      if (typeof preferences !== 'boolean' || typeof statistics !== 'boolean' || typeof marketing !== 'boolean') {\n        throw new Error('Invalid consent values types');\n      }\n\n      const consent = {\n        necessary: true,\n        preferences: preferences,\n        statistics: statistics,\n        marketing: marketing,\n        method: 'explicit',\n        ver: 1,\n        utc: Date.now(),\n      };\n\n      this.handleConsentActions('save', 'explicit', consent);\n    } catch (error) {\n      console.error('Error saving consent:', error);\n    }\n  }\n\n  trackConsentChange(action, method, preferences, statistics, marketing) {\n    window.dataLayer = window.dataLayer || [];\n    window.dataLayer.push({\n      event: 'BexConsentManager',\n      action: action,\n      method: method,\n      preferences: preferences,\n      statistics: statistics,\n      marketing: marketing,\n    });\n  }\n\n  signalGoogleConsentAPI = function (dataRedactionMode = 'dynamic', preferences, statistics, marketing) {\n    this.pushDataLayer('consent', 'update', {\n      ad_storage: marketing ? 'granted' : 'denied',\n      ad_user_data: marketing ? 'granted' : 'denied',\n      ad_personalization: marketing ? 'granted' : 'denied',\n      personalization: marketing ? 'granted' : 'denied',\n      analytics_storage: statistics ? 'granted' : 'denied',\n      functionality_storage: preferences ? 'granted' : 'denied',\n      personalization_storage: preferences ? 'granted' : 'denied',\n      security_storage: 'granted',\n    }),\n      'dynamic' === dataRedactionMode && this.pushDataLayer('set', 'ads_data_redaction', !marketing);\n\n    window.dataLayer = window.dataLayer || [];\n\n    window.dataLayer.push({\n      event: 'cookie_consent_update',\n    });\n\n    const consentTypes = [\n      { type: 'preferences', enabled: preferences },\n      { type: 'statistics', enabled: statistics },\n      { type: 'marketing', enabled: marketing },\n    ];\n\n    consentTypes\n      .filter(({ enabled }) => enabled)\n      .forEach(({ type }) => {\n        window.dataLayer.push({\n          event: `cookie_consent_${type}`,\n        });\n      });\n  };\n\n  toggleCustomizeConsent() {\n    // Ensure the DOM elements exist before accessing their styles\n    if (\n      !this.customizePanelTarget ||\n      !this.saveButtonTarget ||\n      !this.declineButtonTarget ||\n      !this.toggleCustomizePanelButtonTarget ||\n      !this.acceptAllButtonPrimaryTarget ||\n      !this.acceptAllButtonSecondaryTarget ||\n      !this.consentPreferencesTarget\n    ) {\n      console.error('One or more DOM elements are missing.');\n      return;\n    }\n\n    // Check if the customize panel is currently displayed\n    const isDisplayed = this.customizePanelTarget.style.display === 'block';\n\n    this.acceptAllButtonPrimaryTarget.style.display = isDisplayed ? 'block' : 'none';\n    this.acceptAllButtonSecondaryTarget.style.display = isDisplayed ? 'none' : 'block';\n\n    // Toggle the display of the customize panel\n    this.customizePanelTarget.style.display = isDisplayed ? 'none' : 'block';\n\n    // Toggle the display of the save button\n    this.saveButtonTarget.style.display = isDisplayed ? 'none' : 'block';\n\n    // Toggle the display of the decline button\n    this.declineButtonTarget.style.display = isDisplayed ? 'none' : 'block';\n\n    // Toggle the display of the customize panel button\n    this.toggleCustomizePanelButtonTarget.style.display = isDisplayed ? 'block' : 'none';\n\n    // Scroll the consent preferences target into view if the customize panel is displayed and on mobile\n    if (!isDisplayed && this.consentPreferencesTarget && window.innerWidth <= 768) {\n      this.consentPreferencesTarget.scrollIntoView({ behavior: 'smooth' });\n    }\n  }\n\n  pushDataLayer() {\n    // Ensure window.dataLayer exists\n    if (!window.dataLayer || !Array.isArray(window.dataLayer)) {\n      console.error('Google Data Layer is not initialized.');\n      return;\n    }\n\n    // Ensure arguments are provided\n    if (arguments.length === 0) {\n      console.error('No arguments provided to push to Google Data Layer.');\n      return;\n    }\n\n    // Push arguments to the Google Data Layer\n    window.dataLayer.push(arguments);\n  }\n\n  updateConsentCookies(consent) {\n    try {\n      // Ensure the consent object is valid\n      if (typeof consent !== 'object' || consent === null) {\n        throw new Error('Invalid consent object');\n      }\n\n      // Convert the consent object to a JSON string\n      const consentString = JSON.stringify(consent);\n\n      // Set the cookie with the JSON string as the value\n      document.cookie = `BexConsent=${consentString}; path=/; max-age=31536000`;\n    } catch (error) {\n      console.error('Failed to update consent cookies:', error);\n    }\n\n    // As long the table cookie_consents exists, we need to set the old cookies\n    // (july 2024)\n    if (this.element.dataset.consents) {\n      let oldConsentsIdentifiers = [];\n      try {\n        oldConsentsIdentifiers = JSON.parse(this.element.dataset.consents);\n      } catch (error) {\n        console.error('Failed to parse consents data:', error);\n        return;\n      }\n\n      const consentMapping = {\n        essential: consent.necessary,\n        marketing: consent.marketing,\n        statistics: consent.statistics,\n        preferences: consent.preferences,\n      };\n\n      const cookieExpiryDays = 365;\n      const currentDate = new Date();\n      currentDate.setTime(currentDate.getTime() + cookieExpiryDays * 24 * 60 * 60 * 1000);\n      const expires = `expires=${currentDate.toUTCString()}`;\n\n      oldConsentsIdentifiers.forEach(({ identifier, identifier_type }) => {\n        const old_cookie_name = `cookie_consent_${identifier}`;\n        const old_cookie_value =\n          consentMapping[identifier_type] !== undefined ? (consentMapping[identifier_type] ? 'accepted' : 'refused') : 'accepted';\n        document.cookie = `${old_cookie_name}=${old_cookie_value}; ${expires}; path=/`;\n      });\n    } else {\n      console.warn('No consents data found.');\n    }\n  }\n\n  getConsentCookieValues() {\n    const name = 'BexConsent=';\n    const decodedCookie = decodeURIComponent(document.cookie);\n    const ca = decodedCookie.split(';');\n\n    for (let i = 0; i < ca.length; i++) {\n      let c = ca[i].trim(); // Trim leading and trailing spaces\n\n      if (c.indexOf(name) === 0) {\n        const consentString = c.substring(name.length, c.length);\n\n        try {\n          return JSON.parse(consentString);\n        } catch (error) {\n          console.error('Failed to parse consent cookie:', error);\n          return null;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  deleteCookie(name) {\n    document.cookie = `${name}=; Max-Age=-99999999; path=/`;\n  }\n\n  consentCookieExists() {\n    // After the 1st of July 2025, we can remove this code part about the old cookies\n    const oldCookie = this.getCookie('cookie_consent_dismissed');\n\n    if (oldCookie && oldCookie === 'true') {\n      const consent = {\n        necessary: true,\n        preferences: true,\n        statistics: true,\n        marketing: true,\n        method: 'implied',\n        ver: 1,\n        utc: Date.now(),\n      };\n\n      const updatedCookieMapping = {\n        statistiken: 'statistics',\n        statistieken: 'statistics',\n        google_analytics: 'statistics',\n        marketings: 'marketing',\n        marketing: 'marketing',\n        facebook: 'marketing',\n        praferenzen: 'preferences',\n        voorkeuren: 'preferences',\n      };\n\n      Object.entries(updatedCookieMapping).forEach(([cookieName, consentType]) => {\n        const cookieValue = this.getCookie(`cookie_consent_${cookieName}`);\n        if (cookieValue) {\n          if (cookieValue === 'accepted') {\n            consent[consentType] = true;\n          } else if (cookieValue === 'refused') {\n            consent[consentType] = false;\n          }\n        }\n      });\n\n      this.updateConsentCookies(consent);\n      this.deleteCookie('cookie_consent_dismissed');\n    }\n\n    return !!this.getCookie('BexConsent');\n  }\n\n  getCookie(name) {\n    try {\n      // Ensure the name parameter is a valid string\n      if (typeof name !== 'string' || name.trim() === '') {\n        throw new Error('Invalid cookie name');\n      }\n\n      // Create a regular expression to match the cookie name\n      const regex = new RegExp('(?:^|; )' + name.replace(/([\\.$?*|{}\\(\\)\\[\\]\\\\\\/\\+^])/g, '\\\\$1') + '=([^;]*)');\n      const matches = document.cookie.match(regex);\n\n      // Return the decoded cookie value if matches are found\n      return matches ? decodeURIComponent(matches[1]) : undefined;\n    } catch (error) {\n      console.error('Failed to get cookie:', error);\n      return undefined;\n    }\n  }\n\n  openDialog() {\n    try {\n      const dialog = this.element;\n      if (dialog instanceof HTMLElement) {\n        dialog.style.display = 'flex';\n      } else {\n        throw new Error('Invalid dialog element');\n      }\n    } catch (error) {\n      console.error('Failed to open dialog:', error);\n    }\n  }\n\n  closeDialog() {\n    try {\n      const dialog = this.element;\n      if (dialog instanceof HTMLElement) {\n        dialog.style.display = 'none';\n      } else {\n        throw new Error('Invalid dialog element');\n      }\n    } catch (error) {\n      console.error('Failed to close dialog:', error);\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['input'];\n\n  increment() {\n    const input = this.inputTarget;\n    input.value = parseInt(input.value) + 1;\n    this._dispatchChange(input);\n  }\n\n  decrement() {\n    const input = this.inputTarget;\n    input.value = Math.max(parseInt(input.value) - 1, 0);\n    this._dispatchChange(input);\n  }\n\n  // this event is needed to trigger autosubmit#debouncedSubmit in app/views/availability_searches/_edit_query.html.slim\n  _dispatchChange(inputTarget) {\n    inputTarget.dispatchEvent(new Event('change', { bubbles: true }));\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\n// This controller can be removed once all Nucleus components are converted to Stimulus controllers.\n// For now it can be used to initalize Nucleus components that are added to the DOM after page load.\n// For example when using DS modals.\nexport default class extends Controller {\n  connect() {\n    $(this.element).initialize();\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static classes = ['open'];\n  static targets = ['dialog', 'inside', 'hide', 'show', 'focus'];\n  static values = { manageScroll: Boolean, enableHover: Boolean, closeOutside: Boolean, initialOpen: Boolean };\n\n  // Lifecycle\n\n  connect() {\n    this.isOpen = false;\n    this.showTargets.forEach((element) => (element.style.display = 'none'));\n    this.enableHover = window.matchMedia('(hover: hover) and (pointer: fine)').matches && this.enableHoverValue;\n\n    this.isOpen = this.openValue;\n\n    this.toggleOpenClass();\n    this.hideAndShowTarget();\n\n    if (this.isOpen) this.disableScroll();\n\n    this.boundCloseOnEscape = this.closeOnEscape.bind(this);\n    document.addEventListener('keydown', this.boundCloseOnEscape);\n\n    if (this.closeOutsideValue) {\n      this.boundCloseIfOutside = this.closeIfOutside.bind(this);\n      document.addEventListener('click', this.boundCloseIfOutside);\n    }\n\n    document.addEventListener('turbo:before-cache', this.handleBeforeCache);\n\n    if (this.enableHover) {\n      this.boundOpenOnHover = this.openOnHover.bind(this);\n      this.element.addEventListener('mouseenter', this.boundOpenOnHover);\n\n      this.boundCloseOnHover = this.closeOnHover.bind(this);\n      this.element.addEventListener('mouseleave', this.boundCloseOnHover);\n    }\n\n    if (this.initialOpenValue) {\n      this.open();\n    }\n  }\n\n  disconnect() {\n    this.enableScroll();\n\n    document.removeEventListener('keydown', this.boundCloseOnEscape);\n    document.removeEventListener('turbo:before-cache', this.handleBeforeCache);\n\n    if (this.closeOutsideValue) {\n      document.removeEventListener('click', this.boundCloseIfOutside);\n    }\n\n    if (this.enableHover) {\n      this.element.removeEventListener('mouseenter', this.boundOpenOnHover);\n      this.element.removeEventListener('mouseleave', this.boundCloseOnHover);\n    }\n  }\n\n  handleBeforeCache = () => {\n    this.enableScroll();\n    this.isOpen = false;\n  };\n\n  // Close on click outside and/or escape\n\n  closeIfOutside(event) {\n    if (!(this.hasInsideTarget ? this.insideTarget : this.element).contains(event.target)) this.close(event);\n  }\n\n  closeOnEscape(event) {\n    if (event.code == 'Escape') this.close(event);\n  }\n\n  // Open on hover (optional)\n\n  openOnHover(event) {\n    this.clearHoverTimeouts();\n    this.openOnHoverTimeout = window.setTimeout(() => {\n      this.open(event);\n    }, 150);\n  }\n\n  closeOnHover(event) {\n    this.clearHoverTimeouts();\n    this.closeOnHoverTimeout = window.setTimeout(() => {\n      this.close(event);\n    }, 150);\n  }\n\n  clearHoverTimeouts() {\n    window.clearTimeout(this.openOnHoverTimeout);\n    window.clearTimeout(this.closeOnHoverTimeout);\n  }\n\n  // Actions\n\n  open(event) {\n    if (this.isOpen) return;\n\n    if (event) {\n      if (this.handled(event)) return;\n      if (this.enableHover && event.type == 'click') return;\n\n      // Don't open links if already opening openable\n      // Enables menu item double tap for tablet: first tap opens openable, second tap opens link\n      event.preventDefault();\n    }\n\n    if (this.hasOpenClass) this.element.classList.add(this.openClass);\n    this.isOpen = true;\n\n    this.hideTargets.forEach((element) => (element.style.display = 'none'));\n    this.showTargets.forEach((element) => (element.style.display = ''));\n    this.focusTargets.forEach((element) => element.focus());\n\n    this.disableScroll();\n\n    if (this.hasDialogTarget) {\n      this.dialogTarget.showModal();\n    }\n  }\n\n  close(event) {\n    if (this.handled(event) || !this.isOpen) return;\n    if (this.enableHover && event.type == 'click') return;\n\n    if (this.hasOpenClass) this.element.classList.remove(this.openClass);\n    this.isOpen = false;\n\n    this.hideTargets.forEach((element) => (element.style.display = ''));\n    this.showTargets.forEach((element) => (element.style.display = 'none'));\n    this.focusTargets.forEach((element) => element.blur());\n\n    this.enableScroll();\n\n    if (this.hasDialogTarget) {\n      this.dialogTarget.close();\n    }\n  }\n\n  toggle(event) {\n    this.isOpen ? this.close(event) : this.open(event);\n  }\n\n  // State management helpers\n\n  hideAndShowTarget() {\n    this.hideTargets.forEach((element) => (element.style.display = this.isOpen ? 'none' : ''));\n    this.showTargets.forEach((element) => (element.style.display = this.isOpen ? '' : 'none'));\n  }\n\n  toggleOpenClass() {\n    if (!this.hasOpenClass) return;\n\n    if (this.isOpen) this.element.classList.add(this.openClass);\n    else this.element.classList.remove(this.openClass);\n  }\n\n  disableScroll() {\n    if (!this.manageScrollValue) return;\n\n    const scrollY = window.scrollY;\n\n    document.body.style.position = 'fixed';\n    if (document.body.offsetHeight > window.innerHeight) document.body.style.overflowY = 'scroll'; // Prevent scrollbar collapse\n    document.body.style.width = '100%'; // Prevent Safari from collapsing body size\n    document.body.style.top = `-${scrollY}px`;\n  }\n\n  enableScroll() {\n    if (!this.manageScrollValue) return;\n    if (document.body.style.position !== 'fixed') return;\n\n    const scrollY = document.body.style.top;\n\n    document.body.style.position = 'relative';\n    document.body.style.overflowY = 'auto';\n    document.body.style.width = 'auto';\n    document.body.style.top = '';\n\n    window.scrollTo(0, parseInt(scrollY || '0') * -1);\n  }\n\n  // Never handle an event more than once for a single controller\n  // Example: A click on an open button is also a click outside\n  handled(event) {\n    event.handledForOpenableControllers ||= [];\n\n    if (event.handledForOpenableControllers.includes(this)) {\n      return true;\n    } else {\n      event.handledForOpenableControllers.push(this);\n      return false;\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static classes = ['overlapped'];\n  static targets = ['subject'];\n\n  // Lifecycle\n\n  connect() {\n    this.boundSetClassIfOverlapping = this.setClassIfOverlapping.bind(this);\n    window.addEventListener('resize', this.boundSetClassIfOverlapping);\n    window.addEventListener('toggle-stuck', this.boundSetClassIfOverlapping);\n\n    this.setClassIfOverlapping();\n  }\n\n  disconnect() {\n    window.removeEventListener('resize', this.boundSetClassIfOverlapping);\n    window.removeEventListener('toggle-stuck', this.boundSetClassIfOverlapping);\n  }\n\n  setClassIfOverlapping() {\n    // Remove class first so we can check if it fits after resize\n    this.element.classList.remove(this.overlappedClass);\n\n    if (this.someSubjectsOverlap()) this.element.classList.add(this.overlappedClass);\n  }\n\n  // Helper methods to check whether subjects overlap\n\n  someSubjectsOverlap() {\n    return this.subjectTargets.some((subject, index) => {\n      return this.subjectTargets.slice(index + 1).some((otherSubject) => {\n        return this.rectsOverlap(subject.getBoundingClientRect(), otherSubject.getBoundingClientRect());\n      });\n    });\n  }\n\n  rectsOverlap(rect, otherRect) {\n    return !(rect.right < otherRect.left || rect.left > otherRect.right || rect.bottom < otherRect.top || rect.top > otherRect.bottom);\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport PeriodSelector from '../react_components/period_selector.jsx';\n\nexport default class extends Controller {\n  static values = { props: Object };\n  static targets = ['startDateField', 'endDateField', 'component'];\n\n  async connect() {\n    ReactDOM.render(\n      <PeriodSelector\n        {...this.propsValue}\n        onSelect={this.handleSelect}\n        onReset={this.handleReset}\n        onUpdateDropdownPosition={this.handleUpdateDropdownPosition}\n      />,\n      this.componentTarget,\n    );\n  }\n\n  disconnect() {\n    ReactDOM.unmountComponentAtNode(this.componentTarget);\n    delete this.component;\n  }\n\n  handleReset = () => {\n    $(this.startDateFieldTarget).val('');\n    $(this.endDateFieldTarget).val('');\n    this.element.dispatchEvent(new Event('period-select:change', { bubbles: true }));\n  };\n\n  handleSelect = (startDate, endDate) => {\n    $(this.startDateFieldTarget).val(startDate.format('YYYY-MM-DD'));\n    $(this.endDateFieldTarget).val(endDate.format('YYYY-MM-DD'));\n    this.element.dispatchEvent(new Event('period-select:change', { bubbles: true }));\n  };\n\n  handleUpdateDropdownPosition = () => {\n    const $dropdown = $(this.element).find('.enhanced-dropdown');\n    const $select = $(this.element).find('.enhanced-dropdown-select');\n\n    if ($dropdown.offset() == undefined) return;\n\n    const spaceToWindowTop = $dropdown.offsetWindowTop();\n    let spaceToDocumentTop = $dropdown.offset().top;\n\n    const $offset = $($(this.element).data('offset'));\n\n    if ($offset.length) spaceToDocumentTop -= $offset.outerHeight(true);\n    if ($offset.length) spaceToDocumentTop -= $offset.offset().top;\n\n    const selectHeight = $select.outerHeight();\n\n    if (spaceToWindowTop > selectHeight && spaceToDocumentTop > selectHeight) {\n      $select.css({ bottom: $dropdown.outerHeight() });\n    } else {\n      $select.css({ bottom: 'auto' });\n    }\n  };\n}\n", "import React, { useEffect, useRef, useState, useMemo } from 'react';\nimport PeriodSelectorDay from './period_selector_day';\n\nconst DAY_FORMAT = 'dd';\nconst DISPLAY_FORMAT = 'DD-MM-YYYY';\n\nexport default function PeriodSelector({\n  startDate: initialStartDate,\n  endDate: initialEndDate,\n  minDate: minDateProp,\n  maxDate: maxDateProp,\n  maxDuration,\n  canReset,\n  startDateDefaultText,\n  endDateDefaultText,\n  holidays,\n  wrapperClass,\n  onUpdateDropdownPosition,\n  onSelect,\n  onReset,\n}) {\n  const [mode, setMode] = useState('inactive');\n  const [startDate, setStartDate] = useState(initialStartDate ? moment(initialStartDate) : null);\n  const [endDate, setEndDate] = useState(initialStartDate && initialEndDate ? moment(initialEndDate) : null);\n  const [hoverDate, setHoverDate] = useState(null);\n\n  const [activeMonthDate, setActiveMonthDate] = useState(() => {\n    if (initialStartDate) return moment(initialStartDate);\n    if (minDateProp) return moment(minDateProp);\n    return moment();\n  });\n\n  const [movingNext, setMovingNext] = useState(false);\n  const [movingPrev, setMovingPrev] = useState(false);\n\n  const minDate = minDateProp ? moment(minDateProp) : null;\n  const maxDate = maxDateProp ? moment(maxDateProp) : null;\n\n  const mouseDownRef = useRef(false);\n  const timerRef = useRef(null);\n\n  const debouncedUpdateDropdownPosition = debounce(onUpdateDropdownPosition, 100);\n\n  function handleWindowMouseDown() {\n    if (!mouseDownRef.current) {\n      setMode('inactive');\n    }\n  }\n\n  function handleMouseDown() {\n    mouseDownRef.current = true;\n  }\n\n  function handleMouseUp() {\n    mouseDownRef.current = false;\n  }\n\n  function makeActive(mode, event) {\n    if (!startDate) {\n      setMode('select_start');\n    } else {\n      setMode(mode);\n    }\n    event.stopPropagation();\n  }\n\n  function onResetButtonClick(event) {\n    setStartDate(null);\n    setEndDate(null);\n    setMode('inactive');\n    setActiveMonthDate(moment());\n    onReset();\n    event.stopPropagation();\n  }\n\n  function handleNextMonthClick() {\n    setMovingNext(true);\n    withDelay(handleNextMonthDone);\n  }\n\n  function handlePrevMonthClick() {\n    setMovingPrev(true);\n    withDelay(handlePrevMonthDone);\n  }\n\n  function withDelay(callback) {\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n      callback();\n    }\n\n    timerRef.current = setTimeout(() => {\n      timerRef.current = null;\n      callback();\n    }, 200);\n  }\n\n  function handleNextMonthDone() {\n    moveDone(activeMonthDate.clone().add(1, 'months'));\n  }\n\n  function handlePrevMonthDone() {\n    moveDone(activeMonthDate.clone().add(-1, 'months'));\n  }\n\n  function moveDone(newMonth) {\n    setMovingNext(false);\n    setMovingPrev(false);\n    setActiveMonthDate(newMonth);\n  }\n\n  function handleSelectStartDate(day) {\n    setStartDate(day);\n    setEndDate(null);\n    setMode('select_end');\n  }\n\n  function handleSelectEndDate(day) {\n    setEndDate(day);\n    setMode('inactive');\n    onSelect(startDate, day);\n  }\n\n  useEffect(() => {\n    window.addEventListener('mousedown', handleWindowMouseDown);\n    window.addEventListener('scroll', debouncedUpdateDropdownPosition);\n    onUpdateDropdownPosition();\n\n    return () => {\n      window.removeEventListener('mousedown', handleWindowMouseDown);\n      window.removeEventListener('scroll', debouncedUpdateDropdownPosition);\n    };\n  }, []);\n\n  const startDateClasses = [startDate ? '' : 'blank', mode == 'select_start' ? 'active' : ''];\n  const endDateClasses = [endDate ? '' : 'blank', mode == 'select_end' ? 'active' : ''];\n  const activeClass = mode == 'inactive' ? '' : 'is-active';\n  const movingClass = movingNext ? 'moving-next' : movingPrev ? 'moving-prev' : '';\n\n  const startDateText = startDate ? (\n    <>\n      <span className=\"day\">{startDate.format(DAY_FORMAT)}</span> {startDate.format(DISPLAY_FORMAT)}\n    </>\n  ) : (\n    startDateDefaultText\n  );\n\n  const endDateText = endDate ? (\n    <>\n      <span className=\"day\">{endDate.format(DAY_FORMAT)}</span> {endDate.format(DISPLAY_FORMAT)}\n    </>\n  ) : (\n    endDateDefaultText\n  );\n\n  return (\n    <div onMouseDown={handleMouseDown} onMouseUp={handleMouseUp}>\n      <div className={`enhanced-dropdown ${activeClass} ${wrapperClass || ''}`}>\n        <div onClick={(event) => makeActive('select_start', event)}>\n          <div className=\"enhanced-dropdown-status subselects\">\n            {canReset && <ResetButton onClick={onResetButtonClick} />}\n            <div className=\"enhanced-dropdown-status-inner\">\n              <div className=\"enhanced-dropdown-status-icon\">\n                <i className=\"fas fa-calendar-alt\" onClick={(event) => makeActive('select_start', event)} />\n              </div>\n              <span className=\"inline-flex flex-center flex-wrap py-1 full-width\">\n                <span className={`period-selector-date my-px ${startDateClasses.join(' ')}`} role=\"button\">\n                  {startDateText}\n                </span>\n                <i className=\"fas fa-long-arrow-alt-right mx-2.5 my-px\" />\n                <span\n                  className={`period-selector-date my-px ${endDateClasses.join(' ')}`}\n                  role=\"button\"\n                  onClick={(event) => makeActive('select_end', event)}\n                >\n                  {endDateText}\n                </span>\n              </span>\n            </div>\n          </div>\n        </div>\n\n        <div className=\"enhanced-dropdown-select\">\n          <div className=\"period-select calendar\">\n            <button\n              className=\"p-0 w-9 h-9 flex-center border border-gray-400 hover:bg-gray-100 rounded-full period-select-next\"\n              onClick={handleNextMonthClick}\n              type=\"button\"\n            >\n              <i className=\"fa fa-caret-right w-4\" />\n            </button>\n            <button\n              className=\"p-0 w-9 h-9 flex-center border border-gray-400 hover:bg-gray-100 rounded-full period-select-prev\"\n              onClick={handlePrevMonthClick}\n              type=\"button\"\n            >\n              <i className=\"fa fa-caret-left w-4\" />\n            </button>\n            <div className=\"period-select-months-container\">\n              <div className={`period-select-months ${movingClass}`}>\n                <Months\n                  activeMonthDate={activeMonthDate}\n                  startDate={startDate}\n                  endDate={endDate}\n                  hoverDate={hoverDate}\n                  mode={mode}\n                  holidays={holidays}\n                  minDate={minDate}\n                  maxDate={maxDate}\n                  maxDuration={maxDuration}\n                  onSelectStartDate={handleSelectStartDate}\n                  onSelectEndDate={handleSelectEndDate}\n                  onHoverDate={setHoverDate}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction ResetButton({ onClick }) {\n  return (\n    <div className=\"pull-right enhanced-dropdown-op\" onClick={onClick}>\n      <i className=\"fa fa-times\"></i>\n    </div>\n  );\n}\n\nfunction Months({\n  activeMonthDate,\n  startDate,\n  endDate,\n  hoverDate,\n  mode,\n  holidays,\n  minDate,\n  maxDate,\n  maxDuration,\n  onSelectStartDate,\n  onSelectEndDate,\n  onHoverDate,\n}) {\n  return (\n    <>\n      {[-1, 0, 1, 2].map((offset) => (\n        <Month\n          key={offset}\n          monthDate={activeMonthDate.clone().add(offset, 'months')}\n          startDate={startDate}\n          endDate={endDate}\n          hoverDate={hoverDate}\n          mode={mode}\n          holidays={holidays}\n          minDate={minDate}\n          maxDate={maxDate}\n          maxDuration={maxDuration}\n          onSelectStartDate={onSelectStartDate}\n          onSelectEndDate={onSelectEndDate}\n          onHoverDate={onHoverDate}\n        />\n      ))}\n    </>\n  );\n}\n\nfunction generateDayLabels() {\n  const now = moment().startOf('week').add(-1, 'days');\n\n  return (\n    <>\n      {[0, 1, 2, 3, 4, 5, 6].map((i) => (\n        <td key={i} className=\"calendar-day-label\">\n          {now.add(1, 'days').format('dd')}\n        </td>\n      ))}\n    </>\n  );\n}\n\nfunction Month({\n  monthDate,\n  startDate,\n  endDate,\n  hoverDate,\n  mode,\n  holidays,\n  minDate,\n  maxDate,\n  maxDuration,\n  onSelectStartDate,\n  onSelectEndDate,\n  onHoverDate,\n}) {\n  const dayLabels = useMemo(() => generateDayLabels());\n\n  return (\n    <div className=\"calendar-month calendar-month-block period-select-month\">\n      <div className=\"calendar-month-title\">{monthDate.format('MMMM YYYY')}</div>\n      <table className=\"table-fixed\">\n        <tbody>\n          <tr>{dayLabels}</tr>\n          <Weeks\n            monthDate={monthDate}\n            startDate={startDate}\n            endDate={endDate}\n            hoverDate={hoverDate}\n            mode={mode}\n            holidays={holidays}\n            minDate={minDate}\n            maxDate={maxDate}\n            maxDuration={maxDuration}\n            onSelectStartDate={onSelectStartDate}\n            onSelectEndDate={onSelectEndDate}\n            onHoverDate={onHoverDate}\n          />\n          <PlaceholderRows monthDate={monthDate} />\n        </tbody>\n      </table>\n    </div>\n  );\n}\n\nfunction weekDates(monthDate) {\n  let currentDate = monthDate.clone().startOf('month').startOf('week');\n  let weekDates = [];\n\n  while (currentDate.isSameOrBefore(monthDate, 'month')) {\n    weekDates.push([0, 1, 2, 3, 4, 5, 6].map((i) => currentDate.clone().add(i, 'days')));\n    currentDate.add(7, 'days');\n  }\n\n  return weekDates;\n}\n\nfunction Weeks({\n  monthDate,\n  startDate,\n  endDate,\n  hoverDate,\n  mode,\n  holidays,\n  minDate,\n  maxDate,\n  maxDuration,\n  onSelectStartDate,\n  onSelectEndDate,\n  onHoverDate,\n}) {\n  return (\n    <>\n      {weekDates(monthDate).map((week) => (\n        <tr key={week[0].format('YYYY-MM-DD')}>\n          {week.map((day) => (\n            <PeriodSelectorDay\n              key={day.format('YYYY-MM-DD')}\n              startDate={startDate}\n              endDate={endDate}\n              hoverDate={hoverDate}\n              mode={mode}\n              holidays={holidays}\n              day={day}\n              monthDate={monthDate}\n              minDate={minDate}\n              maxDate={maxDate}\n              maxDuration={maxDuration}\n              onSelectStartDate={onSelectStartDate}\n              onSelectEndDate={onSelectEndDate}\n              onHoverDate={onHoverDate}\n            />\n          ))}\n        </tr>\n      ))}\n    </>\n  );\n}\n\nfunction PlaceholderRows({ monthDate }) {\n  const rowsCount = 6 - weekDates(monthDate).length;\n\n  return (\n    <>\n      {[...Array(rowsCount)].map((_, i) => (\n        <PlaceholderRow key={i} />\n      ))}\n    </>\n  );\n}\n\nfunction PlaceholderRow() {\n  return (\n    <tr>\n      {[0, 1, 2, 3, 4, 5, 6].map((i) => (\n        <td key={i} className=\"calendar-placeholder\" style={{ border: '1px transparent solid' }} />\n      ))}\n    </tr>\n  );\n}\n", "import React from 'react';\n\nexport default function PeriodSelectorDay({\n  startDate,\n  endDate,\n  hoverDate,\n  mode,\n  holidays,\n  day,\n  monthDate,\n  minDate,\n  maxDate,\n  maxDuration,\n  onSelectStartDate,\n  onSelectEndDate,\n  onHoverDate,\n}) {\n  const sameMonth = day.isSame(monthDate, 'month');\n  const isAfterStart = startDate && day.isAfter(startDate);\n  const isAfterMinDate = minDate ? day.isSameOrAfter(minDate) : true;\n  const isBeforeMaxDate =\n    maxDate && day.isSameOrBefore(maxDate) && (!maxDuration || mode !== 'select_end' || day.diff(startDate, 'days') <= maxDuration);\n\n  function handleMouseEnter() {\n    if (isAfterStart) onHoverDate(day);\n  }\n\n  function handleClick() {\n    if (isAfterMinDate && isBeforeMaxDate) {\n      if (isAfterStart) {\n        if (mode === 'select_start') {\n          onSelectStartDate(day);\n          onHoverDate(null);\n        } else {\n          onSelectEndDate(day);\n          onHoverDate(null);\n        }\n      } else {\n        onSelectStartDate(day);\n        onHoverDate(null);\n      }\n    }\n  }\n\n  return (\n    <td\n      title={day.date()}\n      className={dayClass({ sameMonth, isAfterMinDate, isBeforeMaxDate, startDate, endDate, hoverDate, isAfterStart, day })}\n      onMouseEnter={handleMouseEnter}\n      onClick={handleClick}\n    >\n      {sameMonth &&\n        (isAfterMinDate && isBeforeMaxDate ? (\n          <>\n            <a role=\"button\" aria-label={day.format('LL')}>\n              {day.date()}\n            </a>\n            {maybeRenderHolidayBar({ holidays, day })}\n          </>\n        ) : (\n          day.date()\n        ))}\n    </td>\n  );\n}\n\nfunction maybeRenderHolidayBar({ holidays, day }) {\n  if (holidays.some((holiday) => day.isSame(holiday))) {\n    return <HolidayBar />;\n  } else {\n    return null;\n  }\n}\n\nfunction HolidayBar() {\n  return (\n    <div className=\"calendar-day-bar clearfix\">\n      <div className=\"calendar-day-bar-section calendar-day-holiday col-xs-12 p-0\"></div>\n    </div>\n  );\n}\n\nfunction dayClass({ sameMonth, isAfterMinDate, isBeforeMaxDate, startDate, endDate, hoverDate, isAfterStart, day }) {\n  let dayClass = '';\n\n  if (!sameMonth) {\n    dayClass = 'calendar-placeholder';\n  } else if (isAfterMinDate && isBeforeMaxDate) {\n    let stateClass = '';\n\n    if (startDate) {\n      if (day.isSame(startDate, 'day')) {\n        stateClass = 'calendar-selected-start';\n      } else if (endDate) {\n        if (day.isSame(endDate, 'day')) {\n          stateClass = 'calendar-selected-end';\n        } else if (day.isBetween(startDate, endDate)) {\n          stateClass = 'calendar-selected';\n        }\n      } else if (hoverDate) {\n        if (isAfterStart) {\n          if (day.isSame(hoverDate, 'day')) {\n            stateClass = 'calendar-selected-end';\n          } else if (day.isBefore(hoverDate)) {\n            stateClass = 'calendar-selected';\n          }\n        }\n      }\n    }\n\n    dayClass = 'calendar-available' + (stateClass ? ' ' + stateClass : '');\n  } else {\n    dayClass = 'calendar-too-early';\n  }\n\n  return dayClass;\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['trigger'];\n  static values = { key: String, isPreview: Boolean, triggeredBy: String };\n\n  connect() {\n    if (this.isPreview() || this.triggeredByValue === 'button') {\n      this.showModal();\n    } else {\n      if (this.wasNotSeenYet()) {\n        this.showModal();\n        this.markSeen();\n      }\n    }\n  }\n\n  showModal() {\n    this.triggerTarget.click();\n  }\n\n  isPreview() {\n    return !!this.isPreviewValue;\n  }\n\n  markSeen() {\n    let seenPopUps = this.getSeenPopUps();\n    seenPopUps.push(this.keyValue);\n    localStorage.setItem('seen_pop_ups', JSON.stringify(seenPopUps));\n  }\n\n  wasNotSeenYet() {\n    return !this.getSeenPopUps().includes(this.keyValue);\n  }\n\n  getSeenPopUps() {\n    return JSON.parse(localStorage.getItem('seen_pop_ups')) || [];\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['widget'];\n  static values = {\n    siteKey: String,\n    action: String,\n  };\n\n  handleSubmit(event) {\n    event.preventDefault();\n\n    grecaptcha.enterprise.ready(() => {\n      grecaptcha.enterprise.execute(this.siteKeyValue, { action: this.actionValue }).then((token) => {\n        this.widgetTarget.value = token;\n        Turbo.navigator.submitForm(this.element);\n      });\n    });\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['slide', 'indicator'];\n  static classes = ['active'];\n\n  // Lifecycle setup\n\n  connect() {\n    this.activate(0);\n    this.startRotation();\n\n    this.boundHandleNextPreviousKeys = this.handleNextPreviousKeys.bind(this);\n    document.addEventListener('keydown', this.boundHandleNextPreviousKeys);\n\n    this.boundHandleNextPreviousFlick = this.handleNextPreviousFlick.bind(this);\n    document.addEventListener('flick', this.boundHandleNextPreviousFlick);\n\n    this.boundStopRotation = this.stopRotation.bind(this);\n    this.element.addEventListener('mouseenter', this.boundStopRotation);\n\n    this.boundStartRotation = this.startRotation.bind(this);\n    this.element.addEventListener('mouseleave', this.boundStartRotation);\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.boundHandleNextPreviousKeys);\n    document.removeEventListener('flick', this.boundHandleNextPreviousFlick);\n\n    this.element.removeEventListener('mouseenter', this.boundStopRotation);\n    this.element.removeEventListener('mouseleave', this.boundStartRotation);\n  }\n\n  // Lifecycle functions\n\n  handleNextPreviousKeys(event) {\n    if (event.code == 'ArrowRight') this.next();\n    if (event.code == 'ArrowLeft') this.previous();\n  }\n\n  handleNextPreviousFlick(event) {\n    if (event.direction == -1) this.next();\n    if (event.direction == 1) this.previous();\n  }\n\n  startRotation() {\n    this.rotationTimeout = window.setTimeout(() => {\n      this.next();\n      this.startRotation();\n    }, 5000);\n  }\n\n  stopRotation() {\n    window.clearTimeout(this.rotationTimeout);\n  }\n\n  // Activation\n\n  previous() {\n    this.activate(this.index - 1);\n  }\n\n  next() {\n    this.activate(this.index + 1);\n  }\n\n  activate(index) {\n    // Wrap around (using JS remainder (%) to create a modulo)\n    index = ((index % this.slideTargets.length) + this.slideTargets.length) % this.slideTargets.length;\n\n    // Keep track of current and previous indices\n    this.previousIndex = typeof this.index == 'undefined' ? index : this.index;\n    this.index = index;\n\n    // Set indicator, i.e. 1/4\n    if (this.hasIndicatorTarget) {\n      this.indicatorTarget.innerHTML = `${index + 1}/${this.slideTargets.length}`;\n    }\n\n    // Manage active class and z-index\n    this.slideTargets.forEach((slide, index) => {\n      if (index == this.index) {\n        // Fade in current slide if it changed\n        if (this.previousIndex != this.index) {\n          var fadeInStart = new Date();\n          var fadeInStep = () => {\n            slide.style.opacity = (new Date() - fadeInStart) / 200; // Fade in over 200ms\n            if (slide.style.opacity <= 1) window.requestAnimationFrame(fadeInStep);\n            else slide.style.opacity = null;\n          };\n          fadeInStep();\n        }\n\n        // Current slide gets z-index 2\n        slide.style.zIndex = 2;\n      } else {\n        // Previous slide gets z-index 1, other slides get z-index 0\n        slide.style.zIndex = index == this.previousIndex ? 1 : 0;\n      }\n    });\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static classes = ['stuck'];\n  static targets = ['sticky', 'offset'];\n\n  connect() {\n    this.boundToggleStuck = this.toggleStuck.bind(this);\n    document.addEventListener('scroll', this.boundToggleStuck);\n\n    this.boundSetOffset = this.setOffset.bind(this);\n    window.addEventListener('resize', this.boundSetOffset);\n\n    setTimeout(() => this.setOffset(), 10); // Small delay allows offsetTarget size to stabilize on load\n    this.toggleStuck();\n  }\n\n  disconnect() {\n    document.removeEventListener('scroll', this.boundToggleStuck);\n    window.removeEventListener('resize', this.boundSetOffset);\n  }\n\n  setOffset() {\n    if (this.hasOffsetTarget) {\n      this.offset = this.offsetTarget.getBoundingClientRect().bottom;\n      this.stickyTarget.style.top = this.offset + 'px';\n    } else {\n      this.offset = 0;\n    }\n  }\n\n  toggleStuck() {\n    // Position fixed means a modal is open\n    if (document.body.style.position === 'fixed') return;\n\n    const stuck =\n      getComputedStyle(this.stickyTarget).position == 'sticky' &&\n      this.stickyTarget.getBoundingClientRect().top <= this.offset + 1 && // <= and +1 prevents flicker\n      window.scrollY > 0; // Must not be scrolled to top of page (a nav bar without a top bar starts at stuck position)\n\n    if (this.stuck != stuck) {\n      this.stuckClasses.forEach((className) => this.element.classList.toggle(className, stuck));\n      this.stuck = stuck;\n      window.dispatchEvent(new CustomEvent('toggle-stuck'));\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    const eligibleElements = this.element.querySelectorAll('a:not([data-turbo]), input[type=\"submit\"]:not([data-turbo])');\n    eligibleElements.forEach((element) => element.setAttribute('data-turbo', 'false'));\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport { get } from '@rails/request.js';\nimport { TurboRequestCache } from './turbo_request_cache';\nimport debounce from 'lodash.debounce';\n\nexport default class extends Controller {\n  static values = { performUrl: String, errorUrl: String };\n\n  connect() {\n    this.requestCache = new TurboRequestCache(this.element);\n\n    this.element.addEventListener('turbo:morph-element', this.handleTurboMorphElement);\n    addEventListener('popstate', this.handlePopState);\n\n    this.performRequest();\n  }\n\n  disconnect() {\n    this.element.removeEventListener('turbo:morph-element', this.handleTurboMorphElement);\n    removeEventListener('popstate', this.handlePopState);\n  }\n\n  handleTurboStreamsProcessed = () => {\n    this.requestCache.store();\n  };\n\n  // Skip one frame to allow turbo stream processing to complete\n  handleTurboMorphElement = debounce(this.handleTurboStreamsProcessed, 0);\n\n  handlePopState = () => {\n    this.requestCache.restore() || this.performRequest();\n  };\n\n  async performRequest() {\n    Turbo.session.adapter.showVisitProgressBarAfterDelay();\n\n    try {\n      const params = new URLSearchParams(window.location.search);\n      const response = await get(this.performUrlValue, { query: params, responseKind: 'turbo-stream' });\n\n      if (response.ok) {\n        document.getElementById(params.get('anchor'))?.scrollIntoView({ behavior: 'smooth' });\n      } else {\n        this.handleError();\n      }\n    } catch (error) {\n      this.handleError();\n    } finally {\n      Turbo.session.adapter.hideVisitProgressBar();\n    }\n  }\n\n  handleError() {\n    get(this.errorUrlValue, { responseKind: 'turbo-stream' });\n  }\n}\n", "/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n  \"use strict\";\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (activeElementId && activeElementId !== document.activeElement?.id) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element && ctx.persistentIds.has(newChild.id)) {\n          // move it and all its children here and morph\n          const movedChild = moveBeforeById(\n            oldParent,\n            newChild.id,\n            insertionPoint,\n            ctx,\n          );\n          morphNode(movedChild, newChild, ctx);\n          insertionPoint = movedChild.nextSibling;\n          continue;\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          if (cursor.contains(document.activeElement)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          (!oldElt.id || oldElt.id === newElt.id)\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          (ctx.target.id === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      const id = element.id;\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) {\n        // ignore the head element\n      } else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      if (root.id) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        if (persistentIds.has(elt.id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(elt.id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\nexport {Idiomorph};\n", "import { Idiomorph } from 'idiomorph';\n\nexport class TurboRequestCache {\n  constructor(element) {\n    this.element = element;\n    this.cache = new Map();\n  }\n\n  store() {\n    // Let's not update the cache if we're still at the same location\n    if (this.lastStoredKey === this.locationKey) return;\n\n    this.cache.set(this.locationKey, this.element.outerHTML);\n    this.lastStoredKey = this.locationKey;\n  }\n\n  restore() {\n    if (this.cache.has(this.locationKey)) {\n      Idiomorph.morph(this.element, this.cache.get(this.locationKey));\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  get locationKey() {\n    return window.location.href;\n  }\n}\n", "// https://caniuse.com/mdn-javascript_builtins_number_isfinite\nexport const isFiniteNumber =\n  Number.isFinite ||\n  function (value) {\n    return typeof value === 'number' && isFinite(value);\n  };\n\n// https://caniuse.com/mdn-javascript_builtins_number_issafeinteger\nexport const isSafeInteger =\n  Number.isSafeInteger ||\n  function (value) {\n    return typeof value === 'number' && Math.abs(value) <= MAX_SAFE_INTEGER;\n  };\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n", "export enum ErrorTypes {\n  // Identifier for a network error (loading error / timeout ...)\n  NETWORK_ERROR = 'networkError',\n  // Identifier for a media Error (video/parsing/mediasource error)\n  MEDIA_ERROR = 'mediaError',\n  // EME (encrypted media extensions) errors\n  KEY_SYSTEM_ERROR = 'keySystemError',\n  // Identifier for a mux Error (demuxing/remuxing)\n  MUX_ERROR = 'muxError',\n  // Identifier for all other errors\n  OTHER_ERROR = 'otherError',\n}\n\nexport enum ErrorDetails {\n  KEY_SYSTEM_NO_KEYS = 'keySystemNoKeys',\n  KEY_SYSTEM_NO_ACCESS = 'keySystemNoAccess',\n  KEY_SYSTEM_NO_SESSION = 'keySystemNoSession',\n  KEY_SYSTEM_NO_CONFIGURED_LICENSE = 'keySystemNoConfiguredLicense',\n  KEY_SYSTEM_LICENSE_REQUEST_FAILED = 'keySystemLicenseRequestFailed',\n  KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED = 'keySystemServerCertificateRequestFailed',\n  KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED = 'keySystemServerCertificateUpdateFailed',\n  KEY_SYSTEM_SESSION_UPDATE_FAILED = 'keySystemSessionUpdateFailed',\n  KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED = 'keySystemStatusOutputRestricted',\n  KEY_SYSTEM_STATUS_INTERNAL_ERROR = 'keySystemStatusInternalError',\n  KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR = 'keySystemDestroyMediaKeysError',\n  KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR = 'keySystemDestroyCloseSessionError',\n  KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR = 'keySystemDestroyRemoveSessionError',\n  // Identifier for a manifest load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n  MANIFEST_LOAD_ERROR = 'manifestLoadError',\n  // Identifier for a manifest load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n  MANIFEST_LOAD_TIMEOUT = 'manifestLoadTimeOut',\n  // Identifier for a manifest parsing error - data: { url : faulty URL, reason : error reason}\n  MANIFEST_PARSING_ERROR = 'manifestParsingError',\n  // Identifier for a manifest with only incompatible codecs error - data: { url : faulty URL, reason : error reason}\n  MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifestIncompatibleCodecsError',\n  // Identifier for a level which contains no fragments - data: { url: faulty URL, reason: \"no fragments found in level\", level: index of the bad level }\n  LEVEL_EMPTY_ERROR = 'levelEmptyError',\n  // Identifier for a level load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n  LEVEL_LOAD_ERROR = 'levelLoadError',\n  // Identifier for a level load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n  LEVEL_LOAD_TIMEOUT = 'levelLoadTimeOut',\n  // Identifier for a level parse error - data: { url : faulty URL, error: Error, reason: error message }\n  LEVEL_PARSING_ERROR = 'levelParsingError',\n  // Identifier for a level switch error - data: { level : faulty level Id, event : error description}\n  LEVEL_SWITCH_ERROR = 'levelSwitchError',\n  // Identifier for an audio track load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n  AUDIO_TRACK_LOAD_ERROR = 'audioTrackLoadError',\n  // Identifier for an audio track load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n  AUDIO_TRACK_LOAD_TIMEOUT = 'audioTrackLoadTimeOut',\n  // Identifier for a subtitle track load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n  SUBTITLE_LOAD_ERROR = 'subtitleTrackLoadError',\n  // Identifier for a subtitle track load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n  SUBTITLE_TRACK_LOAD_TIMEOUT = 'subtitleTrackLoadTimeOut',\n  // Identifier for fragment load error - data: { frag : fragment object, response : { code: error code, text: error text }}\n  FRAG_LOAD_ERROR = 'fragLoadError',\n  // Identifier for fragment load timeout error - data: { frag : fragment object}\n  FRAG_LOAD_TIMEOUT = 'fragLoadTimeOut',\n  // Identifier for a fragment decryption error event - data: {id : demuxer Id,frag: fragment object, reason : parsing error description }\n  FRAG_DECRYPT_ERROR = 'fragDecryptError',\n  // Identifier for a fragment parsing error event - data: { id : demuxer Id, reason : parsing error description }\n  // will be renamed DEMUX_PARSING_ERROR and switched to MUX_ERROR in the next major release\n  FRAG_PARSING_ERROR = 'fragParsingError',\n  // Identifier for a fragment or part load skipped because of a GAP tag or attribute\n  FRAG_GAP = 'fragGap',\n  // Identifier for a remux alloc error event - data: { id : demuxer Id, frag : fragment object, bytes : nb of bytes on which allocation failed , reason : error text }\n  REMUX_ALLOC_ERROR = 'remuxAllocError',\n  // Identifier for decrypt key load error - data: { frag : fragment object, response : { code: error code, text: error text }}\n  KEY_LOAD_ERROR = 'keyLoadError',\n  // Identifier for decrypt key load timeout error - data: { frag : fragment object}\n  KEY_LOAD_TIMEOUT = 'keyLoadTimeOut',\n  // Triggered when an exception occurs while adding a sourceBuffer to MediaSource - data : { error : exception , mimeType : mimeType }\n  BUFFER_ADD_CODEC_ERROR = 'bufferAddCodecError',\n  // Triggered when source buffer(s) could not be created using level (manifest CODECS attribute), parsed media, or best guess codec(s) - data: { reason : error reason }\n  BUFFER_INCOMPATIBLE_CODECS_ERROR = 'bufferIncompatibleCodecsError',\n  // Identifier for a buffer append error - data: append error description\n  BUFFER_APPEND_ERROR = 'bufferAppendError',\n  // Identifier for a buffer appending error event - data: appending error description\n  BUFFER_APPENDING_ERROR = 'bufferAppendingError',\n  // Identifier for a buffer stalled error event\n  BUFFER_STALLED_ERROR = 'bufferStalledError',\n  // Identifier for a buffer full event\n  BUFFER_FULL_ERROR = 'bufferFullError',\n  // Identifier for a buffer seek over hole event\n  BUFFER_SEEK_OVER_HOLE = 'bufferSeekOverHole',\n  // Identifier for a buffer nudge on stall (playback is stuck although currentTime is in a buffered area)\n  BUFFER_NUDGE_ON_STALL = 'bufferNudgeOnStall',\n  // Identifier for a Interstitial Asset List load error - data: { url: faulty URL, response: { code: error code, text: error text } }\n  ASSET_LIST_LOAD_ERROR = 'assetListLoadError',\n  // Identifier for a Interstitial Asset List load timeout - data: { url: faulty URL, response: { code: error code, text: error text } }\n  ASSET_LIST_LOAD_TIMEOUT = 'assetListLoadTimeout',\n  // Identifier for a Interstitial Asset List parsing error - data: { url : faulty URL, reason : error reason, response : { code: error code, text: error text }}\n  ASSET_LIST_PARSING_ERROR = 'assetListParsingError',\n  // Identifier for a Interstitial Asset List parsing error - data: { url : faulty URL, reason : error reason, response : { code: error code, text: error text }}\n  INTERSTITIAL_ASSET_ITEM_ERROR = 'interstitialAssetItemError',\n  // Identifier for an internal exception happening inside hls.js while handling an event\n  INTERNAL_EXCEPTION = 'internalException',\n  // Identifier for an internal call to abort a loader\n  INTERNAL_ABORTED = 'aborted',\n  // Triggered when attachMedia fails\n  ATTACH_MEDIA_ERROR = 'attachMediaError',\n  // Uncategorized error\n  UNKNOWN = 'unknown',\n}\n", "import type {\n  AssetListLoadedData,\n  AssetListLoadingData,\n  AudioTrackLoadedData,\n  AudioTracksUpdatedData,\n  AudioTrackSwitchedData,\n  AudioTrackSwitchingData,\n  AudioTrackUpdatedData,\n  BackBufferData,\n  BufferAppendedData,\n  BufferAppendingData,\n  BufferCodecsData,\n  BufferCreatedData,\n  BufferEOSData,\n  BufferFlushedData,\n  BufferFlushingData,\n  CuesParsedData,\n  ErrorData,\n  FPSDropData,\n  FPSDropLevelCappingData,\n  FragBufferedData,\n  FragChangedData,\n  FragDecryptedData,\n  FragLoadedData,\n  FragLoadEmergencyAbortedData,\n  FragLoadingData,\n  FragParsedData,\n  FragParsingInitSegmentData,\n  FragParsingMetadataData,\n  FragParsingUserdataData,\n  InitPTSFoundData,\n  InterstitialAssetEndedData,\n  InterstitialAssetErrorData,\n  InterstitialAssetPlayerCreatedData,\n  InterstitialAssetStartedData,\n  InterstitialEndedData,\n  InterstitialsBufferedToBoundaryData,\n  InterstitialsPrimaryResumed,\n  InterstitialStartedData,\n  InterstitialsUpdatedData,\n  KeyLoadedData,\n  KeyLoadingData,\n  LevelLoadedData,\n  LevelLoadingData,\n  LevelPTSUpdatedData,\n  LevelsUpdatedData,\n  LevelSwitchedData,\n  LevelSwitchingData,\n  LevelUpdatedData,\n  LiveBackBufferData,\n  ManifestLoadedData,\n  ManifestLoadingData,\n  ManifestParsedData,\n  MaxAutoLevelUpdatedData,\n  MediaAttachedData,\n  MediaAttachingData,\n  MediaDetachedData,\n  MediaDetachingData,\n  MediaEndedData,\n  NonNativeTextTracksData,\n  SteeringManifestLoadedData,\n  SubtitleFragProcessedData,\n  SubtitleTrackLoadedData,\n  SubtitleTracksUpdatedData,\n  SubtitleTrackSwitchData,\n  SubtitleTrackUpdatedData,\n  TrackLoadingData,\n} from './types/events';\n\nexport enum Events {\n  // Fired before MediaSource is attaching to media element\n  MEDIA_ATTACHING = 'hlsMediaAttaching',\n  // Fired when MediaSource has been successfully attached to media element\n  MEDIA_ATTACHED = 'hlsMediaAttached',\n  // Fired before detaching MediaSource from media element\n  MEDIA_DETACHING = 'hlsMediaDetaching',\n  // Fired when MediaSource has been detached from media element\n  MEDIA_DETACHED = 'hlsMediaDetached',\n  // Fired when HTMLMediaElement dispatches \"ended\" event, or stalls at end of VOD program\n  MEDIA_ENDED = 'hlsMediaEnded',\n  // Fired after playback stall is resolved with playing, seeked, or ended event following BUFFER_STALLED_ERROR\n  STALL_RESOLVED = 'hlsStallResolved',\n  // Fired when the buffer is going to be reset\n  BUFFER_RESET = 'hlsBufferReset',\n  // Fired when we know about the codecs that we need buffers for to push into - data: {tracks : { container, codec, levelCodec, initSegment, metadata }}\n  BUFFER_CODECS = 'hlsBufferCodecs',\n  // fired when sourcebuffers have been created - data: { tracks : tracks }\n  BUFFER_CREATED = 'hlsBufferCreated',\n  // fired when we append a segment to the buffer - data: { segment: segment object }\n  BUFFER_APPENDING = 'hlsBufferAppending',\n  // fired when we are done with appending a media segment to the buffer - data : { parent : segment parent that triggered BUFFER_APPENDING, pending : nb of segments waiting for appending for this segment parent}\n  BUFFER_APPENDED = 'hlsBufferAppended',\n  // fired when the stream is finished and we want to notify the media buffer that there will be no more data - data: { }\n  BUFFER_EOS = 'hlsBufferEos',\n  // fired when all buffers are full to the end of the program, after calling MediaSource.endOfStream() (unless restricted)\n  BUFFERED_TO_END = 'hlsBufferedToEnd',\n  // fired when the media buffer should be flushed - data { startOffset, endOffset }\n  BUFFER_FLUSHING = 'hlsBufferFlushing',\n  // fired when the media buffer has been flushed - data: { }\n  BUFFER_FLUSHED = 'hlsBufferFlushed',\n  // fired to signal that a manifest loading starts - data: { url : manifestURL}\n  MANIFEST_LOADING = 'hlsManifestLoading',\n  // fired after manifest has been loaded - data: { levels : [available quality levels], audioTracks : [ available audio tracks ], url : manifestURL, stats : LoaderStats }\n  MANIFEST_LOADED = 'hlsManifestLoaded',\n  // fired after manifest has been parsed - data: { levels : [available quality levels], firstLevel : index of first quality level appearing in Manifest}\n  MANIFEST_PARSED = 'hlsManifestParsed',\n  // fired when a level switch is requested - data: { level : id of new level }\n  LEVEL_SWITCHING = 'hlsLevelSwitching',\n  // fired when a level switch is effective - data: { level : id of new level }\n  LEVEL_SWITCHED = 'hlsLevelSwitched',\n  // fired when a level playlist loading starts - data: { url : level URL, level : id of level being loaded}\n  LEVEL_LOADING = 'hlsLevelLoading',\n  // fired when a level playlist loading finishes - data: { details : levelDetails object, level : id of loaded level, stats : LoaderStats }\n  LEVEL_LOADED = 'hlsLevelLoaded',\n  // fired when a level's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, level : id of updated level }\n  LEVEL_UPDATED = 'hlsLevelUpdated',\n  // fired when a level's PTS information has been updated after parsing a fragment - data: { details : levelDetails object, level : id of updated level, drift: PTS drift observed when parsing last fragment }\n  LEVEL_PTS_UPDATED = 'hlsLevelPtsUpdated',\n  // fired to notify that levels have changed after removing a level - data: { levels : [available quality levels] }\n  LEVELS_UPDATED = 'hlsLevelsUpdated',\n  // fired to notify that audio track lists has been updated - data: { audioTracks : audioTracks }\n  AUDIO_TRACKS_UPDATED = 'hlsAudioTracksUpdated',\n  // fired when an audio track switching is requested - data: { id : audio track id }\n  AUDIO_TRACK_SWITCHING = 'hlsAudioTrackSwitching',\n  // fired when an audio track switch actually occurs - data: { id : audio track id }\n  AUDIO_TRACK_SWITCHED = 'hlsAudioTrackSwitched',\n  // fired when an audio track loading starts - data: { url : audio track URL, id : audio track id }\n  AUDIO_TRACK_LOADING = 'hlsAudioTrackLoading',\n  // fired when an audio track loading finishes - data: { details : levelDetails object, id : audio track id, stats : LoaderStats }\n  AUDIO_TRACK_LOADED = 'hlsAudioTrackLoaded',\n  // fired when an audio tracks's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, id : track id }\n  AUDIO_TRACK_UPDATED = 'hlsAudioTrackUpdated',\n  // fired to notify that subtitle track lists has been updated - data: { subtitleTracks : subtitleTracks }\n  SUBTITLE_TRACKS_UPDATED = 'hlsSubtitleTracksUpdated',\n  // fired to notify that subtitle tracks were cleared as a result of stopping the media\n  SUBTITLE_TRACKS_CLEARED = 'hlsSubtitleTracksCleared',\n  // fired when an subtitle track switch occurs - data: { id : subtitle track id }\n  SUBTITLE_TRACK_SWITCH = 'hlsSubtitleTrackSwitch',\n  // fired when a subtitle track loading starts - data: { url : subtitle track URL, id : subtitle track id }\n  SUBTITLE_TRACK_LOADING = 'hlsSubtitleTrackLoading',\n  // fired when a subtitle track loading finishes - data: { details : levelDetails object, id : subtitle track id, stats : LoaderStats }\n  SUBTITLE_TRACK_LOADED = 'hlsSubtitleTrackLoaded',\n  // fired when a subtitle  racks's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, id : track id }\n  SUBTITLE_TRACK_UPDATED = 'hlsSubtitleTrackUpdated',\n  // fired when a subtitle fragment has been processed - data: { success : boolean, frag : the processed frag }\n  SUBTITLE_FRAG_PROCESSED = 'hlsSubtitleFragProcessed',\n  // fired when a set of VTTCues to be managed externally has been parsed - data: { type: string, track: string, cues: [ VTTCue ] }\n  CUES_PARSED = 'hlsCuesParsed',\n  // fired when a text track to be managed externally is found - data: { tracks: [ { label: string, kind: string, default: boolean } ] }\n  NON_NATIVE_TEXT_TRACKS_FOUND = 'hlsNonNativeTextTracksFound',\n  // fired when the first timestamp is found - data: { id : demuxer id, initPTS: initPTS, timescale: timescale, frag : fragment object }\n  INIT_PTS_FOUND = 'hlsInitPtsFound',\n  // fired when a fragment loading starts - data: { frag : fragment object }\n  FRAG_LOADING = 'hlsFragLoading',\n  // fired when a fragment loading is progressing - data: { frag : fragment object, { trequest, tfirst, loaded } }\n  // FRAG_LOAD_PROGRESS = 'hlsFragLoadProgress',\n  // Identifier for fragment load aborting for emergency switch down - data: { frag : fragment object }\n  FRAG_LOAD_EMERGENCY_ABORTED = 'hlsFragLoadEmergencyAborted',\n  // fired when a fragment loading is completed - data: { frag : fragment object, payload : fragment payload, stats : LoaderStats }\n  FRAG_LOADED = 'hlsFragLoaded',\n  // fired when a fragment has finished decrypting - data: { id : demuxer id, frag: fragment object, payload : fragment payload, stats : { tstart, tdecrypt } }\n  FRAG_DECRYPTED = 'hlsFragDecrypted',\n  // fired when Init Segment has been extracted from fragment - data: { id : demuxer id, frag: fragment object, moov : moov MP4 box, codecs : codecs found while parsing fragment }\n  FRAG_PARSING_INIT_SEGMENT = 'hlsFragParsingInitSegment',\n  // fired when parsing sei text is completed - data: { id : demuxer id, frag: fragment object, samples : [ sei samples pes ] }\n  FRAG_PARSING_USERDATA = 'hlsFragParsingUserdata',\n  // fired when parsing id3 is completed - data: { id : demuxer id, frag: fragment object, samples : [ id3 samples pes ] }\n  FRAG_PARSING_METADATA = 'hlsFragParsingMetadata',\n  // fired when data have been extracted from fragment - data: { id : demuxer id, frag: fragment object, data1 : moof MP4 box or TS fragments, data2 : mdat MP4 box or null}\n  // FRAG_PARSING_DATA = 'hlsFragParsingData',\n  // fired when fragment parsing is completed - data: { id : demuxer id, frag: fragment object }\n  FRAG_PARSED = 'hlsFragParsed',\n  // fired when fragment remuxed MP4 boxes have all been appended into SourceBuffer - data: { id : demuxer id, frag : fragment object, stats : LoaderStats }\n  FRAG_BUFFERED = 'hlsFragBuffered',\n  // fired when fragment matching with current media position is changing - data : { id : demuxer id, frag : fragment object }\n  FRAG_CHANGED = 'hlsFragChanged',\n  // Identifier for a FPS drop event - data: { currentDropped, currentDecoded, totalDroppedFrames }\n  FPS_DROP = 'hlsFpsDrop',\n  // triggered when FPS drop triggers auto level capping - data: { level, droppedLevel }\n  FPS_DROP_LEVEL_CAPPING = 'hlsFpsDropLevelCapping',\n  // triggered when maxAutoLevel changes - data { autoLevelCapping, levels, maxAutoLevel, minAutoLevel, maxHdcpLevel }\n  MAX_AUTO_LEVEL_UPDATED = 'hlsMaxAutoLevelUpdated',\n  // Identifier for an error event - data: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }\n  ERROR = 'hlsError',\n  // fired when hls.js instance starts destroying. Different from MEDIA_DETACHED as one could want to detach and reattach a media to the instance of hls.js to handle mid-rolls for example - data: { }\n  DESTROYING = 'hlsDestroying',\n  // fired when a decrypt key loading starts - data: { frag : fragment object }\n  KEY_LOADING = 'hlsKeyLoading',\n  // fired when a decrypt key loading is completed - data: { frag : fragment object, keyInfo : KeyLoaderInfo }\n  KEY_LOADED = 'hlsKeyLoaded',\n  // deprecated; please use BACK_BUFFER_REACHED - data : { bufferEnd: number }\n  LIVE_BACK_BUFFER_REACHED = 'hlsLiveBackBufferReached',\n  // fired when the back buffer is reached as defined by the backBufferLength config option - data : { bufferEnd: number }\n  BACK_BUFFER_REACHED = 'hlsBackBufferReached',\n  // fired after steering manifest has been loaded - data: { steeringManifest: SteeringManifest object, url: steering manifest URL }\n  STEERING_MANIFEST_LOADED = 'hlsSteeringManifestLoaded',\n  // fired when asset list has begun loading\n  ASSET_LIST_LOADING = 'hlsAssetListLoading',\n  // fired when a valid asset list is loaded\n  ASSET_LIST_LOADED = 'hlsAssetListLoaded',\n  // fired when the list of Interstitial Events and Interstitial Schedule is updated\n  INTERSTITIALS_UPDATED = 'hlsInterstitialsUpdated',\n  // fired when the buffer reaches an Interstitial Schedule boundary (both Primary segments and Interstitial Assets)\n  INTERSTITIALS_BUFFERED_TO_BOUNDARY = 'hlsInterstitialsBufferedToBoundary',\n  // fired when a player instance for an Interstitial Asset has been created\n  INTERSTITIAL_ASSET_PLAYER_CREATED = 'hlsInterstitialAssetPlayerCreated',\n  // Interstitial playback started\n  INTERSTITIAL_STARTED = 'hlsInterstitialStarted',\n  // InterstitialAsset playback started\n  INTERSTITIAL_ASSET_STARTED = 'hlsInterstitialAssetStarted',\n  // InterstitialAsset playback ended\n  INTERSTITIAL_ASSET_ENDED = 'hlsInterstitialAssetEnded',\n  // InterstitialAsset playback errored\n  INTERSTITIAL_ASSET_ERROR = 'hlsInterstitialAssetError',\n  // Interstitial playback ended\n  INTERSTITIAL_ENDED = 'hlsInterstitialEnded',\n  // Interstitial schedule resumed primary playback\n  INTERSTITIALS_PRIMARY_RESUMED = 'hlsInterstitialsPrimaryResumed',\n  // Interstitial players dispatch this event when playout limit is reached\n  PLAYOUT_LIMIT_REACHED = 'hlsPlayoutLimitReached',\n  // Event DateRange cue \"enter\" event dispatched\n  EVENT_CUE_ENTER = 'hlsEventCueEnter',\n}\n\n/**\n * Defines each Event type and payload by Event name. Used in {@link hls.js#HlsEventEmitter} to strongly type the event listener API.\n */\nexport interface HlsListeners {\n  [Events.MEDIA_ATTACHING]: (\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ) => void;\n  [Events.MEDIA_ATTACHED]: (\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) => void;\n  [Events.MEDIA_DETACHING]: (\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) => void;\n  [Events.MEDIA_DETACHED]: (\n    event: Events.MEDIA_DETACHED,\n    data: MediaDetachedData,\n  ) => void;\n  [Events.MEDIA_ENDED]: (\n    event: Events.MEDIA_ENDED,\n    data: MediaEndedData,\n  ) => void;\n  [Events.STALL_RESOLVED]: (event: Events.STALL_RESOLVED, data: {}) => void;\n  [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;\n  [Events.BUFFER_CODECS]: (\n    event: Events.BUFFER_CODECS,\n    data: BufferCodecsData,\n  ) => void;\n  [Events.BUFFER_CREATED]: (\n    event: Events.BUFFER_CREATED,\n    data: BufferCreatedData,\n  ) => void;\n  [Events.BUFFER_APPENDING]: (\n    event: Events.BUFFER_APPENDING,\n    data: BufferAppendingData,\n  ) => void;\n  [Events.BUFFER_APPENDED]: (\n    event: Events.BUFFER_APPENDED,\n    data: BufferAppendedData,\n  ) => void;\n  [Events.BUFFER_EOS]: (event: Events.BUFFER_EOS, data: BufferEOSData) => void;\n  [Events.BUFFERED_TO_END]: (event: Events.BUFFERED_TO_END) => void;\n  [Events.BUFFER_FLUSHING]: (\n    event: Events.BUFFER_FLUSHING,\n    data: BufferFlushingData,\n  ) => void;\n  [Events.BUFFER_FLUSHED]: (\n    event: Events.BUFFER_FLUSHED,\n    data: BufferFlushedData,\n  ) => void;\n  [Events.MANIFEST_LOADING]: (\n    event: Events.MANIFEST_LOADING,\n    data: ManifestLoadingData,\n  ) => void;\n  [Events.MANIFEST_LOADED]: (\n    event: Events.MANIFEST_LOADED,\n    data: ManifestLoadedData,\n  ) => void;\n  [Events.MANIFEST_PARSED]: (\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ) => void;\n  [Events.LEVEL_SWITCHING]: (\n    event: Events.LEVEL_SWITCHING,\n    data: LevelSwitchingData,\n  ) => void;\n  [Events.LEVEL_SWITCHED]: (\n    event: Events.LEVEL_SWITCHED,\n    data: LevelSwitchedData,\n  ) => void;\n  [Events.LEVEL_LOADING]: (\n    event: Events.LEVEL_LOADING,\n    data: LevelLoadingData,\n  ) => void;\n  [Events.LEVEL_LOADED]: (\n    event: Events.LEVEL_LOADED,\n    data: LevelLoadedData,\n  ) => void;\n  [Events.LEVEL_UPDATED]: (\n    event: Events.LEVEL_UPDATED,\n    data: LevelUpdatedData,\n  ) => void;\n  [Events.LEVEL_PTS_UPDATED]: (\n    event: Events.LEVEL_PTS_UPDATED,\n    data: LevelPTSUpdatedData,\n  ) => void;\n  [Events.LEVELS_UPDATED]: (\n    event: Events.LEVELS_UPDATED,\n    data: LevelsUpdatedData,\n  ) => void;\n  [Events.AUDIO_TRACKS_UPDATED]: (\n    event: Events.AUDIO_TRACKS_UPDATED,\n    data: AudioTracksUpdatedData,\n  ) => void;\n  [Events.AUDIO_TRACK_SWITCHING]: (\n    event: Events.AUDIO_TRACK_SWITCHING,\n    data: AudioTrackSwitchingData,\n  ) => void;\n  [Events.AUDIO_TRACK_SWITCHED]: (\n    event: Events.AUDIO_TRACK_SWITCHED,\n    data: AudioTrackSwitchedData,\n  ) => void;\n  [Events.AUDIO_TRACK_LOADING]: (\n    event: Events.AUDIO_TRACK_LOADING,\n    data: TrackLoadingData,\n  ) => void;\n  [Events.AUDIO_TRACK_LOADED]: (\n    event: Events.AUDIO_TRACK_LOADED,\n    data: AudioTrackLoadedData,\n  ) => void;\n  [Events.AUDIO_TRACK_UPDATED]: (\n    event: Events.AUDIO_TRACK_UPDATED,\n    data: AudioTrackUpdatedData,\n  ) => void;\n  [Events.SUBTITLE_TRACKS_UPDATED]: (\n    event: Events.SUBTITLE_TRACKS_UPDATED,\n    data: SubtitleTracksUpdatedData,\n  ) => void;\n  [Events.SUBTITLE_TRACKS_CLEARED]: (\n    event: Events.SUBTITLE_TRACKS_CLEARED,\n  ) => void;\n  [Events.SUBTITLE_TRACK_SWITCH]: (\n    event: Events.SUBTITLE_TRACK_SWITCH,\n    data: SubtitleTrackSwitchData,\n  ) => void;\n  [Events.SUBTITLE_TRACK_LOADING]: (\n    event: Events.SUBTITLE_TRACK_LOADING,\n    data: TrackLoadingData,\n  ) => void;\n  [Events.SUBTITLE_TRACK_LOADED]: (\n    event: Events.SUBTITLE_TRACK_LOADED,\n    data: SubtitleTrackLoadedData,\n  ) => void;\n  [Events.SUBTITLE_TRACK_UPDATED]: (\n    event: Events.SUBTITLE_TRACK_UPDATED,\n    data: SubtitleTrackUpdatedData,\n  ) => void;\n  [Events.SUBTITLE_FRAG_PROCESSED]: (\n    event: Events.SUBTITLE_FRAG_PROCESSED,\n    data: SubtitleFragProcessedData,\n  ) => void;\n  [Events.CUES_PARSED]: (\n    event: Events.CUES_PARSED,\n    data: CuesParsedData,\n  ) => void;\n  [Events.NON_NATIVE_TEXT_TRACKS_FOUND]: (\n    event: Events.NON_NATIVE_TEXT_TRACKS_FOUND,\n    data: NonNativeTextTracksData,\n  ) => void;\n  [Events.INIT_PTS_FOUND]: (\n    event: Events.INIT_PTS_FOUND,\n    data: InitPTSFoundData,\n  ) => void;\n  [Events.FRAG_LOADING]: (\n    event: Events.FRAG_LOADING,\n    data: FragLoadingData,\n  ) => void;\n  // [Events.FRAG_LOAD_PROGRESS]: TodoEventType\n  [Events.FRAG_LOAD_EMERGENCY_ABORTED]: (\n    event: Events.FRAG_LOAD_EMERGENCY_ABORTED,\n    data: FragLoadEmergencyAbortedData,\n  ) => void;\n  [Events.FRAG_LOADED]: (\n    event: Events.FRAG_LOADED,\n    data: FragLoadedData,\n  ) => void;\n  [Events.FRAG_DECRYPTED]: (\n    event: Events.FRAG_DECRYPTED,\n    data: FragDecryptedData,\n  ) => void;\n  [Events.FRAG_PARSING_INIT_SEGMENT]: (\n    event: Events.FRAG_PARSING_INIT_SEGMENT,\n    data: FragParsingInitSegmentData,\n  ) => void;\n  [Events.FRAG_PARSING_USERDATA]: (\n    event: Events.FRAG_PARSING_USERDATA,\n    data: FragParsingUserdataData,\n  ) => void;\n  [Events.FRAG_PARSING_METADATA]: (\n    event: Events.FRAG_PARSING_METADATA,\n    data: FragParsingMetadataData,\n  ) => void;\n  // [Events.FRAG_PARSING_DATA]: TodoEventType\n  [Events.FRAG_PARSED]: (\n    event: Events.FRAG_PARSED,\n    data: FragParsedData,\n  ) => void;\n  [Events.FRAG_BUFFERED]: (\n    event: Events.FRAG_BUFFERED,\n    data: FragBufferedData,\n  ) => void;\n  [Events.FRAG_CHANGED]: (\n    event: Events.FRAG_CHANGED,\n    data: FragChangedData,\n  ) => void;\n  [Events.FPS_DROP]: (event: Events.FPS_DROP, data: FPSDropData) => void;\n  [Events.FPS_DROP_LEVEL_CAPPING]: (\n    event: Events.FPS_DROP_LEVEL_CAPPING,\n    data: FPSDropLevelCappingData,\n  ) => void;\n  [Events.MAX_AUTO_LEVEL_UPDATED]: (\n    event: Events.MAX_AUTO_LEVEL_UPDATED,\n    data: MaxAutoLevelUpdatedData,\n  ) => void;\n  [Events.ERROR]: (event: Events.ERROR, data: ErrorData) => void;\n  [Events.DESTROYING]: (event: Events.DESTROYING) => void;\n  [Events.KEY_LOADING]: (\n    event: Events.KEY_LOADING,\n    data: KeyLoadingData,\n  ) => void;\n  [Events.KEY_LOADED]: (event: Events.KEY_LOADED, data: KeyLoadedData) => void;\n  [Events.LIVE_BACK_BUFFER_REACHED]: (\n    event: Events.LIVE_BACK_BUFFER_REACHED,\n    data: LiveBackBufferData,\n  ) => void;\n  [Events.BACK_BUFFER_REACHED]: (\n    event: Events.BACK_BUFFER_REACHED,\n    data: BackBufferData,\n  ) => void;\n  [Events.STEERING_MANIFEST_LOADED]: (\n    event: Events.STEERING_MANIFEST_LOADED,\n    data: SteeringManifestLoadedData,\n  ) => void;\n  [Events.ASSET_LIST_LOADING]: (\n    event: Events.ASSET_LIST_LOADING,\n    data: AssetListLoadingData,\n  ) => void;\n  [Events.ASSET_LIST_LOADED]: (\n    event: Events.ASSET_LIST_LOADED,\n    data: AssetListLoadedData,\n  ) => void;\n  [Events.INTERSTITIALS_UPDATED]: (\n    event: Events.INTERSTITIALS_UPDATED,\n    data: InterstitialsUpdatedData,\n  ) => void;\n  [Events.INTERSTITIALS_BUFFERED_TO_BOUNDARY]: (\n    event: Events.INTERSTITIALS_BUFFERED_TO_BOUNDARY,\n    data: InterstitialsBufferedToBoundaryData,\n  ) => void;\n  [Events.INTERSTITIAL_ASSET_PLAYER_CREATED]: (\n    event: Events.INTERSTITIAL_ASSET_PLAYER_CREATED,\n    data: InterstitialAssetPlayerCreatedData,\n  ) => void;\n  [Events.INTERSTITIAL_STARTED]: (\n    event: Events.INTERSTITIAL_STARTED,\n    data: InterstitialStartedData,\n  ) => void;\n  [Events.INTERSTITIAL_ASSET_STARTED]: (\n    event: Events.INTERSTITIAL_ASSET_STARTED,\n    data: InterstitialAssetStartedData,\n  ) => void;\n  [Events.INTERSTITIAL_ASSET_ENDED]: (\n    event: Events.INTERSTITIAL_ASSET_ENDED,\n    data: InterstitialAssetEndedData,\n  ) => void;\n  [Events.INTERSTITIAL_ASSET_ERROR]: (\n    event: Events.INTERSTITIAL_ASSET_ERROR,\n    data: InterstitialAssetErrorData,\n  ) => void;\n  [Events.INTERSTITIAL_ENDED]: (\n    event: Events.INTERSTITIAL_ENDED,\n    data: InterstitialEndedData,\n  ) => void;\n  [Events.INTERSTITIALS_PRIMARY_RESUMED]: (\n    event: Events.INTERSTITIALS_PRIMARY_RESUMED,\n    data: InterstitialsPrimaryResumed,\n  ) => void;\n  [Events.PLAYOUT_LIMIT_REACHED]: (\n    event: Events.PLAYOUT_LIMIT_REACHED,\n    data: {},\n  ) => void;\n  [Events.EVENT_CUE_ENTER]: (event: Events.EVENT_CUE_ENTER, data: {}) => void;\n}\nexport interface HlsEventEmitter {\n  on<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context?: Context,\n  ): void;\n  once<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context?: Context,\n  ): void;\n\n  removeAllListeners<E extends keyof HlsListeners>(event?: E): void;\n  off<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener?: HlsListeners[E],\n    context?: Context,\n    once?: boolean,\n  ): void;\n\n  listeners<E extends keyof HlsListeners>(event: E): HlsListeners[E][];\n  emit<E extends keyof HlsListeners>(\n    event: E,\n    name: E,\n    eventObject: Parameters<HlsListeners[E]>[1],\n  ): boolean;\n  listenerCount<E extends keyof HlsListeners>(event: E): number;\n}\n", "import type { LoaderConfig } from '../config';\nimport type { HlsUrlParameters, Level } from './level';\nimport type { MediaPlaylist } from './media-playlist';\nimport type { Fragment } from '../loader/fragment';\nimport type { Part } from '../loader/fragment';\nimport type { KeyLoaderInfo } from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\n\nexport interface LoaderContext {\n  // target URL\n  url: string;\n  // loader response type (arraybuffer or default response type for playlist)\n  responseType: string;\n  // headers\n  headers?: Record<string, string>;\n  // start byte range offset\n  rangeStart?: number;\n  // end byte range offset\n  rangeEnd?: number;\n  // true if onProgress should report partial chunk of loaded content\n  progressData?: boolean;\n}\n\nexport interface FragmentLoaderContext extends LoaderContext {\n  frag: Fragment;\n  part: Part | null;\n  resetIV?: boolean;\n}\n\nexport interface KeyLoaderContext extends LoaderContext {\n  keyInfo: KeyLoaderInfo;\n  frag: Fragment;\n}\n\nexport interface LoaderConfiguration {\n  // LoaderConfig policy that overrides required settings\n  loadPolicy: LoaderConfig;\n  /**\n   * @deprecated use LoaderConfig timeoutRetry and errorRetry maxNumRetry\n   */\n  // Max number of load retries\n  maxRetry: number;\n  /**\n   * @deprecated use LoaderConfig maxTimeToFirstByteMs and maxLoadTimeMs\n   */\n  // Timeout after which `onTimeOut` callback will be triggered\n  //  when loading has not finished after that delay\n  timeout: number;\n  /**\n   * @deprecated use LoaderConfig timeoutRetry and errorRetry retryDelayMs\n   */\n  // Delay between an I/O error and following connection retry (ms).\n  // This to avoid spamming the server\n  retryDelay: number;\n  /**\n   * @deprecated use LoaderConfig timeoutRetry and errorRetry maxRetryDelayMs\n   */\n  // max connection retry delay (ms)\n  maxRetryDelay: number;\n  // When streaming progressively, this is the minimum chunk size required to emit a PROGRESS event\n  highWaterMark?: number;\n}\n\nexport interface LoaderResponse {\n  url: string;\n  data?: string | ArrayBuffer | Object;\n  // Errors can include HTTP status code and error message\n  // Successful responses should include status code 200\n  code?: number;\n  text?: string;\n}\n\nexport interface LoaderStats {\n  aborted: boolean;\n  loaded: number;\n  retry: number;\n  total: number;\n  chunkCount: number;\n  bwEstimate: number;\n  loading: HlsProgressivePerformanceTiming;\n  parsing: HlsPerformanceTiming;\n  buffering: HlsProgressivePerformanceTiming;\n}\n\nexport interface HlsPerformanceTiming {\n  start: number;\n  end: number;\n}\n\nexport interface HlsChunkPerformanceTiming extends HlsPerformanceTiming {\n  executeStart: number;\n  executeEnd: number;\n}\n\nexport interface HlsProgressivePerformanceTiming extends HlsPerformanceTiming {\n  first: number;\n}\n\nexport type LoaderOnSuccess<T extends LoaderContext> = (\n  response: LoaderResponse,\n  stats: LoaderStats,\n  context: T,\n  networkDetails: any,\n) => void;\n\nexport type LoaderOnProgress<T extends LoaderContext> = (\n  stats: LoaderStats,\n  context: T,\n  data: string | ArrayBuffer,\n  networkDetails: any,\n) => void;\n\nexport type LoaderOnError<T extends LoaderContext> = (\n  error: {\n    // error status code\n    code: number;\n    // error description\n    text: string;\n  },\n  context: T,\n  networkDetails: any,\n  stats: LoaderStats,\n) => void;\n\nexport type LoaderOnTimeout<T extends LoaderContext> = (\n  stats: LoaderStats,\n  context: T,\n  networkDetails: any,\n) => void;\n\nexport type LoaderOnAbort<T extends LoaderContext> = (\n  stats: LoaderStats,\n  context: T,\n  networkDetails: any,\n) => void;\n\nexport interface LoaderCallbacks<T extends LoaderContext> {\n  onSuccess: LoaderOnSuccess<T>;\n  onError: LoaderOnError<T>;\n  onTimeout: LoaderOnTimeout<T>;\n  onAbort?: LoaderOnAbort<T>;\n  onProgress?: LoaderOnProgress<T>;\n}\n\nexport interface Loader<T extends LoaderContext> {\n  destroy(): void;\n  abort(): void;\n  load(\n    context: T,\n    config: LoaderConfiguration,\n    callbacks: LoaderCallbacks<T>,\n  ): void;\n  /**\n   * `getCacheAge()` is called by hls.js to get the duration that a given object\n   * has been sitting in a cache proxy when playing live.  If implemented,\n   * this should return a value in seconds.\n   *\n   * For HTTP based loaders, this should return the contents of the \"age\" header.\n   *\n   * @returns time object being lodaded\n   */\n  getCacheAge?: () => number | null;\n  getResponseHeader?: (name: string) => string | null;\n  context: T | null;\n  stats: LoaderStats;\n}\n\nexport const enum PlaylistContextType {\n  MANIFEST = 'manifest',\n  LEVEL = 'level',\n  AUDIO_TRACK = 'audioTrack',\n  SUBTITLE_TRACK = 'subtitleTrack',\n}\n\nexport const enum PlaylistLevelType {\n  MAIN = 'main',\n  AUDIO = 'audio',\n  SUBTITLE = 'subtitle',\n}\n\nexport interface PlaylistLoaderContext extends LoaderContext {\n  type: PlaylistContextType;\n  // the level index to load\n  level: number | null;\n  // level or track id from LevelLoadingData / TrackLoadingData\n  id: number | null;\n  // Media Playlist Group ID\n  groupId?: string;\n  // Content Steering Pathway ID (or undefined for default Pathway \".\")\n  pathwayId?: string;\n  // internal representation of a parsed m3u8 level playlist\n  levelDetails?: LevelDetails;\n  // Blocking playlist request delivery directives (or null id none were added to playlist url\n  deliveryDirectives: HlsUrlParameters | null;\n  // Reference to level or track object in hls.levels, hls.allAudioTracks, or hls.allSubtitleTracks (null when loading MVP)\n  levelOrTrack: Level | MediaPlaylist | null;\n}\n", "/*\n * compute an Exponential Weighted moving average\n * - https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average\n *  - heavily inspired from shaka-player\n */\n\nclass EWMA {\n  public readonly halfLife: number;\n  private alpha_: number;\n  private estimate_: number;\n  private totalWeight_: number;\n\n  //  About half of the estimated value will be from the last |halfLife| samples by weight.\n  constructor(halfLife: number, estimate: number = 0, weight: number = 0) {\n    this.halfLife = halfLife;\n    // Larger values of alpha expire historical data more slowly.\n    this.alpha_ = halfLife ? Math.exp(Math.log(0.5) / halfLife) : 0;\n    this.estimate_ = estimate;\n    this.totalWeight_ = weight;\n  }\n\n  sample(weight: number, value: number) {\n    const adjAlpha = Math.pow(this.alpha_, weight);\n    this.estimate_ = value * (1 - adjAlpha) + adjAlpha * this.estimate_;\n    this.totalWeight_ += weight;\n  }\n\n  getTotalWeight(): number {\n    return this.totalWeight_;\n  }\n\n  getEstimate(): number {\n    if (this.alpha_) {\n      const zeroFactor = 1 - Math.pow(this.alpha_, this.totalWeight_);\n      if (zeroFactor) {\n        return this.estimate_ / zeroFactor;\n      }\n    }\n    return this.estimate_;\n  }\n}\n\nexport default EWMA;\n", "/*\n * EWMA Bandwidth Estimator\n *  - heavily inspired from shaka-player\n * Tracks bandwidth samples and estimates available bandwidth.\n * Based on the minimum of two exponentially-weighted moving averages with\n * different half-lives.\n */\n\nimport EWMA from '../utils/ewma';\n\nclass EwmaBandWidthEstimator {\n  private defaultEstimate_: number;\n  private minWeight_: number;\n  private minDelayMs_: number;\n  private slow_: EWMA;\n  private fast_: EWMA;\n  private defaultTTFB_: number;\n  private ttfb_: EWMA;\n\n  constructor(\n    slow: number,\n    fast: number,\n    defaultEstimate: number,\n    defaultTTFB: number = 100,\n  ) {\n    this.defaultEstimate_ = defaultEstimate;\n    this.minWeight_ = 0.001;\n    this.minDelayMs_ = 50;\n    this.slow_ = new EWMA(slow);\n    this.fast_ = new EWMA(fast);\n    this.defaultTTFB_ = defaultTTFB;\n    this.ttfb_ = new EWMA(slow);\n  }\n\n  update(slow: number, fast: number) {\n    const { slow_, fast_, ttfb_ } = this;\n    if (slow_.halfLife !== slow) {\n      this.slow_ = new EWMA(slow, slow_.getEstimate(), slow_.getTotalWeight());\n    }\n    if (fast_.halfLife !== fast) {\n      this.fast_ = new EWMA(fast, fast_.getEstimate(), fast_.getTotalWeight());\n    }\n    if (ttfb_.halfLife !== slow) {\n      this.ttfb_ = new EWMA(slow, ttfb_.getEstimate(), ttfb_.getTotalWeight());\n    }\n  }\n\n  sample(durationMs: number, numBytes: number) {\n    durationMs = Math.max(durationMs, this.minDelayMs_);\n    const numBits = 8 * numBytes;\n    // weight is duration in seconds\n    const durationS = durationMs / 1000;\n    // value is bandwidth in bits/s\n    const bandwidthInBps = numBits / durationS;\n    this.fast_.sample(durationS, bandwidthInBps);\n    this.slow_.sample(durationS, bandwidthInBps);\n  }\n\n  sampleTTFB(ttfb: number) {\n    // weight is frequency curve applied to TTFB in seconds\n    // (longer times have less weight with expected input under 1 second)\n    const seconds = ttfb / 1000;\n    const weight = Math.sqrt(2) * Math.exp(-Math.pow(seconds, 2) / 2);\n    this.ttfb_.sample(weight, Math.max(ttfb, 5));\n  }\n\n  canEstimate(): boolean {\n    return this.fast_.getTotalWeight() >= this.minWeight_;\n  }\n\n  getEstimate(): number {\n    if (this.canEstimate()) {\n      // console.log('slow estimate:'+ Math.round(this.slow_.getEstimate()));\n      // console.log('fast estimate:'+ Math.round(this.fast_.getEstimate()));\n      // Take the minimum of these two estimates.  This should have the effect of\n      // adapting down quickly, but up more slowly.\n      return Math.min(this.fast_.getEstimate(), this.slow_.getEstimate());\n    } else {\n      return this.defaultEstimate_;\n    }\n  }\n\n  getEstimateTTFB(): number {\n    if (this.ttfb_.getTotalWeight() >= this.minWeight_) {\n      return this.ttfb_.getEstimate();\n    } else {\n      return this.defaultTTFB_;\n    }\n  }\n\n  get defaultEstimate(): number {\n    return this.defaultEstimate_;\n  }\n\n  destroy() {}\n}\nexport default EwmaBandWidthEstimator;\n", "export interface ILogFunction {\n  (message?: any, ...optionalParams: any[]): void;\n}\n\nexport interface ILogger {\n  trace: ILogFunction;\n  debug: ILogFunction;\n  log: ILogFunction;\n  warn: ILogFunction;\n  info: ILogFunction;\n  error: ILogFunction;\n}\n\nexport class Logger implements ILogger {\n  trace: ILogFunction;\n  debug: ILogFunction;\n  log: ILogFunction;\n  warn: ILogFunction;\n  info: ILogFunction;\n  error: ILogFunction;\n\n  constructor(label: string, logger: ILogger) {\n    const lb = `[${label}]:`;\n    this.trace = noop;\n    this.debug = logger.debug.bind(null, lb);\n    this.log = logger.log.bind(null, lb);\n    this.warn = logger.warn.bind(null, lb);\n    this.info = logger.info.bind(null, lb);\n    this.error = logger.error.bind(null, lb);\n  }\n}\n\nconst noop: ILogFunction = function () {};\n\nconst fakeLogger: ILogger = {\n  trace: noop,\n  debug: noop,\n  log: noop,\n  warn: noop,\n  info: noop,\n  error: noop,\n};\n\nfunction createLogger() {\n  return Object.assign({}, fakeLogger);\n}\n\n// let lastCallTime;\n// function formatMsgWithTimeInfo(type, msg) {\n//   const now = Date.now();\n//   const diff = lastCallTime ? '+' + (now - lastCallTime) : '0';\n//   lastCallTime = now;\n//   msg = (new Date(now)).toISOString() + ' | [' +  type + '] > ' + msg + ' ( ' + diff + ' ms )';\n//   return msg;\n// }\n\nfunction consolePrintFn(type: string, id: string | undefined): ILogFunction {\n  const func: ILogFunction = self.console[type];\n  return func\n    ? func.bind(self.console, `${id ? '[' + id + '] ' : ''}[${type}] >`)\n    : noop;\n}\n\nfunction getLoggerFn(\n  key: string,\n  debugConfig: boolean | Partial<ILogger>,\n  id?: string,\n): ILogFunction {\n  return debugConfig[key]\n    ? debugConfig[key].bind(debugConfig)\n    : consolePrintFn(key, id);\n}\n\nconst exportedLogger: ILogger = createLogger();\n\nexport function enableLogs(\n  debugConfig: boolean | ILogger,\n  context: string,\n  id?: string | undefined,\n): ILogger {\n  // check that console is available\n  const newLogger = createLogger();\n  if (\n    (typeof console === 'object' && debugConfig === true) ||\n    typeof debugConfig === 'object'\n  ) {\n    const keys: (keyof ILogger)[] = [\n      // Remove out from list here to hard-disable a log-level\n      // 'trace',\n      'debug',\n      'log',\n      'info',\n      'warn',\n      'error',\n    ];\n    keys.forEach((key) => {\n      newLogger[key] = getLoggerFn(key, debugConfig, id);\n    });\n    // Some browsers don't allow to use bind on console object anyway\n    // fallback to default if needed\n    try {\n      newLogger.log(\n        `Debug logs enabled for \"${context}\" in hls.js version ${__VERSION__}`,\n      );\n    } catch (e) {\n      /* log fn threw an exception. All logger methods are no-ops. */\n      return createLogger();\n    }\n    // global exported logger uses the same functions as new logger without `id`\n    keys.forEach((key) => {\n      exportedLogger[key] = getLoggerFn(key, debugConfig);\n    });\n  } else {\n    // Reset global exported logger\n    Object.assign(exportedLogger, newLogger);\n  }\n  return newLogger;\n}\n\nexport const logger: ILogger = exportedLogger;\n", "import type { BaseTrackSet } from '../types/buffer';\n\nexport function getMediaSource(\n  preferManagedMediaSource = true,\n): typeof MediaSource | undefined {\n  if (typeof self === 'undefined') return undefined;\n  const mms =\n    (preferManagedMediaSource || !self.MediaSource) &&\n    ((self as any).ManagedMediaSource as undefined | typeof MediaSource);\n  return (\n    mms ||\n    self.MediaSource ||\n    ((self as any).WebKitMediaSource as typeof MediaSource)\n  );\n}\n\nexport function isManagedMediaSource(source: typeof MediaSource | undefined) {\n  return (\n    typeof self !== 'undefined' && source === (self as any).ManagedMediaSource\n  );\n}\n\nexport function isCompatibleTrackChange(\n  currentTracks: BaseTrackSet,\n  requiredTracks: BaseTrackSet,\n): boolean {\n  const trackNames = Object.keys(currentTracks);\n  const requiredTrackNames = Object.keys(requiredTracks);\n  const trackCount = trackNames.length;\n  const requiredTrackCount = requiredTrackNames.length;\n  return (\n    !trackCount ||\n    !requiredTrackCount ||\n    (trackCount === requiredTrackCount &&\n      !trackNames.some((name) => requiredTrackNames.indexOf(name) === -1))\n  );\n}\n", "// http://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript/22373197\n// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt\n/* utf.js - UTF-8 <=> UTF-16 convertion\n *\n * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>\n * Version: 1.0\n * LastModified: Dec 25 1999\n * This library is free.  You can redistribute it and/or modify it.\n */\n/**\n * Converts a UTF-8 array to a string.\n *\n * @param array - The UTF-8 array to convert\n *\n * @returns The string\n *\n * @group Utils\n *\n * @beta\n */\nexport function utf8ArrayToStr(array, exitOnNull = false) {\n    if (typeof TextDecoder !== 'undefined') {\n        const decoder = new TextDecoder('utf-8');\n        const decoded = decoder.decode(array);\n        if (exitOnNull) {\n            // grab up to the first null\n            const idx = decoded.indexOf('\\0');\n            return idx !== -1 ? decoded.substring(0, idx) : decoded;\n        }\n        // remove any null characters\n        return decoded.replace(/\\0/g, '');\n    }\n    const len = array.length;\n    let c;\n    let char2;\n    let char3;\n    let out = '';\n    let i = 0;\n    while (i < len) {\n        c = array[i++];\n        if (c === 0x00 && exitOnNull) {\n            return out;\n        }\n        else if (c === 0x00 || c === 0x03) {\n            // If the character is 3 (END_OF_TEXT) or 0 (NULL) then skip it\n            continue;\n        }\n        switch (c >> 4) {\n            case 0:\n            case 1:\n            case 2:\n            case 3:\n            case 4:\n            case 5:\n            case 6:\n            case 7:\n                // 0xxxxxxx\n                out += String.fromCharCode(c);\n                break;\n            case 12:\n            case 13:\n                // 110x xxxx   10xx xxxx\n                char2 = array[i++];\n                out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));\n                break;\n            case 14:\n                // 1110 xxxx  10xx xxxx  10xx xxxx\n                char2 = array[i++];\n                char3 = array[i++];\n                out += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0));\n                break;\n            default:\n        }\n    }\n    return out;\n}\n//# sourceMappingURL=utf8ArrayToStr.js.map", "/**\n *  hex dump helper class\n */\n\nexport function arrayToHex(array: Uint8Array<ArrayBuffer> | number[]) {\n  let str = '';\n  for (let i = 0; i < array.length; i++) {\n    let h = array[i].toString(16);\n    if (h.length < 2) {\n      h = '0' + h;\n    }\n\n    str += h;\n  }\n  return str;\n}\n\nexport function hexToArrayBuffer(str: string): ArrayBuffer {\n  return Uint8Array.from(\n    str\n      .replace(/^0x/, '')\n      .replace(/([\\da-fA-F]{2}) ?/g, '0x$1 ')\n      .replace(/ +$/, '')\n      .split(' '),\n  ).buffer;\n}\n\nconst Hex = {\n  hexDump: arrayToHex,\n};\n\nexport default Hex;\n", "// see https://tools.ietf.org/html/rfc1808\n\n(function (root) {\n  var URL_REGEX =\n    /^(?=((?:[a-zA-Z0-9+\\-.]+:)?))\\1(?=((?:\\/\\/[^\\/?#]*)?))\\2(?=((?:(?:[^?#\\/]*\\/)*[^;?#\\/]*)?))\\3((?:;[^?#]*)?)(\\?[^#]*)?(#[^]*)?$/;\n  var FIRST_SEGMENT_REGEX = /^(?=([^\\/?#]*))\\1([^]*)$/;\n  var SLASH_DOT_REGEX = /(?:\\/|^)\\.(?=\\/)/g;\n  var SLASH_DOT_DOT_REGEX = /(?:\\/|^)\\.\\.\\/(?!\\.\\.\\/)[^\\/]*(?=\\/)/g;\n\n  var URLToolkit = {\n    // If opts.alwaysNormalize is true then the path will always be normalized even when it starts with / or //\n    // E.g\n    // With opts.alwaysNormalize = false (default, spec compliant)\n    // http://a.com/b/cd + /e/f/../g => http://a.com/e/f/../g\n    // With opts.alwaysNormalize = true (not spec compliant)\n    // http://a.com/b/cd + /e/f/../g => http://a.com/e/g\n    buildAbsoluteURL: function (baseURL, relativeURL, opts) {\n      opts = opts || {};\n      // remove any remaining space and CRLF\n      baseURL = baseURL.trim();\n      relativeURL = relativeURL.trim();\n      if (!relativeURL) {\n        // 2a) If the embedded URL is entirely empty, it inherits the\n        // entire base URL (i.e., is set equal to the base URL)\n        // and we are done.\n        if (!opts.alwaysNormalize) {\n          return baseURL;\n        }\n        var basePartsForNormalise = URLToolkit.parseURL(baseURL);\n        if (!basePartsForNormalise) {\n          throw new Error('Error trying to parse base URL.');\n        }\n        basePartsForNormalise.path = URLToolkit.normalizePath(\n          basePartsForNormalise.path\n        );\n        return URLToolkit.buildURLFromParts(basePartsForNormalise);\n      }\n      var relativeParts = URLToolkit.parseURL(relativeURL);\n      if (!relativeParts) {\n        throw new Error('Error trying to parse relative URL.');\n      }\n      if (relativeParts.scheme) {\n        // 2b) If the embedded URL starts with a scheme name, it is\n        // interpreted as an absolute URL and we are done.\n        if (!opts.alwaysNormalize) {\n          return relativeURL;\n        }\n        relativeParts.path = URLToolkit.normalizePath(relativeParts.path);\n        return URLToolkit.buildURLFromParts(relativeParts);\n      }\n      var baseParts = URLToolkit.parseURL(baseURL);\n      if (!baseParts) {\n        throw new Error('Error trying to parse base URL.');\n      }\n      if (!baseParts.netLoc && baseParts.path && baseParts.path[0] !== '/') {\n        // If netLoc missing and path doesn't start with '/', assume everthing before the first '/' is the netLoc\n        // This causes 'example.com/a' to be handled as '//example.com/a' instead of '/example.com/a'\n        var pathParts = FIRST_SEGMENT_REGEX.exec(baseParts.path);\n        baseParts.netLoc = pathParts[1];\n        baseParts.path = pathParts[2];\n      }\n      if (baseParts.netLoc && !baseParts.path) {\n        baseParts.path = '/';\n      }\n      var builtParts = {\n        // 2c) Otherwise, the embedded URL inherits the scheme of\n        // the base URL.\n        scheme: baseParts.scheme,\n        netLoc: relativeParts.netLoc,\n        path: null,\n        params: relativeParts.params,\n        query: relativeParts.query,\n        fragment: relativeParts.fragment,\n      };\n      if (!relativeParts.netLoc) {\n        // 3) If the embedded URL's <net_loc> is non-empty, we skip to\n        // Step 7.  Otherwise, the embedded URL inherits the <net_loc>\n        // (if any) of the base URL.\n        builtParts.netLoc = baseParts.netLoc;\n        // 4) If the embedded URL path is preceded by a slash \"/\", the\n        // path is not relative and we skip to Step 7.\n        if (relativeParts.path[0] !== '/') {\n          if (!relativeParts.path) {\n            // 5) If the embedded URL path is empty (and not preceded by a\n            // slash), then the embedded URL inherits the base URL path\n            builtParts.path = baseParts.path;\n            // 5a) if the embedded URL's <params> is non-empty, we skip to\n            // step 7; otherwise, it inherits the <params> of the base\n            // URL (if any) and\n            if (!relativeParts.params) {\n              builtParts.params = baseParts.params;\n              // 5b) if the embedded URL's <query> is non-empty, we skip to\n              // step 7; otherwise, it inherits the <query> of the base\n              // URL (if any) and we skip to step 7.\n              if (!relativeParts.query) {\n                builtParts.query = baseParts.query;\n              }\n            }\n          } else {\n            // 6) The last segment of the base URL's path (anything\n            // following the rightmost slash \"/\", or the entire path if no\n            // slash is present) is removed and the embedded URL's path is\n            // appended in its place.\n            var baseURLPath = baseParts.path;\n            var newPath =\n              baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) +\n              relativeParts.path;\n            builtParts.path = URLToolkit.normalizePath(newPath);\n          }\n        }\n      }\n      if (builtParts.path === null) {\n        builtParts.path = opts.alwaysNormalize\n          ? URLToolkit.normalizePath(relativeParts.path)\n          : relativeParts.path;\n      }\n      return URLToolkit.buildURLFromParts(builtParts);\n    },\n    parseURL: function (url) {\n      var parts = URL_REGEX.exec(url);\n      if (!parts) {\n        return null;\n      }\n      return {\n        scheme: parts[1] || '',\n        netLoc: parts[2] || '',\n        path: parts[3] || '',\n        params: parts[4] || '',\n        query: parts[5] || '',\n        fragment: parts[6] || '',\n      };\n    },\n    normalizePath: function (path) {\n      // The following operations are\n      // then applied, in order, to the new path:\n      // 6a) All occurrences of \"./\", where \".\" is a complete path\n      // segment, are removed.\n      // 6b) If the path ends with \".\" as a complete path segment,\n      // that \".\" is removed.\n      path = path.split('').reverse().join('').replace(SLASH_DOT_REGEX, '');\n      // 6c) All occurrences of \"<segment>/../\", where <segment> is a\n      // complete path segment not equal to \"..\", are removed.\n      // Removal of these path segments is performed iteratively,\n      // removing the leftmost matching pattern on each iteration,\n      // until no matching pattern remains.\n      // 6d) If the path ends with \"<segment>/..\", where <segment> is a\n      // complete path segment not equal to \"..\", that\n      // \"<segment>/..\" is removed.\n      while (\n        path.length !== (path = path.replace(SLASH_DOT_DOT_REGEX, '')).length\n      ) {}\n      return path.split('').reverse().join('');\n    },\n    buildURLFromParts: function (parts) {\n      return (\n        parts.scheme +\n        parts.netLoc +\n        parts.path +\n        parts.params +\n        parts.query +\n        parts.fragment\n      );\n    },\n  };\n\n  if (typeof exports === 'object' && typeof module === 'object')\n    module.exports = URLToolkit;\n  else if (typeof define === 'function' && define.amd)\n    define([], function () {\n      return URLToolkit;\n    });\n  else if (typeof exports === 'object') exports['URLToolkit'] = URLToolkit;\n  else root['URLToolkit'] = URLToolkit;\n})(this);\n", "import type {\n  HlsPerformanceTiming,\n  HlsProgressivePerformanceTiming,\n  LoaderStats,\n} from '../types/loader';\n\nexport class LoadStats implements LoaderStats {\n  aborted: boolean = false;\n  loaded: number = 0;\n  retry: number = 0;\n  total: number = 0;\n  chunkCount: number = 0;\n  bwEstimate: number = 0;\n  loading: HlsProgressivePerformanceTiming = { start: 0, first: 0, end: 0 };\n  parsing: HlsPerformanceTiming = { start: 0, end: 0 };\n  buffering: HlsProgressivePerformanceTiming = { start: 0, first: 0, end: 0 };\n}\n", "import { buildAbsoluteURL } from 'url-toolkit';\nimport { LoadStats } from './load-stats';\nimport type { LevelKey } from './level-key';\nimport type {\n  FragmentLoaderContext,\n  KeyLoaderContext,\n  Loader,\n  PlaylistLevelType,\n} from '../types/loader';\nimport type { AttrList } from '../utils/attr-list';\nimport type { KeySystemFormats } from '../utils/mediakeys-helper';\n\nexport const enum ElementaryStreamTypes {\n  AUDIO = 'audio',\n  VIDEO = 'video',\n  AUDIOVIDEO = 'audiovideo',\n}\n\nexport interface ElementaryStreamInfo {\n  startPTS: number;\n  endPTS: number;\n  startDTS: number;\n  endDTS: number;\n  partial?: boolean;\n}\n\nexport type ElementaryStreams = Record<\n  ElementaryStreamTypes,\n  ElementaryStreamInfo | null\n>;\n\nexport type Base = {\n  url: string;\n};\n\nexport class BaseSegment {\n  private _byteRange: [number, number] | null = null;\n  private _url: string | null = null;\n  private _stats: LoadStats | null = null;\n  private _streams: ElementaryStreams | null = null;\n\n  // baseurl is the URL to the playlist\n  public readonly base: Base;\n\n  // relurl is the portion of the URL that comes from inside the playlist.\n  public relurl?: string;\n\n  constructor(base: Base | string) {\n    if (typeof base === 'string') {\n      base = { url: base };\n    }\n    this.base = base;\n    makeEnumerable(this, 'stats');\n  }\n\n  // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array\n  setByteRange(value: string, previous?: BaseSegment) {\n    const params = value.split('@', 2);\n    let start: number;\n    if (params.length === 1) {\n      start = previous?.byteRangeEndOffset || 0;\n    } else {\n      start = parseInt(params[1]);\n    }\n    this._byteRange = [start, parseInt(params[0]) + start];\n  }\n\n  get baseurl(): string {\n    return this.base.url;\n  }\n\n  get byteRange(): [number, number] | [] {\n    if (this._byteRange === null) {\n      return [];\n    }\n\n    return this._byteRange;\n  }\n\n  get byteRangeStartOffset(): number | undefined {\n    return this.byteRange[0];\n  }\n\n  get byteRangeEndOffset(): number | undefined {\n    return this.byteRange[1];\n  }\n\n  get elementaryStreams(): ElementaryStreams {\n    if (this._streams === null) {\n      this._streams = {\n        [ElementaryStreamTypes.AUDIO]: null,\n        [ElementaryStreamTypes.VIDEO]: null,\n        [ElementaryStreamTypes.AUDIOVIDEO]: null,\n      };\n    }\n    return this._streams;\n  }\n\n  set elementaryStreams(value: ElementaryStreams) {\n    this._streams = value;\n  }\n\n  get hasStats(): boolean {\n    return this._stats !== null;\n  }\n\n  get hasStreams(): boolean {\n    return this._streams !== null;\n  }\n\n  get stats(): LoadStats {\n    if (this._stats === null) {\n      this._stats = new LoadStats();\n    }\n    return this._stats;\n  }\n\n  set stats(value: LoadStats) {\n    this._stats = value;\n  }\n\n  get url(): string {\n    if (!this._url && this.baseurl && this.relurl) {\n      this._url = buildAbsoluteURL(this.baseurl, this.relurl, {\n        alwaysNormalize: true,\n      });\n    }\n    return this._url || '';\n  }\n\n  set url(value: string) {\n    this._url = value;\n  }\n\n  clearElementaryStreamInfo() {\n    const { elementaryStreams } = this;\n    elementaryStreams[ElementaryStreamTypes.AUDIO] = null;\n    elementaryStreams[ElementaryStreamTypes.VIDEO] = null;\n    elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;\n  }\n}\n\nexport interface MediaFragment extends Fragment {\n  sn: number;\n  ref: MediaFragmentRef;\n}\n\nexport type MediaFragmentRef = {\n  base: Base;\n  start: number;\n  duration: number;\n  sn: number;\n  programDateTime: number | null;\n};\n\nexport function isMediaFragment(frag: Fragment): frag is MediaFragment {\n  return frag.sn !== 'initSegment';\n}\n\n/**\n * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.\n */\nexport class Fragment extends BaseSegment {\n  private _decryptdata: LevelKey | null = null;\n  private _programDateTime: number | null = null;\n  private _ref: MediaFragmentRef | null = null;\n  // Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag\n  private _bitrate?: number;\n\n  public rawProgramDateTime: string | null = null;\n  public tagList: Array<string[]> = [];\n\n  // EXTINF has to be present for a m3u8 to be considered valid\n  public duration: number = 0;\n  // sn notates the sequence number for a segment, and if set to a string can be 'initSegment'\n  public sn: number | 'initSegment' = 0;\n  // levelkeys are the EXT-X-KEY tags that apply to this segment for decryption\n  // core difference from the private field _decryptdata is the lack of the initialized IV\n  // _decryptdata will set the IV for this segment based on the segment number in the fragment\n  public levelkeys?: { [key: string]: LevelKey | undefined };\n  // A string representing the fragment type\n  public readonly type: PlaylistLevelType;\n  // A reference to the loader. Set while the fragment is loading, and removed afterwards. Used to abort fragment loading\n  public loader: Loader<FragmentLoaderContext> | null = null;\n  // A reference to the key loader. Set while the key is loading, and removed afterwards. Used to abort key loading\n  public keyLoader: Loader<KeyLoaderContext> | null = null;\n  // The level/track index to which the fragment belongs\n  public level: number = -1;\n  // The continuity counter of the fragment\n  public cc: number = 0;\n  // The starting Presentation Time Stamp (PTS) of the fragment. Set after transmux complete.\n  public startPTS?: number;\n  // The ending Presentation Time Stamp (PTS) of the fragment. Set after transmux complete.\n  public endPTS?: number;\n  // The starting Decode Time Stamp (DTS) of the fragment. Set after transmux complete.\n  public startDTS?: number;\n  // The ending Decode Time Stamp (DTS) of the fragment. Set after transmux complete.\n  public endDTS?: number;\n  // The start time of the fragment, as listed in the manifest. Updated after transmux complete.\n  public start: number = 0;\n  // The offset time (seconds) of the fragment from the start of the Playlist\n  public playlistOffset: number = 0;\n  // Set by `updateFragPTSDTS` in level-helper\n  public deltaPTS?: number;\n  // The maximum starting Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.\n  public maxStartPTS?: number;\n  // The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.\n  public minEndPTS?: number;\n  // Init Segment bytes (unset for media segments)\n  public data?: Uint8Array;\n  // A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered\n  public bitrateTest: boolean = false;\n  // #EXTINF  segment title\n  public title: string | null = null;\n  // The Media Initialization Section for this segment\n  public initSegment: Fragment | null = null;\n  // Fragment is the last fragment in the media playlist\n  public endList?: boolean;\n  // Fragment is marked by an EXT-X-GAP tag indicating that it does not contain media data and should not be loaded\n  public gap?: boolean;\n  // Deprecated\n  public urlId: number = 0;\n\n  constructor(type: PlaylistLevelType, base: Base | string) {\n    super(base);\n    this.type = type;\n  }\n\n  get byteLength(): number | null {\n    if (this.hasStats) {\n      const total = this.stats.total;\n      if (total) {\n        return total;\n      }\n    }\n    if (this.byteRange.length) {\n      const start = this.byteRange[0];\n      const end = this.byteRange[1];\n      if (Number.isFinite(start) && Number.isFinite(end)) {\n        return (end as number) - (start as number);\n      }\n    }\n    return null;\n  }\n\n  get bitrate(): number | null {\n    if (this.byteLength) {\n      return (this.byteLength * 8) / this.duration;\n    }\n    if (this._bitrate) {\n      return this._bitrate;\n    }\n    return null;\n  }\n\n  set bitrate(value: number) {\n    this._bitrate = value;\n  }\n\n  get decryptdata(): LevelKey | null {\n    const { levelkeys } = this;\n\n    if (!levelkeys || levelkeys.NONE) {\n      return null;\n    }\n\n    if (levelkeys.identity) {\n      if (!this._decryptdata) {\n        this._decryptdata = levelkeys.identity.getDecryptData(this.sn);\n      }\n    } else if (!this._decryptdata?.keyId) {\n      const keyFormats = Object.keys(levelkeys);\n      if (keyFormats.length === 1) {\n        const levelKey = (this._decryptdata = levelkeys[keyFormats[0]] || null);\n        if (levelKey) {\n          this._decryptdata = levelKey.getDecryptData(this.sn, levelkeys);\n        }\n      } else {\n        // Multiple keys. key-loader to call Fragment.setKeyFormat based on selected key-system.\n      }\n    }\n\n    return this._decryptdata;\n  }\n\n  get end(): number {\n    return this.start + this.duration;\n  }\n\n  get endProgramDateTime() {\n    if (this.programDateTime === null) {\n      return null;\n    }\n\n    const duration = !Number.isFinite(this.duration) ? 0 : this.duration;\n\n    return this.programDateTime + duration * 1000;\n  }\n\n  get encrypted() {\n    // At the m3u8-parser level we need to add support for manifest signalled keyformats\n    // when we want the fragment to start reporting that it is encrypted.\n    // Currently, keyFormat will only be set for identity keys\n    if (this._decryptdata?.encrypted) {\n      return true;\n    } else if (this.levelkeys) {\n      const keyFormats = Object.keys(this.levelkeys);\n      const len = keyFormats.length;\n      if (len > 1 || (len === 1 && this.levelkeys[keyFormats[0]]?.encrypted)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  get programDateTime(): number | null {\n    if (this._programDateTime === null && this.rawProgramDateTime) {\n      this.programDateTime = Date.parse(this.rawProgramDateTime);\n    }\n    return this._programDateTime;\n  }\n\n  set programDateTime(value: number | null) {\n    if (!Number.isFinite(value)) {\n      this._programDateTime = this.rawProgramDateTime = null;\n      return;\n    }\n    this._programDateTime = value;\n  }\n\n  get ref(): MediaFragmentRef | null {\n    if (!isMediaFragment(this)) {\n      return null;\n    }\n    if (!this._ref) {\n      this._ref = {\n        base: this.base,\n        start: this.start,\n        duration: this.duration,\n        sn: this.sn,\n        programDateTime: this.programDateTime,\n      };\n    }\n    return this._ref;\n  }\n\n  addStart(value: number) {\n    this.setStart(this.start + value);\n  }\n\n  setStart(value: number) {\n    this.start = value;\n    if (this._ref) {\n      this._ref.start = value;\n    }\n  }\n\n  setDuration(value: number) {\n    this.duration = value;\n    if (this._ref) {\n      this._ref.duration = value;\n    }\n  }\n\n  setKeyFormat(keyFormat: KeySystemFormats) {\n    const levelkeys = this.levelkeys;\n    if (levelkeys) {\n      const key = levelkeys[keyFormat];\n      if (key && !this._decryptdata?.keyId) {\n        this._decryptdata = key.getDecryptData(this.sn, levelkeys);\n      }\n    }\n  }\n\n  abortRequests(): void {\n    this.loader?.abort();\n    this.keyLoader?.abort();\n  }\n\n  setElementaryStreamInfo(\n    type: ElementaryStreamTypes,\n    startPTS: number,\n    endPTS: number,\n    startDTS: number,\n    endDTS: number,\n    partial: boolean = false,\n  ) {\n    const { elementaryStreams } = this;\n    const info = elementaryStreams[type];\n    if (!info) {\n      elementaryStreams[type] = {\n        startPTS,\n        endPTS,\n        startDTS,\n        endDTS,\n        partial,\n      };\n      return;\n    }\n\n    info.startPTS = Math.min(info.startPTS, startPTS);\n    info.endPTS = Math.max(info.endPTS, endPTS);\n    info.startDTS = Math.min(info.startDTS, startDTS);\n    info.endDTS = Math.max(info.endDTS, endDTS);\n  }\n}\n\n/**\n * Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.\n */\nexport class Part extends BaseSegment {\n  public readonly fragOffset: number = 0;\n  public readonly duration: number = 0;\n  public readonly gap: boolean = false;\n  public readonly independent: boolean = false;\n  public readonly relurl: string;\n  public readonly fragment: MediaFragment;\n  public readonly index: number;\n\n  constructor(\n    partAttrs: AttrList,\n    frag: MediaFragment,\n    base: Base | string,\n    index: number,\n    previous?: Part,\n  ) {\n    super(base);\n    this.duration = partAttrs.decimalFloatingPoint('DURATION');\n    this.gap = partAttrs.bool('GAP');\n    this.independent = partAttrs.bool('INDEPENDENT');\n    this.relurl = partAttrs.enumeratedString('URI') as string;\n    this.fragment = frag;\n    this.index = index;\n    const byteRange = partAttrs.enumeratedString('BYTERANGE');\n    if (byteRange) {\n      this.setByteRange(byteRange, previous);\n    }\n    if (previous) {\n      this.fragOffset = previous.fragOffset + previous.duration;\n    }\n  }\n\n  get start(): number {\n    return this.fragment.start + this.fragOffset;\n  }\n\n  get end(): number {\n    return this.start + this.duration;\n  }\n\n  get loaded(): boolean {\n    const { elementaryStreams } = this;\n    return !!(\n      elementaryStreams.audio ||\n      elementaryStreams.video ||\n      elementaryStreams.audiovideo\n    );\n  }\n}\n\nfunction getOwnPropertyDescriptorFromPrototypeChain(\n  object: Object | undefined,\n  property: string,\n) {\n  const prototype = Object.getPrototypeOf(object);\n  if (prototype) {\n    const propertyDescriptor = Object.getOwnPropertyDescriptor(\n      prototype,\n      property,\n    );\n    if (propertyDescriptor) {\n      return propertyDescriptor;\n    }\n    return getOwnPropertyDescriptorFromPrototypeChain(prototype, property);\n  }\n}\n\nfunction makeEnumerable(object: Object, property: string) {\n  const d = getOwnPropertyDescriptorFromPrototypeChain(object, property);\n  if (d) {\n    d.enumerable = true;\n    Object.defineProperty(object, property, d);\n  }\n}\n", "import { utf8ArrayToStr } from '@svta/common-media-library/utils/utf8ArrayToStr';\nimport { arrayToHex } from './hex';\nimport { ElementaryStreamTypes } from '../loader/fragment';\nimport { logger } from '../utils/logger';\nimport type { KeySystemIds } from './mediakeys-helper';\nimport type { DecryptData } from '../loader/level-key';\nimport type { PassthroughTrack, UserdataSample } from '../types/demuxer';\nimport type { ILogger } from '../utils/logger';\n\ntype BoxDataOrUndefined = Uint8Array<ArrayBuffer> | undefined;\n\nconst UINT32_MAX = Math.pow(2, 32) - 1;\nconst push = [].push;\n\n// We are using fixed track IDs for driving the MP4 remuxer\n// instead of following the TS PIDs.\n// There is no reason not to do this and some browsers/SourceBuffer-demuxers\n// may not like if there are TrackID \"switches\"\n// See https://github.com/video-dev/hls.js/issues/1331\n// Here we are mapping our internal track types to constant MP4 track IDs\n// With MSE currently one can only have one track of each, and we are muxing\n// whatever video/audio rendition in them.\nexport const RemuxerTrackIdConfig = {\n  video: 1,\n  audio: 2,\n  id3: 3,\n  text: 4,\n};\n\nexport function bin2str(data: Uint8Array): string {\n  return String.fromCharCode.apply(null, data);\n}\n\nexport function readUint16(buffer: Uint8Array, offset: number): number {\n  const val = (buffer[offset] << 8) | buffer[offset + 1];\n  return val < 0 ? 65536 + val : val;\n}\n\nexport function readUint32(buffer: Uint8Array, offset: number): number {\n  const val = readSint32(buffer, offset);\n  return val < 0 ? 4294967296 + val : val;\n}\n\nexport function readUint64(buffer: Uint8Array, offset: number) {\n  let result = readUint32(buffer, offset);\n  result *= Math.pow(2, 32);\n  result += readUint32(buffer, offset + 4);\n  return result;\n}\n\nexport function readSint32(buffer: Uint8Array, offset: number): number {\n  return (\n    (buffer[offset] << 24) |\n    (buffer[offset + 1] << 16) |\n    (buffer[offset + 2] << 8) |\n    buffer[offset + 3]\n  );\n}\n\nexport function writeUint32(buffer: Uint8Array, offset: number, value: number) {\n  buffer[offset] = value >> 24;\n  buffer[offset + 1] = (value >> 16) & 0xff;\n  buffer[offset + 2] = (value >> 8) & 0xff;\n  buffer[offset + 3] = value & 0xff;\n}\n\n// Find \"moof\" box\nexport function hasMoofData(data: Uint8Array): boolean {\n  const end = data.byteLength;\n  for (let i = 0; i < end; ) {\n    const size = readUint32(data, i);\n    if (\n      size > 8 &&\n      data[i + 4] === 0x6d &&\n      data[i + 5] === 0x6f &&\n      data[i + 6] === 0x6f &&\n      data[i + 7] === 0x66\n    ) {\n      return true;\n    }\n    i = size > 1 ? i + size : end;\n  }\n  return false;\n}\n\n// Find the data for a box specified by its path\nexport function findBox(data: Uint8Array, path: string[]): Uint8Array[] {\n  const results = [] as Uint8Array[];\n  if (!path.length) {\n    // short-circuit the search for empty paths\n    return results;\n  }\n  const end = data.byteLength;\n\n  for (let i = 0; i < end; ) {\n    const size = readUint32(data, i);\n    const type = bin2str(data.subarray(i + 4, i + 8));\n    const endbox = size > 1 ? i + size : end;\n    if (type === path[0]) {\n      if (path.length === 1) {\n        // this is the end of the path and we've found the box we were\n        // looking for\n        results.push(data.subarray(i + 8, endbox));\n      } else {\n        // recursively search for the next box along the path\n        const subresults = findBox(data.subarray(i + 8, endbox), path.slice(1));\n        if (subresults.length) {\n          push.apply(results, subresults);\n        }\n      }\n    }\n    i = endbox;\n  }\n\n  // we've finished searching all of data\n  return results;\n}\n\ntype SidxInfo = {\n  earliestPresentationTime: number;\n  timescale: number;\n  version: number;\n  referencesCount: number;\n  references: any[];\n};\n\nfunction parseSegmentIndex(sidx: Uint8Array): SidxInfo | null {\n  const references: any[] = [];\n\n  const version = sidx[0];\n\n  // set initial offset, we skip the reference ID (not needed)\n  let index = 8;\n\n  const timescale = readUint32(sidx, index);\n  index += 4;\n\n  let earliestPresentationTime = 0;\n  let firstOffset = 0;\n\n  if (version === 0) {\n    earliestPresentationTime = readUint32(sidx, index);\n    firstOffset = readUint32(sidx, index + 4);\n    index += 8;\n  } else {\n    earliestPresentationTime = readUint64(sidx, index);\n    firstOffset = readUint64(sidx, index + 8);\n    index += 16;\n  }\n\n  // skip reserved\n  index += 2;\n\n  let startByte = sidx.length + firstOffset;\n\n  const referencesCount = readUint16(sidx, index);\n  index += 2;\n\n  for (let i = 0; i < referencesCount; i++) {\n    let referenceIndex = index;\n\n    const referenceInfo = readUint32(sidx, referenceIndex);\n    referenceIndex += 4;\n\n    const referenceSize = referenceInfo & 0x7fffffff;\n    const referenceType = (referenceInfo & 0x80000000) >>> 31;\n\n    if (referenceType === 1) {\n      logger.warn('SIDX has hierarchical references (not supported)');\n      return null;\n    }\n\n    const subsegmentDuration = readUint32(sidx, referenceIndex);\n    referenceIndex += 4;\n\n    references.push({\n      referenceSize,\n      subsegmentDuration, // unscaled\n      info: {\n        duration: subsegmentDuration / timescale,\n        start: startByte,\n        end: startByte + referenceSize - 1,\n      },\n    });\n\n    startByte += referenceSize;\n\n    // Skipping 1 bit for |startsWithSap|, 3 bits for |sapType|, and 28 bits\n    // for |sapDelta|.\n    referenceIndex += 4;\n\n    // skip to next ref\n    index = referenceIndex;\n  }\n\n  return {\n    earliestPresentationTime,\n    timescale,\n    version,\n    referencesCount,\n    references,\n  };\n}\n\n/**\n * Parses an MP4 initialization segment and extracts stream type and\n * timescale values for any declared tracks. Timescale values indicate the\n * number of clock ticks per second to assume for time-based values\n * elsewhere in the MP4.\n *\n * To determine the start time of an MP4, you need two pieces of\n * information: the timescale unit and the earliest base media decode\n * time. Multiple timescales can be specified within an MP4 but the\n * base media decode time is always expressed in the timescale from\n * the media header box for the track:\n * ```\n * moov > trak > mdia > mdhd.timescale\n * moov > trak > mdia > hdlr\n * ```\n * @param initSegment the bytes of the init segment\n * @returns a hash of track type to timescale values or null if\n * the init segment is malformed.\n */\n\nexport interface InitDataTrack {\n  timescale: number;\n  id: number;\n  codec: string;\n  encrypted: boolean;\n  supplemental: string | undefined;\n}\n\ntype HdlrMetadata = 'meta';\ntype HdlrType =\n  | ElementaryStreamTypes.AUDIO\n  | ElementaryStreamTypes.VIDEO\n  | HdlrMetadata;\n\ntype StsdData = {\n  codec: string;\n  encrypted: boolean;\n  supplemental: string | undefined;\n};\n\nexport interface InitData extends Array<any> {\n  [index: number]:\n    | {\n        timescale: number;\n        type: HdlrType;\n        stsd: StsdData;\n        default?: {\n          duration: number;\n          flags: number;\n        };\n      }\n    | undefined;\n  audio?: InitDataTrack;\n  video?: InitDataTrack;\n  caption?: InitDataTrack;\n}\n\nexport function parseInitSegment(initSegment: Uint8Array): InitData {\n  const result: InitData = [];\n  const traks = findBox(initSegment, ['moov', 'trak']);\n  for (let i = 0; i < traks.length; i++) {\n    const trak = traks[i];\n    const tkhd = findBox(trak, ['tkhd'])[0];\n    if (tkhd as any) {\n      let version = tkhd[0];\n      const trackId = readUint32(tkhd, version === 0 ? 12 : 20);\n      const mdhd = findBox(trak, ['mdia', 'mdhd'])[0];\n      if (mdhd as any) {\n        version = mdhd[0];\n        const timescale = readUint32(mdhd, version === 0 ? 12 : 20);\n        const hdlr = findBox(trak, ['mdia', 'hdlr'])[0];\n        if (hdlr as any) {\n          const hdlrType = bin2str(hdlr.subarray(8, 12));\n          const type: HdlrType | undefined = {\n            soun: ElementaryStreamTypes.AUDIO as const,\n            vide: ElementaryStreamTypes.VIDEO as const,\n          }[hdlrType];\n          // Parse codec details\n          const stsdBox = findBox(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0];\n          const stsd = parseStsd(stsdBox);\n          if (type) {\n            // Add 'audio', 'video', and 'audiovideo' track records that will map to SourceBuffers\n            result[trackId] = { timescale, type, stsd };\n            result[type] = { timescale, id: trackId, ...stsd };\n          } else {\n            // Add 'meta' and other track records\n            result[trackId] = {\n              timescale,\n              type: hdlrType as HdlrType,\n              stsd,\n            };\n          }\n        }\n      }\n    }\n  }\n\n  const trex = findBox(initSegment, ['moov', 'mvex', 'trex']);\n  trex.forEach((trex) => {\n    const trackId = readUint32(trex, 4);\n    const track = result[trackId];\n    if (track) {\n      track.default = {\n        duration: readUint32(trex, 12),\n        flags: readUint32(trex, 20),\n      };\n    }\n  });\n\n  return result;\n}\n\nfunction parseStsd(stsd: Uint8Array): StsdData {\n  const sampleEntries = stsd.subarray(8);\n  const sampleEntriesEnd = sampleEntries.subarray(8 + 78);\n  const fourCC = bin2str(sampleEntries.subarray(4, 8));\n  let codec = fourCC;\n  let supplemental;\n  const encrypted = fourCC === 'enca' || fourCC === 'encv';\n  if (encrypted) {\n    const encBox = findBox(sampleEntries, [fourCC])[0];\n    const encBoxChildren = encBox.subarray(fourCC === 'enca' ? 28 : 78);\n    const sinfs = findBox(encBoxChildren, ['sinf']);\n    sinfs.forEach((sinf) => {\n      const schm = findBox(sinf, ['schm'])[0];\n      if (schm as any) {\n        const scheme = bin2str(schm.subarray(4, 8));\n        if (scheme === 'cbcs' || scheme === 'cenc') {\n          const frma = findBox(sinf, ['frma'])[0];\n          if (frma as any) {\n            // for encrypted content codec fourCC will be in frma\n            codec = bin2str(frma);\n          }\n        }\n      }\n    });\n  }\n  const codecFourCC = codec;\n  switch (codec) {\n    case 'avc1':\n    case 'avc2':\n    case 'avc3':\n    case 'avc4': {\n      // extract profile + compatibility + level out of avcC box\n      const avcCBox = findBox(sampleEntriesEnd, ['avcC'])[0];\n      if ((avcCBox as any) && avcCBox.length > 3) {\n        codec +=\n          '.' + toHex(avcCBox[1]) + toHex(avcCBox[2]) + toHex(avcCBox[3]);\n        supplemental = parseSupplementalDoViCodec(\n          codecFourCC === 'avc1' ? 'dva1' : 'dvav',\n          sampleEntriesEnd,\n        );\n      }\n      break;\n    }\n    case 'mp4a': {\n      const codecBox = findBox(sampleEntries, [fourCC])[0];\n      const esdsBox = findBox(codecBox.subarray(28), ['esds'])[0];\n      if ((esdsBox as any) && esdsBox.length > 7) {\n        let i = 4;\n        // ES Descriptor tag\n        if (esdsBox[i++] !== 0x03) {\n          break;\n        }\n        i = skipBERInteger(esdsBox, i);\n        i += 2; // skip es_id;\n        const flags = esdsBox[i++];\n        if (flags & 0x80) {\n          i += 2; // skip dependency es_id\n        }\n        if (flags & 0x40) {\n          i += esdsBox[i++]; // skip URL\n        }\n        // Decoder config descriptor\n        if (esdsBox[i++] !== 0x04) {\n          break;\n        }\n        i = skipBERInteger(esdsBox, i);\n        const objectType = esdsBox[i++];\n        if (objectType === 0x40) {\n          codec += '.' + toHex(objectType);\n        } else {\n          break;\n        }\n        i += 12;\n        // Decoder specific info\n        if (esdsBox[i++] !== 0x05) {\n          break;\n        }\n        i = skipBERInteger(esdsBox, i);\n        const firstByte = esdsBox[i++];\n        let audioObjectType = (firstByte & 0xf8) >> 3;\n        if (audioObjectType === 31) {\n          audioObjectType +=\n            1 + ((firstByte & 0x7) << 3) + ((esdsBox[i] & 0xe0) >> 5);\n        }\n        codec += '.' + audioObjectType;\n      }\n      break;\n    }\n    case 'hvc1':\n    case 'hev1': {\n      const hvcCBox = findBox(sampleEntriesEnd, ['hvcC'])[0];\n      if ((hvcCBox as any) && hvcCBox.length > 12) {\n        const profileByte = hvcCBox[1];\n        const profileSpace = ['', 'A', 'B', 'C'][profileByte >> 6];\n        const generalProfileIdc = profileByte & 0x1f;\n        const profileCompat = readUint32(hvcCBox, 2);\n        const tierFlag = (profileByte & 0x20) >> 5 ? 'H' : 'L';\n        const levelIDC = hvcCBox[12];\n        const constraintIndicator = hvcCBox.subarray(6, 12);\n        codec += '.' + profileSpace + generalProfileIdc;\n        codec +=\n          '.' + reverse32BitInt(profileCompat).toString(16).toUpperCase();\n        codec += '.' + tierFlag + levelIDC;\n        let constraintString = '';\n        for (let i = constraintIndicator.length; i--; ) {\n          const byte = constraintIndicator[i];\n          if (byte || constraintString) {\n            const encodedByte = byte.toString(16).toUpperCase();\n            constraintString = '.' + encodedByte + constraintString;\n          }\n        }\n        codec += constraintString;\n      }\n      supplemental = parseSupplementalDoViCodec(\n        codecFourCC == 'hev1' ? 'dvhe' : 'dvh1',\n        sampleEntriesEnd,\n      );\n      break;\n    }\n    case 'dvh1':\n    case 'dvhe':\n    case 'dvav':\n    case 'dva1':\n    case 'dav1': {\n      codec = parseSupplementalDoViCodec(codec, sampleEntriesEnd) || codec;\n      break;\n    }\n    case 'vp09': {\n      const vpcCBox = findBox(sampleEntriesEnd, ['vpcC'])[0];\n      if ((vpcCBox as any) && vpcCBox.length > 6) {\n        const profile = vpcCBox[4];\n        const level = vpcCBox[5];\n        const bitDepth = (vpcCBox[6] >> 4) & 0x0f;\n        codec +=\n          '.' +\n          addLeadingZero(profile) +\n          '.' +\n          addLeadingZero(level) +\n          '.' +\n          addLeadingZero(bitDepth);\n      }\n      break;\n    }\n    case 'av01': {\n      const av1CBox = findBox(sampleEntriesEnd, ['av1C'])[0];\n      if ((av1CBox as any) && av1CBox.length > 2) {\n        const profile = av1CBox[1] >>> 5;\n        const level = av1CBox[1] & 0x1f;\n        const tierFlag = av1CBox[2] >>> 7 ? 'H' : 'M';\n        const highBitDepth = (av1CBox[2] & 0x40) >> 6;\n        const twelveBit = (av1CBox[2] & 0x20) >> 5;\n        const bitDepth =\n          profile === 2 && highBitDepth\n            ? twelveBit\n              ? 12\n              : 10\n            : highBitDepth\n              ? 10\n              : 8;\n        const monochrome = (av1CBox[2] & 0x10) >> 4;\n        const chromaSubsamplingX = (av1CBox[2] & 0x08) >> 3;\n        const chromaSubsamplingY = (av1CBox[2] & 0x04) >> 2;\n        const chromaSamplePosition = av1CBox[2] & 0x03;\n        // TODO: parse color_description_present_flag\n        // default it to BT.709/limited range for now\n        // more info https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-syntax\n        const colorPrimaries = 1;\n        const transferCharacteristics = 1;\n        const matrixCoefficients = 1;\n        const videoFullRangeFlag = 0;\n        codec +=\n          '.' +\n          profile +\n          '.' +\n          addLeadingZero(level) +\n          tierFlag +\n          '.' +\n          addLeadingZero(bitDepth) +\n          '.' +\n          monochrome +\n          '.' +\n          chromaSubsamplingX +\n          chromaSubsamplingY +\n          chromaSamplePosition +\n          '.' +\n          addLeadingZero(colorPrimaries) +\n          '.' +\n          addLeadingZero(transferCharacteristics) +\n          '.' +\n          addLeadingZero(matrixCoefficients) +\n          '.' +\n          videoFullRangeFlag;\n        supplemental = parseSupplementalDoViCodec('dav1', sampleEntriesEnd);\n      }\n      break;\n    }\n    case 'ac-3':\n    case 'ec-3':\n    case 'alac':\n    case 'fLaC':\n    case 'Opus':\n    default:\n      break;\n  }\n  return { codec, encrypted, supplemental };\n}\n\nfunction parseSupplementalDoViCodec(\n  fourCC: string,\n  sampleEntriesEnd: Uint8Array,\n): string | undefined {\n  const dvvCResult = findBox(sampleEntriesEnd, ['dvvC']); // used by DoVi Profile 8 to 10\n  const dvXCBox = dvvCResult.length\n    ? dvvCResult[0]\n    : findBox(sampleEntriesEnd, ['dvcC'])[0]; // used by DoVi Profiles up to 7 and 20\n  if (dvXCBox as any) {\n    const doViProfile = (dvXCBox[2] >> 1) & 0x7f;\n    const doViLevel = ((dvXCBox[2] << 5) & 0x20) | ((dvXCBox[3] >> 3) & 0x1f);\n    return (\n      fourCC +\n      '.' +\n      addLeadingZero(doViProfile) +\n      '.' +\n      addLeadingZero(doViLevel)\n    );\n  }\n}\n\nfunction reverse32BitInt(val: number) {\n  let result = 0;\n  for (let i = 0; i < 32; i++) {\n    result |= ((val >> i) & 1) << (32 - 1 - i);\n  }\n  return result >>> 0;\n}\n\nfunction skipBERInteger(bytes: Uint8Array, i: number): number {\n  const limit = i + 5;\n  while (bytes[i++] & 0x80 && i < limit) {\n    /* do nothing */\n  }\n  return i;\n}\n\nfunction toHex(x: number): string {\n  return ('0' + x.toString(16).toUpperCase()).slice(-2);\n}\n\nfunction addLeadingZero(num: number): string {\n  return (num < 10 ? '0' : '') + num;\n}\n\nexport function patchEncyptionData(\n  initSegment: Uint8Array<ArrayBuffer> | undefined,\n  decryptdata: DecryptData | null,\n) {\n  if (!initSegment || !decryptdata) {\n    return;\n  }\n  const keyId = decryptdata.keyId;\n  if (keyId && decryptdata.isCommonEncryption) {\n    applyToTencBoxes(initSegment, (tenc, isAudio) => {\n      // Look for default key id (keyID offset is always 8 within the tenc box):\n      const tencKeyId = tenc.subarray(8, 24);\n      if (!tencKeyId.some((b) => b !== 0)) {\n        logger.log(\n          `[eme] Patching keyId in 'enc${\n            isAudio ? 'a' : 'v'\n          }>sinf>>tenc' box: ${arrayToHex(tencKeyId)} -> ${arrayToHex(keyId)}`,\n        );\n        tenc.set(keyId, 8);\n      }\n    });\n  }\n}\n\nexport function parseKeyIdsFromTenc(\n  initSegment: Uint8Array<ArrayBuffer>,\n): Uint8Array<ArrayBuffer>[] {\n  const keyIds: Uint8Array<ArrayBuffer>[] = [];\n  applyToTencBoxes(initSegment, (tenc) => keyIds.push(tenc.subarray(8, 24)));\n  return keyIds;\n}\n\nfunction applyToTencBoxes(\n  initSegment: Uint8Array<ArrayBuffer>,\n  predicate: (tenc: Uint8Array<ArrayBuffer>, isAudio: boolean) => void,\n) {\n  const traks = findBox(initSegment, ['moov', 'trak']);\n  traks.forEach((trak) => {\n    const stsd = findBox(trak, [\n      'mdia',\n      'minf',\n      'stbl',\n      'stsd',\n    ])[0] as BoxDataOrUndefined;\n    if (!stsd) return;\n    const sampleEntries = stsd.subarray(8);\n    let encBoxes = findBox(sampleEntries, ['enca']);\n    const isAudio = encBoxes.length > 0;\n    if (!isAudio) {\n      encBoxes = findBox(sampleEntries, ['encv']);\n    }\n    encBoxes.forEach((enc) => {\n      const encBoxChildren = isAudio ? enc.subarray(28) : enc.subarray(78);\n      const sinfBoxes = findBox(encBoxChildren, ['sinf']);\n      sinfBoxes.forEach((sinf) => {\n        const tenc = parseSinf(sinf);\n        if (tenc) {\n          predicate(tenc, isAudio);\n        }\n      });\n    });\n  });\n}\n\nexport function parseSinf(sinf: Uint8Array): BoxDataOrUndefined {\n  const schm = findBox(sinf, ['schm'])[0] as BoxDataOrUndefined;\n  if (schm) {\n    const scheme = bin2str(schm.subarray(4, 8));\n    if (scheme === 'cbcs' || scheme === 'cenc') {\n      const tenc = findBox(sinf, ['schi', 'tenc'])[0] as BoxDataOrUndefined;\n      if (tenc) {\n        return tenc;\n      }\n    } else if (scheme === 'cbc2') {\n      /* no-op */\n    }\n  }\n}\n\n/*\n  For Reference:\n  aligned(8) class TrackFragmentHeaderBox\n           extends FullBox(‘tfhd’, 0, tf_flags){\n     unsigned int(32)  track_ID;\n     // all the following are optional fields\n     unsigned int(64)  base_data_offset;\n     unsigned int(32)  sample_description_index;\n     unsigned int(32)  default_sample_duration;\n     unsigned int(32)  default_sample_size;\n     unsigned int(32)  default_sample_flags\n  }\n */\nexport type TrackTimes = {\n  duration: number;\n  keyFrameIndex?: number;\n  keyFrameStart?: number;\n  start: number;\n  sampleCount: number;\n  timescale: number;\n  type: HdlrType;\n};\n\nexport function getSampleData(\n  data: Uint8Array,\n  initData: InitData,\n  logger: ILogger,\n): Record<number, TrackTimes> {\n  const tracks: Record<number, TrackTimes> = {};\n  const trafs = findBox(data, ['moof', 'traf']);\n  for (let i = 0; i < trafs.length; i++) {\n    const traf = trafs[i];\n    // There is only one tfhd & trun per traf\n    // This is true for CMAF style content, and we should perhaps check the ftyp\n    // and only look for a single trun then, but for ISOBMFF we should check\n    // for multiple track runs.\n    const tfhd = findBox(traf, ['tfhd'])[0];\n    // get the track id from the tfhd\n    const id = readUint32(tfhd, 4);\n    const track = initData[id];\n    if (!track) {\n      continue;\n    }\n    (tracks[id] as any) ||= {\n      start: NaN,\n      duration: 0,\n      sampleCount: 0,\n      timescale: track.timescale,\n      type: track.type,\n    };\n    const trackTimes: TrackTimes = tracks[id];\n    // get start DTS\n    const tfdt = findBox(traf, ['tfdt'])[0];\n\n    if (tfdt as any) {\n      const version = tfdt[0];\n      let baseTime = readUint32(tfdt, 4);\n      if (version === 1) {\n        // If value is too large, assume signed 64-bit. Negative track fragment decode times are invalid, but they exist in the wild.\n        // This prevents large values from being used for initPTS, which can cause playlist sync issues.\n        // https://github.com/video-dev/hls.js/issues/5303\n        if (baseTime === UINT32_MAX) {\n          logger.warn(\n            `[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time`,\n          );\n        } else {\n          baseTime *= UINT32_MAX + 1;\n          baseTime += readUint32(tfdt, 8);\n        }\n      }\n      if (\n        Number.isFinite(baseTime) &&\n        (!Number.isFinite(trackTimes.start) || baseTime < trackTimes.start)\n      ) {\n        trackTimes.start = baseTime;\n      }\n    }\n\n    const trackDefault = track.default;\n    const tfhdFlags = readUint32(tfhd, 0) | trackDefault?.flags!;\n    let defaultSampleDuration: number = trackDefault?.duration || 0;\n    if (tfhdFlags & 0x000008) {\n      // 0x000008 indicates the presence of the default_sample_duration field\n      if (tfhdFlags & 0x000002) {\n        // 0x000002 indicates the presence of the sample_description_index field, which precedes default_sample_duration\n        // If present, the default_sample_duration exists at byte offset 12\n        defaultSampleDuration = readUint32(tfhd, 12);\n      } else {\n        // Otherwise, the duration is at byte offset 8\n        defaultSampleDuration = readUint32(tfhd, 8);\n      }\n    }\n    const truns = findBox(traf, ['trun']);\n    let sampleDTS = trackTimes.start || 0;\n    let rawDuration = 0;\n    let sampleDuration = defaultSampleDuration;\n    for (let j = 0; j < truns.length; j++) {\n      const trun = truns[j];\n      const sampleCount = readUint32(trun, 4);\n      const sampleIndex = trackTimes.sampleCount;\n      trackTimes.sampleCount += sampleCount;\n      // Get duration from samples\n      const dataOffsetPresent = trun[3] & 0x01;\n      const firstSampleFlagsPresent = trun[3] & 0x04;\n      const sampleDurationPresent = trun[2] & 0x01;\n      const sampleSizePresent = trun[2] & 0x02;\n      const sampleFlagsPresent = trun[2] & 0x04;\n      const sampleCompositionTimeOffsetPresent = trun[2] & 0x08;\n      let offset = 8;\n      let remaining = sampleCount;\n      if (dataOffsetPresent) {\n        offset += 4;\n      }\n      if (firstSampleFlagsPresent && sampleCount) {\n        const isNonSyncSample = trun[offset + 1] & 0x01;\n        if (!isNonSyncSample && trackTimes.keyFrameIndex === undefined) {\n          trackTimes.keyFrameIndex = sampleIndex;\n        }\n        offset += 4;\n        if (sampleDurationPresent) {\n          sampleDuration = readUint32(trun, offset);\n          offset += 4;\n        } else {\n          sampleDuration = defaultSampleDuration;\n        }\n        if (sampleSizePresent) {\n          offset += 4;\n        }\n        if (sampleCompositionTimeOffsetPresent) {\n          offset += 4;\n        }\n        sampleDTS += sampleDuration;\n        rawDuration += sampleDuration;\n        remaining--;\n      }\n      while (remaining--) {\n        if (sampleDurationPresent) {\n          sampleDuration = readUint32(trun, offset);\n          offset += 4;\n        } else {\n          sampleDuration = defaultSampleDuration;\n        }\n        if (sampleSizePresent) {\n          offset += 4;\n        }\n        if (sampleFlagsPresent) {\n          const isNonSyncSample = trun[offset + 1] & 0x01;\n          if (!isNonSyncSample) {\n            if (trackTimes.keyFrameIndex === undefined) {\n              trackTimes.keyFrameIndex =\n                trackTimes.sampleCount - (remaining + 1);\n              trackTimes.keyFrameStart = sampleDTS;\n            }\n          }\n          offset += 4;\n        }\n        if (sampleCompositionTimeOffsetPresent) {\n          offset += 4;\n        }\n        sampleDTS += sampleDuration;\n        rawDuration += sampleDuration;\n      }\n      if (!rawDuration && defaultSampleDuration) {\n        rawDuration += defaultSampleDuration * sampleCount;\n      }\n    }\n    trackTimes.duration += rawDuration;\n  }\n  if (!Object.keys(tracks).some((trackId) => tracks[trackId].duration)) {\n    // If duration samples are not available in the traf use sidx subsegment_duration\n    let sidxMinStart = Infinity;\n    let sidxMaxEnd = 0;\n    const sidxs = findBox(data, ['sidx']);\n    for (let i = 0; i < sidxs.length; i++) {\n      const sidx = parseSegmentIndex(sidxs[i]);\n      if (sidx?.references) {\n        sidxMinStart = Math.min(\n          sidxMinStart,\n          sidx.earliestPresentationTime / sidx.timescale,\n        );\n        const subSegmentDuration = sidx.references.reduce(\n          (dur, ref) => dur + ref.info.duration || 0,\n          0,\n        );\n        sidxMaxEnd = Math.max(\n          sidxMaxEnd,\n          subSegmentDuration + sidx.earliestPresentationTime / sidx.timescale,\n        );\n      }\n    }\n    if (sidxMaxEnd && Number.isFinite(sidxMaxEnd)) {\n      Object.keys(tracks).forEach((trackId) => {\n        if (!tracks[trackId].duration) {\n          tracks[trackId].duration =\n            sidxMaxEnd * tracks[trackId].timescale - tracks[trackId].start;\n        }\n      });\n    }\n  }\n  return tracks;\n}\n\n// TODO: Check if the last moof+mdat pair is part of the valid range\nexport function segmentValidRange(\n  data: Uint8Array<ArrayBuffer>,\n): SegmentedRange {\n  const segmentedRange: SegmentedRange = {\n    valid: null,\n    remainder: null,\n  };\n\n  const moofs = findBox(data, ['moof']);\n  if (moofs.length < 2) {\n    segmentedRange.remainder = data;\n    return segmentedRange;\n  }\n  const last = moofs[moofs.length - 1];\n  // Offset by 8 bytes; findBox offsets the start by as much\n  segmentedRange.valid = data.slice(0, last.byteOffset - 8);\n  segmentedRange.remainder = data.slice(last.byteOffset - 8);\n  return segmentedRange;\n}\n\nexport interface SegmentedRange {\n  valid: Uint8Array<ArrayBuffer> | null;\n  remainder: Uint8Array<ArrayBuffer> | null;\n}\n\nexport function appendUint8Array(data1: Uint8Array, data2: Uint8Array) {\n  const temp = new Uint8Array(data1.length + data2.length);\n  temp.set(data1);\n  temp.set(data2, data1.length);\n  return temp;\n}\n\nexport interface IEmsgParsingData {\n  schemeIdUri: string;\n  value: string;\n  timeScale: number;\n  presentationTimeDelta?: number;\n  presentationTime?: number;\n  eventDuration: number;\n  id: number;\n  payload: Uint8Array;\n}\n\nexport function parseSamples(\n  timeOffset: number,\n  track: PassthroughTrack,\n): UserdataSample[] {\n  const seiSamples = [] as UserdataSample[];\n  const videoData = track.samples;\n  const timescale = track.timescale;\n  const trackId = track.id;\n  let isHEVCFlavor = false;\n\n  const moofs = findBox(videoData, ['moof']);\n  moofs.map((moof) => {\n    const moofOffset = moof.byteOffset - 8;\n    const trafs = findBox(moof, ['traf']);\n    trafs.map((traf) => {\n      // get the base media decode time from the tfdt\n      const baseTime = findBox(traf, ['tfdt']).map((tfdt) => {\n        const version = tfdt[0];\n        let result = readUint32(tfdt, 4);\n        if (version === 1) {\n          result *= Math.pow(2, 32);\n          result += readUint32(tfdt, 8);\n        }\n        return result / timescale;\n      })[0];\n\n      if ((baseTime as any) !== undefined) {\n        timeOffset = baseTime;\n      }\n\n      return findBox(traf, ['tfhd']).map((tfhd) => {\n        const id = readUint32(tfhd, 4);\n        const tfhdFlags = readUint32(tfhd, 0) & 0xffffff;\n        const baseDataOffsetPresent = (tfhdFlags & 0x000001) !== 0;\n        const sampleDescriptionIndexPresent = (tfhdFlags & 0x000002) !== 0;\n        const defaultSampleDurationPresent = (tfhdFlags & 0x000008) !== 0;\n        let defaultSampleDuration = 0;\n        const defaultSampleSizePresent = (tfhdFlags & 0x000010) !== 0;\n        let defaultSampleSize = 0;\n        const defaultSampleFlagsPresent = (tfhdFlags & 0x000020) !== 0;\n        let tfhdOffset = 8;\n\n        if (id === trackId) {\n          if (baseDataOffsetPresent) {\n            tfhdOffset += 8;\n          }\n          if (sampleDescriptionIndexPresent) {\n            tfhdOffset += 4;\n          }\n          if (defaultSampleDurationPresent) {\n            defaultSampleDuration = readUint32(tfhd, tfhdOffset);\n            tfhdOffset += 4;\n          }\n          if (defaultSampleSizePresent) {\n            defaultSampleSize = readUint32(tfhd, tfhdOffset);\n            tfhdOffset += 4;\n          }\n          if (defaultSampleFlagsPresent) {\n            tfhdOffset += 4;\n          }\n          if (track.type === 'video') {\n            isHEVCFlavor = isHEVC(track.codec);\n          }\n\n          findBox(traf, ['trun']).map((trun) => {\n            const version = trun[0];\n            const flags = readUint32(trun, 0) & 0xffffff;\n            const dataOffsetPresent = (flags & 0x000001) !== 0;\n            let dataOffset = 0;\n            const firstSampleFlagsPresent = (flags & 0x000004) !== 0;\n            const sampleDurationPresent = (flags & 0x000100) !== 0;\n            let sampleDuration = 0;\n            const sampleSizePresent = (flags & 0x000200) !== 0;\n            let sampleSize = 0;\n            const sampleFlagsPresent = (flags & 0x000400) !== 0;\n            const sampleCompositionOffsetsPresent = (flags & 0x000800) !== 0;\n            let compositionOffset = 0;\n            const sampleCount = readUint32(trun, 4);\n            let trunOffset = 8; // past version, flags, and sample count\n\n            if (dataOffsetPresent) {\n              dataOffset = readUint32(trun, trunOffset);\n              trunOffset += 4;\n            }\n            if (firstSampleFlagsPresent) {\n              trunOffset += 4;\n            }\n\n            let sampleOffset = dataOffset + moofOffset;\n\n            for (let ix = 0; ix < sampleCount; ix++) {\n              if (sampleDurationPresent) {\n                sampleDuration = readUint32(trun, trunOffset);\n                trunOffset += 4;\n              } else {\n                sampleDuration = defaultSampleDuration;\n              }\n              if (sampleSizePresent) {\n                sampleSize = readUint32(trun, trunOffset);\n                trunOffset += 4;\n              } else {\n                sampleSize = defaultSampleSize;\n              }\n              if (sampleFlagsPresent) {\n                trunOffset += 4;\n              }\n              if (sampleCompositionOffsetsPresent) {\n                if (version === 0) {\n                  compositionOffset = readUint32(trun, trunOffset);\n                } else {\n                  compositionOffset = readSint32(trun, trunOffset);\n                }\n                trunOffset += 4;\n              }\n              if (track.type === ElementaryStreamTypes.VIDEO) {\n                let naluTotalSize = 0;\n                while (naluTotalSize < sampleSize) {\n                  const naluSize = readUint32(videoData, sampleOffset);\n                  sampleOffset += 4;\n                  if (isSEIMessage(isHEVCFlavor, videoData[sampleOffset])) {\n                    const data = videoData.subarray(\n                      sampleOffset,\n                      sampleOffset + naluSize,\n                    );\n                    parseSEIMessageFromNALu(\n                      data,\n                      isHEVCFlavor ? 2 : 1,\n                      timeOffset + compositionOffset / timescale,\n                      seiSamples,\n                    );\n                  }\n                  sampleOffset += naluSize;\n                  naluTotalSize += naluSize + 4;\n                }\n              }\n\n              timeOffset += sampleDuration / timescale;\n            }\n          });\n        }\n      });\n    });\n  });\n  return seiSamples;\n}\n\nexport function isHEVC(codec: string | undefined) {\n  if (!codec) {\n    return false;\n  }\n  const baseCodec = codec.substring(0, 4);\n  return (\n    baseCodec === 'hvc1' ||\n    baseCodec === 'hev1' ||\n    // Dolby Vision\n    baseCodec === 'dvh1' ||\n    baseCodec === 'dvhe'\n  );\n}\n\nfunction isSEIMessage(isHEVCFlavor: boolean, naluHeader: number) {\n  if (isHEVCFlavor) {\n    const naluType = (naluHeader >> 1) & 0x3f;\n    return naluType === 39 || naluType === 40;\n  } else {\n    const naluType = naluHeader & 0x1f;\n    return naluType === 6;\n  }\n}\n\nexport function parseSEIMessageFromNALu(\n  unescapedData: Uint8Array,\n  headerSize: number,\n  pts: number,\n  samples: UserdataSample[],\n) {\n  const data = discardEPB(unescapedData);\n  let seiPtr = 0;\n  // skip nal header\n  seiPtr += headerSize;\n  let payloadType = 0;\n  let payloadSize = 0;\n  let b = 0;\n\n  while (seiPtr < data.length) {\n    payloadType = 0;\n    do {\n      if (seiPtr >= data.length) {\n        break;\n      }\n      b = data[seiPtr++];\n      payloadType += b;\n    } while (b === 0xff);\n\n    // Parse payload size.\n    payloadSize = 0;\n    do {\n      if (seiPtr >= data.length) {\n        break;\n      }\n      b = data[seiPtr++];\n      payloadSize += b;\n    } while (b === 0xff);\n\n    const leftOver = data.length - seiPtr;\n    // Create a variable to process the payload\n    let payPtr = seiPtr;\n\n    // Increment the seiPtr to the end of the payload\n    if (payloadSize < leftOver) {\n      seiPtr += payloadSize;\n    } else if (payloadSize > leftOver) {\n      // Some type of corruption has happened?\n      logger.error(\n        `Malformed SEI payload. ${payloadSize} is too small, only ${leftOver} bytes left to parse.`,\n      );\n      // We might be able to parse some data, but let's be safe and ignore it.\n      break;\n    }\n\n    if (payloadType === 4) {\n      const countryCode = data[payPtr++];\n      if (countryCode === 181) {\n        const providerCode = readUint16(data, payPtr);\n        payPtr += 2;\n\n        if (providerCode === 49) {\n          const userStructure = readUint32(data, payPtr);\n          payPtr += 4;\n\n          if (userStructure === 0x47413934) {\n            const userDataType = data[payPtr++];\n\n            // Raw CEA-608 bytes wrapped in CEA-708 packet\n            if (userDataType === 3) {\n              const firstByte = data[payPtr++];\n              const totalCCs = 0x1f & firstByte;\n              const enabled = 0x40 & firstByte;\n              const totalBytes = enabled ? 2 + totalCCs * 3 : 0;\n              const byteArray = new Uint8Array(totalBytes);\n              if (enabled) {\n                byteArray[0] = firstByte;\n                for (let i = 1; i < totalBytes; i++) {\n                  byteArray[i] = data[payPtr++];\n                }\n              }\n\n              samples.push({\n                type: userDataType,\n                payloadType,\n                pts,\n                bytes: byteArray,\n              });\n            }\n          }\n        }\n      }\n    } else if (payloadType === 5) {\n      if (payloadSize > 16) {\n        const uuidStrArray: Array<string> = [];\n        for (let i = 0; i < 16; i++) {\n          const b = data[payPtr++].toString(16);\n          uuidStrArray.push(b.length == 1 ? '0' + b : b);\n\n          if (i === 3 || i === 5 || i === 7 || i === 9) {\n            uuidStrArray.push('-');\n          }\n        }\n        const length = payloadSize - 16;\n        const userDataBytes = new Uint8Array(length);\n        for (let i = 0; i < length; i++) {\n          userDataBytes[i] = data[payPtr++];\n        }\n\n        samples.push({\n          payloadType,\n          pts,\n          uuid: uuidStrArray.join(''),\n          userData: utf8ArrayToStr(userDataBytes),\n          userDataBytes,\n        });\n      }\n    }\n  }\n}\n\n/**\n * remove Emulation Prevention bytes from a RBSP\n */\nexport function discardEPB(data: Uint8Array): Uint8Array {\n  const length = data.byteLength;\n  const EPBPositions = [] as Array<number>;\n  let i = 1;\n\n  // Find all `Emulation Prevention Bytes`\n  while (i < length - 2) {\n    if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {\n      EPBPositions.push(i + 2);\n      i += 2;\n    } else {\n      i++;\n    }\n  }\n\n  // If no Emulation Prevention Bytes were found just return the original\n  // array\n  if (EPBPositions.length === 0) {\n    return data;\n  }\n\n  // Create a new array to hold the NAL unit data\n  const newLength = length - EPBPositions.length;\n  const newData = new Uint8Array(newLength);\n  let sourceIndex = 0;\n\n  for (i = 0; i < newLength; sourceIndex++, i++) {\n    if (sourceIndex === EPBPositions[0]) {\n      // Skip this byte\n      sourceIndex++;\n      // Remove this position index\n      EPBPositions.shift();\n    }\n    newData[i] = data[sourceIndex];\n  }\n  return newData;\n}\n\nexport function parseEmsg(data: Uint8Array): IEmsgParsingData {\n  const version = data[0];\n  let schemeIdUri: string = '';\n  let value: string = '';\n  let timeScale: number = 0;\n  let presentationTimeDelta: number = 0;\n  let presentationTime: number = 0;\n  let eventDuration: number = 0;\n  let id: number = 0;\n  let offset: number = 0;\n\n  if (version === 0) {\n    while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n      schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n\n    schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n\n    while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n      value += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n\n    value += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n\n    timeScale = readUint32(data, 12);\n    presentationTimeDelta = readUint32(data, 16);\n    eventDuration = readUint32(data, 20);\n    id = readUint32(data, 24);\n    offset = 28;\n  } else if (version === 1) {\n    offset += 4;\n    timeScale = readUint32(data, offset);\n    offset += 4;\n    const leftPresentationTime = readUint32(data, offset);\n    offset += 4;\n    const rightPresentationTime = readUint32(data, offset);\n    offset += 4;\n    presentationTime = 2 ** 32 * leftPresentationTime + rightPresentationTime;\n    if (!Number.isSafeInteger(presentationTime)) {\n      presentationTime = Number.MAX_SAFE_INTEGER;\n      logger.warn(\n        'Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box',\n      );\n    }\n\n    eventDuration = readUint32(data, offset);\n    offset += 4;\n    id = readUint32(data, offset);\n    offset += 4;\n\n    while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n      schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n\n    schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n\n    while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n      value += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n\n    value += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n  }\n  const payload = data.subarray(offset, data.byteLength);\n\n  return {\n    schemeIdUri,\n    value,\n    timeScale,\n    presentationTime,\n    presentationTimeDelta,\n    eventDuration,\n    id,\n    payload,\n  };\n}\n\nexport function mp4Box(type: ArrayLike<number>, ...payload: Uint8Array[]) {\n  const len = payload.length;\n  let size = 8;\n  let i = len;\n  while (i--) {\n    size += payload[i].byteLength;\n  }\n  const result = new Uint8Array(size);\n  result[0] = (size >> 24) & 0xff;\n  result[1] = (size >> 16) & 0xff;\n  result[2] = (size >> 8) & 0xff;\n  result[3] = size & 0xff;\n  result.set(type, 4);\n  for (i = 0, size = 8; i < len; i++) {\n    result.set(payload[i], size);\n    size += payload[i].byteLength;\n  }\n  return result;\n}\n\nexport function mp4pssh(\n  systemId: Uint8Array,\n  keyids: Array<Uint8Array> | null,\n  data: Uint8Array,\n) {\n  if (systemId.byteLength !== 16) {\n    throw new RangeError('Invalid system id');\n  }\n  let version;\n  let kids;\n  if (keyids) {\n    version = 1;\n    kids = new Uint8Array(keyids.length * 16);\n    for (let ix = 0; ix < keyids.length; ix++) {\n      const k = keyids[ix]; // uint8array\n      if (k.byteLength !== 16) {\n        throw new RangeError('Invalid key');\n      }\n      kids.set(k, ix * 16);\n    }\n  } else {\n    version = 0;\n    kids = new Uint8Array();\n  }\n  let kidCount;\n  if (version > 0) {\n    kidCount = new Uint8Array(4);\n    if (keyids!.length > 0) {\n      new DataView(kidCount.buffer).setUint32(0, keyids!.length, false);\n    }\n  } else {\n    kidCount = new Uint8Array();\n  }\n  const dataSize = new Uint8Array(4);\n  if (data.byteLength > 0) {\n    new DataView(dataSize.buffer).setUint32(0, data.byteLength, false);\n  }\n  return mp4Box(\n    [112, 115, 115, 104],\n    new Uint8Array([\n      version,\n      0x00,\n      0x00,\n      0x00, // Flags\n    ]),\n    systemId, // 16 bytes\n    kidCount,\n    kids,\n    dataSize,\n    data,\n  );\n}\n\nexport type PsshData = {\n  version: 0 | 1;\n  systemId: KeySystemIds;\n  kids: null | Uint8Array<ArrayBuffer>[];\n  data: null | Uint8Array<ArrayBuffer>;\n  offset: number;\n  size: number;\n};\n\nexport type PsshInvalidResult = {\n  systemId?: undefined;\n  kids?: undefined;\n  offset: number;\n  size: number;\n};\n\nexport function parseMultiPssh(\n  initData: ArrayBuffer,\n): (PsshData | PsshInvalidResult)[] {\n  const results: (PsshData | PsshInvalidResult)[] = [];\n  if (initData instanceof ArrayBuffer) {\n    const length = initData.byteLength;\n    let offset = 0;\n    while (offset + 32 < length) {\n      const view = new DataView(initData, offset);\n      const pssh = parsePssh(view);\n      results.push(pssh);\n      offset += pssh.size;\n    }\n  }\n  return results;\n}\n\nfunction parsePssh(view: DataView<ArrayBuffer>): PsshData | PsshInvalidResult {\n  const size = view.getUint32(0);\n  const offset = view.byteOffset;\n  const length = view.byteLength;\n  if (length < size) {\n    return {\n      offset,\n      size: length,\n    };\n  }\n  const type = view.getUint32(4);\n  if (type !== 0x70737368) {\n    return { offset, size };\n  }\n  const version = view.getUint32(8) >>> 24;\n  if (version !== 0 && version !== 1) {\n    return { offset, size };\n  }\n  const buffer = view.buffer;\n  const systemId = arrayToHex(\n    new Uint8Array(buffer, offset + 12, 16),\n  ) as KeySystemIds;\n\n  let kids: null | Uint8Array<ArrayBuffer>[] = null;\n  let data: null | Uint8Array<ArrayBuffer> = null;\n  let dataSizeOffset = 0;\n\n  if (version === 0) {\n    dataSizeOffset = 28;\n  } else {\n    const kidCounts = view.getUint32(28);\n    if (!kidCounts || length < 32 + kidCounts * 16) {\n      return { offset, size };\n    }\n    kids = [];\n    for (let i = 0; i < kidCounts; i++) {\n      kids.push(new Uint8Array(buffer, offset + 32 + i * 16, 16));\n    }\n    dataSizeOffset = 32 + kidCounts * 16;\n  }\n\n  if (!dataSizeOffset) {\n    return { offset, size };\n  }\n\n  const dataSizeOrKidCount = view.getUint32(dataSizeOffset);\n  if (size - 32 < dataSizeOrKidCount) {\n    return { offset, size };\n  }\n  data = new Uint8Array(\n    buffer,\n    offset + dataSizeOffset + 4,\n    dataSizeOrKidCount,\n  );\n  return {\n    version,\n    systemId,\n    kids,\n    data,\n    offset,\n    size,\n  };\n}\n", "import { getMediaSource } from './mediasource-helper';\nimport { isHEVC } from './mp4-tools';\n\nexport const userAgentHevcSupportIsInaccurate = () => {\n  return /\\(Windows.+Firefox\\//i.test(navigator.userAgent);\n};\n\n// from http://mp4ra.org/codecs.html\n// values indicate codec selection preference (lower is higher priority)\nexport const sampleEntryCodesISO = {\n  audio: {\n    a3ds: 1,\n    'ac-3': 0.95,\n    'ac-4': 1,\n    alac: 0.9,\n    alaw: 1,\n    dra1: 1,\n    'dts+': 1,\n    'dts-': 1,\n    dtsc: 1,\n    dtse: 1,\n    dtsh: 1,\n    'ec-3': 0.9,\n    enca: 1,\n    fLaC: 0.9, // MP4-RA listed codec entry for FLAC\n    flac: 0.9, // legacy browser codec name for FLAC\n    FLAC: 0.9, // some manifests may list \"FLAC\" with Apple's tools\n    g719: 1,\n    g726: 1,\n    m4ae: 1,\n    mha1: 1,\n    mha2: 1,\n    mhm1: 1,\n    mhm2: 1,\n    mlpa: 1,\n    mp4a: 1,\n    'raw ': 1,\n    Opus: 1,\n    opus: 1, // browsers expect this to be lowercase despite MP4RA says 'Opus'\n    samr: 1,\n    sawb: 1,\n    sawp: 1,\n    sevc: 1,\n    sqcp: 1,\n    ssmv: 1,\n    twos: 1,\n    ulaw: 1,\n  },\n  video: {\n    avc1: 1,\n    avc2: 1,\n    avc3: 1,\n    avc4: 1,\n    avcp: 1,\n    av01: 0.8,\n    dav1: 0.8,\n    drac: 1,\n    dva1: 1,\n    dvav: 1,\n    dvh1: 0.7,\n    dvhe: 0.7,\n    encv: 1,\n    hev1: 0.75,\n    hvc1: 0.75,\n    mjp2: 1,\n    mp4v: 1,\n    mvc1: 1,\n    mvc2: 1,\n    mvc3: 1,\n    mvc4: 1,\n    resv: 1,\n    rv60: 1,\n    s263: 1,\n    svc1: 1,\n    svc2: 1,\n    'vc-1': 1,\n    vp08: 1,\n    vp09: 0.9,\n  },\n  text: {\n    stpp: 1,\n    wvtt: 1,\n  },\n} as const;\n\nexport type CodecType = 'audio' | 'video';\n\nexport function isCodecType(codec: string, type: CodecType): boolean {\n  const typeCodes = sampleEntryCodesISO[type];\n  return !!typeCodes && !!typeCodes[codec.slice(0, 4)];\n}\n\nexport function areCodecsMediaSourceSupported(\n  codecs: string,\n  type: CodecType,\n  preferManagedMediaSource = true,\n): boolean {\n  return !codecs\n    .split(',')\n    .some(\n      (codec) =>\n        !isCodecMediaSourceSupported(codec, type, preferManagedMediaSource),\n    );\n}\n\nfunction isCodecMediaSourceSupported(\n  codec: string,\n  type: CodecType,\n  preferManagedMediaSource = true,\n): boolean {\n  const MediaSource = getMediaSource(preferManagedMediaSource);\n  return MediaSource?.isTypeSupported(mimeTypeForCodec(codec, type)) ?? false;\n}\n\nexport function mimeTypeForCodec(codec: string, type: CodecType): string {\n  return `${type}/mp4;codecs=${codec}`;\n}\n\nexport function videoCodecPreferenceValue(\n  videoCodec: string | undefined,\n): number {\n  if (videoCodec) {\n    const fourCC = videoCodec.substring(0, 4);\n    return sampleEntryCodesISO.video[fourCC];\n  }\n  return 2;\n}\n\nexport function codecsSetSelectionPreferenceValue(codecSet: string): number {\n  const limitedHevcSupport = userAgentHevcSupportIsInaccurate();\n  return codecSet.split(',').reduce((num, fourCC) => {\n    const lowerPriority = limitedHevcSupport && isHEVC(fourCC);\n    const preferenceValue = lowerPriority\n      ? 9\n      : sampleEntryCodesISO.video[fourCC];\n    if (preferenceValue) {\n      return (preferenceValue * 2 + num) / (num ? 3 : 2);\n    }\n    return (sampleEntryCodesISO.audio[fourCC] + num) / (num ? 2 : 1);\n  }, 0);\n}\n\ninterface CodecNameCache {\n  flac?: string;\n  opus?: string;\n}\n\nconst CODEC_COMPATIBLE_NAMES: CodecNameCache = {};\n\ntype LowerCaseCodecType = 'flac' | 'opus';\n\nfunction getCodecCompatibleNameLower(\n  lowerCaseCodec: LowerCaseCodecType,\n  preferManagedMediaSource = true,\n): string {\n  if (CODEC_COMPATIBLE_NAMES[lowerCaseCodec]) {\n    return CODEC_COMPATIBLE_NAMES[lowerCaseCodec]!;\n  }\n\n  const codecsToCheck = {\n    // Idealy fLaC and Opus would be first (spec-compliant) but\n    // some browsers will report that fLaC is supported then fail.\n    // see: https://bugs.chromium.org/p/chromium/issues/detail?id=1422728\n    flac: ['flac', 'fLaC', 'FLAC'],\n    opus: ['opus', 'Opus'],\n    // Replace audio codec info if browser does not support mp4a.40.34,\n    // and demuxer can fallback to 'audio/mpeg' or 'audio/mp4;codecs=\"mp3\"'\n    'mp4a.40.34': ['mp3'],\n  }[lowerCaseCodec];\n\n  for (let i = 0; i < codecsToCheck.length; i++) {\n    if (\n      isCodecMediaSourceSupported(\n        codecsToCheck[i],\n        'audio',\n        preferManagedMediaSource,\n      )\n    ) {\n      CODEC_COMPATIBLE_NAMES[lowerCaseCodec] = codecsToCheck[i];\n      return codecsToCheck[i];\n    } else if (\n      codecsToCheck[i] === 'mp3' &&\n      getMediaSource(preferManagedMediaSource)?.isTypeSupported('audio/mpeg')\n    ) {\n      return '';\n    }\n  }\n\n  return lowerCaseCodec;\n}\n\nconst AUDIO_CODEC_REGEXP = /flac|opus|mp4a\\.40\\.34/i;\nexport function getCodecCompatibleName(\n  codec: string,\n  preferManagedMediaSource = true,\n): string {\n  return codec.replace(AUDIO_CODEC_REGEXP, (m) =>\n    getCodecCompatibleNameLower(\n      m.toLowerCase() as LowerCaseCodecType,\n      preferManagedMediaSource,\n    ),\n  );\n}\n\nexport function replaceVideoCodec(\n  originalCodecs: string | undefined,\n  newVideoCodec: string | undefined,\n): string | undefined {\n  const codecs: string[] = [];\n  if (originalCodecs) {\n    const allCodecs = originalCodecs.split(',');\n    for (let i = 0; i < allCodecs.length; i++) {\n      if (!isCodecType(allCodecs[i], 'video')) {\n        codecs.push(allCodecs[i]);\n      }\n    }\n  }\n  if (newVideoCodec) {\n    codecs.push(newVideoCodec);\n  }\n  return codecs.join(',');\n}\n\nexport function pickMostCompleteCodecName(\n  parsedCodec: string | undefined,\n  levelCodec: string | undefined,\n): string | undefined {\n  // Parsing of mp4a codecs strings in mp4-tools from media is incomplete as of d8c6c7a\n  // so use level codec is parsed codec is unavailable or incomplete\n  if (\n    parsedCodec &&\n    (parsedCodec.length > 4 ||\n      ['ac-3', 'ec-3', 'alac', 'fLaC', 'Opus'].indexOf(parsedCodec) !== -1)\n  ) {\n    if (\n      isCodecSupportedAsType(parsedCodec, 'audio') ||\n      isCodecSupportedAsType(parsedCodec, 'video')\n    ) {\n      return parsedCodec;\n    }\n  }\n  if (levelCodec) {\n    const levelCodecs = levelCodec.split(',');\n    if (levelCodecs.length > 1) {\n      if (parsedCodec) {\n        for (let i = levelCodecs.length; i--; ) {\n          if (levelCodecs[i].substring(0, 4) === parsedCodec.substring(0, 4)) {\n            return levelCodecs[i];\n          }\n        }\n      }\n      return levelCodecs[0];\n    }\n  }\n  return levelCodec || parsedCodec;\n}\n\nfunction isCodecSupportedAsType(codec: string, type: CodecType): boolean {\n  return isCodecType(codec, type) && isCodecMediaSourceSupported(codec, type);\n}\n\nexport function convertAVC1ToAVCOTI(videoCodecs: string): string {\n  // Convert avc1 codec string from RFC-4281 to RFC-6381 for MediaSource.isTypeSupported\n  // Examples: avc1.66.30 to avc1.42001e and avc1.77.30,avc1.66.30 to avc1.4d001e,avc1.42001e.\n  const codecs = videoCodecs.split(',');\n  for (let i = 0; i < codecs.length; i++) {\n    const avcdata = codecs[i].split('.');\n    // only convert codec strings starting with avc1 (Examples: avc1.64001f,dvh1.05.07)\n    if (avcdata.length > 2 && avcdata[0] === 'avc1') {\n      codecs[i] = `avc1.${parseInt(avcdata[1]).toString(16)}${(\n        '000' + parseInt(avcdata[2]).toString(16)\n      ).slice(-4)}`;\n    }\n  }\n  return codecs.join(',');\n}\n\nexport function fillInMissingAV01Params(videoCodec: string): string {\n  // Used to fill in incomplete AV1 playlist CODECS strings for mediaCapabilities.decodingInfo queries\n  if (videoCodec.startsWith('av01.')) {\n    const av1params = videoCodec.split('.');\n    const placeholders = ['0', '111', '01', '01', '01', '0'];\n    for (let i = av1params.length; i > 4 && i < 10; i++) {\n      av1params[i] = placeholders[i - 4];\n    }\n    return av1params.join('.');\n  }\n  return videoCodec;\n}\n\nexport interface TypeSupported {\n  mpeg: boolean;\n  mp3: boolean;\n  ac3: boolean;\n}\n\nexport function getM2TSSupportedAudioTypes(\n  preferManagedMediaSource: boolean,\n): TypeSupported {\n  const MediaSource = getMediaSource(preferManagedMediaSource) || {\n    isTypeSupported: () => false,\n  };\n  return {\n    mpeg: MediaSource.isTypeSupported('audio/mpeg'),\n    mp3: MediaSource.isTypeSupported('audio/mp4; codecs=\"mp3\"'),\n    ac3: __USE_M2TS_ADVANCED_CODECS__\n      ? MediaSource.isTypeSupported('audio/mp4; codecs=\"ac-3\"')\n      : false,\n  };\n}\n\nexport function getCodecsForMimeType(mimeType: string): string {\n  return mimeType.replace(/^.+codecs=[\"']?([^\"']+).*$/, '$1');\n}\n", "import {\n  fillInMissingAV01Params,\n  getCodecsForMimeType,\n  mimeTypeForCodec,\n  userAgentHevcSupportIsInaccurate,\n} from './codecs';\nimport { isHEVC } from './mp4-tools';\nimport type { AudioTracksByGroup } from './rendition-helper';\nimport type { Level, VideoRange } from '../types/level';\nimport type { AudioSelectionOption } from '../types/media-playlist';\n\nexport type MediaDecodingInfo = {\n  supported: boolean;\n  configurations: readonly MediaDecodingConfiguration[];\n  decodingInfoResults: readonly MediaCapabilitiesDecodingInfo[];\n  error?: Error;\n};\n\n// @ts-ignore\nconst supportedResult: MediaCapabilitiesDecodingInfo = {\n  supported: true,\n  powerEfficient: true,\n  smooth: true,\n  // keySystemAccess: null,\n};\n\n// @ts-ignore\nconst unsupportedResult: MediaCapabilitiesDecodingInfo = {\n  supported: false,\n  smooth: false,\n  powerEfficient: false,\n  // keySystemAccess: null,\n};\n\nexport const SUPPORTED_INFO_DEFAULT: MediaDecodingInfo = {\n  supported: true,\n  configurations: [] as MediaDecodingConfiguration[],\n  decodingInfoResults: [supportedResult],\n} as const;\n\nexport function getUnsupportedResult(\n  error: Error,\n  configurations: MediaDecodingConfiguration[],\n): MediaDecodingInfo {\n  return {\n    supported: false,\n    configurations,\n    decodingInfoResults: [unsupportedResult],\n    error,\n  };\n}\n\nexport function requiresMediaCapabilitiesDecodingInfo(\n  level: Level,\n  audioTracksByGroup: AudioTracksByGroup,\n  currentVideoRange: VideoRange | undefined,\n  currentFrameRate: number,\n  currentBw: number,\n  audioPreference: AudioSelectionOption | undefined,\n): boolean {\n  // Only test support when configuration is exceeds minimum options\n  const videoCodecs = level.videoCodec;\n  const audioGroups = level.audioCodec ? level.audioGroups : null;\n  const audioCodecPreference = audioPreference?.audioCodec;\n  const channelsPreference = audioPreference?.channels;\n  const maxChannels = channelsPreference\n    ? parseInt(channelsPreference)\n    : audioCodecPreference\n      ? Infinity\n      : 2;\n  let audioChannels: Record<string, number> | null = null;\n  if (audioGroups?.length) {\n    try {\n      if (audioGroups.length === 1 && audioGroups[0]) {\n        audioChannels = audioTracksByGroup.groups[audioGroups[0]].channels;\n      } else {\n        audioChannels = audioGroups.reduce(\n          (acc, groupId) => {\n            if (groupId) {\n              const audioTrackGroup = audioTracksByGroup.groups[groupId];\n              if (!audioTrackGroup) {\n                throw new Error(`Audio track group ${groupId} not found`);\n              }\n              // Sum all channel key values\n              Object.keys(audioTrackGroup.channels).forEach((key) => {\n                acc[key] = (acc[key] || 0) + audioTrackGroup.channels[key];\n              });\n            }\n            return acc;\n          },\n          { 2: 0 },\n        );\n      }\n    } catch (error) {\n      return true;\n    }\n  }\n  return (\n    (videoCodecs !== undefined &&\n      // Force media capabilities check for HEVC to avoid failure on Windows\n      (videoCodecs.split(',').some((videoCodec) => isHEVC(videoCodec)) ||\n        (level.width > 1920 && level.height > 1088) ||\n        (level.height > 1920 && level.width > 1088) ||\n        level.frameRate > Math.max(currentFrameRate, 30) ||\n        (level.videoRange !== 'SDR' &&\n          level.videoRange !== currentVideoRange) ||\n        level.bitrate > Math.max(currentBw, 8e6))) ||\n    (!!audioChannels &&\n      Number.isFinite(maxChannels) &&\n      Object.keys(audioChannels).some(\n        (channels) => parseInt(channels) > maxChannels,\n      ))\n  );\n}\n\nexport function getMediaDecodingInfoPromise(\n  level: Level,\n  audioTracksByGroup: AudioTracksByGroup,\n  mediaCapabilities: MediaCapabilities | undefined,\n  cache: Record<\n    string,\n    Promise<MediaCapabilitiesDecodingInfo> | undefined\n  > = {},\n): Promise<MediaDecodingInfo> {\n  const videoCodecs = level.videoCodec;\n  if ((!videoCodecs && !level.audioCodec) || !mediaCapabilities) {\n    return Promise.resolve(SUPPORTED_INFO_DEFAULT);\n  }\n\n  const configurations: MediaDecodingConfiguration[] = [];\n\n  const videoDecodeList = makeVideoConfigurations(level);\n  const videoCount = videoDecodeList.length;\n  const audioDecodeList = makeAudioConfigurations(\n    level,\n    audioTracksByGroup,\n    videoCount > 0,\n  );\n  const audioCount = audioDecodeList.length;\n  for (let i = videoCount || 1 * audioCount || 1; i--; ) {\n    const configuration: MediaDecodingConfiguration = {\n      type: 'media-source',\n    };\n    if (videoCount) {\n      configuration.video = videoDecodeList[i % videoCount];\n    }\n    if (audioCount) {\n      configuration.audio = audioDecodeList[i % audioCount];\n      const audioBitrate = configuration.audio.bitrate;\n      if (configuration.video && audioBitrate) {\n        configuration.video.bitrate -= audioBitrate;\n      }\n    }\n    configurations.push(configuration);\n  }\n\n  if (videoCodecs) {\n    // Override Windows Firefox HEVC MediaCapabilities result (https://github.com/video-dev/hls.js/issues/7046)\n    const ua = navigator.userAgent;\n    if (\n      videoCodecs.split(',').some((videoCodec) => isHEVC(videoCodec)) &&\n      userAgentHevcSupportIsInaccurate()\n    ) {\n      return Promise.resolve(\n        getUnsupportedResult(\n          new Error(\n            `Overriding Windows Firefox HEVC MediaCapabilities result based on user-agent string: (${ua})`,\n          ),\n          configurations,\n        ),\n      );\n    }\n  }\n\n  return Promise.all(\n    configurations.map((configuration) => {\n      // Cache MediaCapabilities promises\n      const decodingInfoKey = getMediaDecodingInfoKey(configuration);\n      return (\n        cache[decodingInfoKey] ||\n        (cache[decodingInfoKey] = mediaCapabilities.decodingInfo(configuration))\n      );\n    }),\n  )\n    .then((decodingInfoResults) => ({\n      supported: !decodingInfoResults.some((info) => !info.supported),\n      configurations,\n      decodingInfoResults,\n    }))\n    .catch((error) => ({\n      supported: false,\n      configurations,\n      decodingInfoResults: [] as MediaCapabilitiesDecodingInfo[],\n      error,\n    }));\n}\n\nfunction makeVideoConfigurations(level: Level): VideoConfiguration[] {\n  const videoCodecs = level.videoCodec?.split(',');\n  const bitrate = getVariantDecodingBitrate(level);\n  const width = level.width || 640;\n  const height = level.height || 480;\n  // Assume a framerate of 30fps since MediaCapabilities will not accept Level default of 0.\n  const framerate = level.frameRate || 30;\n  const videoRange = level.videoRange.toLowerCase() as 'sdr' | 'pq' | 'hlg';\n  return videoCodecs\n    ? videoCodecs.map((videoCodec: string) => {\n        const videoConfiguration: VideoConfiguration = {\n          contentType: mimeTypeForCodec(\n            fillInMissingAV01Params(videoCodec),\n            'video',\n          ),\n          width,\n          height,\n          bitrate,\n          framerate,\n        };\n        if (videoRange !== 'sdr') {\n          videoConfiguration.transferFunction = videoRange as TransferFunction;\n        }\n        return videoConfiguration;\n      })\n    : [];\n}\n\nfunction makeAudioConfigurations(\n  level: Level,\n  audioTracksByGroup: AudioTracksByGroup,\n  hasVideo: boolean,\n): AudioConfiguration[] {\n  const audioCodecs = level.audioCodec?.split(',');\n  const combinedBitrate = getVariantDecodingBitrate(level);\n  if (audioCodecs && level.audioGroups) {\n    return level.audioGroups.reduce((configurations, audioGroupId) => {\n      const tracks = audioGroupId\n        ? audioTracksByGroup.groups[audioGroupId]?.tracks\n        : null;\n      if (tracks) {\n        return tracks.reduce((configs, audioTrack) => {\n          if (audioTrack.groupId === audioGroupId) {\n            const channelsNumber = parseFloat(audioTrack.channels || '');\n            audioCodecs.forEach((audioCodec) => {\n              const audioConfiguration: AudioConfiguration = {\n                contentType: mimeTypeForCodec(audioCodec, 'audio'),\n                bitrate: hasVideo\n                  ? estimatedAudioBitrate(audioCodec, combinedBitrate)\n                  : combinedBitrate,\n              };\n              if (channelsNumber) {\n                audioConfiguration.channels = '' + channelsNumber;\n              }\n              configs.push(audioConfiguration);\n            });\n          }\n          return configs;\n        }, configurations);\n      }\n      return configurations;\n    }, [] as AudioConfiguration[]);\n  }\n  return [];\n}\n\nfunction estimatedAudioBitrate(\n  audioCodec: string,\n  levelBitrate: number,\n): number {\n  if (levelBitrate <= 1) {\n    return 1;\n  }\n  let audioBitrate = 128000;\n  if (audioCodec === 'ec-3') {\n    audioBitrate = 768000;\n  } else if (audioCodec === 'ac-3') {\n    audioBitrate = 640000;\n  }\n  return Math.min(levelBitrate / 2, audioBitrate); // Don't exceed some % of level bitrate\n}\n\nfunction getVariantDecodingBitrate(level: Level): number {\n  return (\n    Math.ceil(Math.max(level.bitrate * 0.9, level.averageBitrate) / 1000) *\n      1000 || 1\n  );\n}\n\nfunction getMediaDecodingInfoKey(config: MediaDecodingConfiguration): string {\n  let key = '';\n  const { audio, video } = config;\n  if (video) {\n    const codec = getCodecsForMimeType(video.contentType);\n    key += `${codec}_r${video.height}x${video.width}f${Math.ceil(video.framerate)}${\n      video.transferFunction || 'sd'\n    }_${Math.ceil(video.bitrate / 1e5)}`;\n  }\n  if (audio) {\n    const codec = getCodecsForMimeType(audio.contentType);\n    key += `${video ? '_' : ''}${codec}_c${audio.channels}`;\n  }\n  return key;\n}\n", "import type { MediaPlaylist } from './media-playlist';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { AttrList } from '../utils/attr-list';\nimport type { MediaDecodingInfo } from '../utils/mediacapabilities-helper';\n\nexport interface LevelParsed extends CodecsParsed {\n  attrs: LevelAttributes;\n  bitrate: number;\n  details?: LevelDetails;\n  height?: number;\n  id?: number;\n  name: string;\n  supplemental?: CodecsParsed;\n  url: string;\n  width?: number;\n}\n\nexport interface CodecsParsed {\n  audioCodec?: string;\n  videoCodec?: string;\n  textCodec?: string;\n  unknownCodecs?: string[];\n}\n\nexport interface LevelAttributes extends AttrList {\n  'ALLOWED-CPC'?: string;\n  AUDIO?: string;\n  'AVERAGE-BANDWIDTH'?: string;\n  BANDWIDTH?: string;\n  'CLOSED-CAPTIONS'?: string;\n  CODECS?: string;\n  'FRAME-RATE'?: string;\n  'HDCP-LEVEL'?: 'TYPE-0' | 'TYPE-1' | 'NONE';\n  'PATHWAY-ID'?: string;\n  RESOLUTION?: string;\n  SCORE?: string;\n  'STABLE-VARIANT-ID'?: string;\n  SUBTITLES?: string;\n  'SUPPLEMENTAL-CODECS'?: string;\n  VIDEO?: string;\n  'VIDEO-RANGE'?: VideoRange;\n}\n\nexport const HdcpLevels = ['NONE', 'TYPE-0', 'TYPE-1', null] as const;\nexport type HdcpLevel = (typeof HdcpLevels)[number];\n\nexport function isHdcpLevel(value: any): value is HdcpLevel {\n  return HdcpLevels.indexOf(value) > -1;\n}\n\nexport const VideoRangeValues = ['SDR', 'PQ', 'HLG'] as const;\nexport type VideoRange = (typeof VideoRangeValues)[number];\n\nexport function isVideoRange(value: any): value is VideoRange {\n  return !!value && VideoRangeValues.indexOf(value) > -1;\n}\n\nexport type VariableMap = Record<string, string>;\n\nexport const enum HlsSkip {\n  No = '',\n  Yes = 'YES',\n  v2 = 'v2',\n}\n\nexport function getSkipValue(details: LevelDetails): HlsSkip {\n  const { canSkipUntil, canSkipDateRanges, age } = details;\n  // A Client SHOULD NOT request a Playlist Delta Update unless it already\n  // has a version of the Playlist that is no older than one-half of the Skip Boundary.\n  // @see: https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-6.3.7\n  const playlistRecentEnough = age < canSkipUntil / 2;\n  if (canSkipUntil && playlistRecentEnough) {\n    if (canSkipDateRanges) {\n      return HlsSkip.v2;\n    }\n    return HlsSkip.Yes;\n  }\n  return HlsSkip.No;\n}\n\nexport class HlsUrlParameters {\n  msn?: number;\n  part?: number;\n  skip?: HlsSkip;\n\n  constructor(msn?: number, part?: number, skip?: HlsSkip) {\n    this.msn = msn;\n    this.part = part;\n    this.skip = skip;\n  }\n\n  addDirectives(uri: string): string | never {\n    const url: URL = new self.URL(uri);\n    if (this.msn !== undefined) {\n      url.searchParams.set('_HLS_msn', this.msn.toString());\n    }\n    if (this.part !== undefined) {\n      url.searchParams.set('_HLS_part', this.part.toString());\n    }\n    if (this.skip) {\n      url.searchParams.set('_HLS_skip', this.skip);\n    }\n    return url.href;\n  }\n}\n\nexport class Level {\n  public readonly _attrs: LevelAttributes[];\n  public readonly audioCodec: string | undefined;\n  public readonly bitrate: number;\n  public readonly codecSet: string;\n  public readonly url: string[];\n  public readonly frameRate: number;\n  public readonly height: number;\n  public readonly id: number;\n  public readonly name: string;\n  public readonly supplemental: CodecsParsed | undefined;\n  public readonly videoCodec: string | undefined;\n  public readonly width: number;\n  public details?: LevelDetails;\n  public fragmentError: number = 0;\n  public loadError: number = 0;\n  public loaded?: { bytes: number; duration: number };\n  public realBitrate: number = 0;\n  public supportedPromise?: Promise<MediaDecodingInfo>;\n  public supportedResult?: MediaDecodingInfo;\n  private _avgBitrate: number = 0;\n  private _audioGroups?: (string | undefined)[];\n  private _subtitleGroups?: (string | undefined)[];\n  // Deprecated (retained for backwards compatibility)\n  private readonly _urlId: number = 0;\n\n  constructor(data: LevelParsed | MediaPlaylist) {\n    this.url = [data.url];\n    this._attrs = [data.attrs];\n    this.bitrate = data.bitrate;\n    if (data.details) {\n      this.details = data.details;\n    }\n    this.id = data.id || 0;\n    this.name = data.name;\n    this.width = data.width || 0;\n    this.height = data.height || 0;\n    this.frameRate = data.attrs.optionalFloat('FRAME-RATE', 0);\n    this._avgBitrate = data.attrs.decimalInteger('AVERAGE-BANDWIDTH');\n    this.audioCodec = data.audioCodec;\n    this.videoCodec = data.videoCodec;\n    this.codecSet = [data.videoCodec, data.audioCodec]\n      .filter((c) => !!c)\n      .map((s: string) => s.substring(0, 4))\n      .join(',');\n    if ('supplemental' in data) {\n      this.supplemental = data.supplemental;\n      const supplementalVideo = data.supplemental?.videoCodec;\n      if (supplementalVideo && supplementalVideo !== data.videoCodec) {\n        this.codecSet += `,${supplementalVideo.substring(0, 4)}`;\n      }\n    }\n    this.addGroupId('audio', data.attrs.AUDIO);\n    this.addGroupId('text', data.attrs.SUBTITLES);\n  }\n\n  get maxBitrate(): number {\n    return Math.max(this.realBitrate, this.bitrate);\n  }\n\n  get averageBitrate(): number {\n    return this._avgBitrate || this.realBitrate || this.bitrate;\n  }\n\n  get attrs(): LevelAttributes {\n    return this._attrs[0];\n  }\n\n  get codecs(): string {\n    return this.attrs.CODECS || '';\n  }\n\n  get pathwayId(): string {\n    return this.attrs['PATHWAY-ID'] || '.';\n  }\n\n  get videoRange(): VideoRange {\n    return this.attrs['VIDEO-RANGE'] || 'SDR';\n  }\n\n  get score(): number {\n    return this.attrs.optionalFloat('SCORE', 0);\n  }\n\n  get uri(): string {\n    return this.url[0] || '';\n  }\n\n  hasAudioGroup(groupId: string | undefined): boolean {\n    return hasGroup(this._audioGroups, groupId);\n  }\n\n  hasSubtitleGroup(groupId: string | undefined): boolean {\n    return hasGroup(this._subtitleGroups, groupId);\n  }\n\n  get audioGroups(): (string | undefined)[] | undefined {\n    return this._audioGroups;\n  }\n\n  get subtitleGroups(): (string | undefined)[] | undefined {\n    return this._subtitleGroups;\n  }\n\n  addGroupId(type: string, groupId: string | undefined) {\n    if (!groupId) {\n      return;\n    }\n    if (type === 'audio') {\n      let audioGroups = this._audioGroups;\n      if (!audioGroups) {\n        audioGroups = this._audioGroups = [];\n      }\n      if (audioGroups.indexOf(groupId) === -1) {\n        audioGroups.push(groupId);\n      }\n    } else if (type === 'text') {\n      let subtitleGroups = this._subtitleGroups;\n      if (!subtitleGroups) {\n        subtitleGroups = this._subtitleGroups = [];\n      }\n      if (subtitleGroups.indexOf(groupId) === -1) {\n        subtitleGroups.push(groupId);\n      }\n    }\n  }\n\n  // Deprecated methods (retained for backwards compatibility)\n  get urlId(): number {\n    return 0;\n  }\n\n  set urlId(value: number) {}\n\n  get audioGroupIds(): (string | undefined)[] | undefined {\n    return this.audioGroups ? [this.audioGroupId] : undefined;\n  }\n\n  get textGroupIds(): (string | undefined)[] | undefined {\n    return this.subtitleGroups ? [this.textGroupId] : undefined;\n  }\n\n  get audioGroupId(): string | undefined {\n    return this.audioGroups?.[0];\n  }\n\n  get textGroupId(): string | undefined {\n    return this.subtitleGroups?.[0];\n  }\n\n  addFallback() {}\n}\n\nfunction hasGroup(\n  groups: (string | undefined)[] | undefined,\n  groupId: string | undefined,\n): boolean {\n  if (!groupId || !groups) {\n    return false;\n  }\n  return groups.indexOf(groupId) !== -1;\n}\n", "import { type VideoRange, VideoRangeValues } from '../types/level';\nimport type { VideoSelectionOption } from '../types/media-playlist';\n\n/**\n * @returns Whether we can detect and validate HDR capability within the window context\n */\nexport function isHdrSupported() {\n  if (typeof matchMedia === 'function') {\n    const mediaQueryList = matchMedia('(dynamic-range: high)');\n    const badQuery = matchMedia('bad query');\n    if (mediaQueryList.media !== badQuery.media) {\n      return mediaQueryList.matches === true;\n    }\n  }\n  return false;\n}\n\n/**\n * Sanitizes inputs to return the active video selection options for HDR/SDR.\n * When both inputs are null:\n *\n *    `{ preferHDR: false, allowedVideoRanges: [] }`\n *\n * When `currentVideoRange` non-null, maintain the active range:\n *\n *    `{ preferHDR: currentVideoRange !== 'SDR', allowedVideoRanges: [currentVideoRange] }`\n *\n * When VideoSelectionOption non-null:\n *\n *  - Allow all video ranges if `allowedVideoRanges` unspecified.\n *  - If `preferHDR` is non-null use the value to filter `allowedVideoRanges`.\n *  - Else check window for HDR support and set `preferHDR` to the result.\n *\n * @param currentVideoRange\n * @param videoPreference\n */\nexport function getVideoSelectionOptions(\n  currentVideoRange: VideoRange | undefined,\n  videoPreference: VideoSelectionOption | undefined,\n) {\n  let preferHDR = false;\n  let allowedVideoRanges: Array<VideoRange> = [];\n\n  if (currentVideoRange) {\n    preferHDR = currentVideoRange !== 'SDR';\n    allowedVideoRanges = [currentVideoRange];\n  }\n\n  if (videoPreference) {\n    allowedVideoRanges =\n      videoPreference.allowedVideoRanges || VideoRangeValues.slice(0);\n    const allowAutoPreferHDR =\n      allowedVideoRanges.join('') !== 'SDR' && !videoPreference.videoCodec;\n    preferHDR =\n      videoPreference.preferHDR !== undefined\n        ? videoPreference.preferHDR\n        : allowAutoPreferHDR && isHdrSupported();\n    if (!preferHDR) {\n      allowedVideoRanges = ['SDR'];\n    }\n  }\n\n  return {\n    preferHDR,\n    allowedVideoRanges,\n  };\n}\n", "const omitCircularRefsReplacer = (\n  replacer: ((this: any, key: string, value: any) => any) | undefined,\n) => {\n  const known = new WeakSet();\n  return (_, value) => {\n    if (replacer) {\n      value = replacer(_, value);\n    }\n    if (typeof value === 'object' && value !== null) {\n      if (known.has(value)) {\n        return;\n      }\n      known.add(value);\n    }\n    return value;\n  };\n};\n\nexport const stringify = <T>(\n  object: T,\n  replacer?: (this: any, key: string, value: any) => any,\n): string => JSON.stringify(object, omitCircularRefsReplacer(replacer));\n", "import { codecsSetSelectionPreferenceValue } from './codecs';\nimport { getVideoSelectionOptions } from './hdr';\nimport { logger } from './logger';\nimport { stringify } from './safe-json-stringify';\nimport type Hls from '../hls';\nimport type { Level, VideoRange } from '../types/level';\nimport type {\n  AudioSelectionOption,\n  MediaPlaylist,\n  SubtitleSelectionOption,\n  VideoSelectionOption,\n} from '../types/media-playlist';\n\nexport type CodecSetTier = {\n  minBitrate: number;\n  minHeight: number;\n  minFramerate: number;\n  minIndex: number;\n  maxScore: number;\n  videoRanges: Record<string, number>;\n  channels: Record<string, number>;\n  hasDefaultAudio: boolean;\n  fragmentError: number;\n};\n\ntype AudioTrackGroup = {\n  tracks: MediaPlaylist[];\n  channels: Record<string, number>;\n  hasDefault: boolean;\n  hasAutoSelect: boolean;\n};\ntype StartParameters = {\n  codecSet: string | undefined;\n  videoRanges: Array<VideoRange>;\n  preferHDR: boolean;\n  minFramerate: number;\n  minBitrate: number;\n  minIndex: number;\n};\n\nexport function getStartCodecTier(\n  codecTiers: Record<string, CodecSetTier>,\n  currentVideoRange: VideoRange | undefined,\n  currentBw: number,\n  audioPreference: AudioSelectionOption | undefined,\n  videoPreference: VideoSelectionOption | undefined,\n): StartParameters {\n  const codecSets = Object.keys(codecTiers);\n  const channelsPreference = audioPreference?.channels;\n  const audioCodecPreference = audioPreference?.audioCodec;\n  const videoCodecPreference = videoPreference?.videoCodec;\n  const preferStereo = channelsPreference && parseInt(channelsPreference) === 2;\n  // Use first level set to determine stereo, and minimum resolution and framerate\n  let hasStereo = false;\n  let hasCurrentVideoRange = false;\n  let minHeight = Infinity;\n  let minFramerate = Infinity;\n  let minBitrate = Infinity;\n  let minIndex = Infinity;\n  let selectedScore = 0;\n  let videoRanges: Array<VideoRange> = [];\n\n  const { preferHDR, allowedVideoRanges } = getVideoSelectionOptions(\n    currentVideoRange,\n    videoPreference,\n  );\n\n  for (let i = codecSets.length; i--; ) {\n    const tier = codecTiers[codecSets[i]];\n    hasStereo ||= tier.channels[2] > 0;\n    minHeight = Math.min(minHeight, tier.minHeight);\n    minFramerate = Math.min(minFramerate, tier.minFramerate);\n    minBitrate = Math.min(minBitrate, tier.minBitrate);\n    const matchingVideoRanges = allowedVideoRanges.filter(\n      (range) => tier.videoRanges[range] > 0,\n    );\n    if (matchingVideoRanges.length > 0) {\n      hasCurrentVideoRange = true;\n    }\n  }\n  minHeight = Number.isFinite(minHeight) ? minHeight : 0;\n  minFramerate = Number.isFinite(minFramerate) ? minFramerate : 0;\n  const maxHeight = Math.max(1080, minHeight);\n  const maxFramerate = Math.max(30, minFramerate);\n  minBitrate = Number.isFinite(minBitrate) ? minBitrate : currentBw;\n  currentBw = Math.max(minBitrate, currentBw);\n  // If there are no variants with matching preference, set currentVideoRange to undefined\n  if (!hasCurrentVideoRange) {\n    currentVideoRange = undefined;\n  }\n  const hasMultipleSets = codecSets.length > 1;\n  const codecSet = codecSets.reduce(\n    (selected: string | undefined, candidate: string) => {\n      // Remove candiates which do not meet bitrate, default audio, stereo or channels preference, 1080p or lower, 30fps or lower, or SDR/HDR selection if present\n      const candidateTier = codecTiers[candidate];\n      if (candidate === selected) {\n        return selected;\n      }\n      videoRanges = hasCurrentVideoRange\n        ? allowedVideoRanges.filter(\n            (range) => candidateTier.videoRanges[range] > 0,\n          )\n        : [];\n      if (hasMultipleSets) {\n        if (candidateTier.minBitrate > currentBw) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `min bitrate of ${candidateTier.minBitrate} > current estimate of ${currentBw}`,\n          );\n          return selected;\n        }\n        if (!candidateTier.hasDefaultAudio) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `no renditions with default or auto-select sound found`,\n          );\n          return selected;\n        }\n        if (\n          audioCodecPreference &&\n          candidate.indexOf(audioCodecPreference.substring(0, 4)) % 5 !== 0\n        ) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `audio codec preference \"${audioCodecPreference}\" not found`,\n          );\n          return selected;\n        }\n        if (channelsPreference && !preferStereo) {\n          if (!candidateTier.channels[channelsPreference]) {\n            logStartCodecCandidateIgnored(\n              candidate,\n              `no renditions with ${channelsPreference} channel sound found (channels options: ${Object.keys(\n                candidateTier.channels,\n              )})`,\n            );\n            return selected;\n          }\n        } else if (\n          (!audioCodecPreference || preferStereo) &&\n          hasStereo &&\n          candidateTier.channels['2'] === 0\n        ) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `no renditions with stereo sound found`,\n          );\n          return selected;\n        }\n        if (candidateTier.minHeight > maxHeight) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `min resolution of ${candidateTier.minHeight} > maximum of ${maxHeight}`,\n          );\n          return selected;\n        }\n        if (candidateTier.minFramerate > maxFramerate) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `min framerate of ${candidateTier.minFramerate} > maximum of ${maxFramerate}`,\n          );\n          return selected;\n        }\n        if (\n          !videoRanges.some((range) => candidateTier.videoRanges[range] > 0)\n        ) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `no variants with VIDEO-RANGE of ${stringify(videoRanges)} found`,\n          );\n          return selected;\n        }\n        if (\n          videoCodecPreference &&\n          candidate.indexOf(videoCodecPreference.substring(0, 4)) % 5 !== 0\n        ) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `video codec preference \"${videoCodecPreference}\" not found`,\n          );\n          return selected;\n        }\n        if (candidateTier.maxScore < selectedScore) {\n          logStartCodecCandidateIgnored(\n            candidate,\n            `max score of ${candidateTier.maxScore} < selected max of ${selectedScore}`,\n          );\n          return selected;\n        }\n      }\n      // Remove candiates with less preferred codecs or more errors\n      if (\n        selected &&\n        (codecsSetSelectionPreferenceValue(candidate) >=\n          codecsSetSelectionPreferenceValue(selected) ||\n          candidateTier.fragmentError > codecTiers[selected].fragmentError)\n      ) {\n        return selected;\n      }\n      minIndex = candidateTier.minIndex;\n      selectedScore = candidateTier.maxScore;\n      return candidate;\n    },\n    undefined,\n  );\n  return {\n    codecSet,\n    videoRanges,\n    preferHDR,\n    minFramerate,\n    minBitrate,\n    minIndex,\n  };\n}\n\nfunction logStartCodecCandidateIgnored(codeSet: string, reason: string) {\n  logger.log(\n    `[abr] start candidates with \"${codeSet}\" ignored because ${reason}`,\n  );\n}\n\nexport type AudioTracksByGroup = {\n  hasDefaultAudio: boolean;\n  hasAutoSelectAudio: boolean;\n  groups: Record<string, AudioTrackGroup>;\n};\n\nexport function getAudioTracksByGroup(allAudioTracks: MediaPlaylist[]) {\n  return allAudioTracks.reduce(\n    (audioTracksByGroup: AudioTracksByGroup, track) => {\n      let trackGroup = audioTracksByGroup.groups[track.groupId];\n      if (!trackGroup) {\n        trackGroup = audioTracksByGroup.groups[track.groupId] = {\n          tracks: [],\n          channels: { 2: 0 },\n          hasDefault: false,\n          hasAutoSelect: false,\n        };\n      }\n      trackGroup.tracks.push(track);\n      const channelsKey = track.channels || '2';\n      trackGroup.channels[channelsKey] =\n        (trackGroup.channels[channelsKey] || 0) + 1;\n      trackGroup.hasDefault = trackGroup.hasDefault || track.default;\n      trackGroup.hasAutoSelect = trackGroup.hasAutoSelect || track.autoselect;\n      if (trackGroup.hasDefault) {\n        audioTracksByGroup.hasDefaultAudio = true;\n      }\n      if (trackGroup.hasAutoSelect) {\n        audioTracksByGroup.hasAutoSelectAudio = true;\n      }\n      return audioTracksByGroup;\n    },\n    {\n      hasDefaultAudio: false,\n      hasAutoSelectAudio: false,\n      groups: {},\n    },\n  );\n}\n\nexport function getCodecTiers(\n  levels: Level[],\n  audioTracksByGroup: AudioTracksByGroup,\n  minAutoLevel: number,\n  maxAutoLevel: number,\n): Record<string, CodecSetTier> {\n  return levels\n    .slice(minAutoLevel, maxAutoLevel + 1)\n    .reduce((tiers: Record<string, CodecSetTier>, level, index) => {\n      if (!level.codecSet) {\n        return tiers;\n      }\n      const audioGroups = level.audioGroups;\n      let tier = tiers[level.codecSet];\n      if (!tier) {\n        tiers[level.codecSet] = tier = {\n          minBitrate: Infinity,\n          minHeight: Infinity,\n          minFramerate: Infinity,\n          minIndex: index,\n          maxScore: 0,\n          videoRanges: { SDR: 0 },\n          channels: { '2': 0 },\n          hasDefaultAudio: !audioGroups,\n          fragmentError: 0,\n        };\n      }\n      tier.minBitrate = Math.min(tier.minBitrate, level.bitrate);\n      const lesserWidthOrHeight = Math.min(level.height, level.width);\n      tier.minHeight = Math.min(tier.minHeight, lesserWidthOrHeight);\n      tier.minFramerate = Math.min(tier.minFramerate, level.frameRate);\n      tier.minIndex = Math.min(tier.minIndex, index);\n      tier.maxScore = Math.max(tier.maxScore, level.score);\n      tier.fragmentError += level.fragmentError;\n      tier.videoRanges[level.videoRange] =\n        (tier.videoRanges[level.videoRange] || 0) + 1;\n      if (__USE_ALT_AUDIO__ && audioGroups) {\n        audioGroups.forEach((audioGroupId) => {\n          if (!audioGroupId) {\n            return;\n          }\n          const audioGroup = audioTracksByGroup.groups[audioGroupId];\n          if (!audioGroup) {\n            return;\n          }\n          // Default audio is any group with DEFAULT=YES, or if missing then any group with AUTOSELECT=YES, or all variants\n          tier.hasDefaultAudio =\n            tier.hasDefaultAudio || audioTracksByGroup.hasDefaultAudio\n              ? audioGroup.hasDefault\n              : audioGroup.hasAutoSelect ||\n                (!audioTracksByGroup.hasDefaultAudio &&\n                  !audioTracksByGroup.hasAutoSelectAudio);\n          Object.keys(audioGroup.channels).forEach((channels) => {\n            tier.channels[channels] =\n              (tier.channels[channels] || 0) + audioGroup.channels[channels];\n          });\n        });\n      }\n      return tiers;\n    }, {});\n}\n\nexport function getBasicSelectionOption(\n  option:\n    | MediaPlaylist\n    | AudioSelectionOption\n    | SubtitleSelectionOption\n    | undefined,\n): Partial<AudioSelectionOption | SubtitleSelectionOption> | undefined {\n  if (!option) {\n    return option;\n  }\n  const { lang, assocLang, characteristics, channels, audioCodec } =\n    option as AudioSelectionOption;\n  return { lang, assocLang, characteristics, channels, audioCodec };\n}\n\nexport function findMatchingOption(\n  option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n  tracks: MediaPlaylist[],\n  matchPredicate?: (\n    option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n    track: MediaPlaylist,\n  ) => boolean,\n): number {\n  if ('attrs' in option) {\n    const index = tracks.indexOf(option);\n    if (index !== -1) {\n      return index;\n    }\n  }\n  for (let i = 0; i < tracks.length; i++) {\n    const track = tracks[i];\n    if (matchesOption(option, track, matchPredicate)) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nexport function matchesOption(\n  option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n  track: MediaPlaylist,\n  matchPredicate?: (\n    option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n    track: MediaPlaylist,\n  ) => boolean,\n): boolean {\n  const { groupId, name, lang, assocLang, default: isDefault } = option;\n  const forced = (option as SubtitleSelectionOption).forced;\n  return (\n    (groupId === undefined || track.groupId === groupId) &&\n    (name === undefined || track.name === name) &&\n    (lang === undefined || languagesMatch(lang, track.lang)) &&\n    (lang === undefined || track.assocLang === assocLang) &&\n    (isDefault === undefined || track.default === isDefault) &&\n    (forced === undefined || track.forced === forced) &&\n    (!('characteristics' in option) ||\n      characteristicsMatch(\n        option.characteristics || '',\n        track.characteristics,\n      )) &&\n    (matchPredicate === undefined || matchPredicate(option, track))\n  );\n}\n\nfunction languagesMatch(languageA: string, languageB: string = '--'): boolean {\n  if (languageA.length === languageB.length) {\n    return languageA === languageB;\n  }\n  return languageA.startsWith(languageB) || languageB.startsWith(languageA);\n}\n\nfunction characteristicsMatch(\n  characteristicsA: string,\n  characteristicsB: string = '',\n): boolean {\n  const arrA = characteristicsA.split(',');\n  const arrB = characteristicsB.split(',');\n  // Expects each item to be unique:\n  return (\n    arrA.length === arrB.length && !arrA.some((el) => arrB.indexOf(el) === -1)\n  );\n}\n\nexport function audioMatchPredicate(\n  option: MediaPlaylist | AudioSelectionOption,\n  track: MediaPlaylist,\n) {\n  const { audioCodec, channels } = option;\n  return (\n    (audioCodec === undefined ||\n      (track.audioCodec || '').substring(0, 4) ===\n        audioCodec.substring(0, 4)) &&\n    (channels === undefined || channels === (track.channels || '2'))\n  );\n}\n\nexport function findClosestLevelWithAudioGroup(\n  option: MediaPlaylist | AudioSelectionOption,\n  levels: Level[],\n  allAudioTracks: MediaPlaylist[],\n  searchIndex: number,\n  matchPredicate: (\n    option: MediaPlaylist | AudioSelectionOption,\n    track: MediaPlaylist,\n  ) => boolean,\n): number {\n  const currentLevel = levels[searchIndex];\n  // Are there variants with same URI as current level?\n  // If so, find a match that does not require any level URI change\n  const variants = levels.reduce(\n    (variantMap: { [uri: string]: number[] }, level, index) => {\n      const uri = level.uri;\n      const renditions = variantMap[uri] || (variantMap[uri] = []);\n      renditions.push(index);\n      return variantMap;\n    },\n    {},\n  );\n  const renditions = variants[currentLevel.uri];\n  if (renditions.length > 1) {\n    searchIndex = Math.max.apply(Math, renditions);\n  }\n  // Find best match\n  const currentVideoRange = currentLevel.videoRange;\n  const currentFrameRate = currentLevel.frameRate;\n  const currentVideoCodec = currentLevel.codecSet.substring(0, 4);\n  const matchingVideo = searchDownAndUpList(\n    levels,\n    searchIndex,\n    (level: Level) => {\n      if (\n        level.videoRange !== currentVideoRange ||\n        level.frameRate !== currentFrameRate ||\n        level.codecSet.substring(0, 4) !== currentVideoCodec\n      ) {\n        return false;\n      }\n      const audioGroups = level.audioGroups;\n      const tracks = allAudioTracks.filter(\n        (track): boolean =>\n          !audioGroups || audioGroups.indexOf(track.groupId) !== -1,\n      );\n      return findMatchingOption(option, tracks, matchPredicate) > -1;\n    },\n  );\n  if (matchingVideo > -1) {\n    return matchingVideo;\n  }\n  return searchDownAndUpList(levels, searchIndex, (level: Level) => {\n    const audioGroups = level.audioGroups;\n    const tracks = allAudioTracks.filter(\n      (track): boolean =>\n        !audioGroups || audioGroups.indexOf(track.groupId) !== -1,\n    );\n    return findMatchingOption(option, tracks, matchPredicate) > -1;\n  });\n}\n\nfunction searchDownAndUpList(\n  arr: any[],\n  searchIndex: number,\n  predicate: (item: any) => boolean,\n): number {\n  for (let i = searchIndex; i > -1; i--) {\n    if (predicate(arr[i])) {\n      return i;\n    }\n  }\n  for (let i = searchIndex + 1; i < arr.length; i++) {\n    if (predicate(arr[i])) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nexport function useAlternateAudio(\n  audioTrackUrl: string | undefined,\n  hls: Hls,\n): boolean {\n  return !!audioTrackUrl && audioTrackUrl !== hls.loadLevelObj?.uri;\n}\n", "import { ErrorDetails } from '../errors';\nimport { Events } from '../events';\nimport { PlaylistLevelType } from '../types/loader';\nimport EwmaBandWidthEstimator from '../utils/ewma-bandwidth-estimator';\nimport { Logger } from '../utils/logger';\nimport {\n  getMediaDecodingInfoPromise,\n  requiresMediaCapabilitiesDecodingInfo,\n  SUPPORTED_INFO_DEFAULT,\n} from '../utils/mediacapabilities-helper';\nimport {\n  type AudioTracksByGroup,\n  type CodecSetTier,\n  getAudioTracksByGroup,\n  getCodecTiers,\n  getStartCodecTier,\n} from '../utils/rendition-helper';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type Hls from '../hls';\nimport type { Fragment } from '../loader/fragment';\nimport type { Part } from '../loader/fragment';\nimport type { AbrComponentAPI } from '../types/component-api';\nimport type {\n  ErrorData,\n  FragBufferedData,\n  FragLoadedData,\n  FragLoadingData,\n  LevelLoadedData,\n  LevelSwitchingData,\n  ManifestLoadingData,\n} from '../types/events';\nimport type { Level, VideoRange } from '../types/level';\nimport type { LoaderStats } from '../types/loader';\n\nclass AbrController extends Logger implements AbrComponentAPI {\n  protected hls: Hls;\n  private lastLevelLoadSec: number = 0;\n  private lastLoadedFragLevel: number = -1;\n  private firstSelection: number = -1;\n  private _nextAutoLevel: number = -1;\n  private nextAutoLevelKey: string = '';\n  private audioTracksByGroup: AudioTracksByGroup | null = null;\n  private codecTiers: Record<string, CodecSetTier> | null = null;\n  private timer: number = -1;\n  private fragCurrent: Fragment | null = null;\n  private partCurrent: Part | null = null;\n  private bitrateTestDelay: number = 0;\n  private rebufferNotice: number = -1;\n  private supportedCache: Record<\n    string,\n    Promise<MediaCapabilitiesDecodingInfo>\n  > = {};\n\n  public bwEstimator: EwmaBandWidthEstimator;\n\n  constructor(hls: Hls) {\n    super('abr', hls.logger);\n    this.hls = hls;\n    this.bwEstimator = this.initEstimator();\n    this.registerListeners();\n  }\n\n  public resetEstimator(abrEwmaDefaultEstimate?: number) {\n    if (abrEwmaDefaultEstimate) {\n      this.log(`setting initial bwe to ${abrEwmaDefaultEstimate}`);\n      this.hls.config.abrEwmaDefaultEstimate = abrEwmaDefaultEstimate;\n    }\n    this.firstSelection = -1;\n    this.bwEstimator = this.initEstimator();\n  }\n\n  private initEstimator(): EwmaBandWidthEstimator {\n    const config = this.hls.config;\n    return new EwmaBandWidthEstimator(\n      config.abrEwmaSlowVoD,\n      config.abrEwmaFastVoD,\n      config.abrEwmaDefaultEstimate,\n    );\n  }\n\n  protected registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n    hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n    hls.on(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.on(Events.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  protected unregisterListeners() {\n    const { hls } = this;\n    if (!hls) {\n      return;\n    }\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n    hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n    hls.off(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.off(Events.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  public destroy() {\n    this.unregisterListeners();\n    this.clearTimer();\n    // @ts-ignore\n    this.hls = this._abandonRulesCheck = this.supportedCache = null;\n    this.fragCurrent = this.partCurrent = null;\n  }\n\n  protected onManifestLoading(\n    event: Events.MANIFEST_LOADING,\n    data: ManifestLoadingData,\n  ) {\n    this.lastLoadedFragLevel = -1;\n    this.firstSelection = -1;\n    this.lastLevelLoadSec = 0;\n    this.supportedCache = {};\n    this.fragCurrent = this.partCurrent = null;\n    this.onLevelsUpdated();\n    this.clearTimer();\n  }\n\n  private onLevelsUpdated() {\n    if (this.lastLoadedFragLevel > -1 && this.fragCurrent) {\n      this.lastLoadedFragLevel = this.fragCurrent.level;\n    }\n    this._nextAutoLevel = -1;\n    this.onMaxAutoLevelUpdated();\n    this.codecTiers = null;\n    this.audioTracksByGroup = null;\n  }\n\n  private onMaxAutoLevelUpdated() {\n    this.firstSelection = -1;\n    this.nextAutoLevelKey = '';\n  }\n\n  protected onFragLoading(event: Events.FRAG_LOADING, data: FragLoadingData) {\n    const frag = data.frag;\n    if (this.ignoreFragment(frag)) {\n      return;\n    }\n    if (!frag.bitrateTest) {\n      this.fragCurrent = frag;\n      this.partCurrent = data.part ?? null;\n    }\n    this.clearTimer();\n    this.timer = self.setInterval(this._abandonRulesCheck, 100);\n  }\n\n  protected onLevelSwitching(\n    event: Events.LEVEL_SWITCHING,\n    data: LevelSwitchingData,\n  ): void {\n    this.clearTimer();\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData) {\n    if (data.fatal) {\n      return;\n    }\n    switch (data.details) {\n      case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        // Reset last loaded level so that a new selection can be made after calling recoverMediaError\n        this.lastLoadedFragLevel = -1;\n        this.firstSelection = -1;\n        break;\n      case ErrorDetails.FRAG_LOAD_TIMEOUT: {\n        const frag = data.frag;\n        const { fragCurrent, partCurrent: part } = this;\n        if (\n          frag &&\n          fragCurrent &&\n          frag.sn === fragCurrent.sn &&\n          frag.level === fragCurrent.level\n        ) {\n          const now = performance.now();\n          const stats: LoaderStats = part ? part.stats : frag.stats;\n          const timeLoading = now - stats.loading.start;\n          const ttfb = stats.loading.first\n            ? stats.loading.first - stats.loading.start\n            : -1;\n          const loadedFirstByte = stats.loaded && ttfb > -1;\n          if (loadedFirstByte) {\n            const ttfbEstimate = this.bwEstimator.getEstimateTTFB();\n            this.bwEstimator.sample(\n              timeLoading - Math.min(ttfbEstimate, ttfb),\n              stats.loaded,\n            );\n          } else {\n            this.bwEstimator.sampleTTFB(timeLoading);\n          }\n        }\n        break;\n      }\n    }\n  }\n\n  private getTimeToLoadFrag(\n    timeToFirstByteSec: number,\n    bandwidth: number,\n    fragSizeBits: number,\n    isSwitch: boolean,\n  ): number {\n    const fragLoadSec = timeToFirstByteSec + fragSizeBits / bandwidth;\n    const playlistLoadSec = isSwitch\n      ? timeToFirstByteSec + this.lastLevelLoadSec\n      : 0;\n    return fragLoadSec + playlistLoadSec;\n  }\n\n  protected onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n    const config = this.hls.config;\n    const { loading } = data.stats;\n    const timeLoadingMs = loading.end - loading.first;\n    if (Number.isFinite(timeLoadingMs)) {\n      this.lastLevelLoadSec = timeLoadingMs / 1000;\n    }\n    if (data.details.live) {\n      this.bwEstimator.update(config.abrEwmaSlowLive, config.abrEwmaFastLive);\n    } else {\n      this.bwEstimator.update(config.abrEwmaSlowVoD, config.abrEwmaFastVoD);\n    }\n    if (this.timer > -1) {\n      this._abandonRulesCheck(data.levelInfo);\n    }\n  }\n\n  /*\n      This method monitors the download rate of the current fragment, and will downswitch if that fragment will not load\n      quickly enough to prevent underbuffering\n    */\n  private _abandonRulesCheck = (levelLoaded?: Level) => {\n    const { fragCurrent: frag, partCurrent: part, hls } = this;\n    const { autoLevelEnabled, media } = hls;\n    if (!frag || !media) {\n      return;\n    }\n\n    const now = performance.now();\n    const stats: LoaderStats = part ? part.stats : frag.stats;\n    const duration = part ? part.duration : frag.duration;\n    const timeLoading = now - stats.loading.start;\n    const minAutoLevel = hls.minAutoLevel;\n    const loadingFragForLevel = frag.level;\n    const currentAutoLevel = this._nextAutoLevel;\n    // If frag loading is aborted, complete, or from lowest level, stop timer and return\n    if (\n      stats.aborted ||\n      (stats.loaded && stats.loaded === stats.total) ||\n      loadingFragForLevel <= minAutoLevel\n    ) {\n      this.clearTimer();\n      // reset forced auto level value so that next level will be selected\n      this._nextAutoLevel = -1;\n      return;\n    }\n\n    // This check only runs if we're in ABR mode\n    if (!autoLevelEnabled) {\n      return;\n    }\n\n    // Must be loading/loaded a new level or be in a playing state\n    const fragBlockingSwitch =\n      currentAutoLevel > -1 && currentAutoLevel !== loadingFragForLevel;\n    const levelChange = !!levelLoaded || fragBlockingSwitch;\n    if (\n      !levelChange &&\n      (media.paused || !media.playbackRate || !media.readyState)\n    ) {\n      return;\n    }\n\n    const bufferInfo = hls.mainForwardBufferInfo;\n    if (!levelChange && bufferInfo === null) {\n      return;\n    }\n\n    const ttfbEstimate = this.bwEstimator.getEstimateTTFB();\n    const playbackRate = Math.abs(media.playbackRate);\n    // To maintain stable adaptive playback, only begin monitoring frag loading after half or more of its playback duration has passed\n    if (\n      timeLoading <=\n      Math.max(ttfbEstimate, 1000 * (duration / (playbackRate * 2)))\n    ) {\n      return;\n    }\n\n    // bufferStarvationDelay is an estimate of the amount time (in seconds) it will take to exhaust the buffer\n    const bufferStarvationDelay = bufferInfo\n      ? bufferInfo.len / playbackRate\n      : 0;\n    const ttfb = stats.loading.first\n      ? stats.loading.first - stats.loading.start\n      : -1;\n    const loadedFirstByte = stats.loaded && ttfb > -1;\n    const bwEstimate: number = this.getBwEstimate();\n    const levels = hls.levels;\n    const level = levels[loadingFragForLevel];\n    const expectedLen = Math.max(\n      stats.loaded,\n      Math.round((duration * (frag.bitrate || level.averageBitrate)) / 8),\n    );\n    let timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;\n    if (timeStreaming < 1 && loadedFirstByte) {\n      timeStreaming = Math.min(timeLoading, (stats.loaded * 8) / bwEstimate);\n    }\n    const loadRate = loadedFirstByte\n      ? (stats.loaded * 1000) / timeStreaming\n      : 0;\n    // fragLoadDelay is an estimate of the time (in seconds) it will take to buffer the remainder of the fragment\n    const ttfbSeconds = ttfbEstimate / 1000;\n    const fragLoadedDelay = loadRate\n      ? (expectedLen - stats.loaded) / loadRate\n      : (expectedLen * 8) / bwEstimate + ttfbSeconds;\n    // Only downswitch if the time to finish loading the current fragment is greater than the amount of buffer left\n    if (fragLoadedDelay <= bufferStarvationDelay) {\n      return;\n    }\n\n    const bwe = loadRate ? loadRate * 8 : bwEstimate;\n    const live =\n      (levelLoaded?.details || this.hls.latestLevelDetails)?.live === true;\n    const abrBandWidthUpFactor = this.hls.config.abrBandWidthUpFactor;\n    let fragLevelNextLoadedDelay: number = Number.POSITIVE_INFINITY;\n    let nextLoadLevel: number;\n    // Iterate through lower level and try to find the largest one that avoids rebuffering\n    for (\n      nextLoadLevel = loadingFragForLevel - 1;\n      nextLoadLevel > minAutoLevel;\n      nextLoadLevel--\n    ) {\n      // compute time to load next fragment at lower level\n      // 8 = bits per byte (bps/Bps)\n      const levelNextBitrate = levels[nextLoadLevel].maxBitrate;\n      const requiresLevelLoad = !levels[nextLoadLevel].details || live;\n      fragLevelNextLoadedDelay = this.getTimeToLoadFrag(\n        ttfbSeconds,\n        bwe,\n        duration * levelNextBitrate,\n        requiresLevelLoad,\n      );\n      if (\n        fragLevelNextLoadedDelay <\n        Math.min(bufferStarvationDelay, duration + ttfbSeconds)\n      ) {\n        break;\n      }\n    }\n    // Only emergency switch down if it takes less time to load a new fragment at lowest level instead of continuing\n    // to load the current one\n    if (fragLevelNextLoadedDelay >= fragLoadedDelay) {\n      return;\n    }\n\n    // if estimated load time of new segment is completely unreasonable, ignore and do not emergency switch down\n    if (fragLevelNextLoadedDelay > duration * 10) {\n      return;\n    }\n    if (loadedFirstByte) {\n      // If there has been loading progress, sample bandwidth using loading time offset by minimum TTFB time\n      this.bwEstimator.sample(\n        timeLoading - Math.min(ttfbEstimate, ttfb),\n        stats.loaded,\n      );\n    } else {\n      // If there has been no loading progress, sample TTFB\n      this.bwEstimator.sampleTTFB(timeLoading);\n    }\n    const nextLoadLevelBitrate = levels[nextLoadLevel].maxBitrate;\n    if (this.getBwEstimate() * abrBandWidthUpFactor > nextLoadLevelBitrate) {\n      this.resetEstimator(nextLoadLevelBitrate);\n    }\n    const bestSwitchLevel = this.findBestLevel(\n      nextLoadLevelBitrate,\n      minAutoLevel,\n      nextLoadLevel,\n      0,\n      bufferStarvationDelay,\n      1,\n      1,\n    );\n    if (bestSwitchLevel > -1) {\n      nextLoadLevel = bestSwitchLevel;\n    }\n\n    this.warn(`Fragment ${frag.sn}${\n      part ? ' part ' + part.index : ''\n    } of level ${loadingFragForLevel} is loading too slowly;\n      Fragment duration: ${frag.duration.toFixed(3)}\n      Time to underbuffer: ${bufferStarvationDelay.toFixed(3)} s\n      Estimated load time for current fragment: ${fragLoadedDelay.toFixed(3)} s\n      Estimated load time for down switch fragment: ${fragLevelNextLoadedDelay.toFixed(\n        3,\n      )} s\n      TTFB estimate: ${ttfb | 0} ms\n      Current BW estimate: ${\n        Number.isFinite(bwEstimate) ? bwEstimate | 0 : 'Unknown'\n      } bps\n      New BW estimate: ${this.getBwEstimate() | 0} bps\n      Switching to level ${nextLoadLevel} @ ${nextLoadLevelBitrate | 0} bps`);\n\n    hls.nextLoadLevel = hls.nextAutoLevel = nextLoadLevel;\n\n    this.clearTimer();\n    const abortAndSwitch = () => {\n      // Are nextLoadLevel details available or is stream-controller still in \"WAITING_LEVEL\" state?\n      this.clearTimer();\n      if (\n        this.fragCurrent === frag &&\n        this.hls.loadLevel === nextLoadLevel &&\n        nextLoadLevel > 0\n      ) {\n        const bufferStarvationDelay = this.getStarvationDelay();\n        this\n          .warn(`Aborting inflight request ${nextLoadLevel > 0 ? 'and switching down' : ''}\n      Fragment duration: ${frag.duration.toFixed(3)} s\n      Time to underbuffer: ${bufferStarvationDelay.toFixed(3)} s`);\n        frag.abortRequests();\n        this.fragCurrent = this.partCurrent = null;\n        if (nextLoadLevel > minAutoLevel) {\n          let lowestSwitchLevel = this.findBestLevel(\n            this.hls.levels[minAutoLevel].bitrate,\n            minAutoLevel,\n            nextLoadLevel,\n            0,\n            bufferStarvationDelay,\n            1,\n            1,\n          );\n          if (lowestSwitchLevel === -1) {\n            lowestSwitchLevel = minAutoLevel;\n          }\n          this.hls.nextLoadLevel = this.hls.nextAutoLevel = lowestSwitchLevel;\n          this.resetEstimator(this.hls.levels[lowestSwitchLevel].bitrate);\n        }\n      }\n    };\n    if (fragBlockingSwitch || fragLoadedDelay > fragLevelNextLoadedDelay * 2) {\n      abortAndSwitch();\n    } else {\n      this.timer = self.setInterval(\n        abortAndSwitch,\n        fragLevelNextLoadedDelay * 1000,\n      );\n    }\n\n    hls.trigger(Events.FRAG_LOAD_EMERGENCY_ABORTED, { frag, part, stats });\n  };\n\n  protected onFragLoaded(\n    event: Events.FRAG_LOADED,\n    { frag, part }: FragLoadedData,\n  ) {\n    const stats = part ? part.stats : frag.stats;\n    if (frag.type === PlaylistLevelType.MAIN) {\n      this.bwEstimator.sampleTTFB(stats.loading.first - stats.loading.start);\n    }\n    if (this.ignoreFragment(frag)) {\n      return;\n    }\n    // stop monitoring bw once frag loaded\n    this.clearTimer();\n    // reset forced auto level value so that next level will be selected\n    if (frag.level === this._nextAutoLevel) {\n      this._nextAutoLevel = -1;\n    }\n    this.firstSelection = -1;\n\n    // compute level average bitrate\n    if (this.hls.config.abrMaxWithRealBitrate) {\n      const duration = part ? part.duration : frag.duration;\n      const level = this.hls.levels[frag.level];\n      const loadedBytes =\n        (level.loaded ? level.loaded.bytes : 0) + stats.loaded;\n      const loadedDuration =\n        (level.loaded ? level.loaded.duration : 0) + duration;\n      level.loaded = { bytes: loadedBytes, duration: loadedDuration };\n      level.realBitrate = Math.round((8 * loadedBytes) / loadedDuration);\n    }\n    if (frag.bitrateTest) {\n      const fragBufferedData: FragBufferedData = {\n        stats,\n        frag,\n        part,\n        id: frag.type,\n      };\n      this.onFragBuffered(Events.FRAG_BUFFERED, fragBufferedData);\n      frag.bitrateTest = false;\n    } else {\n      // store level id after successful fragment load for playback\n      this.lastLoadedFragLevel = frag.level;\n    }\n  }\n\n  protected onFragBuffered(\n    event: Events.FRAG_BUFFERED,\n    data: FragBufferedData,\n  ) {\n    const { frag, part } = data;\n    const stats = part?.stats.loaded ? part.stats : frag.stats;\n\n    if (stats.aborted) {\n      return;\n    }\n    if (this.ignoreFragment(frag)) {\n      return;\n    }\n    // Use the difference between parsing and request instead of buffering and request to compute fragLoadingProcessing;\n    // rationale is that buffer appending only happens once media is attached. This can happen when config.startFragPrefetch\n    // is used. If we used buffering in that case, our BW estimate sample will be very large.\n    const processingMs =\n      stats.parsing.end -\n      stats.loading.start -\n      Math.min(\n        stats.loading.first - stats.loading.start,\n        this.bwEstimator.getEstimateTTFB(),\n      );\n    this.bwEstimator.sample(processingMs, stats.loaded);\n    stats.bwEstimate = this.getBwEstimate();\n    if (frag.bitrateTest) {\n      this.bitrateTestDelay = processingMs / 1000;\n    } else {\n      this.bitrateTestDelay = 0;\n    }\n  }\n\n  private ignoreFragment(frag: Fragment): boolean {\n    // Only count non-alt-audio frags which were actually buffered in our BW calculations\n    return frag.type !== PlaylistLevelType.MAIN || frag.sn === 'initSegment';\n  }\n\n  public clearTimer() {\n    if (this.timer > -1) {\n      self.clearInterval(this.timer);\n      this.timer = -1;\n    }\n  }\n\n  public get firstAutoLevel(): number {\n    const { maxAutoLevel, minAutoLevel } = this.hls;\n    const bwEstimate = this.getBwEstimate();\n    const maxStartDelay = this.hls.config.maxStarvationDelay;\n    const abrAutoLevel = this.findBestLevel(\n      bwEstimate,\n      minAutoLevel,\n      maxAutoLevel,\n      0,\n      maxStartDelay,\n      1,\n      1,\n    );\n    if (abrAutoLevel > -1) {\n      return abrAutoLevel;\n    }\n    const firstLevel = this.hls.firstLevel;\n    const clamped = Math.min(Math.max(firstLevel, minAutoLevel), maxAutoLevel);\n    this.warn(\n      `Could not find best starting auto level. Defaulting to first in playlist ${firstLevel} clamped to ${clamped}`,\n    );\n    return clamped;\n  }\n\n  public get forcedAutoLevel(): number {\n    if (this.nextAutoLevelKey) {\n      return -1;\n    }\n    return this._nextAutoLevel;\n  }\n\n  // return next auto level\n  public get nextAutoLevel(): number {\n    const forcedAutoLevel = this.forcedAutoLevel;\n    const bwEstimator = this.bwEstimator;\n    const useEstimate = bwEstimator.canEstimate();\n    const loadedFirstFrag = this.lastLoadedFragLevel > -1;\n    // in case next auto level has been forced, and bw not available or not reliable, return forced value\n    if (\n      forcedAutoLevel !== -1 &&\n      (!useEstimate ||\n        !loadedFirstFrag ||\n        this.nextAutoLevelKey === this.getAutoLevelKey())\n    ) {\n      return forcedAutoLevel;\n    }\n\n    // compute next level using ABR logic\n    const nextABRAutoLevel =\n      useEstimate && loadedFirstFrag\n        ? this.getNextABRAutoLevel()\n        : this.firstAutoLevel;\n\n    // use forced auto level while it hasn't errored more than ABR selection\n    if (forcedAutoLevel !== -1) {\n      const levels = this.hls.levels;\n      if (\n        levels.length > Math.max(forcedAutoLevel, nextABRAutoLevel) &&\n        levels[forcedAutoLevel].loadError <= levels[nextABRAutoLevel].loadError\n      ) {\n        return forcedAutoLevel;\n      }\n    }\n\n    // save result until state has changed\n    this._nextAutoLevel = nextABRAutoLevel;\n    this.nextAutoLevelKey = this.getAutoLevelKey();\n\n    return nextABRAutoLevel;\n  }\n\n  private getAutoLevelKey(): string {\n    return `${this.getBwEstimate()}_${this.getStarvationDelay().toFixed(2)}`;\n  }\n\n  private getNextABRAutoLevel(): number {\n    const { fragCurrent, partCurrent, hls } = this;\n    if (hls.levels.length <= 1) {\n      return hls.loadLevel;\n    }\n    const { maxAutoLevel, config, minAutoLevel } = hls;\n    const currentFragDuration = partCurrent\n      ? partCurrent.duration\n      : fragCurrent\n        ? fragCurrent.duration\n        : 0;\n    const avgbw = this.getBwEstimate();\n    // bufferStarvationDelay is the wall-clock time left until the playback buffer is exhausted.\n    const bufferStarvationDelay = this.getStarvationDelay();\n\n    let bwFactor = config.abrBandWidthFactor;\n    let bwUpFactor = config.abrBandWidthUpFactor;\n\n    // First, look to see if we can find a level matching with our avg bandwidth AND that could also guarantee no rebuffering at all\n    if (bufferStarvationDelay) {\n      const bestLevel = this.findBestLevel(\n        avgbw,\n        minAutoLevel,\n        maxAutoLevel,\n        bufferStarvationDelay,\n        0,\n        bwFactor,\n        bwUpFactor,\n      );\n      if (bestLevel >= 0) {\n        this.rebufferNotice = -1;\n        return bestLevel;\n      }\n    }\n    // not possible to get rid of rebuffering... try to find level that will guarantee less than maxStarvationDelay of rebuffering\n    let maxStarvationDelay = currentFragDuration\n      ? Math.min(currentFragDuration, config.maxStarvationDelay)\n      : config.maxStarvationDelay;\n\n    if (!bufferStarvationDelay) {\n      // in case buffer is empty, let's check if previous fragment was loaded to perform a bitrate test\n      const bitrateTestDelay = this.bitrateTestDelay;\n      if (bitrateTestDelay) {\n        // if it is the case, then we need to adjust our max starvation delay using maxLoadingDelay config value\n        // max video loading delay used in  automatic start level selection :\n        // in that mode ABR controller will ensure that video loading time (ie the time to fetch the first fragment at lowest quality level +\n        // the time to fetch the fragment at the appropriate quality level is less than ```maxLoadingDelay``` )\n        // cap maxLoadingDelay and ensure it is not bigger 'than bitrate test' frag duration\n        const maxLoadingDelay = currentFragDuration\n          ? Math.min(currentFragDuration, config.maxLoadingDelay)\n          : config.maxLoadingDelay;\n        maxStarvationDelay = maxLoadingDelay - bitrateTestDelay;\n        this.info(\n          `bitrate test took ${Math.round(\n            1000 * bitrateTestDelay,\n          )}ms, set first fragment max fetchDuration to ${Math.round(\n            1000 * maxStarvationDelay,\n          )} ms`,\n        );\n        // don't use conservative factor on bitrate test\n        bwFactor = bwUpFactor = 1;\n      }\n    }\n    const bestLevel = this.findBestLevel(\n      avgbw,\n      minAutoLevel,\n      maxAutoLevel,\n      bufferStarvationDelay,\n      maxStarvationDelay,\n      bwFactor,\n      bwUpFactor,\n    );\n    if (this.rebufferNotice !== bestLevel) {\n      this.rebufferNotice = bestLevel;\n      this.info(\n        `${\n          bufferStarvationDelay ? 'rebuffering expected' : 'buffer is empty'\n        }, optimal quality level ${bestLevel}`,\n      );\n    }\n    if (bestLevel > -1) {\n      return bestLevel;\n    }\n    // If no matching level found, see if min auto level would be a better option\n    const minLevel = hls.levels[minAutoLevel];\n    const autoLevel = hls.loadLevelObj;\n    if (autoLevel && minLevel?.bitrate < autoLevel.bitrate) {\n      return minAutoLevel;\n    }\n    // or if bitrate is not lower, continue to use loadLevel\n    return hls.loadLevel;\n  }\n\n  private getStarvationDelay(): number {\n    const hls = this.hls;\n    const media = hls.media;\n    if (!media) {\n      return Infinity;\n    }\n    // playbackRate is the absolute value of the playback rate; if media.playbackRate is 0, we use 1 to load as\n    // if we're playing back at the normal rate.\n    const playbackRate =\n      media && media.playbackRate !== 0 ? Math.abs(media.playbackRate) : 1.0;\n    const bufferInfo = hls.mainForwardBufferInfo;\n    return (bufferInfo ? bufferInfo.len : 0) / playbackRate;\n  }\n\n  private getBwEstimate(): number {\n    return this.bwEstimator.canEstimate()\n      ? this.bwEstimator.getEstimate()\n      : this.hls.config.abrEwmaDefaultEstimate;\n  }\n\n  private findBestLevel(\n    currentBw: number,\n    minAutoLevel: number,\n    maxAutoLevel: number,\n    bufferStarvationDelay: number,\n    maxStarvationDelay: number,\n    bwFactor: number,\n    bwUpFactor: number,\n  ): number {\n    const maxFetchDuration: number = bufferStarvationDelay + maxStarvationDelay;\n    const lastLoadedFragLevel = this.lastLoadedFragLevel;\n    const selectionBaseLevel =\n      lastLoadedFragLevel === -1 ? this.hls.firstLevel : lastLoadedFragLevel;\n    const { fragCurrent, partCurrent } = this;\n    const { levels, allAudioTracks, loadLevel, config } = this.hls;\n    if (levels.length === 1) {\n      return 0;\n    }\n    const level = levels[selectionBaseLevel] as Level | undefined;\n    const live = !!this.hls.latestLevelDetails?.live;\n    const firstSelection = loadLevel === -1 || lastLoadedFragLevel === -1;\n    let currentCodecSet: string | undefined;\n    let currentVideoRange: VideoRange | undefined = 'SDR';\n    let currentFrameRate = level?.frameRate || 0;\n\n    const { audioPreference, videoPreference } = config;\n    const audioTracksByGroup =\n      this.audioTracksByGroup ||\n      (this.audioTracksByGroup = getAudioTracksByGroup(allAudioTracks));\n    let minStartIndex = -1;\n    if (firstSelection) {\n      if (this.firstSelection !== -1) {\n        return this.firstSelection;\n      }\n      const codecTiers =\n        this.codecTiers ||\n        (this.codecTiers = getCodecTiers(\n          levels,\n          audioTracksByGroup,\n          minAutoLevel,\n          maxAutoLevel,\n        ));\n      const startTier = getStartCodecTier(\n        codecTiers,\n        currentVideoRange,\n        currentBw,\n        audioPreference,\n        videoPreference,\n      );\n      const {\n        codecSet,\n        videoRanges,\n        minFramerate,\n        minBitrate,\n        minIndex,\n        preferHDR,\n      } = startTier;\n      minStartIndex = minIndex;\n      currentCodecSet = codecSet;\n      currentVideoRange = preferHDR\n        ? videoRanges[videoRanges.length - 1]\n        : videoRanges[0];\n      currentFrameRate = minFramerate;\n      currentBw = Math.max(currentBw, minBitrate);\n      this.log(`picked start tier ${stringify(startTier)}`);\n    } else {\n      currentCodecSet = level?.codecSet;\n      currentVideoRange = level?.videoRange;\n    }\n\n    const currentFragDuration = partCurrent\n      ? partCurrent.duration\n      : fragCurrent\n        ? fragCurrent.duration\n        : 0;\n\n    const ttfbEstimateSec = this.bwEstimator.getEstimateTTFB() / 1000;\n    const levelsSkipped: number[] = [];\n    for (let i = maxAutoLevel; i >= minAutoLevel; i--) {\n      const levelInfo = levels[i];\n      const upSwitch = i > selectionBaseLevel;\n      if (!levelInfo) {\n        continue;\n      }\n      if (\n        __USE_MEDIA_CAPABILITIES__ &&\n        config.useMediaCapabilities &&\n        !levelInfo.supportedResult &&\n        !levelInfo.supportedPromise\n      ) {\n        const mediaCapabilities = navigator.mediaCapabilities as\n          | MediaCapabilities\n          | undefined;\n        if (\n          typeof mediaCapabilities?.decodingInfo === 'function' &&\n          requiresMediaCapabilitiesDecodingInfo(\n            levelInfo,\n            audioTracksByGroup,\n            currentVideoRange,\n            currentFrameRate,\n            currentBw,\n            audioPreference,\n          )\n        ) {\n          levelInfo.supportedPromise = getMediaDecodingInfoPromise(\n            levelInfo,\n            audioTracksByGroup,\n            mediaCapabilities,\n            this.supportedCache,\n          );\n          levelInfo.supportedPromise\n            .then((decodingInfo) => {\n              if (!this.hls) {\n                return;\n              }\n              levelInfo.supportedResult = decodingInfo;\n              const levels = this.hls.levels;\n              const index = levels.indexOf(levelInfo);\n              if (decodingInfo.error) {\n                this.warn(\n                  `MediaCapabilities decodingInfo error: \"${\n                    decodingInfo.error\n                  }\" for level ${index} ${stringify(decodingInfo)}`,\n                );\n              } else if (!decodingInfo.supported) {\n                this.warn(\n                  `Unsupported MediaCapabilities decodingInfo result for level ${index} ${stringify(\n                    decodingInfo,\n                  )}`,\n                );\n                if (index > -1 && levels.length > 1) {\n                  this.log(`Removing unsupported level ${index}`);\n                  this.hls.removeLevel(index);\n                  if (this.hls.loadLevel === -1) {\n                    this.hls.nextLoadLevel = 0;\n                  }\n                }\n              } else if (\n                decodingInfo.decodingInfoResults.some(\n                  (info) =>\n                    info.smooth === false || info.powerEfficient === false,\n                )\n              ) {\n                this.log(\n                  `MediaCapabilities decodingInfo for level ${index} not smooth or powerEfficient: ${stringify(decodingInfo)}`,\n                );\n              }\n            })\n            .catch((error) => {\n              this.warn(\n                `Error handling MediaCapabilities decodingInfo: ${error}`,\n              );\n            });\n        } else {\n          levelInfo.supportedResult = SUPPORTED_INFO_DEFAULT;\n        }\n      }\n\n      // skip candidates which change codec-family or video-range,\n      // and which decrease or increase frame-rate for up and down-switch respectfully\n      if (\n        (currentCodecSet && levelInfo.codecSet !== currentCodecSet) ||\n        (currentVideoRange && levelInfo.videoRange !== currentVideoRange) ||\n        (upSwitch && currentFrameRate > levelInfo.frameRate) ||\n        (!upSwitch &&\n          currentFrameRate > 0 &&\n          currentFrameRate < levelInfo.frameRate) ||\n        levelInfo.supportedResult?.decodingInfoResults?.some(\n          (info) => info.smooth === false,\n        )\n      ) {\n        if (!firstSelection || i !== minStartIndex) {\n          levelsSkipped.push(i);\n          continue;\n        }\n      }\n\n      const levelDetails = levelInfo.details;\n      const avgDuration =\n        (partCurrent\n          ? levelDetails?.partTarget\n          : levelDetails?.averagetargetduration) || currentFragDuration;\n\n      let adjustedbw: number;\n      // follow algorithm captured from stagefright :\n      // https://android.googlesource.com/platform/frameworks/av/+/master/media/libstagefright/httplive/LiveSession.cpp\n      // Pick the highest bandwidth stream below or equal to estimated bandwidth.\n      // consider only 80% of the available bandwidth, but if we are switching up,\n      // be even more conservative (70%) to avoid overestimating and immediately\n      // switching back.\n      if (!upSwitch) {\n        adjustedbw = bwFactor * currentBw;\n      } else {\n        adjustedbw = bwUpFactor * currentBw;\n      }\n\n      // Use average bitrate when starvation delay (buffer length) is gt or eq two segment durations and rebuffering is not expected (maxStarvationDelay > 0)\n      const bitrate: number =\n        currentFragDuration &&\n        bufferStarvationDelay >= currentFragDuration * 2 &&\n        maxStarvationDelay === 0\n          ? levelInfo.averageBitrate\n          : levelInfo.maxBitrate;\n      const fetchDuration: number = this.getTimeToLoadFrag(\n        ttfbEstimateSec,\n        adjustedbw,\n        bitrate * avgDuration,\n        levelDetails === undefined,\n      );\n\n      const canSwitchWithinTolerance =\n        // if adjusted bw is greater than level bitrate AND\n        adjustedbw >= bitrate &&\n        // no level change, or new level has no error history\n        (i === lastLoadedFragLevel ||\n          (levelInfo.loadError === 0 && levelInfo.fragmentError === 0)) &&\n        // fragment fetchDuration unknown OR live stream OR fragment fetchDuration less than max allowed fetch duration, then this level matches\n        // we don't account for max Fetch Duration for live streams, this is to avoid switching down when near the edge of live sliding window ...\n        // special case to support startLevel = -1 (bitrateTest) on live streams : in that case we should not exit loop so that findBestLevel will return -1\n        (fetchDuration <= ttfbEstimateSec ||\n          !Number.isFinite(fetchDuration) ||\n          (live && !this.bitrateTestDelay) ||\n          fetchDuration < maxFetchDuration);\n      if (canSwitchWithinTolerance) {\n        const forcedAutoLevel = this.forcedAutoLevel;\n        if (\n          i !== loadLevel &&\n          (forcedAutoLevel === -1 || forcedAutoLevel !== loadLevel)\n        ) {\n          if (levelsSkipped.length) {\n            this.trace(\n              `Skipped level(s) ${levelsSkipped.join(\n                ',',\n              )} of ${maxAutoLevel} max with CODECS and VIDEO-RANGE:\"${\n                levels[levelsSkipped[0]].codecs\n              }\" ${levels[levelsSkipped[0]].videoRange}; not compatible with \"${\n                currentCodecSet\n              }\" ${currentVideoRange}`,\n            );\n          }\n          this.info(\n            `switch candidate:${selectionBaseLevel}->${i} adjustedbw(${Math.round(\n              adjustedbw,\n            )})-bitrate=${Math.round(\n              adjustedbw - bitrate,\n            )} ttfb:${ttfbEstimateSec.toFixed(\n              1,\n            )} avgDuration:${avgDuration.toFixed(\n              1,\n            )} maxFetchDuration:${maxFetchDuration.toFixed(\n              1,\n            )} fetchDuration:${fetchDuration.toFixed(\n              1,\n            )} firstSelection:${firstSelection} codecSet:${levelInfo.codecSet} videoRange:${levelInfo.videoRange} hls.loadLevel:${loadLevel}`,\n          );\n        }\n        if (firstSelection) {\n          this.firstSelection = i;\n        }\n        // as we are looping from highest to lowest, this will return the best achievable quality level\n        return i;\n      }\n    }\n    // not enough time budget even with quality level 0 ... rebuffering might happen\n    return -1;\n  }\n\n  public set nextAutoLevel(nextLevel: number) {\n    const value = this.deriveNextAutoLevel(nextLevel);\n    if (this._nextAutoLevel !== value) {\n      this.nextAutoLevelKey = '';\n      this._nextAutoLevel = value;\n    }\n  }\n\n  protected deriveNextAutoLevel(nextLevel: number) {\n    const { maxAutoLevel, minAutoLevel } = this.hls;\n    return Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);\n  }\n}\n\nexport default AbrController;\n", "type BinarySearchComparison<T> = (candidate: T) => -1 | 0 | 1;\n\nconst BinarySearch = {\n  /**\n   * Searches for an item in an array which matches a certain condition.\n   * This requires the condition to only match one item in the array,\n   * and for the array to be ordered.\n   *\n   * @param list The array to search.\n   * @param comparisonFn\n   *      Called and provided a candidate item as the first argument.\n   *      Should return:\n   *          > -1 if the item should be located at a lower index than the provided item.\n   *          > 1 if the item should be located at a higher index than the provided item.\n   *          > 0 if the item is the item you're looking for.\n   *\n   * @returns the object if found, otherwise returns null\n   */\n  search: function <T>(\n    list: T[],\n    comparisonFn: BinarySearchComparison<T>,\n  ): T | null {\n    let minIndex: number = 0;\n    let maxIndex: number = list.length - 1;\n    let currentIndex: number | null = null;\n    let currentElement: T | null = null;\n\n    while (minIndex <= maxIndex) {\n      currentIndex = ((minIndex + maxIndex) / 2) | 0;\n      currentElement = list[currentIndex];\n\n      const comparisonResult = comparisonFn(currentElement);\n      if (comparisonResult > 0) {\n        minIndex = currentIndex + 1;\n      } else if (comparisonResult < 0) {\n        maxIndex = currentIndex - 1;\n      } else {\n        return currentElement;\n      }\n    }\n\n    return null;\n  },\n};\n\nexport default BinarySearch;\n", "import BinarySearch from '../utils/binary-search';\nimport type { Fragment, MediaFragment } from '../loader/fragment';\nimport type { LevelDetails } from '../loader/level-details';\n\n/**\n * Returns first fragment whose endPdt value exceeds the given PDT, or null.\n * @param fragments - The array of candidate fragments\n * @param PDTValue - The PDT value which must be exceeded\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous\n */\nexport function findFragmentByPDT(\n  fragments: MediaFragment[],\n  PDTValue: number | null,\n  maxFragLookUpTolerance: number,\n): MediaFragment | null {\n  if (\n    PDTValue === null ||\n    !Array.isArray(fragments) ||\n    !fragments.length ||\n    !Number.isFinite(PDTValue)\n  ) {\n    return null;\n  }\n\n  // if less than start\n  const startPDT = fragments[0].programDateTime;\n  if (PDTValue < (startPDT || 0)) {\n    return null;\n  }\n\n  const endPDT = fragments[fragments.length - 1].endProgramDateTime;\n  if (PDTValue >= (endPDT || 0)) {\n    return null;\n  }\n\n  for (let seg = 0; seg < fragments.length; ++seg) {\n    const frag = fragments[seg];\n    if (pdtWithinToleranceTest(PDTValue, maxFragLookUpTolerance, frag)) {\n      return frag;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Finds a fragment based on the SN of the previous fragment; or based on the needs of the current buffer.\n * This method compensates for small buffer gaps by applying a tolerance to the start of any candidate fragment, thus\n * breaking any traps which would cause the same fragment to be continuously selected within a small range.\n * @param fragPrevious - The last frag successfully appended\n * @param fragments - The array of candidate fragments\n * @param bufferEnd - The end of the contiguous buffered range the playhead is currently within\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous\n * @returns a matching fragment or null\n */\nexport function findFragmentByPTS(\n  fragPrevious: MediaFragment | null,\n  fragments: MediaFragment[],\n  bufferEnd: number = 0,\n  maxFragLookUpTolerance: number = 0,\n  nextFragLookupTolerance: number = 0.005,\n): MediaFragment | null {\n  let fragNext: MediaFragment | null = null;\n  if (fragPrevious) {\n    fragNext = fragments[1 + fragPrevious.sn - fragments[0].sn] || null;\n    // check for buffer-end rounding error\n    const bufferEdgeError = (fragPrevious.endDTS as number) - bufferEnd;\n    if (bufferEdgeError > 0 && bufferEdgeError < 0.0000015) {\n      bufferEnd += 0.0000015;\n    }\n    if (\n      fragNext &&\n      fragPrevious.level !== fragNext.level &&\n      fragNext.end <= fragPrevious.end\n    ) {\n      fragNext = fragments[2 + fragPrevious.sn - fragments[0].sn] || null;\n    }\n  } else if (bufferEnd === 0 && fragments[0].start === 0) {\n    fragNext = fragments[0];\n  }\n  // Prefer the next fragment if it's within tolerance\n  if (\n    fragNext &&\n    (((!fragPrevious || fragPrevious.level === fragNext.level) &&\n      fragmentWithinToleranceTest(\n        bufferEnd,\n        maxFragLookUpTolerance,\n        fragNext,\n      ) === 0) ||\n      fragmentWithinFastStartSwitch(\n        fragNext,\n        fragPrevious,\n        Math.min(nextFragLookupTolerance, maxFragLookUpTolerance),\n      ))\n  ) {\n    return fragNext;\n  }\n  // We might be seeking past the tolerance so find the best match\n  const foundFragment = BinarySearch.search(\n    fragments,\n    fragmentWithinToleranceTest.bind(null, bufferEnd, maxFragLookUpTolerance),\n  );\n  if (foundFragment && (foundFragment !== fragPrevious || !fragNext)) {\n    return foundFragment;\n  }\n  // If no match was found return the next fragment after fragPrevious, or null\n  return fragNext;\n}\n\nfunction fragmentWithinFastStartSwitch(\n  fragNext: Fragment,\n  fragPrevious: Fragment | null,\n  nextFragLookupTolerance: number,\n): boolean {\n  if (\n    fragPrevious &&\n    fragPrevious.start === 0 &&\n    fragPrevious.level < fragNext.level &&\n    (fragPrevious.endPTS || 0) > 0\n  ) {\n    const firstDuration = fragPrevious.tagList.reduce((duration, tag) => {\n      if (tag[0] === 'INF') {\n        duration += parseFloat(tag[1]);\n      }\n      return duration;\n    }, nextFragLookupTolerance);\n    return fragNext.start <= firstDuration;\n  }\n  return false;\n}\n\n/**\n * The test function used by the findFragmentBySn's BinarySearch to look for the best match to the current buffer conditions.\n * @param candidate - The fragment to test\n * @param bufferEnd - The end of the current buffered range the playhead is currently within\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start can be within in order to be considered contiguous\n * @returns 0 if it matches, 1 if too low, -1 if too high\n */\nexport function fragmentWithinToleranceTest(\n  bufferEnd = 0,\n  maxFragLookUpTolerance = 0,\n  candidate: MediaFragment,\n) {\n  // eagerly accept an accurate match (no tolerance)\n  if (\n    candidate.start <= bufferEnd &&\n    candidate.start + candidate.duration > bufferEnd\n  ) {\n    return 0;\n  }\n  // offset should be within fragment boundary - config.maxFragLookUpTolerance\n  // this is to cope with situations like\n  // bufferEnd = 9.991\n  // frag[Ø] : [0,10]\n  // frag[1] : [10,20]\n  // bufferEnd is within frag[0] range ... although what we are expecting is to return frag[1] here\n  //              frag start               frag start+duration\n  //                  |-----------------------------|\n  //              <--->                         <--->\n  //  ...--------><-----------------------------><---------....\n  // previous frag         matching fragment         next frag\n  //  return -1             return 0                 return 1\n  // logger.log(`level/sn/start/end/bufEnd:${level}/${candidate.sn}/${candidate.start}/${(candidate.start+candidate.duration)}/${bufferEnd}`);\n  // Set the lookup tolerance to be small enough to detect the current segment - ensures we don't skip over very small segments\n  const candidateLookupTolerance = Math.min(\n    maxFragLookUpTolerance,\n    candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0),\n  );\n  if (\n    candidate.start + candidate.duration - candidateLookupTolerance <=\n    bufferEnd\n  ) {\n    return 1;\n  } else if (\n    candidate.start - candidateLookupTolerance > bufferEnd &&\n    candidate.start\n  ) {\n    // if maxFragLookUpTolerance will have negative value then don't return -1 for first element\n    return -1;\n  }\n\n  return 0;\n}\n\n/**\n * The test function used by the findFragmentByPdt's BinarySearch to look for the best match to the current buffer conditions.\n * This function tests the candidate's program date time values, as represented in Unix time\n * @param candidate - The fragment to test\n * @param pdtBufferEnd - The Unix time representing the end of the current buffered range\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start can be within in order to be considered contiguous\n * @returns true if contiguous, false otherwise\n */\nexport function pdtWithinToleranceTest(\n  pdtBufferEnd: number,\n  maxFragLookUpTolerance: number,\n  candidate: MediaFragment,\n): boolean {\n  const candidateLookupTolerance =\n    Math.min(\n      maxFragLookUpTolerance,\n      candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0),\n    ) * 1000;\n\n  // endProgramDateTime can be null, default to zero\n  const endProgramDateTime = candidate.endProgramDateTime || 0;\n  return endProgramDateTime - candidateLookupTolerance > pdtBufferEnd;\n}\n\nexport function findFragWithCC(\n  fragments: MediaFragment[],\n  cc: number,\n): MediaFragment | null {\n  return BinarySearch.search(fragments, (candidate) => {\n    if (candidate.cc < cc) {\n      return 1;\n    } else if (candidate.cc > cc) {\n      return -1;\n    } else {\n      return 0;\n    }\n  });\n}\n\nexport function findNearestWithCC(\n  details: LevelDetails | undefined,\n  cc: number,\n  pos: number,\n): MediaFragment | null {\n  if (details) {\n    if (details.startCC <= cc && details.endCC >= cc) {\n      let fragments = details.fragments;\n      const { fragmentHint } = details;\n      if (fragmentHint) {\n        fragments = fragments.concat(fragmentHint);\n      }\n      let closest: MediaFragment | undefined;\n      BinarySearch.search(fragments, (candidate) => {\n        if (candidate.cc < cc) {\n          return 1;\n        }\n        if (candidate.cc > cc) {\n          return -1;\n        }\n        closest = candidate;\n        if (candidate.end <= pos) {\n          return 1;\n        }\n        if (candidate.start > pos) {\n          return -1;\n        }\n        return 0;\n      });\n      return closest || null;\n    }\n  }\n  return null;\n}\n", "import { ErrorDetails } from '../errors';\nimport type { LoaderConfig, LoadPolicy, RetryConfig } from '../config';\nimport type { ErrorData } from '../types/events';\nimport type { LoaderResponse } from '../types/loader';\n\nexport function isTimeoutError(error: ErrorData): boolean {\n  switch (error.details) {\n    case ErrorDetails.FRAG_LOAD_TIMEOUT:\n    case ErrorDetails.KEY_LOAD_TIMEOUT:\n    case ErrorDetails.LEVEL_LOAD_TIMEOUT:\n    case ErrorDetails.MANIFEST_LOAD_TIMEOUT:\n      return true;\n  }\n  return false;\n}\n\nexport function isKeyError(error: ErrorData): boolean {\n  return error.details.startsWith('key');\n}\n\nexport function isUnusableKeyError(error: ErrorData): boolean {\n  return isKeyError(error) && !!error.frag && !error.frag.decryptdata;\n}\n\nexport function getRetryConfig(\n  loadPolicy: LoadPolicy,\n  error: ErrorData,\n): RetryConfig | null {\n  const isTimeout = isTimeoutError(error);\n  return loadPolicy.default[`${isTimeout ? 'timeout' : 'error'}Retry`];\n}\n\nexport function getRetryDelay(\n  retryConfig: RetryConfig,\n  retryCount: number,\n): number {\n  // exponential backoff capped to max retry delay\n  const backoffFactor =\n    retryConfig.backoff === 'linear' ? 1 : Math.pow(2, retryCount);\n  return Math.min(\n    backoffFactor * retryConfig.retryDelayMs,\n    retryConfig.maxRetryDelayMs,\n  );\n}\n\nexport function getLoaderConfigWithoutReties(\n  loderConfig: LoaderConfig,\n): LoaderConfig {\n  return {\n    ...loderConfig,\n    ...{\n      errorRetry: null,\n      timeoutRetry: null,\n    },\n  };\n}\n\nexport function shouldRetry(\n  retryConfig: RetryConfig | null | undefined,\n  retryCount: number,\n  isTimeout: boolean,\n  loaderResponse?: LoaderResponse | undefined,\n): retryConfig is RetryConfig & boolean {\n  if (!retryConfig) {\n    return false;\n  }\n  const httpStatus = loaderResponse?.code;\n  const retry =\n    retryCount < retryConfig.maxNumRetry &&\n    (retryForHttpStatus(httpStatus) || !!isTimeout);\n  return retryConfig.shouldRetry\n    ? retryConfig.shouldRetry(\n        retryConfig,\n        retryCount,\n        isTimeout,\n        loaderResponse,\n        retry,\n      )\n    : retry;\n}\n\nexport function retryForHttpStatus(httpStatus: number | undefined): boolean {\n  // Do not retry on status 4xx, status 0 (CORS error), or undefined (decrypt/gap/parse error)\n  return (\n    offlineHttpStatus(httpStatus) ||\n    (!!httpStatus && (httpStatus < 400 || httpStatus > 499))\n  );\n}\n\nexport function offlineHttpStatus(httpStatus: number | undefined): boolean {\n  return httpStatus === 0 && navigator.onLine === false;\n}\n", "import { findFragmentByPTS } from './fragment-finders';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { HdcpLevels } from '../types/level';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { getCodecsForMimeType } from '../utils/codecs';\nimport {\n  getRetryConfig,\n  isKeyError,\n  isTimeoutError,\n  isUnusableKeyError,\n  shouldRetry,\n} from '../utils/error-helper';\nimport { arrayToHex } from '../utils/hex';\nimport { Logger } from '../utils/logger';\nimport type { RetryConfig } from '../config';\nimport type { LevelKey } from '../hls';\nimport type Hls from '../hls';\nimport type { Fragment, MediaFragment } from '../loader/fragment';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type { ErrorData } from '../types/events';\nimport type { HdcpLevel, Level } from '../types/level';\n\nexport const enum NetworkErrorAction {\n  DoNothing = 0,\n  SendEndCallback = 1, // Reserved for future use\n  SendAlternateToPenaltyBox = 2,\n  RemoveAlternatePermanently = 3, // Reserved for future use\n  InsertDiscontinuity = 4, // Reserved for future use\n  RetryRequest = 5,\n}\n\nexport const enum ErrorActionFlags {\n  None = 0,\n  MoveAllAlternatesMatchingHost = 1,\n  MoveAllAlternatesMatchingHDCP = 2,\n  MoveAllAlternatesMatchingKey = 4,\n  SwitchToSDR = 8,\n}\n\nexport type IErrorAction = {\n  action: NetworkErrorAction;\n  flags: ErrorActionFlags;\n  retryCount?: number;\n  retryConfig?: RetryConfig;\n  hdcpLevel?: HdcpLevel;\n  nextAutoLevel?: number;\n  resolved?: boolean;\n};\nexport default class ErrorController\n  extends Logger\n  implements NetworkComponentAPI\n{\n  private readonly hls: Hls;\n  private playlistError: number = 0;\n\n  constructor(hls: Hls) {\n    super('error-controller', hls.logger);\n    this.hls = hls;\n    this.registerListeners();\n  }\n\n  private registerListeners() {\n    const hls = this.hls;\n    hls.on(Events.ERROR, this.onError, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n  }\n\n  private unregisterListeners() {\n    const hls = this.hls;\n    if (!hls) {\n      return;\n    }\n    hls.off(Events.ERROR, this.onError, this);\n    hls.off(Events.ERROR, this.onErrorOut, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n  }\n\n  destroy() {\n    this.unregisterListeners();\n    // @ts-ignore\n    this.hls = null;\n  }\n\n  startLoad(startPosition: number): void {}\n\n  stopLoad(): void {\n    this.playlistError = 0;\n  }\n\n  private getVariantLevelIndex(frag: Fragment | undefined): number {\n    if (frag?.type === PlaylistLevelType.MAIN) {\n      return frag.level;\n    }\n    return this.getVariantIndex();\n  }\n\n  private getVariantIndex(): number {\n    const hls = this.hls;\n    const currentLevel = hls.currentLevel;\n    if (hls.loadLevelObj?.details || currentLevel === -1) {\n      return hls.loadLevel;\n    }\n    return currentLevel;\n  }\n\n  private variantHasKey(\n    level: Level | undefined,\n    keyInError: LevelKey,\n  ): boolean {\n    if (level) {\n      if (level.details?.hasKey(keyInError)) {\n        return true;\n      }\n      const audioGroupsIds = level.audioGroups;\n      if (audioGroupsIds) {\n        const audioTracks = this.hls.allAudioTracks.filter(\n          (track) => audioGroupsIds.indexOf(track.groupId) >= 0,\n        );\n        return audioTracks.some((track) => track.details?.hasKey(keyInError));\n      }\n    }\n    return false;\n  }\n\n  private onManifestLoading() {\n    this.playlistError = 0;\n  }\n\n  private onLevelUpdated() {\n    this.playlistError = 0;\n  }\n\n  private onError(event: Events.ERROR, data: ErrorData) {\n    if (data.fatal) {\n      return;\n    }\n    const hls = this.hls;\n    const context = data.context;\n\n    switch (data.details) {\n      case ErrorDetails.FRAG_LOAD_ERROR:\n      case ErrorDetails.FRAG_LOAD_TIMEOUT:\n      case ErrorDetails.KEY_LOAD_ERROR:\n      case ErrorDetails.KEY_LOAD_TIMEOUT:\n        data.errorAction = this.getFragRetryOrSwitchAction(data);\n        return;\n      case ErrorDetails.FRAG_PARSING_ERROR:\n        // ignore empty segment errors marked as gap\n        if (data.frag?.gap) {\n          data.errorAction = createDoNothingErrorAction();\n          return;\n        }\n      // falls through\n      case ErrorDetails.FRAG_GAP:\n      case ErrorDetails.FRAG_DECRYPT_ERROR: {\n        // Switch level if possible, otherwise allow retry count to reach max error retries\n        data.errorAction = this.getFragRetryOrSwitchAction(data);\n        data.errorAction.action = NetworkErrorAction.SendAlternateToPenaltyBox;\n        return;\n      }\n      case ErrorDetails.LEVEL_EMPTY_ERROR:\n      case ErrorDetails.LEVEL_PARSING_ERROR:\n        {\n          // Only retry when empty and live\n          const levelIndex =\n            data.parent === PlaylistLevelType.MAIN\n              ? (data.level as number)\n              : hls.loadLevel;\n          if (\n            data.details === ErrorDetails.LEVEL_EMPTY_ERROR &&\n            !!data.context?.levelDetails?.live\n          ) {\n            data.errorAction = this.getPlaylistRetryOrSwitchAction(\n              data,\n              levelIndex,\n            );\n          } else {\n            // Escalate to fatal if not retrying or switching\n            data.levelRetry = false;\n            data.errorAction = this.getLevelSwitchAction(data, levelIndex);\n          }\n        }\n        return;\n      case ErrorDetails.LEVEL_LOAD_ERROR:\n      case ErrorDetails.LEVEL_LOAD_TIMEOUT:\n        if (typeof context?.level === 'number') {\n          data.errorAction = this.getPlaylistRetryOrSwitchAction(\n            data,\n            context.level,\n          );\n        }\n        return;\n      case ErrorDetails.AUDIO_TRACK_LOAD_ERROR:\n      case ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:\n      case ErrorDetails.SUBTITLE_LOAD_ERROR:\n      case ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT:\n        if (context) {\n          const level = hls.loadLevelObj;\n          if (\n            level &&\n            ((context.type === PlaylistContextType.AUDIO_TRACK &&\n              level.hasAudioGroup(context.groupId)) ||\n              (context.type === PlaylistContextType.SUBTITLE_TRACK &&\n                level.hasSubtitleGroup(context.groupId)))\n          ) {\n            // Perform Pathway switch or Redundant failover if possible for fastest recovery\n            // otherwise allow playlist retry count to reach max error retries\n            data.errorAction = this.getPlaylistRetryOrSwitchAction(\n              data,\n              hls.loadLevel,\n            );\n            data.errorAction.action =\n              NetworkErrorAction.SendAlternateToPenaltyBox;\n            data.errorAction.flags =\n              ErrorActionFlags.MoveAllAlternatesMatchingHost;\n            return;\n          }\n        }\n        return;\n      case ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:\n        {\n          data.errorAction = {\n            action: NetworkErrorAction.SendAlternateToPenaltyBox,\n            flags: ErrorActionFlags.MoveAllAlternatesMatchingHDCP,\n          };\n        }\n        return;\n      case ErrorDetails.KEY_SYSTEM_SESSION_UPDATE_FAILED:\n      case ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR:\n      case ErrorDetails.KEY_SYSTEM_NO_SESSION:\n        {\n          data.errorAction = {\n            action: NetworkErrorAction.SendAlternateToPenaltyBox,\n            flags: ErrorActionFlags.MoveAllAlternatesMatchingKey,\n          };\n        }\n        return;\n      case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n      case ErrorDetails.REMUX_ALLOC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        // Buffer-controller can set errorAction when append errors can be ignored or resolved locally\n        if (!data.errorAction) {\n          data.errorAction = this.getLevelSwitchAction(\n            data,\n            data.level ?? hls.loadLevel,\n          );\n        }\n        return;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n      case ErrorDetails.BUFFER_APPENDING_ERROR:\n      case ErrorDetails.BUFFER_FULL_ERROR:\n      case ErrorDetails.LEVEL_SWITCH_ERROR:\n      case ErrorDetails.BUFFER_STALLED_ERROR:\n      case ErrorDetails.BUFFER_SEEK_OVER_HOLE:\n      case ErrorDetails.BUFFER_NUDGE_ON_STALL:\n        data.errorAction = createDoNothingErrorAction();\n        return;\n    }\n\n    if (data.type === ErrorTypes.KEY_SYSTEM_ERROR) {\n      // Do not retry level. Should be fatal if ErrorDetails.KEY_SYSTEM_<ERROR> not handled with early return above.\n      data.levelRetry = false;\n      data.errorAction = createDoNothingErrorAction();\n    }\n  }\n\n  private getPlaylistRetryOrSwitchAction(\n    data: ErrorData,\n    levelIndex: number | null | undefined,\n  ): IErrorAction {\n    const hls = this.hls;\n    const retryConfig = getRetryConfig(hls.config.playlistLoadPolicy, data);\n    const retryCount = this.playlistError++;\n    const retry = shouldRetry(\n      retryConfig,\n      retryCount,\n      isTimeoutError(data),\n      data.response,\n    );\n    if (retry) {\n      return {\n        action: NetworkErrorAction.RetryRequest,\n        flags: ErrorActionFlags.None,\n        retryConfig,\n        retryCount,\n      };\n    }\n    const errorAction = this.getLevelSwitchAction(data, levelIndex);\n    if (retryConfig) {\n      errorAction.retryConfig = retryConfig;\n      errorAction.retryCount = retryCount;\n    }\n    return errorAction;\n  }\n\n  private getFragRetryOrSwitchAction(data: ErrorData): IErrorAction {\n    const hls = this.hls;\n    // Share fragment error count accross media options (main, audio, subs)\n    // This allows for level based rendition switching when media option assets fail\n    const variantLevelIndex = this.getVariantLevelIndex(data.frag);\n    const level = hls.levels[variantLevelIndex];\n    const { fragLoadPolicy, keyLoadPolicy } = hls.config;\n    const retryConfig = getRetryConfig(\n      isKeyError(data) ? keyLoadPolicy : fragLoadPolicy,\n      data,\n    );\n    const fragmentErrors = hls.levels.reduce(\n      (acc, level) => acc + level.fragmentError,\n      0,\n    );\n    // Switch levels when out of retried or level index out of bounds\n    if (level) {\n      if (data.details !== ErrorDetails.FRAG_GAP) {\n        level.fragmentError++;\n      }\n      if (!isUnusableKeyError(data)) {\n        const retry = shouldRetry(\n          retryConfig,\n          fragmentErrors,\n          isTimeoutError(data),\n          data.response,\n        );\n        if (retry) {\n          return {\n            action: NetworkErrorAction.RetryRequest,\n            flags: ErrorActionFlags.None,\n            retryConfig,\n            retryCount: fragmentErrors,\n          };\n        }\n      }\n    }\n    // Reach max retry count, or Missing level reference\n    // Switch to valid index\n    const errorAction = this.getLevelSwitchAction(data, variantLevelIndex);\n    // Add retry details to allow skipping of FRAG_PARSING_ERROR\n    if (retryConfig) {\n      errorAction.retryConfig = retryConfig;\n      errorAction.retryCount = fragmentErrors;\n    }\n    return errorAction;\n  }\n\n  private getLevelSwitchAction(\n    data: ErrorData,\n    levelIndex: number | null | undefined,\n  ): IErrorAction {\n    const hls = this.hls;\n    if (levelIndex === null || levelIndex === undefined) {\n      levelIndex = hls.loadLevel;\n    }\n    const level = this.hls.levels[levelIndex];\n    if (level) {\n      const errorDetails = data.details;\n      level.loadError++;\n      if (errorDetails === ErrorDetails.BUFFER_APPEND_ERROR) {\n        level.fragmentError++;\n      }\n      // Search for next level to retry\n      let nextLevel = -1;\n      const { levels, loadLevel, minAutoLevel, maxAutoLevel } = hls;\n      if (!hls.autoLevelEnabled && !hls.config.preserveManualLevelOnError) {\n        hls.loadLevel = -1;\n      }\n      const fragErrorType = data.frag?.type;\n      // Find alternate audio codec if available on audio codec error\n      const isAudioCodecError =\n        (fragErrorType === PlaylistLevelType.AUDIO &&\n          errorDetails === ErrorDetails.FRAG_PARSING_ERROR) ||\n        (data.sourceBufferName === 'audio' &&\n          (errorDetails === ErrorDetails.BUFFER_ADD_CODEC_ERROR ||\n            errorDetails === ErrorDetails.BUFFER_APPEND_ERROR));\n      const findAudioCodecAlternate =\n        isAudioCodecError &&\n        levels.some(({ audioCodec }) => level.audioCodec !== audioCodec);\n      // Find alternate video codec if available on video codec error\n      const isVideoCodecError =\n        data.sourceBufferName === 'video' &&\n        (errorDetails === ErrorDetails.BUFFER_ADD_CODEC_ERROR ||\n          errorDetails === ErrorDetails.BUFFER_APPEND_ERROR);\n      const findVideoCodecAlternate =\n        isVideoCodecError &&\n        levels.some(\n          ({ codecSet, audioCodec }) =>\n            level.codecSet !== codecSet && level.audioCodec === audioCodec,\n        );\n      const { type: playlistErrorType, groupId: playlistErrorGroupId } =\n        data.context ?? {};\n      for (let i = levels.length; i--; ) {\n        const candidate = (i + loadLevel) % levels.length;\n        if (\n          candidate !== loadLevel &&\n          candidate >= minAutoLevel &&\n          candidate <= maxAutoLevel &&\n          levels[candidate].loadError === 0\n        ) {\n          const levelCandidate = levels[candidate];\n          // Skip level switch if GAP tag is found in next level at same position\n          if (\n            errorDetails === ErrorDetails.FRAG_GAP &&\n            fragErrorType === PlaylistLevelType.MAIN &&\n            data.frag\n          ) {\n            const levelDetails = levels[candidate].details;\n            if (levelDetails) {\n              const fragCandidate = findFragmentByPTS(\n                data.frag as MediaFragment,\n                levelDetails.fragments,\n                data.frag.start,\n              );\n              if (fragCandidate?.gap) {\n                continue;\n              }\n            }\n          } else if (\n            (playlistErrorType === PlaylistContextType.AUDIO_TRACK &&\n              levelCandidate.hasAudioGroup(playlistErrorGroupId)) ||\n            (playlistErrorType === PlaylistContextType.SUBTITLE_TRACK &&\n              levelCandidate.hasSubtitleGroup(playlistErrorGroupId))\n          ) {\n            // For audio/subs playlist errors find another group ID or fallthrough to redundant fail-over\n            continue;\n          } else if (\n            (fragErrorType === PlaylistLevelType.AUDIO &&\n              level.audioGroups?.some((groupId) =>\n                levelCandidate.hasAudioGroup(groupId),\n              )) ||\n            (fragErrorType === PlaylistLevelType.SUBTITLE &&\n              level.subtitleGroups?.some((groupId) =>\n                levelCandidate.hasSubtitleGroup(groupId),\n              )) ||\n            (findAudioCodecAlternate &&\n              level.audioCodec === levelCandidate.audioCodec) ||\n            (findVideoCodecAlternate &&\n              level.codecSet === levelCandidate.codecSet) ||\n            (!findAudioCodecAlternate &&\n              level.codecSet !== levelCandidate.codecSet)\n          ) {\n            // For video/audio/subs frag errors find another group ID or fallthrough to redundant fail-over\n            continue;\n          }\n          nextLevel = candidate;\n          break;\n        }\n      }\n      if (nextLevel > -1 && hls.loadLevel !== nextLevel) {\n        data.levelRetry = true;\n        this.playlistError = 0;\n        return {\n          action: NetworkErrorAction.SendAlternateToPenaltyBox,\n          flags: ErrorActionFlags.None,\n          nextAutoLevel: nextLevel,\n        };\n      }\n    }\n    // No levels to switch / Manual level selection / Level not found\n    // Resolve with Pathway switch, Redundant fail-over, or stay on lowest Level\n    return {\n      action: NetworkErrorAction.SendAlternateToPenaltyBox,\n      flags: ErrorActionFlags.MoveAllAlternatesMatchingHost,\n    };\n  }\n\n  public onErrorOut(event: Events.ERROR, data: ErrorData) {\n    switch (data.errorAction?.action) {\n      case NetworkErrorAction.DoNothing:\n        break;\n      case NetworkErrorAction.SendAlternateToPenaltyBox:\n        this.sendAlternateToPenaltyBox(data);\n        if (\n          !data.errorAction.resolved &&\n          data.details !== ErrorDetails.FRAG_GAP\n        ) {\n          data.fatal = true;\n        } else if (/MediaSource readyState: ended/.test(data.error.message)) {\n          this.warn(\n            `MediaSource ended after \"${data.sourceBufferName}\" sourceBuffer append error. Attempting to recover from media error.`,\n          );\n          this.hls.recoverMediaError();\n        }\n        break;\n      case NetworkErrorAction.RetryRequest:\n        // handled by stream and playlist/level controllers\n        break;\n    }\n\n    if (data.fatal) {\n      this.hls.stopLoad();\n      return;\n    }\n  }\n\n  private sendAlternateToPenaltyBox(data: ErrorData) {\n    const hls = this.hls;\n    const errorAction = data.errorAction;\n    if (!errorAction) {\n      return;\n    }\n    const { flags } = errorAction;\n    const nextAutoLevel = errorAction.nextAutoLevel;\n\n    switch (flags) {\n      case ErrorActionFlags.None:\n        this.switchLevel(data, nextAutoLevel);\n        break;\n      case ErrorActionFlags.MoveAllAlternatesMatchingHDCP: {\n        const levelIndex = this.getVariantLevelIndex(data.frag);\n        const level = hls.levels[levelIndex];\n        const restrictedHdcpLevel = (level as Level | undefined)?.attrs[\n          'HDCP-LEVEL'\n        ];\n        errorAction.hdcpLevel = restrictedHdcpLevel;\n        if (restrictedHdcpLevel === 'NONE') {\n          this.warn(`HDCP policy resticted output with HDCP-LEVEL=NONE`);\n        } else if (restrictedHdcpLevel) {\n          hls.maxHdcpLevel =\n            HdcpLevels[HdcpLevels.indexOf(restrictedHdcpLevel) - 1];\n          errorAction.resolved = true;\n          this.warn(\n            `Restricting playback to HDCP-LEVEL of \"${hls.maxHdcpLevel}\" or lower`,\n          );\n          break;\n        }\n        // Fallthrough when no HDCP-LEVEL attribute is found\n      }\n      // eslint-disable-next-line no-fallthrough\n      case ErrorActionFlags.MoveAllAlternatesMatchingKey: {\n        const levelKey = data.decryptdata;\n        if (levelKey) {\n          // Penalize all levels with key\n          const levels = this.hls.levels;\n          const levelCountWithError = levels.length;\n          for (let i = levelCountWithError; i--; ) {\n            if (this.variantHasKey(levels[i], levelKey)) {\n              this.log(\n                `Banned key found in level ${i} (${levels[i].bitrate}bps) or audio group \"${levels[i].audioGroups?.join(',')}\" (${data.frag?.type} fragment) ${arrayToHex(levelKey.keyId || [])}`,\n              );\n              levels[i].fragmentError++;\n              levels[i].loadError++;\n              this.log(`Removing level ${i} with key error (${data.error})`);\n              this.hls.removeLevel(i);\n            }\n          }\n          const frag = data.frag;\n          if (this.hls.levels.length < levelCountWithError) {\n            errorAction.resolved = true;\n          } else if (frag && frag.type !== PlaylistLevelType.MAIN) {\n            // Ignore key error for audio track with unmatched key (main session error)\n            const fragLevelKey = frag.decryptdata;\n            if (fragLevelKey && !levelKey.matches(fragLevelKey)) {\n              errorAction.resolved = true;\n            }\n          }\n        }\n        break;\n      }\n    }\n    // If not resolved by previous actions try to switch to next level\n    if (!errorAction.resolved) {\n      this.switchLevel(data, nextAutoLevel);\n    }\n  }\n\n  private switchLevel(data: ErrorData, levelIndex: number | undefined) {\n    if (levelIndex !== undefined && data.errorAction) {\n      this.warn(`switching to level ${levelIndex} after ${data.details}`);\n      this.hls.nextAutoLevel = levelIndex;\n      data.errorAction.resolved = true;\n      // Stream controller is responsible for this but won't switch on false start\n      this.hls.nextLoadLevel = this.hls.nextAutoLevel;\n      if (\n        data.details === ErrorDetails.BUFFER_ADD_CODEC_ERROR &&\n        data.mimeType &&\n        data.sourceBufferName !== 'audiovideo'\n      ) {\n        const codec = getCodecsForMimeType(data.mimeType);\n        const levels = this.hls.levels;\n        for (let i = levels.length; i--; ) {\n          if (levels[i][`${data.sourceBufferName}Codec`] === codec) {\n            this.log(\n              `Removing level ${i} for ${data.details} (\"${codec}\" not supported)`,\n            );\n            this.hls.removeLevel(i);\n          }\n        }\n      }\n    }\n  }\n}\n\nexport function createDoNothingErrorAction(resolved?: boolean): IErrorAction {\n  const errorAction: IErrorAction = {\n    action: NetworkErrorAction.DoNothing,\n    flags: ErrorActionFlags.None,\n  };\n  if (resolved) {\n    errorAction.resolved = true;\n  }\n  return errorAction;\n}\n", "import { Events } from '../events';\nimport type Hls from '../hls';\nimport type { Fragment, MediaFragment, Part } from '../loader/fragment';\nimport type { SourceBufferName } from '../types/buffer';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  BufferAppendedData,\n  FragBufferedData,\n  FragLoadedData,\n} from '../types/events';\nimport type {\n  FragmentBufferedRange,\n  FragmentEntity,\n  FragmentTimeRange,\n} from '../types/fragment-tracker';\nimport type { PlaylistLevelType } from '../types/loader';\n\nexport const enum FragmentState {\n  NOT_LOADED = 'NOT_LOADED',\n  APPENDING = 'APPENDING',\n  PARTIAL = 'PARTIAL',\n  OK = 'OK',\n}\n\nexport class FragmentTracker implements ComponentAPI {\n  private activePartLists: { [key in PlaylistLevelType]?: Part[] } =\n    Object.create(null);\n  private endListFragments: { [key in PlaylistLevelType]?: FragmentEntity } =\n    Object.create(null);\n  private fragments: Partial<Record<string, FragmentEntity>> =\n    Object.create(null);\n  private timeRanges:\n    | {\n        [key in SourceBufferName]?: TimeRanges;\n      }\n    | null = Object.create(null);\n\n  private bufferPadding: number = 0.2;\n  private hls: Hls | null;\n  private hasGaps: boolean = false;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n\n    this._registerListeners();\n  }\n\n  private _registerListeners() {\n    const { hls } = this;\n    if (hls) {\n      hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n      hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n    }\n  }\n\n  private _unregisterListeners() {\n    const { hls } = this;\n    if (hls) {\n      hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n      hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n    }\n  }\n\n  public destroy() {\n    this._unregisterListeners();\n    // @ts-ignore\n    this.hls =\n      // @ts-ignore\n      this.fragments =\n      // @ts-ignore\n      this.activePartLists =\n      // @ts-ignore\n      this.endListFragments =\n      this.timeRanges =\n        null;\n  }\n\n  /**\n   * Return a Fragment or Part with an appended range that matches the position and levelType\n   * Otherwise, return null\n   */\n  public getAppendedFrag(\n    position: number,\n    levelType: PlaylistLevelType,\n  ): MediaFragment | Part | null {\n    const activeParts = this.activePartLists[levelType];\n    if (activeParts) {\n      for (let i = activeParts.length; i--; ) {\n        const activePart = activeParts[i];\n        if (!activePart as any) {\n          break;\n        }\n        if (\n          activePart.start <= position &&\n          position <= activePart.end &&\n          activePart.loaded\n        ) {\n          return activePart;\n        }\n      }\n    }\n    return this.getBufferedFrag(position, levelType);\n  }\n\n  /**\n   * Return a buffered Fragment that matches the position and levelType.\n   * A buffered Fragment is one whose loading, parsing and appending is done (completed or \"partial\" meaning aborted).\n   * If not found any Fragment, return null\n   */\n  public getBufferedFrag(\n    position: number,\n    levelType: PlaylistLevelType,\n  ): MediaFragment | null {\n    return this.getFragAtPos(position, levelType, true);\n  }\n\n  public getFragAtPos(\n    position: number,\n    levelType: PlaylistLevelType,\n    buffered?: boolean,\n  ): MediaFragment | null {\n    const { fragments } = this;\n    const keys = Object.keys(fragments);\n    for (let i = keys.length; i--; ) {\n      const fragmentEntity = fragments[keys[i]];\n      if (\n        fragmentEntity?.body.type === levelType &&\n        (!buffered || fragmentEntity.buffered)\n      ) {\n        const frag = fragmentEntity.body;\n        if (frag.start <= position && position <= frag.end) {\n          return frag;\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Partial fragments effected by coded frame eviction will be removed\n   * The browser will unload parts of the buffer to free up memory for new buffer data\n   * Fragments will need to be reloaded when the buffer is freed up, removing partial fragments will allow them to reload(since there might be parts that are still playable)\n   */\n  public detectEvictedFragments(\n    elementaryStream: SourceBufferName,\n    timeRange: TimeRanges,\n    playlistType: PlaylistLevelType,\n    appendedPart?: Part | null,\n    removeAppending?: boolean,\n  ) {\n    if (this.timeRanges) {\n      this.timeRanges[elementaryStream] = timeRange;\n    }\n    // Check if any flagged fragments have been unloaded\n    // excluding anything newer than appendedPartSn\n    const appendedPartSn = appendedPart?.fragment.sn || -1;\n    Object.keys(this.fragments).forEach((key) => {\n      const fragmentEntity = this.fragments[key];\n      if (!fragmentEntity) {\n        return;\n      }\n      if (appendedPartSn >= fragmentEntity.body.sn) {\n        return;\n      }\n      if (\n        !fragmentEntity.buffered &&\n        (!fragmentEntity.loaded || removeAppending)\n      ) {\n        if (fragmentEntity.body.type === playlistType) {\n          this.removeFragment(fragmentEntity.body);\n        }\n        return;\n      }\n      const esData = fragmentEntity.range[elementaryStream];\n      if (!esData) {\n        return;\n      }\n      if (esData.time.length === 0) {\n        this.removeFragment(fragmentEntity.body);\n        return;\n      }\n      esData.time.some((time: FragmentTimeRange) => {\n        const isNotBuffered = !this.isTimeBuffered(\n          time.startPTS,\n          time.endPTS,\n          timeRange,\n        );\n        if (isNotBuffered) {\n          // Unregister partial fragment as it needs to load again to be reused\n          this.removeFragment(fragmentEntity.body);\n        }\n        return isNotBuffered;\n      });\n    });\n  }\n\n  /**\n   * Checks if the fragment passed in is loaded in the buffer properly\n   * Partially loaded fragments will be registered as a partial fragment\n   */\n  public detectPartialFragments(data: FragBufferedData) {\n    const timeRanges = this.timeRanges;\n    if (!timeRanges || data.frag.sn === 'initSegment') {\n      return;\n    }\n\n    const frag = data.frag as MediaFragment;\n    const fragKey = getFragmentKey(frag);\n    const fragmentEntity = this.fragments[fragKey];\n    if (!fragmentEntity || (fragmentEntity.buffered && frag.gap)) {\n      return;\n    }\n    const isFragHint = !frag.relurl;\n    Object.keys(timeRanges).forEach((elementaryStream: SourceBufferName) => {\n      const streamInfo = frag.elementaryStreams[elementaryStream];\n      if (!streamInfo) {\n        return;\n      }\n      const timeRange = timeRanges[elementaryStream] as TimeRanges;\n      const partial = isFragHint || streamInfo.partial === true;\n      fragmentEntity.range[elementaryStream] = this.getBufferedTimes(\n        frag,\n        data.part,\n        partial,\n        timeRange,\n      );\n    });\n    fragmentEntity.loaded = null;\n    if (Object.keys(fragmentEntity.range).length) {\n      this.bufferedEnd(fragmentEntity, frag);\n      if (!isPartial(fragmentEntity)) {\n        // Remove older fragment parts from lookup after frag is tracked as buffered\n        this.removeParts(frag.sn - 1, frag.type);\n      }\n    } else {\n      // remove fragment if nothing was appended\n      this.removeFragment(fragmentEntity.body);\n    }\n  }\n\n  private bufferedEnd(fragmentEntity: FragmentEntity, frag: MediaFragment) {\n    fragmentEntity.buffered = true;\n    const endList = (fragmentEntity.body.endList =\n      frag.endList || fragmentEntity.body.endList);\n    if (endList) {\n      this.endListFragments[fragmentEntity.body.type] = fragmentEntity;\n    }\n  }\n\n  private removeParts(snToKeep: number, levelType: PlaylistLevelType) {\n    const activeParts = this.activePartLists[levelType];\n    if (!activeParts) {\n      return;\n    }\n    this.activePartLists[levelType] = filterParts(\n      activeParts,\n      (part) => part.fragment.sn >= snToKeep,\n    );\n  }\n\n  public fragBuffered(frag: MediaFragment, force?: true) {\n    const fragKey = getFragmentKey(frag);\n    let fragmentEntity = this.fragments[fragKey];\n    if (!fragmentEntity && force) {\n      fragmentEntity = this.fragments[fragKey] = {\n        body: frag,\n        appendedPTS: null,\n        loaded: null,\n        buffered: false,\n        range: Object.create(null),\n      };\n      if (frag.gap) {\n        this.hasGaps = true;\n      }\n    }\n    if (fragmentEntity) {\n      fragmentEntity.loaded = null;\n      this.bufferedEnd(fragmentEntity, frag);\n    }\n  }\n\n  private getBufferedTimes(\n    fragment: Fragment,\n    part: Part | null,\n    partial: boolean,\n    timeRange: TimeRanges,\n  ): FragmentBufferedRange {\n    const buffered: FragmentBufferedRange = {\n      time: [],\n      partial,\n    };\n    const startPTS = fragment.start;\n    const endPTS = fragment.end;\n    const minEndPTS = fragment.minEndPTS || endPTS;\n    const maxStartPTS = fragment.maxStartPTS || startPTS;\n    for (let i = 0; i < timeRange.length; i++) {\n      const startTime = timeRange.start(i) - this.bufferPadding;\n      const endTime = timeRange.end(i) + this.bufferPadding;\n      if (maxStartPTS >= startTime && minEndPTS <= endTime) {\n        // Fragment is entirely contained in buffer\n        // No need to check the other timeRange times since it's completely playable\n        buffered.time.push({\n          startPTS: Math.max(startPTS, timeRange.start(i)),\n          endPTS: Math.min(endPTS, timeRange.end(i)),\n        });\n        break;\n      } else if (startPTS < endTime && endPTS > startTime) {\n        const start = Math.max(startPTS, timeRange.start(i));\n        const end = Math.min(endPTS, timeRange.end(i));\n        if (end > start) {\n          buffered.partial = true;\n          // Check for intersection with buffer\n          // Get playable sections of the fragment\n          buffered.time.push({\n            startPTS: start,\n            endPTS: end,\n          });\n        }\n      } else if (endPTS <= startTime) {\n        // No need to check the rest of the timeRange as it is in order\n        break;\n      }\n    }\n    return buffered;\n  }\n\n  /**\n   * Gets the partial fragment for a certain time\n   */\n  public getPartialFragment(time: number): MediaFragment | null {\n    let bestFragment: Fragment | null = null;\n    let timePadding: number;\n    let startTime: number;\n    let endTime: number;\n    let bestOverlap: number = 0;\n    const { bufferPadding, fragments } = this;\n    Object.keys(fragments).forEach((key) => {\n      const fragmentEntity = fragments[key];\n      if (!fragmentEntity) {\n        return;\n      }\n      if (isPartial(fragmentEntity)) {\n        startTime = fragmentEntity.body.start - bufferPadding;\n        endTime = fragmentEntity.body.end + bufferPadding;\n        if (time >= startTime && time <= endTime) {\n          // Use the fragment that has the most padding from start and end time\n          timePadding = Math.min(time - startTime, endTime - time);\n          if (bestOverlap <= timePadding) {\n            bestFragment = fragmentEntity.body;\n            bestOverlap = timePadding;\n          }\n        }\n      }\n    });\n    return bestFragment;\n  }\n\n  public isEndListAppended(type: PlaylistLevelType): boolean {\n    const lastFragmentEntity = this.endListFragments[type];\n    return (\n      lastFragmentEntity !== undefined &&\n      (lastFragmentEntity.buffered || isPartial(lastFragmentEntity))\n    );\n  }\n\n  public getState(fragment: Fragment): FragmentState {\n    const fragKey = getFragmentKey(fragment);\n    const fragmentEntity = this.fragments[fragKey];\n\n    if (fragmentEntity) {\n      if (!fragmentEntity.buffered) {\n        return FragmentState.APPENDING;\n      } else if (isPartial(fragmentEntity)) {\n        return FragmentState.PARTIAL;\n      } else {\n        return FragmentState.OK;\n      }\n    }\n\n    return FragmentState.NOT_LOADED;\n  }\n\n  private isTimeBuffered(\n    startPTS: number,\n    endPTS: number,\n    timeRange: TimeRanges,\n  ): boolean {\n    let startTime;\n    let endTime;\n    for (let i = 0; i < timeRange.length; i++) {\n      startTime = timeRange.start(i) - this.bufferPadding;\n      endTime = timeRange.end(i) + this.bufferPadding;\n      if (startPTS >= startTime && endPTS <= endTime) {\n        return true;\n      }\n\n      if (endPTS <= startTime) {\n        // No need to check the rest of the timeRange as it is in order\n        return false;\n      }\n    }\n\n    return false;\n  }\n\n  private onManifestLoading() {\n    this.removeAllFragments();\n  }\n\n  private onFragLoaded(event: Events.FRAG_LOADED, data: FragLoadedData) {\n    // don't track initsegment (for which sn is not a number)\n    // don't track frags used for bitrateTest, they're irrelevant.\n    if (data.frag.sn === 'initSegment' || data.frag.bitrateTest) {\n      return;\n    }\n\n    const frag = data.frag as MediaFragment;\n    // Fragment entity `loaded` FragLoadedData is null when loading parts\n    const loaded = data.part ? null : data;\n\n    const fragKey = getFragmentKey(frag);\n    this.fragments[fragKey] = {\n      body: frag,\n      appendedPTS: null,\n      loaded,\n      buffered: false,\n      range: Object.create(null),\n    };\n  }\n\n  private onBufferAppended(\n    event: Events.BUFFER_APPENDED,\n    data: BufferAppendedData,\n  ) {\n    const { frag, part, timeRanges, type } = data;\n    if (frag.sn === 'initSegment') {\n      return;\n    }\n    const playlistType = frag.type;\n    if (part) {\n      let activeParts = this.activePartLists[playlistType];\n      if (!activeParts) {\n        this.activePartLists[playlistType] = activeParts = [];\n      }\n      activeParts.push(part);\n    }\n    // Store the latest timeRanges loaded in the buffer\n    this.timeRanges = timeRanges;\n    const timeRange = timeRanges[type] as TimeRanges;\n    this.detectEvictedFragments(type, timeRange, playlistType, part);\n  }\n\n  private onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n    this.detectPartialFragments(data);\n  }\n\n  private hasFragment(fragment: Fragment): boolean {\n    const fragKey = getFragmentKey(fragment);\n    return !!this.fragments[fragKey];\n  }\n\n  public hasFragments(type?: PlaylistLevelType): boolean {\n    const { fragments } = this;\n    const keys = Object.keys(fragments);\n    if (!type) {\n      return keys.length > 0;\n    }\n    for (let i = keys.length; i--; ) {\n      const fragmentEntity = fragments[keys[i]];\n      if (fragmentEntity?.body.type === type) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  public hasParts(type: PlaylistLevelType): boolean {\n    return !!this.activePartLists[type]?.length;\n  }\n\n  public removeFragmentsInRange(\n    start: number,\n    end: number,\n    playlistType: PlaylistLevelType,\n    withGapOnly?: boolean,\n    unbufferedOnly?: boolean,\n  ) {\n    if (withGapOnly && !this.hasGaps) {\n      return;\n    }\n    Object.keys(this.fragments).forEach((key) => {\n      const fragmentEntity = this.fragments[key];\n      if (!fragmentEntity) {\n        return;\n      }\n      const frag = fragmentEntity.body;\n      if (frag.type !== playlistType || (withGapOnly && !frag.gap)) {\n        return;\n      }\n      if (\n        frag.start < end &&\n        frag.end > start &&\n        (fragmentEntity.buffered || unbufferedOnly)\n      ) {\n        this.removeFragment(frag);\n      }\n    });\n  }\n\n  public removeFragment(fragment: Fragment) {\n    const fragKey = getFragmentKey(fragment);\n    fragment.clearElementaryStreamInfo();\n    const activeParts = this.activePartLists[fragment.type];\n    if (activeParts) {\n      const snToRemove = fragment.sn;\n      this.activePartLists[fragment.type] = filterParts(\n        activeParts,\n        (part) => part.fragment.sn !== snToRemove,\n      );\n    }\n    delete this.fragments[fragKey];\n    if (fragment.endList) {\n      delete this.endListFragments[fragment.type];\n    }\n  }\n\n  public removeAllFragments() {\n    this.fragments = Object.create(null);\n    this.endListFragments = Object.create(null);\n    this.activePartLists = Object.create(null);\n    this.hasGaps = false;\n    const partlist = this.hls?.latestLevelDetails?.partList;\n    if (partlist) {\n      partlist.forEach((part) => part.clearElementaryStreamInfo());\n    }\n  }\n}\n\nfunction isPartial(fragmentEntity: FragmentEntity): boolean {\n  return (\n    fragmentEntity.buffered &&\n    !!(\n      fragmentEntity.body.gap ||\n      fragmentEntity.range.video?.partial ||\n      fragmentEntity.range.audio?.partial ||\n      fragmentEntity.range.audiovideo?.partial\n    )\n  );\n}\n\nfunction getFragmentKey(fragment: Fragment): string {\n  return `${fragment.type}_${fragment.level}_${fragment.sn}`;\n}\n\nfunction filterParts(partList: Part[], predicate: (part: Part) => boolean) {\n  return partList.filter((part) => {\n    const keep = predicate(part);\n    if (!keep) {\n      part.clearElementaryStreamInfo();\n    }\n    return keep;\n  });\n}\n", "export const enum DecrypterAesMode {\n  cbc = 0,\n  ctr = 1,\n}\n", "import { DecrypterAesMode } from './decrypter-aes-mode';\n\nexport default class AESCrypto {\n  private subtle: SubtleCrypto;\n  private aesIV: Uint8Array;\n  private aesMode: DecrypterAesMode;\n\n  constructor(subtle: SubtleCrypto, iv: Uint8Array, aesMode: DecrypterAesMode) {\n    this.subtle = subtle;\n    this.aesIV = iv;\n    this.aesMode = aesMode;\n  }\n\n  decrypt(data: ArrayBuffer, key: CryptoKey) {\n    switch (this.aesMode) {\n      case DecrypterAesMode.cbc:\n        return this.subtle.decrypt(\n          { name: 'AES-CBC', iv: this.aesIV },\n          key,\n          data,\n        );\n      case DecrypterAesMode.ctr:\n        return this.subtle.decrypt(\n          { name: 'AES-CTR', counter: this.aesIV, length: 64 }, //64 : NIST SP800-38A standard suggests that the counter should occupy half of the counter block\n          key,\n          data,\n        );\n      default:\n        throw new Error(`[AESCrypto] invalid aes mode ${this.aesMode}`);\n    }\n  }\n}\n", "// PKCS7\nexport function removePadding(array: Uint8Array<ArrayBuffer>) {\n  const outputBytes = array.byteLength;\n  const paddingBytes =\n    outputBytes && new DataView(array.buffer).getUint8(outputBytes - 1);\n  if (paddingBytes) {\n    return array.slice(0, outputBytes - paddingBytes);\n  }\n  return array;\n}\n\nexport default class AESDecryptor {\n  private rcon: Array<number> = [\n    0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,\n  ];\n  private subMix: Array<Uint32Array> = [\n    new Uint32Array(256),\n    new Uint32Array(256),\n    new Uint32Array(256),\n    new Uint32Array(256),\n  ];\n  private invSubMix: Array<Uint32Array> = [\n    new Uint32Array(256),\n    new Uint32Array(256),\n    new Uint32Array(256),\n    new Uint32Array(256),\n  ];\n  private sBox: Uint32Array = new Uint32Array(256);\n  private invSBox: Uint32Array = new Uint32Array(256);\n  private key: Uint32Array = new Uint32Array(0);\n\n  private ksRows: number = 0;\n  private keySize: number = 0;\n  private keySchedule!: Uint32Array;\n  private invKeySchedule!: Uint32Array;\n\n  constructor() {\n    this.initTable();\n  }\n\n  // Using view.getUint32() also swaps the byte order.\n  uint8ArrayToUint32Array_(arrayBuffer) {\n    const view = new DataView(arrayBuffer);\n    const newArray = new Uint32Array(4);\n    for (let i = 0; i < 4; i++) {\n      newArray[i] = view.getUint32(i * 4);\n    }\n\n    return newArray;\n  }\n\n  initTable() {\n    const sBox = this.sBox;\n    const invSBox = this.invSBox;\n    const subMix = this.subMix;\n    const subMix0 = subMix[0];\n    const subMix1 = subMix[1];\n    const subMix2 = subMix[2];\n    const subMix3 = subMix[3];\n    const invSubMix = this.invSubMix;\n    const invSubMix0 = invSubMix[0];\n    const invSubMix1 = invSubMix[1];\n    const invSubMix2 = invSubMix[2];\n    const invSubMix3 = invSubMix[3];\n\n    const d = new Uint32Array(256);\n    let x = 0;\n    let xi = 0;\n    let i = 0;\n    for (i = 0; i < 256; i++) {\n      if (i < 128) {\n        d[i] = i << 1;\n      } else {\n        d[i] = (i << 1) ^ 0x11b;\n      }\n    }\n\n    for (i = 0; i < 256; i++) {\n      let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n      sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n      sBox[x] = sx;\n      invSBox[sx] = x;\n\n      // Compute multiplication\n      const x2 = d[x];\n      const x4 = d[x2];\n      const x8 = d[x4];\n\n      // Compute sub/invSub bytes, mix columns tables\n      let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n      subMix0[x] = (t << 24) | (t >>> 8);\n      subMix1[x] = (t << 16) | (t >>> 16);\n      subMix2[x] = (t << 8) | (t >>> 24);\n      subMix3[x] = t;\n\n      // Compute inv sub bytes, inv mix columns tables\n      t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n      invSubMix0[sx] = (t << 24) | (t >>> 8);\n      invSubMix1[sx] = (t << 16) | (t >>> 16);\n      invSubMix2[sx] = (t << 8) | (t >>> 24);\n      invSubMix3[sx] = t;\n\n      // Compute next counter\n      if (!x) {\n        x = xi = 1;\n      } else {\n        x = x2 ^ d[d[d[x8 ^ x2]]];\n        xi ^= d[d[xi]];\n      }\n    }\n  }\n\n  expandKey(keyBuffer: ArrayBuffer) {\n    // convert keyBuffer to Uint32Array\n    const key = this.uint8ArrayToUint32Array_(keyBuffer);\n    let sameKey = true;\n    let offset = 0;\n\n    while (offset < key.length && sameKey) {\n      sameKey = key[offset] === this.key[offset];\n      offset++;\n    }\n\n    if (sameKey) {\n      return;\n    }\n\n    this.key = key;\n    const keySize = (this.keySize = key.length);\n\n    if (keySize !== 4 && keySize !== 6 && keySize !== 8) {\n      throw new Error('Invalid aes key size=' + keySize);\n    }\n\n    const ksRows = (this.ksRows = (keySize + 6 + 1) * 4);\n    let ksRow;\n    let invKsRow;\n\n    const keySchedule = (this.keySchedule = new Uint32Array(ksRows));\n    const invKeySchedule = (this.invKeySchedule = new Uint32Array(ksRows));\n    const sbox = this.sBox;\n    const rcon = this.rcon;\n\n    const invSubMix = this.invSubMix;\n    const invSubMix0 = invSubMix[0];\n    const invSubMix1 = invSubMix[1];\n    const invSubMix2 = invSubMix[2];\n    const invSubMix3 = invSubMix[3];\n\n    let prev;\n    let t;\n\n    for (ksRow = 0; ksRow < ksRows; ksRow++) {\n      if (ksRow < keySize) {\n        prev = keySchedule[ksRow] = key[ksRow];\n        continue;\n      }\n      t = prev;\n\n      if (ksRow % keySize === 0) {\n        // Rot word\n        t = (t << 8) | (t >>> 24);\n\n        // Sub word\n        t =\n          (sbox[t >>> 24] << 24) |\n          (sbox[(t >>> 16) & 0xff] << 16) |\n          (sbox[(t >>> 8) & 0xff] << 8) |\n          sbox[t & 0xff];\n\n        // Mix Rcon\n        t ^= rcon[(ksRow / keySize) | 0] << 24;\n      } else if (keySize > 6 && ksRow % keySize === 4) {\n        // Sub word\n        t =\n          (sbox[t >>> 24] << 24) |\n          (sbox[(t >>> 16) & 0xff] << 16) |\n          (sbox[(t >>> 8) & 0xff] << 8) |\n          sbox[t & 0xff];\n      }\n\n      keySchedule[ksRow] = prev = (keySchedule[ksRow - keySize] ^ t) >>> 0;\n    }\n\n    for (invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n      ksRow = ksRows - invKsRow;\n      if (invKsRow & 3) {\n        t = keySchedule[ksRow];\n      } else {\n        t = keySchedule[ksRow - 4];\n      }\n\n      if (invKsRow < 4 || ksRow <= 4) {\n        invKeySchedule[invKsRow] = t;\n      } else {\n        invKeySchedule[invKsRow] =\n          invSubMix0[sbox[t >>> 24]] ^\n          invSubMix1[sbox[(t >>> 16) & 0xff]] ^\n          invSubMix2[sbox[(t >>> 8) & 0xff]] ^\n          invSubMix3[sbox[t & 0xff]];\n      }\n\n      invKeySchedule[invKsRow] = invKeySchedule[invKsRow] >>> 0;\n    }\n  }\n\n  // Adding this as a method greatly improves performance.\n  networkToHostOrderSwap(word) {\n    return (\n      (word << 24) |\n      ((word & 0xff00) << 8) |\n      ((word & 0xff0000) >> 8) |\n      (word >>> 24)\n    );\n  }\n\n  decrypt(\n    inputArrayBuffer: ArrayBufferLike,\n    offset: number,\n    aesIV: ArrayBuffer,\n  ) {\n    const nRounds = this.keySize + 6;\n    const invKeySchedule = this.invKeySchedule;\n    const invSBOX = this.invSBox;\n\n    const invSubMix = this.invSubMix;\n    const invSubMix0 = invSubMix[0];\n    const invSubMix1 = invSubMix[1];\n    const invSubMix2 = invSubMix[2];\n    const invSubMix3 = invSubMix[3];\n\n    const initVector = this.uint8ArrayToUint32Array_(aesIV);\n    let initVector0 = initVector[0];\n    let initVector1 = initVector[1];\n    let initVector2 = initVector[2];\n    let initVector3 = initVector[3];\n\n    const inputInt32 = new Int32Array(inputArrayBuffer);\n    const outputInt32 = new Int32Array(inputInt32.length);\n\n    let t0, t1, t2, t3;\n    let s0, s1, s2, s3;\n    let inputWords0, inputWords1, inputWords2, inputWords3;\n\n    let ksRow, i;\n    const swapWord = this.networkToHostOrderSwap;\n\n    while (offset < inputInt32.length) {\n      inputWords0 = swapWord(inputInt32[offset]);\n      inputWords1 = swapWord(inputInt32[offset + 1]);\n      inputWords2 = swapWord(inputInt32[offset + 2]);\n      inputWords3 = swapWord(inputInt32[offset + 3]);\n\n      s0 = inputWords0 ^ invKeySchedule[0];\n      s1 = inputWords3 ^ invKeySchedule[1];\n      s2 = inputWords2 ^ invKeySchedule[2];\n      s3 = inputWords1 ^ invKeySchedule[3];\n\n      ksRow = 4;\n\n      // Iterate through the rounds of decryption\n      for (i = 1; i < nRounds; i++) {\n        t0 =\n          invSubMix0[s0 >>> 24] ^\n          invSubMix1[(s1 >> 16) & 0xff] ^\n          invSubMix2[(s2 >> 8) & 0xff] ^\n          invSubMix3[s3 & 0xff] ^\n          invKeySchedule[ksRow];\n        t1 =\n          invSubMix0[s1 >>> 24] ^\n          invSubMix1[(s2 >> 16) & 0xff] ^\n          invSubMix2[(s3 >> 8) & 0xff] ^\n          invSubMix3[s0 & 0xff] ^\n          invKeySchedule[ksRow + 1];\n        t2 =\n          invSubMix0[s2 >>> 24] ^\n          invSubMix1[(s3 >> 16) & 0xff] ^\n          invSubMix2[(s0 >> 8) & 0xff] ^\n          invSubMix3[s1 & 0xff] ^\n          invKeySchedule[ksRow + 2];\n        t3 =\n          invSubMix0[s3 >>> 24] ^\n          invSubMix1[(s0 >> 16) & 0xff] ^\n          invSubMix2[(s1 >> 8) & 0xff] ^\n          invSubMix3[s2 & 0xff] ^\n          invKeySchedule[ksRow + 3];\n        // Update state\n        s0 = t0;\n        s1 = t1;\n        s2 = t2;\n        s3 = t3;\n\n        ksRow = ksRow + 4;\n      }\n\n      // Shift rows, sub bytes, add round key\n      t0 =\n        (invSBOX[s0 >>> 24] << 24) ^\n        (invSBOX[(s1 >> 16) & 0xff] << 16) ^\n        (invSBOX[(s2 >> 8) & 0xff] << 8) ^\n        invSBOX[s3 & 0xff] ^\n        invKeySchedule[ksRow];\n      t1 =\n        (invSBOX[s1 >>> 24] << 24) ^\n        (invSBOX[(s2 >> 16) & 0xff] << 16) ^\n        (invSBOX[(s3 >> 8) & 0xff] << 8) ^\n        invSBOX[s0 & 0xff] ^\n        invKeySchedule[ksRow + 1];\n      t2 =\n        (invSBOX[s2 >>> 24] << 24) ^\n        (invSBOX[(s3 >> 16) & 0xff] << 16) ^\n        (invSBOX[(s0 >> 8) & 0xff] << 8) ^\n        invSBOX[s1 & 0xff] ^\n        invKeySchedule[ksRow + 2];\n      t3 =\n        (invSBOX[s3 >>> 24] << 24) ^\n        (invSBOX[(s0 >> 16) & 0xff] << 16) ^\n        (invSBOX[(s1 >> 8) & 0xff] << 8) ^\n        invSBOX[s2 & 0xff] ^\n        invKeySchedule[ksRow + 3];\n\n      // Write\n      outputInt32[offset] = swapWord(t0 ^ initVector0);\n      outputInt32[offset + 1] = swapWord(t3 ^ initVector1);\n      outputInt32[offset + 2] = swapWord(t2 ^ initVector2);\n      outputInt32[offset + 3] = swapWord(t1 ^ initVector3);\n\n      // reset initVector to last 4 unsigned int\n      initVector0 = inputWords0;\n      initVector1 = inputWords1;\n      initVector2 = inputWords2;\n      initVector3 = inputWords3;\n\n      offset = offset + 4;\n    }\n\n    return outputInt32.buffer;\n  }\n}\n", "import { DecrypterAesMode } from './decrypter-aes-mode';\n\nexport default class FastAESKey {\n  private subtle: SubtleCrypto;\n  private key: ArrayBuffer;\n  private aesMode: DecrypterAesMode;\n\n  constructor(\n    subtle: SubtleCrypto,\n    key: ArrayBuffer,\n    aesMode: DecrypterAesMode,\n  ) {\n    this.subtle = subtle;\n    this.key = key;\n    this.aesMode = aesMode;\n  }\n\n  expandKey() {\n    const subtleAlgoName = getSubtleAlgoName(this.aesMode);\n    return this.subtle.importKey(\n      'raw',\n      this.key,\n      { name: subtleAlgoName },\n      false,\n      ['encrypt', 'decrypt'],\n    );\n  }\n}\n\nfunction getSubtleAlgoName(aesMode: DecrypterAesMode) {\n  switch (aesMode) {\n    case DecrypterAesMode.cbc:\n      return 'AES-CBC';\n    case DecrypterAesMode.ctr:\n      return 'AES-CTR';\n    default:\n      throw new Error(`[FastAESKey] invalid aes mode ${aesMode}`);\n  }\n}\n", "import AESCrypto from './aes-crypto';\nimport AESDecryptor, { removePadding } from './aes-decryptor';\nimport { DecrypterAesMode } from './decrypter-aes-mode';\nimport FastAESKey from './fast-aes-key';\nimport { logger } from '../utils/logger';\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport type { HlsConfig } from '../config';\n\nconst CHUNK_SIZE = 16; // 16 bytes, 128 bits\n\nexport default class Decrypter {\n  private logEnabled: boolean = true;\n  private removePKCS7Padding: boolean;\n  private subtle: SubtleCrypto | null = null;\n  private softwareDecrypter: AESDecryptor | null = null;\n  private key: ArrayBuffer | null = null;\n  private fastAesKey: FastAESKey | null = null;\n  private remainderData: Uint8Array<ArrayBuffer> | null = null;\n  private currentIV: ArrayBuffer | null = null;\n  private currentResult: ArrayBuffer | null = null;\n  private useSoftware: boolean;\n  private enableSoftwareAES: boolean;\n\n  constructor(config: HlsConfig, { removePKCS7Padding = true } = {}) {\n    this.enableSoftwareAES = config.enableSoftwareAES;\n    this.removePKCS7Padding = removePKCS7Padding;\n    // built in decryptor expects PKCS7 padding\n    if (removePKCS7Padding) {\n      try {\n        const browserCrypto = self.crypto;\n        if (browserCrypto) {\n          this.subtle =\n            browserCrypto.subtle ||\n            ((browserCrypto as any).webkitSubtle as SubtleCrypto);\n        }\n      } catch (e) {\n        /* no-op */\n      }\n    }\n    this.useSoftware = !this.subtle;\n  }\n\n  destroy() {\n    this.subtle = null;\n    this.softwareDecrypter = null;\n    this.key = null;\n    this.fastAesKey = null;\n    this.remainderData = null;\n    this.currentIV = null;\n    this.currentResult = null;\n  }\n\n  public isSync() {\n    return this.useSoftware;\n  }\n\n  public flush(): Uint8Array<ArrayBuffer> | null {\n    const { currentResult, remainderData } = this;\n    if (!currentResult || remainderData) {\n      this.reset();\n      return null;\n    }\n    const data = new Uint8Array(currentResult);\n    this.reset();\n    if (this.removePKCS7Padding) {\n      return removePadding(data);\n    }\n    return data;\n  }\n\n  public reset() {\n    this.currentResult = null;\n    this.currentIV = null;\n    this.remainderData = null;\n    if (this.softwareDecrypter) {\n      this.softwareDecrypter = null;\n    }\n  }\n\n  public decrypt(\n    data: Uint8Array | ArrayBuffer,\n    key: ArrayBuffer,\n    iv: ArrayBuffer,\n    aesMode: DecrypterAesMode,\n  ): Promise<ArrayBuffer> {\n    if (this.useSoftware) {\n      return new Promise((resolve, reject) => {\n        const dataView = ArrayBuffer.isView(data) ? data : new Uint8Array(data);\n        this.softwareDecrypt(dataView, key, iv, aesMode);\n        const decryptResult = this.flush();\n        if (decryptResult) {\n          resolve(decryptResult.buffer);\n        } else {\n          reject(new Error('[softwareDecrypt] Failed to decrypt data'));\n        }\n      });\n    }\n    return this.webCryptoDecrypt(new Uint8Array(data), key, iv, aesMode);\n  }\n\n  // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached\n  // data is handled in the flush() call\n  public softwareDecrypt(\n    data: Uint8Array,\n    key: ArrayBuffer,\n    iv: ArrayBuffer,\n    aesMode: DecrypterAesMode,\n  ): ArrayBuffer | null {\n    const { currentIV, currentResult, remainderData } = this;\n    if (aesMode !== DecrypterAesMode.cbc || key.byteLength !== 16) {\n      logger.warn('SoftwareDecrypt: can only handle AES-128-CBC');\n      return null;\n    }\n    this.logOnce('JS AES decrypt');\n    // The output is staggered during progressive parsing - the current result is cached, and emitted on the next call\n    // This is done in order to strip PKCS7 padding, which is found at the end of each segment. We only know we've reached\n    // the end on flush(), but by that time we have already received all bytes for the segment.\n    // Progressive decryption does not work with WebCrypto\n\n    if (remainderData) {\n      data = appendUint8Array(remainderData, data);\n      this.remainderData = null;\n    }\n\n    // Byte length must be a multiple of 16 (AES-128 = 128 bit blocks = 16 bytes)\n    const currentChunk = this.getValidChunk(data);\n    if (!currentChunk.length) {\n      return null;\n    }\n\n    if (currentIV) {\n      iv = currentIV;\n    }\n\n    let softwareDecrypter = this.softwareDecrypter;\n    if (!softwareDecrypter) {\n      softwareDecrypter = this.softwareDecrypter = new AESDecryptor();\n    }\n    softwareDecrypter.expandKey(key);\n\n    const result = currentResult;\n\n    this.currentResult = softwareDecrypter.decrypt(currentChunk.buffer, 0, iv);\n    this.currentIV = currentChunk.slice(-16).buffer;\n\n    if (!result) {\n      return null;\n    }\n    return result;\n  }\n\n  public webCryptoDecrypt(\n    data: Uint8Array<ArrayBuffer>,\n    key: ArrayBuffer,\n    iv: ArrayBuffer,\n    aesMode: DecrypterAesMode,\n  ): Promise<ArrayBuffer> {\n    if (this.key !== key || !this.fastAesKey) {\n      if (!this.subtle) {\n        return Promise.resolve(this.onWebCryptoError(data, key, iv, aesMode));\n      }\n      this.key = key;\n      this.fastAesKey = new FastAESKey(this.subtle, key, aesMode);\n    }\n    return this.fastAesKey\n      .expandKey()\n      .then((aesKey: CryptoKey) => {\n        // decrypt using web crypto\n        if (!this.subtle) {\n          return Promise.reject(new Error('web crypto not initialized'));\n        }\n        this.logOnce('WebCrypto AES decrypt');\n        const crypto = new AESCrypto(this.subtle, new Uint8Array(iv), aesMode);\n        return crypto.decrypt(data.buffer, aesKey);\n      })\n      .catch((err) => {\n        logger.warn(\n          `[decrypter]: WebCrypto Error, disable WebCrypto API, ${err.name}: ${err.message}`,\n        );\n\n        return this.onWebCryptoError(data, key, iv, aesMode);\n      });\n  }\n\n  private onWebCryptoError(\n    data: Uint8Array,\n    key: ArrayBuffer,\n    iv: ArrayBuffer,\n    aesMode: DecrypterAesMode,\n  ): ArrayBuffer | never {\n    const enableSoftwareAES = this.enableSoftwareAES;\n    if (enableSoftwareAES) {\n      this.useSoftware = true;\n      this.logEnabled = true;\n      this.softwareDecrypt(data, key, iv, aesMode);\n      const decryptResult = this.flush();\n      if (decryptResult) {\n        return decryptResult.buffer;\n      }\n    }\n    throw new Error(\n      'WebCrypto' +\n        (enableSoftwareAES ? ' and softwareDecrypt' : '') +\n        ': failed to decrypt data',\n    );\n  }\n\n  private getValidChunk(data: Uint8Array): Uint8Array {\n    let currentChunk = data;\n    const splitPoint = data.length - (data.length % CHUNK_SIZE);\n    if (splitPoint !== data.length) {\n      currentChunk = data.slice(0, splitPoint);\n      this.remainderData = data.slice(splitPoint);\n    }\n    return currentChunk;\n  }\n\n  private logOnce(msg: string) {\n    if (!this.logEnabled) {\n      return;\n    }\n    logger.log(`[decrypter]: ${msg}`);\n    this.logEnabled = false;\n  }\n}\n", "import { ErrorDetails, ErrorTypes } from '../errors';\nimport { getLoaderConfigWithoutReties } from '../utils/error-helper';\nimport type { BaseSegment, Fragment, Part } from './fragment';\nimport type { HlsConfig } from '../config';\nimport type {\n  ErrorData,\n  FragLoadedData,\n  PartsLoadedData,\n} from '../types/events';\nimport type {\n  FragmentLoaderContext,\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n} from '../types/loader';\n\nconst MIN_CHUNK_SIZE = Math.pow(2, 17); // 128kb\n\nexport default class FragmentLoader {\n  private readonly config: HlsConfig;\n  private loader: Loader<FragmentLoaderContext> | null = null;\n  private partLoadTimeout: number = -1;\n\n  constructor(config: HlsConfig) {\n    this.config = config;\n  }\n\n  destroy() {\n    if (this.loader) {\n      this.loader.destroy();\n      this.loader = null;\n    }\n  }\n\n  abort() {\n    if (this.loader) {\n      // Abort the loader for current fragment. Only one may load at any given time\n      this.loader.abort();\n    }\n  }\n\n  load(\n    frag: Fragment,\n    onProgress?: FragmentLoadProgressCallback,\n  ): Promise<FragLoadedData> {\n    const url = frag.url;\n    if (!url) {\n      return Promise.reject(\n        new LoadError({\n          type: ErrorTypes.NETWORK_ERROR,\n          details: ErrorDetails.FRAG_LOAD_ERROR,\n          fatal: false,\n          frag,\n          error: new Error(\n            `Fragment does not have a ${url ? 'part list' : 'url'}`,\n          ),\n          networkDetails: null,\n        }),\n      );\n    }\n    this.abort();\n\n    const config = this.config;\n    const FragmentILoader = config.fLoader;\n    const DefaultILoader = config.loader;\n\n    return new Promise((resolve, reject) => {\n      if (this.loader) {\n        this.loader.destroy();\n      }\n      if (frag.gap) {\n        if (frag.tagList.some((tags) => tags[0] === 'GAP')) {\n          reject(createGapLoadError(frag));\n          return;\n        } else {\n          // Reset temporary treatment as GAP tag\n          frag.gap = false;\n        }\n      }\n      const loader = (this.loader = FragmentILoader\n        ? new FragmentILoader(config)\n        : (new DefaultILoader(config) as Loader<FragmentLoaderContext>));\n      const loaderContext = createLoaderContext(frag);\n      frag.loader = loader;\n      const loadPolicy = getLoaderConfigWithoutReties(\n        config.fragLoadPolicy.default,\n      );\n      const loaderConfig: LoaderConfiguration = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n        highWaterMark: frag.sn === 'initSegment' ? Infinity : MIN_CHUNK_SIZE,\n      };\n      // Assign frag stats to the loader's stats reference\n      frag.stats = loader.stats;\n      const callbacks: LoaderCallbacks<FragmentLoaderContext> = {\n        onSuccess: (response, stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          let payload = response.data as ArrayBuffer;\n          if (context.resetIV && frag.decryptdata) {\n            frag.decryptdata.iv = new Uint8Array(payload.slice(0, 16));\n            payload = payload.slice(16);\n          }\n          resolve({\n            frag,\n            part: null,\n            payload,\n            networkDetails,\n          });\n        },\n        onError: (response, context, networkDetails, stats) => {\n          this.resetLoader(frag, loader);\n          reject(\n            new LoadError({\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.FRAG_LOAD_ERROR,\n              fatal: false,\n              frag,\n              response: { url, data: undefined, ...response },\n              error: new Error(`HTTP Error ${response.code} ${response.text}`),\n              networkDetails,\n              stats,\n            }),\n          );\n        },\n        onAbort: (stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          reject(\n            new LoadError({\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.INTERNAL_ABORTED,\n              fatal: false,\n              frag,\n              error: new Error('Aborted'),\n              networkDetails,\n              stats,\n            }),\n          );\n        },\n        onTimeout: (stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          reject(\n            new LoadError({\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.FRAG_LOAD_TIMEOUT,\n              fatal: false,\n              frag,\n              error: new Error(`Timeout after ${loaderConfig.timeout}ms`),\n              networkDetails,\n              stats,\n            }),\n          );\n        },\n      };\n      if (onProgress) {\n        callbacks.onProgress = (stats, context, data, networkDetails) =>\n          onProgress({\n            frag,\n            part: null,\n            payload: data as ArrayBuffer,\n            networkDetails,\n          });\n      }\n      loader.load(loaderContext, loaderConfig, callbacks);\n    });\n  }\n\n  public loadPart(\n    frag: Fragment,\n    part: Part,\n    onProgress: FragmentLoadProgressCallback,\n  ): Promise<FragLoadedData> {\n    this.abort();\n\n    const config = this.config;\n    const FragmentILoader = config.fLoader;\n    const DefaultILoader = config.loader;\n\n    return new Promise((resolve, reject) => {\n      if (this.loader) {\n        this.loader.destroy();\n      }\n      if (frag.gap || part.gap) {\n        reject(createGapLoadError(frag, part));\n        return;\n      }\n      const loader = (this.loader = FragmentILoader\n        ? new FragmentILoader(config)\n        : (new DefaultILoader(config) as Loader<FragmentLoaderContext>));\n      const loaderContext = createLoaderContext(frag, part);\n      frag.loader = loader;\n      // Should we define another load policy for parts?\n      const loadPolicy = getLoaderConfigWithoutReties(\n        config.fragLoadPolicy.default,\n      );\n      const loaderConfig: LoaderConfiguration = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n        highWaterMark: MIN_CHUNK_SIZE,\n      };\n      // Assign part stats to the loader's stats reference\n      part.stats = loader.stats;\n      loader.load(loaderContext, loaderConfig, {\n        onSuccess: (response, stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          this.updateStatsFromPart(frag, part);\n          const partLoadedData: FragLoadedData = {\n            frag,\n            part,\n            payload: response.data as ArrayBuffer,\n            networkDetails,\n          };\n          onProgress(partLoadedData);\n          resolve(partLoadedData);\n        },\n        onError: (response, context, networkDetails, stats) => {\n          this.resetLoader(frag, loader);\n          reject(\n            new LoadError({\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.FRAG_LOAD_ERROR,\n              fatal: false,\n              frag,\n              part,\n              response: {\n                url: loaderContext.url,\n                data: undefined,\n                ...response,\n              },\n              error: new Error(`HTTP Error ${response.code} ${response.text}`),\n              networkDetails,\n              stats,\n            }),\n          );\n        },\n        onAbort: (stats, context, networkDetails) => {\n          frag.stats.aborted = part.stats.aborted;\n          this.resetLoader(frag, loader);\n          reject(\n            new LoadError({\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.INTERNAL_ABORTED,\n              fatal: false,\n              frag,\n              part,\n              error: new Error('Aborted'),\n              networkDetails,\n              stats,\n            }),\n          );\n        },\n        onTimeout: (stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          reject(\n            new LoadError({\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.FRAG_LOAD_TIMEOUT,\n              fatal: false,\n              frag,\n              part,\n              error: new Error(`Timeout after ${loaderConfig.timeout}ms`),\n              networkDetails,\n              stats,\n            }),\n          );\n        },\n      });\n    });\n  }\n\n  private updateStatsFromPart(frag: Fragment, part: Part) {\n    const fragStats = frag.stats;\n    const partStats = part.stats;\n    const partTotal = partStats.total;\n    fragStats.loaded += partStats.loaded;\n    if (partTotal) {\n      const estTotalParts = Math.round(frag.duration / part.duration);\n      const estLoadedParts = Math.min(\n        Math.round(fragStats.loaded / partTotal),\n        estTotalParts,\n      );\n      const estRemainingParts = estTotalParts - estLoadedParts;\n      const estRemainingBytes =\n        estRemainingParts * Math.round(fragStats.loaded / estLoadedParts);\n      fragStats.total = fragStats.loaded + estRemainingBytes;\n    } else {\n      fragStats.total = Math.max(fragStats.loaded, fragStats.total);\n    }\n    const fragLoading = fragStats.loading;\n    const partLoading = partStats.loading;\n    if (fragLoading.start) {\n      // add to fragment loader latency\n      fragLoading.first += partLoading.first - partLoading.start;\n    } else {\n      fragLoading.start = partLoading.start;\n      fragLoading.first = partLoading.first;\n    }\n    fragLoading.end = partLoading.end;\n  }\n\n  private resetLoader(frag: Fragment, loader: Loader<FragmentLoaderContext>) {\n    frag.loader = null;\n    if (this.loader === loader) {\n      self.clearTimeout(this.partLoadTimeout);\n      this.loader = null;\n    }\n    loader.destroy();\n  }\n}\n\nfunction createLoaderContext(\n  frag: Fragment,\n  part: Part | null = null,\n): FragmentLoaderContext {\n  const segment: BaseSegment = part || frag;\n  const loaderContext: FragmentLoaderContext = {\n    frag,\n    part,\n    responseType: 'arraybuffer',\n    url: segment.url,\n    headers: {},\n    rangeStart: 0,\n    rangeEnd: 0,\n  };\n  const start = segment.byteRangeStartOffset as number;\n  const end = segment.byteRangeEndOffset as number;\n  if (Number.isFinite(start) && Number.isFinite(end)) {\n    let byteRangeStart = start;\n    let byteRangeEnd = end;\n    if (\n      frag.sn === 'initSegment' &&\n      isMethodFullSegmentAesCbc(frag.decryptdata?.method)\n    ) {\n      // MAP segment encrypted with method 'AES-128' or 'AES-256' (cbc), when served with HTTP Range,\n      // has the unencrypted size specified in the range.\n      // Ref: https://tools.ietf.org/html/draft-pantos-hls-rfc8216bis-08#section-6.3.6\n      const fragmentLen = end - start;\n      if (fragmentLen % 16) {\n        byteRangeEnd = end + (16 - (fragmentLen % 16));\n      }\n      if (start !== 0) {\n        loaderContext.resetIV = true;\n        byteRangeStart = start - 16;\n      }\n    }\n    loaderContext.rangeStart = byteRangeStart;\n    loaderContext.rangeEnd = byteRangeEnd;\n  }\n  return loaderContext;\n}\n\nfunction createGapLoadError(frag: Fragment, part?: Part): LoadError {\n  const error = new Error(`GAP ${frag.gap ? 'tag' : 'attribute'} found`);\n  const errorData: FragLoadFailResult = {\n    type: ErrorTypes.MEDIA_ERROR,\n    details: ErrorDetails.FRAG_GAP,\n    fatal: false,\n    frag,\n    error,\n    networkDetails: null,\n  };\n  if (part) {\n    errorData.part = part;\n  }\n  (part ? part : frag).stats.aborted = true;\n  return new LoadError(errorData);\n}\n\nfunction isMethodFullSegmentAesCbc(method) {\n  return method === 'AES-128' || method === 'AES-256';\n}\n\nexport class LoadError extends Error {\n  public readonly data: FragLoadFailResult;\n  constructor(data: FragLoadFailResult) {\n    super(data.error.message);\n    this.data = data;\n  }\n}\n\nexport interface FragLoadFailResult extends ErrorData {\n  frag: Fragment;\n  part?: Part;\n  response?: {\n    data: any;\n    // error status code\n    code: number;\n    // error description\n    text: string;\n    url: string;\n  };\n  networkDetails: any;\n}\n\nexport type FragmentLoadProgressCallback = (\n  result: FragLoadedData | PartsLoadedData,\n) => void;\n", "import { type ILogger, Logger } from './utils/logger';\n\n/**\n * @ignore\n * Sub-class specialization of EventHandler base class.\n *\n * TaskLoop allows to schedule a task function being called (optionnaly repeatedly) on the main loop,\n * scheduled asynchroneously, avoiding recursive calls in the same tick.\n *\n * The task itself is implemented in `doTick`. It can be requested and called for single execution\n * using the `tick` method.\n *\n * It will be assured that the task execution method (`tick`) only gets called once per main loop \"tick\",\n * no matter how often it gets requested for execution. Execution in further ticks will be scheduled accordingly.\n *\n * If further execution requests have already been scheduled on the next tick, it can be checked with `hasNextTick`,\n * and cancelled with `clearNextTick`.\n *\n * The task can be scheduled as an interval repeatedly with a period as parameter (see `setInterval`, `clearInterval`).\n *\n * Sub-classes need to implement the `doTick` method which will effectively have the task execution routine.\n *\n * Further explanations:\n *\n * The baseclass has a `tick` method that will schedule the doTick call. It may be called synchroneously\n * only for a stack-depth of one. On re-entrant calls, sub-sequent calls are scheduled for next main loop ticks.\n *\n * When the task execution (`tick` method) is called in re-entrant way this is detected and\n * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further\n * task processing on the next main loop iteration (also known as \"next tick\" in the Node/JS runtime lingo).\n */\nexport default class TaskLoop extends Logger {\n  private readonly _boundTick: () => void;\n  private _tickTimer: number | null = null;\n  private _tickInterval: number | null = null;\n  private _tickCallCount = 0;\n\n  constructor(label: string, logger: ILogger) {\n    super(label, logger);\n    this._boundTick = this.tick.bind(this);\n  }\n\n  public destroy() {\n    this.onHandlerDestroying();\n    this.onHandlerDestroyed();\n  }\n\n  protected onHandlerDestroying() {\n    // clear all timers before unregistering from event bus\n    this.clearNextTick();\n    this.clearInterval();\n  }\n\n  protected onHandlerDestroyed() {}\n\n  public hasInterval(): boolean {\n    return !!this._tickInterval;\n  }\n\n  public hasNextTick(): boolean {\n    return !!this._tickTimer;\n  }\n\n  /**\n   * @param millis - Interval time (ms)\n   * @eturns True when interval has been scheduled, false when already scheduled (no effect)\n   */\n  public setInterval(millis: number): boolean {\n    if (!this._tickInterval) {\n      this._tickCallCount = 0;\n      this._tickInterval = self.setInterval(this._boundTick, millis);\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @returns True when interval was cleared, false when none was set (no effect)\n   */\n  public clearInterval(): boolean {\n    if (this._tickInterval) {\n      self.clearInterval(this._tickInterval);\n      this._tickInterval = null;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @returns True when timeout was cleared, false when none was set (no effect)\n   */\n  public clearNextTick(): boolean {\n    if (this._tickTimer) {\n      self.clearTimeout(this._tickTimer);\n      this._tickTimer = null;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Will call the subclass doTick implementation in this main loop tick\n   * or in the next one (via setTimeout(,0)) in case it has already been called\n   * in this tick (in case this is a re-entrant call).\n   */\n  public tick(): void {\n    this._tickCallCount++;\n    if (this._tickCallCount === 1) {\n      this.doTick();\n      // re-entrant call to tick from previous doTick call stack\n      // -> schedule a call on the next main loop iteration to process this task processing request\n      if (this._tickCallCount > 1) {\n        // make sure only one timer exists at any time at max\n        this.tickImmediate();\n      }\n      this._tickCallCount = 0;\n    }\n  }\n\n  public tickImmediate(): void {\n    this.clearNextTick();\n    this._tickTimer = self.setTimeout(this._boundTick, 0);\n  }\n\n  /**\n   * For subclass to implement task logic\n   * @abstract\n   */\n  protected doTick(): void {}\n}\n", "import type { SourceBufferName } from './buffer';\nimport type { HlsChunkPerformanceTiming } from './loader';\nimport type { RemuxerResult } from './remuxer';\n\nexport interface TransmuxerResult {\n  remuxResult: RemuxerResult;\n  chunkMeta: ChunkMetadata;\n}\n\nexport class ChunkMetadata {\n  public readonly level: number;\n  public readonly sn: number;\n  public readonly part: number;\n  public readonly id: number;\n  public readonly size: number;\n  public readonly partial: boolean;\n  public readonly transmuxing: HlsChunkPerformanceTiming =\n    getNewPerformanceTiming();\n  public readonly buffering: {\n    [key in SourceBufferName]: HlsChunkPerformanceTiming;\n  } = {\n    audio: getNewPerformanceTiming(),\n    video: getNewPerformanceTiming(),\n    audiovideo: getNewPerformanceTiming(),\n  };\n\n  constructor(\n    level: number,\n    sn: number,\n    id: number,\n    size = 0,\n    part = -1,\n    partial = false,\n  ) {\n    this.level = level;\n    this.sn = sn;\n    this.id = id;\n    this.size = size;\n    this.part = part;\n    this.partial = partial;\n  }\n}\n\nfunction getNewPerformanceTiming(): HlsChunkPerformanceTiming {\n  return { start: 0, executeStart: 0, executeEnd: 0, end: 0 };\n}\n", "/**\n * Provides methods dealing with buffer length retrieval for example.\n *\n * In general, a helper around HTML5 MediaElement TimeRanges gathered from `buffered` property.\n *\n * Also @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n */\n\nimport { logger } from './logger';\n\nexport type BufferTimeRange = {\n  start: number;\n  end: number;\n};\n\nexport type Bufferable = {\n  buffered: TimeRanges;\n};\n\nexport type BufferInfo = {\n  len: number;\n  start: number;\n  end: number;\n  nextStart?: number;\n  buffered?: BufferTimeRange[];\n  bufferedIndex: number;\n};\n\nconst noopBuffered: TimeRanges = {\n  length: 0,\n  start: () => 0,\n  end: () => 0,\n};\n\nexport class BufferHelper {\n  /**\n   * Return true if `media`'s buffered include `position`\n   */\n  static isBuffered(media: Bufferable, position: number): boolean {\n    if (media) {\n      const buffered = BufferHelper.getBuffered(media);\n      for (let i = buffered.length; i--; ) {\n        if (position >= buffered.start(i) && position <= buffered.end(i)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  static bufferedRanges(media: Bufferable | null): BufferTimeRange[] {\n    if (media) {\n      const timeRanges = BufferHelper.getBuffered(media);\n      return BufferHelper.timeRangesToArray(timeRanges);\n    }\n    return [];\n  }\n\n  static timeRangesToArray(timeRanges: TimeRanges): BufferTimeRange[] {\n    const buffered: BufferTimeRange[] = [];\n    for (let i = 0; i < timeRanges.length; i++) {\n      buffered.push({ start: timeRanges.start(i), end: timeRanges.end(i) });\n    }\n    return buffered;\n  }\n\n  static bufferInfo(\n    media: Bufferable | null,\n    pos: number,\n    maxHoleDuration: number,\n  ): BufferInfo {\n    if (media) {\n      const buffered = BufferHelper.bufferedRanges(media);\n      if (buffered.length) {\n        return BufferHelper.bufferedInfo(buffered, pos, maxHoleDuration);\n      }\n    }\n    return { len: 0, start: pos, end: pos, bufferedIndex: -1 };\n  }\n\n  static bufferedInfo(\n    buffered: BufferTimeRange[],\n    pos: number,\n    maxHoleDuration: number,\n  ): BufferInfo {\n    pos = Math.max(0, pos);\n    // sort on buffer.start/smaller end (IE does not always return sorted buffered range)\n    if (buffered.length > 1) {\n      buffered.sort((a, b) => a.start - b.start || b.end - a.end);\n    }\n\n    let bufferedIndex: number = -1;\n    let buffered2: BufferTimeRange[] = [];\n    if (maxHoleDuration) {\n      // there might be some small holes between buffer time range\n      // consider that holes smaller than maxHoleDuration are irrelevant and build another\n      // buffer time range representations that discards those holes\n      for (let i = 0; i < buffered.length; i++) {\n        if (pos >= buffered[i].start && pos <= buffered[i].end) {\n          bufferedIndex = i;\n        }\n        const buf2len = buffered2.length;\n        if (buf2len) {\n          const buf2end = buffered2[buf2len - 1].end;\n          // if small hole (value between 0 or maxHoleDuration ) or overlapping (negative)\n          if (buffered[i].start - buf2end < maxHoleDuration) {\n            // merge overlapping time ranges\n            // update lastRange.end only if smaller than item.end\n            // e.g.  [ 1, 15] with  [ 2,8] => [ 1,15] (no need to modify lastRange.end)\n            // whereas [ 1, 8] with  [ 2,15] => [ 1,15] ( lastRange should switch from [1,8] to [1,15])\n            if (buffered[i].end > buf2end) {\n              buffered2[buf2len - 1].end = buffered[i].end;\n            }\n          } else {\n            // big hole\n            buffered2.push(buffered[i]);\n          }\n        } else {\n          // first value\n          buffered2.push(buffered[i]);\n        }\n      }\n    } else {\n      buffered2 = buffered;\n    }\n\n    let bufferLen = 0;\n\n    let nextStart: number | undefined;\n\n    // bufferStart and bufferEnd are buffer boundaries around current playback position (pos)\n    let bufferStart: number = pos;\n    let bufferEnd: number = pos;\n    for (let i = 0; i < buffered2.length; i++) {\n      const start = buffered2[i].start;\n      const end = buffered2[i].end;\n      // logger.log('buf start/end:' + buffered.start(i) + '/' + buffered.end(i));\n      if (bufferedIndex === -1 && pos >= start && pos <= end) {\n        bufferedIndex = i;\n      }\n      if (pos + maxHoleDuration >= start && pos < end) {\n        // play position is inside this buffer TimeRange, retrieve end of buffer position and buffer length\n        bufferStart = start;\n        bufferEnd = end;\n        bufferLen = bufferEnd - pos;\n      } else if (pos + maxHoleDuration < start) {\n        nextStart = start;\n        break;\n      }\n    }\n    return {\n      len: bufferLen,\n      start: bufferStart || 0,\n      end: bufferEnd || 0,\n      nextStart,\n      buffered,\n      bufferedIndex,\n    };\n  }\n\n  /**\n   * Safe method to get buffered property.\n   * SourceBuffer.buffered may throw if SourceBuffer is removed from it's MediaSource\n   */\n  static getBuffered(media: Bufferable): TimeRanges {\n    try {\n      return media.buffered || noopBuffered;\n    } catch (e) {\n      logger.log('failed to get media.buffered', e);\n      return noopBuffered;\n    }\n  }\n}\n", "import type { AttrList } from './attr-list';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { ParsedMultivariantPlaylist } from '../loader/m3u8-parser';\nimport type { VariableMap } from '../types/level';\n\nconst VARIABLE_REPLACEMENT_REGEX = /\\{\\$([a-zA-Z0-9-_]+)\\}/g;\n\nexport function hasVariableReferences(str: string): boolean {\n  return VARIABLE_REPLACEMENT_REGEX.test(str);\n}\n\nexport function substituteVariables(\n  parsed: Pick<\n    ParsedMultivariantPlaylist | LevelDetails,\n    'variableList' | 'hasVariableRefs' | 'playlistParsingError'\n  >,\n  value: string,\n): string {\n  if (parsed.variableList !== null || parsed.hasVariableRefs) {\n    const variableList = parsed.variableList;\n    return value.replace(\n      VARIABLE_REPLACEMENT_REGEX,\n      (variableReference: string) => {\n        const variableName = variableReference.substring(\n          2,\n          variableReference.length - 1,\n        );\n        const variableValue = variableList?.[variableName];\n        if (variableValue === undefined) {\n          parsed.playlistParsingError ||= new Error(\n            `Missing preceding EXT-X-DEFINE tag for Variable Reference: \"${variableName}\"`,\n          );\n          return variableReference;\n        }\n        return variableValue;\n      },\n    );\n  }\n  return value;\n}\n\nexport function addVariableDefinition(\n  parsed: Pick<\n    ParsedMultivariantPlaylist | LevelDetails,\n    'variableList' | 'playlistParsingError'\n  >,\n  attr: AttrList,\n  parentUrl: string,\n) {\n  let variableList = parsed.variableList;\n  if (!variableList) {\n    parsed.variableList = variableList = {};\n  }\n  let NAME: string;\n  let VALUE;\n  if ('QUERYPARAM' in attr) {\n    NAME = attr.QUERYPARAM;\n    try {\n      const searchParams = new self.URL(parentUrl).searchParams;\n      if (searchParams.has(NAME)) {\n        VALUE = searchParams.get(NAME);\n      } else {\n        throw new Error(\n          `\"${NAME}\" does not match any query parameter in URI: \"${parentUrl}\"`,\n        );\n      }\n    } catch (error) {\n      parsed.playlistParsingError ||= new Error(\n        `EXT-X-DEFINE QUERYPARAM: ${error.message}`,\n      );\n    }\n  } else {\n    NAME = attr.NAME;\n    VALUE = attr.VALUE;\n  }\n  if (NAME in variableList) {\n    parsed.playlistParsingError ||= new Error(\n      `EXT-X-DEFINE duplicate Variable Name declarations: \"${NAME}\"`,\n    );\n  } else {\n    variableList[NAME] = VALUE || '';\n  }\n}\n\nexport function importVariableDefinition(\n  parsed: Pick<\n    ParsedMultivariantPlaylist | LevelDetails,\n    'variableList' | 'playlistParsingError'\n  >,\n  attr: AttrList,\n  sourceVariableList: VariableMap | null,\n) {\n  const IMPORT = attr.IMPORT;\n  if (sourceVariableList && IMPORT in sourceVariableList) {\n    let variableList = parsed.variableList;\n    if (!variableList) {\n      parsed.variableList = variableList = {};\n    }\n    variableList[IMPORT] = sourceVariableList[IMPORT];\n  } else {\n    parsed.playlistParsingError ||= new Error(\n      `EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: \"${IMPORT}\"`,\n    );\n  }\n}\n", "import { logger } from './logger';\nimport { substituteVariables } from './variable-substitution';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { ParsedMultivariantPlaylist } from '../loader/m3u8-parser';\n\nconst DECIMAL_RESOLUTION_REGEX = /^(\\d+)x(\\d+)$/;\nconst ATTR_LIST_REGEX = /(.+?)=(\".*?\"|.*?)(?:,|$)/g;\n\n// adapted from https://github.com/kanongil/node-m3u8parse/blob/master/attrlist.js\nexport class AttrList {\n  [key: string]: any;\n\n  constructor(\n    attrs: string | Record<string, any>,\n    parsed?: Pick<\n      ParsedMultivariantPlaylist | LevelDetails,\n      'variableList' | 'hasVariableRefs' | 'playlistParsingError'\n    >,\n  ) {\n    if (typeof attrs === 'string') {\n      attrs = AttrList.parseAttrList(attrs, parsed);\n    }\n    Object.assign(this, attrs);\n  }\n\n  get clientAttrs(): string[] {\n    return Object.keys(this).filter((attr) => attr.substring(0, 2) === 'X-');\n  }\n\n  decimalInteger(attrName: string): number {\n    const intValue = parseInt(this[attrName], 10);\n    if (intValue > Number.MAX_SAFE_INTEGER) {\n      return Infinity;\n    }\n\n    return intValue;\n  }\n\n  hexadecimalInteger(attrName: string) {\n    if (this[attrName]) {\n      let stringValue = (this[attrName] || '0x').slice(2);\n      stringValue = (stringValue.length & 1 ? '0' : '') + stringValue;\n\n      const value = new Uint8Array(stringValue.length / 2);\n      for (let i = 0; i < stringValue.length / 2; i++) {\n        value[i] = parseInt(stringValue.slice(i * 2, i * 2 + 2), 16);\n      }\n\n      return value;\n    }\n    return null;\n  }\n\n  hexadecimalIntegerAsNumber(attrName: string): number {\n    const intValue = parseInt(this[attrName], 16);\n    if (intValue > Number.MAX_SAFE_INTEGER) {\n      return Infinity;\n    }\n\n    return intValue;\n  }\n\n  decimalFloatingPoint(attrName: string): number {\n    return parseFloat(this[attrName]);\n  }\n\n  optionalFloat(attrName: string, defaultValue: number): number {\n    const value = this[attrName];\n    return value ? parseFloat(value) : defaultValue;\n  }\n\n  enumeratedString(attrName: string): string | undefined {\n    return this[attrName];\n  }\n\n  enumeratedStringList<T extends { [key: string]: boolean }>(\n    attrName: string,\n    dict: T,\n  ): { [key in keyof T]: boolean } {\n    const attrValue = this[attrName];\n    return (attrValue ? attrValue.split(/[ ,]+/) : []).reduce(\n      (result: { [key in keyof T]: boolean }, identifier: string) => {\n        result[identifier.toLowerCase() as keyof T] = true;\n        return result;\n      },\n      dict,\n    );\n  }\n\n  bool(attrName: string): boolean {\n    return this[attrName] === 'YES';\n  }\n\n  decimalResolution(attrName: string):\n    | {\n        width: number;\n        height: number;\n      }\n    | undefined {\n    const res = DECIMAL_RESOLUTION_REGEX.exec(this[attrName]);\n    if (res === null) {\n      return undefined;\n    }\n\n    return {\n      width: parseInt(res[1], 10),\n      height: parseInt(res[2], 10),\n    };\n  }\n\n  static parseAttrList(\n    input: string,\n    parsed?: Pick<\n      ParsedMultivariantPlaylist | LevelDetails,\n      'variableList' | 'hasVariableRefs' | 'playlistParsingError'\n    >,\n  ): Record<string, string> {\n    let match: RegExpExecArray | null;\n    const attrs = {};\n    const quote = '\"';\n    ATTR_LIST_REGEX.lastIndex = 0;\n    while ((match = ATTR_LIST_REGEX.exec(input)) !== null) {\n      const name = match[1].trim();\n      let value = match[2];\n      const quotedString =\n        value.indexOf(quote) === 0 &&\n        value.lastIndexOf(quote) === value.length - 1;\n      let hexadecimalSequence = false;\n      if (quotedString) {\n        value = value.slice(1, -1);\n      } else {\n        switch (name) {\n          case 'IV':\n          case 'SCTE35-CMD':\n          case 'SCTE35-IN':\n          case 'SCTE35-OUT':\n            hexadecimalSequence = true;\n        }\n      }\n      if (parsed && (quotedString || hexadecimalSequence)) {\n        if (__USE_VARIABLE_SUBSTITUTION__) {\n          value = substituteVariables(parsed, value);\n        }\n      } else if (!hexadecimalSequence && !quotedString) {\n        switch (name) {\n          case 'CLOSED-CAPTIONS':\n            if (value === 'NONE') {\n              break;\n            }\n          // falls through\n          case 'ALLOWED-CPC':\n          case 'CLASS':\n          case 'ASSOC-LANGUAGE':\n          case 'AUDIO':\n          case 'BYTERANGE':\n          case 'CHANNELS':\n          case 'CHARACTERISTICS':\n          case 'CODECS':\n          case 'DATA-ID':\n          case 'END-DATE':\n          case 'GROUP-ID':\n          case 'ID':\n          case 'IMPORT':\n          case 'INSTREAM-ID':\n          case 'KEYFORMAT':\n          case 'KEYFORMATVERSIONS':\n          case 'LANGUAGE':\n          case 'NAME':\n          case 'PATHWAY-ID':\n          case 'QUERYPARAM':\n          case 'RECENTLY-REMOVED-DATERANGES':\n          case 'SERVER-URI':\n          case 'STABLE-RENDITION-ID':\n          case 'STABLE-VARIANT-ID':\n          case 'START-DATE':\n          case 'SUBTITLES':\n          case 'SUPPLEMENTAL-CODECS':\n          case 'URI':\n          case 'VALUE':\n          case 'VIDEO':\n          case 'X-ASSET-LIST':\n          case 'X-ASSET-URI':\n            // Since we are not checking tag:attribute combination, just warn rather than ignoring attribute\n            logger.warn(`${input}: attribute ${name} is missing quotes`);\n          // continue;\n        }\n      }\n      attrs[name] = value;\n    }\n    return attrs;\n  }\n}\n", "import { AttrList } from '../utils/attr-list';\nimport { logger } from '../utils/logger';\nimport type { MediaFragmentRef } from './fragment';\n\n// Avoid exporting const enum so that these values can be inlined\nconst enum DateRangeAttribute {\n  ID = 'ID',\n  CLASS = 'CLASS',\n  CUE = 'CUE',\n  START_DATE = 'START-DATE',\n  DURATION = 'DURATION',\n  END_DATE = 'END-DATE',\n  END_ON_NEXT = 'END-ON-NEXT',\n  PLANNED_DURATION = 'PLANNED-DURATION',\n  SCTE35_OUT = 'SCTE35-OUT',\n  SCTE35_IN = 'SCTE35-IN',\n  SCTE35_CMD = 'SCTE35-CMD',\n}\n\nexport type DateRangeCue = {\n  pre: boolean;\n  post: boolean;\n  once: boolean;\n};\n\nconst CLASS_INTERSTITIAL = 'com.apple.hls.interstitial';\n\nexport function isDateRangeCueAttribute(attrName: string): boolean {\n  return (\n    attrName !== DateRangeAttribute.ID &&\n    attrName !== DateRangeAttribute.CLASS &&\n    attrName !== DateRangeAttribute.CUE &&\n    attrName !== DateRangeAttribute.START_DATE &&\n    attrName !== DateRangeAttribute.DURATION &&\n    attrName !== DateRangeAttribute.END_DATE &&\n    attrName !== DateRangeAttribute.END_ON_NEXT\n  );\n}\n\nexport function isSCTE35Attribute(attrName: string): boolean {\n  return (\n    attrName === DateRangeAttribute.SCTE35_OUT ||\n    attrName === DateRangeAttribute.SCTE35_IN ||\n    attrName === DateRangeAttribute.SCTE35_CMD\n  );\n}\n\nexport class DateRange {\n  public attr: AttrList;\n  public tagAnchor: MediaFragmentRef | null;\n  public tagOrder: number;\n  private _startDate: Date;\n  private _endDate?: Date;\n  private _dateAtEnd?: Date;\n  private _cue?: DateRangeCue;\n  private _badValueForSameId?: string;\n\n  constructor(\n    dateRangeAttr: AttrList,\n    dateRangeWithSameId?: DateRange | undefined,\n    tagCount: number = 0,\n  ) {\n    this.tagAnchor = dateRangeWithSameId?.tagAnchor || null;\n    this.tagOrder = dateRangeWithSameId?.tagOrder ?? tagCount;\n    if (dateRangeWithSameId) {\n      const previousAttr = dateRangeWithSameId.attr;\n      for (const key in previousAttr) {\n        if (\n          Object.prototype.hasOwnProperty.call(dateRangeAttr, key) &&\n          dateRangeAttr[key] !== previousAttr[key]\n        ) {\n          logger.warn(\n            `DATERANGE tag attribute: \"${key}\" does not match for tags with ID: \"${dateRangeAttr.ID}\"`,\n          );\n          this._badValueForSameId = key;\n          break;\n        }\n      }\n      // Merge DateRange tags with the same ID\n      dateRangeAttr = Object.assign(\n        new AttrList({}),\n        previousAttr,\n        dateRangeAttr,\n      );\n    }\n    this.attr = dateRangeAttr;\n    if (dateRangeWithSameId) {\n      this._startDate = dateRangeWithSameId._startDate;\n      this._cue = dateRangeWithSameId._cue;\n      this._endDate = dateRangeWithSameId._endDate;\n      this._dateAtEnd = dateRangeWithSameId._dateAtEnd;\n    } else {\n      this._startDate = new Date(dateRangeAttr[DateRangeAttribute.START_DATE]);\n    }\n    if (DateRangeAttribute.END_DATE in this.attr) {\n      const endDate =\n        dateRangeWithSameId?.endDate ||\n        new Date(this.attr[DateRangeAttribute.END_DATE]);\n      if (Number.isFinite(endDate.getTime())) {\n        this._endDate = endDate;\n      }\n    }\n  }\n\n  get id(): string {\n    return this.attr.ID;\n  }\n\n  get class(): string {\n    return this.attr.CLASS;\n  }\n\n  get cue(): DateRangeCue {\n    const _cue = this._cue;\n    if (_cue === undefined) {\n      return (this._cue = this.attr.enumeratedStringList(\n        this.attr.CUE ? 'CUE' : 'X-CUE',\n        {\n          pre: false,\n          post: false,\n          once: false,\n        },\n      ));\n    }\n    return _cue;\n  }\n\n  get startTime(): number {\n    const { tagAnchor } = this;\n    // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\n    if (tagAnchor === null || tagAnchor.programDateTime === null) {\n      logger.warn(\n        `Expected tagAnchor Fragment with PDT set for DateRange \"${this.id}\": ${tagAnchor}`,\n      );\n      return NaN;\n    }\n    return (\n      tagAnchor.start +\n      (this.startDate.getTime() - tagAnchor.programDateTime) / 1000\n    );\n  }\n\n  get startDate(): Date {\n    return this._startDate;\n  }\n\n  get endDate(): Date | null {\n    const dateAtEnd = this._endDate || this._dateAtEnd;\n    if (dateAtEnd) {\n      return dateAtEnd;\n    }\n    const duration = this.duration;\n    if (duration !== null) {\n      return (this._dateAtEnd = new Date(\n        this._startDate.getTime() + duration * 1000,\n      ));\n    }\n    return null;\n  }\n\n  get duration(): number | null {\n    if (DateRangeAttribute.DURATION in this.attr) {\n      const duration = this.attr.decimalFloatingPoint(\n        DateRangeAttribute.DURATION,\n      );\n      if (Number.isFinite(duration)) {\n        return duration;\n      }\n    } else if (this._endDate) {\n      return (this._endDate.getTime() - this._startDate.getTime()) / 1000;\n    }\n    return null;\n  }\n\n  get plannedDuration(): number | null {\n    if (DateRangeAttribute.PLANNED_DURATION in this.attr) {\n      return this.attr.decimalFloatingPoint(\n        DateRangeAttribute.PLANNED_DURATION,\n      );\n    }\n    return null;\n  }\n\n  get endOnNext(): boolean {\n    return this.attr.bool(DateRangeAttribute.END_ON_NEXT);\n  }\n\n  get isInterstitial(): boolean {\n    return this.class === CLASS_INTERSTITIAL;\n  }\n\n  get isValid(): boolean {\n    return (\n      !!this.id &&\n      !this._badValueForSameId &&\n      Number.isFinite(this.startDate.getTime()) &&\n      (this.duration === null || this.duration >= 0) &&\n      (!this.endOnNext || !!this.class) &&\n      (!this.attr.CUE ||\n        (!this.cue.pre && !this.cue.post) ||\n        this.cue.pre !== this.cue.post) &&\n      (!this.isInterstitial ||\n        'X-ASSET-URI' in this.attr ||\n        'X-ASSET-LIST' in this.attr)\n    );\n  }\n}\n", "import type { DateRange } from './date-range';\nimport type { Fragment, MediaFragment, Part } from './fragment';\nimport type { LevelKey } from './level-key';\nimport type { VariableMap } from '../types/level';\nimport type { AttrList } from '../utils/attr-list';\nimport type { KeySystemFormats } from '../utils/mediakeys-helper';\n\nconst DEFAULT_TARGET_DURATION = 10;\n\n/**\n * Object representing parsed data from an HLS Media Playlist. Found in {@link hls.js#Level.details}.\n */\nexport class LevelDetails {\n  public PTSKnown: boolean = false;\n  public alignedSliding: boolean = false;\n  public averagetargetduration?: number;\n  public endCC: number = 0;\n  public endSN: number = 0;\n  public fragments: MediaFragment[];\n  public fragmentHint?: MediaFragment;\n  public partList: Part[] | null = null;\n  public dateRanges: Record<string, DateRange | undefined>;\n  public dateRangeTagCount: number = 0;\n  public live: boolean = true;\n  public requestScheduled: number = -1;\n  public ageHeader: number = 0;\n  public advancedDateTime?: number;\n  public updated: boolean = true;\n  public advanced: boolean = true;\n  public misses: number = 0;\n  public startCC: number = 0;\n  public startSN: number = 0;\n  public startTimeOffset: number | null = null;\n  public targetduration: number = 0;\n  public totalduration: number = 0;\n  public type: string | null = null;\n  public url: string;\n  public m3u8: string = '';\n  public version: number | null = null;\n  public canBlockReload: boolean = false;\n  public canSkipUntil: number = 0;\n  public canSkipDateRanges: boolean = false;\n  public skippedSegments: number = 0;\n  public recentlyRemovedDateranges?: string[];\n  public partHoldBack: number = 0;\n  public holdBack: number = 0;\n  public partTarget: number = 0;\n  public preloadHint?: AttrList;\n  public renditionReports?: AttrList[];\n  public tuneInGoal: number = 0;\n  public deltaUpdateFailed?: boolean;\n  public driftStartTime: number = 0;\n  public driftEndTime: number = 0;\n  public driftStart: number = 0;\n  public driftEnd: number = 0;\n  public encryptedFragments: Fragment[];\n  public playlistParsingError: Error | null = null;\n  public variableList: VariableMap | null = null;\n  public hasVariableRefs = false;\n  public appliedTimelineOffset?: number;\n\n  constructor(baseUrl: string) {\n    this.fragments = [];\n    this.encryptedFragments = [];\n    this.dateRanges = {};\n    this.url = baseUrl;\n  }\n\n  reloaded(previous: LevelDetails | undefined) {\n    if (!previous) {\n      this.advanced = true;\n      this.updated = true;\n      return;\n    }\n    const partSnDiff = this.lastPartSn - previous.lastPartSn;\n    const partIndexDiff = this.lastPartIndex - previous.lastPartIndex;\n    this.updated =\n      this.endSN !== previous.endSN ||\n      !!partIndexDiff ||\n      !!partSnDiff ||\n      !this.live;\n    this.advanced =\n      this.endSN > previous.endSN ||\n      partSnDiff > 0 ||\n      (partSnDiff === 0 && partIndexDiff > 0);\n    if (this.updated || this.advanced) {\n      this.misses = Math.floor(previous.misses * 0.6);\n    } else {\n      this.misses = previous.misses + 1;\n    }\n  }\n\n  hasKey(levelKey: LevelKey): boolean {\n    return this.encryptedFragments.some((frag) => {\n      let decryptdata = frag.decryptdata;\n      if (!decryptdata) {\n        frag.setKeyFormat(levelKey.keyFormat as KeySystemFormats);\n        decryptdata = frag.decryptdata;\n      }\n      return !!decryptdata && levelKey.matches(decryptdata);\n    });\n  }\n\n  get hasProgramDateTime(): boolean {\n    if (this.fragments.length) {\n      return Number.isFinite(\n        this.fragments[this.fragments.length - 1].programDateTime,\n      );\n    }\n    return false;\n  }\n\n  get levelTargetDuration(): number {\n    return (\n      this.averagetargetduration ||\n      this.targetduration ||\n      DEFAULT_TARGET_DURATION\n    );\n  }\n\n  get drift(): number {\n    const runTime = this.driftEndTime - this.driftStartTime;\n    if (runTime > 0) {\n      const runDuration = this.driftEnd - this.driftStart;\n      return (runDuration * 1000) / runTime;\n    }\n    return 1;\n  }\n\n  get edge(): number {\n    return this.partEnd || this.fragmentEnd;\n  }\n\n  get partEnd(): number {\n    if (this.partList?.length) {\n      return this.partList[this.partList.length - 1].end;\n    }\n    return this.fragmentEnd;\n  }\n\n  get fragmentEnd(): number {\n    if (this.fragments.length) {\n      return this.fragments[this.fragments.length - 1].end;\n    }\n    return 0;\n  }\n\n  get fragmentStart(): number {\n    if (this.fragments.length) {\n      return this.fragments[0].start;\n    }\n    return 0;\n  }\n\n  get age(): number {\n    if (this.advancedDateTime) {\n      return Math.max(Date.now() - this.advancedDateTime, 0) / 1000;\n    }\n    return 0;\n  }\n\n  get lastPartIndex(): number {\n    if (this.partList?.length) {\n      return this.partList[this.partList.length - 1].index;\n    }\n    return -1;\n  }\n\n  get maxPartIndex(): number {\n    const partList = this.partList;\n    if (partList) {\n      const lastIndex = this.lastPartIndex;\n      if (lastIndex !== -1) {\n        for (let i = partList.length; i--; ) {\n          if (partList[i].index > lastIndex) {\n            return partList[i].index;\n          }\n        }\n        return lastIndex;\n      }\n    }\n    return 0;\n  }\n\n  get lastPartSn(): number {\n    if (this.partList?.length) {\n      return this.partList[this.partList.length - 1].fragment.sn;\n    }\n    return this.endSN;\n  }\n\n  get expired(): boolean {\n    if (this.live && this.age && this.misses < 3) {\n      const playlistWindowDuration = this.partEnd - this.fragmentStart;\n      return (\n        this.age >\n        Math.max(playlistWindowDuration, this.totalduration) +\n          this.levelTargetDuration\n      );\n    }\n    return false;\n  }\n}\n", "export function arrayValuesMatch(\n  a: (string | number)[] | Uint8Array,\n  b: (string | number)[] | Uint8Array,\n): boolean {\n  if (a.length === b.length) {\n    return !a.some((value: string | number, i: number) => value !== b[i]);\n  }\n  return false;\n}\n\nexport function optionalArrayValuesMatch(\n  a: (string | number)[] | Uint8Array | null | undefined,\n  b: (string | number)[] | Uint8Array | null | undefined,\n): boolean {\n  if (!a && !b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return arrayValuesMatch(a, b);\n}\n", "import { DecrypterAesMode } from '../crypt/decrypter-aes-mode';\n\nexport function isFullSegmentEncryption(method: string): boolean {\n  return (\n    method === 'AES-128' || method === 'AES-256' || method === 'AES-256-CTR'\n  );\n}\n\nexport function getAesModeFromFullSegmentMethod(\n  method: string,\n): DecrypterAesMode {\n  switch (method) {\n    case 'AES-128':\n    case 'AES-256':\n      return DecrypterAesMode.cbc;\n    case 'AES-256-CTR':\n      return DecrypterAesMode.ctr;\n    default:\n      throw new Error(`invalid full segment method ${method}`);\n  }\n}\n", "export function base64ToBase64Url(base64encodedStr: string): string {\n  return base64encodedStr\n    .replace(/\\+/g, '-')\n    .replace(/\\//g, '_')\n    .replace(/=+$/, '');\n}\n\nexport function strToBase64Encode(str: string): string {\n  return btoa(str);\n}\n\nexport function base64DecodeToStr(str: string): string {\n  return atob(str);\n}\n\nexport function base64Encode(input: Uint8Array): string {\n  return btoa(String.fromCharCode(...input));\n}\n\nexport function base64UrlEncode(input: Uint8Array): string {\n  return base64ToBase64Url(base64Encode(input));\n}\n\nexport function base64Decode(base64encodedStr: string) {\n  return Uint8Array.from(atob(base64encodedStr), (c) => c.charCodeAt(0));\n}\n", "// breaking up those two types in order to clarify what is happening in the decoding path.\ntype DecodedFrame<T> = { key: string; data: T; info?: any };\nexport type Frame = DecodedFrame<ArrayBuffer | string>;\n// http://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript/22373197\n// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt\n/* utf.js - UTF-8 <=> UTF-16 convertion\n *\n * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>\n * Version: 1.0\n * LastModified: Dec 25 1999\n * This library is free.  You can redistribute it and/or modify it.\n */\n\nexport function strToUtf8array(str: string) {\n  return Uint8Array.from(unescape(encodeURIComponent(str)), (c) =>\n    c.charCodeAt(0),\n  );\n}\n", "import { base64Decode } from './numeric-encoding-utils';\nimport { strToUtf8array } from './utf8-utils';\n\nfunction getKeyIdBytes(str: string): Uint8Array<ArrayBuffer> {\n  const keyIdbytes = strToUtf8array(str).subarray(0, 16);\n  const paddedkeyIdbytes = new Uint8Array(16);\n  paddedkeyIdbytes.set(keyIdbytes, 16 - keyIdbytes.length);\n  return paddedkeyIdbytes;\n}\n\nexport function changeEndianness(keyId: Uint8Array) {\n  const swap = function (array: Uint8Array, from: number, to: number) {\n    const cur = array[from];\n    array[from] = array[to];\n    array[to] = cur;\n  };\n\n  swap(keyId, 0, 3);\n  swap(keyId, 1, 2);\n  swap(keyId, 4, 5);\n  swap(keyId, 6, 7);\n}\n\nexport function convertDataUriToArrayBytes(\n  uri: string,\n): Uint8Array<ArrayBuffer> | null {\n  // data:[<media type][;attribute=value][;base64],<data>\n  const colonsplit = uri.split(':');\n  let keydata: Uint8Array<ArrayBuffer> | null = null;\n  if (colonsplit[0] === 'data' && colonsplit.length === 2) {\n    const semicolonsplit = colonsplit[1].split(';');\n    const commasplit = semicolonsplit[semicolonsplit.length - 1].split(',');\n    if (commasplit.length === 2) {\n      const isbase64 = commasplit[0] === 'base64';\n      const data = commasplit[1];\n      if (isbase64) {\n        semicolonsplit.splice(-1, 1); // remove from processing\n        keydata = base64Decode(data);\n      } else {\n        keydata = getKeyIdBytes(data);\n      }\n    }\n  }\n  return keydata;\n}\n", "/** returns `undefined` is `self` is missing, e.g. in node */\nexport const optionalSelf = typeof self !== 'undefined' ? self : undefined;\n", "import { optionalSelf } from './global';\nimport { changeEndianness } from './keysystem-util';\nimport { base64Decode } from './numeric-encoding-utils';\nimport type { DRMSystemOptions, EMEControllerConfig } from '../config';\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/requestMediaKeySystemAccess\n */\nexport const enum KeySystems {\n  CLEARKEY = 'org.w3.clearkey',\n  FAIRPLAY = 'com.apple.fps',\n  PLAYREADY = 'com.microsoft.playready',\n  WIDEVINE = 'com.widevine.alpha',\n}\n\n// Playlist #EXT-X-KEY KEYFORMAT values\nexport const enum KeySystemFormats {\n  CLEARKEY = 'org.w3.clearkey',\n  FAIRPLAY = 'com.apple.streamingkeydelivery',\n  PLAYREADY = 'com.microsoft.playready',\n  WIDEVINE = 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed',\n}\n\nexport function keySystemFormatToKeySystemDomain(\n  format: KeySystemFormats,\n): KeySystems | undefined {\n  switch (format) {\n    case KeySystemFormats.FAIRPLAY:\n      return KeySystems.FAIRPLAY;\n    case KeySystemFormats.PLAYREADY:\n      return KeySystems.PLAYREADY;\n    case KeySystemFormats.WIDEVINE:\n      return KeySystems.WIDEVINE;\n    case KeySystemFormats.CLEARKEY:\n      return KeySystems.CLEARKEY;\n  }\n}\n\n// System IDs for which we can extract a key ID from \"encrypted\" event PSSH\nexport const enum KeySystemIds {\n  CENC = '1077efecc0b24d02ace33c1e52e2fb4b',\n  CLEARKEY = 'e2719d58a985b3c9781ab030af78d30e',\n  FAIRPLAY = '94ce86fb07ff4f43adb893d2fa968ca2',\n  PLAYREADY = '9a04f07998404286ab92e65be0885f95',\n  WIDEVINE = 'edef8ba979d64acea3c827dcd51d21ed',\n}\n\nexport function keySystemIdToKeySystemDomain(\n  systemId: KeySystemIds,\n): KeySystems | undefined {\n  if (systemId === KeySystemIds.WIDEVINE) {\n    return KeySystems.WIDEVINE;\n  } else if (systemId === KeySystemIds.PLAYREADY) {\n    return KeySystems.PLAYREADY;\n  } else if (\n    systemId === KeySystemIds.CENC ||\n    systemId === KeySystemIds.CLEARKEY\n  ) {\n    return KeySystems.CLEARKEY;\n  }\n}\n\nexport function keySystemDomainToKeySystemFormat(\n  keySystem: KeySystems,\n): KeySystemFormats | undefined {\n  switch (keySystem) {\n    case KeySystems.FAIRPLAY:\n      return KeySystemFormats.FAIRPLAY;\n    case KeySystems.PLAYREADY:\n      return KeySystemFormats.PLAYREADY;\n    case KeySystems.WIDEVINE:\n      return KeySystemFormats.WIDEVINE;\n    case KeySystems.CLEARKEY:\n      return KeySystemFormats.CLEARKEY;\n  }\n}\n\nexport function getKeySystemsForConfig(\n  config: EMEControllerConfig,\n): KeySystems[] {\n  const { drmSystems, widevineLicenseUrl } = config;\n  const keySystemsToAttempt: KeySystems[] = drmSystems\n    ? [\n        KeySystems.FAIRPLAY,\n        KeySystems.WIDEVINE,\n        KeySystems.PLAYREADY,\n        KeySystems.CLEARKEY,\n      ].filter((keySystem) => !!drmSystems[keySystem])\n    : [];\n  if (!keySystemsToAttempt[KeySystems.WIDEVINE] && widevineLicenseUrl) {\n    keySystemsToAttempt.push(KeySystems.WIDEVINE);\n  }\n  return keySystemsToAttempt;\n}\n\nexport type MediaKeyFunc = (\n  keySystem: KeySystems,\n  supportedConfigurations: MediaKeySystemConfiguration[],\n) => Promise<MediaKeySystemAccess>;\n\nexport const requestMediaKeySystemAccess = (function (): MediaKeyFunc | null {\n  if (optionalSelf?.navigator?.requestMediaKeySystemAccess) {\n    return self.navigator.requestMediaKeySystemAccess.bind(self.navigator);\n  } else {\n    return null;\n  }\n})();\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemConfiguration\n */\nexport function getSupportedMediaKeySystemConfigurations(\n  keySystem: KeySystems,\n  audioCodecs: string[],\n  videoCodecs: string[],\n  drmSystemOptions: DRMSystemOptions,\n): MediaKeySystemConfiguration[] {\n  let initDataTypes: string[];\n  switch (keySystem) {\n    case KeySystems.FAIRPLAY:\n      initDataTypes = ['cenc', 'sinf'];\n      break;\n    case KeySystems.WIDEVINE:\n    case KeySystems.PLAYREADY:\n      initDataTypes = ['cenc'];\n      break;\n    case KeySystems.CLEARKEY:\n      initDataTypes = ['cenc', 'keyids'];\n      break;\n    default:\n      throw new Error(`Unknown key-system: ${keySystem}`);\n  }\n  return createMediaKeySystemConfigurations(\n    initDataTypes,\n    audioCodecs,\n    videoCodecs,\n    drmSystemOptions,\n  );\n}\n\nfunction createMediaKeySystemConfigurations(\n  initDataTypes: string[],\n  audioCodecs: string[],\n  videoCodecs: string[],\n  drmSystemOptions: DRMSystemOptions,\n): MediaKeySystemConfiguration[] {\n  const baseConfig: MediaKeySystemConfiguration = {\n    initDataTypes: initDataTypes,\n    persistentState: drmSystemOptions.persistentState || 'optional',\n    distinctiveIdentifier: drmSystemOptions.distinctiveIdentifier || 'optional',\n    sessionTypes: drmSystemOptions.sessionTypes || [\n      drmSystemOptions.sessionType || 'temporary',\n    ],\n    audioCapabilities: audioCodecs.map((codec) => ({\n      contentType: `audio/mp4; codecs=${codec}`,\n      robustness: drmSystemOptions.audioRobustness || '',\n      encryptionScheme: drmSystemOptions.audioEncryptionScheme || null,\n    })),\n    videoCapabilities: videoCodecs.map((codec) => ({\n      contentType: `video/mp4; codecs=${codec}`,\n      robustness: drmSystemOptions.videoRobustness || '',\n      encryptionScheme: drmSystemOptions.videoEncryptionScheme || null,\n    })),\n  };\n\n  return [baseConfig];\n}\n\nexport function isPersistentSessionType(\n  drmSystemOptions: DRMSystemOptions | undefined,\n): boolean {\n  return (\n    !!drmSystemOptions &&\n    (drmSystemOptions.sessionType === 'persistent-license' ||\n      !!drmSystemOptions.sessionTypes?.some(\n        (type) => type === 'persistent-license',\n      ))\n  );\n}\n\nexport function parsePlayReadyWRM(keyBytes: Uint8Array<ArrayBuffer>) {\n  const keyBytesUtf16 = new Uint16Array(\n    keyBytes.buffer,\n    keyBytes.byteOffset,\n    keyBytes.byteLength / 2,\n  );\n  const keyByteStr = String.fromCharCode.apply(null, Array.from(keyBytesUtf16));\n\n  // Parse Playready WRMHeader XML\n  const xmlKeyBytes = keyByteStr.substring(\n    keyByteStr.indexOf('<'),\n    keyByteStr.length,\n  );\n  const parser = new DOMParser();\n  const xmlDoc = parser.parseFromString(xmlKeyBytes, 'text/xml');\n  const keyData = xmlDoc.getElementsByTagName('KID')[0];\n  if (keyData) {\n    const keyId = keyData.childNodes[0]\n      ? keyData.childNodes[0].nodeValue\n      : keyData.getAttribute('VALUE');\n    if (keyId) {\n      const keyIdArray = base64Decode(keyId).subarray(0, 16);\n      // KID value in PRO is a base64-encoded little endian GUID interpretation of UUID\n      // KID value in ‘tenc’ is a big endian UUID GUID interpretation of UUID\n      changeEndianness(keyIdArray);\n      return keyIdArray;\n    }\n  }\n  return null;\n}\n", "import { arrayValuesMatch, optionalArrayValuesMatch } from '../utils/arrays';\nimport { isFullSegmentEncryption } from '../utils/encryption-methods-util';\nimport { hexToArrayBuffer } from '../utils/hex';\nimport { convertDataUriToArrayBytes } from '../utils/keysystem-util';\nimport { logger } from '../utils/logger';\nimport { KeySystemFormats, parsePlayReadyWRM } from '../utils/mediakeys-helper';\nimport { mp4pssh, parseMultiPssh } from '../utils/mp4-tools';\n\nlet keyUriToKeyIdMap: { [uri: string]: Uint8Array<ArrayBuffer> } = {};\n\nexport interface DecryptData {\n  uri: string;\n  method: string;\n  keyFormat: string;\n  keyFormatVersions: number[];\n  iv: Uint8Array<ArrayBuffer> | null;\n  key: Uint8Array<ArrayBuffer> | null;\n  keyId: Uint8Array<ArrayBuffer> | null;\n  pssh: Uint8Array<ArrayBuffer> | null;\n  encrypted: boolean;\n  isCommonEncryption: boolean;\n}\n\nexport class LevelKey implements DecryptData {\n  public readonly uri: string;\n  public readonly method: string;\n  public readonly keyFormat: string;\n  public readonly keyFormatVersions: number[];\n  public readonly encrypted: boolean;\n  public readonly isCommonEncryption: boolean;\n  public iv: Uint8Array<ArrayBuffer> | null = null;\n  public key: Uint8Array<ArrayBuffer> | null = null;\n  public keyId: Uint8Array<ArrayBuffer> | null = null;\n  public pssh: Uint8Array<ArrayBuffer> | null = null;\n\n  static clearKeyUriToKeyIdMap() {\n    keyUriToKeyIdMap = {};\n  }\n\n  static setKeyIdForUri(uri: string, keyId: Uint8Array<ArrayBuffer>) {\n    keyUriToKeyIdMap[uri] = keyId;\n  }\n\n  static addKeyIdForUri(uri: string): Uint8Array<ArrayBuffer> {\n    const val = Object.keys(keyUriToKeyIdMap).length % Number.MAX_SAFE_INTEGER;\n    const keyId = new Uint8Array(16);\n    const dv = new DataView(keyId.buffer, 12, 4); // Just set the last 4 bytes\n    dv.setUint32(0, val);\n    keyUriToKeyIdMap[uri] = keyId;\n    return keyId;\n  }\n\n  constructor(\n    method: string,\n    uri: string,\n    format: string,\n    formatversions: number[] = [1],\n    iv: Uint8Array<ArrayBuffer> | null = null,\n    keyId?: string,\n  ) {\n    this.method = method;\n    this.uri = uri;\n    this.keyFormat = format;\n    this.keyFormatVersions = formatversions;\n    this.iv = iv;\n    this.encrypted = method ? method !== 'NONE' : false;\n    this.isCommonEncryption =\n      this.encrypted && !isFullSegmentEncryption(method);\n    if (keyId?.startsWith('0x')) {\n      this.keyId = new Uint8Array(hexToArrayBuffer(keyId));\n    }\n  }\n\n  public matches(key: LevelKey): boolean {\n    return (\n      key.uri === this.uri &&\n      key.method === this.method &&\n      key.encrypted === this.encrypted &&\n      key.keyFormat === this.keyFormat &&\n      arrayValuesMatch(key.keyFormatVersions, this.keyFormatVersions) &&\n      optionalArrayValuesMatch(key.iv, this.iv) &&\n      optionalArrayValuesMatch(key.keyId, this.keyId)\n    );\n  }\n\n  public isSupported(): boolean {\n    // If it's Segment encryption or No encryption, just select that key system\n    if (this.method) {\n      if (isFullSegmentEncryption(this.method) || this.method === 'NONE') {\n        return true;\n      }\n      if (this.keyFormat === 'identity') {\n        // Maintain support for clear SAMPLE-AES with MPEG-3 TS\n        return this.method === 'SAMPLE-AES';\n      } else if (__USE_EME_DRM__) {\n        switch (this.keyFormat) {\n          case KeySystemFormats.FAIRPLAY:\n          case KeySystemFormats.WIDEVINE:\n          case KeySystemFormats.PLAYREADY:\n          case KeySystemFormats.CLEARKEY:\n            return (\n              ['SAMPLE-AES', 'SAMPLE-AES-CENC', 'SAMPLE-AES-CTR'].indexOf(\n                this.method,\n              ) !== -1\n            );\n        }\n      }\n    }\n    return false;\n  }\n\n  public getDecryptData(\n    sn: number | 'initSegment',\n    levelKeys?: { [key: string]: LevelKey | undefined },\n  ): LevelKey | null {\n    if (!this.encrypted || !this.uri) {\n      return null;\n    }\n\n    if (isFullSegmentEncryption(this.method)) {\n      let iv = this.iv;\n      if (!iv) {\n        if (typeof sn !== 'number') {\n          // We are fetching decryption data for a initialization segment\n          // If the segment was encrypted with AES-128/256\n          // It must have an IV defined. We cannot substitute the Segment Number in.\n          logger.warn(\n            `missing IV for initialization segment with method=\"${this.method}\" - compliance issue`,\n          );\n\n          // Explicitly set sn to resulting value from implicit conversions 'initSegment' values for IV generation.\n          sn = 0;\n        }\n        iv = createInitializationVector(sn);\n      }\n      const decryptdata = new LevelKey(\n        this.method,\n        this.uri,\n        'identity',\n        this.keyFormatVersions,\n        iv,\n      );\n      return decryptdata;\n    }\n\n    if (!__USE_EME_DRM__) {\n      return this;\n    }\n\n    if (this.keyId) {\n      // Handle case where key id is changed in KEY_LOADING event handler #7542#issuecomment-3305203929\n      const assignedKeyId = keyUriToKeyIdMap[this.uri];\n      if (assignedKeyId && !arrayValuesMatch(this.keyId, assignedKeyId)) {\n        LevelKey.setKeyIdForUri(this.uri, this.keyId);\n      }\n\n      if (this.pssh) {\n        return this;\n      }\n    }\n\n    // Key bytes are signalled the KEYID attribute, typically only found on WideVine KEY tags\n    // Initialize keyId if possible\n    const keyBytes = convertDataUriToArrayBytes(this.uri);\n    if (keyBytes) {\n      switch (this.keyFormat) {\n        case KeySystemFormats.WIDEVINE:\n          // Setting `pssh` on this LevelKey/DecryptData allows HLS.js to generate a session using\n          // the playlist-key before the \"encrypted\" event. (Comment out to only use \"encrypted\" path.)\n          this.pssh = keyBytes;\n          // In case of Widevine, if KEYID is not in the playlist, assume only two fields in the pssh KEY tag URI.\n          if (!this.keyId) {\n            const results = parseMultiPssh(keyBytes.buffer);\n            if (results.length) {\n              const psshData = results[0];\n              this.keyId = psshData.kids?.length ? psshData.kids[0] : null;\n            }\n          }\n          if (!this.keyId) {\n            this.keyId = getKeyIdFromPlayReadyKey(levelKeys);\n          }\n          break;\n        case KeySystemFormats.PLAYREADY: {\n          const PlayReadyKeySystemUUID = new Uint8Array([\n            0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86, 0xab, 0x92, 0xe6,\n            0x5b, 0xe0, 0x88, 0x5f, 0x95,\n          ]);\n\n          // Setting `pssh` on this LevelKey/DecryptData allows HLS.js to generate a session using\n          // the playlist-key before the \"encrypted\" event. (Comment out to only use \"encrypted\" path.)\n          this.pssh = mp4pssh(PlayReadyKeySystemUUID, null, keyBytes);\n\n          this.keyId = parsePlayReadyWRM(keyBytes);\n\n          break;\n        }\n        default: {\n          let keydata = keyBytes.subarray(0, 16);\n          if (keydata.length !== 16) {\n            const padded = new Uint8Array(16);\n            padded.set(keydata, 16 - keydata.length);\n            keydata = padded;\n          }\n          this.keyId = keydata;\n          break;\n        }\n      }\n    }\n\n    // Default behavior: get keyId from other KEY tag or URI lookup\n    if (!this.keyId || this.keyId.byteLength !== 16) {\n      let keyId: Uint8Array<ArrayBuffer> | null | undefined;\n      keyId = getKeyIdFromWidevineKey(levelKeys);\n      if (!keyId) {\n        keyId = getKeyIdFromPlayReadyKey(levelKeys);\n        if (!keyId) {\n          keyId = keyUriToKeyIdMap[this.uri];\n        }\n      }\n      if (keyId) {\n        this.keyId = keyId;\n        LevelKey.setKeyIdForUri(this.uri, keyId);\n      }\n    }\n\n    return this;\n  }\n}\n\nfunction getKeyIdFromWidevineKey(\n  levelKeys: { [key: string]: LevelKey | undefined } | undefined,\n) {\n  const widevineKey = levelKeys?.[KeySystemFormats.WIDEVINE];\n  if (widevineKey) {\n    return widevineKey.keyId;\n  }\n  return null;\n}\n\nfunction getKeyIdFromPlayReadyKey(\n  levelKeys: { [key: string]: LevelKey | undefined } | undefined,\n) {\n  const playReadyKey = levelKeys?.[KeySystemFormats.PLAYREADY];\n  if (playReadyKey) {\n    const playReadyKeyBytes = convertDataUriToArrayBytes(playReadyKey.uri);\n    if (playReadyKeyBytes) {\n      return parsePlayReadyWRM(playReadyKeyBytes);\n    }\n  }\n  return null;\n}\n\nfunction createInitializationVector(segmentNumber: number) {\n  const uint8View = new Uint8Array(16);\n  for (let i = 12; i < 16; i++) {\n    uint8View[i] = (segmentNumber >> (8 * (15 - i))) & 0xff;\n  }\n  return uint8View;\n}\n", "import { buildAbsoluteURL } from 'url-toolkit';\nimport { DateRange } from './date-range';\nimport { Fragment, Part } from './fragment';\nimport { LevelDetails } from './level-details';\nimport { LevelKey } from './level-key';\nimport { AttrList } from '../utils/attr-list';\nimport { isCodecType } from '../utils/codecs';\nimport { logger } from '../utils/logger';\nimport {\n  addVariableDefinition,\n  hasVariableReferences,\n  importVariableDefinition,\n  substituteVariables,\n} from '../utils/variable-substitution';\nimport type { MediaFragment } from './fragment';\nimport type { ContentSteeringOptions } from '../types/events';\nimport type {\n  CodecsParsed,\n  LevelAttributes,\n  LevelParsed,\n  VariableMap,\n} from '../types/level';\nimport type { PlaylistLevelType } from '../types/loader';\nimport type { MediaAttributes, MediaPlaylist } from '../types/media-playlist';\nimport type { CodecType } from '../utils/codecs';\n\ntype M3U8ParserFragments = Array<Fragment | null>;\n\nexport type ParsedMultivariantPlaylist = {\n  contentSteering: ContentSteeringOptions | null;\n  levels: LevelParsed[];\n  playlistParsingError: Error | null;\n  sessionData: Record<string, AttrList> | null;\n  sessionKeys: LevelKey[] | null;\n  startTimeOffset: number | null;\n  variableList: VariableMap | null;\n  hasVariableRefs: boolean;\n};\n\ntype ParsedMultivariantMediaOptions = {\n  AUDIO?: MediaPlaylist[];\n  SUBTITLES?: MediaPlaylist[];\n  'CLOSED-CAPTIONS'?: MediaPlaylist[];\n};\n\ntype LevelKeys = { [key: string]: LevelKey | undefined };\n\nconst MASTER_PLAYLIST_REGEX =\n  /#EXT-X-STREAM-INF:([^\\r\\n]*)(?:[\\r\\n](?:#[^\\r\\n]*)?)*([^\\r\\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\\r\\n]*)[\\r\\n]+/g;\nconst MASTER_PLAYLIST_MEDIA_REGEX = /#EXT-X-MEDIA:(.*)/g;\n\nconst IS_MEDIA_PLAYLIST = /^#EXT(?:INF|-X-TARGETDURATION):/m; // Handle empty Media Playlist (first EXTINF not signaled, but TARGETDURATION present)\n\nconst LEVEL_PLAYLIST_REGEX_FAST = new RegExp(\n  [\n    /#EXTINF:\\s*(\\d*(?:\\.\\d+)?)(?:,(.*)\\s+)?/.source, // duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title\n    /(?!#) *(\\S[^\\r\\n]*)/.source, // segment URI, group 3 => the URI (note newline is not eaten)\n    /#.*/.source, // All other non-segment oriented tags will match with all groups empty\n  ].join('|'),\n  'g',\n);\n\nconst LEVEL_PLAYLIST_REGEX_SLOW = new RegExp(\n  [\n    /#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/\n      .source,\n    /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\\d+)/\n      .source,\n    /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source,\n    /(#)([^:]*):(.*)/.source,\n    /(#)(.*)(?:.*)\\r?\\n?/.source,\n  ].join('|'),\n);\n\nexport default class M3U8Parser {\n  static findGroup(\n    groups: (\n      | { id?: string; audioCodec?: string }\n      | { id?: string; textCodec?: string }\n    )[],\n    mediaGroupId: string,\n  ):\n    | { id?: string; audioCodec?: string }\n    | { id?: string; textCodec?: string }\n    | undefined {\n    for (let i = 0; i < groups.length; i++) {\n      const group = groups[i];\n      if (group.id === mediaGroupId) {\n        return group;\n      }\n    }\n  }\n\n  static resolve(url, baseUrl) {\n    return buildAbsoluteURL(baseUrl, url, { alwaysNormalize: true });\n  }\n\n  static isMediaPlaylist(str: string): boolean {\n    return IS_MEDIA_PLAYLIST.test(str);\n  }\n\n  static parseMasterPlaylist(\n    string: string,\n    baseurl: string,\n  ): ParsedMultivariantPlaylist {\n    const hasVariableRefs = __USE_VARIABLE_SUBSTITUTION__\n      ? hasVariableReferences(string)\n      : false;\n    const parsed: ParsedMultivariantPlaylist = {\n      contentSteering: null,\n      levels: [],\n      playlistParsingError: null,\n      sessionData: null,\n      sessionKeys: null,\n      startTimeOffset: null,\n      variableList: null,\n      hasVariableRefs,\n    };\n    const levelsWithKnownCodecs: LevelParsed[] = [];\n\n    MASTER_PLAYLIST_REGEX.lastIndex = 0;\n    if (!string.startsWith('#EXTM3U')) {\n      parsed.playlistParsingError = new Error('no EXTM3U delimiter');\n      return parsed;\n    }\n    let result: RegExpExecArray | null;\n    while ((result = MASTER_PLAYLIST_REGEX.exec(string)) != null) {\n      if (result[1]) {\n        // '#EXT-X-STREAM-INF' is found, parse level tag  in group 1\n        const attrs = new AttrList(result[1], parsed) as LevelAttributes;\n        const uri = __USE_VARIABLE_SUBSTITUTION__\n          ? substituteVariables(parsed, result[2])\n          : result[2];\n        const level: LevelParsed = {\n          attrs,\n          bitrate:\n            attrs.decimalInteger('BANDWIDTH') ||\n            attrs.decimalInteger('AVERAGE-BANDWIDTH'),\n          name: attrs.NAME,\n          url: M3U8Parser.resolve(uri, baseurl),\n        };\n\n        const resolution = attrs.decimalResolution('RESOLUTION');\n        if (resolution) {\n          level.width = resolution.width;\n          level.height = resolution.height;\n        }\n\n        setCodecs(attrs.CODECS, level);\n        const supplementalCodecs = attrs['SUPPLEMENTAL-CODECS'];\n        if (supplementalCodecs) {\n          level.supplemental = {};\n          setCodecs(supplementalCodecs, level.supplemental);\n        }\n\n        if (!level.unknownCodecs?.length) {\n          levelsWithKnownCodecs.push(level);\n        }\n\n        parsed.levels.push(level);\n      } else if (result[3]) {\n        const tag = result[3];\n        const attributes = result[4];\n        switch (tag) {\n          case 'SESSION-DATA': {\n            // #EXT-X-SESSION-DATA\n            const sessionAttrs = new AttrList(attributes, parsed);\n            const dataId = sessionAttrs['DATA-ID'];\n            if (dataId) {\n              if (parsed.sessionData === null) {\n                parsed.sessionData = {};\n              }\n              parsed.sessionData[dataId] = sessionAttrs;\n            }\n            break;\n          }\n          case 'SESSION-KEY': {\n            // #EXT-X-SESSION-KEY\n            const sessionKey = parseKey(attributes, baseurl, parsed);\n            if (sessionKey.encrypted && sessionKey.isSupported()) {\n              if (parsed.sessionKeys === null) {\n                parsed.sessionKeys = [];\n              }\n              parsed.sessionKeys.push(sessionKey);\n            } else {\n              logger.warn(\n                `[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: \"${attributes}\"`,\n              );\n            }\n            break;\n          }\n          case 'DEFINE': {\n            // #EXT-X-DEFINE\n            if (__USE_VARIABLE_SUBSTITUTION__) {\n              const variableAttributes = new AttrList(attributes, parsed);\n              addVariableDefinition(parsed, variableAttributes, baseurl);\n            }\n            break;\n          }\n          case 'CONTENT-STEERING': {\n            // #EXT-X-CONTENT-STEERING\n            const contentSteeringAttributes = new AttrList(attributes, parsed);\n            parsed.contentSteering = {\n              uri: M3U8Parser.resolve(\n                contentSteeringAttributes['SERVER-URI'],\n                baseurl,\n              ),\n              pathwayId: contentSteeringAttributes['PATHWAY-ID'] || '.',\n            };\n            break;\n          }\n          case 'START': {\n            // #EXT-X-START\n            parsed.startTimeOffset = parseStartTimeOffset(attributes);\n            break;\n          }\n          default:\n            break;\n        }\n      }\n    }\n    // Filter out levels with unknown codecs if it does not remove all levels\n    const stripUnknownCodecLevels =\n      levelsWithKnownCodecs.length > 0 &&\n      levelsWithKnownCodecs.length < parsed.levels.length;\n\n    parsed.levels = stripUnknownCodecLevels\n      ? levelsWithKnownCodecs\n      : parsed.levels;\n    if (parsed.levels.length === 0) {\n      parsed.playlistParsingError = new Error('no levels found in manifest');\n    }\n\n    return parsed;\n  }\n\n  static parseMasterPlaylistMedia(\n    string: string,\n    baseurl: string,\n    parsed: ParsedMultivariantPlaylist,\n  ): ParsedMultivariantMediaOptions {\n    let result: RegExpExecArray | null;\n    const results: ParsedMultivariantMediaOptions = {};\n    const levels = parsed.levels;\n    const groupsByType = {\n      AUDIO: levels.map((level: LevelParsed) => ({\n        id: level.attrs.AUDIO,\n        audioCodec: level.audioCodec,\n      })),\n      SUBTITLES: levels.map((level: LevelParsed) => ({\n        id: level.attrs.SUBTITLES,\n        textCodec: level.textCodec,\n      })),\n      'CLOSED-CAPTIONS': [],\n    };\n    let id = 0;\n    MASTER_PLAYLIST_MEDIA_REGEX.lastIndex = 0;\n    while ((result = MASTER_PLAYLIST_MEDIA_REGEX.exec(string)) !== null) {\n      const attrs = new AttrList(result[1], parsed) as MediaAttributes;\n      const type = attrs.TYPE;\n      if (type) {\n        const groups:\n          | (typeof groupsByType)[keyof typeof groupsByType]\n          | undefined = groupsByType[type];\n        const medias: MediaPlaylist[] = results[type] || [];\n        results[type] = medias;\n        const lang = attrs.LANGUAGE;\n        const assocLang = attrs['ASSOC-LANGUAGE'];\n        const channels = attrs.CHANNELS;\n        const characteristics = attrs.CHARACTERISTICS;\n        const instreamId = attrs['INSTREAM-ID'];\n        const media: MediaPlaylist = {\n          attrs,\n          bitrate: 0,\n          id: id++,\n          groupId: attrs['GROUP-ID'] || '',\n          name: attrs.NAME || lang || '',\n          type,\n          default: attrs.bool('DEFAULT'),\n          autoselect: attrs.bool('AUTOSELECT'),\n          forced: attrs.bool('FORCED'),\n          lang,\n          url: attrs.URI ? M3U8Parser.resolve(attrs.URI, baseurl) : '',\n        };\n        if (assocLang) {\n          media.assocLang = assocLang;\n        }\n        if (channels) {\n          media.channels = channels;\n        }\n        if (characteristics) {\n          media.characteristics = characteristics;\n        }\n        if (instreamId) {\n          media.instreamId = instreamId;\n        }\n\n        if (groups?.length) {\n          // If there are audio or text groups signalled in the manifest, let's look for a matching codec string for this track\n          // If we don't find the track signalled, lets use the first audio groups codec we have\n          // Acting as a best guess\n          const groupCodec =\n            M3U8Parser.findGroup(groups, media.groupId as string) || groups[0];\n          assignCodec(media, groupCodec, 'audioCodec');\n          assignCodec(media, groupCodec, 'textCodec');\n        }\n\n        medias.push(media);\n      }\n    }\n    return results;\n  }\n\n  static parseLevelPlaylist(\n    string: string,\n    baseurl: string,\n    id: number,\n    type: PlaylistLevelType,\n    levelUrlId: number,\n    multivariantVariableList: VariableMap | null,\n  ): LevelDetails {\n    const base = { url: baseurl };\n    const level = new LevelDetails(baseurl);\n    const fragments: M3U8ParserFragments = level.fragments;\n    const programDateTimes: MediaFragment[] = [];\n    // The most recent init segment seen (applies to all subsequent segments)\n    let currentInitSegment: Fragment | null = null;\n    let currentSN = 0;\n    let currentPart = 0;\n    let totalduration = 0;\n    let discontinuityCounter = 0;\n    let currentBitrate = 0;\n    let prevFrag: Fragment | null = null;\n    let frag: Fragment = new Fragment(type, base);\n    let result: RegExpExecArray | RegExpMatchArray | null;\n    let i: number;\n    let levelkeys: LevelKeys | undefined;\n    let firstPdtIndex = -1;\n    let createNextFrag = false;\n    let nextByteRange: string | null = null;\n    let serverControlAttrs: AttrList | undefined;\n\n    LEVEL_PLAYLIST_REGEX_FAST.lastIndex = 0;\n    level.m3u8 = string;\n    level.hasVariableRefs = __USE_VARIABLE_SUBSTITUTION__\n      ? hasVariableReferences(string)\n      : false;\n    if (LEVEL_PLAYLIST_REGEX_FAST.exec(string)?.[0] !== '#EXTM3U') {\n      level.playlistParsingError = new Error(\n        'Missing format identifier #EXTM3U',\n      );\n      return level;\n    }\n    while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {\n      if (createNextFrag) {\n        createNextFrag = false;\n        frag = new Fragment(type, base);\n        // setup the next fragment for part loading\n        frag.playlistOffset = totalduration;\n        frag.setStart(totalduration);\n        frag.sn = currentSN;\n        frag.cc = discontinuityCounter;\n        if (currentBitrate) {\n          frag.bitrate = currentBitrate;\n        }\n        frag.level = id;\n        if (currentInitSegment) {\n          frag.initSegment = currentInitSegment;\n          if (currentInitSegment.rawProgramDateTime) {\n            frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n            currentInitSegment.rawProgramDateTime = null;\n          }\n          if (nextByteRange) {\n            frag.setByteRange(nextByteRange);\n            nextByteRange = null;\n          }\n        }\n      }\n\n      const duration = result[1];\n      if (duration) {\n        // INF\n        frag.duration = parseFloat(duration);\n        // avoid sliced strings    https://github.com/video-dev/hls.js/issues/939\n        const title = (' ' + result[2]).slice(1);\n        frag.title = title || null;\n        frag.tagList.push(title ? ['INF', duration, title] : ['INF', duration]);\n      } else if (result[3]) {\n        // url\n        if (Number.isFinite(frag.duration)) {\n          frag.playlistOffset = totalduration;\n          frag.setStart(totalduration);\n          if (levelkeys) {\n            setFragLevelKeys(frag, levelkeys, level);\n          }\n          frag.sn = currentSN;\n          frag.level = id;\n          frag.cc = discontinuityCounter;\n          fragments.push(frag);\n          // avoid sliced strings    https://github.com/video-dev/hls.js/issues/939\n          const uri = (' ' + result[3]).slice(1);\n          frag.relurl = __USE_VARIABLE_SUBSTITUTION__\n            ? substituteVariables(level, uri)\n            : uri;\n          assignProgramDateTime(\n            frag as MediaFragment,\n            prevFrag as MediaFragment,\n            programDateTimes,\n          );\n          prevFrag = frag;\n          totalduration += frag.duration;\n          currentSN++;\n          currentPart = 0;\n          createNextFrag = true;\n        }\n      } else {\n        result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW);\n        if (!result) {\n          logger.warn('No matches on slow regex match for level playlist!');\n          continue;\n        }\n        for (i = 1; i < result.length; i++) {\n          if ((result[i] as any) !== undefined) {\n            break;\n          }\n        }\n\n        // avoid sliced strings    https://github.com/video-dev/hls.js/issues/939\n        const tag = (' ' + result[i]).slice(1);\n        const value1 = (' ' + result[i + 1]).slice(1);\n        const value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : null;\n\n        switch (tag) {\n          case 'BYTERANGE':\n            if (prevFrag) {\n              frag.setByteRange(value1, prevFrag);\n            } else {\n              frag.setByteRange(value1);\n            }\n            break;\n          case 'PROGRAM-DATE-TIME':\n            // avoid sliced strings    https://github.com/video-dev/hls.js/issues/939\n            frag.rawProgramDateTime = value1;\n            frag.tagList.push(['PROGRAM-DATE-TIME', value1]);\n            if (firstPdtIndex === -1) {\n              firstPdtIndex = fragments.length;\n            }\n            break;\n          case 'PLAYLIST-TYPE':\n            if (level.type) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.type = value1.toUpperCase();\n            break;\n          case 'MEDIA-SEQUENCE':\n            if (level.startSN !== 0) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            } else if (fragments.length > 0) {\n              assignMustAppearBeforeSegmentsError(level, tag, result);\n            }\n            currentSN = level.startSN = parseInt(value1);\n            break;\n          case 'SKIP': {\n            if (level.skippedSegments) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            const skipAttrs = new AttrList(value1, level);\n            const skippedSegments =\n              skipAttrs.decimalInteger('SKIPPED-SEGMENTS');\n            if (Number.isFinite(skippedSegments)) {\n              level.skippedSegments += skippedSegments;\n              // This will result in fragments[] containing undefined values, which we will fill in with `mergeDetails`\n              for (let i = skippedSegments; i--; ) {\n                fragments.push(null);\n              }\n              currentSN += skippedSegments;\n            }\n            const recentlyRemovedDateranges = skipAttrs.enumeratedString(\n              'RECENTLY-REMOVED-DATERANGES',\n            );\n            if (recentlyRemovedDateranges) {\n              level.recentlyRemovedDateranges = (\n                level.recentlyRemovedDateranges || []\n              ).concat(recentlyRemovedDateranges.split('\\t'));\n            }\n            break;\n          }\n          case 'TARGETDURATION':\n            if (level.targetduration !== 0) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.targetduration = Math.max(parseInt(value1), 1);\n            break;\n          case 'VERSION':\n            if (level.version !== null) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.version = parseInt(value1);\n            break;\n          case 'INDEPENDENT-SEGMENTS':\n            break;\n          case 'ENDLIST':\n            if (!level.live) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.live = false;\n            break;\n          case '#':\n            if (value1 || value2) {\n              frag.tagList.push(value2 ? [value1, value2] : [value1]);\n            }\n            break;\n          case 'DISCONTINUITY':\n            discontinuityCounter++;\n            frag.tagList.push(['DIS']);\n            break;\n          case 'GAP':\n            frag.gap = true;\n            frag.tagList.push([tag]);\n            break;\n          case 'BITRATE':\n            frag.tagList.push([tag, value1]);\n            currentBitrate = parseInt(value1) * 1000;\n            if (Number.isFinite(currentBitrate)) {\n              frag.bitrate = currentBitrate;\n            } else {\n              currentBitrate = 0;\n            }\n            break;\n          case 'DATERANGE': {\n            const dateRangeAttr = new AttrList(value1, level);\n            const dateRange = new DateRange(\n              dateRangeAttr,\n              level.dateRanges[dateRangeAttr.ID],\n              level.dateRangeTagCount,\n            );\n            level.dateRangeTagCount++;\n            if (dateRange.isValid || level.skippedSegments) {\n              level.dateRanges[dateRange.id] = dateRange;\n            } else {\n              logger.warn(`Ignoring invalid DATERANGE tag: \"${value1}\"`);\n            }\n            // Add to fragment tag list for backwards compatibility (< v1.2.0)\n            frag.tagList.push(['EXT-X-DATERANGE', value1]);\n            break;\n          }\n          case 'DEFINE': {\n            if (__USE_VARIABLE_SUBSTITUTION__) {\n              const variableAttributes = new AttrList(value1, level);\n              if ('IMPORT' in variableAttributes) {\n                importVariableDefinition(\n                  level,\n                  variableAttributes,\n                  multivariantVariableList,\n                );\n              } else {\n                addVariableDefinition(level, variableAttributes, baseurl);\n              }\n            }\n            break;\n          }\n\n          case 'DISCONTINUITY-SEQUENCE':\n            if (level.startCC !== 0) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            } else if (fragments.length > 0) {\n              assignMustAppearBeforeSegmentsError(level, tag, result);\n            }\n            level.startCC = discontinuityCounter = parseInt(value1);\n            break;\n          case 'KEY': {\n            const levelKey = parseKey(value1, baseurl, level);\n            if (levelKey.isSupported()) {\n              if (levelKey.method === 'NONE') {\n                levelkeys = undefined;\n                break;\n              }\n              if (!levelkeys) {\n                levelkeys = {};\n              }\n              const currentKey = levelkeys[levelKey.keyFormat];\n              // Ignore duplicate playlist KEY tags\n              if (!currentKey?.matches(levelKey)) {\n                if (currentKey) {\n                  levelkeys = Object.assign({}, levelkeys);\n                }\n                levelkeys[levelKey.keyFormat] = levelKey;\n              }\n            } else {\n              logger.warn(\n                `[Keys] Ignoring unsupported EXT-X-KEY tag: \"${value1}\"${__USE_EME_DRM__ ? '' : ' (light build)'}`,\n              );\n            }\n            break;\n          }\n          case 'START':\n            level.startTimeOffset = parseStartTimeOffset(value1);\n            break;\n          case 'MAP': {\n            const mapAttrs = new AttrList(value1, level);\n            if (frag.duration) {\n              // Initial segment tag is after segment duration tag.\n              //   #EXTINF: 6.0\n              //   #EXT-X-MAP:URI=\"init.mp4\n              const init = new Fragment(type, base);\n              setInitSegment(init, mapAttrs, id, levelkeys);\n              currentInitSegment = init;\n              frag.initSegment = currentInitSegment;\n              if (\n                currentInitSegment.rawProgramDateTime &&\n                !frag.rawProgramDateTime\n              ) {\n                frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n              }\n            } else {\n              // Initial segment tag is before segment duration tag\n              // Handle case where EXT-X-MAP is declared after EXT-X-BYTERANGE\n              const end = frag.byteRangeEndOffset;\n              if (end) {\n                const start = frag.byteRangeStartOffset as number;\n                nextByteRange = `${end - start}@${start}`;\n              } else {\n                nextByteRange = null;\n              }\n              setInitSegment(frag, mapAttrs, id, levelkeys);\n              currentInitSegment = frag;\n              createNextFrag = true;\n            }\n            currentInitSegment.cc = discontinuityCounter;\n            break;\n          }\n          case 'SERVER-CONTROL': {\n            if (serverControlAttrs) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            serverControlAttrs = new AttrList(value1);\n            level.canBlockReload = serverControlAttrs.bool('CAN-BLOCK-RELOAD');\n            level.canSkipUntil = serverControlAttrs.optionalFloat(\n              'CAN-SKIP-UNTIL',\n              0,\n            );\n            level.canSkipDateRanges =\n              level.canSkipUntil > 0 &&\n              serverControlAttrs.bool('CAN-SKIP-DATERANGES');\n            level.partHoldBack = serverControlAttrs.optionalFloat(\n              'PART-HOLD-BACK',\n              0,\n            );\n            level.holdBack = serverControlAttrs.optionalFloat('HOLD-BACK', 0);\n            break;\n          }\n          case 'PART-INF': {\n            if (level.partTarget) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            const partInfAttrs = new AttrList(value1);\n            level.partTarget = partInfAttrs.decimalFloatingPoint('PART-TARGET');\n            break;\n          }\n          case 'PART': {\n            let partList = level.partList;\n            if (!partList) {\n              partList = level.partList = [];\n            }\n            const previousFragmentPart =\n              currentPart > 0 ? partList[partList.length - 1] : undefined;\n            const index = currentPart++;\n            const partAttrs = new AttrList(value1, level);\n            const part = new Part(\n              partAttrs,\n              frag as MediaFragment,\n              base,\n              index,\n              previousFragmentPart,\n            );\n            partList.push(part);\n            frag.duration += part.duration;\n            break;\n          }\n          case 'PRELOAD-HINT': {\n            const preloadHintAttrs = new AttrList(value1, level);\n            level.preloadHint = preloadHintAttrs;\n            break;\n          }\n          case 'RENDITION-REPORT': {\n            const renditionReportAttrs = new AttrList(value1, level);\n            level.renditionReports = level.renditionReports || [];\n            level.renditionReports.push(renditionReportAttrs);\n            break;\n          }\n          default:\n            logger.warn(`line parsed but not handled: ${result}`);\n            break;\n        }\n      }\n    }\n    if (prevFrag && !prevFrag.relurl) {\n      fragments.pop();\n      totalduration -= prevFrag.duration;\n      if (level.partList) {\n        level.fragmentHint = prevFrag as MediaFragment;\n      }\n    } else if (level.partList) {\n      assignProgramDateTime(\n        frag as MediaFragment,\n        prevFrag as MediaFragment,\n        programDateTimes,\n      );\n      frag.cc = discontinuityCounter;\n      level.fragmentHint = frag as MediaFragment;\n      if (levelkeys) {\n        setFragLevelKeys(frag, levelkeys, level);\n      }\n    }\n    if (!level.targetduration) {\n      level.playlistParsingError = new Error(`Missing Target Duration`);\n    }\n    const fragmentLength = fragments.length;\n    const firstFragment = fragments[0];\n    const lastFragment = fragments[fragmentLength - 1];\n    totalduration += level.skippedSegments * level.targetduration;\n    if (totalduration > 0 && fragmentLength && lastFragment) {\n      level.averagetargetduration = totalduration / fragmentLength;\n      const lastSn = lastFragment.sn;\n      level.endSN = lastSn !== 'initSegment' ? lastSn : 0;\n      if (!level.live) {\n        lastFragment.endList = true;\n      }\n      /**\n       * Backfill any missing PDT values\n       * \"If the first EXT-X-PROGRAM-DATE-TIME tag in a Playlist appears after\n       * one or more Media Segment URIs, the client SHOULD extrapolate\n       * backward from that tag (using EXTINF durations and/or media\n       * timestamps) to associate dates with those segments.\"\n       * We have already extrapolated forward, but all fragments up to the first instance of PDT do not have their PDTs\n       * computed.\n       */\n      if (firstPdtIndex > 0) {\n        backfillProgramDateTimes(fragments, firstPdtIndex);\n        if (firstFragment) {\n          programDateTimes.unshift(firstFragment as MediaFragment);\n        }\n      }\n    }\n    if (level.fragmentHint) {\n      totalduration += level.fragmentHint.duration;\n    }\n    level.totalduration = totalduration;\n    if (programDateTimes.length && level.dateRangeTagCount && firstFragment) {\n      mapDateRanges(programDateTimes, level);\n    }\n\n    level.endCC = discontinuityCounter;\n\n    return level;\n  }\n}\n\nexport function mapDateRanges(\n  programDateTimes: MediaFragment[],\n  details: LevelDetails,\n) {\n  // Make sure DateRanges are mapped to a ProgramDateTime tag that applies a date to a segment that overlaps with its start date\n  let programDateTimeCount = programDateTimes.length;\n  if (!programDateTimeCount) {\n    if (details.hasProgramDateTime) {\n      const lastFragment = details.fragments[details.fragments.length - 1];\n      programDateTimes.push(lastFragment);\n      programDateTimeCount++;\n    } else {\n      // no segments with EXT-X-PROGRAM-DATE-TIME references in playlist history\n      return;\n    }\n  }\n  const lastProgramDateTime = programDateTimes[programDateTimeCount - 1];\n  const playlistEnd = details.live ? Infinity : details.totalduration;\n  const dateRangeIds = Object.keys(details.dateRanges);\n  for (let i = dateRangeIds.length; i--; ) {\n    const dateRange = details.dateRanges[dateRangeIds[i]]!;\n    const startDateTime = dateRange.startDate.getTime();\n    dateRange.tagAnchor = lastProgramDateTime.ref;\n    for (let j = programDateTimeCount; j--; ) {\n      if (programDateTimes[j]?.sn < details.startSN) {\n        break;\n      }\n      const fragIndex = findFragmentWithStartDate(\n        details,\n        startDateTime,\n        programDateTimes,\n        j,\n        playlistEnd,\n      );\n      if (fragIndex !== -1) {\n        dateRange.tagAnchor = details.fragments[fragIndex].ref;\n        break;\n      }\n    }\n  }\n}\n\nfunction findFragmentWithStartDate(\n  details: LevelDetails,\n  startDateTime: number,\n  programDateTimes: MediaFragment[],\n  index: number,\n  endTime: number,\n): number {\n  const pdtFragment = programDateTimes[index] as MediaFragment | undefined;\n  if (pdtFragment) {\n    // find matching range between PDT tags\n    const pdtStart = pdtFragment.programDateTime as number;\n    if (startDateTime >= pdtStart || index === 0) {\n      const durationBetweenPdt =\n        (programDateTimes[index + 1]?.start || endTime) - pdtFragment.start;\n      if (startDateTime <= pdtStart + durationBetweenPdt * 1000) {\n        // map to fragment with date-time range\n        const startIndex = programDateTimes[index].sn - details.startSN;\n        if (startIndex < 0) {\n          return -1;\n        }\n        const fragments = details.fragments;\n        if (fragments.length > programDateTimes.length) {\n          const endSegment =\n            programDateTimes[index + 1] || fragments[fragments.length - 1];\n          const endIndex = endSegment.sn - details.startSN;\n          for (let i = endIndex; i > startIndex; i--) {\n            const fragStartDateTime = fragments[i].programDateTime as number;\n            if (\n              startDateTime >= fragStartDateTime &&\n              startDateTime < fragStartDateTime + fragments[i].duration * 1000\n            ) {\n              return i;\n            }\n          }\n        }\n        return startIndex;\n      }\n    }\n  }\n  return -1;\n}\n\nfunction parseKey(\n  keyTagAttributes: string,\n  baseurl: string,\n  parsed: ParsedMultivariantPlaylist | LevelDetails,\n): LevelKey {\n  // https://tools.ietf.org/html/rfc8216#section-4.3.2.4\n  const keyAttrs = new AttrList(keyTagAttributes, parsed);\n  const decryptmethod = keyAttrs.METHOD ?? '';\n  const decrypturi = keyAttrs.URI;\n  const decryptiv = keyAttrs.hexadecimalInteger('IV');\n  const decryptkeyformatversions = keyAttrs.KEYFORMATVERSIONS;\n  // From RFC: This attribute is OPTIONAL; its absence indicates an implicit value of \"identity\".\n  const decryptkeyformat = keyAttrs.KEYFORMAT ?? 'identity';\n\n  if (decrypturi && keyAttrs.IV && !decryptiv) {\n    logger.error(`Invalid IV: ${keyAttrs.IV}`);\n  }\n  // If decrypturi is a URI with a scheme, then baseurl will be ignored\n  // No uri is allowed when METHOD is NONE\n  const resolvedUri = decrypturi ? M3U8Parser.resolve(decrypturi, baseurl) : '';\n  const keyFormatVersions = (\n    decryptkeyformatversions ? decryptkeyformatversions : '1'\n  )\n    .split('/')\n    .map(Number)\n    .filter(Number.isFinite);\n\n  return new LevelKey(\n    decryptmethod,\n    resolvedUri,\n    decryptkeyformat,\n    keyFormatVersions,\n    decryptiv,\n    keyAttrs.KEYID,\n  );\n}\n\nfunction parseStartTimeOffset(startAttributes: string): number | null {\n  const startAttrs = new AttrList(startAttributes);\n  const startTimeOffset = startAttrs.decimalFloatingPoint('TIME-OFFSET');\n  if (Number.isFinite(startTimeOffset)) {\n    return startTimeOffset;\n  }\n  return null;\n}\n\nfunction setCodecs(\n  codecsAttributeValue: string | undefined,\n  level: CodecsParsed,\n) {\n  let codecs = (codecsAttributeValue || '').split(/[ ,]+/).filter((c) => c);\n  ['video', 'audio', 'text'].forEach((type: CodecType) => {\n    const filtered = codecs.filter((codec) => isCodecType(codec, type));\n    if (filtered.length) {\n      // Comma separated list of all codecs for type\n      level[`${type}Codec`] = filtered.map((c) => c.split('/')[0]).join(',');\n      // Remove known codecs so that only unknownCodecs are left after iterating through each type\n      codecs = codecs.filter((codec) => filtered.indexOf(codec) === -1);\n    }\n  });\n  level.unknownCodecs = codecs;\n}\n\nfunction assignCodec(\n  media: MediaPlaylist,\n  groupItem: { audioCodec?: string; textCodec?: string },\n  codecProperty: 'audioCodec' | 'textCodec',\n) {\n  const codecValue = groupItem[codecProperty];\n  if (codecValue) {\n    media[codecProperty] = codecValue;\n  }\n}\n\nfunction backfillProgramDateTimes(\n  fragments: M3U8ParserFragments,\n  firstPdtIndex: number,\n) {\n  let fragPrev = fragments[firstPdtIndex] as Fragment;\n  for (let i = firstPdtIndex; i--; ) {\n    const frag = fragments[i];\n    // Exit on delta-playlist skipped segments\n    if (!frag) {\n      return;\n    }\n    frag.programDateTime =\n      (fragPrev.programDateTime as number) - frag.duration * 1000;\n    fragPrev = frag;\n  }\n}\n\nexport function assignProgramDateTime(\n  frag: MediaFragment,\n  prevFrag: MediaFragment | null,\n  programDateTimes: MediaFragment[],\n) {\n  if (frag.rawProgramDateTime) {\n    programDateTimes.push(frag);\n  } else if (prevFrag?.programDateTime) {\n    frag.programDateTime = prevFrag.endProgramDateTime;\n  }\n}\n\nfunction setInitSegment(\n  frag: Fragment,\n  mapAttrs: AttrList,\n  id: number,\n  levelkeys: LevelKeys | undefined,\n) {\n  frag.relurl = mapAttrs.URI;\n  if (mapAttrs.BYTERANGE) {\n    frag.setByteRange(mapAttrs.BYTERANGE);\n  }\n  frag.level = id;\n  frag.sn = 'initSegment';\n  if (levelkeys) {\n    frag.levelkeys = levelkeys;\n  }\n  frag.initSegment = null;\n}\n\nfunction setFragLevelKeys(\n  frag: Fragment,\n  levelkeys: LevelKeys,\n  level: LevelDetails,\n) {\n  frag.levelkeys = levelkeys;\n  const { encryptedFragments } = level;\n  if (\n    (!encryptedFragments.length ||\n      encryptedFragments[encryptedFragments.length - 1].levelkeys !==\n        levelkeys) &&\n    Object.keys(levelkeys).some(\n      (format) => levelkeys[format]!.isCommonEncryption,\n    )\n  ) {\n    encryptedFragments.push(frag);\n  }\n}\n\nfunction assignMultipleMediaPlaylistTagOccuranceError(\n  level: LevelDetails,\n  tag: string,\n  result: string[],\n) {\n  level.playlistParsingError = new Error(\n    `#EXT-X-${tag} must not appear more than once (${result[0]})`,\n  );\n}\n\nfunction assignMustAppearBeforeSegmentsError(\n  level: LevelDetails,\n  tag: string,\n  result: string[],\n) {\n  level.playlistParsingError = new Error(\n    `#EXT-X-${tag} must appear before the first Media Segment (${result[0]})`,\n  );\n}\n", "/**\n * Provides methods dealing with playlist sliding and drift\n */\n\nimport { stringify } from './safe-json-stringify';\nimport { DateRange } from '../loader/date-range';\nimport { assignProgramDateTime, mapDateRanges } from '../loader/m3u8-parser';\nimport type { ILogger } from './logger';\nimport type { Fragment, MediaFragment, Part } from '../loader/fragment';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { Level } from '../types/level';\n\ntype FragmentIntersection = (\n  oldFrag: MediaFragment,\n  newFrag: MediaFragment,\n  newFragIndex: number,\n  newFragments: MediaFragment[],\n) => void;\ntype PartIntersection = (oldPart: Part, newPart: Part) => void;\n\nexport function updatePTS(\n  fragments: MediaFragment[],\n  fromIdx: number,\n  toIdx: number,\n): void {\n  const fragFrom = fragments[fromIdx];\n  const fragTo = fragments[toIdx];\n  updateFromToPTS(fragFrom, fragTo);\n}\n\nfunction updateFromToPTS(fragFrom: MediaFragment, fragTo: MediaFragment) {\n  const fragToPTS = fragTo.startPTS as number;\n  // if we know startPTS[toIdx]\n  if (Number.isFinite(fragToPTS)) {\n    // update fragment duration.\n    // it helps to fix drifts between playlist reported duration and fragment real duration\n    let duration: number = 0;\n    let frag: Fragment;\n    if (fragTo.sn > fragFrom.sn) {\n      duration = fragToPTS - fragFrom.start;\n      frag = fragFrom;\n    } else {\n      duration = fragFrom.start - fragToPTS;\n      frag = fragTo;\n    }\n    if (frag.duration !== duration) {\n      frag.setDuration(duration);\n    }\n    // we dont know startPTS[toIdx]\n  } else if (fragTo.sn > fragFrom.sn) {\n    const contiguous = fragFrom.cc === fragTo.cc;\n    // TODO: With part-loading end/durations we need to confirm the whole fragment is loaded before using (or setting) minEndPTS\n    if (contiguous && fragFrom.minEndPTS) {\n      fragTo.setStart(fragFrom.start + (fragFrom.minEndPTS - fragFrom.start));\n    } else {\n      fragTo.setStart(fragFrom.start + fragFrom.duration);\n    }\n  } else {\n    fragTo.setStart(Math.max(fragFrom.start - fragTo.duration, 0));\n  }\n}\n\nexport function updateFragPTSDTS(\n  details: LevelDetails | undefined,\n  frag: MediaFragment,\n  startPTS: number,\n  endPTS: number,\n  startDTS: number,\n  endDTS: number,\n  logger: ILogger,\n): number {\n  const parsedMediaDuration = endPTS - startPTS;\n  if (parsedMediaDuration <= 0) {\n    logger.warn('Fragment should have a positive duration', frag);\n    endPTS = startPTS + frag.duration;\n    endDTS = startDTS + frag.duration;\n  }\n  let maxStartPTS = startPTS;\n  let minEndPTS = endPTS;\n  const fragStartPts = frag.startPTS as number;\n  const fragEndPts = frag.endPTS as number;\n  if (Number.isFinite(fragStartPts)) {\n    // delta PTS between audio and video\n    const deltaPTS = Math.abs(fragStartPts - startPTS);\n    if (details && deltaPTS > details.totalduration) {\n      logger.warn(\n        `media timestamps and playlist times differ by ${deltaPTS}s for level ${frag.level} ${details.url}`,\n      );\n    } else if (!Number.isFinite(frag.deltaPTS as number)) {\n      frag.deltaPTS = deltaPTS;\n    } else {\n      frag.deltaPTS = Math.max(deltaPTS, frag.deltaPTS as number);\n    }\n\n    maxStartPTS = Math.max(startPTS, fragStartPts);\n    startPTS = Math.min(startPTS, fragStartPts);\n    startDTS =\n      frag.startDTS !== undefined\n        ? Math.min(startDTS, frag.startDTS)\n        : startDTS;\n\n    minEndPTS = Math.min(endPTS, fragEndPts);\n    endPTS = Math.max(endPTS, fragEndPts);\n    endDTS = frag.endDTS !== undefined ? Math.max(endDTS, frag.endDTS) : endDTS;\n  }\n\n  const drift = startPTS - frag.start;\n  if (frag.start !== 0) {\n    frag.setStart(startPTS);\n  }\n  frag.setDuration(endPTS - frag.start);\n  frag.startPTS = startPTS;\n  frag.maxStartPTS = maxStartPTS;\n  frag.startDTS = startDTS;\n  frag.endPTS = endPTS;\n  frag.minEndPTS = minEndPTS;\n  frag.endDTS = endDTS;\n\n  const sn = frag.sn;\n  // exit if sn out of range\n  if (!details || sn < details.startSN || sn > details.endSN) {\n    return 0;\n  }\n  let i: number;\n  const fragIdx = sn - details.startSN;\n  const fragments = details.fragments;\n  // update frag reference in fragments array\n  // rationale is that fragments array might not contain this frag object.\n  // this will happen if playlist has been refreshed between frag loading and call to updateFragPTSDTS()\n  // if we don't update frag, we won't be able to propagate PTS info on the playlist\n  // resulting in invalid sliding computation\n  fragments[fragIdx] = frag;\n  // adjust fragment PTS/duration from seqnum-1 to frag 0\n  for (i = fragIdx; i > 0; i--) {\n    updateFromToPTS(fragments[i], fragments[i - 1]);\n  }\n\n  // adjust fragment PTS/duration from seqnum to last frag\n  for (i = fragIdx; i < fragments.length - 1; i++) {\n    updateFromToPTS(fragments[i], fragments[i + 1]);\n  }\n  if (details.fragmentHint) {\n    updateFromToPTS(fragments[fragments.length - 1], details.fragmentHint);\n  }\n\n  details.PTSKnown = details.alignedSliding = true;\n  return drift;\n}\n\nexport function mergeDetails(\n  oldDetails: LevelDetails,\n  newDetails: LevelDetails,\n  logger: ILogger,\n) {\n  if (oldDetails === newDetails) {\n    return;\n  }\n  // Track the last initSegment processed. Initialize it to the last one on the timeline.\n  let currentInitSegment: Fragment | null = null;\n  const oldFragments = oldDetails.fragments;\n  for (let i = oldFragments.length - 1; i >= 0; i--) {\n    const oldInit = oldFragments[i].initSegment;\n    if (oldInit) {\n      currentInitSegment = oldInit;\n      break;\n    }\n  }\n\n  if (oldDetails.fragmentHint) {\n    // prevent PTS and duration from being adjusted on the next hint\n    delete oldDetails.fragmentHint.endPTS;\n  }\n  // check if old/new playlists have fragments in common\n  // loop through overlapping SN and update startPTS, cc, and duration if any found\n  let PTSFrag: MediaFragment | undefined;\n  mapFragmentIntersection(\n    oldDetails,\n    newDetails,\n    (oldFrag, newFrag, newFragIndex, newFragments) => {\n      if (\n        (!newDetails.startCC || newDetails.skippedSegments) &&\n        newFrag.cc !== oldFrag.cc\n      ) {\n        const ccOffset = oldFrag.cc - newFrag.cc;\n        for (let i = newFragIndex; i < newFragments.length; i++) {\n          newFragments[i].cc += ccOffset;\n        }\n        newDetails.endCC = newFragments[newFragments.length - 1].cc;\n      }\n      if (\n        Number.isFinite(oldFrag.startPTS) &&\n        Number.isFinite(oldFrag.endPTS)\n      ) {\n        newFrag.setStart((newFrag.startPTS = oldFrag.startPTS!));\n        newFrag.startDTS = oldFrag.startDTS;\n        newFrag.maxStartPTS = oldFrag.maxStartPTS;\n\n        newFrag.endPTS = oldFrag.endPTS;\n        newFrag.endDTS = oldFrag.endDTS;\n        newFrag.minEndPTS = oldFrag.minEndPTS;\n        newFrag.setDuration(oldFrag.endPTS! - oldFrag.startPTS!);\n\n        if (newFrag.duration) {\n          PTSFrag = newFrag;\n        }\n\n        // PTS is known when any segment has startPTS and endPTS\n        newDetails.PTSKnown = newDetails.alignedSliding = true;\n      }\n\n      if (oldFrag.hasStreams) {\n        newFrag.elementaryStreams = oldFrag.elementaryStreams;\n      }\n\n      newFrag.loader = oldFrag.loader;\n\n      if (oldFrag.hasStats) {\n        newFrag.stats = oldFrag.stats;\n      }\n\n      if (oldFrag.initSegment) {\n        newFrag.initSegment = oldFrag.initSegment;\n        currentInitSegment = oldFrag.initSegment;\n      }\n    },\n  );\n\n  const newFragments = newDetails.fragments;\n  const fragmentsToCheck = newDetails.fragmentHint\n    ? newFragments.concat(newDetails.fragmentHint)\n    : newFragments;\n  if (currentInitSegment) {\n    fragmentsToCheck.forEach((frag) => {\n      if (\n        (frag as any) &&\n        (!frag.initSegment ||\n          frag.initSegment.relurl === currentInitSegment?.relurl)\n      ) {\n        frag.initSegment = currentInitSegment;\n      }\n    });\n  }\n\n  if (newDetails.skippedSegments) {\n    newDetails.deltaUpdateFailed = newFragments.some((frag) => !frag as any);\n    if (newDetails.deltaUpdateFailed) {\n      logger.warn(\n        '[level-helper] Previous playlist missing segments skipped in delta playlist',\n      );\n      for (let i = newDetails.skippedSegments; i--; ) {\n        newFragments.shift();\n      }\n      newDetails.startSN = newFragments[0].sn;\n    } else {\n      if (newDetails.canSkipDateRanges) {\n        newDetails.dateRanges = mergeDateRanges(\n          oldDetails.dateRanges,\n          newDetails,\n          logger,\n        );\n      }\n      const programDateTimes = oldDetails.fragments.filter(\n        (frag) => frag.rawProgramDateTime,\n      );\n      if (oldDetails.hasProgramDateTime && !newDetails.hasProgramDateTime) {\n        for (let i = 1; i < fragmentsToCheck.length; i++) {\n          if (fragmentsToCheck[i].programDateTime === null) {\n            assignProgramDateTime(\n              fragmentsToCheck[i],\n              fragmentsToCheck[i - 1],\n              programDateTimes,\n            );\n          }\n        }\n      }\n      mapDateRanges(programDateTimes, newDetails);\n    }\n    newDetails.endCC = newFragments[newFragments.length - 1].cc;\n  }\n  if (!newDetails.startCC) {\n    const fragPriorToNewStart = getFragmentWithSN(\n      oldDetails,\n      newDetails.startSN - 1,\n    );\n    newDetails.startCC = fragPriorToNewStart?.cc ?? newFragments[0].cc;\n  }\n\n  // Merge parts\n  mapPartIntersection(\n    oldDetails.partList,\n    newDetails.partList,\n    (oldPart: Part, newPart: Part) => {\n      newPart.elementaryStreams = oldPart.elementaryStreams;\n      newPart.stats = oldPart.stats;\n    },\n  );\n\n  // if at least one fragment contains PTS info, recompute PTS information for all fragments\n  if (PTSFrag) {\n    updateFragPTSDTS(\n      newDetails,\n      PTSFrag,\n      PTSFrag.startPTS as number,\n      PTSFrag.endPTS as number,\n      PTSFrag.startDTS as number,\n      PTSFrag.endDTS as number,\n      logger,\n    );\n  } else {\n    // ensure that delta is within oldFragments range\n    // also adjust sliding in case delta is 0 (we could have old=[50-60] and new=old=[50-61])\n    // in that case we also need to adjust start offset of all fragments\n    adjustSliding(oldDetails, newDetails);\n  }\n\n  if (newFragments.length) {\n    newDetails.totalduration = newDetails.edge - newFragments[0].start;\n  }\n\n  newDetails.driftStartTime = oldDetails.driftStartTime;\n  newDetails.driftStart = oldDetails.driftStart;\n  const advancedDateTime = newDetails.advancedDateTime;\n  if (newDetails.advanced && advancedDateTime) {\n    const edge = newDetails.edge;\n    if (!newDetails.driftStart) {\n      newDetails.driftStartTime = advancedDateTime;\n      newDetails.driftStart = edge;\n    }\n    newDetails.driftEndTime = advancedDateTime;\n    newDetails.driftEnd = edge;\n  } else {\n    newDetails.driftEndTime = oldDetails.driftEndTime;\n    newDetails.driftEnd = oldDetails.driftEnd;\n    newDetails.advancedDateTime = oldDetails.advancedDateTime;\n  }\n  if (newDetails.requestScheduled === -1) {\n    newDetails.requestScheduled = oldDetails.requestScheduled;\n  }\n}\n\nfunction mergeDateRanges(\n  oldDateRanges: Record<string, DateRange | undefined>,\n  newDetails: LevelDetails,\n  logger: ILogger,\n): Record<string, DateRange | undefined> {\n  const { dateRanges: deltaDateRanges, recentlyRemovedDateranges } = newDetails;\n  const dateRanges = Object.assign({}, oldDateRanges);\n  if (recentlyRemovedDateranges) {\n    recentlyRemovedDateranges.forEach((id) => {\n      delete dateRanges[id];\n    });\n  }\n  const mergeIds = Object.keys(dateRanges);\n  const mergeCount = mergeIds.length;\n  if (!mergeCount) {\n    return deltaDateRanges;\n  }\n  Object.keys(deltaDateRanges).forEach((id) => {\n    const mergedDateRange = dateRanges[id];\n    const dateRange = new DateRange(deltaDateRanges[id]!.attr, mergedDateRange);\n    if (dateRange.isValid) {\n      dateRanges[id] = dateRange;\n      if (!mergedDateRange) {\n        dateRange.tagOrder += mergeCount;\n      }\n    } else {\n      logger.warn(\n        `Ignoring invalid Playlist Delta Update DATERANGE tag: \"${stringify(\n          deltaDateRanges[id]!.attr,\n        )}\"`,\n      );\n    }\n  });\n  return dateRanges;\n}\n\nexport function mapPartIntersection(\n  oldParts: Part[] | null,\n  newParts: Part[] | null,\n  intersectionFn: PartIntersection,\n) {\n  if (oldParts && newParts) {\n    let delta = 0;\n    for (let i = 0, len = oldParts.length; i <= len; i++) {\n      const oldPart = oldParts[i];\n      const newPart = newParts[i + delta];\n      if (\n        (oldPart as any) &&\n        (newPart as any) &&\n        oldPart.index === newPart.index &&\n        oldPart.fragment.sn === newPart.fragment.sn\n      ) {\n        intersectionFn(oldPart, newPart);\n      } else {\n        delta--;\n      }\n    }\n  }\n}\n\nexport function mapFragmentIntersection(\n  oldDetails: LevelDetails,\n  newDetails: LevelDetails,\n  intersectionFn: FragmentIntersection,\n) {\n  const skippedSegments = newDetails.skippedSegments;\n  const start =\n    Math.max(oldDetails.startSN, newDetails.startSN) - newDetails.startSN;\n  const end =\n    (oldDetails.fragmentHint ? 1 : 0) +\n    (skippedSegments\n      ? newDetails.endSN\n      : Math.min(oldDetails.endSN, newDetails.endSN)) -\n    newDetails.startSN;\n  const delta = newDetails.startSN - oldDetails.startSN;\n  const newFrags = newDetails.fragmentHint\n    ? newDetails.fragments.concat(newDetails.fragmentHint)\n    : newDetails.fragments;\n  const oldFrags = oldDetails.fragmentHint\n    ? oldDetails.fragments.concat(oldDetails.fragmentHint)\n    : oldDetails.fragments;\n\n  for (let i = start; i <= end; i++) {\n    const oldFrag = oldFrags[delta + i];\n    let newFrag = newFrags[i];\n    if (skippedSegments && (!newFrag as any) && (oldFrag as any)) {\n      // Fill in skipped segments in delta playlist\n      newFrag = newDetails.fragments[i] = oldFrag;\n    }\n    if ((oldFrag as any) && (newFrag as any)) {\n      intersectionFn(oldFrag, newFrag, i, newFrags);\n      const uriBefore = oldFrag.relurl;\n      const uriAfter = newFrag.relurl;\n      if (uriBefore && notEqualAfterStrippingQueries(uriBefore, uriAfter)) {\n        newDetails.playlistParsingError = getSequenceError(\n          `media sequence mismatch ${newFrag.sn}:`,\n          oldDetails,\n          newDetails,\n          oldFrag,\n          newFrag,\n        );\n        return;\n      } else if (oldFrag.cc !== newFrag.cc) {\n        newDetails.playlistParsingError = getSequenceError(\n          `discontinuity sequence mismatch (${oldFrag.cc}!=${newFrag.cc})`,\n          oldDetails,\n          newDetails,\n          oldFrag,\n          newFrag,\n        );\n        return;\n      }\n    }\n  }\n}\n\nfunction getSequenceError(\n  message: string,\n  oldDetails: LevelDetails,\n  newDetails: LevelDetails,\n  oldFrag: MediaFragment,\n  newFrag: MediaFragment,\n): Error {\n  return new Error(\n    `${message} ${newFrag.url}\nPlaylist starting @${oldDetails.startSN}\n${oldDetails.m3u8}\n\nPlaylist starting @${newDetails.startSN}\n${newDetails.m3u8}`,\n  );\n}\n\nexport function adjustSliding(\n  oldDetails: LevelDetails,\n  newDetails: LevelDetails,\n  matchingStableVariantOrRendition: boolean = true,\n): void {\n  const delta =\n    newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN;\n  const oldFragments = oldDetails.fragments;\n  const advancedOrStable = delta >= 0;\n  let sliding = 0;\n  if (advancedOrStable && delta < oldFragments.length) {\n    sliding = oldFragments[delta].start;\n  } else if (advancedOrStable && newDetails.startSN === oldDetails.endSN + 1) {\n    sliding = oldDetails.fragmentEnd;\n  } else if (advancedOrStable && matchingStableVariantOrRendition) {\n    // align with expected position (updated playlist start sequence is past end sequence of last update)\n    sliding = oldDetails.fragmentStart + delta * newDetails.levelTargetDuration;\n  } else if (!newDetails.skippedSegments && newDetails.fragmentStart === 0) {\n    // align new start with old (playlist switch has a sequence with no overlap and should not be used for alignment)\n    sliding = oldDetails.fragmentStart;\n  } else {\n    // new details already has a sliding offset or has skipped segments\n    return;\n  }\n  addSliding(newDetails, sliding);\n}\n\nexport function addSliding(details: LevelDetails, sliding: number) {\n  if (sliding) {\n    const fragments = details.fragments;\n    for (let i = details.skippedSegments; i < fragments.length; i++) {\n      fragments[i].addStart(sliding);\n    }\n    if (details.fragmentHint) {\n      details.fragmentHint.addStart(sliding);\n    }\n  }\n}\n\nexport function computeReloadInterval(\n  newDetails: LevelDetails,\n  distanceToLiveEdgeMs: number = Infinity,\n): number {\n  let reloadInterval = 1000 * newDetails.targetduration;\n\n  if (newDetails.updated) {\n    // Use last segment duration when shorter than target duration and near live edge\n    const fragments = newDetails.fragments;\n    const liveEdgeMaxTargetDurations = 4;\n    if (\n      fragments.length &&\n      reloadInterval * liveEdgeMaxTargetDurations > distanceToLiveEdgeMs\n    ) {\n      const lastSegmentDuration =\n        fragments[fragments.length - 1].duration * 1000;\n      if (lastSegmentDuration < reloadInterval) {\n        reloadInterval = lastSegmentDuration;\n      }\n    }\n  } else {\n    // estimate = 'miss half average';\n    // follow HLS Spec, If the client reloads a Playlist file and finds that it has not\n    // changed then it MUST wait for a period of one-half the target\n    // duration before retrying.\n    reloadInterval /= 2;\n  }\n\n  return Math.round(reloadInterval);\n}\n\nexport function getFragmentWithSN(\n  details: LevelDetails | undefined,\n  sn: number,\n  fragCurrent?: Fragment | null,\n): MediaFragment | null {\n  if (!details) {\n    return null;\n  }\n  let fragment = details.fragments[sn - details.startSN] as\n    | MediaFragment\n    | undefined;\n  if (fragment) {\n    return fragment;\n  }\n  fragment = details.fragmentHint;\n  if (fragment && fragment.sn === sn) {\n    return fragment;\n  }\n  if (sn < details.startSN && fragCurrent && fragCurrent.sn === sn) {\n    return fragCurrent as MediaFragment;\n  }\n  return null;\n}\n\nexport function getPartWith(\n  details: LevelDetails | undefined,\n  sn: number,\n  partIndex: number,\n): Part | null {\n  if (!details) {\n    return null;\n  }\n  return findPart(details.partList, sn, partIndex);\n}\n\nexport function findPart(\n  partList: Part[] | null | undefined,\n  sn: number,\n  partIndex: number,\n): Part | null {\n  if (partList) {\n    for (let i = partList.length; i--; ) {\n      const part = partList[i];\n      if (part.index === partIndex && part.fragment.sn === sn) {\n        return part;\n      }\n    }\n  }\n  return null;\n}\n\nexport function reassignFragmentLevelIndexes(levels: Level[]) {\n  levels.forEach((level, index) => {\n    level.details?.fragments.forEach((fragment) => {\n      fragment.level = index;\n      if (fragment.initSegment) {\n        fragment.initSegment.level = index;\n      }\n    });\n  });\n}\n\nfunction notEqualAfterStrippingQueries(\n  uriBefore: string,\n  uriAfter: string | undefined,\n): boolean {\n  if (uriBefore !== uriAfter && uriAfter) {\n    return stripQuery(uriBefore) !== stripQuery(uriAfter);\n  }\n  return false;\n}\n\nfunction stripQuery(uri: string): string {\n  return uri.replace(/\\?[^?]*$/, '');\n}\n", "import { adjustSliding } from './level-helper';\nimport { logger } from './logger';\nimport type { Fragment } from '../loader/fragment';\nimport type { LevelDetails } from '../loader/level-details';\n\nexport function findFirstFragWithCC(\n  fragments: Fragment[],\n  cc: number,\n): Fragment | null {\n  for (let i = 0, len = fragments.length; i < len; i++) {\n    if (fragments[i]?.cc === cc) {\n      return fragments[i];\n    }\n  }\n  return null;\n}\n\nexport function shouldAlignOnDiscontinuities(\n  refDetails: LevelDetails | undefined,\n  details: LevelDetails,\n): refDetails is LevelDetails & boolean {\n  if (refDetails) {\n    if (\n      details.startCC < refDetails.endCC &&\n      details.endCC > refDetails.startCC\n    ) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction adjustFragmentStart(frag: Fragment, sliding: number) {\n  const start = frag.start + sliding;\n  frag.startPTS = start;\n  frag.setStart(start);\n  frag.endPTS = start + frag.duration;\n}\n\nexport function adjustSlidingStart(sliding: number, details: LevelDetails) {\n  // Update segments\n  const fragments = details.fragments;\n  for (let i = 0, len = fragments.length; i < len; i++) {\n    adjustFragmentStart(fragments[i], sliding);\n  }\n  // Update LL-HLS parts at the end of the playlist\n  if (details.fragmentHint) {\n    adjustFragmentStart(details.fragmentHint, sliding);\n  }\n  details.alignedSliding = true;\n}\n\n/**\n * Using the parameters of the last level, this function computes PTS' of the new fragments so that they form a\n * contiguous stream with the last fragments.\n * The PTS of a fragment lets Hls.js know where it fits into a stream - by knowing every PTS, we know which fragment to\n * download at any given time. PTS is normally computed when the fragment is demuxed, so taking this step saves us time\n * and an extra download.\n * @param lastLevel\n * @param details\n */\nexport function alignStream(\n  switchDetails: LevelDetails | undefined,\n  details: LevelDetails,\n) {\n  if (!switchDetails) {\n    return;\n  }\n  alignDiscontinuities(details, switchDetails);\n  if (!details.alignedSliding) {\n    // If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level.\n    // Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same\n    // discontinuity sequence.\n    alignMediaPlaylistByPDT(details, switchDetails);\n  }\n  if (!details.alignedSliding && !details.skippedSegments) {\n    // Try to align on sn so that we pick a better start fragment.\n    // Do not perform this on playlists with delta updates as this is only to align levels on switch\n    // and adjustSliding only adjusts fragments after skippedSegments.\n    adjustSliding(switchDetails, details, false);\n  }\n}\n\n/**\n * Ajust the start of fragments in `details` by the difference in time between fragments of the latest\n * shared discontinuity sequence change.\n * @param lastLevel - The details of the last loaded level\n * @param details - The details of the new level\n */\nexport function alignDiscontinuities(\n  details: LevelDetails,\n  refDetails: LevelDetails | undefined,\n) {\n  if (!shouldAlignOnDiscontinuities(refDetails, details)) {\n    return;\n  }\n  const targetCC = Math.min(refDetails.endCC, details.endCC);\n  const refFrag = findFirstFragWithCC(refDetails.fragments, targetCC);\n  const frag = findFirstFragWithCC(details.fragments, targetCC);\n  if (!refFrag || !frag) {\n    return;\n  }\n  logger.log(`Aligning playlist at start of dicontinuity sequence ${targetCC}`);\n  const delta = refFrag.start - frag.start;\n  adjustSlidingStart(delta, details);\n}\n\n/**\n * Ensures appropriate time-alignment between renditions based on PDT.\n * This function assumes the timelines represented in `refDetails` are accurate, including the PDTs\n * for the last discontinuity sequence number shared by both playlists when present,\n * and uses the \"wallclock\"/PDT timeline as a cross-reference to `details`, adjusting the presentation\n * times/timelines of `details` accordingly.\n * Given the asynchronous nature of fetches and initial loads of live `main` and audio/subtitle tracks,\n * the primary purpose of this function is to ensure the \"local timelines\" of audio/subtitle tracks\n * are aligned to the main/video timeline, using PDT as the cross-reference/\"anchor\" that should\n * be consistent across playlists, per the HLS spec.\n * @param details - The details of the rendition you'd like to time-align (e.g. an audio rendition).\n * @param refDetails - The details of the reference rendition with start and PDT times for alignment.\n */\nexport function alignMediaPlaylistByPDT(\n  details: LevelDetails,\n  refDetails: LevelDetails,\n) {\n  if (!details.hasProgramDateTime || !refDetails.hasProgramDateTime) {\n    return;\n  }\n\n  const fragments = details.fragments;\n  const refFragments = refDetails.fragments;\n  if (!fragments.length || !refFragments.length) {\n    return;\n  }\n\n  // Calculate a delta to apply to all fragments according to the delta in PDT times and start times\n  // of a fragment in the reference details, and a fragment in the target details of the same discontinuity.\n  // If a fragment of the same discontinuity was not found use the middle fragment of both.\n  let refFrag: Fragment | null | undefined;\n  let frag: Fragment | null | undefined;\n  const targetCC = Math.min(refDetails.endCC, details.endCC);\n  if (refDetails.startCC < targetCC && details.startCC < targetCC) {\n    refFrag = findFirstFragWithCC(refFragments, targetCC);\n    frag = findFirstFragWithCC(fragments, targetCC);\n  }\n  if (!refFrag || !frag) {\n    refFrag = refFragments[Math.floor(refFragments.length / 2)];\n    frag =\n      findFirstFragWithCC(fragments, refFrag.cc) ||\n      fragments[Math.floor(fragments.length / 2)];\n  }\n  const refPDT = refFrag.programDateTime;\n  const targetPDT = frag.programDateTime;\n  if (!refPDT || !targetPDT) {\n    return;\n  }\n\n  const delta = (targetPDT - refPDT) / 1000 - (frag.start - refFrag.start);\n  adjustSlidingStart(delta, details);\n}\n", "export function addEventListener(\n  el: EventTarget,\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n) {\n  removeEventListener(el, type, listener);\n  el.addEventListener(type, listener);\n}\n\nexport function removeEventListener(\n  el: EventTarget,\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n) {\n  el.removeEventListener(type, listener);\n}\n", "/**\n *  TimeRanges to string helper\n */\n\nconst TimeRanges = {\n  toString: function (r: TimeRanges) {\n    let log = '';\n    const len = r.length;\n    for (let i = 0; i < len; i++) {\n      log += `[${r.start(i).toFixed(3)}-${r.end(i).toFixed(3)}]`;\n    }\n\n    return log;\n  },\n};\n\nexport default TimeRanges;\n", "import { ErrorActionFlags, NetworkErrorAction } from './error-controller';\nimport {\n  findFragmentByPDT,\n  findFragmentByPTS,\n  findNearestWithCC,\n} from './fragment-finders';\nimport { FragmentState } from './fragment-tracker';\nimport Decrypter from '../crypt/decrypter';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport {\n  type Fragment,\n  isMediaFragment,\n  type MediaFragment,\n  type Part,\n} from '../loader/fragment';\nimport FragmentLoader from '../loader/fragment-loader';\nimport TaskLoop from '../task-loop';\nimport { PlaylistLevelType } from '../types/loader';\nimport { ChunkMetadata } from '../types/transmuxer';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport { alignStream } from '../utils/discontinuities';\nimport {\n  getAesModeFromFullSegmentMethod,\n  isFullSegmentEncryption,\n} from '../utils/encryption-methods-util';\nimport {\n  getRetryDelay,\n  isUnusableKeyError,\n  offlineHttpStatus,\n} from '../utils/error-helper';\nimport {\n  addEventListener,\n  removeEventListener,\n} from '../utils/event-listener-helper';\nimport {\n  findPart,\n  getFragmentWithSN,\n  getPartWith,\n  updateFragPTSDTS,\n} from '../utils/level-helper';\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport TimeRanges from '../utils/time-ranges';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type { HlsConfig } from '../config';\nimport type TransmuxerInterface from '../demux/transmuxer-interface';\nimport type Hls from '../hls';\nimport type {\n  FragmentLoadProgressCallback,\n  LoadError,\n} from '../loader/fragment-loader';\nimport type KeyLoader from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { SourceBufferName } from '../types/buffer';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  BufferAppendingData,\n  BufferFlushingData,\n  ErrorData,\n  FragLoadedData,\n  KeyLoadedData,\n  ManifestLoadedData,\n  MediaAttachedData,\n  MediaDetachingData,\n  PartsLoadedData,\n} from '../types/events';\nimport type { Level } from '../types/level';\nimport type { InitSegmentData, RemuxedTrack } from '../types/remuxer';\nimport type { Bufferable, BufferInfo } from '../utils/buffer-helper';\nimport type { TimestampOffset } from '../utils/timescale-conversion';\n\ntype ResolveFragLoaded = (FragLoadedEndData) => void;\ntype RejectFragLoaded = (LoadError) => void;\n\nexport const State = {\n  STOPPED: 'STOPPED',\n  IDLE: 'IDLE',\n  KEY_LOADING: 'KEY_LOADING',\n  FRAG_LOADING: 'FRAG_LOADING',\n  FRAG_LOADING_WAITING_RETRY: 'FRAG_LOADING_WAITING_RETRY',\n  WAITING_TRACK: 'WAITING_TRACK',\n  PARSING: 'PARSING',\n  PARSED: 'PARSED',\n  ENDED: 'ENDED',\n  ERROR: 'ERROR',\n  WAITING_INIT_PTS: 'WAITING_INIT_PTS',\n  WAITING_LEVEL: 'WAITING_LEVEL',\n};\n\nexport type InFlightData = {\n  frag: Fragment | null;\n  state: (typeof State)[keyof typeof State];\n};\n\nexport default class BaseStreamController\n  extends TaskLoop\n  implements NetworkComponentAPI\n{\n  protected hls: Hls;\n\n  protected fragPrevious: MediaFragment | null = null;\n  protected fragCurrent: Fragment | null = null;\n  protected fragmentTracker: FragmentTracker;\n  protected transmuxer: TransmuxerInterface | null = null;\n  protected _state: (typeof State)[keyof typeof State] = State.STOPPED;\n  protected playlistType: PlaylistLevelType;\n  protected media: HTMLMediaElement | null = null;\n  protected mediaBuffer: Bufferable | null = null;\n  protected config: HlsConfig;\n  protected bitrateTest: boolean = false;\n  protected lastCurrentTime: number = 0;\n  protected nextLoadPosition: number = 0;\n  protected startPosition: number = 0;\n  protected startTimeOffset: number | null = null;\n  protected retryDate: number = 0;\n  protected levels: Array<Level> | null = null;\n  protected fragmentLoader: FragmentLoader;\n  protected keyLoader: KeyLoader;\n  protected levelLastLoaded: Level | null = null;\n  protected startFragRequested: boolean = false;\n  protected decrypter: Decrypter;\n  protected initPTS: TimestampOffset[] = [];\n  protected buffering: boolean = true;\n  protected loadingParts: boolean = false;\n  private loopSn?: string | number;\n\n  constructor(\n    hls: Hls,\n    fragmentTracker: FragmentTracker,\n    keyLoader: KeyLoader,\n    logPrefix: string,\n    playlistType: PlaylistLevelType,\n  ) {\n    super(logPrefix, hls.logger);\n    this.playlistType = playlistType;\n    this.hls = hls;\n    this.fragmentLoader = new FragmentLoader(hls.config);\n    this.keyLoader = keyLoader;\n    this.fragmentTracker = fragmentTracker;\n    this.config = hls.config;\n    this.decrypter = new Decrypter(hls.config);\n  }\n\n  protected registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  protected unregisterListeners() {\n    const { hls } = this;\n    hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  protected doTick() {\n    this.onTickEnd();\n  }\n\n  protected onTickEnd() {}\n\n  public startLoad(startPosition: number): void {}\n\n  public stopLoad() {\n    if (this.state === State.STOPPED) {\n      return;\n    }\n    this.fragmentLoader.abort();\n    this.keyLoader.abort(this.playlistType);\n    const frag = this.fragCurrent;\n    if (frag?.loader) {\n      frag.abortRequests();\n      this.fragmentTracker.removeFragment(frag);\n    }\n    this.resetTransmuxer();\n    this.fragCurrent = null;\n    this.fragPrevious = null;\n    this.clearInterval();\n    this.clearNextTick();\n    this.state = State.STOPPED;\n  }\n\n  public get startPositionValue(): number {\n    const { nextLoadPosition, startPosition } = this;\n    if (startPosition === -1 && nextLoadPosition) {\n      return nextLoadPosition;\n    }\n    return startPosition;\n  }\n\n  public get bufferingEnabled(): boolean {\n    return this.buffering;\n  }\n\n  public pauseBuffering() {\n    this.buffering = false;\n  }\n\n  public resumeBuffering() {\n    this.buffering = true;\n  }\n\n  public get inFlightFrag(): InFlightData {\n    return { frag: this.fragCurrent, state: this.state };\n  }\n\n  protected _streamEnded(\n    bufferInfo: BufferInfo,\n    levelDetails: LevelDetails,\n  ): boolean {\n    // Stream is never \"ended\" when playlist is live or media is detached\n    if (levelDetails.live || !this.media) {\n      return false;\n    }\n    // Stream is not \"ended\" when nothing is buffered past the start\n    const bufferEnd = bufferInfo.end || 0;\n    const timelineStart = this.config.timelineOffset || 0;\n    if (bufferEnd <= timelineStart) {\n      return false;\n    }\n    // Stream is not \"ended\" when there is a second buffered range starting before the end of the playlist\n    const bufferedRanges = bufferInfo.buffered;\n    if (\n      this.config.maxBufferHole &&\n      bufferedRanges &&\n      bufferedRanges.length > 1\n    ) {\n      // make sure bufferInfo accounts for any gaps\n      bufferInfo = BufferHelper.bufferedInfo(\n        bufferedRanges,\n        bufferInfo.start,\n        0,\n      );\n    }\n    const nextStart = bufferInfo.nextStart;\n    const hasSecondBufferedRange =\n      nextStart && nextStart > timelineStart && nextStart < levelDetails.edge;\n    if (hasSecondBufferedRange) {\n      return false;\n    }\n    // Playhead is in unbuffered region. Marking EoS now could result in Safari failing to dispatch \"ended\" event following seek on start.\n    if (this.media.currentTime < bufferInfo.start) {\n      return false;\n    }\n    const partList = levelDetails.partList;\n    // Since the last part isn't guaranteed to correspond to the last playlist segment for Low-Latency HLS,\n    // check instead if the last part is buffered.\n    if (partList?.length) {\n      const lastPart = partList[partList.length - 1];\n\n      // Checking the midpoint of the part for potential margin of error and related issues.\n      // NOTE: Technically I believe parts could yield content that is < the computed duration (including potential a duration of 0)\n      // and still be spec-compliant, so there may still be edge cases here. Likewise, there could be issues in end of stream\n      // part mismatches for independent audio and video playlists/segments.\n      const lastPartBuffered = BufferHelper.isBuffered(\n        this.media,\n        lastPart.start + lastPart.duration / 2,\n      );\n      return lastPartBuffered;\n    }\n\n    const playlistType =\n      levelDetails.fragments[levelDetails.fragments.length - 1].type;\n    return this.fragmentTracker.isEndListAppended(playlistType);\n  }\n\n  public getLevelDetails(): LevelDetails | undefined {\n    if (this.levels && this.levelLastLoaded !== null) {\n      return this.levelLastLoaded.details;\n    }\n  }\n\n  protected get timelineOffset(): number {\n    const configuredTimelineOffset = this.config.timelineOffset;\n    if (configuredTimelineOffset) {\n      return (\n        this.getLevelDetails()?.appliedTimelineOffset ||\n        configuredTimelineOffset\n      );\n    }\n    return 0;\n  }\n\n  protected onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) {\n    const media = (this.media = this.mediaBuffer = data.media);\n    addEventListener(media, 'seeking', this.onMediaSeeking);\n    addEventListener(media, 'ended', this.onMediaEnded);\n    const config = this.config;\n    if (this.levels && config.autoStartLoad && this.state === State.STOPPED) {\n      this.startLoad(config.startPosition);\n    }\n  }\n\n  protected onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    const transferringMedia = !!data.transferMedia;\n    const media = this.media;\n    if (media === null) {\n      return;\n    }\n    if (media.ended) {\n      this.log('MSE detaching and video ended, reset startPosition');\n      this.startPosition = this.lastCurrentTime = 0;\n    }\n\n    // remove video listeners\n    removeEventListener(media, 'seeking', this.onMediaSeeking);\n    removeEventListener(media, 'ended', this.onMediaEnded);\n\n    if (this.keyLoader && !transferringMedia) {\n      this.keyLoader.detach();\n    }\n    this.media = this.mediaBuffer = null;\n    this.loopSn = undefined;\n    if (transferringMedia) {\n      this.resetLoadingState();\n      this.resetTransmuxer();\n      return;\n    }\n    this.loadingParts = false;\n    this.fragmentTracker.removeAllFragments();\n    this.stopLoad();\n  }\n\n  protected onManifestLoading() {\n    this.initPTS = [];\n    this.levels = this.levelLastLoaded = this.fragCurrent = null;\n    this.lastCurrentTime = this.startPosition = 0;\n    this.startFragRequested = false;\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData) {}\n\n  protected onMediaSeeking = () => {\n    const { config, fragCurrent, media, mediaBuffer, state } = this;\n    const currentTime: number = media ? media.currentTime : 0;\n    const bufferInfo = BufferHelper.bufferInfo(\n      mediaBuffer ? mediaBuffer : media,\n      currentTime,\n      config.maxBufferHole,\n    );\n    const noFowardBuffer = !bufferInfo.len;\n\n    this.log(\n      `Media seeking to ${\n        Number.isFinite(currentTime) ? currentTime.toFixed(3) : currentTime\n      }, state: ${state}, ${noFowardBuffer ? 'out of' : 'in'} buffer`,\n    );\n\n    if (this.state === State.ENDED) {\n      this.resetLoadingState();\n    } else if (fragCurrent) {\n      // Seeking while frag load is in progress\n      const tolerance = config.maxFragLookUpTolerance;\n      const fragStartOffset = fragCurrent.start - tolerance;\n      const fragEndOffset =\n        fragCurrent.start + fragCurrent.duration + tolerance;\n      // if seeking out of buffered range or into new one\n      if (\n        noFowardBuffer ||\n        fragEndOffset < bufferInfo.start ||\n        fragStartOffset > bufferInfo.end\n      ) {\n        const pastFragment = currentTime > fragEndOffset;\n        // if the seek position is outside the current fragment range\n        if (currentTime < fragStartOffset || pastFragment) {\n          if (pastFragment && fragCurrent.loader) {\n            this.log(\n              `Cancelling fragment load for seek (sn: ${fragCurrent.sn})`,\n            );\n            fragCurrent.abortRequests();\n            this.resetLoadingState();\n          }\n          this.fragPrevious = null;\n        }\n      }\n    }\n\n    if (media) {\n      // Remove gap fragments\n      this.fragmentTracker.removeFragmentsInRange(\n        currentTime,\n        Infinity,\n        this.playlistType,\n        true,\n      );\n\n      // Don't set lastCurrentTime with backward seeks (allows for frag selection with strict tolerances)\n      const lastCurrentTime = this.lastCurrentTime;\n      if (currentTime > lastCurrentTime) {\n        this.lastCurrentTime = currentTime;\n      }\n\n      if (!this.loadingParts) {\n        const bufferEnd = Math.max(bufferInfo.end, currentTime);\n        const shouldLoadParts = this.shouldLoadParts(\n          this.getLevelDetails(),\n          bufferEnd,\n        );\n        if (shouldLoadParts) {\n          this.log(\n            `LL-Part loading ON after seeking to ${currentTime.toFixed(\n              2,\n            )} with buffer @${bufferEnd.toFixed(2)}`,\n          );\n          this.loadingParts = shouldLoadParts;\n        }\n      }\n    }\n\n    // in case seeking occurs although no media buffered, adjust startPosition and nextLoadPosition to seek target\n    if (!this.hls.hasEnoughToStart) {\n      this.log(\n        `Setting ${noFowardBuffer ? 'startPosition' : 'nextLoadPosition'} to ${currentTime} for seek without enough to start`,\n      );\n      this.nextLoadPosition = currentTime;\n      if (noFowardBuffer) {\n        this.startPosition = currentTime;\n      }\n    }\n\n    if (noFowardBuffer && this.state === State.IDLE) {\n      // Async tick to speed up processing\n      this.tickImmediate();\n    }\n  };\n\n  protected onMediaEnded = () => {\n    // reset startPosition and lastCurrentTime to restart playback @ stream beginning\n    this.log(`setting startPosition to 0 because media ended`);\n    this.startPosition = this.lastCurrentTime = 0;\n  };\n\n  protected onManifestLoaded(\n    event: Events.MANIFEST_LOADED,\n    data: ManifestLoadedData,\n  ): void {\n    this.startTimeOffset = data.startTimeOffset;\n  }\n\n  protected onHandlerDestroying() {\n    this.stopLoad();\n    if (this.transmuxer) {\n      this.transmuxer.destroy();\n      this.transmuxer = null;\n    }\n    super.onHandlerDestroying();\n    // @ts-ignore\n    this.hls = this.onMediaSeeking = this.onMediaEnded = null;\n  }\n\n  protected onHandlerDestroyed() {\n    this.state = State.STOPPED;\n    if (this.fragmentLoader) {\n      this.fragmentLoader.destroy();\n    }\n    if (this.keyLoader) {\n      this.keyLoader.destroy();\n    }\n    if (this.decrypter) {\n      this.decrypter.destroy();\n    }\n\n    this.hls =\n      this.log =\n      this.warn =\n      this.decrypter =\n      this.keyLoader =\n      this.fragmentLoader =\n      this.fragmentTracker =\n        null as any;\n    super.onHandlerDestroyed();\n  }\n\n  protected loadFragment(\n    frag: MediaFragment,\n    level: Level,\n    targetBufferTime: number,\n  ) {\n    this.startFragRequested = true;\n    this._loadFragForPlayback(frag, level, targetBufferTime);\n  }\n\n  private _loadFragForPlayback(\n    fragment: MediaFragment,\n    level: Level,\n    targetBufferTime: number,\n  ) {\n    const progressCallback: FragmentLoadProgressCallback = (\n      data: FragLoadedData,\n    ) => {\n      const frag = data.frag;\n      if (this.fragContextChanged(frag)) {\n        this.warn(\n          `${frag.type} sn: ${frag.sn}${\n            data.part ? ' part: ' + data.part.index : ''\n          } of ${this.fragInfo(frag, false, data.part)}) was dropped during download.`,\n        );\n        this.fragmentTracker.removeFragment(frag);\n        return;\n      }\n      frag.stats.chunkCount++;\n      this._handleFragmentLoadProgress(data);\n    };\n\n    this._doFragLoad(fragment, level, targetBufferTime, progressCallback)\n      .then((data) => {\n        if (!data) {\n          // if we're here we probably needed to backtrack or are waiting for more parts\n          return;\n        }\n        const state = this.state;\n        const frag = data.frag;\n        if (this.fragContextChanged(frag)) {\n          if (\n            state === State.FRAG_LOADING ||\n            (!this.fragCurrent && state === State.PARSING)\n          ) {\n            this.fragmentTracker.removeFragment(frag);\n            this.state = State.IDLE;\n          }\n          return;\n        }\n\n        if ('payload' in data) {\n          this.log(\n            `Loaded ${frag.type} sn: ${frag.sn} of ${this.playlistLabel()} ${frag.level}`,\n          );\n          this.hls.trigger(Events.FRAG_LOADED, data);\n        }\n\n        // Pass through the whole payload; controllers not implementing progressive loading receive data from this callback\n        this._handleFragmentLoadComplete(data);\n      })\n      .catch((reason) => {\n        if (this.state === State.STOPPED || this.state === State.ERROR) {\n          return;\n        }\n        this.warn(`Frag error: ${reason?.message || reason}`);\n        this.resetFragmentLoading(fragment);\n      });\n  }\n\n  protected clearTrackerIfNeeded(frag: Fragment) {\n    const { fragmentTracker } = this;\n    const fragState = fragmentTracker.getState(frag);\n    if (fragState === FragmentState.APPENDING) {\n      // Lower the max buffer length and try again\n      const playlistType = frag.type as PlaylistLevelType;\n      const bufferedInfo = this.getFwdBufferInfo(\n        this.mediaBuffer,\n        playlistType,\n      );\n      const minForwardBufferLength = Math.max(\n        frag.duration,\n        bufferedInfo ? bufferedInfo.len : this.config.maxBufferLength,\n      );\n      // If backtracking, always remove from the tracker without reducing max buffer length\n      const backtrackFragment = (this as any).backtrackFragment as\n        | Fragment\n        | undefined;\n      const backtracked = backtrackFragment\n        ? (frag.sn as number) - (backtrackFragment.sn as number)\n        : 0;\n      if (\n        backtracked === 1 ||\n        this.reduceMaxBufferLength(minForwardBufferLength, frag.duration)\n      ) {\n        fragmentTracker.removeFragment(frag);\n      }\n    } else if (this.mediaBuffer?.buffered.length === 0) {\n      // Stop gap for bad tracker / buffer flush behavior\n      fragmentTracker.removeAllFragments();\n    } else if (fragmentTracker.hasParts(frag.type)) {\n      // In low latency mode, remove fragments for which only some parts were buffered\n      fragmentTracker.detectPartialFragments({\n        frag,\n        part: null,\n        stats: frag.stats,\n        id: frag.type,\n      });\n      if (fragmentTracker.getState(frag) === FragmentState.PARTIAL) {\n        fragmentTracker.removeFragment(frag);\n      }\n    }\n  }\n\n  protected checkLiveUpdate(details: LevelDetails) {\n    if (details.updated && !details.live) {\n      // Live stream ended, update fragment tracker\n      const lastFragment = details.fragments[details.fragments.length - 1];\n      this.fragmentTracker.detectPartialFragments({\n        frag: lastFragment,\n        part: null,\n        stats: lastFragment.stats,\n        id: lastFragment.type,\n      });\n    }\n    if (!details.fragments[0]) {\n      details.deltaUpdateFailed = true;\n    }\n  }\n\n  protected waitForLive(levelInfo: Level) {\n    const details = levelInfo.details;\n    return (\n      details?.live &&\n      details.type !== 'EVENT' &&\n      (this.levelLastLoaded !== levelInfo || details.expired)\n    );\n  }\n\n  protected flushMainBuffer(\n    startOffset: number,\n    endOffset: number,\n    type: SourceBufferName | null = null,\n  ) {\n    if (!(startOffset - endOffset)) {\n      return;\n    }\n    // When alternate audio is playing, the audio-stream-controller is responsible for the audio buffer. Otherwise,\n    // passing a null type flushes both buffers\n    const flushScope: BufferFlushingData = { startOffset, endOffset, type };\n    this.hls.trigger(Events.BUFFER_FLUSHING, flushScope);\n  }\n\n  protected _loadInitSegment(fragment: Fragment, level: Level) {\n    this._doFragLoad(fragment, level)\n      .then((data) => {\n        const frag = data?.frag;\n        if (!frag || this.fragContextChanged(frag) || !this.levels) {\n          throw new Error('init load aborted');\n        }\n\n        return data;\n      })\n      .then((data: FragLoadedData) => {\n        const { hls } = this;\n        const { frag, payload } = data;\n        const decryptData = frag.decryptdata;\n\n        // check to see if the payload needs to be decrypted\n        if (\n          payload &&\n          payload.byteLength > 0 &&\n          decryptData?.key &&\n          decryptData.iv &&\n          isFullSegmentEncryption(decryptData.method)\n        ) {\n          const startTime = self.performance.now();\n          // decrypt init segment data\n          return this.decrypter\n            .decrypt(\n              new Uint8Array(payload),\n              decryptData.key.buffer,\n              decryptData.iv.buffer,\n              getAesModeFromFullSegmentMethod(decryptData.method),\n            )\n            .catch((err) => {\n              hls.trigger(Events.ERROR, {\n                type: ErrorTypes.MEDIA_ERROR,\n                details: ErrorDetails.FRAG_DECRYPT_ERROR,\n                fatal: false,\n                error: err,\n                reason: err.message,\n                frag,\n              });\n              throw err;\n            })\n            .then((decryptedData) => {\n              const endTime = self.performance.now();\n              hls.trigger(Events.FRAG_DECRYPTED, {\n                frag,\n                payload: decryptedData,\n                stats: {\n                  tstart: startTime,\n                  tdecrypt: endTime,\n                },\n              });\n              data.payload = decryptedData;\n              return this.completeInitSegmentLoad(data);\n            });\n        }\n        return this.completeInitSegmentLoad(data);\n      })\n      .catch((reason) => {\n        if (this.state === State.STOPPED || this.state === State.ERROR) {\n          return;\n        }\n        this.warn(reason);\n        this.resetFragmentLoading(fragment);\n      });\n  }\n\n  private completeInitSegmentLoad(data: FragLoadedData) {\n    const { levels } = this;\n    if (!levels) {\n      throw new Error('init load aborted, missing levels');\n    }\n    const stats = data.frag.stats;\n    if (this.state !== State.STOPPED) {\n      this.state = State.IDLE;\n    }\n    data.frag.data = new Uint8Array(data.payload);\n    stats.parsing.start = stats.buffering.start = self.performance.now();\n    stats.parsing.end = stats.buffering.end = self.performance.now();\n    this.tick();\n  }\n\n  protected unhandledEncryptionError(\n    initSegment: InitSegmentData,\n    frag: Fragment,\n  ): boolean {\n    const tracks = initSegment.tracks;\n    if (\n      tracks &&\n      !frag.encrypted &&\n      (tracks.audio?.encrypted || tracks.video?.encrypted) &&\n      (!this.config.emeEnabled || !this.keyLoader.emeController)\n    ) {\n      const media = this.media;\n      const error = new Error(\n        __USE_EME_DRM__\n          ? `Encrypted track with no key in ${this.fragInfo(frag)} (media ${media ? 'attached mediaKeys: ' + media.mediaKeys : 'detached'})`\n          : 'EME not supported (light build)',\n      );\n      this.warn(error.message);\n      // Ignore if media is detached or mediaKeys are set\n      if (!media || media.mediaKeys) {\n        return false;\n      }\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_KEYS,\n        fatal: !__USE_EME_DRM__,\n        error,\n        frag,\n      });\n      this.resetTransmuxer();\n      return true;\n    }\n    return false;\n  }\n\n  protected fragContextChanged(frag: Fragment | null) {\n    const { fragCurrent } = this;\n    return (\n      !frag ||\n      !fragCurrent ||\n      frag.sn !== fragCurrent.sn ||\n      frag.level !== fragCurrent.level\n    );\n  }\n\n  protected fragBufferedComplete(frag: Fragment, part: Part | null) {\n    const media = this.mediaBuffer ? this.mediaBuffer : this.media;\n    this.log(\n      `Buffered ${frag.type} sn: ${frag.sn}${\n        part ? ' part: ' + part.index : ''\n      } of ${this.fragInfo(frag, false, part)} > buffer:${\n        media\n          ? TimeRanges.toString(BufferHelper.getBuffered(media))\n          : '(detached)'\n      })`,\n    );\n    if (isMediaFragment(frag)) {\n      if (frag.type !== PlaylistLevelType.SUBTITLE) {\n        const el = frag.elementaryStreams;\n        if (!Object.keys(el).some((type) => !!el[type])) {\n          // empty segment\n          this.state = State.IDLE;\n          return;\n        }\n      }\n      const level = this.levels?.[frag.level];\n      if (level?.fragmentError) {\n        this.log(\n          `Resetting level fragment error count of ${level.fragmentError} on frag buffered`,\n        );\n        level.fragmentError = 0;\n      }\n    }\n    this.state = State.IDLE;\n  }\n\n  protected _handleFragmentLoadComplete(fragLoadedEndData: PartsLoadedData) {\n    const { transmuxer } = this;\n    if (!transmuxer) {\n      return;\n    }\n    const { frag, part, partsLoaded } = fragLoadedEndData;\n    // If we did not load parts, or loaded all parts, we have complete (not partial) fragment data\n    const complete =\n      !partsLoaded ||\n      partsLoaded.length === 0 ||\n      partsLoaded.some((fragLoaded) => !fragLoaded);\n    const chunkMeta = new ChunkMetadata(\n      frag.level,\n      frag.sn as number,\n      frag.stats.chunkCount + 1,\n      0,\n      part ? part.index : -1,\n      !complete,\n    );\n    transmuxer.flush(chunkMeta);\n  }\n\n  protected _handleFragmentLoadProgress(\n    frag: PartsLoadedData | FragLoadedData,\n  ) {}\n\n  protected _doFragLoad(\n    frag: Fragment,\n    level: Level,\n    targetBufferTime: number | null = null,\n    progressCallback?: FragmentLoadProgressCallback,\n  ): Promise<PartsLoadedData | FragLoadedData | null> {\n    this.fragCurrent = frag;\n    const details = level.details;\n    if (!this.levels || !details) {\n      throw new Error(\n        `frag load aborted, missing level${details ? '' : ' detail'}s`,\n      );\n    }\n\n    let keyLoadingPromise: Promise<KeyLoadedData | void> | null = null;\n    if (frag.encrypted && !frag.decryptdata?.key) {\n      this.log(\n        `Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${this.playlistLabel()} ${frag.level}`,\n      );\n      this.state = State.KEY_LOADING;\n      this.fragCurrent = frag;\n      keyLoadingPromise = this.keyLoader.load(frag).then((keyLoadedData) => {\n        if (!this.fragContextChanged(keyLoadedData.frag)) {\n          this.hls.trigger(Events.KEY_LOADED, keyLoadedData);\n          if (this.state === State.KEY_LOADING) {\n            this.state = State.IDLE;\n          }\n          return keyLoadedData;\n        }\n      });\n      this.hls.trigger(Events.KEY_LOADING, { frag });\n      if ((this.fragCurrent as Fragment | null) === null) {\n        this.log(`context changed in KEY_LOADING`);\n        return Promise.resolve(null);\n      }\n    } else if (!frag.encrypted) {\n      keyLoadingPromise = this.keyLoader.loadClear(\n        frag,\n        details.encryptedFragments,\n        this.startFragRequested,\n      );\n      if (keyLoadingPromise) {\n        this.log(`[eme] blocking frag load until media-keys acquired`);\n      }\n    }\n\n    const fragPrevious = this.fragPrevious;\n    if (\n      isMediaFragment(frag) &&\n      (!fragPrevious || frag.sn !== fragPrevious.sn)\n    ) {\n      const shouldLoadParts = this.shouldLoadParts(level.details, frag.end);\n      if (shouldLoadParts !== this.loadingParts) {\n        this.log(\n          `LL-Part loading ${\n            shouldLoadParts ? 'ON' : 'OFF'\n          } loading sn ${fragPrevious?.sn}->${frag.sn}`,\n        );\n        this.loadingParts = shouldLoadParts;\n      }\n    }\n    targetBufferTime = Math.max(frag.start, targetBufferTime || 0);\n    if (this.loadingParts && isMediaFragment(frag)) {\n      const partList = details.partList;\n      if (partList && progressCallback) {\n        if (targetBufferTime > details.fragmentEnd && details.fragmentHint) {\n          frag = details.fragmentHint;\n        }\n        const partIndex = this.getNextPart(partList, frag, targetBufferTime);\n        if (partIndex > -1) {\n          const part = partList[partIndex];\n          frag = this.fragCurrent = part.fragment;\n          this.log(\n            `Loading ${frag.type} sn: ${frag.sn} part: ${part.index} (${partIndex}/${partList.length - 1}) of ${this.fragInfo(frag, false, part)}) cc: ${\n              frag.cc\n            } [${details.startSN}-${details.endSN}], target: ${parseFloat(\n              targetBufferTime.toFixed(3),\n            )}`,\n          );\n          this.nextLoadPosition = part.start + part.duration;\n          this.state = State.FRAG_LOADING;\n          let result: Promise<PartsLoadedData | FragLoadedData | null>;\n          if (keyLoadingPromise) {\n            result = keyLoadingPromise\n              .then((keyLoadedData) => {\n                if (\n                  !keyLoadedData ||\n                  this.fragContextChanged(keyLoadedData.frag)\n                ) {\n                  return null;\n                }\n                return this.doFragPartsLoad(\n                  frag,\n                  part,\n                  level,\n                  progressCallback,\n                );\n              })\n              .catch((error) => this.handleFragLoadError(error));\n          } else {\n            result = this.doFragPartsLoad(\n              frag,\n              part,\n              level,\n              progressCallback,\n            ).catch((error: LoadError) => this.handleFragLoadError(error));\n          }\n          this.hls.trigger(Events.FRAG_LOADING, {\n            frag,\n            part,\n            targetBufferTime,\n          });\n          if (this.fragCurrent === null) {\n            return Promise.reject(\n              new Error(\n                `frag load aborted, context changed in FRAG_LOADING parts`,\n              ),\n            );\n          }\n          return result;\n        } else if (\n          !frag.url ||\n          this.loadedEndOfParts(partList, targetBufferTime)\n        ) {\n          // Fragment hint has no parts\n          return Promise.resolve(null);\n        }\n      }\n    }\n\n    if (isMediaFragment(frag) && this.loadingParts) {\n      this.log(\n        `LL-Part loading OFF after next part miss @${targetBufferTime.toFixed(\n          2,\n        )} Check buffer at sn: ${frag.sn} loaded parts: ${details.partList?.filter((p) => p.loaded).map((p) => `[${p.start}-${p.end}]`)}`,\n      );\n      this.loadingParts = false;\n    } else if (!frag.url) {\n      // Selected fragment hint for part but not loading parts\n      return Promise.resolve(null);\n    }\n\n    this.log(\n      `Loading ${frag.type} sn: ${frag.sn} of ${this.fragInfo(frag, false)}) cc: ${frag.cc} ${\n        '[' + details.startSN + '-' + details.endSN + ']'\n      }, target: ${parseFloat(targetBufferTime.toFixed(3))}`,\n    );\n    // Don't update nextLoadPosition for fragments which are not buffered\n    if (Number.isFinite(frag.sn as number) && !this.bitrateTest) {\n      this.nextLoadPosition = frag.start + frag.duration;\n    }\n    this.state = State.FRAG_LOADING;\n\n    // Load key before streaming fragment data\n    const dataOnProgress =\n      this.config.progressive && frag.type !== PlaylistLevelType.SUBTITLE;\n    let result: Promise<PartsLoadedData | FragLoadedData | null>;\n    if (dataOnProgress && keyLoadingPromise) {\n      result = keyLoadingPromise\n        .then((keyLoadedData) => {\n          if (!keyLoadedData || this.fragContextChanged(keyLoadedData.frag)) {\n            return null;\n          }\n          return this.fragmentLoader.load(frag, progressCallback);\n        })\n        .catch((error) => this.handleFragLoadError(error));\n    } else {\n      // load unencrypted fragment data with progress event,\n      // or handle fragment result after key and fragment are finished loading\n      result = Promise.all([\n        this.fragmentLoader.load(\n          frag,\n          dataOnProgress ? progressCallback : undefined,\n        ),\n        keyLoadingPromise,\n      ])\n        .then(([fragLoadedData]) => {\n          if (!dataOnProgress && progressCallback) {\n            progressCallback(fragLoadedData);\n          }\n          return fragLoadedData;\n        })\n        .catch((error) => this.handleFragLoadError(error));\n    }\n    this.hls.trigger(Events.FRAG_LOADING, { frag, targetBufferTime });\n    if (this.fragCurrent === null) {\n      return Promise.reject(\n        new Error(`frag load aborted, context changed in FRAG_LOADING`),\n      );\n    }\n    return result;\n  }\n\n  private doFragPartsLoad(\n    frag: Fragment,\n    fromPart: Part,\n    level: Level,\n    progressCallback: FragmentLoadProgressCallback,\n  ): Promise<PartsLoadedData | null> {\n    return new Promise(\n      (resolve: ResolveFragLoaded, reject: RejectFragLoaded) => {\n        const partsLoaded: FragLoadedData[] = [];\n        const initialPartList = level.details?.partList;\n        const loadPart = (part: Part) => {\n          this.fragmentLoader\n            .loadPart(frag, part, progressCallback)\n            .then((partLoadedData: FragLoadedData) => {\n              partsLoaded[part.index] = partLoadedData;\n              const loadedPart = partLoadedData.part as Part;\n              this.hls.trigger(Events.FRAG_LOADED, partLoadedData);\n              const nextPart =\n                getPartWith(level.details, frag.sn as number, part.index + 1) ||\n                findPart(initialPartList, frag.sn as number, part.index + 1);\n              if (nextPart) {\n                loadPart(nextPart);\n              } else {\n                return resolve({\n                  frag,\n                  part: loadedPart,\n                  partsLoaded,\n                });\n              }\n            })\n            .catch(reject);\n        };\n        loadPart(fromPart);\n      },\n    );\n  }\n\n  private handleFragLoadError(\n    error: LoadError | Error | (Error & { data: ErrorData }),\n  ) {\n    if ('data' in error) {\n      const data = error.data;\n      if (data.frag && data.details === ErrorDetails.INTERNAL_ABORTED) {\n        this.handleFragLoadAborted(data.frag, data.part);\n      } else if (data.frag && data.type === ErrorTypes.KEY_SYSTEM_ERROR) {\n        data.frag.abortRequests();\n        this.resetStartWhenNotLoaded();\n        this.resetFragmentLoading(data.frag);\n      } else {\n        this.hls.trigger(Events.ERROR, data as ErrorData);\n      }\n    } else {\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.INTERNAL_EXCEPTION,\n        err: error,\n        error,\n        fatal: true,\n      });\n    }\n    return null;\n  }\n\n  protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata) {\n    const context = this.getCurrentContext(chunkMeta);\n    if (!context || this.state !== State.PARSING) {\n      if (\n        !this.fragCurrent &&\n        this.state !== State.STOPPED &&\n        this.state !== State.ERROR\n      ) {\n        this.state = State.IDLE;\n      }\n      return;\n    }\n    const { frag, part, level } = context;\n    const now = self.performance.now();\n    frag.stats.parsing.end = now;\n    if (part) {\n      part.stats.parsing.end = now;\n    }\n    // See if part loading should be disabled/enabled based on buffer and playback position.\n    const levelDetails = this.getLevelDetails();\n    const loadingPartsAtEdge = levelDetails && frag.sn > levelDetails.endSN;\n    const shouldLoadParts =\n      loadingPartsAtEdge || this.shouldLoadParts(levelDetails, frag.end);\n    if (shouldLoadParts !== this.loadingParts) {\n      this.log(\n        `LL-Part loading ${\n          shouldLoadParts ? 'ON' : 'OFF'\n        } after parsing segment ending @${frag.end.toFixed(2)}`,\n      );\n      this.loadingParts = shouldLoadParts;\n    }\n    this.updateLevelTiming(frag, part, level, chunkMeta.partial);\n  }\n\n  private shouldLoadParts(\n    details: LevelDetails | undefined,\n    bufferEnd: number,\n  ): boolean {\n    if (this.config.lowLatencyMode) {\n      if (!details) {\n        return this.loadingParts;\n      }\n      if (details.partList) {\n        // Buffer must be ahead of first part + duration of parts after last segment\n        // and playback must be at or past segment adjacent to part list\n        const firstPart = details.partList[0];\n        // Loading of VTT subtitle parts is not implemented in subtitle-stream-controller (#7460)\n        if (firstPart.fragment.type === PlaylistLevelType.SUBTITLE) {\n          return false;\n        }\n        const safePartStart =\n          firstPart.end + (details.fragmentHint?.duration || 0);\n        if (bufferEnd >= safePartStart) {\n          const playhead = this.hls.hasEnoughToStart\n            ? this.media?.currentTime || this.lastCurrentTime\n            : this.getLoadPosition();\n          if (playhead > firstPart.start - firstPart.fragment.duration) {\n            return true;\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  protected getCurrentContext(\n    chunkMeta: ChunkMetadata,\n  ): { frag: MediaFragment; part: Part | null; level: Level } | null {\n    const { levels, fragCurrent } = this;\n    const { level: levelIndex, sn, part: partIndex } = chunkMeta;\n    if (!levels?.[levelIndex]) {\n      this.warn(\n        `Levels object was unset while buffering fragment ${sn} of ${this.playlistLabel()} ${levelIndex}. The current chunk will not be buffered.`,\n      );\n      return null;\n    }\n    const level = levels[levelIndex];\n    const levelDetails = level.details;\n\n    const part =\n      partIndex > -1 ? getPartWith(levelDetails, sn, partIndex) : null;\n    const frag = part\n      ? part.fragment\n      : getFragmentWithSN(levelDetails, sn, fragCurrent);\n    if (!frag) {\n      return null;\n    }\n    if (fragCurrent && fragCurrent !== frag) {\n      frag.stats = fragCurrent.stats;\n    }\n    return { frag, part, level };\n  }\n\n  protected bufferFragmentData(\n    data: RemuxedTrack,\n    frag: Fragment,\n    part: Part | null,\n    chunkMeta: ChunkMetadata,\n    noBacktracking?: boolean,\n  ) {\n    if (this.state !== State.PARSING) {\n      return;\n    }\n\n    const { data1, data2 } = data;\n    let buffer = data1;\n    if (data2) {\n      // Combine the moof + mdat so that we buffer with a single append\n      buffer = appendUint8Array(data1, data2);\n    }\n\n    if (!buffer.length) {\n      return;\n    }\n    const offsetTimestamp = this.initPTS[frag.cc] as\n      | TimestampOffset\n      | undefined;\n    const offset = offsetTimestamp\n      ? -offsetTimestamp.baseTime / offsetTimestamp.timescale\n      : undefined;\n    const segment: BufferAppendingData = {\n      type: data.type,\n      frag,\n      part,\n      chunkMeta,\n      offset,\n      parent: frag.type,\n      data: buffer,\n    };\n    this.hls.trigger(Events.BUFFER_APPENDING, segment);\n\n    if (data.dropped && data.independent && !part) {\n      if (noBacktracking) {\n        return;\n      }\n      // Clear buffer so that we reload previous segments sequentially if required\n      this.flushBufferGap(frag);\n    }\n  }\n\n  protected flushBufferGap(frag: Fragment) {\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    // If currentTime is not buffered, clear the back buffer so that we can backtrack as much as needed\n    if (!BufferHelper.isBuffered(media, media.currentTime)) {\n      this.flushMainBuffer(0, frag.start);\n      return;\n    }\n    // Remove back-buffer without interrupting playback to allow back tracking\n    const currentTime = media.currentTime;\n    const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n    const fragDuration = frag.duration;\n    const segmentFraction = Math.min(\n      this.config.maxFragLookUpTolerance * 2,\n      fragDuration * 0.25,\n    );\n    const start = Math.max(\n      Math.min(frag.start - segmentFraction, bufferInfo.end - segmentFraction),\n      currentTime + segmentFraction,\n    );\n    if (frag.start - start > segmentFraction) {\n      this.flushMainBuffer(start, frag.start);\n    }\n  }\n\n  protected getFwdBufferInfo(\n    bufferable: Bufferable | null,\n    type: PlaylistLevelType,\n  ): BufferInfo | null {\n    const pos = this.getLoadPosition();\n    if (!Number.isFinite(pos)) {\n      return null;\n    }\n    const backwardSeek = this.lastCurrentTime > pos;\n    const maxBufferHole =\n      backwardSeek || this.media?.paused ? 0 : this.config.maxBufferHole;\n    return this.getFwdBufferInfoAtPos(bufferable, pos, type, maxBufferHole);\n  }\n\n  protected getFwdBufferInfoAtPos(\n    bufferable: Bufferable | null,\n    pos: number,\n    type: PlaylistLevelType,\n    maxBufferHole: number,\n  ): BufferInfo | null {\n    const bufferInfo = BufferHelper.bufferInfo(bufferable, pos, maxBufferHole);\n    // Workaround flaw in getting forward buffer when maxBufferHole is smaller than gap at current pos\n    if (bufferInfo.len === 0 && bufferInfo.nextStart !== undefined) {\n      const bufferedFragAtPos = this.fragmentTracker.getBufferedFrag(pos, type);\n      if (\n        bufferedFragAtPos &&\n        (bufferInfo.nextStart <= bufferedFragAtPos.end || bufferedFragAtPos.gap)\n      ) {\n        const gapDuration = Math.max(\n          Math.min(bufferInfo.nextStart, bufferedFragAtPos.end) - pos,\n          maxBufferHole,\n        );\n        return BufferHelper.bufferInfo(bufferable, pos, gapDuration);\n      }\n    }\n    return bufferInfo;\n  }\n\n  protected getMaxBufferLength(levelBitrate?: number): number {\n    const { config } = this;\n    let maxBufLen: number;\n    if (levelBitrate) {\n      maxBufLen = Math.max(\n        (8 * config.maxBufferSize) / levelBitrate,\n        config.maxBufferLength,\n      );\n    } else {\n      maxBufLen = config.maxBufferLength;\n    }\n    return Math.min(maxBufLen, config.maxMaxBufferLength);\n  }\n\n  protected exceedsMaxBuffer(\n    bufferInfo: BufferInfo,\n    maxBufLen: number,\n    selected: Fragment,\n  ): boolean {\n    const nextStart = bufferInfo.nextStart;\n    if (nextStart && selected.start > nextStart) {\n      const bufferedRanges = bufferInfo.buffered;\n      if (bufferedRanges) {\n        let fullBufferLength = bufferInfo.len;\n        const bufferedIndex = bufferInfo.bufferedIndex;\n        for (let i = bufferedRanges.length - 1; i > bufferedIndex; i--) {\n          if (bufferedRanges[i].start < selected.start) {\n            fullBufferLength += bufferedRanges[i].end - bufferedRanges[i].start;\n          }\n        }\n        return fullBufferLength >= maxBufLen;\n      }\n    }\n    return false;\n  }\n\n  protected reduceMaxBufferLength(threshold: number, fragDuration: number) {\n    const config = this.config;\n    const minLength = Math.max(\n      Math.min(threshold - fragDuration, config.maxBufferLength),\n      fragDuration,\n    );\n    const reducedLength = Math.max(\n      threshold - fragDuration * 3,\n      config.maxMaxBufferLength / 2,\n      minLength,\n    );\n    if (reducedLength >= minLength) {\n      // reduce max buffer length as it might be too high. we do this to avoid loop flushing ...\n      config.maxMaxBufferLength = reducedLength;\n      this.warn(`Reduce max buffer length to ${reducedLength}s`);\n      return true;\n    }\n    return false;\n  }\n\n  protected getAppendedFrag(\n    position: number,\n    playlistType: PlaylistLevelType = PlaylistLevelType.MAIN,\n  ): Fragment | null {\n    const fragOrPart = (this.fragmentTracker as any)\n      ? this.fragmentTracker.getAppendedFrag(position, playlistType)\n      : null;\n    if (fragOrPart && 'fragment' in fragOrPart) {\n      return fragOrPart.fragment;\n    }\n    return fragOrPart;\n  }\n\n  protected getNextFragment(\n    pos: number,\n    levelDetails: LevelDetails,\n  ): Fragment | null {\n    const fragments = levelDetails.fragments;\n    const fragLen = fragments.length;\n\n    if (!fragLen) {\n      return null;\n    }\n\n    // find fragment index, contiguous with end of buffer position\n    const { config } = this;\n    const playlistStart = levelDetails.fragmentStart;\n    const canLoadParts = config.lowLatencyMode && !!levelDetails.partList;\n    let frag: MediaFragment | null = null;\n\n    if (levelDetails.live) {\n      const initialLiveManifestSize = config.initialLiveManifestSize;\n      if (fragLen < initialLiveManifestSize) {\n        this.warn(\n          `Not enough fragments to start playback (have: ${fragLen}, need: ${initialLiveManifestSize})`,\n        );\n        return null;\n      }\n      // The real fragment start times for a live stream are only known after the PTS range for that level is known.\n      // In order to discover the range, we load the best matching fragment for that level and demux it.\n      // Do not load using live logic if the starting frag is requested - we want to use getFragmentAtPosition() so that\n      // we get the fragment matching that start time\n      if (\n        (!levelDetails.PTSKnown &&\n          !this.startFragRequested &&\n          this.startPosition === -1) ||\n        pos < playlistStart\n      ) {\n        if (canLoadParts && !this.loadingParts) {\n          this.log(`LL-Part loading ON for initial live fragment`);\n          this.loadingParts = true;\n        }\n        frag = this.getInitialLiveFragment(levelDetails);\n        const configValue = this.config.startPosition;\n        const mainStart = this.hls.startPosition;\n        const liveSyncPosition = this.hls.liveSyncPosition;\n        const fragStart = frag?.start || 0;\n\n        let startPosition: number | undefined;\n        let reason: string | undefined;\n        if (mainStart !== -1 && mainStart >= playlistStart) {\n          startPosition = mainStart;\n          reason = mainStart === configValue ? 'config' : 'next load start';\n        } else if (liveSyncPosition !== null) {\n          startPosition = liveSyncPosition;\n          reason = 'live edge';\n        } else {\n          startPosition = pos;\n          reason = 'buffer pos';\n        }\n        if (startPosition < fragStart) {\n          startPosition = fragStart;\n          reason = 'live frag start';\n        }\n        if (startPosition < playlistStart) {\n          startPosition = playlistStart;\n          reason = 'playlist start';\n        }\n        if (\n          this.startPosition != startPosition ||\n          this.nextLoadPosition != startPosition\n        ) {\n          this.log(\n            `Setting startPosition to ${startPosition.toFixed(3)} ${mainStart === -1 ? '' : `(from ${configValue}) `}based on ${reason}. live edge: ${liveSyncPosition} live frag start: ${fragStart.toFixed(3)} playlist start: ${playlistStart.toFixed(3)} buffer pos: ${pos}`,\n          );\n          this.startPosition = this.nextLoadPosition = startPosition;\n        }\n      }\n    } else if (pos <= playlistStart) {\n      // VoD playlist: if loadPosition before start of playlist, load first fragment\n      frag = fragments[0];\n    }\n\n    // If we haven't run into any special cases already, just load the fragment most closely matching the requested position\n    if (!frag) {\n      const end = this.loadingParts\n        ? levelDetails.partEnd\n        : levelDetails.fragmentEnd;\n      frag = this.getFragmentAtPosition(pos, end, levelDetails);\n    }\n    let programFrag = this.filterReplacedPrimary(frag, levelDetails);\n    if (!programFrag && frag) {\n      const curSNIdx = frag.sn - levelDetails.startSN;\n      programFrag = this.filterReplacedPrimary(\n        fragments[curSNIdx + 1] || null,\n        levelDetails,\n      );\n    }\n    return this.mapToInitFragWhenRequired(programFrag);\n  }\n\n  protected isLoopLoading(frag: Fragment, targetBufferTime: number): boolean {\n    if (this.nextLoadPosition <= targetBufferTime) {\n      return false;\n    }\n    const trackerState = this.fragmentTracker.getState(frag);\n    return (\n      trackerState === FragmentState.OK ||\n      (trackerState === FragmentState.PARTIAL && !!frag.gap)\n    );\n  }\n\n  protected getNextFragmentLoopLoading(\n    frag: Fragment,\n    levelDetails: LevelDetails,\n    bufferInfo: BufferInfo,\n    playlistType: PlaylistLevelType,\n    maxBufLen: number,\n  ): Fragment | null {\n    let nextFragment: Fragment | null = null;\n    if (frag.gap) {\n      nextFragment = this.getNextFragment(this.nextLoadPosition, levelDetails);\n      if (nextFragment && !nextFragment.gap && bufferInfo.nextStart) {\n        // Media buffered after GAP tags should not make the next buffer timerange exceed forward buffer length\n        const nextbufferInfo = this.getFwdBufferInfoAtPos(\n          this.mediaBuffer ? this.mediaBuffer : this.media,\n          bufferInfo.nextStart,\n          playlistType,\n          0,\n        );\n        if (\n          nextbufferInfo !== null &&\n          bufferInfo.len + nextbufferInfo.len >= maxBufLen\n        ) {\n          // Returning here might result in not finding an audio and video candiate to skip to\n          const sn = nextFragment.sn;\n          if (this.loopSn !== sn) {\n            this.log(\n              `buffer full after gaps in \"${playlistType}\" playlist starting at sn: ${sn}`,\n            );\n            this.loopSn = sn;\n          }\n          return null;\n        }\n      }\n    }\n    this.loopSn = undefined;\n    return nextFragment;\n  }\n\n  protected get primaryPrefetch(): boolean {\n    if (interstitialsEnabled(this.config)) {\n      const playingInterstitial =\n        this.hls.interstitialsManager?.playingItem?.event;\n      if (playingInterstitial) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  protected filterReplacedPrimary(\n    frag: MediaFragment | null,\n    details: LevelDetails | undefined,\n  ): MediaFragment | null {\n    if (!frag) {\n      return frag;\n    }\n    if (\n      interstitialsEnabled(this.config) &&\n      frag.type !== PlaylistLevelType.SUBTITLE\n    ) {\n      // Do not load fragments outside the buffering schedule segment\n      const interstitials = this.hls.interstitialsManager;\n      const bufferingItem = interstitials?.bufferingItem;\n      if (bufferingItem) {\n        const bufferingInterstitial = bufferingItem.event;\n        if (bufferingInterstitial) {\n          // Do not stream fragments while buffering Interstitial Events (except for overlap at the start)\n          if (\n            bufferingInterstitial.appendInPlace ||\n            Math.abs(frag.start - bufferingItem.start) > 1 ||\n            bufferingItem.start === 0\n          ) {\n            return null;\n          }\n        } else {\n          // Limit fragment loading to media in schedule item\n          if (frag.end <= bufferingItem.start && details?.live === false) {\n            // fragment ends by schedule item start\n            // this.fragmentTracker.fragBuffered(frag, true);\n            return null;\n          }\n          if (frag.start > bufferingItem.end && bufferingItem.nextEvent) {\n            // fragment is past schedule item end\n            // allow some overflow when not appending in place to prevent stalls\n            if (\n              bufferingItem.nextEvent.appendInPlace ||\n              frag.start - bufferingItem.end > 1\n            ) {\n              return null;\n            }\n          }\n        }\n      }\n      // Skip loading of fragments that overlap completely with appendInPlace interstitials\n      const playerQueue = interstitials?.playerQueue;\n      if (playerQueue) {\n        for (let i = playerQueue.length; i--; ) {\n          const interstitial = playerQueue[i].interstitial;\n          if (\n            interstitial.appendInPlace &&\n            frag.start >= interstitial.startTime &&\n            frag.end <= interstitial.resumeTime\n          ) {\n            return null;\n          }\n        }\n      }\n    }\n    return frag;\n  }\n\n  mapToInitFragWhenRequired(frag: Fragment | null): typeof frag {\n    // If an initSegment is present, it must be buffered first\n    if (frag?.initSegment && !frag.initSegment.data && !this.bitrateTest) {\n      return frag.initSegment;\n    }\n\n    return frag;\n  }\n\n  getNextPart(\n    partList: Part[],\n    frag: Fragment,\n    targetBufferTime: number,\n  ): number {\n    let nextPart = -1;\n    let contiguous = false;\n    let independentAttrOmitted = true;\n    for (let i = 0, len = partList.length; i < len; i++) {\n      const part = partList[i];\n      independentAttrOmitted = independentAttrOmitted && !part.independent;\n      if (nextPart > -1 && targetBufferTime < part.start) {\n        break;\n      }\n      const loaded = part.loaded;\n      if (loaded) {\n        nextPart = -1;\n      } else if (\n        contiguous ||\n        ((part.independent || independentAttrOmitted) && part.fragment === frag)\n      ) {\n        if (part.fragment !== frag) {\n          this.warn(\n            `Need buffer at ${targetBufferTime} but next unloaded part starts at ${part.start}`,\n          );\n        }\n        nextPart = i;\n      }\n      contiguous = loaded;\n    }\n    return nextPart;\n  }\n\n  private loadedEndOfParts(\n    partList: Part[],\n    targetBufferTime: number,\n  ): boolean {\n    let part: Part;\n    for (let i = partList.length; i--; ) {\n      part = partList[i];\n      if (!part.loaded) {\n        return false;\n      }\n      if (targetBufferTime > part.start) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /*\n   This method is used find the best matching first fragment for a live playlist. This fragment is used to calculate the\n   \"sliding\" of the playlist, which is its offset from the start of playback. After sliding we can compute the real\n   start and end times for each fragment in the playlist (after which this method will not need to be called).\n  */\n  protected getInitialLiveFragment(\n    levelDetails: LevelDetails,\n  ): MediaFragment | null {\n    const fragments = levelDetails.fragments;\n    const fragPrevious = this.fragPrevious;\n    let frag: MediaFragment | null = null;\n    if (fragPrevious) {\n      if (levelDetails.hasProgramDateTime) {\n        // Prefer using PDT, because it can be accurate enough to choose the correct fragment without knowing the level sliding\n        frag = findFragmentByPDT(\n          fragments,\n          fragPrevious.endProgramDateTime,\n          this.config.maxFragLookUpTolerance,\n        );\n        if (frag) {\n          this.log(\n            `Live playlist, switching playlist, load frag with same PDT: ${fragPrevious.programDateTime}`,\n          );\n        }\n      }\n      if (!frag) {\n        // SN does not need to be accurate between renditions, but depending on the packaging it may be so.\n        const targetSN = (fragPrevious.sn as number) + 1;\n        if (\n          targetSN >= levelDetails.startSN &&\n          targetSN <= levelDetails.endSN\n        ) {\n          const fragNext = fragments[targetSN - levelDetails.startSN];\n          // Ensure that we're staying within the continuity range, since PTS resets upon a new range\n          if (fragPrevious.cc === fragNext.cc) {\n            frag = fragNext;\n            this.log(\n              `Live playlist, switching playlist, load frag with next SN: ${\n                frag!.sn\n              }`,\n            );\n          }\n        }\n        // It's important to stay within the continuity range if available; otherwise the fragments in the playlist\n        // will have the wrong start times\n        if (!frag) {\n          frag = findNearestWithCC(\n            levelDetails,\n            fragPrevious.cc,\n            fragPrevious.end,\n          );\n          if (frag) {\n            this.log(\n              `Live playlist, switching playlist, load frag with same CC: ${frag.sn}`,\n            );\n          }\n        }\n      }\n    } else {\n      // Find a new start fragment when fragPrevious is null\n      const liveStart = this.hls.liveSyncPosition;\n      if (liveStart !== null) {\n        frag = this.getFragmentAtPosition(\n          liveStart,\n          this.bitrateTest ? levelDetails.fragmentEnd : levelDetails.edge,\n          levelDetails,\n        );\n      }\n    }\n\n    return frag;\n  }\n\n  /*\n  This method finds the best matching fragment given the provided position.\n   */\n  protected getFragmentAtPosition(\n    bufferEnd: number,\n    end: number,\n    levelDetails: LevelDetails,\n  ): MediaFragment | null {\n    const { config } = this;\n    let { fragPrevious } = this;\n    let { fragments, endSN } = levelDetails;\n    const { fragmentHint } = levelDetails;\n    const { maxFragLookUpTolerance } = config;\n    const partList = levelDetails.partList;\n\n    const loadingParts = !!(\n      this.loadingParts &&\n      partList?.length &&\n      fragmentHint\n    );\n    if (\n      loadingParts &&\n      !this.bitrateTest &&\n      partList[partList.length - 1].fragment.sn === fragmentHint.sn\n    ) {\n      // Include incomplete fragment with parts at end\n      fragments = fragments.concat(fragmentHint);\n      endSN = fragmentHint.sn;\n    }\n\n    let frag: MediaFragment | null;\n    if (bufferEnd < end) {\n      const backwardSeek = bufferEnd < this.lastCurrentTime;\n      const lookupTolerance =\n        backwardSeek ||\n        bufferEnd > end - maxFragLookUpTolerance ||\n        this.media?.paused ||\n        !this.startFragRequested\n          ? 0\n          : maxFragLookUpTolerance;\n      // Remove the tolerance if it would put the bufferEnd past the actual end of stream\n      // Uses buffer and sequence number to calculate switch segment (required if using EXT-X-DISCONTINUITY-SEQUENCE)\n      frag = findFragmentByPTS(\n        fragPrevious,\n        fragments,\n        bufferEnd,\n        lookupTolerance,\n      );\n    } else {\n      // reach end of playlist\n      frag = fragments[fragments.length - 1];\n    }\n\n    if (frag) {\n      const curSNIdx = frag.sn - levelDetails.startSN;\n      // Move fragPrevious forward to support forcing the next fragment to load\n      // when the buffer catches up to a previously buffered range.\n      const fragState = this.fragmentTracker.getState(frag);\n      if (\n        fragState === FragmentState.OK ||\n        (fragState === FragmentState.PARTIAL && frag.gap)\n      ) {\n        fragPrevious = frag;\n      }\n      if (\n        fragPrevious &&\n        frag.sn === fragPrevious.sn &&\n        (!loadingParts ||\n          partList[0].fragment.sn > frag.sn ||\n          !levelDetails.live)\n      ) {\n        // Force the next fragment to load if the previous one was already selected. This can occasionally happen with\n        // non-uniform fragment durations\n        const sameLevel = frag.level === fragPrevious.level;\n        if (sameLevel) {\n          const nextFrag = fragments[curSNIdx + 1];\n          if (\n            frag.sn < endSN &&\n            this.fragmentTracker.getState(nextFrag) !== FragmentState.OK\n          ) {\n            frag = nextFrag;\n          } else {\n            frag = null;\n          }\n        }\n      }\n    }\n    return frag;\n  }\n\n  protected alignPlaylists(\n    details: LevelDetails,\n    previousDetails: LevelDetails | undefined,\n    switchDetails: LevelDetails | undefined,\n  ): number {\n    // TODO: If not for `shouldAlignOnDiscontinuities` requiring fragPrevious.cc,\n    //  this could all go in level-helper mergeDetails()\n    const length = details.fragments.length;\n    if (!length) {\n      this.warn(`No fragments in live playlist`);\n      return 0;\n    }\n    const slidingStart = details.fragmentStart;\n    const firstLevelLoad = !previousDetails;\n    const aligned = details.alignedSliding && Number.isFinite(slidingStart);\n    if (firstLevelLoad || (!aligned && !slidingStart)) {\n      alignStream(switchDetails, details);\n      const alignedSlidingStart = details.fragmentStart;\n      this.log(\n        `Live playlist sliding: ${alignedSlidingStart.toFixed(2)} start-sn: ${\n          previousDetails ? previousDetails.startSN : 'na'\n        }->${details.startSN} fragments: ${length}`,\n      );\n      return alignedSlidingStart;\n    }\n    return slidingStart;\n  }\n\n  protected waitForCdnTuneIn(details: LevelDetails) {\n    // Wait for Low-Latency CDN Tune-in to get an updated playlist\n    const advancePartLimit = 3;\n    return (\n      details.live &&\n      details.canBlockReload &&\n      details.partTarget &&\n      details.tuneInGoal >\n        Math.max(details.partHoldBack, details.partTarget * advancePartLimit)\n    );\n  }\n\n  protected setStartPosition(details: LevelDetails, sliding: number) {\n    // compute start position if set to -1. use it straight away if value is defined\n    let startPosition = this.startPosition;\n    if (startPosition < sliding) {\n      startPosition = -1;\n    }\n    const timelineOffset = this.timelineOffset;\n    if (startPosition === -1) {\n      // Use Playlist EXT-X-START:TIME-OFFSET when set\n      // Prioritize Multivariant Playlist offset so that main, audio, and subtitle stream-controller start times match\n      const offsetInMultivariantPlaylist = this.startTimeOffset !== null;\n      const startTimeOffset = offsetInMultivariantPlaylist\n        ? this.startTimeOffset\n        : details.startTimeOffset;\n      if (startTimeOffset !== null && Number.isFinite(startTimeOffset)) {\n        startPosition = sliding + startTimeOffset;\n        if (startTimeOffset < 0) {\n          startPosition += details.edge;\n        }\n        startPosition = Math.min(\n          Math.max(sliding, startPosition),\n          sliding + details.totalduration,\n        );\n        this.log(\n          `Setting startPosition to ${startPosition} for start time offset ${startTimeOffset} found in ${\n            offsetInMultivariantPlaylist ? 'multivariant' : 'media'\n          } playlist`,\n        );\n        this.startPosition = startPosition;\n      } else if (details.live) {\n        // Leave this.startPosition at -1, so that we can use `getInitialLiveFragment` logic when startPosition has\n        // not been specified via the config or an as an argument to startLoad (#3736).\n        startPosition = this.hls.liveSyncPosition || sliding;\n        this.log(\n          `Setting startPosition to -1 to start at live edge ${startPosition}`,\n        );\n        this.startPosition = -1;\n      } else {\n        this.log(`setting startPosition to 0 by default`);\n        this.startPosition = startPosition = 0;\n      }\n      this.lastCurrentTime = startPosition + timelineOffset;\n    }\n    this.nextLoadPosition = startPosition + timelineOffset;\n  }\n\n  protected getLoadPosition(): number {\n    const { media } = this;\n    // if we have not yet loaded any fragment, start loading from start position\n    let pos = 0;\n    if (this.hls?.hasEnoughToStart && media) {\n      pos = media.currentTime;\n    } else if (this.nextLoadPosition >= 0) {\n      pos = this.nextLoadPosition;\n    }\n\n    return pos;\n  }\n\n  private handleFragLoadAborted(frag: Fragment, part: Part | null | undefined) {\n    if (\n      this.transmuxer &&\n      frag.type === this.playlistType &&\n      isMediaFragment(frag) &&\n      frag.stats.aborted\n    ) {\n      this.log(\n        `Fragment ${frag.sn}${part ? ' part ' + part.index : ''} of ${this.playlistLabel()} ${\n          frag.level\n        } was aborted`,\n      );\n      this.resetFragmentLoading(frag);\n    }\n  }\n\n  protected resetFragmentLoading(frag: Fragment) {\n    if (\n      !this.fragCurrent ||\n      (!this.fragContextChanged(frag) &&\n        this.state !== State.FRAG_LOADING_WAITING_RETRY)\n    ) {\n      this.state = State.IDLE;\n    }\n  }\n\n  protected onFragmentOrKeyLoadError(\n    filterType: PlaylistLevelType,\n    data: ErrorData,\n  ) {\n    if (data.chunkMeta && !data.frag) {\n      const context = this.getCurrentContext(data.chunkMeta);\n      if (context) {\n        data.frag = context.frag;\n      }\n    }\n    const frag = data.frag;\n    // Handle frag error related to caller's filterType\n    if (!frag || frag.type !== filterType || !this.levels) {\n      return;\n    }\n    if (this.fragContextChanged(frag)) {\n      this.warn(\n        `Frag load error must match current frag to retry ${frag.url} > ${this.fragCurrent?.url}`,\n      );\n      return;\n    }\n    const gapTagEncountered = data.details === ErrorDetails.FRAG_GAP;\n    if (gapTagEncountered) {\n      this.fragmentTracker.fragBuffered(frag as MediaFragment, true);\n    }\n    // keep retrying until the limit will be reached\n    const errorAction = data.errorAction;\n    if (!errorAction) {\n      this.state = State.ERROR;\n      return;\n    }\n    const { action, flags, retryCount = 0, retryConfig } = errorAction;\n    const couldRetry = !!retryConfig;\n    const retry = couldRetry && action === NetworkErrorAction.RetryRequest;\n    const noAlternate =\n      couldRetry &&\n      !errorAction.resolved &&\n      flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;\n    const live = this.hls.latestLevelDetails?.live;\n    if (\n      !retry &&\n      noAlternate &&\n      isMediaFragment(frag) &&\n      !frag.endList &&\n      live &&\n      !isUnusableKeyError(data)\n    ) {\n      this.resetFragmentErrors(filterType);\n      this.treatAsGap(frag);\n      errorAction.resolved = true;\n    } else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {\n      const offlineStatus = offlineHttpStatus(data.response?.code);\n      const delay = getRetryDelay(retryConfig, retryCount);\n      this.resetStartWhenNotLoaded();\n      this.retryDate = self.performance.now() + delay;\n      this.state = State.FRAG_LOADING_WAITING_RETRY;\n      errorAction.resolved = true;\n      if (offlineStatus) {\n        this.log(`Waiting for connection (offline)`);\n        this.retryDate = Infinity;\n        data.reason = 'offline';\n        return;\n      }\n      this.warn(\n        `Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${\n          data.details\n        }, retrying loading ${retryCount + 1}/${\n          retryConfig.maxNumRetry\n        } in ${delay}ms`,\n      );\n    } else if (retryConfig) {\n      this.resetFragmentErrors(filterType);\n      if (retryCount < retryConfig.maxNumRetry) {\n        // Network retry is skipped when level switch is preferred\n        if (\n          !gapTagEncountered &&\n          action !== NetworkErrorAction.RemoveAlternatePermanently\n        ) {\n          errorAction.resolved = true;\n        }\n      } else {\n        this.warn(\n          `${data.details} reached or exceeded max retry (${retryCount})`,\n        );\n        return;\n      }\n    } else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {\n      this.state = State.WAITING_LEVEL;\n    } else {\n      this.state = State.ERROR;\n    }\n    // Perform next async tick sooner to speed up error action resolution\n    this.tickImmediate();\n  }\n\n  protected checkRetryDate() {\n    const now = self.performance.now();\n    const retryDate = this.retryDate;\n    // if current time is gt than retryDate, or if media seeking let's switch to IDLE state to retry loading\n    const waitingForConnection = retryDate === Infinity;\n    if (\n      !retryDate ||\n      now >= retryDate ||\n      (waitingForConnection && !offlineHttpStatus(0))\n    ) {\n      if (waitingForConnection) {\n        this.log(`Connection restored (online)`);\n      }\n      this.resetStartWhenNotLoaded();\n      this.state = State.IDLE;\n    }\n  }\n\n  protected reduceLengthAndFlushBuffer(data: ErrorData): boolean {\n    // if in appending state\n    if (this.state === State.PARSING || this.state === State.PARSED) {\n      const frag = data.frag;\n      const playlistType = data.parent as PlaylistLevelType;\n      const bufferedInfo = this.getFwdBufferInfo(\n        this.mediaBuffer,\n        playlistType,\n      );\n      // 0.5 : tolerance needed as some browsers stalls playback before reaching buffered end\n      // reduce max buf len if current position is buffered\n      const buffered = bufferedInfo && bufferedInfo.len > 0.5;\n      if (buffered) {\n        this.reduceMaxBufferLength(bufferedInfo.len, frag?.duration || 10);\n      }\n      const flushBuffer = !buffered;\n      if (flushBuffer) {\n        // current position is not buffered, but browser is still complaining about buffer full error\n        // this happens on IE/Edge, refer to https://github.com/video-dev/hls.js/pull/708\n        // in that case flush the whole audio buffer to recover\n        this.warn(\n          `Buffer full error while media.currentTime (${this.getLoadPosition()}) is not buffered, flush ${playlistType} buffer`,\n        );\n      }\n      if (frag) {\n        this.fragmentTracker.removeFragment(frag);\n        this.nextLoadPosition = frag.start;\n      }\n      this.resetLoadingState();\n      return flushBuffer;\n    }\n    return false;\n  }\n\n  protected resetFragmentErrors(filterType: PlaylistLevelType) {\n    if (filterType === PlaylistLevelType.AUDIO) {\n      // Reset current fragment since audio track audio is essential and may not have a fail-over track\n      this.fragCurrent = null;\n    }\n    // Fragment errors that result in a level switch or redundant fail-over\n    // should reset the stream controller state to idle\n    if (!this.hls.hasEnoughToStart) {\n      this.startFragRequested = false;\n    }\n    if (this.state !== State.STOPPED) {\n      this.state = State.IDLE;\n    }\n  }\n\n  protected afterBufferFlushed(\n    media: Bufferable,\n    bufferType: SourceBufferName,\n    playlistType: PlaylistLevelType,\n  ) {\n    if (!media) {\n      return;\n    }\n    // After successful buffer flushing, filter flushed fragments from bufferedFrags use mediaBuffered instead of media\n    // (so that we will check against video.buffered ranges in case of alt audio track)\n    const bufferedTimeRanges = BufferHelper.getBuffered(media);\n    this.fragmentTracker.detectEvictedFragments(\n      bufferType,\n      bufferedTimeRanges,\n      playlistType,\n    );\n    if (this.state === State.ENDED) {\n      this.resetLoadingState();\n    }\n  }\n\n  protected resetLoadingState() {\n    this.log('Reset loading state');\n    this.fragCurrent = null;\n    this.fragPrevious = null;\n    if (this.state !== State.STOPPED) {\n      this.state = State.IDLE;\n    }\n  }\n\n  private resetStartWhenNotLoaded() {\n    // if loadedmetadata is not set, it means that first frag request failed\n    // in that case, reset startFragRequested flag\n    if (!this.hls.hasEnoughToStart) {\n      this.startFragRequested = false;\n      const level = this.levelLastLoaded;\n      const details = level ? level.details : null;\n      if (details?.live) {\n        // Update the start position and return to IDLE to recover live start\n        this.log(`resetting startPosition for live start`);\n        this.startPosition = -1;\n        this.setStartPosition(details, details.fragmentStart);\n        this.resetLoadingState();\n      } else {\n        this.nextLoadPosition = this.startPosition;\n      }\n    }\n  }\n\n  protected resetWhenMissingContext(chunkMeta: ChunkMetadata | Fragment) {\n    this.log(\n      `Loading context changed while buffering sn ${chunkMeta.sn} of ${this.playlistLabel()} ${chunkMeta.level === -1 ? '<removed>' : chunkMeta.level}. This chunk will not be buffered.`,\n    );\n    this.removeUnbufferedFrags();\n    this.resetStartWhenNotLoaded();\n    this.resetLoadingState();\n  }\n\n  protected removeUnbufferedFrags(start: number = 0) {\n    this.fragmentTracker.removeFragmentsInRange(\n      start,\n      Infinity,\n      this.playlistType,\n      false,\n      true,\n    );\n  }\n\n  private updateLevelTiming(\n    frag: MediaFragment,\n    part: Part | null,\n    level: Level,\n    partial: boolean,\n  ) {\n    const details = level.details;\n    if (!details) {\n      this.warn('level.details undefined');\n      return;\n    }\n    const parsed = Object.keys(frag.elementaryStreams).reduce(\n      (result, type) => {\n        const info = frag.elementaryStreams[type];\n        if (info) {\n          const parsedDuration = info.endPTS - info.startPTS;\n          if (parsedDuration <= 0) {\n            // Destroy the transmuxer after it's next time offset failed to advance because duration was <= 0.\n            // The new transmuxer will be configured with a time offset matching the next fragment start,\n            // preventing the timeline from shifting.\n            this.warn(\n              `Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration})`,\n            );\n            return result || false;\n          }\n          const drift = partial\n            ? 0\n            : updateFragPTSDTS(\n                details,\n                frag,\n                info.startPTS,\n                info.endPTS,\n                info.startDTS,\n                info.endDTS,\n                this,\n              );\n          this.hls.trigger(Events.LEVEL_PTS_UPDATED, {\n            details,\n            level,\n            drift,\n            type,\n            frag,\n            start: info.startPTS,\n            end: info.endPTS,\n          });\n          return true;\n        }\n        return result;\n      },\n      false,\n    );\n    if (!parsed) {\n      const mediaNotFound = this.transmuxer?.error === null;\n      if (\n        level.fragmentError === 0 ||\n        (mediaNotFound && (level.fragmentError < 2 || frag.endList))\n      ) {\n        // Mark and track the odd (or last) empty segment as a gap to avoid reloading\n        this.treatAsGap(frag, level);\n      }\n      if (mediaNotFound) {\n        const error = new Error(\n          `Found no media in fragment ${frag.sn} of ${this.playlistLabel()} ${frag.level} resetting transmuxer to fallback to playlist timing`,\n        );\n        this.warn(error.message);\n        this.hls.trigger(Events.ERROR, {\n          type: ErrorTypes.MEDIA_ERROR,\n          details: ErrorDetails.FRAG_PARSING_ERROR,\n          fatal: false,\n          error,\n          frag,\n          reason: `Found no media in msn ${frag.sn} of ${this.playlistLabel()} \"${level.url}\"`,\n        });\n        if (!this.hls) {\n          return;\n        }\n        this.resetTransmuxer();\n      }\n      // For this error fallthrough. Marking parsed will allow advancing to next fragment.\n    }\n    this.state = State.PARSED;\n    this.log(\n      `Parsed ${frag.type} sn: ${frag.sn}${\n        part ? ' part: ' + part.index : ''\n      } of ${this.fragInfo(frag, false, part)})`,\n    );\n    this.hls.trigger(Events.FRAG_PARSED, { frag, part });\n  }\n\n  private playlistLabel() {\n    return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';\n  }\n\n  private fragInfo(\n    frag: Fragment,\n    pts: boolean = true,\n    part?: Part | null,\n  ): string {\n    return `${this.playlistLabel()} ${frag.level} (${part ? 'part' : 'frag'}:[${((pts && !part ? frag.startPTS : (part || frag).start) ?? NaN).toFixed(3)}-${(\n      (pts && !part ? frag.endPTS : (part || frag).end) ?? NaN\n    ).toFixed(\n      3,\n    )}]${part && frag.type === 'main' ? 'INDEPENDENT=' + (part.independent ? 'YES' : 'NO') : ''}`;\n  }\n\n  private treatAsGap(frag: MediaFragment, level?: Level) {\n    if (level) {\n      level.fragmentError++;\n    }\n    frag.gap = true;\n    this.fragmentTracker.removeFragment(frag);\n    this.fragmentTracker.fragBuffered(frag, true);\n  }\n\n  protected resetTransmuxer() {\n    this.transmuxer?.reset();\n  }\n\n  protected recoverWorkerError(data: ErrorData) {\n    if (data.event === 'demuxerWorker') {\n      this.fragmentTracker.removeAllFragments();\n      if (this.transmuxer) {\n        this.transmuxer.destroy();\n        this.transmuxer = null;\n      }\n      this.resetStartWhenNotLoaded();\n      this.resetLoadingState();\n    }\n  }\n\n  set state(nextState: (typeof State)[keyof typeof State]) {\n    const previousState = this._state;\n    if (previousState !== nextState) {\n      this._state = nextState;\n      this.log(`${previousState}->${nextState}`);\n    }\n  }\n\n  get state(): (typeof State)[keyof typeof State] {\n    return this._state;\n  }\n}\n\nfunction interstitialsEnabled(config: HlsConfig): boolean {\n  return (\n    __USE_INTERSTITIALS__ &&\n    !!config.interstitialsController &&\n    config.enableInterstitialPlayback !== false\n  );\n}\n", "export default class ChunkCache {\n  private chunks: Array<Uint8Array<ArrayBuffer>> = [];\n  public dataLength: number = 0;\n\n  push(chunk: Uint8Array<ArrayBuffer>) {\n    this.chunks.push(chunk);\n    this.dataLength += chunk.length;\n  }\n\n  flush(): Uint8Array<ArrayBuffer> {\n    const { chunks, dataLength } = this;\n    let result: Uint8Array<ArrayBuffer>;\n    if (!chunks.length) {\n      return new Uint8Array(0);\n    } else if (chunks.length === 1) {\n      result = chunks[0];\n    } else {\n      result = concatUint8Arrays(chunks, dataLength);\n    }\n    this.reset();\n    return result;\n  }\n\n  reset() {\n    this.chunks.length = 0;\n    this.dataLength = 0;\n  }\n}\n\nfunction concatUint8Arrays(\n  chunks: Array<Uint8Array<ArrayBuffer>>,\n  dataLength: number,\n): Uint8Array<ArrayBuffer> {\n  const result = new Uint8Array(dataLength);\n  let offset = 0;\n  for (let i = 0; i < chunks.length; i++) {\n    const chunk = chunks[i];\n    result.set(chunk, offset);\n    offset += chunk.length;\n  }\n  return result;\n}\n", "'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n", "export const version = __VERSION__;\n", "// ensure the worker ends up in the bundle\n// If the worker should not be included this gets aliased to empty.js\nimport './transmuxer-worker';\nimport { version } from '../version';\n\nconst workerStore: Record<string, WorkerContext> = {};\n\nexport function hasUMDWorker(): boolean {\n  return typeof __HLS_WORKER_BUNDLE__ === 'function';\n}\n\nexport type WorkerContext = {\n  worker: Worker;\n  objectURL?: string;\n  scriptURL?: string;\n  clientCount: number;\n};\n\nexport function injectWorker(): WorkerContext {\n  const workerContext = workerStore[version];\n  if (workerContext) {\n    workerContext.clientCount++;\n    return workerContext;\n  }\n  const blob = new self.Blob(\n    [\n      `var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(${__HLS_WORKER_BUNDLE__.toString()})(true);`,\n    ],\n    {\n      type: 'text/javascript',\n    },\n  );\n  const objectURL = self.URL.createObjectURL(blob);\n  const worker = new self.Worker(objectURL);\n  const result = {\n    worker,\n    objectURL,\n    clientCount: 1,\n  };\n  workerStore[version] = result;\n  return result;\n}\n\nexport function loadWorker(path: string): WorkerContext {\n  const workerContext = workerStore[path];\n  if (workerContext) {\n    workerContext.clientCount++;\n    return workerContext;\n  }\n  const scriptURL = new self.URL(path, self.location.href).href;\n  const worker = new self.Worker(scriptURL);\n  const result = {\n    worker,\n    scriptURL,\n    clientCount: 1,\n  };\n  workerStore[path] = result;\n  return result;\n}\n\nexport function removeWorkerFromStore(path?: string | null) {\n  const workerContext = workerStore[path || version];\n  if (workerContext) {\n    const clientCount = workerContext.clientCount--;\n    if (clientCount === 1) {\n      const { worker, objectURL } = workerContext;\n      delete workerStore[path || version];\n      if (objectURL) {\n        // revoke the Object URL that was used to create transmuxer worker, so as not to leak it\n        self.URL.revokeObjectURL(objectURL);\n      }\n      worker.terminate();\n    }\n  }\n}\n", "/**\n * Returns true if an ID3 footer can be found at offset in data\n *\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n *\n * @returns `true` if an ID3 footer is found\n *\n * @internal\n *\n * @group ID3\n */\nexport function isId3Footer(data, offset) {\n    /*\n     * The footer is a copy of the header, but with a different identifier\n     */\n    if (offset + 10 <= data.length) {\n        // look for '3DI' identifier\n        if (data[offset] === 0x33 &&\n            data[offset + 1] === 0x44 &&\n            data[offset + 2] === 0x49) {\n            // check version is within range\n            if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n                // check size is within range\n                if (data[offset + 6] < 0x80 &&\n                    data[offset + 7] < 0x80 &&\n                    data[offset + 8] < 0x80 &&\n                    data[offset + 9] < 0x80) {\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n//# sourceMappingURL=isId3Footer.js.map", "/**\n * Returns true if an ID3 header can be found at offset in data\n *\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n *\n * @returns `true` if an ID3 header is found\n *\n * @internal\n *\n * @group ID3\n */\nexport function isId3Header(data, offset) {\n    /*\n     * http://id3.org/id3v2.3.0\n     * [0]     = 'I'\n     * [1]     = 'D'\n     * [2]     = '3'\n     * [3,4]   = {Version}\n     * [5]     = {Flags}\n     * [6-9]   = {ID3 Size}\n     *\n     * An ID3v2 tag can be detected with the following pattern:\n     *  $49 44 33 yy yy xx zz zz zz zz\n     * Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80\n     */\n    if (offset + 10 <= data.length) {\n        // look for 'ID3' identifier\n        if (data[offset] === 0x49 &&\n            data[offset + 1] === 0x44 &&\n            data[offset + 2] === 0x33) {\n            // check version is within range\n            if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n                // check size is within range\n                if (data[offset + 6] < 0x80 &&\n                    data[offset + 7] < 0x80 &&\n                    data[offset + 8] < 0x80 &&\n                    data[offset + 9] < 0x80) {\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n//# sourceMappingURL=isId3Header.js.map", "/**\n * Read ID3 size\n *\n * @param data - The data to read from\n * @param offset - The offset at which to start reading\n *\n * @returns The size\n *\n * @internal\n *\n * @group ID3\n */\nexport function readId3Size(data, offset) {\n    let size = 0;\n    size = (data[offset] & 0x7f) << 21;\n    size |= (data[offset + 1] & 0x7f) << 14;\n    size |= (data[offset + 2] & 0x7f) << 7;\n    size |= data[offset + 3] & 0x7f;\n    return size;\n}\n//# sourceMappingURL=readId3Size.js.map", "import { isId3Footer } from './util/isId3Footer.js';\nimport { isId3Header } from './util/isId3Header.js';\nimport { readId3Size } from './util/readId3Size.js';\n/**\n * Returns any adjacent ID3 tags found in data starting at offset, as one block of data\n *\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n *\n * @returns The block of data containing any ID3 tags found\n * or `undefined` if no header is found at the starting offset\n *\n * @internal\n *\n * @group ID3\n */\nexport function getId3Data(data, offset) {\n    const front = offset;\n    let length = 0;\n    while (isId3Header(data, offset)) {\n        // ID3 header is 10 bytes\n        length += 10;\n        const size = readId3Size(data, offset + 6);\n        length += size;\n        if (isId3Footer(data, offset + 10)) {\n            // ID3 footer is 10 bytes\n            length += 10;\n        }\n        offset += length;\n    }\n    if (length > 0) {\n        return data.subarray(front, front + length);\n    }\n    return undefined;\n}\n//# sourceMappingURL=getId3Data.js.map", "/**\n * ADTS parser helper\n * @link https://wiki.multimedia.cx/index.php?title=ADTS\n */\nimport { ErrorDetails, ErrorTypes } from '../../errors';\nimport { Events } from '../../events';\nimport { logger } from '../../utils/logger';\nimport type { HlsEventEmitter } from '../../events';\nimport type {\n  AudioFrame,\n  AudioSample,\n  DemuxedAudioTrack,\n} from '../../types/demuxer';\n\ntype AudioConfig = {\n  config: [number, number];\n  samplerate: number;\n  channelCount: number;\n  codec: string;\n  parsedCodec: string;\n  manifestCodec: string | undefined;\n};\n\ntype FrameHeader = {\n  headerLength: number;\n  frameLength: number;\n};\n\nexport function getAudioConfig(\n  observer: HlsEventEmitter,\n  data: Uint8Array,\n  offset: number,\n  manifestCodec: string | undefined,\n): AudioConfig | void {\n  const adtsSamplingRates = [\n    96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,\n    8000, 7350,\n  ];\n  const byte2 = data[offset + 2];\n  const adtsSamplingIndex = (byte2 >> 2) & 0xf;\n  if (adtsSamplingIndex > 12) {\n    const error = new Error(`invalid ADTS sampling index:${adtsSamplingIndex}`);\n    observer.emit(Events.ERROR, Events.ERROR, {\n      type: ErrorTypes.MEDIA_ERROR,\n      details: ErrorDetails.FRAG_PARSING_ERROR,\n      fatal: true,\n      error,\n      reason: error.message,\n    });\n    return;\n  }\n  // MPEG-4 Audio Object Type (profile_ObjectType+1)\n  const adtsObjectType = ((byte2 >> 6) & 0x3) + 1;\n  const channelCount = ((data[offset + 3] >> 6) & 0x3) | ((byte2 & 1) << 2);\n  const codec = 'mp4a.40.' + adtsObjectType;\n  /* refer to http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio#Audio_Specific_Config\n      ISO/IEC 14496-3 - Table 1.13 — Syntax of AudioSpecificConfig()\n    Audio Profile / Audio Object Type\n    0: Null\n    1: AAC Main\n    2: AAC LC (Low Complexity)\n    3: AAC SSR (Scalable Sample Rate)\n    4: AAC LTP (Long Term Prediction)\n    5: SBR (Spectral Band Replication)\n    6: AAC Scalable\n   sampling freq\n    0: 96000 Hz\n    1: 88200 Hz\n    2: 64000 Hz\n    3: 48000 Hz\n    4: 44100 Hz\n    5: 32000 Hz\n    6: 24000 Hz\n    7: 22050 Hz\n    8: 16000 Hz\n    9: 12000 Hz\n    10: 11025 Hz\n    11: 8000 Hz\n    12: 7350 Hz\n    13: Reserved\n    14: Reserved\n    15: frequency is written explictly\n    Channel Configurations\n    These are the channel configurations:\n    0: Defined in AOT Specifc Config\n    1: 1 channel: front-center\n    2: 2 channels: front-left, front-right\n  */\n  // audioObjectType = profile => profile, the MPEG-4 Audio Object Type minus 1\n  const samplerate = adtsSamplingRates[adtsSamplingIndex];\n  let aacSampleIndex = adtsSamplingIndex;\n  if (adtsObjectType === 5 || adtsObjectType === 29) {\n    // HE-AAC uses SBR (Spectral Band Replication) , high frequencies are constructed from low frequencies\n    // there is a factor 2 between frame sample rate and output sample rate\n    // multiply frequency by 2 (see table above, equivalent to substract 3)\n    aacSampleIndex -= 3;\n  }\n  const config: [number, number] = [\n    (adtsObjectType << 3) | ((aacSampleIndex & 0x0e) >> 1),\n    ((aacSampleIndex & 0x01) << 7) | (channelCount << 3),\n  ];\n  logger.log(\n    `manifest codec:${manifestCodec}, parsed codec:${codec}, channels:${channelCount}, rate:${samplerate} (ADTS object type:${adtsObjectType} sampling index:${adtsSamplingIndex})`,\n  );\n  return {\n    config,\n    samplerate,\n    channelCount,\n    codec,\n    parsedCodec: codec,\n    manifestCodec,\n  };\n}\n\nexport function isHeaderPattern(data: Uint8Array, offset: number): boolean {\n  return data[offset] === 0xff && (data[offset + 1] & 0xf6) === 0xf0;\n}\n\nexport function getHeaderLength(data: Uint8Array, offset: number): number {\n  return data[offset + 1] & 0x01 ? 7 : 9;\n}\n\nexport function getFullFrameLength(data: Uint8Array, offset: number): number {\n  return (\n    ((data[offset + 3] & 0x03) << 11) |\n    (data[offset + 4] << 3) |\n    ((data[offset + 5] & 0xe0) >>> 5)\n  );\n}\n\nexport function canGetFrameLength(data: Uint8Array, offset: number): boolean {\n  return offset + 5 < data.length;\n}\n\nexport function isHeader(data: Uint8Array, offset: number): boolean {\n  // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1\n  // Layer bits (position 14 and 15) in header should be always 0 for ADTS\n  // More info https://wiki.multimedia.cx/index.php?title=ADTS\n  return offset + 1 < data.length && isHeaderPattern(data, offset);\n}\n\nexport function canParse(data: Uint8Array, offset: number): boolean {\n  return (\n    canGetFrameLength(data, offset) &&\n    isHeaderPattern(data, offset) &&\n    getFullFrameLength(data, offset) <= data.length - offset\n  );\n}\n\nexport function probe(data: Uint8Array, offset: number): boolean {\n  // same as isHeader but we also check that ADTS frame follows last ADTS frame\n  // or end of data is reached\n  if (isHeader(data, offset)) {\n    // ADTS header Length\n    const headerLength = getHeaderLength(data, offset);\n    if (offset + headerLength >= data.length) {\n      return false;\n    }\n    // ADTS frame Length\n    const frameLength = getFullFrameLength(data, offset);\n    if (frameLength <= headerLength) {\n      return false;\n    }\n\n    const newOffset = offset + frameLength;\n    return newOffset === data.length || isHeader(data, newOffset);\n  }\n  return false;\n}\n\nexport function initTrackConfig(\n  track: DemuxedAudioTrack,\n  observer: HlsEventEmitter,\n  data: Uint8Array,\n  offset: number,\n  audioCodec: string | undefined,\n) {\n  if (!track.samplerate) {\n    const config = getAudioConfig(observer, data, offset, audioCodec);\n    if (!config) {\n      return;\n    }\n    Object.assign(track, config);\n  }\n}\n\nexport function getFrameDuration(samplerate: number): number {\n  return (1024 * 90000) / samplerate;\n}\n\nexport function parseFrameHeader(\n  data: Uint8Array,\n  offset: number,\n): FrameHeader | void {\n  // The protection skip bit tells us if we have 2 bytes of CRC data at the end of the ADTS header\n  const headerLength = getHeaderLength(data, offset);\n  if (offset + headerLength <= data.length) {\n    // retrieve frame size\n    const frameLength = getFullFrameLength(data, offset) - headerLength;\n    if (frameLength > 0) {\n      // logger.log(`AAC frame, offset/length/total/pts:${offset+headerLength}/${frameLength}/${data.byteLength}`);\n      return { headerLength, frameLength };\n    }\n  }\n}\n\nexport function appendFrame(\n  track: DemuxedAudioTrack,\n  data: Uint8Array,\n  offset: number,\n  pts: number,\n  frameIndex: number,\n): AudioFrame {\n  const frameDuration = getFrameDuration(track.samplerate as number);\n  const stamp = pts + frameIndex * frameDuration;\n  const header = parseFrameHeader(data, offset);\n  let unit: Uint8Array;\n  if (header) {\n    const { frameLength, headerLength } = header;\n    const length = headerLength + frameLength;\n    const missing = Math.max(0, offset + length - data.length);\n    // logger.log(`AAC frame ${frameIndex}, pts:${stamp} length@offset/total: ${frameLength}@${offset+headerLength}/${data.byteLength} missing: ${missing}`);\n    if (missing) {\n      unit = new Uint8Array(length - headerLength);\n      unit.set(data.subarray(offset + headerLength, data.length), 0);\n    } else {\n      unit = data.subarray(offset + headerLength, offset + length);\n    }\n\n    const sample: AudioSample = {\n      unit,\n      pts: stamp,\n    };\n    if (!missing) {\n      track.samples.push(sample as AudioSample);\n    }\n\n    return { sample, length, missing };\n  }\n  // overflow incomplete header\n  const length = data.length - offset;\n  unit = new Uint8Array(length);\n  unit.set(data.subarray(offset, data.length), 0);\n  const sample: AudioSample = {\n    unit,\n    pts: stamp,\n  };\n  return { sample, length, missing: -1 };\n}\n", "import { isId3Header } from './util/isId3Header.js';\nimport { readId3Size } from './util/readId3Size.js';\n/**\n * Checks if the given data contains an ID3 tag.\n *\n * @param data - The data to check\n * @param offset - The offset at which to start checking\n *\n * @returns `true` if an ID3 tag is found\n *\n * @group ID3\n *\n * @beta\n */\nexport function canParseId3(data, offset) {\n    return (isId3Header(data, offset) &&\n        readId3Size(data, offset + 6) + 10 <= data.length - offset);\n}\n//# sourceMappingURL=canParseId3.js.map", "export function toArrayBuffer(view) {\n    if (view instanceof ArrayBuffer) {\n        return view;\n    }\n    else {\n        if (view.byteOffset == 0 && view.byteLength == view.buffer.byteLength) {\n            // This is a TypedArray over the whole buffer.\n            return view.buffer;\n        }\n        // This is a 'view' on the buffer.  Create a new buffer that only contains\n        // the data.  Note that since this isn't an ArrayBuffer, the 'new' call\n        // will allocate a new buffer to hold the copy.\n        return new Uint8Array(view).buffer;\n    }\n}\n//# sourceMappingURL=toArrayBuffer.js.map", "export function toUint8(data, offset = 0, length = Infinity) {\n    return view(data, offset, length, Uint8Array);\n}\nfunction view(data, offset, length, Type) {\n    const buffer = unsafeGetArrayBuffer(data);\n    let bytesPerElement = 1;\n    if ('BYTES_PER_ELEMENT' in Type) {\n        bytesPerElement = Type.BYTES_PER_ELEMENT;\n    }\n    // Absolute end of the |data| view within |buffer|.\n    const dataOffset = isArrayBufferView(data) ? data.byteOffset : 0;\n    const dataEnd = ((dataOffset) + data.byteLength) / bytesPerElement;\n    // Absolute start of the result within |buffer|.\n    const rawStart = ((dataOffset) + offset) / bytesPerElement;\n    const start = Math.floor(Math.max(0, Math.min(rawStart, dataEnd)));\n    // Absolute end of the result within |buffer|.\n    const end = Math.floor(Math.min(start + Math.max(length, 0), dataEnd));\n    return new Type(buffer, start, end - start);\n}\nfunction unsafeGetArrayBuffer(view) {\n    if (view instanceof ArrayBuffer) {\n        return view;\n    }\n    else {\n        return view.buffer;\n    }\n}\nfunction isArrayBufferView(obj) {\n    return obj && obj.buffer instanceof ArrayBuffer && obj.byteLength !== undefined && obj.byteOffset !== undefined;\n}\n//# sourceMappingURL=utf8.js.map", "import { utf8ArrayToStr } from '../../utils/utf8ArrayToStr.js';\nimport { toArrayBuffer } from './toArrayBuffer.js';\nimport { toUint8 } from './utf8.js';\nexport function decodeId3ImageFrame(frame) {\n    const metadataFrame = {\n        key: frame.type,\n        description: '',\n        data: '',\n        mimeType: null,\n        pictureType: null,\n    };\n    const utf8Encoding = 0x03;\n    if (frame.size < 2) {\n        return undefined;\n    }\n    if (frame.data[0] !== utf8Encoding) {\n        console.log('Ignore frame with unrecognized character ' + 'encoding');\n        return undefined;\n    }\n    const mimeTypeEndIndex = frame.data.subarray(1).indexOf(0);\n    if (mimeTypeEndIndex === -1) {\n        return undefined;\n    }\n    const mimeType = utf8ArrayToStr(toUint8(frame.data, 1, mimeTypeEndIndex));\n    const pictureType = frame.data[2 + mimeTypeEndIndex];\n    const descriptionEndIndex = frame.data\n        .subarray(3 + mimeTypeEndIndex)\n        .indexOf(0);\n    if (descriptionEndIndex === -1) {\n        return undefined;\n    }\n    const description = utf8ArrayToStr(toUint8(frame.data, 3 + mimeTypeEndIndex, descriptionEndIndex));\n    let data;\n    if (mimeType === '-->') {\n        data = utf8ArrayToStr(toUint8(frame.data, 4 + mimeTypeEndIndex + descriptionEndIndex));\n    }\n    else {\n        data = toArrayBuffer(frame.data.subarray(4 + mimeTypeEndIndex + descriptionEndIndex));\n    }\n    metadataFrame.mimeType = mimeType;\n    metadataFrame.pictureType = pictureType;\n    metadataFrame.description = description;\n    metadataFrame.data = data;\n    return metadataFrame;\n}\n//# sourceMappingURL=decodeId3ImageFrame.js.map", "import { utf8ArrayToStr } from '../../utils/utf8ArrayToStr.js';\n/**\n * Decode an ID3 PRIV frame.\n *\n * @param frame - the ID3 PRIV frame\n *\n * @returns The decoded ID3 PRIV frame\n *\n * @internal\n *\n * @group ID3\n */\nexport function decodeId3PrivFrame(frame) {\n    /*\n    Format: <text string>\\0<binary data>\n    */\n    if (frame.size < 2) {\n        return undefined;\n    }\n    const owner = utf8ArrayToStr(frame.data, true);\n    const privateData = new Uint8Array(frame.data.subarray(owner.length + 1));\n    return { key: frame.type, info: owner, data: privateData.buffer };\n}\n//# sourceMappingURL=decodeId3PrivFrame.js.map", "import { utf8ArrayToStr } from '../../utils/utf8ArrayToStr.js';\n/**\n * Decodes an ID3 text frame\n *\n * @param frame - the ID3 text frame\n *\n * @returns The decoded ID3 text frame\n *\n * @internal\n *\n * @group ID3\n */\nexport function decodeId3TextFrame(frame) {\n    if (frame.size < 2) {\n        return undefined;\n    }\n    if (frame.type === 'TXXX') {\n        /*\n        Format:\n        [0]   = {Text Encoding}\n        [1-?] = {Description}\\0{Value}\n        */\n        let index = 1;\n        const description = utf8ArrayToStr(frame.data.subarray(index), true);\n        index += description.length + 1;\n        const value = utf8ArrayToStr(frame.data.subarray(index));\n        return { key: frame.type, info: description, data: value };\n    }\n    /*\n    Format:\n    [0]   = {Text Encoding}\n    [1-?] = {Value}\n    */\n    const text = utf8ArrayToStr(frame.data.subarray(1));\n    return { key: frame.type, info: '', data: text };\n}\n//# sourceMappingURL=decodeId3TextFrame.js.map", "import { utf8ArrayToStr } from '../../utils/utf8ArrayToStr.js';\n/**\n * Decode a URL frame\n *\n * @param frame - the ID3 URL frame\n *\n * @returns The decoded ID3 URL frame\n *\n * @internal\n *\n * @group ID3\n */\nexport function decodeId3UrlFrame(frame) {\n    if (frame.type === 'WXXX') {\n        /*\n        Format:\n        [0]   = {Text Encoding}\n        [1-?] = {Description}\\0{URL}\n        */\n        if (frame.size < 2) {\n            return undefined;\n        }\n        let index = 1;\n        const description = utf8ArrayToStr(frame.data.subarray(index), true);\n        index += description.length + 1;\n        const value = utf8ArrayToStr(frame.data.subarray(index));\n        return { key: frame.type, info: description, data: value };\n    }\n    /*\n    Format:\n    [0-?] = {URL}\n    */\n    const url = utf8ArrayToStr(frame.data);\n    return { key: frame.type, info: '', data: url };\n}\n//# sourceMappingURL=decodeId3UrlFrame.js.map", "import { decodeId3ImageFrame } from './decodeId3ImageFrame.js';\nimport { decodeId3PrivFrame } from './decodeId3PrivFrame.js';\nimport { decodeId3TextFrame } from './decodeId3TextFrame.js';\nimport { decodeId3UrlFrame } from './decodeId3UrlFrame.js';\n/**\n * Decode an ID3 frame.\n *\n * @param frame - the ID3 frame\n *\n * @returns The decoded ID3 frame\n *\n * @internal\n *\n * @group ID3\n */\nexport function decodeId3Frame(frame) {\n    if (frame.type === 'PRIV') {\n        return decodeId3PrivFrame(frame);\n    }\n    else if (frame.type[0] === 'W') {\n        return decodeId3UrlFrame(frame);\n    }\n    else if (frame.type === 'APIC') {\n        return decodeId3ImageFrame(frame);\n    }\n    return decodeId3TextFrame(frame);\n}\n//# sourceMappingURL=decodeId3Frame.js.map", "import { readId3Size } from './readId3Size.js';\n/**\n * Returns the data of an ID3 frame.\n *\n * @param data - The data to read from\n *\n * @returns The data of the ID3 frame\n *\n * @internal\n *\n * @group ID3\n */\nexport function getId3FrameData(data) {\n    /*\n    Frame ID       $xx xx xx xx (four characters)\n    Size           $xx xx xx xx\n    Flags          $xx xx\n    */\n    const type = String.fromCharCode(data[0], data[1], data[2], data[3]);\n    const size = readId3Size(data, 4);\n    // skip frame id, size, and flags\n    const offset = 10;\n    return { type, size, data: data.subarray(offset, offset + size) };\n}\n//# sourceMappingURL=getId3FrameData.js.map", "import { decodeId3Frame } from './util/decodeId3Frame.js';\nimport { getId3FrameData } from './util/getId3FrameData.js';\nimport { isId3Footer } from './util/isId3Footer.js';\nimport { isId3Header } from './util/isId3Header.js';\nimport { readId3Size } from './util/readId3Size.js';\nconst HEADER_FOOTER_SIZE = 10;\nconst FRAME_SIZE = 10;\n/**\n * Returns an array of ID3 frames found in all the ID3 tags in the id3Data\n *\n * @param id3Data - The ID3 data containing one or more ID3 tags\n *\n * @returns Array of ID3 frame objects\n *\n * @group ID3\n *\n * @beta\n */\nexport function getId3Frames(id3Data) {\n    let offset = 0;\n    const frames = [];\n    while (isId3Header(id3Data, offset)) {\n        const size = readId3Size(id3Data, offset + 6);\n        if ((id3Data[offset + 5] >> 6) & 1) {\n            // skip extended header\n            offset += HEADER_FOOTER_SIZE;\n        }\n        // skip past ID3 header\n        offset += HEADER_FOOTER_SIZE;\n        const end = offset + size;\n        // loop through frames in the ID3 tag\n        while (offset + FRAME_SIZE < end) {\n            const frameData = getId3FrameData(id3Data.subarray(offset));\n            const frame = decodeId3Frame(frameData);\n            if (frame) {\n                frames.push(frame);\n            }\n            // skip frame header and frame data\n            offset += frameData.size + HEADER_FOOTER_SIZE;\n        }\n        if (isId3Footer(id3Data, offset)) {\n            offset += HEADER_FOOTER_SIZE;\n        }\n    }\n    return frames;\n}\n//# sourceMappingURL=getId3Frames.js.map", "/**\n * Returns true if the ID3 frame is an Elementary Stream timestamp frame\n *\n * @param frame - the ID3 frame\n *\n * @returns `true` if the ID3 frame is an Elementary Stream timestamp frame\n *\n * @internal\n *\n * @group ID3\n */\nexport function isId3TimestampFrame(frame) {\n    return (frame &&\n        frame.key === 'PRIV' &&\n        frame.info === 'com.apple.streaming.transportStreamTimestamp');\n}\n//# sourceMappingURL=isId3TimestampFrame.js.map", "/**\n * Read a 33 bit timestamp from an ID3 frame.\n *\n * @param timeStampFrame - the ID3 frame\n *\n * @returns The timestamp\n *\n * @internal\n *\n * @group ID3\n */\nexport function readId3Timestamp(timeStampFrame) {\n    if (timeStampFrame.data.byteLength === 8) {\n        const data = new Uint8Array(timeStampFrame.data);\n        // timestamp is 33 bit expressed as a big-endian eight-octet number,\n        // with the upper 31 bits set to zero.\n        const pts33Bit = data[3] & 0x1;\n        let timestamp = (data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7];\n        timestamp /= 45;\n        if (pts33Bit) {\n            timestamp += 47721858.84;\n        } // 2^32 / 90\n        return Math.round(timestamp);\n    }\n    return undefined;\n}\n//# sourceMappingURL=readId3Timestamp.js.map", "import { getId3Frames } from './getId3Frames.js';\nimport { isId3TimestampFrame } from './isId3TimestampFrame.js';\nimport { readId3Timestamp } from './util/readId3Timestamp.js';\n/**\n * Searches for the Elementary Stream timestamp found in the ID3 data chunk\n *\n * @param data - Block of data containing one or more ID3 tags\n *\n * @returns The timestamp\n *\n * @group ID3\n *\n * @beta\n */\nexport function getId3Timestamp(data) {\n    const frames = getId3Frames(data);\n    for (let i = 0; i < frames.length; i++) {\n        const frame = frames[i];\n        if (isId3TimestampFrame(frame)) {\n            return readId3Timestamp(frame);\n        }\n    }\n    return undefined;\n}\n//# sourceMappingURL=getId3Timestamp.js.map", "import type { RationalTimestamp } from '../utils/timescale-conversion';\n\nexport interface Demuxer {\n  demux(\n    data: Uint8Array,\n    timeOffset: number,\n    isSampleAes?: boolean,\n    flush?: boolean,\n  ): DemuxerResult;\n  demuxSampleAes(\n    data: Uint8Array,\n    keyData: KeyData,\n    timeOffset: number,\n  ): Promise<DemuxerResult>;\n  flush(timeOffset?: number): DemuxerResult | Promise<DemuxerResult>;\n  destroy(): void;\n  resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n  );\n  resetTimeStamp(defaultInitPTS?: RationalTimestamp | null): void;\n  resetContiguity(): void;\n}\n\nexport interface DemuxerResult {\n  audioTrack: DemuxedAudioTrack;\n  videoTrack: DemuxedVideoTrackBase;\n  id3Track: DemuxedMetadataTrack;\n  textTrack: DemuxedUserdataTrack;\n}\n\nexport interface DemuxedTrack {\n  type: string;\n  id: number;\n  pid: number;\n  inputTimeScale: number;\n  sequenceNumber: number;\n  samples:\n    | AudioSample[]\n    | VideoSample[]\n    | MetadataSample[]\n    | UserdataSample[]\n    | Uint8Array;\n  timescale?: number;\n  container?: string;\n  dropped: number;\n  duration?: number;\n  pesData?: ElementaryStreamData | null;\n  codec?: string;\n}\n\nexport interface PassthroughTrack extends DemuxedTrack {\n  sampleDuration: number;\n  samples: Uint8Array;\n  timescale: number;\n  duration: number;\n  codec: string;\n  supplemental: string | undefined;\n}\nexport interface DemuxedAudioTrack extends DemuxedTrack {\n  type: 'audio';\n  segmentCodec: 'aac' | 'ac3' | 'mp3';\n  config?: number[] | Uint8Array;\n  samplerate?: number;\n  channelCount?: number;\n  manifestCodec?: string;\n  parsedCodec?: string;\n  samples: AudioSample[];\n}\n\nexport type DemuxedAAC = DemuxedAudioTrack & {\n  segmentCodec: 'aac';\n  samples: AACAudioSample[];\n};\n\nexport type DemuxedAC3 = DemuxedAudioTrack & {\n  segmentCodec: 'ac3';\n  config: Uint8Array;\n};\n\nexport interface DemuxedVideoTrackBase extends DemuxedTrack {\n  width?: number;\n  height?: number;\n  pixelRatio?: [number, number];\n  audFound?: boolean;\n  vps?: Uint8Array[];\n  pps?: Uint8Array[];\n  sps?: Uint8Array[];\n  naluState?: number;\n  segmentCodec?: string;\n  manifestCodec?: string;\n  samples: VideoSample[] | Uint8Array;\n  params?: object;\n}\n\nexport interface DemuxedVideoTrack extends DemuxedVideoTrackBase {\n  type: 'video';\n  segmentCodec: 'avc' | 'hevc';\n  samples: VideoSample[];\n  pixelRatio: [number, number];\n  width: number;\n  height: number;\n}\n\nexport type DemuxedAVC1 = DemuxedVideoTrack & {\n  segmentCodec: 'avc';\n  pps: Uint8Array[];\n  sps: Uint8Array[];\n};\n\nexport type DemuxedHEVC = DemuxedVideoTrack & {\n  segmentCodec: 'hevc';\n  params: {\n    general_profile_space: number;\n    general_tier_flag: number;\n    general_profile_idc: number;\n    general_profile_compatibility_flags: number[];\n    general_constraint_indicator_flags: number[];\n    general_level_idc: number;\n    min_spatial_segmentation_idc: number;\n    parallelismType: number;\n    chroma_format_idc: number;\n    bit_depth_luma_minus8: number;\n    bit_depth_chroma_minus8: number;\n    frame_rate: { fps: string; fixed: boolean };\n    temporal_id_nested: number;\n    num_temporal_layers: number;\n  };\n  pps: Uint8Array[];\n  sps: Uint8Array[];\n  vps: Uint8Array;\n};\n\nexport interface DemuxedMetadataTrack extends DemuxedTrack {\n  samples: MetadataSample[];\n}\n\nexport interface DemuxedUserdataTrack extends DemuxedTrack {\n  samples: UserdataSample[];\n}\n\nexport enum MetadataSchema {\n  audioId3 = 'org.id3',\n  dateRange = 'com.apple.quicktime.HLS',\n  emsg = 'https://aomedia.org/emsg/ID3',\n  misbklv = 'urn:misb:KLV:bin:1910.1',\n}\nexport interface MetadataSample {\n  pts: number;\n  dts: number;\n  duration: number;\n  len?: number;\n  data: Uint8Array;\n  type: MetadataSchema;\n}\n\nexport interface UserdataSample {\n  pts: number;\n  bytes?: Uint8Array;\n  type?: number;\n  payloadType?: number;\n  uuid?: string;\n  userData?: string;\n  userDataBytes?: Uint8Array;\n}\n\nexport interface VideoSample {\n  dts: number;\n  pts: number;\n  key: boolean;\n  frame: boolean;\n  units: VideoSampleUnit[];\n  length: number;\n}\n\nexport interface VideoSampleUnit {\n  data: Uint8Array;\n  type: number;\n  state?: number;\n}\n\nexport type AudioSample = {\n  unit: Uint8Array;\n  pts: number;\n};\n\nexport type AACAudioSample = {\n  unit: Uint8Array<ArrayBuffer>;\n};\n\nexport type AudioFrame = {\n  sample: AudioSample;\n  length: number;\n  missing: number;\n};\n\nexport interface ElementaryStreamData {\n  data: Uint8Array[];\n  size: number;\n}\n\nexport interface KeyData {\n  method: string;\n  key: Uint8Array<ArrayBuffer>;\n  iv: Uint8Array<ArrayBuffer>;\n}\n", "import type { DemuxedTrack } from '../types/demuxer';\n\nexport function dummyTrack(type = '', inputTimeScale = 90000): DemuxedTrack {\n  return {\n    type,\n    id: -1,\n    pid: -1,\n    inputTimeScale,\n    sequenceNumber: -1,\n    samples: [],\n    dropped: 0,\n  };\n}\n", "import { canParseId3 } from '@svta/common-media-library/id3/canParseId3';\nimport { getId3Data } from '@svta/common-media-library/id3/getId3Data';\nimport { getId3Timestamp } from '@svta/common-media-library/id3/getId3Timestamp';\nimport {\n  type AudioFrame,\n  type DemuxedAudioTrack,\n  type DemuxedMetadataTrack,\n  type DemuxedUserdataTrack,\n  type DemuxedVideoTrackBase,\n  type Demuxer,\n  type DemuxerResult,\n  type KeyData,\n  MetadataSchema,\n} from '../../types/demuxer';\nimport { appendUint8Array } from '../../utils/mp4-tools';\nimport { dummyTrack } from '../dummy-demuxed-track';\nimport type {\n  RationalTimestamp,\n  TimestampOffset,\n} from '../../utils/timescale-conversion';\n\nclass BaseAudioDemuxer implements Demuxer {\n  protected _audioTrack?: DemuxedAudioTrack;\n  protected _id3Track?: DemuxedMetadataTrack;\n  protected frameIndex: number = 0;\n  protected cachedData: Uint8Array | null = null;\n  protected basePTS: number | null = null;\n  protected initPTS: TimestampOffset | null = null;\n  protected lastPTS: number | null = null;\n\n  resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n  ) {\n    this._id3Track = {\n      type: 'id3',\n      id: 3,\n      pid: -1,\n      inputTimeScale: 90000,\n      sequenceNumber: 0,\n      samples: [],\n      dropped: 0,\n    };\n  }\n\n  resetTimeStamp(deaultTimestamp: TimestampOffset | null) {\n    this.initPTS = deaultTimestamp;\n    this.resetContiguity();\n  }\n\n  resetContiguity(): void {\n    this.basePTS = null;\n    this.lastPTS = null;\n    this.frameIndex = 0;\n  }\n\n  canParse(data: Uint8Array, offset: number): boolean {\n    return false;\n  }\n\n  appendFrame(\n    track: DemuxedAudioTrack,\n    data: Uint8Array,\n    offset: number,\n  ): AudioFrame | void {}\n\n  // feed incoming data to the front of the parsing pipeline\n  demux(data: Uint8Array, timeOffset: number): DemuxerResult {\n    if (this.cachedData) {\n      data = appendUint8Array(this.cachedData, data);\n      this.cachedData = null;\n    }\n\n    let id3Data: Uint8Array | undefined = getId3Data(data, 0);\n    let offset = id3Data ? id3Data.length : 0;\n    let lastDataIndex;\n    const track = this._audioTrack as DemuxedAudioTrack;\n    const id3Track = this._id3Track as DemuxedMetadataTrack;\n    const timestamp = id3Data ? getId3Timestamp(id3Data) : undefined;\n    const length = data.length;\n\n    if (\n      this.basePTS === null ||\n      (this.frameIndex === 0 && Number.isFinite(timestamp))\n    ) {\n      this.basePTS = initPTSFn(timestamp, timeOffset, this.initPTS);\n      this.lastPTS = this.basePTS;\n    }\n\n    if (this.lastPTS === null) {\n      this.lastPTS = this.basePTS;\n    }\n\n    // more expressive than alternative: id3Data?.length\n    if (id3Data && id3Data.length > 0) {\n      id3Track.samples.push({\n        pts: this.lastPTS,\n        dts: this.lastPTS,\n        data: id3Data,\n        type: MetadataSchema.audioId3,\n        duration: Number.POSITIVE_INFINITY,\n      });\n    }\n\n    while (offset < length) {\n      if (this.canParse(data, offset)) {\n        const frame = this.appendFrame(track, data, offset);\n        if (frame) {\n          this.frameIndex++;\n          this.lastPTS = frame.sample.pts;\n          offset += frame.length;\n          lastDataIndex = offset;\n        } else {\n          offset = length;\n        }\n      } else if (canParseId3(data, offset)) {\n        // after a canParse, a call to getId3Data *should* always returns some data\n        id3Data = getId3Data(data, offset)!;\n        id3Track.samples.push({\n          pts: this.lastPTS,\n          dts: this.lastPTS,\n          data: id3Data,\n          type: MetadataSchema.audioId3,\n          duration: Number.POSITIVE_INFINITY,\n        });\n        offset += id3Data.length;\n        lastDataIndex = offset;\n      } else {\n        offset++;\n      }\n      if (offset === length && lastDataIndex !== length) {\n        const partialData = data.slice(lastDataIndex);\n        if (this.cachedData) {\n          this.cachedData = appendUint8Array(this.cachedData, partialData);\n        } else {\n          this.cachedData = partialData;\n        }\n      }\n    }\n\n    return {\n      audioTrack: track,\n      videoTrack: dummyTrack() as DemuxedVideoTrackBase,\n      id3Track,\n      textTrack: dummyTrack() as DemuxedUserdataTrack,\n    };\n  }\n\n  demuxSampleAes(\n    data: Uint8Array,\n    keyData: KeyData,\n    timeOffset: number,\n  ): Promise<DemuxerResult> {\n    return Promise.reject(\n      new Error(\n        `[${this}] This demuxer does not support Sample-AES decryption`,\n      ),\n    );\n  }\n\n  flush(timeOffset: number): DemuxerResult {\n    // Parse cache in case of remaining frames.\n    const cachedData = this.cachedData;\n    if (cachedData) {\n      this.cachedData = null;\n      this.demux(cachedData, 0);\n    }\n\n    return {\n      audioTrack: this._audioTrack as DemuxedAudioTrack,\n      videoTrack: dummyTrack() as DemuxedVideoTrackBase,\n      id3Track: this._id3Track as DemuxedMetadataTrack,\n      textTrack: dummyTrack() as DemuxedUserdataTrack,\n    };\n  }\n\n  destroy() {\n    this.cachedData = null;\n    // @ts-ignore\n    this._audioTrack = this._id3Track = undefined;\n  }\n}\n\n/**\n * Initialize PTS\n * <p>\n *    use timestamp unless it is undefined, NaN or Infinity\n * </p>\n */\nexport const initPTSFn = (\n  timestamp: number | undefined,\n  timeOffset: number,\n  initPTS: RationalTimestamp | null,\n): number => {\n  if (Number.isFinite(timestamp as number)) {\n    return timestamp! * 90;\n  }\n  const init90kHz = initPTS\n    ? (initPTS.baseTime * 90000) / initPTS.timescale\n    : 0;\n  return timeOffset * 90000 + init90kHz;\n};\nexport default BaseAudioDemuxer;\n", "/**\n *  MPEG parser helper\n */\nimport type { DemuxedAudioTrack } from '../../types/demuxer';\n\nlet chromeVersion: number | null = null;\n\nconst BitratesMap = [\n  32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56,\n  64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80,\n  96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144,\n  160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144,\n  160,\n];\n\nconst SamplingRateMap = [\n  44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000,\n];\n\nconst SamplesCoefficients = [\n  // MPEG 2.5\n  [\n    0, // Reserved\n    72, // Layer3\n    144, // Layer2\n    12, // Layer1\n  ],\n  // Reserved\n  [\n    0, // Reserved\n    0, // Layer3\n    0, // Layer2\n    0, // Layer1\n  ],\n  // MPEG 2\n  [\n    0, // Reserved\n    72, // Layer3\n    144, // Layer2\n    12, // Layer1\n  ],\n  // MPEG 1\n  [\n    0, // Reserved\n    144, // Layer3\n    144, // Layer2\n    12, // Layer1\n  ],\n];\n\nconst BytesInSlot = [\n  0, // Reserved\n  1, // Layer3\n  1, // Layer2\n  4, // Layer1\n];\n\nexport function appendFrame(\n  track: DemuxedAudioTrack,\n  data: Uint8Array,\n  offset: number,\n  pts: number,\n  frameIndex: number,\n) {\n  // Using http://www.datavoyage.com/mpgscript/mpeghdr.htm as a reference\n  if (offset + 24 > data.length) {\n    return;\n  }\n\n  const header = parseHeader(data, offset);\n  if (header && offset + header.frameLength <= data.length) {\n    const frameDuration = (header.samplesPerFrame * 90000) / header.sampleRate;\n    const stamp = pts + frameIndex * frameDuration;\n    const sample = {\n      unit: data.subarray(offset, offset + header.frameLength),\n      pts: stamp,\n      dts: stamp,\n    };\n\n    track.config = [];\n    track.channelCount = header.channelCount;\n    track.samplerate = header.sampleRate;\n    track.samples.push(sample);\n\n    return { sample, length: header.frameLength, missing: 0 };\n  }\n}\n\nexport function parseHeader(data: Uint8Array, offset: number) {\n  const mpegVersion = (data[offset + 1] >> 3) & 3;\n  const mpegLayer = (data[offset + 1] >> 1) & 3;\n  const bitRateIndex = (data[offset + 2] >> 4) & 15;\n  const sampleRateIndex = (data[offset + 2] >> 2) & 3;\n  if (\n    mpegVersion !== 1 &&\n    bitRateIndex !== 0 &&\n    bitRateIndex !== 15 &&\n    sampleRateIndex !== 3\n  ) {\n    const paddingBit = (data[offset + 2] >> 1) & 1;\n    const channelMode = data[offset + 3] >> 6;\n    const columnInBitrates =\n      mpegVersion === 3 ? 3 - mpegLayer : mpegLayer === 3 ? 3 : 4;\n    const bitRate =\n      BitratesMap[columnInBitrates * 14 + bitRateIndex - 1] * 1000;\n    const columnInSampleRates =\n      mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2;\n    const sampleRate =\n      SamplingRateMap[columnInSampleRates * 3 + sampleRateIndex];\n    const channelCount = channelMode === 3 ? 1 : 2; // If bits of channel mode are `11` then it is a single channel (Mono)\n    const sampleCoefficient = SamplesCoefficients[mpegVersion][mpegLayer];\n    const bytesInSlot = BytesInSlot[mpegLayer];\n    const samplesPerFrame = sampleCoefficient * 8 * bytesInSlot;\n    const frameLength =\n      Math.floor((sampleCoefficient * bitRate) / sampleRate + paddingBit) *\n      bytesInSlot;\n\n    if (chromeVersion === null) {\n      const userAgent = navigator.userAgent || '';\n      const result = userAgent.match(/Chrome\\/(\\d+)/i);\n      chromeVersion = result ? parseInt(result[1]) : 0;\n    }\n    const needChromeFix = !!chromeVersion && chromeVersion <= 87;\n\n    if (\n      needChromeFix &&\n      mpegLayer === 2 &&\n      bitRate >= 224000 &&\n      channelMode === 0\n    ) {\n      // Work around bug in Chromium by setting channelMode to dual-channel (01) instead of stereo (00)\n      data[offset + 3] = data[offset + 3] | 0x80;\n    }\n\n    return { sampleRate, channelCount, frameLength, samplesPerFrame };\n  }\n}\n\nexport function isHeaderPattern(data: Uint8Array, offset: number): boolean {\n  return (\n    data[offset] === 0xff &&\n    (data[offset + 1] & 0xe0) === 0xe0 &&\n    (data[offset + 1] & 0x06) !== 0x00\n  );\n}\n\nexport function isHeader(data: Uint8Array, offset: number): boolean {\n  // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1\n  // Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III)\n  // More info http://www.mp3-tech.org/programmer/frame_header.html\n  return offset + 1 < data.length && isHeaderPattern(data, offset);\n}\n\nexport function canParse(data: Uint8Array, offset: number): boolean {\n  const headerSize = 4;\n\n  return isHeaderPattern(data, offset) && headerSize <= data.length - offset;\n}\n\nexport function probe(data: Uint8Array, offset: number): boolean {\n  // same as isHeader but we also check that MPEG frame follows last MPEG frame\n  // or end of data is reached\n  if (offset + 1 < data.length && isHeaderPattern(data, offset)) {\n    // MPEG header Length\n    const headerLength = 4;\n    // MPEG frame Length\n    const header = parseHeader(data, offset);\n    let frameLength = headerLength;\n    if (header?.frameLength) {\n      frameLength = header.frameLength;\n    }\n\n    const newOffset = offset + frameLength;\n    return newOffset === data.length || isHeader(data, newOffset);\n  }\n  return false;\n}\n", "/**\n * AAC demuxer\n */\nimport { getId3Data } from '@svta/common-media-library/id3/getId3Data';\nimport * as ADTS from './adts';\nimport BaseAudioDemuxer from './base-audio-demuxer';\nimport * as MpegAudio from './mpegaudio';\nimport type { HlsConfig } from '../../config';\nimport type { HlsEventEmitter } from '../../events';\nimport type { DemuxedAudioTrack } from '../../types/demuxer';\nimport type { ILogger } from '../../utils/logger';\n\nclass AACDemuxer extends BaseAudioDemuxer {\n  private readonly observer: HlsEventEmitter;\n  private readonly config: HlsConfig;\n\n  constructor(observer: HlsEventEmitter, config) {\n    super();\n    this.observer = observer;\n    this.config = config;\n  }\n\n  resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n  ) {\n    super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);\n    this._audioTrack = {\n      container: 'audio/adts',\n      type: 'audio',\n      id: 2,\n      pid: -1,\n      sequenceNumber: 0,\n      segmentCodec: 'aac',\n      samples: [],\n      manifestCodec: audioCodec,\n      duration: trackDuration,\n      inputTimeScale: 90000,\n      dropped: 0,\n    };\n  }\n\n  // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS\n  static probe(data: Uint8Array | undefined, logger: ILogger): boolean {\n    if (!data) {\n      return false;\n    }\n\n    // Check for the ADTS sync word\n    // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1\n    // Layer bits (position 14 and 15) in header should be always 0 for ADTS\n    // More info https://wiki.multimedia.cx/index.php?title=ADTS\n    const id3Data = getId3Data(data, 0);\n    let offset = id3Data?.length || 0;\n\n    if (MpegAudio.probe(data, offset)) {\n      return false;\n    }\n\n    for (let length = data.length; offset < length; offset++) {\n      if (ADTS.probe(data, offset)) {\n        logger.log('ADTS sync word found !');\n        return true;\n      }\n    }\n    return false;\n  }\n\n  canParse(data, offset) {\n    return ADTS.canParse(data, offset);\n  }\n\n  appendFrame(track: DemuxedAudioTrack, data: Uint8Array, offset: number) {\n    ADTS.initTrackConfig(\n      track,\n      this.observer,\n      data,\n      offset,\n      track.manifestCodec,\n    );\n    const frame = ADTS.appendFrame(\n      track,\n      data,\n      offset,\n      this.basePTS as number,\n      this.frameIndex,\n    );\n    if (frame && frame.missing === 0) {\n      return frame;\n    }\n  }\n}\n\nexport default AACDemuxer;\n", "export const getAudioBSID = (data: Uint8Array, offset: number): number => {\n  // check the bsid to confirm ac-3 | ec-3\n  let bsid = 0;\n  let numBits = 5;\n  offset += numBits;\n  const temp = new Uint32Array(1); // unsigned 32 bit for temporary storage\n  const mask = new Uint32Array(1); // unsigned 32 bit mask value\n  const byte = new Uint8Array(1); // unsigned 8 bit for temporary storage\n  while (numBits > 0) {\n    byte[0] = data[offset];\n    // read remaining bits, upto 8 bits at a time\n    const bits = Math.min(numBits, 8);\n    const shift = 8 - bits;\n    mask[0] = (0xff000000 >>> (24 + shift)) << shift;\n    temp[0] = (byte[0] & mask[0]) >> shift;\n    bsid = !bsid ? temp[0] : (bsid << bits) | temp[0];\n    offset += 1;\n    numBits -= bits;\n  }\n  return bsid;\n};\n", "import { getId3Data } from '@svta/common-media-library/id3/getId3Data';\nimport { getId3Timestamp } from '@svta/common-media-library/id3/getId3Timestamp';\nimport BaseAudioDemuxer from './base-audio-demuxer';\nimport { getAudioBSID } from './dolby';\nimport type { HlsEventEmitter } from '../../events';\nimport type { AudioFrame, DemuxedAudioTrack } from '../../types/demuxer';\n\nexport class AC3Demuxer extends BaseAudioDemuxer {\n  private readonly observer: HlsEventEmitter;\n\n  constructor(observer: HlsEventEmitter) {\n    super();\n    this.observer = observer;\n  }\n\n  resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n  ) {\n    super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);\n    this._audioTrack = {\n      container: 'audio/ac-3',\n      type: 'audio',\n      id: 2,\n      pid: -1,\n      sequenceNumber: 0,\n      segmentCodec: 'ac3',\n      samples: [],\n      manifestCodec: audioCodec,\n      duration: trackDuration,\n      inputTimeScale: 90000,\n      dropped: 0,\n    };\n  }\n\n  canParse(data: Uint8Array, offset: number): boolean {\n    return offset + 64 < data.length;\n  }\n\n  appendFrame(\n    track: DemuxedAudioTrack,\n    data: Uint8Array,\n    offset: number,\n  ): AudioFrame | void {\n    const frameLength = appendFrame(\n      track,\n      data,\n      offset,\n      this.basePTS as number,\n      this.frameIndex,\n    );\n    if (frameLength !== -1) {\n      const sample = track.samples[track.samples.length - 1];\n      return { sample, length: frameLength, missing: 0 };\n    }\n  }\n\n  static probe(data: Uint8Array | undefined): boolean {\n    if (!data) {\n      return false;\n    }\n\n    const id3Data = getId3Data(data, 0);\n    if (!id3Data) {\n      return false;\n    }\n\n    // look for the ac-3 sync bytes\n    const offset = id3Data.length;\n    if (\n      data[offset] === 0x0b &&\n      data[offset + 1] === 0x77 &&\n      getId3Timestamp(id3Data) !== undefined &&\n      // check the bsid to confirm ac-3\n      getAudioBSID(data, offset) < 16\n    ) {\n      return true;\n    }\n    return false;\n  }\n}\n\nexport function appendFrame(\n  track: DemuxedAudioTrack,\n  data: Uint8Array,\n  start: number,\n  pts: number,\n  frameIndex: number,\n): number {\n  if (start + 8 > data.length) {\n    return -1; // not enough bytes left\n  }\n\n  if (data[start] !== 0x0b || data[start + 1] !== 0x77) {\n    return -1; // invalid magic\n  }\n\n  // get sample rate\n  const samplingRateCode = data[start + 4] >> 6;\n  if (samplingRateCode >= 3) {\n    return -1; // invalid sampling rate\n  }\n\n  const samplingRateMap = [48000, 44100, 32000];\n  const sampleRate = samplingRateMap[samplingRateCode];\n\n  // get frame size\n  const frameSizeCode = data[start + 4] & 0x3f;\n  const frameSizeMap = [\n    64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105,\n    144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160, 174,\n    240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336, 224, 244,\n    336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349, 480, 384, 417,\n    576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512, 557, 768, 512, 558,\n    768, 640, 696, 960, 640, 697, 960, 768, 835, 1152, 768, 836, 1152, 896, 975,\n    1344, 896, 976, 1344, 1024, 1114, 1536, 1024, 1115, 1536, 1152, 1253, 1728,\n    1152, 1254, 1728, 1280, 1393, 1920, 1280, 1394, 1920,\n  ];\n\n  const frameLength = frameSizeMap[frameSizeCode * 3 + samplingRateCode] * 2;\n  if (start + frameLength > data.length) {\n    return -1;\n  }\n\n  // get channel count\n  const channelMode = data[start + 6] >> 5;\n  let skipCount = 0;\n  if (channelMode === 2) {\n    skipCount += 2;\n  } else {\n    if (channelMode & 1 && channelMode !== 1) {\n      skipCount += 2;\n    }\n    if (channelMode & 4) {\n      skipCount += 2;\n    }\n  }\n\n  const lfeon =\n    (((data[start + 6] << 8) | data[start + 7]) >> (12 - skipCount)) & 1;\n\n  const channelsMap = [2, 1, 2, 3, 3, 4, 4, 5];\n  const channelCount = channelsMap[channelMode] + lfeon;\n\n  // build dac3 box\n  const bsid = data[start + 5] >> 3;\n  const bsmod = data[start + 5] & 7;\n\n  const config = new Uint8Array([\n    (samplingRateCode << 6) | (bsid << 1) | (bsmod >> 2),\n    ((bsmod & 3) << 6) |\n      (channelMode << 3) |\n      (lfeon << 2) |\n      (frameSizeCode >> 4),\n    (frameSizeCode << 4) & 0xe0,\n  ]);\n\n  const frameDuration = (1536 / sampleRate) * 90000;\n  const stamp = pts + frameIndex * frameDuration;\n  const unit = data.subarray(start, start + frameLength);\n\n  track.config = config;\n  track.channelCount = channelCount;\n  track.samplerate = sampleRate;\n  track.samples.push({ unit, pts: stamp });\n\n  return frameLength;\n}\n", "/**\n * MP3 demuxer\n */\nimport { getId3Data } from '@svta/common-media-library/id3/getId3Data';\nimport { getId3Timestamp } from '@svta/common-media-library/id3/getId3Timestamp';\nimport BaseAudioDemuxer from './base-audio-demuxer';\nimport { getAudioBSID } from './dolby';\nimport * as MpegAudio from './mpegaudio';\nimport { logger } from '../../utils/logger';\n\nclass MP3Demuxer extends BaseAudioDemuxer {\n  resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n  ) {\n    super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);\n    this._audioTrack = {\n      container: 'audio/mpeg',\n      type: 'audio',\n      id: 2,\n      pid: -1,\n      sequenceNumber: 0,\n      segmentCodec: 'mp3',\n      samples: [],\n      manifestCodec: audioCodec,\n      duration: trackDuration,\n      inputTimeScale: 90000,\n      dropped: 0,\n    };\n  }\n\n  static probe(data: Uint8Array | undefined): boolean {\n    if (!data) {\n      return false;\n    }\n\n    // check if data contains ID3 timestamp and MPEG sync word\n    // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1\n    // Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III)\n    // More info http://www.mp3-tech.org/programmer/frame_header.html\n    const id3Data = getId3Data(data, 0);\n    let offset = id3Data?.length || 0;\n\n    // Check for ac-3|ec-3 sync bytes and return false if present\n    if (\n      id3Data &&\n      data[offset] === 0x0b &&\n      data[offset + 1] === 0x77 &&\n      getId3Timestamp(id3Data) !== undefined &&\n      // check the bsid to confirm ac-3 or ec-3 (not mp3)\n      getAudioBSID(data, offset) <= 16\n    ) {\n      return false;\n    }\n\n    for (let length = data.length; offset < length; offset++) {\n      if (MpegAudio.probe(data, offset)) {\n        logger.log('MPEG Audio sync word found !');\n        return true;\n      }\n    }\n    return false;\n  }\n\n  canParse(data, offset) {\n    return MpegAudio.canParse(data, offset);\n  }\n\n  appendFrame(track, data, offset) {\n    if (this.basePTS === null) {\n      return;\n    }\n    return MpegAudio.appendFrame(\n      track,\n      data,\n      offset,\n      this.basePTS,\n      this.frameIndex,\n    );\n  }\n}\n\nexport default MP3Demuxer;\n", "/**\n * MP4 demuxer\n */\nimport { dummyTrack } from './dummy-demuxed-track';\nimport {\n  type DemuxedAudioTrack,\n  type DemuxedMetadataTrack,\n  type DemuxedUserdataTrack,\n  type Demuxer,\n  type DemuxerResult,\n  type KeyData,\n  MetadataSchema,\n  type PassthroughTrack,\n} from '../types/demuxer';\nimport {\n  appendUint8Array,\n  findBox,\n  hasMoofData,\n  parseEmsg,\n  parseInitSegment,\n  parseSamples,\n  RemuxerTrackIdConfig,\n  segmentValidRange,\n} from '../utils/mp4-tools';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport type { IEmsgParsingData } from '../utils/mp4-tools';\n\nconst emsgSchemePattern = /\\/emsg[-/]ID3/i;\n\nclass MP4Demuxer implements Demuxer {\n  private remainderData: Uint8Array | null = null;\n  private timeOffset: number = 0;\n  private config: HlsConfig;\n  private videoTrack?: PassthroughTrack;\n  private audioTrack?: DemuxedAudioTrack;\n  private id3Track?: DemuxedMetadataTrack;\n  private txtTrack?: DemuxedUserdataTrack;\n\n  constructor(observer: HlsEventEmitter, config: HlsConfig) {\n    this.config = config;\n  }\n\n  public resetTimeStamp() {}\n\n  public resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n  ) {\n    const videoTrack = (this.videoTrack = dummyTrack(\n      'video',\n      1,\n    ) as PassthroughTrack);\n    const audioTrack = (this.audioTrack = dummyTrack(\n      'audio',\n      1,\n    ) as DemuxedAudioTrack);\n    const captionTrack = (this.txtTrack = dummyTrack(\n      'text',\n      1,\n    ) as DemuxedUserdataTrack);\n\n    this.id3Track = dummyTrack('id3', 1) as DemuxedMetadataTrack;\n    this.timeOffset = 0;\n\n    if (!initSegment?.byteLength) {\n      return;\n    }\n    const initData = parseInitSegment(initSegment);\n\n    if (initData.video) {\n      const { id, timescale, codec, supplemental } = initData.video;\n      videoTrack.id = id;\n      videoTrack.timescale = captionTrack.timescale = timescale;\n      videoTrack.codec = codec;\n      videoTrack.supplemental = supplemental;\n    }\n\n    if (initData.audio) {\n      const { id, timescale, codec } = initData.audio;\n      audioTrack.id = id;\n      audioTrack.timescale = timescale;\n      audioTrack.codec = codec;\n    }\n\n    captionTrack.id = RemuxerTrackIdConfig.text;\n    videoTrack.sampleDuration = 0;\n    videoTrack.duration = audioTrack.duration = trackDuration;\n  }\n\n  public resetContiguity(): void {\n    this.remainderData = null;\n  }\n\n  static probe(data: Uint8Array) {\n    return hasMoofData(data);\n  }\n\n  public demux(data: Uint8Array, timeOffset: number): DemuxerResult {\n    this.timeOffset = timeOffset;\n    // Load all data into the avc track. The CMAF remuxer will look for the data in the samples object; the rest of the fields do not matter\n    let videoSamples = data;\n    const videoTrack = this.videoTrack as PassthroughTrack;\n    const textTrack = this.txtTrack as DemuxedUserdataTrack;\n    if (this.config.progressive) {\n      // Split the bytestream into two ranges: one encompassing all data up until the start of the last moof, and everything else.\n      // This is done to guarantee that we're sending valid data to MSE - when demuxing progressively, we have no guarantee\n      // that the fetch loader gives us flush moof+mdat pairs. If we push jagged data to MSE, it will throw an exception.\n      if (this.remainderData) {\n        videoSamples = appendUint8Array(this.remainderData, data);\n      }\n      const segmentedData = segmentValidRange(videoSamples);\n      this.remainderData = segmentedData.remainder;\n      videoTrack.samples = segmentedData.valid || new Uint8Array();\n    } else {\n      videoTrack.samples = videoSamples;\n    }\n    const id3Track = this.extractID3Track(videoTrack, timeOffset);\n    textTrack.samples = parseSamples(timeOffset, videoTrack);\n\n    return {\n      videoTrack,\n      audioTrack: this.audioTrack as DemuxedAudioTrack,\n      id3Track,\n      textTrack: this.txtTrack as DemuxedUserdataTrack,\n    };\n  }\n\n  public flush() {\n    const timeOffset = this.timeOffset;\n    const videoTrack = this.videoTrack as PassthroughTrack;\n    const textTrack = this.txtTrack as DemuxedUserdataTrack;\n    videoTrack.samples = this.remainderData || new Uint8Array();\n    this.remainderData = null;\n\n    const id3Track = this.extractID3Track(videoTrack, this.timeOffset);\n    textTrack.samples = parseSamples(timeOffset, videoTrack);\n\n    return {\n      videoTrack,\n      audioTrack: dummyTrack() as DemuxedAudioTrack,\n      id3Track,\n      textTrack: dummyTrack() as DemuxedUserdataTrack,\n    };\n  }\n\n  private extractID3Track(\n    videoTrack: PassthroughTrack,\n    timeOffset: number,\n  ): DemuxedMetadataTrack {\n    const id3Track = this.id3Track as DemuxedMetadataTrack;\n    if (videoTrack.samples.length) {\n      const emsgs = findBox(videoTrack.samples, ['emsg']);\n      if (emsgs) {\n        emsgs.forEach((data: Uint8Array) => {\n          const emsgInfo = parseEmsg(data);\n          if (emsgSchemePattern.test(emsgInfo.schemeIdUri)) {\n            const pts = getEmsgStartTime(emsgInfo, timeOffset);\n            let duration =\n              emsgInfo.eventDuration === 0xffffffff\n                ? Number.POSITIVE_INFINITY\n                : emsgInfo.eventDuration / emsgInfo.timeScale;\n            // Safari takes anything <= 0.001 seconds and maps it to Infinity\n            if (duration <= 0.001) {\n              duration = Number.POSITIVE_INFINITY;\n            }\n            const payload = emsgInfo.payload;\n            id3Track.samples.push({\n              data: payload,\n              len: payload.byteLength,\n              dts: pts,\n              pts: pts,\n              type: MetadataSchema.emsg,\n              duration: duration,\n            });\n          } else if (\n            this.config.enableEmsgKLVMetadata &&\n            emsgInfo.schemeIdUri.startsWith('urn:misb:KLV:bin:1910.1')\n          ) {\n            const pts = getEmsgStartTime(emsgInfo, timeOffset);\n            id3Track.samples.push({\n              data: emsgInfo.payload,\n              len: emsgInfo.payload.byteLength,\n              dts: pts,\n              pts: pts,\n              type: MetadataSchema.misbklv,\n              duration: Number.POSITIVE_INFINITY,\n            });\n          }\n        });\n      }\n    }\n    return id3Track;\n  }\n\n  demuxSampleAes(\n    data: Uint8Array,\n    keyData: KeyData,\n    timeOffset: number,\n  ): Promise<DemuxerResult> {\n    return Promise.reject(\n      new Error('The MP4 demuxer does not support SAMPLE-AES decryption'),\n    );\n  }\n\n  destroy() {\n    // @ts-ignore\n    this.config = null;\n    this.remainderData = null;\n    this.videoTrack =\n      this.audioTrack =\n      this.id3Track =\n      this.txtTrack =\n        undefined;\n  }\n}\n\nfunction getEmsgStartTime(\n  emsgInfo: IEmsgParsingData,\n  timeOffset: number,\n): number {\n  return Number.isFinite(emsgInfo.presentationTime)\n    ? (emsgInfo.presentationTime as number) / emsgInfo.timeScale\n    : timeOffset +\n        (emsgInfo.presentationTimeDelta as number) / emsgInfo.timeScale;\n}\n\nexport default MP4Demuxer;\n", "/**\n * SAMPLE-AES decrypter\n */\n\nimport Decrypter from '../crypt/decrypter';\nimport { DecrypterAesMode } from '../crypt/decrypter-aes-mode';\nimport { discardEPB } from '../utils/mp4-tools';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport type {\n  AACAudioSample,\n  DemuxedVideoTrackBase,\n  KeyData,\n  VideoSample,\n  VideoSampleUnit,\n} from '../types/demuxer';\n\nclass SampleAesDecrypter {\n  private keyData: KeyData;\n  private decrypter: Decrypter;\n\n  constructor(observer: HlsEventEmitter, config: HlsConfig, keyData: KeyData) {\n    this.keyData = keyData;\n    this.decrypter = new Decrypter(config, {\n      removePKCS7Padding: false,\n    });\n  }\n\n  decryptBuffer(encryptedData: Uint8Array | ArrayBuffer): Promise<ArrayBuffer> {\n    return this.decrypter.decrypt(\n      encryptedData,\n      this.keyData.key.buffer,\n      this.keyData.iv.buffer,\n      DecrypterAesMode.cbc,\n    );\n  }\n\n  // AAC - encrypt all full 16 bytes blocks starting from offset 16\n  private decryptAacSample(\n    samples: AACAudioSample[],\n    sampleIndex: number,\n    callback: () => void,\n  ) {\n    const curUnit = samples[sampleIndex].unit;\n    if (curUnit.length <= 16) {\n      // No encrypted portion in this sample (first 16 bytes is not\n      // encrypted, see https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/HLS_Sample_Encryption/Encryption/Encryption.html),\n      return;\n    }\n    const encryptedData = curUnit.subarray(\n      16,\n      curUnit.length - (curUnit.length % 16),\n    );\n    const encryptedBuffer = encryptedData.buffer.slice(\n      encryptedData.byteOffset,\n      encryptedData.byteOffset + encryptedData.length,\n    );\n\n    this.decryptBuffer(encryptedBuffer)\n      .then((decryptedBuffer: ArrayBuffer) => {\n        const decryptedData = new Uint8Array(decryptedBuffer);\n        curUnit.set(decryptedData, 16);\n\n        if (!this.decrypter.isSync()) {\n          this.decryptAacSamples(samples, sampleIndex + 1, callback);\n        }\n      })\n      .catch(callback);\n  }\n\n  decryptAacSamples(\n    samples: AACAudioSample[],\n    sampleIndex: number,\n    callback: () => void,\n  ) {\n    for (; ; sampleIndex++) {\n      if (sampleIndex >= samples.length) {\n        callback();\n        return;\n      }\n\n      if (samples[sampleIndex].unit.length < 32) {\n        continue;\n      }\n\n      this.decryptAacSample(samples, sampleIndex, callback);\n\n      if (!this.decrypter.isSync()) {\n        return;\n      }\n    }\n  }\n\n  // AVC - encrypt one 16 bytes block out of ten, starting from offset 32\n  getAvcEncryptedData(decodedData: Uint8Array) {\n    const encryptedDataLen =\n      Math.floor((decodedData.length - 48) / 160) * 16 + 16;\n    const encryptedData = new Int8Array(encryptedDataLen);\n    let outputPos = 0;\n    for (\n      let inputPos = 32;\n      inputPos < decodedData.length - 16;\n      inputPos += 160, outputPos += 16\n    ) {\n      encryptedData.set(\n        decodedData.subarray(inputPos, inputPos + 16),\n        outputPos,\n      );\n    }\n\n    return encryptedData;\n  }\n\n  getAvcDecryptedUnit(decodedData: Uint8Array, decryptedData: ArrayBufferLike) {\n    const uint8DecryptedData = new Uint8Array(decryptedData);\n    let inputPos = 0;\n    for (\n      let outputPos = 32;\n      outputPos < decodedData.length - 16;\n      outputPos += 160, inputPos += 16\n    ) {\n      decodedData.set(\n        uint8DecryptedData.subarray(inputPos, inputPos + 16),\n        outputPos,\n      );\n    }\n\n    return decodedData;\n  }\n\n  decryptAvcSample(\n    samples: VideoSample[],\n    sampleIndex: number,\n    unitIndex: number,\n    callback: () => void,\n    curUnit: VideoSampleUnit,\n  ) {\n    const decodedData = discardEPB(curUnit.data);\n    const encryptedData = this.getAvcEncryptedData(decodedData);\n\n    this.decryptBuffer(encryptedData.buffer)\n      .then((decryptedBuffer) => {\n        curUnit.data = this.getAvcDecryptedUnit(decodedData, decryptedBuffer);\n\n        if (!this.decrypter.isSync()) {\n          this.decryptAvcSamples(samples, sampleIndex, unitIndex + 1, callback);\n        }\n      })\n      .catch(callback);\n  }\n\n  decryptAvcSamples(\n    samples: DemuxedVideoTrackBase['samples'],\n    sampleIndex: number,\n    unitIndex: number,\n    callback: () => void,\n  ) {\n    if (samples instanceof Uint8Array) {\n      throw new Error('Cannot decrypt samples of type Uint8Array');\n    }\n\n    for (; ; sampleIndex++, unitIndex = 0) {\n      if (sampleIndex >= samples.length) {\n        callback();\n        return;\n      }\n\n      const curUnits = samples[sampleIndex].units;\n      for (; ; unitIndex++) {\n        if (unitIndex >= curUnits.length) {\n          break;\n        }\n\n        const curUnit = curUnits[unitIndex];\n        if (\n          curUnit.data.length <= 48 ||\n          (curUnit.type !== 1 && curUnit.type !== 5)\n        ) {\n          continue;\n        }\n\n        this.decryptAvcSample(\n          samples,\n          sampleIndex,\n          unitIndex,\n          callback,\n          curUnit,\n        );\n\n        if (!this.decrypter.isSync()) {\n          return;\n        }\n      }\n    }\n  }\n}\n\nexport default SampleAesDecrypter;\n", "import { appendUint8Array } from '../../utils/mp4-tools';\nimport type {\n  DemuxedUserdataTrack,\n  DemuxedVideoTrack,\n  VideoSample,\n  VideoSampleUnit,\n} from '../../types/demuxer';\nimport type { ParsedVideoSample } from '../tsdemuxer';\nimport type { PES } from '../tsdemuxer';\n\nabstract class BaseVideoParser {\n  protected VideoSample: ParsedVideoSample | null = null;\n\n  protected createVideoSample(\n    key: boolean,\n    pts: number | undefined,\n    dts: number | undefined,\n  ): ParsedVideoSample {\n    return {\n      key,\n      frame: false,\n      pts,\n      dts,\n      units: [],\n      length: 0,\n    };\n  }\n\n  protected getLastNalUnit(\n    samples: VideoSample[],\n  ): VideoSampleUnit | undefined {\n    let VideoSample = this.VideoSample;\n    let lastUnit: VideoSampleUnit | undefined;\n    // try to fallback to previous sample if current one is empty\n    if (!VideoSample || VideoSample.units.length === 0) {\n      VideoSample = samples[samples.length - 1];\n    }\n    if (VideoSample?.units) {\n      const units = VideoSample.units;\n      lastUnit = units[units.length - 1];\n    }\n    return lastUnit;\n  }\n\n  protected pushAccessUnit(\n    VideoSample: ParsedVideoSample,\n    videoTrack: DemuxedVideoTrack,\n  ) {\n    if (VideoSample.units.length && VideoSample.frame) {\n      // if sample does not have PTS/DTS, patch with last sample PTS/DTS\n      if (VideoSample.pts === undefined) {\n        const samples = videoTrack.samples;\n        const nbSamples = samples.length;\n        if (nbSamples) {\n          const lastSample = samples[nbSamples - 1];\n          VideoSample.pts = lastSample.pts;\n          VideoSample.dts = lastSample.dts;\n        } else {\n          // dropping samples, no timestamp found\n          videoTrack.dropped++;\n          return;\n        }\n      }\n      videoTrack.samples.push(VideoSample as VideoSample);\n    }\n  }\n\n  abstract parsePES(\n    track: DemuxedVideoTrack,\n    textTrack: DemuxedUserdataTrack,\n    pes: PES,\n    last: boolean,\n  );\n\n  protected abstract getNALuType(data: Uint8Array, offset: number): number;\n\n  protected parseNALu(\n    track: DemuxedVideoTrack,\n    array: Uint8Array,\n    endOfSegment: boolean,\n  ): Array<{\n    data: Uint8Array;\n    type: number;\n    state?: number;\n  }> {\n    const len = array.byteLength;\n    let state = track.naluState || 0;\n    const lastState = state;\n    const units: VideoSampleUnit[] = [];\n    let i = 0;\n    let value: number;\n    let overflow: number;\n    let unitType: number;\n    let lastUnitStart = -1;\n    let lastUnitType: number = 0;\n    // logger.log('PES:' + Hex.hexDump(array));\n\n    if (state === -1) {\n      // special use case where we found 3 or 4-byte start codes exactly at the end of previous PES packet\n      lastUnitStart = 0;\n      // NALu type is value read from offset 0\n      lastUnitType = this.getNALuType(array, 0);\n      state = 0;\n      i = 1;\n    }\n\n    while (i < len) {\n      value = array[i++];\n      // optimization. state 0 and 1 are the predominant case. let's handle them outside of the switch/case\n      if (!state) {\n        state = value ? 0 : 1;\n        continue;\n      }\n      if (state === 1) {\n        state = value ? 0 : 2;\n        continue;\n      }\n      // here we have state either equal to 2 or 3\n      if (!value) {\n        state = 3;\n      } else if (value === 1) {\n        overflow = i - state - 1;\n        if (lastUnitStart >= 0) {\n          const unit: VideoSampleUnit = {\n            data: array.subarray(lastUnitStart, overflow),\n            type: lastUnitType,\n          };\n          // logger.log('pushing NALU, type/size:' + unit.type + '/' + unit.data.byteLength);\n          units.push(unit);\n        } else {\n          // lastUnitStart is undefined => this is the first start code found in this PES packet\n          // first check if start code delimiter is overlapping between 2 PES packets,\n          // ie it started in last packet (lastState not zero)\n          // and ended at the beginning of this PES packet (i <= 4 - lastState)\n          const lastUnit = this.getLastNalUnit(track.samples);\n          if (lastUnit) {\n            if (lastState && i <= 4 - lastState) {\n              // start delimiter overlapping between PES packets\n              // strip start delimiter bytes from the end of last NAL unit\n              // check if lastUnit had a state different from zero\n              if (lastUnit.state) {\n                // strip last bytes\n                lastUnit.data = lastUnit.data.subarray(\n                  0,\n                  lastUnit.data.byteLength - lastState,\n                );\n              }\n            }\n            // If NAL units are not starting right at the beginning of the PES packet, push preceding data into previous NAL unit.\n\n            if (overflow > 0) {\n              // logger.log('first NALU found with overflow:' + overflow);\n              lastUnit.data = appendUint8Array(\n                lastUnit.data,\n                array.subarray(0, overflow),\n              );\n              lastUnit.state = 0;\n            }\n          }\n        }\n        // check if we can read unit type\n        if (i < len) {\n          unitType = this.getNALuType(array, i);\n          // logger.log('find NALU @ offset:' + i + ',type:' + unitType);\n          lastUnitStart = i;\n          lastUnitType = unitType;\n          state = 0;\n        } else {\n          // not enough byte to read unit type. let's read it on next PES parsing\n          state = -1;\n        }\n      } else {\n        state = 0;\n      }\n    }\n    if (lastUnitStart >= 0 && state >= 0) {\n      const unit: VideoSampleUnit = {\n        data: array.subarray(lastUnitStart, len),\n        type: lastUnitType,\n        state: state,\n      };\n      units.push(unit);\n      // logger.log('pushing NALU, type/size/state:' + unit.type + '/' + unit.data.byteLength + '/' + state);\n    }\n    // no NALu found\n    if (units.length === 0) {\n      // append pes.data to previous NAL unit\n      const lastUnit = this.getLastNalUnit(track.samples);\n      if (lastUnit) {\n        lastUnit.data = appendUint8Array(lastUnit.data, array);\n      }\n    }\n    track.naluState = state;\n    return units;\n  }\n}\n\nexport default BaseVideoParser;\n", "/**\n * Parser for exponential Golomb codes, a variable-bitwidth number encoding scheme used by h264.\n */\n\nimport { logger } from '../../utils/logger';\n\nclass ExpGolomb {\n  private data: Uint8Array;\n  public bytesAvailable: number;\n  private word: number;\n  private bitsAvailable: number;\n\n  constructor(data: Uint8Array) {\n    this.data = data;\n    // the number of bytes left to examine in this.data\n    this.bytesAvailable = data.byteLength;\n    // the current word being examined\n    this.word = 0; // :uint\n    // the number of bits left to examine in the current word\n    this.bitsAvailable = 0; // :uint\n  }\n\n  // ():void\n  loadWord(): void {\n    const data = this.data;\n    const bytesAvailable = this.bytesAvailable;\n    const position = data.byteLength - bytesAvailable;\n    const workingBytes = new Uint8Array(4);\n    const availableBytes = Math.min(4, bytesAvailable);\n    if (availableBytes === 0) {\n      throw new Error('no bytes available');\n    }\n\n    workingBytes.set(data.subarray(position, position + availableBytes));\n    this.word = new DataView(workingBytes.buffer).getUint32(0);\n    // track the amount of this.data that has been processed\n    this.bitsAvailable = availableBytes * 8;\n    this.bytesAvailable -= availableBytes;\n  }\n\n  // (count:int):void\n  skipBits(count: number): void {\n    let skipBytes; // :int\n    count = Math.min(count, this.bytesAvailable * 8 + this.bitsAvailable);\n    if (this.bitsAvailable > count) {\n      this.word <<= count;\n      this.bitsAvailable -= count;\n    } else {\n      count -= this.bitsAvailable;\n      skipBytes = count >> 3;\n      count -= skipBytes << 3;\n      this.bytesAvailable -= skipBytes;\n      this.loadWord();\n      this.word <<= count;\n      this.bitsAvailable -= count;\n    }\n  }\n\n  // (size:int):uint\n  readBits(size: number): number {\n    let bits = Math.min(this.bitsAvailable, size); // :uint\n    const valu = this.word >>> (32 - bits); // :uint\n    if (size > 32) {\n      logger.error('Cannot read more than 32 bits at a time');\n    }\n\n    this.bitsAvailable -= bits;\n    if (this.bitsAvailable > 0) {\n      this.word <<= bits;\n    } else if (this.bytesAvailable > 0) {\n      this.loadWord();\n    } else {\n      throw new Error('no bits available');\n    }\n\n    bits = size - bits;\n    if (bits > 0 && this.bitsAvailable) {\n      return (valu << bits) | this.readBits(bits);\n    } else {\n      return valu;\n    }\n  }\n\n  // ():uint\n  skipLZ(): number {\n    let leadingZeroCount; // :uint\n    for (\n      leadingZeroCount = 0;\n      leadingZeroCount < this.bitsAvailable;\n      ++leadingZeroCount\n    ) {\n      if ((this.word & (0x80000000 >>> leadingZeroCount)) !== 0) {\n        // the first bit of working word is 1\n        this.word <<= leadingZeroCount;\n        this.bitsAvailable -= leadingZeroCount;\n        return leadingZeroCount;\n      }\n    }\n    // we exhausted word and still have not found a 1\n    this.loadWord();\n    return leadingZeroCount + this.skipLZ();\n  }\n\n  // ():void\n  skipUEG(): void {\n    this.skipBits(1 + this.skipLZ());\n  }\n\n  // ():void\n  skipEG(): void {\n    this.skipBits(1 + this.skipLZ());\n  }\n\n  // ():uint\n  readUEG(): number {\n    const clz = this.skipLZ(); // :uint\n    return this.readBits(clz + 1) - 1;\n  }\n\n  // ():int\n  readEG(): number {\n    const valu = this.readUEG(); // :int\n    if (0x01 & valu) {\n      // the number is odd if the low order bit is set\n      return (1 + valu) >>> 1; // add 1 to make it even, and divide by 2\n    } else {\n      return -1 * (valu >>> 1); // divide by two then make it negative\n    }\n  }\n\n  // Some convenience functions\n  // :Boolean\n  readBoolean(): boolean {\n    return this.readBits(1) === 1;\n  }\n\n  // ():int\n  readUByte(): number {\n    return this.readBits(8);\n  }\n\n  // ():int\n  readUShort(): number {\n    return this.readBits(16);\n  }\n\n  // ():int\n  readUInt(): number {\n    return this.readBits(32);\n  }\n}\n\nexport default ExpGolomb;\n", "import BaseVideoParser from './base-video-parser';\nimport ExpGolomb from './exp-golomb';\nimport { parseSEIMessageFromNALu } from '../../utils/mp4-tools';\nimport type {\n  DemuxedUserdataTrack,\n  DemuxedVideoTrack,\n} from '../../types/demuxer';\nimport type { PES } from '../tsdemuxer';\n\nclass AvcVideoParser extends BaseVideoParser {\n  public parsePES(\n    track: DemuxedVideoTrack,\n    textTrack: DemuxedUserdataTrack,\n    pes: PES,\n    endOfSegment: boolean,\n  ) {\n    const units = this.parseNALu(track, pes.data, endOfSegment);\n    let VideoSample = this.VideoSample;\n    let push: boolean;\n    let spsfound = false;\n    // free pes.data to save up some memory\n    (pes as any).data = null;\n\n    // if new NAL units found and last sample still there, let's push ...\n    // this helps parsing streams with missing AUD (only do this if AUD never found)\n    if (VideoSample && units.length && !track.audFound) {\n      this.pushAccessUnit(VideoSample, track);\n      VideoSample = this.VideoSample = this.createVideoSample(\n        false,\n        pes.pts,\n        pes.dts,\n      );\n    }\n\n    units.forEach((unit) => {\n      switch (unit.type) {\n        // NDR\n        case 1: {\n          let iskey = false;\n          push = true;\n          const data = unit.data;\n          // only check slice type to detect KF in case SPS found in same packet (any keyframe is preceded by SPS ...)\n          if (spsfound && data.length > 4) {\n            // retrieve slice type by parsing beginning of NAL unit (follow H264 spec, slice_header definition) to detect keyframe embedded in NDR\n            const sliceType = this.readSliceType(data);\n            // 2 : I slice, 4 : SI slice, 7 : I slice, 9: SI slice\n            // SI slice : A slice that is coded using intra prediction only and using quantisation of the prediction samples.\n            // An SI slice can be coded such that its decoded samples can be constructed identically to an SP slice.\n            // I slice: A slice that is not an SI slice that is decoded using intra prediction only.\n            // if (sliceType === 2 || sliceType === 7) {\n            if (\n              sliceType === 2 ||\n              sliceType === 4 ||\n              sliceType === 7 ||\n              sliceType === 9\n            ) {\n              iskey = true;\n            }\n          }\n\n          if (iskey) {\n            // if we have non-keyframe data already, that cannot belong to the same frame as a keyframe, so force a push\n            if (VideoSample?.frame && !VideoSample.key) {\n              this.pushAccessUnit(VideoSample, track);\n              VideoSample = this.VideoSample = null;\n            }\n          }\n\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              true,\n              pes.pts,\n              pes.dts,\n            );\n          }\n          VideoSample.frame = true;\n          VideoSample.key = iskey;\n\n          break;\n          // IDR\n        }\n        case 5:\n          push = true;\n          // handle PES not starting with AUD\n          // if we have frame data already, that cannot belong to the same frame, so force a push\n          if (VideoSample?.frame && !VideoSample.key) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = this.VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              true,\n              pes.pts,\n              pes.dts,\n            );\n          }\n\n          VideoSample.key = true;\n          VideoSample.frame = true;\n          break;\n        // SEI\n        case 6: {\n          push = true;\n          parseSEIMessageFromNALu(\n            unit.data,\n            1,\n            pes.pts as number,\n            textTrack.samples,\n          );\n          break;\n          // SPS\n        }\n        case 7: {\n          push = true;\n          spsfound = true;\n          const sps = unit.data;\n          const config = this.readSPS(sps);\n          if (\n            !track.sps ||\n            track.width !== config.width ||\n            track.height !== config.height ||\n            track.pixelRatio?.[0] !== config.pixelRatio[0] ||\n            track.pixelRatio?.[1] !== config.pixelRatio[1]\n          ) {\n            track.width = config.width;\n            track.height = config.height;\n            track.pixelRatio = config.pixelRatio;\n            track.sps = [sps];\n            const codecarray = sps.subarray(1, 4);\n            let codecstring = 'avc1.';\n            for (let i = 0; i < 3; i++) {\n              let h = codecarray[i].toString(16);\n              if (h.length < 2) {\n                h = '0' + h;\n              }\n\n              codecstring += h;\n            }\n            track.codec = codecstring;\n          }\n          break;\n        }\n        // PPS\n        case 8:\n          push = true;\n\n          track.pps = [unit.data];\n\n          break;\n        // AUD\n        case 9:\n          push = true;\n          track.audFound = true;\n          if (VideoSample?.frame) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              false,\n              pes.pts,\n              pes.dts,\n            );\n          }\n          break;\n        // Filler Data\n        case 12:\n          push = true;\n          break;\n        default:\n          push = false;\n\n          break;\n      }\n      if (VideoSample && push) {\n        const units = VideoSample.units;\n        units.push(unit);\n      }\n    });\n    // if last PES packet, push samples\n    if (endOfSegment && VideoSample) {\n      this.pushAccessUnit(VideoSample, track);\n      this.VideoSample = null;\n    }\n  }\n\n  protected getNALuType(data: Uint8Array, offset: number): number {\n    return data[offset] & 0x1f;\n  }\n\n  readSliceType(data: Uint8Array) {\n    const eg = new ExpGolomb(data);\n    // skip NALu type\n    eg.readUByte();\n    // discard first_mb_in_slice\n    eg.readUEG();\n    // return slice_type\n    return eg.readUEG();\n  }\n\n  /**\n   * The scaling list is optionally transmitted as part of a sequence parameter\n   * set and is not relevant to transmuxing.\n   * @param count the number of entries in this scaling list\n   * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n   */\n  skipScalingList(count: number, reader: ExpGolomb): void {\n    let lastScale = 8;\n    let nextScale = 8;\n    let deltaScale;\n    for (let j = 0; j < count; j++) {\n      if (nextScale !== 0) {\n        deltaScale = reader.readEG();\n        nextScale = (lastScale + deltaScale + 256) % 256;\n      }\n      lastScale = nextScale === 0 ? lastScale : nextScale;\n    }\n  }\n\n  /**\n   * Read a sequence parameter set and return some interesting video\n   * properties. A sequence parameter set is the H264 metadata that\n   * describes the properties of upcoming video frames.\n   * @returns an object with configuration parsed from the\n   * sequence parameter set, including the dimensions of the\n   * associated video frames.\n   */\n  readSPS(sps: Uint8Array): {\n    width: number;\n    height: number;\n    pixelRatio: [number, number];\n  } {\n    const eg = new ExpGolomb(sps);\n    let frameCropLeftOffset = 0;\n    let frameCropRightOffset = 0;\n    let frameCropTopOffset = 0;\n    let frameCropBottomOffset = 0;\n    let numRefFramesInPicOrderCntCycle;\n    let scalingListCount;\n    let i;\n    const readUByte = eg.readUByte.bind(eg);\n    const readBits = eg.readBits.bind(eg);\n    const readUEG = eg.readUEG.bind(eg);\n    const readBoolean = eg.readBoolean.bind(eg);\n    const skipBits = eg.skipBits.bind(eg);\n    const skipEG = eg.skipEG.bind(eg);\n    const skipUEG = eg.skipUEG.bind(eg);\n    const skipScalingList = this.skipScalingList.bind(this);\n\n    readUByte();\n    const profileIdc = readUByte(); // profile_idc\n    readBits(5); // profileCompat constraint_set[0-4]_flag, u(5)\n    skipBits(3); // reserved_zero_3bits u(3),\n    readUByte(); // level_idc u(8)\n    skipUEG(); // seq_parameter_set_id\n    // some profiles have more optional data we don't need\n    if (\n      profileIdc === 100 ||\n      profileIdc === 110 ||\n      profileIdc === 122 ||\n      profileIdc === 244 ||\n      profileIdc === 44 ||\n      profileIdc === 83 ||\n      profileIdc === 86 ||\n      profileIdc === 118 ||\n      profileIdc === 128\n    ) {\n      const chromaFormatIdc = readUEG();\n      if (chromaFormatIdc === 3) {\n        skipBits(1);\n      } // separate_colour_plane_flag\n\n      skipUEG(); // bit_depth_luma_minus8\n      skipUEG(); // bit_depth_chroma_minus8\n      skipBits(1); // qpprime_y_zero_transform_bypass_flag\n      if (readBoolean()) {\n        // seq_scaling_matrix_present_flag\n        scalingListCount = chromaFormatIdc !== 3 ? 8 : 12;\n        for (i = 0; i < scalingListCount; i++) {\n          if (readBoolean()) {\n            // seq_scaling_list_present_flag[ i ]\n            if (i < 6) {\n              skipScalingList(16, eg);\n            } else {\n              skipScalingList(64, eg);\n            }\n          }\n        }\n      }\n    }\n    skipUEG(); // log2_max_frame_num_minus4\n    const picOrderCntType = readUEG();\n    if (picOrderCntType === 0) {\n      readUEG(); // log2_max_pic_order_cnt_lsb_minus4\n    } else if (picOrderCntType === 1) {\n      skipBits(1); // delta_pic_order_always_zero_flag\n      skipEG(); // offset_for_non_ref_pic\n      skipEG(); // offset_for_top_to_bottom_field\n      numRefFramesInPicOrderCntCycle = readUEG();\n      for (i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n        skipEG();\n      } // offset_for_ref_frame[ i ]\n    }\n    skipUEG(); // max_num_ref_frames\n    skipBits(1); // gaps_in_frame_num_value_allowed_flag\n    const picWidthInMbsMinus1 = readUEG();\n    const picHeightInMapUnitsMinus1 = readUEG();\n    const frameMbsOnlyFlag = readBits(1);\n    if (frameMbsOnlyFlag === 0) {\n      skipBits(1);\n    } // mb_adaptive_frame_field_flag\n\n    skipBits(1); // direct_8x8_inference_flag\n    if (readBoolean()) {\n      // frame_cropping_flag\n      frameCropLeftOffset = readUEG();\n      frameCropRightOffset = readUEG();\n      frameCropTopOffset = readUEG();\n      frameCropBottomOffset = readUEG();\n    }\n    let pixelRatio: [number, number] = [1, 1];\n    if (readBoolean()) {\n      // vui_parameters_present_flag\n      if (readBoolean()) {\n        // aspect_ratio_info_present_flag\n        const aspectRatioIdc = readUByte();\n        switch (aspectRatioIdc) {\n          case 1:\n            pixelRatio = [1, 1];\n            break;\n          case 2:\n            pixelRatio = [12, 11];\n            break;\n          case 3:\n            pixelRatio = [10, 11];\n            break;\n          case 4:\n            pixelRatio = [16, 11];\n            break;\n          case 5:\n            pixelRatio = [40, 33];\n            break;\n          case 6:\n            pixelRatio = [24, 11];\n            break;\n          case 7:\n            pixelRatio = [20, 11];\n            break;\n          case 8:\n            pixelRatio = [32, 11];\n            break;\n          case 9:\n            pixelRatio = [80, 33];\n            break;\n          case 10:\n            pixelRatio = [18, 11];\n            break;\n          case 11:\n            pixelRatio = [15, 11];\n            break;\n          case 12:\n            pixelRatio = [64, 33];\n            break;\n          case 13:\n            pixelRatio = [160, 99];\n            break;\n          case 14:\n            pixelRatio = [4, 3];\n            break;\n          case 15:\n            pixelRatio = [3, 2];\n            break;\n          case 16:\n            pixelRatio = [2, 1];\n            break;\n          case 255: {\n            pixelRatio = [\n              (readUByte() << 8) | readUByte(),\n              (readUByte() << 8) | readUByte(),\n            ];\n            break;\n          }\n        }\n      }\n    }\n    return {\n      width: Math.ceil(\n        (picWidthInMbsMinus1 + 1) * 16 -\n          frameCropLeftOffset * 2 -\n          frameCropRightOffset * 2,\n      ),\n      height:\n        (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 -\n        (frameMbsOnlyFlag ? 2 : 4) *\n          (frameCropTopOffset + frameCropBottomOffset),\n      pixelRatio: pixelRatio,\n    };\n  }\n}\n\nexport default AvcVideoParser;\n", "import BaseVideoParser from './base-video-parser';\nimport ExpGolomb from './exp-golomb';\nimport { parseSEIMessageFromNALu } from '../../utils/mp4-tools';\nimport type {\n  DemuxedUserdataTrack,\n  DemuxedVideoTrack,\n} from '../../types/demuxer';\nimport type { ParsedVideoSample } from '../tsdemuxer';\nimport type { PES } from '../tsdemuxer';\n\nclass HevcVideoParser extends BaseVideoParser {\n  protected initVPS: Uint8Array | null = null;\n\n  public parsePES(\n    track: DemuxedVideoTrack,\n    textTrack: DemuxedUserdataTrack,\n    pes: PES,\n    endOfSegment: boolean,\n  ) {\n    const units = this.parseNALu(track, pes.data, endOfSegment);\n    let VideoSample = this.VideoSample;\n    let push: boolean;\n    let spsfound = false;\n    // free pes.data to save up some memory\n    (pes as any).data = null;\n\n    // if new NAL units found and last sample still there, let's push ...\n    // this helps parsing streams with missing AUD (only do this if AUD never found)\n    if (VideoSample && units.length && !track.audFound) {\n      this.pushAccessUnit(VideoSample, track);\n      VideoSample = this.VideoSample = this.createVideoSample(\n        false,\n        pes.pts,\n        pes.dts,\n      );\n    }\n\n    units.forEach((unit) => {\n      switch (unit.type) {\n        // NON-IDR, NON RANDOM ACCESS SLICE\n        case 0:\n        case 1:\n        case 2:\n        case 3:\n        case 4:\n        case 5:\n        case 6:\n        case 7:\n        case 8:\n        case 9:\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              false,\n              pes.pts,\n              pes.dts,\n            );\n          }\n          VideoSample.frame = true;\n          push = true;\n          break;\n\n        // CRA, BLA (random access picture)\n        case 16:\n        case 17:\n        case 18:\n        case 21:\n          push = true;\n          if (spsfound) {\n            // handle PES not starting with AUD\n            // if we have frame data already, that cannot belong to the same frame, so force a push\n            if (VideoSample?.frame && !VideoSample.key) {\n              this.pushAccessUnit(VideoSample, track);\n              VideoSample = this.VideoSample = null;\n            }\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              true,\n              pes.pts,\n              pes.dts,\n            );\n          }\n\n          VideoSample.key = true;\n          VideoSample.frame = true;\n          break;\n\n        // IDR\n        case 19:\n        case 20:\n          push = true;\n          // handle PES not starting with AUD\n          // if we have frame data already, that cannot belong to the same frame, so force a push\n          if (VideoSample?.frame && !VideoSample.key) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = this.VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              true,\n              pes.pts,\n              pes.dts,\n            );\n          }\n\n          VideoSample.key = true;\n          VideoSample.frame = true;\n          break;\n\n        // SEI\n        case 39:\n          push = true;\n          parseSEIMessageFromNALu(\n            unit.data,\n            2, // NALu header size\n            pes.pts as number,\n            textTrack.samples,\n          );\n          break;\n\n        // VPS\n        case 32:\n          push = true;\n          if (!track.vps) {\n            if (typeof track.params !== 'object') {\n              track.params = {};\n            }\n            track.params = Object.assign(track.params, this.readVPS(unit.data));\n            this.initVPS = unit.data;\n          }\n          track.vps = [unit.data];\n          break;\n\n        // SPS\n        case 33:\n          push = true;\n          spsfound = true;\n          if (\n            track.vps !== undefined &&\n            track.vps[0] !== this.initVPS &&\n            track.sps !== undefined &&\n            !this.matchSPS(track.sps[0], unit.data)\n          ) {\n            this.initVPS = track.vps[0];\n            track.sps = track.pps = undefined;\n          }\n          if (!track.sps) {\n            const config = this.readSPS(unit.data);\n            track.width = config.width;\n            track.height = config.height;\n            track.pixelRatio = config.pixelRatio;\n            track.codec = config.codecString;\n            track.sps = [];\n            if (typeof track.params !== 'object') {\n              track.params = {};\n            }\n            for (const prop in config.params) {\n              track.params[prop] = config.params[prop];\n            }\n          }\n          this.pushParameterSet(track.sps, unit.data, track.vps);\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              true,\n              pes.pts,\n              pes.dts,\n            );\n          }\n          VideoSample.key = true;\n          break;\n\n        // PPS\n        case 34:\n          push = true;\n          if (typeof track.params === 'object') {\n            if (!track.pps) {\n              track.pps = [];\n              const config = this.readPPS(unit.data);\n              for (const prop in config) {\n                track.params[prop] = config[prop];\n              }\n            }\n            this.pushParameterSet(track.pps, unit.data, track.vps);\n          }\n          break;\n\n        // ACCESS UNIT DELIMITER\n        case 35:\n          push = true;\n          track.audFound = true;\n          if (VideoSample?.frame) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(\n              false,\n              pes.pts,\n              pes.dts,\n            );\n          }\n          break;\n\n        default:\n          push = false;\n          break;\n      }\n      if (VideoSample && push) {\n        const units = VideoSample.units;\n        units.push(unit);\n      }\n    });\n    // if last PES packet, push samples\n    if (endOfSegment && VideoSample) {\n      this.pushAccessUnit(VideoSample, track);\n      this.VideoSample = null;\n    }\n  }\n\n  private pushParameterSet(\n    parameterSets: Uint8Array[],\n    data: Uint8Array,\n    vps: Uint8Array[] | undefined,\n  ) {\n    if ((vps && vps[0] === this.initVPS) || (!vps && !parameterSets.length)) {\n      parameterSets.push(data);\n    }\n  }\n\n  protected getNALuType(data: Uint8Array, offset: number): number {\n    return (data[offset] & 0x7e) >>> 1;\n  }\n\n  protected ebsp2rbsp(arr: Uint8Array): Uint8Array {\n    const dst = new Uint8Array(arr.byteLength);\n    let dstIdx = 0;\n    for (let i = 0; i < arr.byteLength; i++) {\n      if (i >= 2) {\n        // Unescape: Skip 0x03 after 00 00\n        if (arr[i] === 0x03 && arr[i - 1] === 0x00 && arr[i - 2] === 0x00) {\n          continue;\n        }\n      }\n      dst[dstIdx] = arr[i];\n      dstIdx++;\n    }\n    return new Uint8Array(dst.buffer, 0, dstIdx);\n  }\n\n  protected pushAccessUnit(\n    VideoSample: ParsedVideoSample,\n    videoTrack: DemuxedVideoTrack,\n  ) {\n    super.pushAccessUnit(VideoSample, videoTrack);\n    if (this.initVPS) {\n      this.initVPS = null; // null initVPS to prevent possible track's sps/pps growth until next VPS\n    }\n  }\n\n  readVPS(vps: Uint8Array): {\n    numTemporalLayers: number;\n    temporalIdNested: boolean;\n  } {\n    const eg = new ExpGolomb(vps);\n    // remove header\n    eg.readUByte();\n    eg.readUByte();\n\n    eg.readBits(4); // video_parameter_set_id\n    eg.skipBits(2);\n    eg.readBits(6); // max_layers_minus1\n    const max_sub_layers_minus1 = eg.readBits(3);\n    const temporal_id_nesting_flag = eg.readBoolean();\n    // ...vui fps can be here, but empty fps value is not critical for metadata\n\n    return {\n      numTemporalLayers: max_sub_layers_minus1 + 1,\n      temporalIdNested: temporal_id_nesting_flag,\n    };\n  }\n\n  readSPS(sps: Uint8Array): {\n    codecString: string;\n    params: object;\n    width: number;\n    height: number;\n    pixelRatio: [number, number];\n  } {\n    const eg = new ExpGolomb(this.ebsp2rbsp(sps));\n    eg.readUByte();\n    eg.readUByte();\n\n    eg.readBits(4); //video_parameter_set_id\n    const max_sub_layers_minus1 = eg.readBits(3);\n    eg.readBoolean(); // temporal_id_nesting_flag\n\n    // profile_tier_level\n    const general_profile_space = eg.readBits(2);\n    const general_tier_flag = eg.readBoolean();\n    const general_profile_idc = eg.readBits(5);\n    const general_profile_compatibility_flags_1 = eg.readUByte();\n    const general_profile_compatibility_flags_2 = eg.readUByte();\n    const general_profile_compatibility_flags_3 = eg.readUByte();\n    const general_profile_compatibility_flags_4 = eg.readUByte();\n    const general_constraint_indicator_flags_1 = eg.readUByte();\n    const general_constraint_indicator_flags_2 = eg.readUByte();\n    const general_constraint_indicator_flags_3 = eg.readUByte();\n    const general_constraint_indicator_flags_4 = eg.readUByte();\n    const general_constraint_indicator_flags_5 = eg.readUByte();\n    const general_constraint_indicator_flags_6 = eg.readUByte();\n    const general_level_idc = eg.readUByte();\n    const sub_layer_profile_present_flags: boolean[] = [];\n    const sub_layer_level_present_flags: boolean[] = [];\n    for (let i = 0; i < max_sub_layers_minus1; i++) {\n      sub_layer_profile_present_flags.push(eg.readBoolean());\n      sub_layer_level_present_flags.push(eg.readBoolean());\n    }\n    if (max_sub_layers_minus1 > 0) {\n      for (let i = max_sub_layers_minus1; i < 8; i++) {\n        eg.readBits(2);\n      }\n    }\n    for (let i = 0; i < max_sub_layers_minus1; i++) {\n      if (sub_layer_profile_present_flags[i]) {\n        eg.readUByte(); // sub_layer_profile_space, sub_layer_tier_flag, sub_layer_profile_idc\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte(); // sub_layer_profile_compatibility_flag\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n      }\n      if (sub_layer_level_present_flags[i]) {\n        eg.readUByte();\n      }\n    }\n\n    eg.readUEG(); // seq_parameter_set_id\n    const chroma_format_idc = eg.readUEG();\n    if (chroma_format_idc == 3) {\n      eg.skipBits(1); //separate_colour_plane_flag\n    }\n    const pic_width_in_luma_samples = eg.readUEG();\n    const pic_height_in_luma_samples = eg.readUEG();\n    const conformance_window_flag = eg.readBoolean();\n    let pic_left_offset = 0,\n      pic_right_offset = 0,\n      pic_top_offset = 0,\n      pic_bottom_offset = 0;\n    if (conformance_window_flag) {\n      pic_left_offset += eg.readUEG();\n      pic_right_offset += eg.readUEG();\n      pic_top_offset += eg.readUEG();\n      pic_bottom_offset += eg.readUEG();\n    }\n    const bit_depth_luma_minus8 = eg.readUEG();\n    const bit_depth_chroma_minus8 = eg.readUEG();\n    const log2_max_pic_order_cnt_lsb_minus4 = eg.readUEG();\n    const sub_layer_ordering_info_present_flag = eg.readBoolean();\n    for (\n      let i = sub_layer_ordering_info_present_flag ? 0 : max_sub_layers_minus1;\n      i <= max_sub_layers_minus1;\n      i++\n    ) {\n      eg.skipUEG(); // max_dec_pic_buffering_minus1[i]\n      eg.skipUEG(); // max_num_reorder_pics[i]\n      eg.skipUEG(); // max_latency_increase_plus1[i]\n    }\n    eg.skipUEG(); // log2_min_luma_coding_block_size_minus3\n    eg.skipUEG(); // log2_diff_max_min_luma_coding_block_size\n    eg.skipUEG(); // log2_min_transform_block_size_minus2\n    eg.skipUEG(); // log2_diff_max_min_transform_block_size\n    eg.skipUEG(); // max_transform_hierarchy_depth_inter\n    eg.skipUEG(); // max_transform_hierarchy_depth_intra\n    const scaling_list_enabled_flag = eg.readBoolean();\n    if (scaling_list_enabled_flag) {\n      const sps_scaling_list_data_present_flag = eg.readBoolean();\n      if (sps_scaling_list_data_present_flag) {\n        for (let sizeId = 0; sizeId < 4; sizeId++) {\n          for (\n            let matrixId = 0;\n            matrixId < (sizeId === 3 ? 2 : 6);\n            matrixId++\n          ) {\n            const scaling_list_pred_mode_flag = eg.readBoolean();\n            if (!scaling_list_pred_mode_flag) {\n              eg.readUEG(); // scaling_list_pred_matrix_id_delta\n            } else {\n              const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));\n              if (sizeId > 1) {\n                eg.readEG();\n              }\n              for (let i = 0; i < coefNum; i++) {\n                eg.readEG();\n              }\n            }\n          }\n        }\n      }\n    }\n\n    eg.readBoolean(); // amp_enabled_flag\n    eg.readBoolean(); // sample_adaptive_offset_enabled_flag\n    const pcm_enabled_flag = eg.readBoolean();\n    if (pcm_enabled_flag) {\n      eg.readUByte();\n      eg.skipUEG();\n      eg.skipUEG();\n      eg.readBoolean();\n    }\n    const num_short_term_ref_pic_sets = eg.readUEG();\n    let num_delta_pocs = 0;\n    for (let i = 0; i < num_short_term_ref_pic_sets; i++) {\n      let inter_ref_pic_set_prediction_flag = false;\n      if (i !== 0) {\n        inter_ref_pic_set_prediction_flag = eg.readBoolean();\n      }\n      if (inter_ref_pic_set_prediction_flag) {\n        if (i === num_short_term_ref_pic_sets) {\n          eg.readUEG();\n        }\n        eg.readBoolean();\n        eg.readUEG();\n        let next_num_delta_pocs = 0;\n        for (let j = 0; j <= num_delta_pocs; j++) {\n          const used_by_curr_pic_flag = eg.readBoolean();\n          let use_delta_flag = false;\n          if (!used_by_curr_pic_flag) {\n            use_delta_flag = eg.readBoolean();\n          }\n          if (used_by_curr_pic_flag || use_delta_flag) {\n            next_num_delta_pocs++;\n          }\n        }\n        num_delta_pocs = next_num_delta_pocs;\n      } else {\n        const num_negative_pics = eg.readUEG();\n        const num_positive_pics = eg.readUEG();\n        num_delta_pocs = num_negative_pics + num_positive_pics;\n        for (let j = 0; j < num_negative_pics; j++) {\n          eg.readUEG();\n          eg.readBoolean();\n        }\n        for (let j = 0; j < num_positive_pics; j++) {\n          eg.readUEG();\n          eg.readBoolean();\n        }\n      }\n    }\n\n    const long_term_ref_pics_present_flag = eg.readBoolean();\n    if (long_term_ref_pics_present_flag) {\n      const num_long_term_ref_pics_sps = eg.readUEG();\n      for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n        for (let j = 0; j < log2_max_pic_order_cnt_lsb_minus4 + 4; j++) {\n          eg.readBits(1);\n        }\n        eg.readBits(1);\n      }\n    }\n\n    let min_spatial_segmentation_idc = 0;\n    let sar_width = 1,\n      sar_height = 1;\n    let fps_fixed = true,\n      fps_den = 1,\n      fps_num = 0;\n    eg.readBoolean(); // sps_temporal_mvp_enabled_flag\n    eg.readBoolean(); // strong_intra_smoothing_enabled_flag\n    let default_display_window_flag = false;\n    const vui_parameters_present_flag = eg.readBoolean();\n    if (vui_parameters_present_flag) {\n      const aspect_ratio_info_present_flag = eg.readBoolean();\n      if (aspect_ratio_info_present_flag) {\n        const aspect_ratio_idc = eg.readUByte();\n        const sar_width_table = [\n          1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2,\n        ];\n        const sar_height_table = [\n          1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1,\n        ];\n        if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n          sar_width = sar_width_table[aspect_ratio_idc - 1];\n          sar_height = sar_height_table[aspect_ratio_idc - 1];\n        } else if (aspect_ratio_idc === 255) {\n          sar_width = eg.readBits(16);\n          sar_height = eg.readBits(16);\n        }\n      }\n      const overscan_info_present_flag = eg.readBoolean();\n      if (overscan_info_present_flag) {\n        eg.readBoolean();\n      }\n      const video_signal_type_present_flag = eg.readBoolean();\n      if (video_signal_type_present_flag) {\n        eg.readBits(3);\n        eg.readBoolean();\n        const colour_description_present_flag = eg.readBoolean();\n        if (colour_description_present_flag) {\n          eg.readUByte();\n          eg.readUByte();\n          eg.readUByte();\n        }\n      }\n      const chroma_loc_info_present_flag = eg.readBoolean();\n      if (chroma_loc_info_present_flag) {\n        eg.readUEG();\n        eg.readUEG();\n      }\n      eg.readBoolean(); // neutral_chroma_indication_flag\n      eg.readBoolean(); // field_seq_flag\n      eg.readBoolean(); // frame_field_info_present_flag\n      default_display_window_flag = eg.readBoolean();\n      if (default_display_window_flag) {\n        eg.skipUEG();\n        eg.skipUEG();\n        eg.skipUEG();\n        eg.skipUEG();\n      }\n      const vui_timing_info_present_flag = eg.readBoolean();\n      if (vui_timing_info_present_flag) {\n        fps_den = eg.readBits(32);\n        fps_num = eg.readBits(32);\n        const vui_poc_proportional_to_timing_flag = eg.readBoolean();\n        if (vui_poc_proportional_to_timing_flag) {\n          eg.readUEG();\n        }\n        const vui_hrd_parameters_present_flag = eg.readBoolean();\n        if (vui_hrd_parameters_present_flag) {\n          //const commonInfPresentFlag = true;\n          //if (commonInfPresentFlag) {\n          const nal_hrd_parameters_present_flag = eg.readBoolean();\n          const vcl_hrd_parameters_present_flag = eg.readBoolean();\n          let sub_pic_hrd_params_present_flag = false;\n          if (\n            nal_hrd_parameters_present_flag ||\n            vcl_hrd_parameters_present_flag\n          ) {\n            sub_pic_hrd_params_present_flag = eg.readBoolean();\n            if (sub_pic_hrd_params_present_flag) {\n              eg.readUByte();\n              eg.readBits(5);\n              eg.readBoolean();\n              eg.readBits(5);\n            }\n            eg.readBits(4); // bit_rate_scale\n            eg.readBits(4); // cpb_size_scale\n            if (sub_pic_hrd_params_present_flag) {\n              eg.readBits(4);\n            }\n            eg.readBits(5);\n            eg.readBits(5);\n            eg.readBits(5);\n          }\n          //}\n          for (let i = 0; i <= max_sub_layers_minus1; i++) {\n            fps_fixed = eg.readBoolean(); // fixed_pic_rate_general_flag\n            const fixed_pic_rate_within_cvs_flag =\n              fps_fixed || eg.readBoolean();\n            let low_delay_hrd_flag = false;\n            if (fixed_pic_rate_within_cvs_flag) {\n              eg.readEG();\n            } else {\n              low_delay_hrd_flag = eg.readBoolean();\n            }\n            const cpb_cnt = low_delay_hrd_flag ? 1 : eg.readUEG() + 1;\n            if (nal_hrd_parameters_present_flag) {\n              for (let j = 0; j < cpb_cnt; j++) {\n                eg.readUEG();\n                eg.readUEG();\n                if (sub_pic_hrd_params_present_flag) {\n                  eg.readUEG();\n                  eg.readUEG();\n                }\n                eg.skipBits(1);\n              }\n            }\n            if (vcl_hrd_parameters_present_flag) {\n              for (let j = 0; j < cpb_cnt; j++) {\n                eg.readUEG();\n                eg.readUEG();\n                if (sub_pic_hrd_params_present_flag) {\n                  eg.readUEG();\n                  eg.readUEG();\n                }\n                eg.skipBits(1);\n              }\n            }\n          }\n        }\n      }\n      const bitstream_restriction_flag = eg.readBoolean();\n      if (bitstream_restriction_flag) {\n        eg.readBoolean(); // tiles_fixed_structure_flag\n        eg.readBoolean(); // motion_vectors_over_pic_boundaries_flag\n        eg.readBoolean(); // restricted_ref_pic_lists_flag\n        min_spatial_segmentation_idc = eg.readUEG();\n      }\n    }\n\n    let width = pic_width_in_luma_samples,\n      height = pic_height_in_luma_samples;\n    if (conformance_window_flag) {\n      let chroma_scale_w = 1,\n        chroma_scale_h = 1;\n      if (chroma_format_idc === 1) {\n        // YUV 420\n        chroma_scale_w = chroma_scale_h = 2;\n      } else if (chroma_format_idc == 2) {\n        // YUV 422\n        chroma_scale_w = 2;\n      }\n      width =\n        pic_width_in_luma_samples -\n        chroma_scale_w * pic_right_offset -\n        chroma_scale_w * pic_left_offset;\n      height =\n        pic_height_in_luma_samples -\n        chroma_scale_h * pic_bottom_offset -\n        chroma_scale_h * pic_top_offset;\n    }\n\n    const profile_space_string = general_profile_space\n      ? ['A', 'B', 'C'][general_profile_space]\n      : '';\n    const profile_compatibility_buf =\n      (general_profile_compatibility_flags_1 << 24) |\n      (general_profile_compatibility_flags_2 << 16) |\n      (general_profile_compatibility_flags_3 << 8) |\n      general_profile_compatibility_flags_4;\n    let profile_compatibility_rev = 0;\n    for (let i = 0; i < 32; i++) {\n      profile_compatibility_rev =\n        (profile_compatibility_rev |\n          (((profile_compatibility_buf >> i) & 1) << (31 - i))) >>>\n        0; // reverse bit position (and cast as UInt32)\n    }\n    let profile_compatibility_flags_string =\n      profile_compatibility_rev.toString(16);\n    if (\n      general_profile_idc === 1 &&\n      profile_compatibility_flags_string === '2'\n    ) {\n      profile_compatibility_flags_string = '6';\n    }\n    const tier_flag_string = general_tier_flag ? 'H' : 'L';\n\n    return {\n      codecString: `hvc1.${profile_space_string}${general_profile_idc}.${profile_compatibility_flags_string}.${tier_flag_string}${general_level_idc}.B0`,\n      params: {\n        general_tier_flag,\n        general_profile_idc,\n        general_profile_space,\n        general_profile_compatibility_flags: [\n          general_profile_compatibility_flags_1,\n          general_profile_compatibility_flags_2,\n          general_profile_compatibility_flags_3,\n          general_profile_compatibility_flags_4,\n        ],\n        general_constraint_indicator_flags: [\n          general_constraint_indicator_flags_1,\n          general_constraint_indicator_flags_2,\n          general_constraint_indicator_flags_3,\n          general_constraint_indicator_flags_4,\n          general_constraint_indicator_flags_5,\n          general_constraint_indicator_flags_6,\n        ],\n        general_level_idc,\n        bit_depth: bit_depth_luma_minus8 + 8,\n        bit_depth_luma_minus8,\n        bit_depth_chroma_minus8,\n        min_spatial_segmentation_idc,\n        chroma_format_idc: chroma_format_idc,\n        frame_rate: {\n          fixed: fps_fixed,\n          fps: fps_num / fps_den,\n        },\n      },\n      width,\n      height,\n      pixelRatio: [sar_width, sar_height],\n    };\n  }\n\n  readPPS(pps: Uint8Array): {\n    parallelismType: number;\n  } {\n    const eg = new ExpGolomb(this.ebsp2rbsp(pps));\n    eg.readUByte();\n    eg.readUByte();\n    eg.skipUEG(); // pic_parameter_set_id\n    eg.skipUEG(); // seq_parameter_set_id\n    eg.skipBits(2); // dependent_slice_segments_enabled_flag, output_flag_present_flag\n    eg.skipBits(3); // num_extra_slice_header_bits\n    eg.skipBits(2); // sign_data_hiding_enabled_flag, cabac_init_present_flag\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipEG(); // init_qp_minus26\n    eg.skipBits(2); // constrained_intra_pred_flag, transform_skip_enabled_flag\n    const cu_qp_delta_enabled_flag = eg.readBoolean();\n    if (cu_qp_delta_enabled_flag) {\n      eg.skipUEG();\n    }\n    eg.skipEG(); // cb_qp_offset\n    eg.skipEG(); // cr_qp_offset\n    eg.skipBits(4); // pps_slice_chroma_qp_offsets_present_flag, weighted_pred_flag, weighted_bipred_flag, transquant_bypass_enabled_flag\n    const tiles_enabled_flag = eg.readBoolean();\n    const entropy_coding_sync_enabled_flag = eg.readBoolean();\n    let parallelismType = 1; // slice-based parallel decoding\n    if (entropy_coding_sync_enabled_flag && tiles_enabled_flag) {\n      parallelismType = 0; // mixed-type parallel decoding\n    } else if (entropy_coding_sync_enabled_flag) {\n      parallelismType = 3; // wavefront-based parallel decoding\n    } else if (tiles_enabled_flag) {\n      parallelismType = 2; // tile-based parallel decoding\n    }\n\n    return {\n      parallelismType,\n    };\n  }\n\n  matchSPS(sps1: Uint8Array, sps2: Uint8Array): boolean {\n    // compare without headers and VPS related params\n    return (\n      String.fromCharCode.apply(null, sps1).substr(3) ===\n      String.fromCharCode.apply(null, sps2).substr(3)\n    );\n  }\n}\n\nexport default HevcVideoParser;\n", "/**\n * highly optimized TS demuxer:\n * parse PAT, PMT\n * extract PES packet from audio and video PIDs\n * extract AVC/H264 (or HEVC/H265) NAL units and AAC/ADTS samples from PES packet\n * trigger the remuxer upon parsing completion\n * it also tries to workaround as best as it can audio codec switch (HE-AAC to AAC and vice versa), without having to restart the MediaSource.\n * it also controls the remuxing process :\n * upon discontinuity or level switch detection, it will also notifies the remuxer so that it can reset its state.\n */\n\nimport * as AC3 from './audio/ac3-demuxer';\nimport * as ADTS from './audio/adts';\nimport * as MpegAudio from './audio/mpegaudio';\nimport SampleAesDecrypter from './sample-aes';\nimport AvcVideoParser from './video/avc-video-parser';\nimport HevcVideoParser from './video/hevc-video-parser';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport {\n  type DemuxedAudioTrack,\n  type DemuxedMetadataTrack,\n  type DemuxedTrack,\n  type DemuxedUserdataTrack,\n  type DemuxedVideoTrack,\n  type Demuxer,\n  type DemuxerResult,\n  type ElementaryStreamData,\n  type KeyData,\n  MetadataSchema,\n  type VideoSample,\n} from '../types/demuxer';\nimport { appendUint8Array, RemuxerTrackIdConfig } from '../utils/mp4-tools';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport type BaseVideoParser from './video/base-video-parser';\nimport type { AudioFrame, DemuxedAAC } from '../types/demuxer';\nimport type { TypeSupported } from '../utils/codecs';\nimport type { ILogger } from '../utils/logger';\n\nexport type ParsedTimestamp = {\n  pts?: number;\n  dts?: number;\n};\n\nexport type PES = ParsedTimestamp & {\n  data: Uint8Array;\n  len: number;\n};\n\nexport type ParsedVideoSample = ParsedTimestamp &\n  Omit<VideoSample, 'pts' | 'dts'>;\n\nconst PACKET_LENGTH = 188;\n\nclass TSDemuxer implements Demuxer {\n  private readonly logger: ILogger;\n  private readonly observer: HlsEventEmitter;\n  private readonly config: HlsConfig;\n  private readonly typeSupported: TypeSupported;\n\n  private sampleAes: SampleAesDecrypter | null = null;\n  private pmtParsed: boolean = false;\n  private audioCodec?: string;\n  private videoCodec?: string;\n  private _pmtId: number = -1;\n\n  private _videoTrack?: DemuxedVideoTrack;\n  private _audioTrack?: DemuxedAudioTrack;\n  private _id3Track?: DemuxedMetadataTrack;\n  private _txtTrack?: DemuxedUserdataTrack;\n  private aacOverFlow: AudioFrame | null = null;\n  private remainderData: Uint8Array | null = null;\n  private videoParser: BaseVideoParser | null;\n\n  constructor(\n    observer: HlsEventEmitter,\n    config: HlsConfig,\n    typeSupported: TypeSupported,\n    logger: ILogger,\n  ) {\n    this.observer = observer;\n    this.config = config;\n    this.typeSupported = typeSupported;\n    this.logger = logger;\n    this.videoParser = null;\n  }\n\n  static probe(data: Uint8Array, logger: ILogger) {\n    const syncOffset = TSDemuxer.syncOffset(data);\n    if (syncOffset > 0) {\n      logger.warn(\n        `MPEG2-TS detected but first sync word found @ offset ${syncOffset}`,\n      );\n    }\n    return syncOffset !== -1;\n  }\n\n  static syncOffset(data: Uint8Array): number {\n    const length = data.length;\n    let scanwindow = Math.min(PACKET_LENGTH * 5, length - PACKET_LENGTH) + 1;\n    let i = 0;\n    while (i < scanwindow) {\n      // a TS init segment should contain at least 2 TS packets: PAT and PMT, each starting with 0x47\n      let foundPat = false;\n      let packetStart = -1;\n      let tsPackets = 0;\n      for (let j = i; j < length; j += PACKET_LENGTH) {\n        if (\n          data[j] === 0x47 &&\n          (length - j === PACKET_LENGTH || data[j + PACKET_LENGTH] === 0x47)\n        ) {\n          tsPackets++;\n          if (packetStart === -1) {\n            packetStart = j;\n            // First sync word found at offset, increase scan length (#5251)\n            if (packetStart !== 0) {\n              scanwindow =\n                Math.min(\n                  packetStart + PACKET_LENGTH * 99,\n                  data.length - PACKET_LENGTH,\n                ) + 1;\n            }\n          }\n          if (!foundPat) {\n            foundPat = parsePID(data, j) === 0;\n          }\n          // Sync word found at 0 with 3 packets, or found at offset least 2 packets up to scanwindow (#5501)\n          if (\n            foundPat &&\n            tsPackets > 1 &&\n            ((packetStart === 0 && tsPackets > 2) ||\n              j + PACKET_LENGTH > scanwindow)\n          ) {\n            return packetStart;\n          }\n        } else if (tsPackets) {\n          // Exit if sync word found, but does not contain contiguous packets\n          return -1;\n        } else {\n          break;\n        }\n      }\n      i++;\n    }\n    return -1;\n  }\n\n  /**\n   * Creates a track model internal to demuxer used to drive remuxing input\n   */\n  static createTrack(\n    type: 'audio' | 'video' | 'id3' | 'text',\n    duration?: number,\n  ): DemuxedTrack {\n    return {\n      container:\n        type === 'video' || type === 'audio' ? 'video/mp2t' : undefined,\n      type,\n      id: RemuxerTrackIdConfig[type],\n      pid: -1,\n      inputTimeScale: 90000,\n      sequenceNumber: 0,\n      samples: [],\n      dropped: 0,\n      duration: type === 'audio' ? duration : undefined,\n    };\n  }\n\n  /**\n   * Initializes a new init segment on the demuxer/remuxer interface. Needed for discontinuities/track-switches (or at stream start)\n   * Resets all internal track instances of the demuxer.\n   */\n  public resetInitSegment(\n    initSegment: Uint8Array | undefined,\n    audioCodec: string,\n    videoCodec: string,\n    trackDuration: number,\n  ) {\n    this.pmtParsed = false;\n    this._pmtId = -1;\n\n    this._videoTrack = TSDemuxer.createTrack('video') as DemuxedVideoTrack;\n    this._videoTrack.duration = trackDuration;\n    this._audioTrack = TSDemuxer.createTrack(\n      'audio',\n      trackDuration,\n    ) as DemuxedAudioTrack;\n    this._id3Track = TSDemuxer.createTrack('id3') as DemuxedMetadataTrack;\n    this._txtTrack = TSDemuxer.createTrack('text') as DemuxedUserdataTrack;\n    this._audioTrack.segmentCodec = 'aac';\n\n    // flush any partial content\n    this.videoParser = null;\n    this.aacOverFlow = null;\n    this.remainderData = null;\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n  }\n\n  public resetTimeStamp() {}\n\n  public resetContiguity(): void {\n    const { _audioTrack, _videoTrack, _id3Track } = this;\n    if (_audioTrack) {\n      _audioTrack.pesData = null;\n    }\n    if (_videoTrack) {\n      _videoTrack.pesData = null;\n    }\n    if (_id3Track) {\n      _id3Track.pesData = null;\n    }\n    this.aacOverFlow = null;\n    this.remainderData = null;\n  }\n\n  public demux(\n    data: Uint8Array,\n    timeOffset: number,\n    isSampleAes = false,\n    flush = false,\n  ): DemuxerResult {\n    if (!isSampleAes) {\n      this.sampleAes = null;\n    }\n\n    let pes: PES | null;\n\n    const videoTrack = this._videoTrack as DemuxedVideoTrack;\n    const audioTrack = this._audioTrack as DemuxedAudioTrack;\n    const id3Track = this._id3Track as DemuxedMetadataTrack;\n    const textTrack = this._txtTrack as DemuxedUserdataTrack;\n\n    let videoPid = videoTrack.pid;\n    let videoData = videoTrack.pesData;\n    let audioPid = audioTrack.pid;\n    let id3Pid = id3Track.pid;\n    let audioData = audioTrack.pesData;\n    let id3Data = id3Track.pesData;\n    let unknownPID: number | null = null;\n    let pmtParsed = this.pmtParsed;\n    let pmtId = this._pmtId;\n\n    let len = data.length;\n    if (this.remainderData) {\n      data = appendUint8Array(this.remainderData, data);\n      len = data.length;\n      this.remainderData = null;\n    }\n\n    if (len < PACKET_LENGTH && !flush) {\n      this.remainderData = data;\n      return {\n        audioTrack,\n        videoTrack,\n        id3Track,\n        textTrack,\n      };\n    }\n\n    const syncOffset = Math.max(0, TSDemuxer.syncOffset(data));\n    len -= (len - syncOffset) % PACKET_LENGTH;\n    if (len < data.byteLength && !flush) {\n      this.remainderData = new Uint8Array(\n        data.buffer,\n        len,\n        data.buffer.byteLength - len,\n      );\n    }\n\n    // loop through TS packets\n    let tsPacketErrors = 0;\n    for (let start = syncOffset; start < len; start += PACKET_LENGTH) {\n      if (data[start] === 0x47) {\n        const stt = !!(data[start + 1] & 0x40);\n        const pid = parsePID(data, start);\n        const atf = (data[start + 3] & 0x30) >> 4;\n\n        // if an adaption field is present, its length is specified by the fifth byte of the TS packet header.\n        let offset: number;\n        if (atf > 1) {\n          offset = start + 5 + data[start + 4];\n          // continue if there is only adaptation field\n          if (offset === start + PACKET_LENGTH) {\n            continue;\n          }\n        } else {\n          offset = start + 4;\n        }\n        switch (pid) {\n          case videoPid:\n            if (stt) {\n              if (videoData && (pes = parsePES(videoData, this.logger))) {\n                this.readyVideoParser(videoTrack.segmentCodec);\n                if (this.videoParser !== null) {\n                  this.videoParser.parsePES(videoTrack, textTrack, pes, false);\n                }\n              }\n\n              videoData = { data: [], size: 0 };\n            }\n            if (videoData) {\n              videoData.data.push(data.subarray(offset, start + PACKET_LENGTH));\n              videoData.size += start + PACKET_LENGTH - offset;\n            }\n            break;\n          case audioPid:\n            if (stt) {\n              if (audioData && (pes = parsePES(audioData, this.logger))) {\n                switch (audioTrack.segmentCodec) {\n                  case 'aac':\n                    this.parseAACPES(audioTrack, pes);\n                    break;\n                  case 'mp3':\n                    this.parseMPEGPES(audioTrack, pes);\n                    break;\n                  case 'ac3':\n                    if (__USE_M2TS_ADVANCED_CODECS__) {\n                      this.parseAC3PES(audioTrack, pes);\n                    }\n                    break;\n                }\n              }\n              audioData = { data: [], size: 0 };\n            }\n            if (audioData) {\n              audioData.data.push(data.subarray(offset, start + PACKET_LENGTH));\n              audioData.size += start + PACKET_LENGTH - offset;\n            }\n            break;\n          case id3Pid:\n            if (stt) {\n              if (id3Data && (pes = parsePES(id3Data, this.logger))) {\n                this.parseID3PES(id3Track, pes);\n              }\n\n              id3Data = { data: [], size: 0 };\n            }\n            if (id3Data) {\n              id3Data.data.push(data.subarray(offset, start + PACKET_LENGTH));\n              id3Data.size += start + PACKET_LENGTH - offset;\n            }\n            break;\n          case 0:\n            if (stt) {\n              offset += data[offset] + 1;\n            }\n\n            pmtId = this._pmtId = parsePAT(data, offset);\n            // this.logger.log('PMT PID:'  + this._pmtId);\n            break;\n          case pmtId: {\n            if (stt) {\n              offset += data[offset] + 1;\n            }\n\n            const parsedPIDs = parsePMT(\n              data,\n              offset,\n              this.typeSupported,\n              isSampleAes,\n              this.observer,\n              this.logger,\n            );\n\n            // only update track id if track PID found while parsing PMT\n            // this is to avoid resetting the PID to -1 in case\n            // track PID transiently disappears from the stream\n            // this could happen in case of transient missing audio samples for example\n            // NOTE this is only the PID of the track as found in TS,\n            // but we are not using this for MP4 track IDs.\n            videoPid = parsedPIDs.videoPid;\n            if (videoPid > 0) {\n              videoTrack.pid = videoPid;\n              videoTrack.segmentCodec = parsedPIDs.segmentVideoCodec;\n            }\n\n            audioPid = parsedPIDs.audioPid;\n            if (audioPid > 0) {\n              audioTrack.pid = audioPid;\n              audioTrack.segmentCodec = parsedPIDs.segmentAudioCodec;\n            }\n            id3Pid = parsedPIDs.id3Pid;\n            if (id3Pid > 0) {\n              id3Track.pid = id3Pid;\n            }\n\n            if (unknownPID !== null && !pmtParsed) {\n              this.logger.warn(\n                `MPEG-TS PMT found at ${start} after unknown PID '${unknownPID}'. Backtracking to sync byte @${syncOffset} to parse all TS packets.`,\n              );\n              unknownPID = null;\n              // we set it to -188, the += 188 in the for loop will reset start to 0\n              start = syncOffset - 188;\n            }\n            pmtParsed = this.pmtParsed = true;\n            break;\n          }\n          case 0x11:\n          case 0x1fff:\n            break;\n          default:\n            unknownPID = pid;\n            break;\n        }\n      } else {\n        tsPacketErrors++;\n      }\n    }\n\n    if (tsPacketErrors > 0) {\n      emitParsingError(\n        this.observer,\n        new Error(\n          `Found ${tsPacketErrors} TS packet/s that do not start with 0x47`,\n        ),\n        undefined,\n        this.logger,\n      );\n    }\n\n    videoTrack.pesData = videoData;\n    audioTrack.pesData = audioData;\n    id3Track.pesData = id3Data;\n\n    const demuxResult: DemuxerResult = {\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack,\n    };\n\n    if (flush) {\n      this.extractRemainingSamples(demuxResult);\n    }\n\n    return demuxResult;\n  }\n\n  public flush(): DemuxerResult | Promise<DemuxerResult> {\n    const { remainderData } = this;\n    this.remainderData = null;\n    let result: DemuxerResult;\n    if (remainderData) {\n      result = this.demux(remainderData, -1, false, true);\n    } else {\n      result = {\n        videoTrack: this._videoTrack as DemuxedVideoTrack,\n        audioTrack: this._audioTrack as DemuxedAudioTrack,\n        id3Track: this._id3Track as DemuxedMetadataTrack,\n        textTrack: this._txtTrack as DemuxedUserdataTrack,\n      };\n    }\n    this.extractRemainingSamples(result);\n    if (this.sampleAes) {\n      return this.decrypt(result, this.sampleAes);\n    }\n    return result;\n  }\n\n  private extractRemainingSamples(demuxResult: DemuxerResult) {\n    const { audioTrack, videoTrack, id3Track, textTrack } = demuxResult;\n    const videoData = videoTrack.pesData;\n    const audioData = audioTrack.pesData;\n    const id3Data = id3Track.pesData;\n    // try to parse last PES packets\n    let pes: PES | null;\n    if (videoData && (pes = parsePES(videoData, this.logger))) {\n      this.readyVideoParser(videoTrack.segmentCodec);\n      if (this.videoParser !== null) {\n        this.videoParser.parsePES(\n          videoTrack as DemuxedVideoTrack,\n          textTrack as DemuxedUserdataTrack,\n          pes,\n          true,\n        );\n        videoTrack.pesData = null;\n      }\n    } else {\n      // either avcData null or PES truncated, keep it for next frag parsing\n      videoTrack.pesData = videoData;\n    }\n\n    if (audioData && (pes = parsePES(audioData, this.logger))) {\n      switch (audioTrack.segmentCodec) {\n        case 'aac':\n          this.parseAACPES(audioTrack, pes);\n          break;\n        case 'mp3':\n          this.parseMPEGPES(audioTrack, pes);\n          break;\n        case 'ac3':\n          if (__USE_M2TS_ADVANCED_CODECS__) {\n            this.parseAC3PES(audioTrack, pes);\n          }\n          break;\n      }\n      audioTrack.pesData = null;\n    } else {\n      if (audioData?.size) {\n        this.logger.log(\n          'last AAC PES packet truncated,might overlap between fragments',\n        );\n      }\n\n      // either audioData null or PES truncated, keep it for next frag parsing\n      audioTrack.pesData = audioData;\n    }\n\n    if (id3Data && (pes = parsePES(id3Data, this.logger))) {\n      this.parseID3PES(id3Track, pes);\n      id3Track.pesData = null;\n    } else {\n      // either id3Data null or PES truncated, keep it for next frag parsing\n      id3Track.pesData = id3Data;\n    }\n  }\n\n  public demuxSampleAes(\n    data: Uint8Array,\n    keyData: KeyData,\n    timeOffset: number,\n  ): Promise<DemuxerResult> {\n    const demuxResult = this.demux(\n      data,\n      timeOffset,\n      true,\n      !this.config.progressive,\n    );\n    const sampleAes = (this.sampleAes = new SampleAesDecrypter(\n      this.observer,\n      this.config,\n      keyData,\n    ));\n    return this.decrypt(demuxResult, sampleAes);\n  }\n\n  private readyVideoParser(codec: string | undefined) {\n    if (this.videoParser === null) {\n      if (codec === 'avc') {\n        this.videoParser = new AvcVideoParser();\n      } else if (__USE_M2TS_ADVANCED_CODECS__ && codec === 'hevc') {\n        this.videoParser = new HevcVideoParser();\n      }\n    }\n  }\n\n  private decrypt(\n    demuxResult: DemuxerResult,\n    sampleAes: SampleAesDecrypter,\n  ): Promise<DemuxerResult> {\n    return new Promise((resolve) => {\n      const { audioTrack, videoTrack } = demuxResult;\n      if (audioTrack.samples && audioTrack.segmentCodec === 'aac') {\n        sampleAes.decryptAacSamples(\n          (audioTrack as DemuxedAAC).samples,\n          0,\n          () => {\n            if (videoTrack.samples) {\n              sampleAes.decryptAvcSamples(videoTrack.samples, 0, 0, () => {\n                resolve(demuxResult);\n              });\n            } else {\n              resolve(demuxResult);\n            }\n          },\n        );\n      } else if (videoTrack.samples) {\n        sampleAes.decryptAvcSamples(videoTrack.samples, 0, 0, () => {\n          resolve(demuxResult);\n        });\n      }\n    });\n  }\n\n  public destroy() {\n    if (this.observer) {\n      this.observer.removeAllListeners();\n    }\n    // @ts-ignore\n    this.config = this.logger = this.observer = null;\n    this.aacOverFlow =\n      this.videoParser =\n      this.remainderData =\n      this.sampleAes =\n        null;\n    this._videoTrack =\n      this._audioTrack =\n      this._id3Track =\n      this._txtTrack =\n        undefined;\n  }\n\n  private parseAACPES(track: DemuxedAudioTrack, pes: PES) {\n    let startOffset = 0;\n    const aacOverFlow = this.aacOverFlow;\n    let data = pes.data;\n    if (aacOverFlow) {\n      this.aacOverFlow = null;\n      const frameMissingBytes = aacOverFlow.missing;\n      const sampleLength = aacOverFlow.sample.unit.byteLength;\n      // logger.log(`AAC: append overflowing ${sampleLength} bytes to beginning of new PES`);\n      if (frameMissingBytes === -1) {\n        data = appendUint8Array(aacOverFlow.sample.unit, data);\n      } else {\n        const frameOverflowBytes = sampleLength - frameMissingBytes;\n        aacOverFlow.sample.unit.set(\n          data.subarray(0, frameMissingBytes),\n          frameOverflowBytes,\n        );\n        track.samples.push(aacOverFlow.sample);\n        startOffset = aacOverFlow.missing;\n      }\n    }\n    // look for ADTS header (0xFFFx)\n    let offset: number;\n    let len: number;\n    for (offset = startOffset, len = data.length; offset < len - 1; offset++) {\n      if (ADTS.isHeader(data, offset)) {\n        break;\n      }\n    }\n    // if ADTS header does not start straight from the beginning of the PES payload, raise an error\n    if (offset !== startOffset) {\n      let reason: string;\n      const recoverable = offset < len - 1;\n      if (recoverable) {\n        reason = `AAC PES did not start with ADTS header,offset:${offset}`;\n      } else {\n        reason = 'No ADTS header found in AAC PES';\n      }\n      emitParsingError(\n        this.observer,\n        new Error(reason),\n        recoverable,\n        this.logger,\n      );\n      if (!recoverable) {\n        return;\n      }\n    }\n\n    ADTS.initTrackConfig(track, this.observer, data, offset, this.audioCodec);\n\n    let pts: number;\n    if (pes.pts !== undefined) {\n      pts = pes.pts;\n    } else if (aacOverFlow) {\n      // if last AAC frame is overflowing, we should ensure timestamps are contiguous:\n      // first sample PTS should be equal to last sample PTS + frameDuration\n      const frameDuration = ADTS.getFrameDuration(track.samplerate as number);\n      pts = aacOverFlow.sample.pts + frameDuration;\n    } else {\n      this.logger.warn('[tsdemuxer]: AAC PES unknown PTS');\n      return;\n    }\n\n    // scan for aac samples\n    let frameIndex = 0;\n    let frame;\n    while (offset < len) {\n      frame = ADTS.appendFrame(track, data, offset, pts, frameIndex);\n      offset += frame.length;\n      if (!frame.missing) {\n        frameIndex++;\n        for (; offset < len - 1; offset++) {\n          if (ADTS.isHeader(data, offset)) {\n            break;\n          }\n        }\n      } else {\n        this.aacOverFlow = frame;\n        break;\n      }\n    }\n  }\n\n  private parseMPEGPES(track: DemuxedAudioTrack, pes: PES) {\n    const data = pes.data;\n    const length = data.length;\n    let frameIndex = 0;\n    let offset = 0;\n    const pts = pes.pts;\n    if (pts === undefined) {\n      this.logger.warn('[tsdemuxer]: MPEG PES unknown PTS');\n      return;\n    }\n\n    while (offset < length) {\n      if (MpegAudio.isHeader(data, offset)) {\n        const frame = MpegAudio.appendFrame(\n          track,\n          data,\n          offset,\n          pts,\n          frameIndex,\n        );\n        if (frame) {\n          offset += frame.length;\n          frameIndex++;\n        } else {\n          // logger.log('Unable to parse Mpeg audio frame');\n          break;\n        }\n      } else {\n        // nothing found, keep looking\n        offset++;\n      }\n    }\n  }\n\n  private parseAC3PES(track: DemuxedAudioTrack, pes: PES) {\n    if (__USE_M2TS_ADVANCED_CODECS__) {\n      const data = pes.data;\n      const pts = pes.pts;\n      if (pts === undefined) {\n        this.logger.warn('[tsdemuxer]: AC3 PES unknown PTS');\n        return;\n      }\n      const length = data.length;\n      let frameIndex = 0;\n      let offset = 0;\n      let parsed;\n\n      while (\n        offset < length &&\n        (parsed = AC3.appendFrame(track, data, offset, pts, frameIndex++)) > 0\n      ) {\n        offset += parsed;\n      }\n    }\n  }\n\n  private parseID3PES(id3Track: DemuxedMetadataTrack, pes: PES) {\n    if (pes.pts === undefined) {\n      this.logger.warn('[tsdemuxer]: ID3 PES unknown PTS');\n      return;\n    }\n    const id3Sample = Object.assign({}, pes as Required<PES>, {\n      type: this._videoTrack ? MetadataSchema.emsg : MetadataSchema.audioId3,\n      duration: Number.POSITIVE_INFINITY,\n    });\n    id3Track.samples.push(id3Sample);\n  }\n}\n\nfunction parsePID(data: Uint8Array, offset: number): number {\n  // pid is a 13-bit field starting at the last bit of TS[1]\n  return ((data[offset + 1] & 0x1f) << 8) + data[offset + 2];\n}\n\nfunction parsePAT(data: Uint8Array, offset: number): number {\n  // skip the PSI header and parse the first PMT entry\n  return ((data[offset + 10] & 0x1f) << 8) | data[offset + 11];\n}\n\nfunction parsePMT(\n  data: Uint8Array,\n  offset: number,\n  typeSupported: TypeSupported,\n  isSampleAes: boolean,\n  observer: HlsEventEmitter,\n  logger: ILogger,\n) {\n  const result = {\n    audioPid: -1,\n    videoPid: -1,\n    id3Pid: -1,\n    segmentVideoCodec: 'avc' as 'avc' | 'hevc',\n    segmentAudioCodec: 'aac' as 'aac' | 'ac3' | 'mp3',\n  };\n  const sectionLength = ((data[offset + 1] & 0x0f) << 8) | data[offset + 2];\n  const tableEnd = offset + 3 + sectionLength - 4;\n  // to determine where the table is, we have to figure out how\n  // long the program info descriptors are\n  const programInfoLength =\n    ((data[offset + 10] & 0x0f) << 8) | data[offset + 11];\n  // advance the offset to the first entry in the mapping table\n  offset += 12 + programInfoLength;\n  while (offset < tableEnd) {\n    const pid = parsePID(data, offset);\n    const esInfoLength = ((data[offset + 3] & 0x0f) << 8) | data[offset + 4];\n    switch (data[offset]) {\n      case 0xcf: // SAMPLE-AES AAC\n        if (!isSampleAes) {\n          logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC', logger);\n          break;\n        }\n      /* falls through */\n      case 0x0f: // ISO/IEC 13818-7 ADTS AAC (MPEG-2 lower bit-rate audio)\n        // logger.log('AAC PID:'  + pid);\n        if (result.audioPid === -1) {\n          result.audioPid = pid;\n        }\n\n        break;\n\n      // Packetized metadata (ID3)\n      case 0x15:\n        // logger.log('ID3 PID:'  + pid);\n        if (result.id3Pid === -1) {\n          result.id3Pid = pid;\n        }\n\n        break;\n\n      case 0xdb: // SAMPLE-AES AVC\n        if (!isSampleAes) {\n          logEncryptedSamplesFoundInUnencryptedStream('H.264', logger);\n          break;\n        }\n      /* falls through */\n      case 0x1b: // ITU-T Rec. H.264 and ISO/IEC 14496-10 (lower bit-rate video)\n        // logger.log('AVC PID:'  + pid);\n        if (result.videoPid === -1) {\n          result.videoPid = pid;\n        }\n\n        break;\n\n      // ISO/IEC 11172-3 (MPEG-1 audio)\n      // or ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)\n      case 0x03:\n      case 0x04:\n        // logger.log('MPEG PID:'  + pid);\n        if (!typeSupported.mpeg && !typeSupported.mp3) {\n          logger.log('MPEG audio found, not supported in this browser');\n        } else if (result.audioPid === -1) {\n          result.audioPid = pid;\n          result.segmentAudioCodec = 'mp3';\n        }\n        break;\n\n      case 0xc1: // SAMPLE-AES AC3\n        if (!isSampleAes) {\n          logEncryptedSamplesFoundInUnencryptedStream('AC-3', logger);\n          break;\n        }\n      /* falls through */\n      case 0x81:\n        if (__USE_M2TS_ADVANCED_CODECS__) {\n          if (!typeSupported.ac3) {\n            logger.log('AC-3 audio found, not supported in this browser');\n          } else if (result.audioPid === -1) {\n            result.audioPid = pid;\n            result.segmentAudioCodec = 'ac3';\n          }\n        } else {\n          logger.warn('AC-3 in M2TS support not included in build');\n        }\n        break;\n\n      case 0x06:\n        // stream_type 6 can mean a lot of different things in case of DVB.\n        // We need to look at the descriptors. Right now, we're only interested\n        // in AC-3 audio, so we do the descriptor parsing only when we don't have\n        // an audio PID yet.\n        if (result.audioPid === -1 && esInfoLength > 0) {\n          let parsePos = offset + 5;\n          let remaining = esInfoLength;\n\n          while (remaining > 2) {\n            const descriptorId = data[parsePos];\n\n            switch (descriptorId) {\n              case 0x6a: // DVB Descriptor for AC-3\n                if (__USE_M2TS_ADVANCED_CODECS__) {\n                  if (typeSupported.ac3 !== true) {\n                    logger.log(\n                      'AC-3 audio found, not supported in this browser for now',\n                    );\n                  } else {\n                    result.audioPid = pid;\n                    result.segmentAudioCodec = 'ac3';\n                  }\n                } else {\n                  logger.warn('AC-3 in M2TS support not included in build');\n                }\n                break;\n            }\n\n            const descriptorLen = data[parsePos + 1] + 2;\n            parsePos += descriptorLen;\n            remaining -= descriptorLen;\n          }\n        }\n        break;\n\n      case 0xc2: // SAMPLE-AES EC3\n      /* falls through */\n      case 0x87:\n        emitParsingError(\n          observer,\n          new Error('Unsupported EC-3 in M2TS found'),\n          undefined,\n          logger,\n        );\n        return result;\n\n      case 0x24: // ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)\n        if (__USE_M2TS_ADVANCED_CODECS__) {\n          if (result.videoPid === -1) {\n            result.videoPid = pid;\n            result.segmentVideoCodec = 'hevc';\n            logger.log('HEVC in M2TS found');\n          }\n        } else {\n          emitParsingError(\n            observer,\n            new Error('Unsupported HEVC in M2TS found'),\n            undefined,\n            logger,\n          );\n          return result;\n        }\n        break;\n\n      default:\n        // logger.log('unknown stream type:' + data[offset]);\n        break;\n    }\n    // move to the next table entry\n    // skip past the elementary stream descriptors, if present\n    offset += esInfoLength + 5;\n  }\n  return result;\n}\n\nfunction emitParsingError(\n  observer: HlsEventEmitter,\n  error: Error,\n  levelRetry: boolean | undefined,\n  logger: ILogger,\n) {\n  logger.warn(`parsing error: ${error.message}`);\n  observer.emit(Events.ERROR, Events.ERROR, {\n    type: ErrorTypes.MEDIA_ERROR,\n    details: ErrorDetails.FRAG_PARSING_ERROR,\n    fatal: false,\n    levelRetry,\n    error,\n    reason: error.message,\n  });\n}\n\nfunction logEncryptedSamplesFoundInUnencryptedStream(\n  type: string,\n  logger: ILogger,\n) {\n  logger.log(`${type} with AES-128-CBC encryption found in unencrypted stream`);\n}\n\nfunction parsePES(stream: ElementaryStreamData, logger: ILogger): PES | null {\n  let i = 0;\n  let frag: Uint8Array;\n  let pesLen: number;\n  let pesHdrLen: number;\n  let pesPts: number | undefined;\n  let pesDts: number | undefined;\n  const data = stream.data;\n  // safety check\n  if (!stream || stream.size === 0) {\n    return null;\n  }\n\n  // we might need up to 19 bytes to read PES header\n  // if first chunk of data is less than 19 bytes, let's merge it with following ones until we get 19 bytes\n  // usually only one merge is needed (and this is rare ...)\n  while (data[0].length < 19 && data.length > 1) {\n    data[0] = appendUint8Array(data[0], data[1]);\n    data.splice(1, 1);\n  }\n  // retrieve PTS/DTS from first fragment\n  frag = data[0];\n  const pesPrefix = (frag[0] << 16) + (frag[1] << 8) + frag[2];\n  if (pesPrefix === 1) {\n    pesLen = (frag[4] << 8) + frag[5];\n    // if PES parsed length is not zero and greater than total received length, stop parsing. PES might be truncated\n    // minus 6 : PES header size\n    if (pesLen && pesLen > stream.size - 6) {\n      return null;\n    }\n\n    const pesFlags = frag[7];\n    if (pesFlags & 0xc0) {\n      /* PES header described here : http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n          as PTS / DTS is 33 bit we cannot use bitwise operator in JS,\n          as Bitwise operators treat their operands as a sequence of 32 bits */\n      pesPts =\n        (frag[9] & 0x0e) * 536870912 + // 1 << 29\n        (frag[10] & 0xff) * 4194304 + // 1 << 22\n        (frag[11] & 0xfe) * 16384 + // 1 << 14\n        (frag[12] & 0xff) * 128 + // 1 << 7\n        (frag[13] & 0xfe) / 2;\n\n      if (pesFlags & 0x40) {\n        pesDts =\n          (frag[14] & 0x0e) * 536870912 + // 1 << 29\n          (frag[15] & 0xff) * 4194304 + // 1 << 22\n          (frag[16] & 0xfe) * 16384 + // 1 << 14\n          (frag[17] & 0xff) * 128 + // 1 << 7\n          (frag[18] & 0xfe) / 2;\n\n        if (pesPts - pesDts > 60 * 90000) {\n          logger.warn(\n            `${Math.round(\n              (pesPts - pesDts) / 90000,\n            )}s delta between PTS and DTS, align them`,\n          );\n          pesPts = pesDts;\n        }\n      } else {\n        pesDts = pesPts;\n      }\n    }\n    pesHdrLen = frag[8];\n    // 9 bytes : 6 bytes for PES header + 3 bytes for PES extension\n    let payloadStartOffset = pesHdrLen + 9;\n    if (stream.size <= payloadStartOffset) {\n      return null;\n    }\n    stream.size -= payloadStartOffset;\n    // reassemble PES packet\n    const pesData = new Uint8Array(stream.size);\n    for (let j = 0, dataLen = data.length; j < dataLen; j++) {\n      frag = data[j];\n      let len = frag.byteLength;\n      if (payloadStartOffset) {\n        if (payloadStartOffset > len) {\n          // trim full frag if PES header bigger than frag\n          payloadStartOffset -= len;\n          continue;\n        } else {\n          // trim partial frag if PES header smaller than frag\n          frag = frag.subarray(payloadStartOffset);\n          len -= payloadStartOffset;\n          payloadStartOffset = 0;\n        }\n      }\n      pesData.set(frag, i);\n      i += len;\n    }\n    if (pesLen) {\n      // payload size : remove PES header + PES extension\n      pesLen -= pesHdrLen + 3;\n    }\n    return { data: pesData, pts: pesPts, dts: pesDts, len: pesLen };\n  }\n  return null;\n}\n\nexport default TSDemuxer;\n", "/**\n *  AAC helper\n */\n\nclass AAC {\n  static getSilentFrame(\n    codec?: string,\n    channelCount?: number,\n  ): Uint8Array | undefined {\n    switch (codec) {\n      case 'mp4a.40.2':\n        if (channelCount === 1) {\n          return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n        } else if (channelCount === 2) {\n          return new Uint8Array([\n            0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80,\n          ]);\n        } else if (channelCount === 3) {\n          return new Uint8Array([\n            0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n            0x00, 0x8e,\n          ]);\n        } else if (channelCount === 4) {\n          return new Uint8Array([\n            0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n            0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38,\n          ]);\n        } else if (channelCount === 5) {\n          return new Uint8Array([\n            0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n            0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38,\n          ]);\n        } else if (channelCount === 6) {\n          return new Uint8Array([\n            0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n            0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n            0x00, 0x20, 0x08, 0xe0,\n          ]);\n        }\n\n        break;\n      // handle HE-AAC below (mp4a.40.5 / mp4a.40.29)\n      default:\n        if (channelCount === 1) {\n          // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n          return new Uint8Array([\n            0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n            0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5e,\n          ]);\n        } else if (channelCount === 2) {\n          // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n          return new Uint8Array([\n            0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n            0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5e,\n          ]);\n        } else if (channelCount === 3) {\n          // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n          return new Uint8Array([\n            0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n            0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n            0x5a, 0x5e,\n          ]);\n        }\n        break;\n    }\n    return undefined;\n  }\n}\n\nexport default AAC;\n", "/**\n * Generate MP4 Box\n */\n\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport type {\n  DemuxedAC3,\n  DemuxedAudioTrack,\n  DemuxedAVC1,\n  DemuxedHEVC,\n  DemuxedVideoTrack,\n} from '../types/demuxer';\nimport type {\n  Mp4SampleFlags,\n  RemuxedAudioTrackSamples,\n  RemuxedVideoTrackSamples,\n} from '../types/remuxer';\n\ntype MediaTrackType = DemuxedAudioTrack | DemuxedVideoTrack;\ntype RemuxedTrackType = RemuxedAudioTrackSamples | RemuxedVideoTrackSamples;\n\ntype HdlrTypes = {\n  video: Uint8Array;\n  audio: Uint8Array;\n};\n\nconst UINT32_MAX = Math.pow(2, 32) - 1;\n\nclass MP4 {\n  public static types: Record<string, number[]>;\n  private static HDLR_TYPES: HdlrTypes;\n  private static STTS: Uint8Array;\n  private static STSC: Uint8Array;\n  private static STCO: Uint8Array;\n  private static STSZ: Uint8Array;\n  private static VMHD: Uint8Array;\n  private static SMHD: Uint8Array;\n  private static STSD: Uint8Array;\n  private static FTYP: Uint8Array;\n  private static DINF: Uint8Array;\n\n  static init() {\n    MP4.types = {\n      avc1: [], // codingname\n      avcC: [],\n      hvc1: [],\n      hvcC: [],\n      btrt: [],\n      dinf: [],\n      dref: [],\n      esds: [],\n      ftyp: [],\n      hdlr: [],\n      mdat: [],\n      mdhd: [],\n      mdia: [],\n      mfhd: [],\n      minf: [],\n      moof: [],\n      moov: [],\n      mp4a: [],\n      '.mp3': [],\n      dac3: [],\n      'ac-3': [],\n      mvex: [],\n      mvhd: [],\n      pasp: [],\n      sdtp: [],\n      stbl: [],\n      stco: [],\n      stsc: [],\n      stsd: [],\n      stsz: [],\n      stts: [],\n      tfdt: [],\n      tfhd: [],\n      traf: [],\n      trak: [],\n      trun: [],\n      trex: [],\n      tkhd: [],\n      vmhd: [],\n      smhd: [],\n    };\n\n    let i: string;\n    for (i in MP4.types) {\n      if (MP4.types.hasOwnProperty(i)) {\n        MP4.types[i] = [\n          i.charCodeAt(0),\n          i.charCodeAt(1),\n          i.charCodeAt(2),\n          i.charCodeAt(3),\n        ];\n      }\n    }\n\n    const videoHdlr = new Uint8Array([\n      0x00, // version 0\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x00, // pre_defined\n      0x76,\n      0x69,\n      0x64,\n      0x65, // handler_type: 'vide'\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x56,\n      0x69,\n      0x64,\n      0x65,\n      0x6f,\n      0x48,\n      0x61,\n      0x6e,\n      0x64,\n      0x6c,\n      0x65,\n      0x72,\n      0x00, // name: 'VideoHandler'\n    ]);\n\n    const audioHdlr = new Uint8Array([\n      0x00, // version 0\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x00, // pre_defined\n      0x73,\n      0x6f,\n      0x75,\n      0x6e, // handler_type: 'soun'\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x53,\n      0x6f,\n      0x75,\n      0x6e,\n      0x64,\n      0x48,\n      0x61,\n      0x6e,\n      0x64,\n      0x6c,\n      0x65,\n      0x72,\n      0x00, // name: 'SoundHandler'\n    ]);\n\n    MP4.HDLR_TYPES = {\n      video: videoHdlr,\n      audio: audioHdlr,\n    };\n\n    const dref = new Uint8Array([\n      0x00, // version 0\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x01, // entry_count\n      0x00,\n      0x00,\n      0x00,\n      0x0c, // entry_size\n      0x75,\n      0x72,\n      0x6c,\n      0x20, // 'url' type\n      0x00, // version 0\n      0x00,\n      0x00,\n      0x01, // entry_flags\n    ]);\n\n    const stco = new Uint8Array([\n      0x00, // version\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x00, // entry_count\n    ]);\n\n    MP4.STTS = MP4.STSC = MP4.STCO = stco;\n\n    MP4.STSZ = new Uint8Array([\n      0x00, // version\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x00, // sample_size\n      0x00,\n      0x00,\n      0x00,\n      0x00, // sample_count\n    ]);\n    MP4.VMHD = new Uint8Array([\n      0x00, // version\n      0x00,\n      0x00,\n      0x01, // flags\n      0x00,\n      0x00, // graphicsmode\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00, // opcolor\n    ]);\n    MP4.SMHD = new Uint8Array([\n      0x00, // version\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00, // balance\n      0x00,\n      0x00, // reserved\n    ]);\n\n    MP4.STSD = new Uint8Array([\n      0x00, // version 0\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x01,\n    ]); // entry_count\n\n    const majorBrand = new Uint8Array([105, 115, 111, 109]); // isom\n    const avc1Brand = new Uint8Array([97, 118, 99, 49]); // avc1\n    const minorVersion = new Uint8Array([0, 0, 0, 1]);\n\n    MP4.FTYP = MP4.box(\n      MP4.types.ftyp,\n      majorBrand,\n      minorVersion,\n      majorBrand,\n      avc1Brand,\n    );\n    MP4.DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, dref));\n  }\n\n  static box(type: number[], ...payload: Uint8Array[]) {\n    let size = 8;\n    let i = payload.length;\n    const len = i;\n    // calculate the total size we need to allocate\n    while (i--) {\n      size += payload[i].byteLength;\n    }\n\n    const result = new Uint8Array(size);\n    result[0] = (size >> 24) & 0xff;\n    result[1] = (size >> 16) & 0xff;\n    result[2] = (size >> 8) & 0xff;\n    result[3] = size & 0xff;\n    result.set(type, 4);\n    // copy the payload into the result\n    for (i = 0, size = 8; i < len; i++) {\n      // copy payload[i] array @ offset size\n      result.set(payload[i], size);\n      size += payload[i].byteLength;\n    }\n    return result;\n  }\n\n  static hdlr(type: keyof HdlrTypes) {\n    return MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type]);\n  }\n\n  static mdat(data: Uint8Array) {\n    return MP4.box(MP4.types.mdat, data);\n  }\n\n  static mdhd(timescale: number, duration: number) {\n    duration *= timescale;\n    const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n    const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n    return MP4.box(\n      MP4.types.mdhd,\n      new Uint8Array([\n        0x01, // version 1\n        0x00,\n        0x00,\n        0x00, // flags\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x02, // creation_time\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x03, // modification_time\n        (timescale >> 24) & 0xff,\n        (timescale >> 16) & 0xff,\n        (timescale >> 8) & 0xff,\n        timescale & 0xff, // timescale\n        upperWordDuration >> 24,\n        (upperWordDuration >> 16) & 0xff,\n        (upperWordDuration >> 8) & 0xff,\n        upperWordDuration & 0xff,\n        lowerWordDuration >> 24,\n        (lowerWordDuration >> 16) & 0xff,\n        (lowerWordDuration >> 8) & 0xff,\n        lowerWordDuration & 0xff,\n        0x55,\n        0xc4, // 'und' language (undetermined)\n        0x00,\n        0x00,\n      ]),\n    );\n  }\n\n  static mdia(track: MediaTrackType) {\n    return MP4.box(\n      MP4.types.mdia,\n      MP4.mdhd(track.timescale || 0, track.duration || 0),\n      MP4.hdlr(track.type),\n      MP4.minf(track),\n    );\n  }\n\n  static mfhd(sequenceNumber: number) {\n    return MP4.box(\n      MP4.types.mfhd,\n      new Uint8Array([\n        0x00,\n        0x00,\n        0x00,\n        0x00, // flags\n        sequenceNumber >> 24,\n        (sequenceNumber >> 16) & 0xff,\n        (sequenceNumber >> 8) & 0xff,\n        sequenceNumber & 0xff, // sequence_number\n      ]),\n    );\n  }\n\n  static minf(track: MediaTrackType) {\n    if (track.type === 'audio') {\n      return MP4.box(\n        MP4.types.minf,\n        MP4.box(MP4.types.smhd, MP4.SMHD),\n        MP4.DINF,\n        MP4.stbl(track),\n      );\n    } else {\n      return MP4.box(\n        MP4.types.minf,\n        MP4.box(MP4.types.vmhd, MP4.VMHD),\n        MP4.DINF,\n        MP4.stbl(track),\n      );\n    }\n  }\n\n  static moof(\n    sn: number,\n    baseMediaDecodeTime: number,\n    track: RemuxedTrackType,\n  ) {\n    return MP4.box(\n      MP4.types.moof,\n      MP4.mfhd(sn),\n      MP4.traf(track, baseMediaDecodeTime),\n    );\n  }\n\n  static moov(tracks: MediaTrackType[]) {\n    let i = tracks.length;\n    const boxes: Uint8Array[] = [];\n\n    while (i--) {\n      boxes[i] = MP4.trak(tracks[i]);\n    }\n\n    return MP4.box.apply(\n      null,\n      [\n        MP4.types.moov,\n        MP4.mvhd(tracks[0].timescale || 0, tracks[0].duration || 0),\n      ]\n        .concat(boxes)\n        .concat(MP4.mvex(tracks)),\n    );\n  }\n\n  static mvex(tracks: MediaTrackType[]) {\n    let i = tracks.length;\n    const boxes: Uint8Array[] = [];\n\n    while (i--) {\n      boxes[i] = MP4.trex(tracks[i]);\n    }\n\n    return MP4.box.apply(null, [MP4.types.mvex, ...boxes]);\n  }\n\n  static mvhd(timescale: number, duration: number) {\n    duration *= timescale;\n    const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n    const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n    const bytes = new Uint8Array([\n      0x01, // version 1\n      0x00,\n      0x00,\n      0x00, // flags\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x02, // creation_time\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x03, // modification_time\n      (timescale >> 24) & 0xff,\n      (timescale >> 16) & 0xff,\n      (timescale >> 8) & 0xff,\n      timescale & 0xff, // timescale\n      upperWordDuration >> 24,\n      (upperWordDuration >> 16) & 0xff,\n      (upperWordDuration >> 8) & 0xff,\n      upperWordDuration & 0xff,\n      lowerWordDuration >> 24,\n      (lowerWordDuration >> 16) & 0xff,\n      (lowerWordDuration >> 8) & 0xff,\n      lowerWordDuration & 0xff,\n      0x00,\n      0x01,\n      0x00,\n      0x00, // 1.0 rate\n      0x01,\n      0x00, // 1.0 volume\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x01,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x01,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x40,\n      0x00,\n      0x00,\n      0x00, // transformation: unity matrix\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00, // pre_defined\n      0xff,\n      0xff,\n      0xff,\n      0xff, // next_track_ID\n    ]);\n    return MP4.box(MP4.types.mvhd, bytes);\n  }\n\n  static sdtp(track: RemuxedTrackType) {\n    const samples = track.samples || [];\n    const bytes = new Uint8Array(4 + samples.length);\n    let i: number;\n    let flags: Mp4SampleFlags;\n    // leave the full box header (4 bytes) all zero\n    // write the sample table\n    for (i = 0; i < samples.length; i++) {\n      flags = samples[i].flags;\n      bytes[i + 4] =\n        (flags.dependsOn << 4) |\n        (flags.isDependedOn << 2) |\n        flags.hasRedundancy;\n    }\n\n    return MP4.box(MP4.types.sdtp, bytes);\n  }\n\n  static stbl(track: MediaTrackType) {\n    return MP4.box(\n      MP4.types.stbl,\n      MP4.stsd(track),\n      MP4.box(MP4.types.stts, MP4.STTS),\n      MP4.box(MP4.types.stsc, MP4.STSC),\n      MP4.box(MP4.types.stsz, MP4.STSZ),\n      MP4.box(MP4.types.stco, MP4.STCO),\n    );\n  }\n\n  static avc1(track: DemuxedAVC1) {\n    let sps: number[] = [];\n    let pps: number[] = [];\n    let i;\n    let data;\n    let len;\n    // assemble the SPSs\n\n    for (i = 0; i < track.sps.length; i++) {\n      data = track.sps[i];\n      len = data.byteLength;\n      sps.push((len >>> 8) & 0xff);\n      sps.push(len & 0xff);\n\n      // SPS\n      sps = sps.concat(Array.prototype.slice.call(data));\n    }\n\n    // assemble the PPSs\n    for (i = 0; i < track.pps.length; i++) {\n      data = track.pps[i];\n      len = data.byteLength;\n      pps.push((len >>> 8) & 0xff);\n      pps.push(len & 0xff);\n\n      pps = pps.concat(Array.prototype.slice.call(data));\n    }\n\n    const avcc = MP4.box(\n      MP4.types.avcC,\n      new Uint8Array(\n        [\n          0x01, // version\n          sps[3], // profile\n          sps[4], // profile compat\n          sps[5], // level\n          0xfc | 3, // lengthSizeMinusOne, hard-coded to 4 bytes\n          0xe0 | track.sps.length, // 3bit reserved (111) + numOfSequenceParameterSets\n        ]\n          .concat(sps)\n          .concat([\n            track.pps.length, // numOfPictureParameterSets\n          ])\n          .concat(pps),\n      ),\n    ); // \"PPS\"\n    const width = track.width;\n    const height = track.height;\n    const hSpacing = track.pixelRatio[0];\n    const vSpacing = track.pixelRatio[1];\n\n    return MP4.box(\n      MP4.types.avc1,\n      new Uint8Array([\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x01, // data_reference_index\n        0x00,\n        0x00, // pre_defined\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00, // pre_defined\n        (width >> 8) & 0xff,\n        width & 0xff, // width\n        (height >> 8) & 0xff,\n        height & 0xff, // height\n        0x00,\n        0x48,\n        0x00,\n        0x00, // horizresolution\n        0x00,\n        0x48,\n        0x00,\n        0x00, // vertresolution\n        0x00,\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x01, // frame_count\n        0x12,\n        0x64,\n        0x61,\n        0x69,\n        0x6c, // dailymotion/hls.js\n        0x79,\n        0x6d,\n        0x6f,\n        0x74,\n        0x69,\n        0x6f,\n        0x6e,\n        0x2f,\n        0x68,\n        0x6c,\n        0x73,\n        0x2e,\n        0x6a,\n        0x73,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00, // compressorname\n        0x00,\n        0x18, // depth = 24\n        0x11,\n        0x11,\n      ]), // pre_defined = -1\n      avcc,\n      MP4.box(\n        MP4.types.btrt,\n        new Uint8Array([\n          0x00,\n          0x1c,\n          0x9c,\n          0x80, // bufferSizeDB\n          0x00,\n          0x2d,\n          0xc6,\n          0xc0, // maxBitrate\n          0x00,\n          0x2d,\n          0xc6,\n          0xc0,\n        ]),\n      ), // avgBitrate\n      MP4.box(\n        MP4.types.pasp,\n        new Uint8Array([\n          hSpacing >> 24, // hSpacing\n          (hSpacing >> 16) & 0xff,\n          (hSpacing >> 8) & 0xff,\n          hSpacing & 0xff,\n          vSpacing >> 24, // vSpacing\n          (vSpacing >> 16) & 0xff,\n          (vSpacing >> 8) & 0xff,\n          vSpacing & 0xff,\n        ]),\n      ),\n    );\n  }\n\n  static esds(track: DemuxedAudioTrack) {\n    const config = track.config as [number, number];\n    return new Uint8Array([\n      0x00, // version 0\n      0x00,\n      0x00,\n      0x00, // flags\n\n      0x03, // descriptor_type\n      0x19, // length\n\n      0x00,\n      0x01, // es_id\n\n      0x00, // stream_priority\n\n      0x04, // descriptor_type\n      0x11, // length\n      0x40, // codec : mpeg4_audio\n      0x15, // stream_type\n      0x00,\n      0x00,\n      0x00, // buffer_size\n      0x00,\n      0x00,\n      0x00,\n      0x00, // maxBitrate\n      0x00,\n      0x00,\n      0x00,\n      0x00, // avgBitrate\n\n      0x05, // descriptor_type\n      0x02, // length\n      ...config,\n      0x06,\n      0x01,\n      0x02, // GASpecificConfig)); // length + audio config descriptor\n    ]);\n  }\n\n  static audioStsd(track: DemuxedAudioTrack) {\n    const samplerate = track.samplerate || 0;\n    return new Uint8Array([\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      0x01, // data_reference_index\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved\n      0x00,\n      track.channelCount || 0, // channelcount\n      0x00,\n      0x10, // sampleSize:16bits\n      0x00,\n      0x00,\n      0x00,\n      0x00, // reserved2\n      (samplerate >> 8) & 0xff,\n      samplerate & 0xff, //\n      0x00,\n      0x00,\n    ]);\n  }\n\n  static mp4a(track: DemuxedAudioTrack) {\n    return MP4.box(\n      MP4.types.mp4a,\n      MP4.audioStsd(track),\n      MP4.box(MP4.types.esds, MP4.esds(track)),\n    );\n  }\n\n  static mp3(track: DemuxedAudioTrack) {\n    return MP4.box(MP4.types['.mp3'], MP4.audioStsd(track));\n  }\n\n  static ac3(track: DemuxedAudioTrack) {\n    return MP4.box(\n      MP4.types['ac-3'],\n      MP4.audioStsd(track),\n      MP4.box(MP4.types.dac3, track.config as Uint8Array),\n    );\n  }\n\n  static stsd(track: MediaTrackType | DemuxedAC3): Uint8Array {\n    const { segmentCodec } = track;\n    if (track.type === 'audio') {\n      if (segmentCodec === 'aac') {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp4a(track));\n      }\n      if (\n        __USE_M2TS_ADVANCED_CODECS__ &&\n        segmentCodec === 'ac3' &&\n        track.config\n      ) {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.ac3(track));\n      }\n      if (segmentCodec === 'mp3' && track.codec === 'mp3') {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp3(track));\n      }\n    } else {\n      if (track.pps && track.sps) {\n        if (segmentCodec === 'avc') {\n          return MP4.box(\n            MP4.types.stsd,\n            MP4.STSD,\n            MP4.avc1(track as DemuxedAVC1),\n          );\n        }\n        if (\n          __USE_M2TS_ADVANCED_CODECS__ &&\n          segmentCodec === 'hevc' &&\n          track.vps\n        ) {\n          return MP4.box(\n            MP4.types.stsd,\n            MP4.STSD,\n            MP4.hvc1(track as DemuxedHEVC),\n          );\n        }\n      } else {\n        throw new Error(`video track missing pps or sps`);\n      }\n    }\n\n    throw new Error(\n      `unsupported ${track.type} segment codec (${segmentCodec}/${track.codec})`,\n    );\n  }\n\n  static tkhd(track: MediaTrackType) {\n    const id = track.id;\n    const duration = (track.duration || 0) * (track.timescale || 0);\n    const width = (track as any).width || 0;\n    const height = (track as any).height || 0;\n    const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n    const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n    return MP4.box(\n      MP4.types.tkhd,\n      new Uint8Array([\n        0x01, // version 1\n        0x00,\n        0x00,\n        0x07, // flags\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x02, // creation_time\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x03, // modification_time\n        (id >> 24) & 0xff,\n        (id >> 16) & 0xff,\n        (id >> 8) & 0xff,\n        id & 0xff, // track_ID\n        0x00,\n        0x00,\n        0x00,\n        0x00, // reserved\n        upperWordDuration >> 24,\n        (upperWordDuration >> 16) & 0xff,\n        (upperWordDuration >> 8) & 0xff,\n        upperWordDuration & 0xff,\n        lowerWordDuration >> 24,\n        (lowerWordDuration >> 16) & 0xff,\n        (lowerWordDuration >> 8) & 0xff,\n        lowerWordDuration & 0xff,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x00, // layer\n        0x00,\n        0x00, // alternate_group\n        0x00,\n        0x00, // non-audio track volume\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x01,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x01,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x40,\n        0x00,\n        0x00,\n        0x00, // transformation: unity matrix\n        (width >> 8) & 0xff,\n        width & 0xff,\n        0x00,\n        0x00, // width\n        (height >> 8) & 0xff,\n        height & 0xff,\n        0x00,\n        0x00, // height\n      ]),\n    );\n  }\n\n  static traf(track: RemuxedTrackType, baseMediaDecodeTime: number) {\n    const sampleDependencyTable = MP4.sdtp(track);\n    const id = track.id;\n    const upperWordBaseMediaDecodeTime = Math.floor(\n      baseMediaDecodeTime / (UINT32_MAX + 1),\n    );\n    const lowerWordBaseMediaDecodeTime = Math.floor(\n      baseMediaDecodeTime % (UINT32_MAX + 1),\n    );\n    return MP4.box(\n      MP4.types.traf,\n      MP4.box(\n        MP4.types.tfhd,\n        new Uint8Array([\n          0x00, // version 0\n          0x00,\n          0x00,\n          0x00, // flags\n          id >> 24,\n          (id >> 16) & 0xff,\n          (id >> 8) & 0xff,\n          id & 0xff, // track_ID\n        ]),\n      ),\n      MP4.box(\n        MP4.types.tfdt,\n        new Uint8Array([\n          0x01, // version 1\n          0x00,\n          0x00,\n          0x00, // flags\n          upperWordBaseMediaDecodeTime >> 24,\n          (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n          (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n          upperWordBaseMediaDecodeTime & 0xff,\n          lowerWordBaseMediaDecodeTime >> 24,\n          (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n          (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n          lowerWordBaseMediaDecodeTime & 0xff,\n        ]),\n      ),\n      MP4.trun(\n        track,\n        sampleDependencyTable.length +\n          16 + // tfhd\n          20 + // tfdt\n          8 + // traf header\n          16 + // mfhd\n          8 + // moof header\n          8,\n      ), // mdat header\n      sampleDependencyTable,\n    );\n  }\n\n  /**\n   * Generate a track box.\n   * @param track a track definition\n   */\n  static trak(track: MediaTrackType) {\n    track.duration = track.duration || 0xffffffff;\n    return MP4.box(MP4.types.trak, MP4.tkhd(track), MP4.mdia(track));\n  }\n\n  static trex(track: MediaTrackType) {\n    const id = track.id;\n    return MP4.box(\n      MP4.types.trex,\n      new Uint8Array([\n        0x00, // version 0\n        0x00,\n        0x00,\n        0x00, // flags\n        id >> 24,\n        (id >> 16) & 0xff,\n        (id >> 8) & 0xff,\n        id & 0xff, // track_ID\n        0x00,\n        0x00,\n        0x00,\n        0x01, // default_sample_description_index\n        0x00,\n        0x00,\n        0x00,\n        0x00, // default_sample_duration\n        0x00,\n        0x00,\n        0x00,\n        0x00, // default_sample_size\n        0x00,\n        0x01,\n        0x00,\n        0x01, // default_sample_flags\n      ]),\n    );\n  }\n\n  static trun(track: MediaTrackType, offset: number) {\n    const samples = track.samples || [];\n    const len = samples.length;\n    const arraylen = 12 + 16 * len;\n    const array = new Uint8Array(arraylen);\n    let i;\n    let sample;\n    let duration;\n    let size;\n    let flags;\n    let cts;\n    offset += 8 + arraylen;\n    array.set(\n      [\n        track.type === 'video' ? 0x01 : 0x00, // version 1 for video with signed-int sample_composition_time_offset\n        0x00,\n        0x0f,\n        0x01, // flags\n        (len >>> 24) & 0xff,\n        (len >>> 16) & 0xff,\n        (len >>> 8) & 0xff,\n        len & 0xff, // sample_count\n        (offset >>> 24) & 0xff,\n        (offset >>> 16) & 0xff,\n        (offset >>> 8) & 0xff,\n        offset & 0xff, // data_offset\n      ],\n      0,\n    );\n    for (i = 0; i < len; i++) {\n      sample = samples[i];\n      duration = sample.duration;\n      size = sample.size;\n      flags = sample.flags;\n      cts = sample.cts;\n      array.set(\n        [\n          (duration >>> 24) & 0xff,\n          (duration >>> 16) & 0xff,\n          (duration >>> 8) & 0xff,\n          duration & 0xff, // sample_duration\n          (size >>> 24) & 0xff,\n          (size >>> 16) & 0xff,\n          (size >>> 8) & 0xff,\n          size & 0xff, // sample_size\n          (flags.isLeading << 2) | flags.dependsOn,\n          (flags.isDependedOn << 6) |\n            (flags.hasRedundancy << 4) |\n            (flags.paddingValue << 1) |\n            flags.isNonSync,\n          flags.degradPrio & (0xf0 << 8),\n          flags.degradPrio & 0x0f, // sample_flags\n          (cts >>> 24) & 0xff,\n          (cts >>> 16) & 0xff,\n          (cts >>> 8) & 0xff,\n          cts & 0xff, // sample_composition_time_offset\n        ],\n        12 + 16 * i,\n      );\n    }\n    return MP4.box(MP4.types.trun, array);\n  }\n\n  static initSegment(tracks: MediaTrackType[]) {\n    if (!MP4.types) {\n      MP4.init();\n    }\n\n    const movie = MP4.moov(tracks);\n    const result = appendUint8Array(MP4.FTYP, movie);\n    return result;\n  }\n\n  static hvc1(track: DemuxedHEVC) {\n    if (!__USE_M2TS_ADVANCED_CODECS__) {\n      return new Uint8Array();\n    }\n    const ps = track.params;\n    const units: Uint8Array[][] = [track.vps, track.sps, track.pps];\n    const NALuLengthSize = 4;\n    const config = new Uint8Array([\n      0x01,\n      (ps.general_profile_space << 6) |\n        (ps.general_tier_flag ? 32 : 0) |\n        ps.general_profile_idc,\n      ps.general_profile_compatibility_flags[0],\n      ps.general_profile_compatibility_flags[1],\n      ps.general_profile_compatibility_flags[2],\n      ps.general_profile_compatibility_flags[3],\n      ps.general_constraint_indicator_flags[0],\n      ps.general_constraint_indicator_flags[1],\n      ps.general_constraint_indicator_flags[2],\n      ps.general_constraint_indicator_flags[3],\n      ps.general_constraint_indicator_flags[4],\n      ps.general_constraint_indicator_flags[5],\n      ps.general_level_idc,\n      240 | (ps.min_spatial_segmentation_idc >> 8),\n      255 & ps.min_spatial_segmentation_idc,\n      252 | ps.parallelismType,\n      252 | ps.chroma_format_idc,\n      248 | ps.bit_depth_luma_minus8,\n      248 | ps.bit_depth_chroma_minus8,\n      0x00,\n      parseInt(ps.frame_rate.fps),\n      (NALuLengthSize - 1) |\n        (ps.temporal_id_nested << 2) |\n        (ps.num_temporal_layers << 3) |\n        (ps.frame_rate.fixed ? 64 : 0),\n      units.length,\n    ]);\n\n    // compute hvcC size in bytes\n    let length = config.length;\n    for (let i = 0; i < units.length; i += 1) {\n      length += 3;\n      for (let j = 0; j < units[i].length; j += 1) {\n        length += 2 + units[i][j].length;\n      }\n    }\n\n    const hvcC = new Uint8Array(length);\n    hvcC.set(config, 0);\n    length = config.length;\n    // append parameter set units: one vps, one or more sps and pps\n    const iMax = units.length - 1;\n    for (let i = 0; i < units.length; i += 1) {\n      hvcC.set(\n        new Uint8Array([\n          (32 + i) | (i === iMax ? 128 : 0),\n          0x00,\n          units[i].length,\n        ]),\n        length,\n      );\n      length += 3;\n      for (let j = 0; j < units[i].length; j += 1) {\n        hvcC.set(\n          new Uint8Array([units[i][j].length >> 8, units[i][j].length & 255]),\n          length,\n        );\n        length += 2;\n        hvcC.set(units[i][j], length);\n        length += units[i][j].length;\n      }\n    }\n    const hvcc = MP4.box(MP4.types.hvcC, hvcC);\n    const width = track.width;\n    const height = track.height;\n    const hSpacing = track.pixelRatio[0];\n    const vSpacing = track.pixelRatio[1];\n\n    return MP4.box(\n      MP4.types.hvc1,\n      new Uint8Array([\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x01, // data_reference_index\n        0x00,\n        0x00, // pre_defined\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00, // pre_defined\n        (width >> 8) & 0xff,\n        width & 0xff, // width\n        (height >> 8) & 0xff,\n        height & 0xff, // height\n        0x00,\n        0x48,\n        0x00,\n        0x00, // horizresolution\n        0x00,\n        0x48,\n        0x00,\n        0x00, // vertresolution\n        0x00,\n        0x00,\n        0x00,\n        0x00, // reserved\n        0x00,\n        0x01, // frame_count\n        0x12,\n        0x64,\n        0x61,\n        0x69,\n        0x6c, // dailymotion/hls.js\n        0x79,\n        0x6d,\n        0x6f,\n        0x74,\n        0x69,\n        0x6f,\n        0x6e,\n        0x2f,\n        0x68,\n        0x6c,\n        0x73,\n        0x2e,\n        0x6a,\n        0x73,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00,\n        0x00, // compressorname\n        0x00,\n        0x18, // depth = 24\n        0x11,\n        0x11,\n      ]), // pre_defined = -1\n      hvcc,\n      MP4.box(\n        MP4.types.btrt,\n        new Uint8Array([\n          0x00,\n          0x1c,\n          0x9c,\n          0x80, // bufferSizeDB\n          0x00,\n          0x2d,\n          0xc6,\n          0xc0, // maxBitrate\n          0x00,\n          0x2d,\n          0xc6,\n          0xc0,\n        ]),\n      ), // avgBitrate\n      MP4.box(\n        MP4.types.pasp,\n        new Uint8Array([\n          hSpacing >> 24, // hSpacing\n          (hSpacing >> 16) & 0xff,\n          (hSpacing >> 8) & 0xff,\n          hSpacing & 0xff,\n          vSpacing >> 24, // vSpacing\n          (vSpacing >> 16) & 0xff,\n          (vSpacing >> 8) & 0xff,\n          vSpacing & 0xff,\n        ]),\n      ),\n    );\n  }\n}\n\nexport default MP4;\n", "const MPEG_TS_CLOCK_FREQ_HZ = 90000;\n\nexport type RationalTimestamp = {\n  baseTime: number; // ticks\n  timescale: number; // ticks per second\n};\n\nexport type TimestampOffset = RationalTimestamp & { trackId: number };\n\nexport function toTimescaleFromBase(\n  baseTime: number,\n  destScale: number,\n  srcBase: number = 1,\n  round: boolean = false,\n): number {\n  const result = baseTime * destScale * srcBase; // equivalent to `(value * scale) / (1 / base)`\n  return round ? Math.round(result) : result;\n}\n\nexport function toTimescaleFromScale(\n  baseTime: number,\n  destScale: number,\n  srcScale: number = 1,\n  round: boolean = false,\n): number {\n  return toTimescaleFromBase(baseTime, destScale, 1 / srcScale, round);\n}\n\nexport function toMsFromMpegTsClock(\n  baseTime: number,\n  round: boolean = false,\n): number {\n  return toTimescaleFromBase(baseTime, 1000, 1 / MPEG_TS_CLOCK_FREQ_HZ, round);\n}\n\nexport function toMpegTsClockFromTimescale(\n  baseTime: number,\n  srcScale: number = 1,\n): number {\n  return toTimescaleFromBase(baseTime, MPEG_TS_CLOCK_FREQ_HZ, 1 / srcScale);\n}\n\nexport function timestampToString(timestamp: TimestampOffset): string {\n  const { baseTime, timescale, trackId } = timestamp;\n  return `${baseTime / timescale} (${baseTime}/${timescale}) trackId: ${trackId}`;\n}\n", "import AAC from './aac-helper';\nimport MP4 from './mp4-generator';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { PlaylistLevelType } from '../types/loader';\nimport { type ILogger, Logger } from '../utils/logger';\nimport {\n  timestampToString,\n  toMsFromMpegTsClock,\n} from '../utils/timescale-conversion';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport type { SourceBufferName } from '../types/buffer';\nimport type {\n  AudioSample,\n  DemuxedAudioTrack,\n  DemuxedMetadataTrack,\n  DemuxedUserdataTrack,\n  DemuxedVideoTrack,\n  VideoSample,\n} from '../types/demuxer';\nimport type {\n  InitSegmentData,\n  Mp4Sample,\n  RemuxedMetadata,\n  RemuxedTrack,\n  RemuxedUserdata,\n  Remuxer,\n  RemuxerResult,\n} from '../types/remuxer';\nimport type { TrackSet } from '../types/track';\nimport type { TypeSupported } from '../utils/codecs';\nimport type {\n  RationalTimestamp,\n  TimestampOffset,\n} from '../utils/timescale-conversion';\n\nconst MAX_SILENT_FRAME_DURATION = 10 * 1000; // 10 seconds\nconst AAC_SAMPLES_PER_FRAME = 1024;\nconst MPEG_AUDIO_SAMPLE_PER_FRAME = 1152;\nconst AC3_SAMPLES_PER_FRAME = 1536;\n\nlet chromeVersion: number | null = null;\nlet safariWebkitVersion: number | null = null;\n\nfunction createMp4Sample(\n  isKeyframe: boolean,\n  duration: number,\n  size: number,\n  cts: number,\n): Mp4Sample {\n  return {\n    duration,\n    size,\n    cts,\n    flags: {\n      isLeading: 0,\n      isDependedOn: 0,\n      hasRedundancy: 0,\n      degradPrio: 0,\n      dependsOn: isKeyframe ? 2 : 1,\n      isNonSync: isKeyframe ? 0 : 1,\n    },\n  };\n}\nexport default class MP4Remuxer extends Logger implements Remuxer {\n  private readonly observer: HlsEventEmitter;\n  private readonly config: HlsConfig;\n  private readonly typeSupported: TypeSupported;\n  private ISGenerated: boolean = false;\n  private _initPTS: TimestampOffset | null = null;\n  private _initDTS: TimestampOffset | null = null;\n  private nextVideoTs: number | null = null;\n  private nextAudioTs: number | null = null;\n  private videoSampleDuration: number | null = null;\n  private isAudioContiguous: boolean = false;\n  private isVideoContiguous: boolean = false;\n  private videoTrackConfig?: {\n    width?: number;\n    height?: number;\n    pixelRatio?: [number, number];\n  };\n\n  constructor(\n    observer: HlsEventEmitter,\n    config: HlsConfig,\n    typeSupported: TypeSupported,\n    logger: ILogger,\n  ) {\n    super('mp4-remuxer', logger);\n    this.observer = observer;\n    this.config = config;\n    this.typeSupported = typeSupported;\n    this.ISGenerated = false;\n\n    if (chromeVersion === null) {\n      const userAgent = navigator.userAgent || '';\n      const result = userAgent.match(/Chrome\\/(\\d+)/i);\n      chromeVersion = result ? parseInt(result[1]) : 0;\n    }\n    if (safariWebkitVersion === null) {\n      const result = navigator.userAgent.match(/Safari\\/(\\d+)/i);\n      safariWebkitVersion = result ? parseInt(result[1]) : 0;\n    }\n  }\n\n  destroy() {\n    // @ts-ignore\n    this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;\n  }\n\n  resetTimeStamp(defaultTimeStamp: TimestampOffset | null) {\n    const initPTS = this._initPTS;\n    if (\n      !initPTS ||\n      !defaultTimeStamp ||\n      defaultTimeStamp.trackId !== initPTS.trackId ||\n      defaultTimeStamp.baseTime !== initPTS.baseTime ||\n      defaultTimeStamp.timescale !== initPTS.timescale\n    ) {\n      this.log(\n        `Reset initPTS: ${initPTS ? timestampToString(initPTS) : initPTS} > ${defaultTimeStamp ? timestampToString(defaultTimeStamp) : defaultTimeStamp}`,\n      );\n    }\n\n    this._initPTS = this._initDTS = defaultTimeStamp;\n  }\n\n  resetNextTimestamp() {\n    this.log('reset next timestamp');\n    this.isVideoContiguous = false;\n    this.isAudioContiguous = false;\n  }\n\n  resetInitSegment() {\n    this.log('ISGenerated flag reset');\n    this.ISGenerated = false;\n    this.videoTrackConfig = undefined;\n  }\n\n  getVideoStartPts(videoSamples: VideoSample[]) {\n    // Get the minimum PTS value relative to the first sample's PTS, normalized for 33-bit wrapping\n    let rolloverDetected = false;\n    const firstPts = videoSamples[0].pts;\n    const startPTS = videoSamples.reduce((minPTS, sample) => {\n      let pts = sample.pts;\n      let delta = pts - minPTS;\n      if (delta < -4294967296) {\n        // 2^32, see PTSNormalize for reasoning, but we're hitting a rollover here, and we don't want that to impact the timeOffset calculation\n        rolloverDetected = true;\n        pts = normalizePts(pts, firstPts);\n        delta = pts - minPTS;\n      }\n      if (delta > 0) {\n        return minPTS;\n      }\n      return pts;\n    }, firstPts);\n    if (rolloverDetected) {\n      this.debug('PTS rollover detected');\n    }\n    return startPTS;\n  }\n\n  remux(\n    audioTrack: DemuxedAudioTrack,\n    videoTrack: DemuxedVideoTrack,\n    id3Track: DemuxedMetadataTrack,\n    textTrack: DemuxedUserdataTrack,\n    timeOffset: number,\n    accurateTimeOffset: boolean,\n    flush: boolean,\n    playlistType: PlaylistLevelType,\n  ): RemuxerResult {\n    let video: RemuxedTrack | undefined;\n    let audio: RemuxedTrack | undefined;\n    let initSegment: InitSegmentData | undefined;\n    let text: RemuxedUserdata | undefined;\n    let id3: RemuxedMetadata | undefined;\n    let independent: boolean | undefined;\n    let audioTimeOffset = timeOffset;\n    let videoTimeOffset = timeOffset;\n\n    // If we're remuxing audio and video progressively, wait until we've received enough samples for each track before proceeding.\n    // This is done to synchronize the audio and video streams. We know if the current segment will have samples if the \"pid\"\n    // parameter is greater than -1. The pid is set when the PMT is parsed, which contains the tracks list.\n    // However, if the initSegment has already been generated, or we've reached the end of a segment (flush),\n    // then we can remux one track without waiting for the other.\n    const hasAudio = audioTrack.pid > -1;\n    const hasVideo = videoTrack.pid > -1;\n    const length = videoTrack.samples.length;\n    const enoughAudioSamples = audioTrack.samples.length > 0;\n    const enoughVideoSamples = (flush && length > 0) || length > 1;\n    const canRemuxAvc =\n      ((!hasAudio || enoughAudioSamples) &&\n        (!hasVideo || enoughVideoSamples)) ||\n      this.ISGenerated ||\n      flush;\n\n    if (canRemuxAvc) {\n      if (this.ISGenerated) {\n        const config = this.videoTrackConfig;\n        if (\n          (config &&\n            (videoTrack.width !== config.width ||\n              videoTrack.height !== config.height ||\n              videoTrack.pixelRatio?.[0] !== config.pixelRatio?.[0] ||\n              videoTrack.pixelRatio?.[1] !== config.pixelRatio?.[1])) ||\n          (!config && enoughVideoSamples) ||\n          (this.nextAudioTs === null && enoughAudioSamples)\n        ) {\n          this.resetInitSegment();\n        }\n      }\n      if (!this.ISGenerated) {\n        initSegment = this.generateIS(\n          audioTrack,\n          videoTrack,\n          timeOffset,\n          accurateTimeOffset,\n        );\n      }\n\n      const isVideoContiguous = this.isVideoContiguous;\n      let firstKeyFrameIndex = -1;\n      let firstKeyFramePTS;\n\n      if (enoughVideoSamples) {\n        firstKeyFrameIndex = findKeyframeIndex(videoTrack.samples);\n        if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {\n          independent = true;\n          if (firstKeyFrameIndex > 0) {\n            this.warn(\n              `Dropped ${firstKeyFrameIndex} out of ${length} video samples due to a missing keyframe`,\n            );\n            const startPTS = this.getVideoStartPts(videoTrack.samples);\n            videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);\n            videoTrack.dropped += firstKeyFrameIndex;\n            videoTimeOffset +=\n              (videoTrack.samples[0].pts - startPTS) /\n              videoTrack.inputTimeScale;\n            firstKeyFramePTS = videoTimeOffset;\n          } else if (firstKeyFrameIndex === -1) {\n            this.warn(`No keyframe found out of ${length} video samples`);\n            independent = false;\n          }\n        }\n      }\n\n      if (this.ISGenerated) {\n        if (enoughAudioSamples && enoughVideoSamples) {\n          // timeOffset is expected to be the offset of the first timestamp of this fragment (first DTS)\n          // if first audio DTS is not aligned with first video DTS then we need to take that into account\n          // when providing timeOffset to remuxAudio / remuxVideo. if we don't do that, there might be a permanent / small\n          // drift between audio and video streams\n          const startPTS = this.getVideoStartPts(videoTrack.samples);\n          const tsDelta =\n            normalizePts(audioTrack.samples[0].pts, startPTS) - startPTS;\n          const audiovideoTimestampDelta = tsDelta / videoTrack.inputTimeScale;\n          audioTimeOffset += Math.max(0, audiovideoTimestampDelta);\n          videoTimeOffset += Math.max(0, -audiovideoTimestampDelta);\n        }\n\n        // Purposefully remuxing audio before video, so that remuxVideo can use nextAudioPts, which is calculated in remuxAudio.\n        if (enoughAudioSamples) {\n          // if initSegment was generated without audio samples, regenerate it again\n          if (!audioTrack.samplerate) {\n            this.warn('regenerate InitSegment as audio detected');\n            initSegment = this.generateIS(\n              audioTrack,\n              videoTrack,\n              timeOffset,\n              accurateTimeOffset,\n            );\n          }\n          audio = this.remuxAudio(\n            audioTrack,\n            audioTimeOffset,\n            this.isAudioContiguous,\n            accurateTimeOffset,\n            hasVideo ||\n              enoughVideoSamples ||\n              playlistType === PlaylistLevelType.AUDIO\n              ? videoTimeOffset\n              : undefined,\n          );\n          if (enoughVideoSamples) {\n            const audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;\n            // if initSegment was generated without video samples, regenerate it again\n            if (!videoTrack.inputTimeScale) {\n              this.warn('regenerate InitSegment as video detected');\n              initSegment = this.generateIS(\n                audioTrack,\n                videoTrack,\n                timeOffset,\n                accurateTimeOffset,\n              );\n            }\n            video = this.remuxVideo(\n              videoTrack,\n              videoTimeOffset,\n              isVideoContiguous,\n              audioTrackLength,\n            );\n          }\n        } else if (enoughVideoSamples) {\n          video = this.remuxVideo(\n            videoTrack,\n            videoTimeOffset,\n            isVideoContiguous,\n            0,\n          );\n        }\n        if (video) {\n          video.firstKeyFrame = firstKeyFrameIndex;\n          video.independent = firstKeyFrameIndex !== -1;\n          video.firstKeyFramePTS = firstKeyFramePTS;\n        }\n      }\n    }\n\n    // Allow ID3 and text to remux, even if more audio/video samples are required\n    if (this.ISGenerated && this._initPTS && this._initDTS) {\n      if (id3Track.samples.length) {\n        id3 = flushTextTrackMetadataCueSamples(\n          id3Track,\n          timeOffset,\n          this._initPTS,\n          this._initDTS,\n        );\n      }\n\n      if (textTrack.samples.length) {\n        text = flushTextTrackUserdataCueSamples(\n          textTrack,\n          timeOffset,\n          this._initPTS,\n        );\n      }\n    }\n\n    return {\n      audio,\n      video,\n      initSegment,\n      independent,\n      text,\n      id3,\n    };\n  }\n\n  computeInitPts(\n    basetime: number,\n    timescale: number,\n    presentationTime: number,\n    type: 'audio' | 'video',\n  ): number {\n    const offset = Math.round(presentationTime * timescale);\n    let timestamp = normalizePts(basetime, offset);\n    if (timestamp < offset + timescale) {\n      this.log(\n        `Adjusting PTS for rollover in timeline near ${(offset - timestamp) / timescale} ${type}`,\n      );\n      while (timestamp < offset + timescale) {\n        timestamp += 8589934592;\n      }\n    }\n    return timestamp - offset;\n  }\n\n  generateIS(\n    audioTrack: DemuxedAudioTrack,\n    videoTrack: DemuxedVideoTrack,\n    timeOffset: number,\n    accurateTimeOffset: boolean,\n  ): InitSegmentData | undefined {\n    const audioSamples = audioTrack.samples;\n    const videoSamples = videoTrack.samples;\n    const typeSupported = this.typeSupported;\n    const tracks: TrackSet = {};\n    const _initPTS = this._initPTS;\n    let computePTSDTS = !_initPTS || accurateTimeOffset;\n    let container = 'audio/mp4';\n    let initPTS: number | undefined;\n    let initDTS: number | undefined;\n    let timescale: number | undefined;\n    let trackId: number = -1;\n\n    if (computePTSDTS) {\n      initPTS = initDTS = Infinity;\n    }\n\n    if (audioTrack.config && audioSamples.length) {\n      // let's use audio sampling rate as MP4 time scale.\n      // rationale is that there is a integer nb of audio frames per audio sample (1024 for AAC)\n      // using audio sampling rate here helps having an integer MP4 frame duration\n      // this avoids potential rounding issue and AV sync issue\n      audioTrack.timescale = audioTrack.samplerate;\n      switch (audioTrack.segmentCodec) {\n        case 'mp3':\n          if (typeSupported.mpeg) {\n            // Chrome and Safari\n            container = 'audio/mpeg';\n            audioTrack.codec = '';\n          } else if (typeSupported.mp3) {\n            // Firefox\n            audioTrack.codec = 'mp3';\n          }\n          break;\n\n        case 'ac3':\n          audioTrack.codec = 'ac-3';\n          break;\n      }\n      tracks.audio = {\n        id: 'audio',\n        container: container,\n        codec: audioTrack.codec,\n        initSegment:\n          audioTrack.segmentCodec === 'mp3' && typeSupported.mpeg\n            ? new Uint8Array(0)\n            : MP4.initSegment([audioTrack]),\n        metadata: {\n          channelCount: audioTrack.channelCount,\n        },\n      };\n      if (computePTSDTS) {\n        trackId = audioTrack.id;\n        timescale = audioTrack.inputTimeScale;\n        if (!_initPTS || timescale !== _initPTS.timescale) {\n          // remember first PTS of this demuxing context. for audio, PTS = DTS\n          initPTS = initDTS = this.computeInitPts(\n            audioSamples[0].pts,\n            timescale,\n            timeOffset,\n            'audio',\n          );\n        } else {\n          computePTSDTS = false;\n        }\n      }\n    }\n\n    if (videoTrack.sps && videoTrack.pps && videoSamples.length) {\n      // let's use input time scale as MP4 video timescale\n      // we use input time scale straight away to avoid rounding issues on frame duration / cts computation\n      videoTrack.timescale = videoTrack.inputTimeScale;\n      tracks.video = {\n        id: 'main',\n        container: 'video/mp4',\n        codec: videoTrack.codec,\n        initSegment: MP4.initSegment([videoTrack]),\n        metadata: {\n          width: videoTrack.width,\n          height: videoTrack.height,\n        },\n      };\n      if (computePTSDTS) {\n        trackId = videoTrack.id;\n        timescale = videoTrack.inputTimeScale;\n        if (!_initPTS || timescale !== _initPTS.timescale) {\n          const basePTS = this.getVideoStartPts(videoSamples);\n          const baseDTS = normalizePts(videoSamples[0].dts, basePTS);\n          const videoInitDTS = this.computeInitPts(\n            baseDTS,\n            timescale,\n            timeOffset,\n            'video',\n          );\n          const videoInitPTS = this.computeInitPts(\n            basePTS,\n            timescale,\n            timeOffset,\n            'video',\n          );\n          initDTS = Math.min(initDTS as number, videoInitDTS);\n          initPTS = Math.min(initPTS as number, videoInitPTS);\n        } else {\n          computePTSDTS = false;\n        }\n      }\n      this.videoTrackConfig = {\n        width: videoTrack.width,\n        height: videoTrack.height,\n        pixelRatio: videoTrack.pixelRatio,\n      };\n    }\n\n    if (Object.keys(tracks).length) {\n      this.ISGenerated = true;\n      if (computePTSDTS) {\n        if (_initPTS) {\n          this.warn(\n            `Timestamps at playlist time: ${accurateTimeOffset ? '' : '~'}${timeOffset} ${initPTS! / timescale!} != initPTS: ${_initPTS.baseTime / _initPTS.timescale} (${_initPTS.baseTime}/${_initPTS.timescale}) trackId: ${_initPTS.trackId}`,\n          );\n        }\n        this.log(\n          `Found initPTS at playlist time: ${timeOffset} offset: ${initPTS! / timescale!} (${initPTS}/${timescale}) trackId: ${trackId}`,\n        );\n        this._initPTS = {\n          baseTime: initPTS as number,\n          timescale: timescale as number,\n          trackId: trackId as number,\n        };\n        this._initDTS = {\n          baseTime: initDTS as number,\n          timescale: timescale as number,\n          trackId: trackId as number,\n        };\n      } else {\n        initPTS = timescale = undefined;\n      }\n\n      return {\n        tracks,\n        initPTS,\n        timescale,\n        trackId,\n      };\n    }\n  }\n\n  remuxVideo(\n    track: DemuxedVideoTrack,\n    timeOffset: number,\n    contiguous: boolean,\n    audioTrackLength: number,\n  ): RemuxedTrack | undefined {\n    const timeScale: number = track.inputTimeScale;\n    const inputSamples: Array<VideoSample> = track.samples;\n    const outputSamples: Array<Mp4Sample> = [];\n    const nbSamples = inputSamples.length;\n    const initPTS = this._initPTS as RationalTimestamp;\n    const initTime = (initPTS.baseTime * timeScale) / initPTS.timescale;\n    let nextVideoTs = this.nextVideoTs;\n    let offset = 8;\n    let mp4SampleDuration = this.videoSampleDuration;\n    let firstDTS;\n    let lastDTS;\n    let minPTS: number = Number.POSITIVE_INFINITY;\n    let maxPTS: number = Number.NEGATIVE_INFINITY;\n    let sortSamples = false;\n\n    // if parsed fragment is contiguous with last one, let's use last DTS value as reference\n    if (!contiguous || nextVideoTs === null) {\n      const pts = initTime + timeOffset * timeScale;\n      const cts =\n        inputSamples[0].pts -\n        normalizePts(inputSamples[0].dts, inputSamples[0].pts);\n      if (\n        chromeVersion &&\n        nextVideoTs !== null &&\n        Math.abs(pts - cts - (nextVideoTs + initTime)) < 15000\n      ) {\n        // treat as contigous to adjust samples that would otherwise produce video buffer gaps in Chrome\n        contiguous = true;\n      } else {\n        // if not contiguous, let's use target timeOffset\n        nextVideoTs = pts - cts - initTime;\n      }\n    }\n\n    // PTS is coded on 33bits, and can loop from -2^32 to 2^32\n    // PTSNormalize will make PTS/DTS value monotonic, we use last known DTS value as reference value\n    const nextVideoPts = nextVideoTs + initTime;\n    for (let i = 0; i < nbSamples; i++) {\n      const sample = inputSamples[i];\n      sample.pts = normalizePts(sample.pts, nextVideoPts);\n      sample.dts = normalizePts(sample.dts, nextVideoPts);\n      if (sample.dts < inputSamples[i > 0 ? i - 1 : i].dts) {\n        sortSamples = true;\n      }\n    }\n\n    // sort video samples by DTS then PTS then demux id order\n    if (sortSamples) {\n      inputSamples.sort(function (a, b) {\n        const deltadts = a.dts - b.dts;\n        const deltapts = a.pts - b.pts;\n        return deltadts || deltapts;\n      });\n    }\n\n    // Get first/last DTS\n    firstDTS = inputSamples[0].dts;\n    lastDTS = inputSamples[inputSamples.length - 1].dts;\n\n    // Sample duration (as expected by trun MP4 boxes), should be the delta between sample DTS\n    // set this constant duration as being the avg delta between consecutive DTS.\n    const inputDuration = lastDTS - firstDTS;\n    const averageSampleDuration = inputDuration\n      ? Math.round(inputDuration / (nbSamples - 1))\n      : mp4SampleDuration || track.inputTimeScale / 30;\n\n    // if fragment are contiguous, detect hole/overlapping between fragments\n    if (contiguous) {\n      // check timestamp continuity across consecutive fragments (this is to remove inter-fragment gap/hole)\n      const delta = firstDTS - nextVideoPts;\n      const foundHole = delta > averageSampleDuration;\n      const foundOverlap = delta < -1;\n      if (foundHole || foundOverlap) {\n        if (foundHole) {\n          this.warn(\n            `${(track.segmentCodec || '').toUpperCase()}: ${toMsFromMpegTsClock(\n              delta,\n              true,\n            )} ms (${delta}dts) hole between fragments detected at ${timeOffset.toFixed(\n              3,\n            )}`,\n          );\n        } else {\n          this.warn(\n            `${(track.segmentCodec || '').toUpperCase()}: ${toMsFromMpegTsClock(\n              -delta,\n              true,\n            )} ms (${delta}dts) overlapping between fragments detected at ${timeOffset.toFixed(\n              3,\n            )}`,\n          );\n        }\n        if (\n          !foundOverlap ||\n          nextVideoPts >= inputSamples[0].pts ||\n          chromeVersion\n        ) {\n          firstDTS = nextVideoPts;\n          const firstPTS = inputSamples[0].pts - delta;\n          if (foundHole) {\n            inputSamples[0].dts = firstDTS;\n            inputSamples[0].pts = firstPTS;\n          } else {\n            let isPTSOrderRetained = true;\n            for (let i = 0; i < inputSamples.length; i++) {\n              if (inputSamples[i].dts > firstPTS && isPTSOrderRetained) {\n                break;\n              }\n\n              const prevPTS = inputSamples[i].pts;\n              inputSamples[i].dts -= delta;\n              inputSamples[i].pts -= delta;\n\n              // check to see if this sample's PTS order has changed\n              // relative to the next one\n              if (i < inputSamples.length - 1) {\n                const nextSamplePTS = inputSamples[i + 1].pts;\n                const currentSamplePTS = inputSamples[i].pts;\n\n                const currentOrder = nextSamplePTS <= currentSamplePTS;\n                const prevOrder = nextSamplePTS <= prevPTS;\n\n                isPTSOrderRetained = currentOrder == prevOrder;\n              }\n            }\n          }\n          this.log(\n            `Video: Initial PTS/DTS adjusted: ${toMsFromMpegTsClock(\n              firstPTS,\n              true,\n            )}/${toMsFromMpegTsClock(\n              firstDTS,\n              true,\n            )}, delta: ${toMsFromMpegTsClock(delta, true)} ms`,\n          );\n        }\n      }\n    }\n\n    firstDTS = Math.max(0, firstDTS);\n\n    let nbNalu = 0;\n    let naluLen = 0;\n    let dtsStep = firstDTS;\n    for (let i = 0; i < nbSamples; i++) {\n      // compute total/avc sample length and nb of NAL units\n      const sample = inputSamples[i];\n      const units = sample.units;\n      const nbUnits = units.length;\n      let sampleLen = 0;\n      for (let j = 0; j < nbUnits; j++) {\n        sampleLen += units[j].data.length;\n      }\n\n      naluLen += sampleLen;\n      nbNalu += nbUnits;\n      sample.length = sampleLen;\n\n      // ensure sample monotonic DTS\n      if (sample.dts < dtsStep) {\n        sample.dts = dtsStep;\n        dtsStep += (averageSampleDuration / 4) | 0 || 1;\n      } else {\n        dtsStep = sample.dts;\n      }\n\n      minPTS = Math.min(sample.pts, minPTS);\n      maxPTS = Math.max(sample.pts, maxPTS);\n    }\n    lastDTS = inputSamples[nbSamples - 1].dts;\n\n    /* concatenate the video data and construct the mdat in place\n      (need 8 more bytes to fill length and mpdat type) */\n    const mdatSize = naluLen + 4 * nbNalu + 8;\n    let mdat;\n    try {\n      mdat = new Uint8Array(mdatSize);\n    } catch (err) {\n      this.observer.emit(Events.ERROR, Events.ERROR, {\n        type: ErrorTypes.MUX_ERROR,\n        details: ErrorDetails.REMUX_ALLOC_ERROR,\n        fatal: false,\n        error: err,\n        bytes: mdatSize,\n        reason: `fail allocating video mdat ${mdatSize}`,\n      });\n      return;\n    }\n    const view = new DataView(mdat.buffer);\n    view.setUint32(0, mdatSize);\n    mdat.set(MP4.types.mdat, 4);\n\n    let stretchedLastFrame = false;\n    let minDtsDelta = Number.POSITIVE_INFINITY;\n    let minPtsDelta = Number.POSITIVE_INFINITY;\n    let maxDtsDelta = Number.NEGATIVE_INFINITY;\n    let maxPtsDelta = Number.NEGATIVE_INFINITY;\n    for (let i = 0; i < nbSamples; i++) {\n      const VideoSample = inputSamples[i];\n      const VideoSampleUnits = VideoSample.units;\n      let mp4SampleLength = 0;\n      // convert NALU bitstream to MP4 format (prepend NALU with size field)\n      for (let j = 0, nbUnits = VideoSampleUnits.length; j < nbUnits; j++) {\n        const unit = VideoSampleUnits[j];\n        const unitData = unit.data;\n        const unitDataLen = unit.data.byteLength;\n        view.setUint32(offset, unitDataLen);\n        offset += 4;\n        mdat.set(unitData, offset);\n        offset += unitDataLen;\n        mp4SampleLength += 4 + unitDataLen;\n      }\n\n      // expected sample duration is the Decoding Timestamp diff of consecutive samples\n      let ptsDelta;\n      if (i < nbSamples - 1) {\n        mp4SampleDuration = inputSamples[i + 1].dts - VideoSample.dts;\n        ptsDelta = inputSamples[i + 1].pts - VideoSample.pts;\n      } else {\n        const config = this.config;\n        const lastFrameDuration =\n          i > 0\n            ? VideoSample.dts - inputSamples[i - 1].dts\n            : averageSampleDuration;\n        ptsDelta =\n          i > 0\n            ? VideoSample.pts - inputSamples[i - 1].pts\n            : averageSampleDuration;\n        if (config.stretchShortVideoTrack && this.nextAudioTs !== null) {\n          // In some cases, a segment's audio track duration may exceed the video track duration.\n          // Since we've already remuxed audio, and we know how long the audio track is, we look to\n          // see if the delta to the next segment is longer than maxBufferHole.\n          // If so, playback would potentially get stuck, so we artificially inflate\n          // the duration of the last frame to minimize any potential gap between segments.\n          const gapTolerance = Math.floor(config.maxBufferHole * timeScale);\n          const deltaToFrameEnd =\n            (audioTrackLength\n              ? minPTS + audioTrackLength * timeScale\n              : this.nextAudioTs + initTime) - VideoSample.pts;\n          if (deltaToFrameEnd > gapTolerance) {\n            // We subtract lastFrameDuration from deltaToFrameEnd to try to prevent any video\n            // frame overlap. maxBufferHole should be >> lastFrameDuration anyway.\n            mp4SampleDuration = deltaToFrameEnd - lastFrameDuration;\n            if (mp4SampleDuration < 0) {\n              mp4SampleDuration = lastFrameDuration;\n            } else {\n              stretchedLastFrame = true;\n            }\n            this.log(\n              `It is approximately ${\n                deltaToFrameEnd / 90\n              } ms to the next segment; using duration ${\n                mp4SampleDuration / 90\n              } ms for the last video frame.`,\n            );\n          } else {\n            mp4SampleDuration = lastFrameDuration;\n          }\n        } else {\n          mp4SampleDuration = lastFrameDuration;\n        }\n      }\n      const compositionTimeOffset = Math.round(\n        VideoSample.pts - VideoSample.dts,\n      );\n      minDtsDelta = Math.min(minDtsDelta, mp4SampleDuration);\n      maxDtsDelta = Math.max(maxDtsDelta, mp4SampleDuration);\n      minPtsDelta = Math.min(minPtsDelta, ptsDelta);\n      maxPtsDelta = Math.max(maxPtsDelta, ptsDelta);\n\n      outputSamples.push(\n        createMp4Sample(\n          VideoSample.key,\n          mp4SampleDuration,\n          mp4SampleLength,\n          compositionTimeOffset,\n        ),\n      );\n    }\n\n    if (outputSamples.length) {\n      if (chromeVersion) {\n        if (chromeVersion < 70) {\n          // Chrome workaround, mark first sample as being a Random Access Point (keyframe) to avoid sourcebuffer append issue\n          // https://code.google.com/p/chromium/issues/detail?id=229412\n          const flags = outputSamples[0].flags;\n          flags.dependsOn = 2;\n          flags.isNonSync = 0;\n        }\n      } else if (safariWebkitVersion) {\n        // Fix for \"CNN special report, with CC\" in test-streams (Safari browser only)\n        // Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.\n        if (\n          maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta &&\n          averageSampleDuration / maxDtsDelta < 0.025 &&\n          outputSamples[0].cts === 0\n        ) {\n          this.warn(\n            'Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.',\n          );\n          let dts = firstDTS;\n          for (let i = 0, len = outputSamples.length; i < len; i++) {\n            const nextDts = dts + outputSamples[i].duration;\n            const pts = dts + outputSamples[i].cts;\n            if (i < len - 1) {\n              const nextPts = nextDts + outputSamples[i + 1].cts;\n              outputSamples[i].duration = nextPts - pts;\n            } else {\n              outputSamples[i].duration = i\n                ? outputSamples[i - 1].duration\n                : averageSampleDuration;\n            }\n            outputSamples[i].cts = 0;\n            dts = nextDts;\n          }\n        }\n      }\n    }\n    // next AVC/HEVC sample DTS should be equal to last sample DTS + last sample duration (in PES timescale)\n    mp4SampleDuration =\n      stretchedLastFrame || !mp4SampleDuration\n        ? averageSampleDuration\n        : mp4SampleDuration;\n    const endDTS = lastDTS + mp4SampleDuration;\n    this.nextVideoTs = nextVideoTs = endDTS - initTime;\n    this.videoSampleDuration = mp4SampleDuration;\n    this.isVideoContiguous = true;\n    const moof = MP4.moof(\n      track.sequenceNumber++,\n      firstDTS,\n      Object.assign(track, {\n        samples: outputSamples,\n      }),\n    );\n    const type: SourceBufferName = 'video';\n    const data = {\n      data1: moof,\n      data2: mdat,\n      startPTS: (minPTS - initTime) / timeScale,\n      endPTS: (maxPTS + mp4SampleDuration - initTime) / timeScale,\n      startDTS: (firstDTS - initTime) / timeScale,\n      endDTS: nextVideoTs / timeScale,\n      type,\n      hasAudio: false,\n      hasVideo: true,\n      nb: outputSamples.length,\n      dropped: track.dropped,\n    };\n    track.samples = [];\n    track.dropped = 0;\n    return data;\n  }\n\n  getSamplesPerFrame(track: DemuxedAudioTrack) {\n    switch (track.segmentCodec) {\n      case 'mp3':\n        return MPEG_AUDIO_SAMPLE_PER_FRAME;\n      case 'ac3':\n        return AC3_SAMPLES_PER_FRAME;\n      default:\n        return AAC_SAMPLES_PER_FRAME;\n    }\n  }\n\n  remuxAudio(\n    track: DemuxedAudioTrack,\n    timeOffset: number,\n    contiguous: boolean,\n    accurateTimeOffset: boolean,\n    videoTimeOffset?: number,\n  ): RemuxedTrack | undefined {\n    const inputTimeScale: number = track.inputTimeScale;\n    const mp4timeScale: number = track.samplerate\n      ? track.samplerate\n      : inputTimeScale;\n    const scaleFactor: number = inputTimeScale / mp4timeScale;\n    const mp4SampleDuration: number = this.getSamplesPerFrame(track);\n    const inputSampleDuration: number = mp4SampleDuration * scaleFactor;\n    const initPTS = this._initPTS as RationalTimestamp;\n    const rawMPEG: boolean =\n      track.segmentCodec === 'mp3' && this.typeSupported.mpeg;\n    const outputSamples: Array<Mp4Sample> = [];\n    const alignedWithVideo = videoTimeOffset !== undefined;\n\n    let inputSamples: Array<AudioSample> = track.samples;\n    let offset: number = rawMPEG ? 0 : 8;\n    let nextAudioTs: number = this.nextAudioTs || -1;\n\n    // window.audioSamples ? window.audioSamples.push(inputSamples.map(s => s.pts)) : (window.audioSamples = [inputSamples.map(s => s.pts)]);\n\n    // for audio samples, also consider consecutive fragments as being contiguous (even if a level switch occurs),\n    // for sake of clarity:\n    // consecutive fragments are frags with\n    //  - less than 100ms gaps between new time offset (if accurate) and next expected PTS OR\n    //  - less than 20 audio frames distance\n    // contiguous fragments are consecutive fragments from same quality level (same level, new SN = old SN + 1)\n    // this helps ensuring audio continuity\n    // and this also avoids audio glitches/cut when switching quality, or reporting wrong duration on first audio frame\n    const initTime = (initPTS.baseTime * inputTimeScale) / initPTS.timescale;\n    const timeOffsetMpegTS = initTime + timeOffset * inputTimeScale;\n    this.isAudioContiguous = contiguous =\n      contiguous ||\n      ((inputSamples.length &&\n        nextAudioTs > 0 &&\n        ((accurateTimeOffset &&\n          Math.abs(timeOffsetMpegTS - (nextAudioTs + initTime)) < 9000) ||\n          Math.abs(\n            normalizePts(inputSamples[0].pts, timeOffsetMpegTS) -\n              (nextAudioTs + initTime),\n          ) <\n            20 * inputSampleDuration)) as boolean);\n\n    // compute normalized PTS\n    inputSamples.forEach(function (sample) {\n      sample.pts = normalizePts(sample.pts, timeOffsetMpegTS);\n    });\n\n    if (!contiguous || nextAudioTs < 0) {\n      const sampleCount = inputSamples.length;\n      // filter out sample with negative PTS that are not playable anyway\n      // if we don't remove these negative samples, they will shift all audio samples forward.\n      // leading to audio overlap between current / next fragment\n      inputSamples = inputSamples.filter((sample) => sample.pts >= 0);\n\n      if (sampleCount !== inputSamples.length) {\n        this.warn(\n          `Removed ${inputSamples.length - sampleCount} of ${sampleCount} samples (initPTS ${initTime} / ${inputTimeScale})`,\n        );\n      }\n\n      // in case all samples have negative PTS, and have been filtered out, return now\n      if (!inputSamples.length) {\n        return;\n      }\n\n      if (videoTimeOffset === 0) {\n        // Set the start to match video so that start gaps larger than inputSampleDuration are filled with silence\n        nextAudioTs = 0;\n      } else if (accurateTimeOffset && !alignedWithVideo) {\n        // When not seeking, not live, and LevelDetails.PTSKnown, use fragment start as predicted next audio PTS\n        nextAudioTs = Math.max(0, timeOffsetMpegTS - initTime);\n      } else {\n        // if frags are not contiguous and if we cant trust time offset, let's use first sample PTS as next audio PTS\n        nextAudioTs = inputSamples[0].pts - initTime;\n      }\n    }\n\n    // If the audio track is missing samples, the frames seem to get \"left-shifted\" within the\n    // resulting mp4 segment, causing sync issues and leaving gaps at the end of the audio segment.\n    // In an effort to prevent this from happening, we inject frames here where there are gaps.\n    // When possible, we inject a silent frame; when that's not possible, we duplicate the last\n    // frame.\n\n    if (track.segmentCodec === 'aac') {\n      const maxAudioFramesDrift = this.config.maxAudioFramesDrift;\n      for (\n        let i = 0, nextPts = nextAudioTs + initTime;\n        i < inputSamples.length;\n        i++\n      ) {\n        // First, let's see how far off this frame is from where we expect it to be\n        const sample = inputSamples[i];\n        const pts = sample.pts;\n        const delta = pts - nextPts;\n        const duration = Math.abs((1000 * delta) / inputTimeScale);\n\n        // When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync\n        if (\n          delta <= -maxAudioFramesDrift * inputSampleDuration &&\n          alignedWithVideo\n        ) {\n          if (i === 0) {\n            this.warn(\n              `Audio frame @ ${(pts / inputTimeScale).toFixed(\n                3,\n              )}s overlaps marker by ${Math.round(\n                (1000 * delta) / inputTimeScale,\n              )} ms.`,\n            );\n            this.nextAudioTs = nextAudioTs = pts - initTime;\n            nextPts = pts;\n          }\n        } // eslint-disable-line brace-style\n\n        // Insert missing frames if:\n        // 1: We're more than maxAudioFramesDrift frame away\n        // 2: Not more than MAX_SILENT_FRAME_DURATION away\n        // 3: currentTime (aka nextPtsNorm) is not 0\n        // 4: remuxing with video (videoTimeOffset !== undefined)\n        else if (\n          delta >= maxAudioFramesDrift * inputSampleDuration &&\n          duration < MAX_SILENT_FRAME_DURATION &&\n          alignedWithVideo\n        ) {\n          let missing = Math.round(delta / inputSampleDuration);\n          // Adjust nextPts so that silent samples are aligned with media pts. This will prevent media samples from\n          // later being shifted if nextPts is based on timeOffset and delta is not a multiple of inputSampleDuration.\n          nextPts = pts - missing * inputSampleDuration;\n          while (nextPts < 0 && missing && inputSampleDuration) {\n            missing--;\n            nextPts += inputSampleDuration;\n          }\n          if (i === 0) {\n            this.nextAudioTs = nextAudioTs = nextPts - initTime;\n          }\n          this.warn(\n            `Injecting ${missing} audio frames @ ${(\n              (nextPts - initTime) /\n              inputTimeScale\n            ).toFixed(3)}s due to ${Math.round(\n              (1000 * delta) / inputTimeScale,\n            )} ms gap.`,\n          );\n          for (let j = 0; j < missing; j++) {\n            let fillFrame = AAC.getSilentFrame(\n              track.parsedCodec || track.manifestCodec || track.codec,\n              track.channelCount,\n            );\n            if (!fillFrame) {\n              this.log(\n                'Unable to get silent frame for given audio codec; duplicating last frame instead.',\n              );\n              fillFrame = sample.unit.subarray();\n            }\n            inputSamples.splice(i, 0, {\n              unit: fillFrame,\n              pts: nextPts,\n            });\n            nextPts += inputSampleDuration;\n            i++;\n          }\n        }\n        sample.pts = nextPts;\n        nextPts += inputSampleDuration;\n      }\n    }\n    let firstPTS: number | null = null;\n    let lastPTS: number | null = null;\n    let mdat: any;\n    let mdatSize: number = 0;\n    let sampleLength: number = inputSamples.length;\n    while (sampleLength--) {\n      mdatSize += inputSamples[sampleLength].unit.byteLength;\n    }\n    for (let j = 0, nbSamples = inputSamples.length; j < nbSamples; j++) {\n      const audioSample = inputSamples[j];\n      const unit = audioSample.unit;\n      let pts = audioSample.pts;\n      if (lastPTS !== null) {\n        // If we have more than one sample, set the duration of the sample to the \"real\" duration; the PTS diff with\n        // the previous sample\n        const prevSample = outputSamples[j - 1];\n        prevSample.duration = Math.round((pts - lastPTS) / scaleFactor);\n      } else {\n        if (contiguous && track.segmentCodec === 'aac') {\n          // set PTS/DTS to expected PTS/DTS\n          pts = nextAudioTs + initTime;\n        }\n        // remember first PTS of our audioSamples\n        firstPTS = pts;\n        if (mdatSize > 0) {\n          /* concatenate the audio data and construct the mdat in place\n            (need 8 more bytes to fill length and mdat type) */\n          mdatSize += offset;\n          try {\n            mdat = new Uint8Array(mdatSize);\n          } catch (err) {\n            this.observer.emit(Events.ERROR, Events.ERROR, {\n              type: ErrorTypes.MUX_ERROR,\n              details: ErrorDetails.REMUX_ALLOC_ERROR,\n              fatal: false,\n              error: err,\n              bytes: mdatSize,\n              reason: `fail allocating audio mdat ${mdatSize}`,\n            });\n            return;\n          }\n          if (!rawMPEG) {\n            const view = new DataView(mdat.buffer);\n            view.setUint32(0, mdatSize);\n            mdat.set(MP4.types.mdat, 4);\n          }\n        } else {\n          // no audio samples\n          return;\n        }\n      }\n      mdat.set(unit, offset);\n      const unitLen = unit.byteLength;\n      offset += unitLen;\n      // Default the sample's duration to the computed mp4SampleDuration, which will either be 1024 for AAC or 1152 for MPEG\n      // In the case that we have 1 sample, this will be the duration. If we have more than one sample, the duration\n      // becomes the PTS diff with the previous sample\n      outputSamples.push(createMp4Sample(true, mp4SampleDuration, unitLen, 0));\n      lastPTS = pts;\n    }\n\n    // We could end up with no audio samples if all input samples were overlapping with the previously remuxed ones\n    const nbSamples = outputSamples.length;\n    if (!nbSamples) {\n      return;\n    }\n\n    // The next audio sample PTS should be equal to last sample PTS + duration\n    const lastSample = outputSamples[outputSamples.length - 1];\n    nextAudioTs = (lastPTS as number) - initTime;\n    this.nextAudioTs = nextAudioTs + scaleFactor * lastSample.duration;\n\n    // Set the track samples from inputSamples to outputSamples before remuxing\n    const moof = rawMPEG\n      ? new Uint8Array(0)\n      : MP4.moof(\n          track.sequenceNumber++,\n          firstPTS! / scaleFactor,\n          Object.assign({}, track, { samples: outputSamples }),\n        );\n\n    // Clear the track samples. This also clears the samples array in the demuxer, since the reference is shared\n    track.samples = [];\n    const start = (firstPTS! - initTime) / inputTimeScale;\n    const end = this.nextAudioTs / inputTimeScale;\n    const type: SourceBufferName = 'audio';\n    const audioData = {\n      data1: moof,\n      data2: mdat,\n      startPTS: start,\n      endPTS: end,\n      startDTS: start,\n      endDTS: end,\n      type,\n      hasAudio: true,\n      hasVideo: false,\n      nb: nbSamples,\n    };\n\n    this.isAudioContiguous = true;\n    return audioData;\n  }\n}\n\nexport function normalizePts(value: number, reference: number | null): number {\n  let offset;\n  if (reference === null) {\n    return value;\n  }\n\n  if (reference < value) {\n    // - 2^33\n    offset = -8589934592;\n  } else {\n    // + 2^33\n    offset = 8589934592;\n  }\n  /* PTS is 33bit (from 0 to 2^33 -1)\n    if diff between value and reference is bigger than half of the amplitude (2^32) then it means that\n    PTS looping occured. fill the gap */\n  while (Math.abs(value - reference) > 4294967296) {\n    value += offset;\n  }\n\n  return value;\n}\n\nfunction findKeyframeIndex(samples: Array<VideoSample>): number {\n  for (let i = 0; i < samples.length; i++) {\n    if (samples[i].key) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nexport function flushTextTrackMetadataCueSamples(\n  track: DemuxedMetadataTrack,\n  timeOffset: number,\n  initPTS: TimestampOffset,\n  initDTS: TimestampOffset,\n): RemuxedMetadata | undefined {\n  const length = track.samples.length;\n  if (!length) {\n    return;\n  }\n  const inputTimeScale = track.inputTimeScale;\n  for (let index = 0; index < length; index++) {\n    const sample = track.samples[index];\n    // setting id3 pts, dts to relative time\n    // using this._initPTS and this._initDTS to calculate relative time\n    sample.pts =\n      normalizePts(\n        sample.pts - (initPTS.baseTime * inputTimeScale) / initPTS.timescale,\n        timeOffset * inputTimeScale,\n      ) / inputTimeScale;\n    sample.dts =\n      normalizePts(\n        sample.dts - (initDTS.baseTime * inputTimeScale) / initDTS.timescale,\n        timeOffset * inputTimeScale,\n      ) / inputTimeScale;\n  }\n  const samples = track.samples;\n  track.samples = [];\n  return {\n    samples,\n  };\n}\n\nexport function flushTextTrackUserdataCueSamples(\n  track: DemuxedUserdataTrack,\n  timeOffset: number,\n  initPTS: RationalTimestamp,\n): RemuxedUserdata | undefined {\n  const length = track.samples.length;\n  if (!length) {\n    return;\n  }\n\n  const inputTimeScale = track.inputTimeScale;\n  for (let index = 0; index < length; index++) {\n    const sample = track.samples[index];\n    // setting text pts, dts to relative time\n    // using this._initPTS and this._initDTS to calculate relative time\n    sample.pts =\n      normalizePts(\n        sample.pts - (initPTS.baseTime * inputTimeScale) / initPTS.timescale,\n        timeOffset * inputTimeScale,\n      ) / inputTimeScale;\n  }\n  track.samples.sort((a, b) => a.pts - b.pts);\n  const samples = track.samples;\n  track.samples = [];\n  return {\n    samples,\n  };\n}\n", "import {\n  flushTextTrackMetadataCueSamples,\n  flushTextTrackUserdataCueSamples,\n} from './mp4-remuxer';\nimport { ElementaryStreamTypes } from '../loader/fragment';\nimport { getCodecCompatibleName } from '../utils/codecs';\nimport { type ILogger, Logger } from '../utils/logger';\nimport { patchEncyptionData } from '../utils/mp4-tools';\nimport { getSampleData, parseInitSegment } from '../utils/mp4-tools';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport type { DecryptData } from '../loader/level-key';\nimport type {\n  DemuxedAudioTrack,\n  DemuxedMetadataTrack,\n  DemuxedUserdataTrack,\n  PassthroughTrack,\n} from '../types/demuxer';\nimport type {\n  InitSegmentData,\n  RemuxedTrack,\n  Remuxer,\n  RemuxerResult,\n} from '../types/remuxer';\nimport type { TrackSet } from '../types/track';\nimport type { TypeSupported } from '../utils/codecs';\nimport type { InitData, InitDataTrack, TrackTimes } from '../utils/mp4-tools';\nimport type { TimestampOffset } from '../utils/timescale-conversion';\n\nclass PassThroughRemuxer extends Logger implements Remuxer {\n  private emitInitSegment: boolean = false;\n  private audioCodec?: string;\n  private videoCodec?: string;\n  private initData?: InitData;\n  private initPTS: TimestampOffset | null = null;\n  private initTracks?: TrackSet;\n  private lastEndTime: number | null = null;\n  private isVideoContiguous: boolean = false;\n\n  constructor(\n    observer: HlsEventEmitter,\n    config: HlsConfig,\n    typeSupported: TypeSupported,\n    logger: ILogger,\n  ) {\n    super('passthrough-remuxer', logger);\n  }\n\n  public destroy() {}\n\n  public resetTimeStamp(defaultInitPTS: TimestampOffset | null) {\n    this.lastEndTime = null;\n    const initPTS = this.initPTS;\n    if (initPTS && defaultInitPTS) {\n      if (\n        initPTS.baseTime === defaultInitPTS.baseTime &&\n        initPTS.timescale === defaultInitPTS.timescale\n      ) {\n        return;\n      }\n    }\n    this.initPTS = defaultInitPTS;\n  }\n\n  public resetNextTimestamp() {\n    this.isVideoContiguous = false;\n    this.lastEndTime = null;\n  }\n\n  public resetInitSegment(\n    initSegment: Uint8Array<ArrayBuffer> | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    decryptdata: DecryptData | null,\n  ) {\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n    this.generateInitSegment(initSegment, decryptdata);\n    this.emitInitSegment = true;\n  }\n\n  private generateInitSegment(\n    initSegment: Uint8Array<ArrayBuffer> | undefined,\n    decryptdata?: DecryptData | null,\n  ) {\n    let { audioCodec, videoCodec } = this;\n    if (!initSegment?.byteLength) {\n      this.initTracks = undefined;\n      this.initData = undefined;\n      return;\n    }\n    const { audio, video } = (this.initData = parseInitSegment(initSegment));\n\n    if (decryptdata) {\n      patchEncyptionData(initSegment, decryptdata);\n    } else {\n      const eitherTrack = audio || video;\n      if (eitherTrack?.encrypted) {\n        this.warn(\n          `Init segment with encrypted track with has no key (\"${eitherTrack.codec}\")!`,\n        );\n      }\n    }\n\n    // Get codec from initSegment\n    if (audio) {\n      audioCodec = getParsedTrackCodec(\n        audio,\n        ElementaryStreamTypes.AUDIO,\n        this,\n      );\n    }\n\n    if (video) {\n      videoCodec = getParsedTrackCodec(\n        video,\n        ElementaryStreamTypes.VIDEO,\n        this,\n      );\n    }\n\n    const tracks: TrackSet = {};\n    if (audio && video) {\n      tracks.audiovideo = {\n        container: 'video/mp4',\n        codec: audioCodec + ',' + videoCodec,\n        supplemental: video.supplemental,\n        encrypted: video.encrypted,\n        initSegment,\n        id: 'main',\n      };\n    } else if (audio) {\n      tracks.audio = {\n        container: 'audio/mp4',\n        codec: audioCodec,\n        encrypted: audio.encrypted,\n        initSegment,\n        id: 'audio',\n      };\n    } else if (video) {\n      tracks.video = {\n        container: 'video/mp4',\n        codec: videoCodec,\n        supplemental: video.supplemental,\n        encrypted: video.encrypted,\n        initSegment,\n        id: 'main',\n      };\n    } else {\n      this.warn('initSegment does not contain moov or trak boxes.');\n    }\n    this.initTracks = tracks;\n  }\n\n  public remux(\n    audioTrack: DemuxedAudioTrack,\n    videoTrack: PassthroughTrack,\n    id3Track: DemuxedMetadataTrack,\n    textTrack: DemuxedUserdataTrack,\n    timeOffset: number,\n    accurateTimeOffset: boolean,\n  ): RemuxerResult {\n    let { initPTS, lastEndTime } = this;\n    const result: RemuxerResult = {\n      audio: undefined,\n      video: undefined,\n      text: textTrack,\n      id3: id3Track,\n      initSegment: undefined,\n    };\n\n    // If we haven't yet set a lastEndDTS, or it was reset, set it to the provided timeOffset. We want to use the\n    // lastEndDTS over timeOffset whenever possible; during progressive playback, the media source will not update\n    // the media duration (which is what timeOffset is provided as) before we need to process the next chunk.\n    if (!Number.isFinite(lastEndTime!)) {\n      lastEndTime = this.lastEndTime = timeOffset || 0;\n    }\n\n    // The binary segment data is added to the videoTrack in the mp4demuxer. We don't check to see if the data is only\n    // audio or video (or both); adding it to video was an arbitrary choice.\n    const data = videoTrack.samples;\n    if (!data.length) {\n      return result;\n    }\n\n    const initSegment: InitSegmentData = {\n      initPTS: undefined,\n      timescale: undefined,\n      trackId: undefined,\n    };\n    let initData = this.initData;\n    if (!initData?.length) {\n      this.generateInitSegment(data);\n      initData = this.initData;\n    }\n    if (!initData?.length) {\n      // We can't remux if the initSegment could not be generated\n      this.warn('Failed to generate initSegment.');\n      return result;\n    }\n    if (this.emitInitSegment) {\n      initSegment.tracks = this.initTracks;\n      this.emitInitSegment = false;\n    }\n\n    const trackSampleData = getSampleData(data, initData, this);\n    const audioSampleTimestamps = initData.audio\n      ? trackSampleData[initData.audio.id]\n      : null;\n    const videoSampleTimestamps = initData.video\n      ? trackSampleData[initData.video.id]\n      : null;\n\n    const videoStartTime = toStartEndOrDefault(videoSampleTimestamps, Infinity);\n    const audioStartTime = toStartEndOrDefault(audioSampleTimestamps, Infinity);\n    const videoEndTime = toStartEndOrDefault(videoSampleTimestamps, 0, true);\n    const audioEndTime = toStartEndOrDefault(audioSampleTimestamps, 0, true);\n\n    let decodeTime = timeOffset;\n    let duration = 0;\n\n    const syncOnAudio =\n      audioSampleTimestamps &&\n      (!videoSampleTimestamps ||\n        (!initPTS && audioStartTime < videoStartTime) ||\n        (initPTS && initPTS.trackId === initData.audio!.id));\n    const baseOffsetSamples = syncOnAudio\n      ? audioSampleTimestamps\n      : videoSampleTimestamps;\n\n    if (baseOffsetSamples) {\n      const timescale = baseOffsetSamples.timescale;\n      const baseTime = baseOffsetSamples.start - timeOffset * timescale;\n      const trackId = syncOnAudio ? initData.audio!.id : initData.video!.id;\n\n      decodeTime = baseOffsetSamples.start / timescale;\n      duration = syncOnAudio\n        ? audioEndTime - audioStartTime\n        : videoEndTime - videoStartTime;\n\n      if (\n        (accurateTimeOffset || !initPTS) &&\n        (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) ||\n          timescale !== initPTS.timescale)\n      ) {\n        if (initPTS) {\n          this.warn(\n            `Timestamps at playlist time: ${accurateTimeOffset ? '' : '~'}${timeOffset} ${baseTime / timescale} != initPTS: ${initPTS.baseTime / initPTS.timescale} (${initPTS.baseTime}/${initPTS.timescale}) trackId: ${initPTS.trackId}`,\n          );\n        }\n        this.log(\n          `Found initPTS at playlist time: ${timeOffset} offset: ${decodeTime - timeOffset} (${baseTime}/${timescale}) trackId: ${trackId}`,\n        );\n        initPTS = null;\n        initSegment.initPTS = baseTime;\n        initSegment.timescale = timescale;\n        initSegment.trackId = trackId;\n      }\n    } else {\n      this.warn(\n        `No audio or video samples found for initPTS at playlist time: ${timeOffset}`,\n      );\n    }\n    if (!initPTS) {\n      if (\n        !initSegment.timescale ||\n        initSegment.trackId === undefined ||\n        initSegment.initPTS === undefined\n      ) {\n        this.warn('Could not set initPTS');\n        initSegment.initPTS = decodeTime;\n        initSegment.timescale = 1;\n        initSegment.trackId = -1;\n      }\n      this.initPTS = initPTS = {\n        baseTime: initSegment.initPTS,\n        timescale: initSegment.timescale,\n        trackId: initSegment.trackId,\n      };\n    } else {\n      initSegment.initPTS = initPTS.baseTime;\n      initSegment.timescale = initPTS.timescale;\n      initSegment.trackId = initPTS.trackId;\n    }\n\n    const startTime = decodeTime - initPTS.baseTime / initPTS.timescale;\n    const endTime = startTime + duration;\n\n    if (duration > 0) {\n      this.lastEndTime = endTime;\n    } else {\n      this.warn('Duration parsed from mp4 should be greater than zero');\n      this.resetNextTimestamp();\n    }\n\n    const hasAudio = !!initData.audio;\n    const hasVideo = !!initData.video;\n\n    let type: any = '';\n    if (hasAudio) {\n      type += 'audio';\n    }\n\n    if (hasVideo) {\n      type += 'video';\n    }\n\n    const encrypted =\n      (initData.audio ? initData.audio.encrypted : false) ||\n      (initData.video ? initData.video.encrypted : false);\n\n    const track: RemuxedTrack = {\n      data1: data,\n      startPTS: startTime,\n      startDTS: startTime,\n      endPTS: endTime,\n      endDTS: endTime,\n      type,\n      hasAudio,\n      hasVideo,\n      nb: 1,\n      dropped: 0,\n      encrypted,\n    };\n\n    result.audio = hasAudio && !hasVideo ? track : undefined;\n    result.video = hasVideo ? track : undefined;\n    const videoSampleCount = videoSampleTimestamps?.sampleCount;\n    if (videoSampleCount) {\n      const firstKeyFrame = videoSampleTimestamps.keyFrameIndex;\n      const independent = firstKeyFrame !== -1;\n      track.nb = videoSampleCount;\n      track.dropped =\n        firstKeyFrame === 0 || this.isVideoContiguous\n          ? 0\n          : independent\n            ? firstKeyFrame\n            : videoSampleCount;\n      track.independent = independent;\n      track.firstKeyFrame = firstKeyFrame;\n      if (independent && videoSampleTimestamps.keyFrameStart) {\n        track.firstKeyFramePTS =\n          (videoSampleTimestamps.keyFrameStart - initPTS.baseTime) /\n          initPTS.timescale;\n      }\n      if (!this.isVideoContiguous) {\n        result.independent = independent;\n      }\n      this.isVideoContiguous ||= independent;\n      if (track.dropped) {\n        this.warn(\n          `fmp4 does not start with IDR: firstIDR ${firstKeyFrame}/${videoSampleCount} dropped: ${track.dropped} start: ${track.firstKeyFramePTS || 'NA'}`,\n        );\n      }\n    }\n\n    result.initSegment = initSegment;\n    result.id3 = flushTextTrackMetadataCueSamples(\n      id3Track,\n      timeOffset,\n      initPTS,\n      initPTS,\n    );\n\n    if (textTrack.samples.length) {\n      result.text = flushTextTrackUserdataCueSamples(\n        textTrack,\n        timeOffset,\n        initPTS,\n      );\n    }\n\n    return result;\n  }\n}\n\nfunction toStartEndOrDefault(\n  trackTimes: TrackTimes | null,\n  defaultValue: number,\n  end: boolean = false,\n): number {\n  return trackTimes?.start !== undefined\n    ? (trackTimes.start + (end ? trackTimes.duration : 0)) /\n        trackTimes.timescale\n    : defaultValue;\n}\n\nfunction isInvalidInitPts(\n  initPTS: TimestampOffset | null,\n  startDTS: number,\n  timeOffset: number,\n  duration: number,\n): initPTS is null {\n  if (initPTS === null) {\n    return true;\n  }\n  // InitPTS is invalid when distance from program would be more than segment duration or a minimum of one second\n  const minDuration = Math.max(duration, 1);\n  const startTime = startDTS - initPTS.baseTime / initPTS.timescale;\n  return Math.abs(startTime - timeOffset) > minDuration;\n}\n\nfunction getParsedTrackCodec(\n  track: InitDataTrack,\n  type: ElementaryStreamTypes.AUDIO | ElementaryStreamTypes.VIDEO,\n  logger: ILogger,\n): string {\n  const parsedCodec = track.codec;\n  if (parsedCodec && parsedCodec.length > 4) {\n    return parsedCodec;\n  }\n  if (type === ElementaryStreamTypes.AUDIO) {\n    if (\n      parsedCodec === 'ec-3' ||\n      parsedCodec === 'ac-3' ||\n      parsedCodec === 'alac'\n    ) {\n      return parsedCodec;\n    }\n    if (parsedCodec === 'fLaC' || parsedCodec === 'Opus') {\n      // Opting not to get `preferManagedMediaSource` from player config for isSupported() check for simplicity\n      const preferManagedMediaSource = false;\n      return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);\n    }\n\n    logger.warn(`Unhandled audio codec \"${parsedCodec}\" in mp4 MAP`);\n    return parsedCodec || 'mp4a';\n  }\n  // Provide defaults based on codec type\n  // This allows for some playback of some fmp4 playlists without CODECS defined in manifest\n  logger.warn(`Unhandled video codec \"${parsedCodec}\" in mp4 MAP`);\n  return parsedCodec || 'avc1';\n}\nexport default PassThroughRemuxer;\n", "import AACDemuxer from './audio/aacdemuxer';\nimport { AC3Demuxer } from './audio/ac3-demuxer';\nimport MP3Demuxer from './audio/mp3demuxer';\nimport Decrypter from '../crypt/decrypter';\nimport MP4Demuxer from '../demux/mp4demuxer';\nimport TSDemuxer from '../demux/tsdemuxer';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport MP4Remuxer from '../remux/mp4-remuxer';\nimport PassThroughRemuxer from '../remux/passthrough-remuxer';\nimport { PlaylistLevelType } from '../types/loader';\nimport {\n  getAesModeFromFullSegmentMethod,\n  isFullSegmentEncryption,\n} from '../utils/encryption-methods-util';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport type { DecryptData } from '../loader/level-key';\nimport type { Demuxer, DemuxerResult, KeyData } from '../types/demuxer';\nimport type { Remuxer } from '../types/remuxer';\nimport type { ChunkMetadata, TransmuxerResult } from '../types/transmuxer';\nimport type { TypeSupported } from '../utils/codecs';\nimport type { ILogger } from '../utils/logger';\nimport type { TimestampOffset } from '../utils/timescale-conversion';\n\nlet now: () => number;\n// performance.now() not available on WebWorker, at least on Safari Desktop\ntry {\n  now = self.performance.now.bind(self.performance);\n} catch (err) {\n  now = Date.now;\n}\n\ntype MuxConfig =\n  | { demux: typeof MP4Demuxer; remux: typeof PassThroughRemuxer }\n  | { demux: typeof TSDemuxer; remux: typeof MP4Remuxer }\n  | { demux: typeof AC3Demuxer; remux: typeof MP4Remuxer }\n  | { demux: typeof AACDemuxer; remux: typeof MP4Remuxer }\n  | { demux: typeof MP3Demuxer; remux: typeof MP4Remuxer };\n\nconst muxConfig: MuxConfig[] = [\n  { demux: MP4Demuxer, remux: PassThroughRemuxer },\n  { demux: TSDemuxer, remux: MP4Remuxer },\n  { demux: AACDemuxer, remux: MP4Remuxer },\n  { demux: MP3Demuxer, remux: MP4Remuxer },\n];\n\nif (__USE_M2TS_ADVANCED_CODECS__) {\n  muxConfig.splice(2, 0, { demux: AC3Demuxer, remux: MP4Remuxer });\n}\n\nexport default class Transmuxer {\n  private asyncResult: boolean = false;\n  private logger: ILogger;\n  private observer: HlsEventEmitter;\n  private typeSupported: TypeSupported;\n  private config: HlsConfig;\n  private id: PlaylistLevelType;\n  private demuxer?: Demuxer;\n  private remuxer?: Remuxer;\n  private decrypter?: Decrypter;\n  private probe!: Function;\n  private decryptionPromise: Promise<TransmuxerResult> | null = null;\n  private transmuxConfig!: TransmuxConfig;\n  private currentTransmuxState!: TransmuxState;\n\n  constructor(\n    observer: HlsEventEmitter,\n    typeSupported: TypeSupported,\n    config: HlsConfig,\n    vendor: string,\n    id: PlaylistLevelType,\n    logger: ILogger,\n  ) {\n    this.observer = observer;\n    this.typeSupported = typeSupported;\n    this.config = config;\n    this.id = id;\n    this.logger = logger;\n  }\n\n  configure(transmuxConfig: TransmuxConfig) {\n    this.transmuxConfig = transmuxConfig;\n    if (this.decrypter) {\n      this.decrypter.reset();\n    }\n  }\n\n  push(\n    data: ArrayBuffer,\n    decryptdata: DecryptData | null,\n    chunkMeta: ChunkMetadata,\n    state?: TransmuxState,\n  ): TransmuxerResult | Promise<TransmuxerResult> {\n    const stats = chunkMeta.transmuxing;\n    stats.executeStart = now();\n\n    let uintData: Uint8Array<ArrayBuffer> = new Uint8Array(data);\n    const { currentTransmuxState, transmuxConfig } = this;\n    if (state) {\n      this.currentTransmuxState = state;\n    }\n\n    const {\n      contiguous,\n      discontinuity,\n      trackSwitch,\n      accurateTimeOffset,\n      timeOffset,\n      initSegmentChange,\n    } = state || currentTransmuxState;\n    const {\n      audioCodec,\n      videoCodec,\n      defaultInitPts,\n      duration,\n      initSegmentData,\n    } = transmuxConfig;\n\n    const keyData = getEncryptionType(uintData, decryptdata);\n    if (keyData && isFullSegmentEncryption(keyData.method)) {\n      const decrypter = this.getDecrypter();\n      const aesMode = getAesModeFromFullSegmentMethod(keyData.method);\n\n      // Software decryption is synchronous; webCrypto is not\n      if (decrypter.isSync()) {\n        // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached\n        // data is handled in the flush() call\n        let decryptedData = decrypter.softwareDecrypt(\n          uintData,\n          keyData.key.buffer,\n          keyData.iv.buffer,\n          aesMode,\n        );\n        // For Low-Latency HLS Parts, decrypt in place, since part parsing is expected on push progress\n        const loadingParts = chunkMeta.part > -1;\n        if (loadingParts) {\n          const data = decrypter.flush();\n          decryptedData = data ? data.buffer : data;\n        }\n        if (!decryptedData) {\n          stats.executeEnd = now();\n          return emptyResult(chunkMeta);\n        }\n        uintData = new Uint8Array(decryptedData);\n      } else {\n        this.asyncResult = true;\n        this.decryptionPromise = decrypter\n          .webCryptoDecrypt(\n            uintData,\n            keyData.key.buffer,\n            keyData.iv.buffer,\n            aesMode,\n          )\n          .then((decryptedData): TransmuxerResult => {\n            // Calling push here is important; if flush() is called while this is still resolving, this ensures that\n            // the decrypted data has been transmuxed\n            const result = this.push(\n              decryptedData,\n              null,\n              chunkMeta,\n            ) as TransmuxerResult;\n            this.decryptionPromise = null;\n            return result;\n          });\n        return this.decryptionPromise;\n      }\n    }\n\n    const resetMuxers = this.needsProbing(discontinuity, trackSwitch);\n    if (resetMuxers) {\n      const error = this.configureTransmuxer(uintData);\n      if (error) {\n        this.logger.warn(`[transmuxer] ${error.message}`);\n        this.observer.emit(Events.ERROR, Events.ERROR, {\n          type: ErrorTypes.MEDIA_ERROR,\n          details: ErrorDetails.FRAG_PARSING_ERROR,\n          fatal: false,\n          error,\n          reason: error.message,\n        });\n        stats.executeEnd = now();\n        return emptyResult(chunkMeta);\n      }\n    }\n\n    if (discontinuity || trackSwitch || initSegmentChange || resetMuxers) {\n      this.resetInitSegment(\n        initSegmentData,\n        audioCodec,\n        videoCodec,\n        duration,\n        decryptdata,\n      );\n    }\n\n    if (discontinuity || initSegmentChange || resetMuxers) {\n      this.resetInitialTimestamp(defaultInitPts);\n    }\n\n    if (!contiguous) {\n      this.resetContiguity();\n    }\n\n    const result = this.transmux(\n      uintData,\n      keyData,\n      timeOffset,\n      accurateTimeOffset,\n      chunkMeta,\n    );\n    this.asyncResult = isPromise(result);\n\n    const currentState = this.currentTransmuxState;\n\n    currentState.contiguous = true;\n    currentState.discontinuity = false;\n    currentState.trackSwitch = false;\n\n    stats.executeEnd = now();\n    return result;\n  }\n\n  // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type)\n  flush(\n    chunkMeta: ChunkMetadata,\n  ): TransmuxerResult[] | Promise<TransmuxerResult[]> {\n    const stats = chunkMeta.transmuxing;\n    stats.executeStart = now();\n\n    const { decrypter, currentTransmuxState, decryptionPromise } = this;\n\n    if (decryptionPromise) {\n      this.asyncResult = true;\n      // Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore\n      // only flushing is required for async decryption\n      return decryptionPromise.then(() => {\n        return this.flush(chunkMeta);\n      });\n    }\n\n    const transmuxResults: TransmuxerResult[] = [];\n    const { timeOffset } = currentTransmuxState;\n    if (decrypter) {\n      // The decrypter may have data cached, which needs to be demuxed. In this case we'll have two TransmuxResults\n      // This happens in the case that we receive only 1 push call for a segment (either for non-progressive downloads,\n      // or for progressive downloads with small segments)\n      const decryptedData = decrypter.flush();\n      if (decryptedData) {\n        // Push always returns a TransmuxerResult if decryptdata is null\n        transmuxResults.push(\n          this.push(decryptedData.buffer, null, chunkMeta) as TransmuxerResult,\n        );\n      }\n    }\n\n    const { demuxer, remuxer } = this;\n    if (!demuxer || !remuxer) {\n      // If probing failed, then Hls.js has been given content its not able to handle\n      stats.executeEnd = now();\n      const emptyResults = [emptyResult(chunkMeta)];\n      if (this.asyncResult) {\n        return Promise.resolve(emptyResults);\n      }\n      return emptyResults;\n    }\n\n    const demuxResultOrPromise = demuxer.flush(timeOffset);\n    if (isPromise(demuxResultOrPromise)) {\n      this.asyncResult = true;\n      // Decrypt final SAMPLE-AES samples\n      return demuxResultOrPromise.then((demuxResult) => {\n        this.flushRemux(transmuxResults, demuxResult, chunkMeta);\n        return transmuxResults;\n      });\n    }\n\n    this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);\n    if (this.asyncResult) {\n      return Promise.resolve(transmuxResults);\n    }\n    return transmuxResults;\n  }\n\n  private flushRemux(\n    transmuxResults: TransmuxerResult[],\n    demuxResult: DemuxerResult,\n    chunkMeta: ChunkMetadata,\n  ) {\n    const { audioTrack, videoTrack, id3Track, textTrack } = demuxResult;\n    const { accurateTimeOffset, timeOffset } = this.currentTransmuxState;\n    this.logger.log(\n      `[transmuxer.ts]: Flushed ${this.id} sn: ${chunkMeta.sn}${\n        chunkMeta.part > -1 ? ' part: ' + chunkMeta.part : ''\n      } of ${this.id === PlaylistLevelType.MAIN ? 'level' : 'track'} ${chunkMeta.level}`,\n    );\n    const remuxResult = this.remuxer!.remux(\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack,\n      timeOffset,\n      accurateTimeOffset,\n      true,\n      this.id,\n    );\n    transmuxResults.push({\n      remuxResult,\n      chunkMeta,\n    });\n\n    chunkMeta.transmuxing.executeEnd = now();\n  }\n\n  resetInitialTimestamp(defaultInitPts: TimestampOffset | null) {\n    const { demuxer, remuxer } = this;\n    if (!demuxer || !remuxer) {\n      return;\n    }\n    demuxer.resetTimeStamp(defaultInitPts);\n    remuxer.resetTimeStamp(defaultInitPts);\n  }\n\n  resetContiguity() {\n    const { demuxer, remuxer } = this;\n    if (!demuxer || !remuxer) {\n      return;\n    }\n    demuxer.resetContiguity();\n    remuxer.resetNextTimestamp();\n  }\n\n  resetInitSegment(\n    initSegmentData: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    trackDuration: number,\n    decryptdata: DecryptData | null,\n  ) {\n    const { demuxer, remuxer } = this;\n    if (!demuxer || !remuxer) {\n      return;\n    }\n    demuxer.resetInitSegment(\n      initSegmentData,\n      audioCodec,\n      videoCodec,\n      trackDuration,\n    );\n    remuxer.resetInitSegment(\n      initSegmentData,\n      audioCodec,\n      videoCodec,\n      decryptdata,\n    );\n  }\n\n  destroy(): void {\n    if (this.demuxer) {\n      this.demuxer.destroy();\n      this.demuxer = undefined;\n    }\n    if (this.remuxer) {\n      this.remuxer.destroy();\n      this.remuxer = undefined;\n    }\n  }\n\n  private transmux(\n    data: Uint8Array,\n    keyData: KeyData | null,\n    timeOffset: number,\n    accurateTimeOffset: boolean,\n    chunkMeta: ChunkMetadata,\n  ): TransmuxerResult | Promise<TransmuxerResult> {\n    let result: TransmuxerResult | Promise<TransmuxerResult>;\n    if (keyData && keyData.method === 'SAMPLE-AES') {\n      result = this.transmuxSampleAes(\n        data,\n        keyData,\n        timeOffset,\n        accurateTimeOffset,\n        chunkMeta,\n      );\n    } else {\n      result = this.transmuxUnencrypted(\n        data,\n        timeOffset,\n        accurateTimeOffset,\n        chunkMeta,\n      );\n    }\n    return result;\n  }\n\n  private transmuxUnencrypted(\n    data: Uint8Array,\n    timeOffset: number,\n    accurateTimeOffset: boolean,\n    chunkMeta: ChunkMetadata,\n  ): TransmuxerResult {\n    const { audioTrack, videoTrack, id3Track, textTrack } = (\n      this.demuxer as Demuxer\n    ).demux(data, timeOffset, false, !this.config.progressive);\n    const remuxResult = this.remuxer!.remux(\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack,\n      timeOffset,\n      accurateTimeOffset,\n      false,\n      this.id,\n    );\n    return {\n      remuxResult,\n      chunkMeta,\n    };\n  }\n\n  private transmuxSampleAes(\n    data: Uint8Array,\n    decryptData: KeyData,\n    timeOffset: number,\n    accurateTimeOffset: boolean,\n    chunkMeta: ChunkMetadata,\n  ): Promise<TransmuxerResult> {\n    return (this.demuxer as Demuxer)\n      .demuxSampleAes(data, decryptData, timeOffset)\n      .then((demuxResult) => {\n        const remuxResult = this.remuxer!.remux(\n          demuxResult.audioTrack,\n          demuxResult.videoTrack,\n          demuxResult.id3Track,\n          demuxResult.textTrack,\n          timeOffset,\n          accurateTimeOffset,\n          false,\n          this.id,\n        );\n        return {\n          remuxResult,\n          chunkMeta,\n        };\n      });\n  }\n\n  private configureTransmuxer(data: Uint8Array): void | Error {\n    const { config, observer, typeSupported } = this;\n    // probe for content type\n    let mux;\n    for (let i = 0, len = muxConfig.length; i < len; i++) {\n      if (muxConfig[i].demux?.probe(data, this.logger)) {\n        mux = muxConfig[i];\n        break;\n      }\n    }\n    if (!mux) {\n      return new Error('Failed to find demuxer by probing fragment data');\n    }\n    // so let's check that current remuxer and demuxer are still valid\n    const demuxer = this.demuxer;\n    const remuxer = this.remuxer;\n    const Remuxer: MuxConfig['remux'] = mux.remux;\n    const Demuxer: MuxConfig['demux'] = mux.demux;\n    if (!remuxer || !(remuxer instanceof Remuxer)) {\n      this.remuxer = new Remuxer(observer, config, typeSupported, this.logger);\n    }\n    if (!demuxer || !(demuxer instanceof Demuxer)) {\n      this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);\n      this.probe = Demuxer.probe;\n    }\n  }\n\n  private needsProbing(discontinuity: boolean, trackSwitch: boolean): boolean {\n    // in case of continuity change, or track switch\n    // we might switch from content type (AAC container to TS container, or TS to fmp4 for example)\n    return !this.demuxer || !this.remuxer || discontinuity || trackSwitch;\n  }\n\n  private getDecrypter(): Decrypter {\n    let decrypter = this.decrypter;\n    if (!decrypter) {\n      decrypter = this.decrypter = new Decrypter(this.config);\n    }\n    return decrypter;\n  }\n}\n\nfunction getEncryptionType(\n  data: Uint8Array,\n  decryptData: DecryptData | null,\n): KeyData | null {\n  let encryptionType: KeyData | null = null;\n  if (\n    data.byteLength > 0 &&\n    decryptData?.key != null &&\n    decryptData.iv !== null &&\n    decryptData.method != null\n  ) {\n    encryptionType = decryptData as KeyData;\n  }\n  return encryptionType;\n}\n\nconst emptyResult = (chunkMeta): TransmuxerResult => ({\n  remuxResult: {},\n  chunkMeta,\n});\n\nexport function isPromise<T>(p: Promise<T> | any): p is Promise<T> {\n  return 'then' in p && p.then instanceof Function;\n}\n\nexport class TransmuxConfig {\n  public audioCodec?: string;\n  public videoCodec?: string;\n  public initSegmentData?: Uint8Array;\n  public duration: number;\n  public defaultInitPts: TimestampOffset | null;\n\n  constructor(\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    initSegmentData: Uint8Array | undefined,\n    duration: number,\n    defaultInitPts?: TimestampOffset,\n  ) {\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n    this.initSegmentData = initSegmentData;\n    this.duration = duration;\n    this.defaultInitPts = defaultInitPts || null;\n  }\n}\n\nexport class TransmuxState {\n  public discontinuity: boolean;\n  public contiguous: boolean;\n  public accurateTimeOffset: boolean;\n  public trackSwitch: boolean;\n  public timeOffset: number;\n  public initSegmentChange: boolean;\n\n  constructor(\n    discontinuity: boolean,\n    contiguous: boolean,\n    accurateTimeOffset: boolean,\n    trackSwitch: boolean,\n    timeOffset: number,\n    initSegmentChange: boolean,\n  ) {\n    this.discontinuity = discontinuity;\n    this.contiguous = contiguous;\n    this.accurateTimeOffset = accurateTimeOffset;\n    this.trackSwitch = trackSwitch;\n    this.timeOffset = timeOffset;\n    this.initSegmentChange = initSegmentChange;\n  }\n}\n", "import { EventEmitter } from 'eventemitter3';\nimport {\n  hasUMDWorker,\n  injectWorker,\n  loadWorker,\n  removeWorkerFromStore as removeWorkerClient,\n} from './inject-worker';\nimport Transmuxer, {\n  isPromise,\n  TransmuxConfig,\n  TransmuxState,\n} from '../demux/transmuxer';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { PlaylistLevelType } from '../types/loader';\nimport { getM2TSSupportedAudioTypes } from '../utils/codecs';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type { WorkerContext } from './inject-worker';\nimport type { HlsEventEmitter, HlsListeners } from '../events';\nimport type Hls from '../hls';\nimport type { MediaFragment, Part } from '../loader/fragment';\nimport type { ErrorData, FragDecryptedData } from '../types/events';\nimport type { ChunkMetadata, TransmuxerResult } from '../types/transmuxer';\nimport type { TimestampOffset } from '../utils/timescale-conversion';\n\nlet transmuxerInstanceCount: number = 0;\n\nexport default class TransmuxerInterface {\n  public error: Error | null = null;\n  private hls: Hls;\n  private id: PlaylistLevelType;\n  private instanceNo: number = transmuxerInstanceCount++;\n  private observer: HlsEventEmitter;\n  private frag: MediaFragment | null = null;\n  private part: Part | null = null;\n  private useWorker: boolean;\n  private workerContext: WorkerContext | null = null;\n  private transmuxer: Transmuxer | null = null;\n  private onTransmuxComplete: (transmuxResult: TransmuxerResult) => void;\n  private onFlush: (chunkMeta: ChunkMetadata) => void;\n\n  constructor(\n    hls: Hls,\n    id: PlaylistLevelType,\n    onTransmuxComplete: (transmuxResult: TransmuxerResult) => void,\n    onFlush: (chunkMeta: ChunkMetadata) => void,\n  ) {\n    const config = hls.config;\n    this.hls = hls;\n    this.id = id;\n    this.useWorker = !!config.enableWorker;\n    this.onTransmuxComplete = onTransmuxComplete;\n    this.onFlush = onFlush;\n\n    const forwardMessage = (\n      ev: Events.ERROR | Events.FRAG_DECRYPTED,\n      data: ErrorData | FragDecryptedData,\n    ) => {\n      data = data || {};\n      data.frag = this.frag || undefined;\n      if (ev === Events.ERROR) {\n        data = data as ErrorData;\n        data.parent = this.id;\n        data.part = this.part;\n        this.error = data.error;\n      }\n      this.hls.trigger(ev, data);\n    };\n\n    // forward events to main thread\n    this.observer = new EventEmitter() as HlsEventEmitter;\n    this.observer.on(Events.FRAG_DECRYPTED, forwardMessage);\n    this.observer.on(Events.ERROR, forwardMessage);\n\n    const m2tsTypeSupported = getM2TSSupportedAudioTypes(\n      config.preferManagedMediaSource,\n    );\n\n    if (this.useWorker && typeof Worker !== 'undefined') {\n      const logger = this.hls.logger;\n      const canCreateWorker = config.workerPath || hasUMDWorker();\n      if (canCreateWorker) {\n        try {\n          if (config.workerPath) {\n            logger.log(`loading Web Worker ${config.workerPath} for \"${id}\"`);\n            this.workerContext = loadWorker(config.workerPath);\n          } else {\n            logger.log(`injecting Web Worker for \"${id}\"`);\n            this.workerContext = injectWorker();\n          }\n          const { worker } = this.workerContext;\n          worker.addEventListener('message', this.onWorkerMessage);\n          worker.addEventListener('error', this.onWorkerError);\n          worker.postMessage({\n            instanceNo: this.instanceNo,\n            cmd: 'init',\n            typeSupported: m2tsTypeSupported,\n            id,\n            config: stringify(config),\n          });\n        } catch (err) {\n          logger.warn(\n            `Error setting up \"${id}\" Web Worker, fallback to inline`,\n            err,\n          );\n          this.terminateWorker();\n          this.error = null;\n          this.transmuxer = new Transmuxer(\n            this.observer,\n            m2tsTypeSupported,\n            config,\n            '',\n            id,\n            hls.logger,\n          );\n        }\n        return;\n      }\n    }\n\n    this.transmuxer = new Transmuxer(\n      this.observer,\n      m2tsTypeSupported,\n      config,\n      '',\n      id,\n      hls.logger,\n    );\n  }\n\n  reset() {\n    this.frag = null;\n    this.part = null;\n    if (this.workerContext) {\n      const instanceNo = this.instanceNo;\n      this.instanceNo = transmuxerInstanceCount++;\n      const config = this.hls.config;\n      const m2tsTypeSupported = getM2TSSupportedAudioTypes(\n        config.preferManagedMediaSource,\n      );\n      this.workerContext.worker.postMessage({\n        instanceNo: this.instanceNo,\n        cmd: 'reset',\n        resetNo: instanceNo,\n        typeSupported: m2tsTypeSupported,\n        id: this.id,\n        config: stringify(config),\n      });\n    }\n  }\n\n  private terminateWorker() {\n    if (this.workerContext) {\n      const { worker } = this.workerContext;\n      this.workerContext = null;\n      worker.removeEventListener('message', this.onWorkerMessage);\n      worker.removeEventListener('error', this.onWorkerError);\n      removeWorkerClient(this.hls.config.workerPath);\n    }\n  }\n\n  destroy() {\n    if (this.workerContext) {\n      this.terminateWorker();\n      // @ts-ignore\n      this.onWorkerMessage = this.onWorkerError = null;\n    } else {\n      const transmuxer = this.transmuxer;\n      if (transmuxer) {\n        transmuxer.destroy();\n        this.transmuxer = null;\n      }\n    }\n    const observer = this.observer;\n    if (observer) {\n      observer.removeAllListeners();\n    }\n    this.frag = null;\n    this.part = null;\n    // @ts-ignore\n    this.observer = null;\n    // @ts-ignore\n    this.hls = null;\n  }\n\n  push(\n    data: ArrayBuffer,\n    initSegmentData: Uint8Array | undefined,\n    audioCodec: string | undefined,\n    videoCodec: string | undefined,\n    frag: MediaFragment,\n    part: Part | null,\n    duration: number,\n    accurateTimeOffset: boolean,\n    chunkMeta: ChunkMetadata,\n    defaultInitPTS?: TimestampOffset,\n  ) {\n    chunkMeta.transmuxing.start = self.performance.now();\n    const { instanceNo, transmuxer } = this;\n    const timeOffset = part ? part.start : frag.start;\n    // TODO: push \"clear-lead\" decrypt data for unencrypted fragments in streams with encrypted ones\n    const decryptdata = frag.decryptdata;\n    const lastFrag = this.frag;\n\n    const discontinuity = !(lastFrag && frag.cc === lastFrag.cc);\n    const trackSwitch = !(lastFrag && chunkMeta.level === lastFrag.level);\n    const snDiff = lastFrag ? chunkMeta.sn - lastFrag.sn : -1;\n    const partDiff = this.part ? chunkMeta.part - this.part.index : -1;\n    const progressive =\n      snDiff === 0 &&\n      chunkMeta.id > 1 &&\n      chunkMeta.id === lastFrag?.stats.chunkCount;\n    const contiguous =\n      !trackSwitch &&\n      (snDiff === 1 ||\n        (snDiff === 0 && (partDiff === 1 || (progressive && partDiff <= 0))));\n    const now = self.performance.now();\n\n    if (trackSwitch || snDiff || frag.stats.parsing.start === 0) {\n      frag.stats.parsing.start = now;\n    }\n    if (part && (partDiff || !contiguous)) {\n      part.stats.parsing.start = now;\n    }\n    const initSegmentChange = !(\n      lastFrag && frag.initSegment?.url === lastFrag.initSegment?.url\n    );\n    const state = new TransmuxState(\n      discontinuity,\n      contiguous,\n      accurateTimeOffset,\n      trackSwitch,\n      timeOffset,\n      initSegmentChange,\n    );\n    if (!contiguous || discontinuity || initSegmentChange) {\n      this.hls.logger\n        .log(`[transmuxer-interface]: Starting new transmux session for ${frag.type} sn: ${chunkMeta.sn}${\n        chunkMeta.part > -1 ? ' part: ' + chunkMeta.part : ''\n      } ${this.id === PlaylistLevelType.MAIN ? 'level' : 'track'}: ${chunkMeta.level} id: ${chunkMeta.id}\n        discontinuity: ${discontinuity}\n        trackSwitch: ${trackSwitch}\n        contiguous: ${contiguous}\n        accurateTimeOffset: ${accurateTimeOffset}\n        timeOffset: ${timeOffset}\n        initSegmentChange: ${initSegmentChange}`);\n      const config = new TransmuxConfig(\n        audioCodec,\n        videoCodec,\n        initSegmentData,\n        duration,\n        defaultInitPTS,\n      );\n      this.configureTransmuxer(config);\n    }\n\n    this.frag = frag;\n    this.part = part;\n\n    // Frags with sn of 'initSegment' are not transmuxed\n    if (this.workerContext) {\n      // post fragment payload as transferable objects for ArrayBuffer (no copy)\n      this.workerContext.worker.postMessage(\n        {\n          instanceNo,\n          cmd: 'demux',\n          data,\n          decryptdata,\n          chunkMeta,\n          state,\n        },\n        data instanceof ArrayBuffer ? [data] : [],\n      );\n    } else if (transmuxer) {\n      const transmuxResult = transmuxer.push(\n        data,\n        decryptdata,\n        chunkMeta,\n        state,\n      );\n      if (isPromise(transmuxResult)) {\n        transmuxResult\n          .then((data) => {\n            this.handleTransmuxComplete(data);\n          })\n          .catch((error) => {\n            this.transmuxerError(\n              error,\n              chunkMeta,\n              'transmuxer-interface push error',\n            );\n          });\n      } else {\n        this.handleTransmuxComplete(transmuxResult as TransmuxerResult);\n      }\n    }\n  }\n\n  flush(chunkMeta: ChunkMetadata) {\n    chunkMeta.transmuxing.start = self.performance.now();\n    const { instanceNo, transmuxer } = this;\n    if (this.workerContext) {\n      1;\n      this.workerContext.worker.postMessage({\n        instanceNo,\n        cmd: 'flush',\n        chunkMeta,\n      });\n    } else if (transmuxer) {\n      const transmuxResult = transmuxer.flush(chunkMeta);\n      if (isPromise(transmuxResult)) {\n        transmuxResult\n          .then((data) => {\n            this.handleFlushResult(data, chunkMeta);\n          })\n          .catch((error) => {\n            this.transmuxerError(\n              error,\n              chunkMeta,\n              'transmuxer-interface flush error',\n            );\n          });\n      } else {\n        this.handleFlushResult(transmuxResult, chunkMeta);\n      }\n    }\n  }\n\n  private transmuxerError(\n    error: Error,\n    chunkMeta: ChunkMetadata,\n    reason: string,\n  ) {\n    if (!this.hls) {\n      return;\n    }\n    this.error = error;\n    this.hls.trigger(Events.ERROR, {\n      type: ErrorTypes.MEDIA_ERROR,\n      details: ErrorDetails.FRAG_PARSING_ERROR,\n      chunkMeta,\n      frag: this.frag || undefined,\n      part: this.part || undefined,\n      fatal: false,\n      error,\n      err: error,\n      reason,\n    });\n  }\n\n  private handleFlushResult(\n    results: Array<TransmuxerResult>,\n    chunkMeta: ChunkMetadata,\n  ) {\n    results.forEach((result) => {\n      this.handleTransmuxComplete(result);\n    });\n    this.onFlush(chunkMeta);\n  }\n\n  private onWorkerMessage = (\n    event: MessageEvent<{\n      event: string;\n      data?: any;\n      instanceNo?: number;\n    } | null>,\n  ) => {\n    const data = event.data;\n    const hls = this.hls;\n    if (!hls || !data?.event || data.instanceNo !== this.instanceNo) {\n      return;\n    }\n    switch (data.event) {\n      case 'init': {\n        const objectURL = this.workerContext?.objectURL;\n        if (objectURL) {\n          // revoke the Object URL that was used to create transmuxer worker, so as not to leak it\n          self.URL.revokeObjectURL(objectURL);\n        }\n        break;\n      }\n\n      case 'transmuxComplete': {\n        this.handleTransmuxComplete(data.data);\n        break;\n      }\n\n      case 'flush': {\n        this.onFlush(data.data);\n        break;\n      }\n\n      // pass logs from the worker thread to the main logger\n      case 'workerLog': {\n        if (hls.logger[data.data.logType]) {\n          hls.logger[data.data.logType](data.data.message);\n        }\n        break;\n      }\n\n      default: {\n        data.data = data.data || {};\n        data.data.frag = this.frag;\n        data.data.part = this.part;\n        data.data.id = this.id;\n        hls.trigger(data.event as keyof HlsListeners, data.data);\n        break;\n      }\n    }\n  };\n\n  private onWorkerError = (event) => {\n    if (!this.hls) {\n      return;\n    }\n    const error = new Error(\n      `${event.message}  (${event.filename}:${event.lineno})`,\n    );\n    this.hls.config.enableWorker = false;\n    this.hls.logger.warn(\n      `Error in \"${this.id}\" Web Worker, fallback to inline`,\n    );\n    this.hls.trigger(Events.ERROR, {\n      type: ErrorTypes.OTHER_ERROR,\n      details: ErrorDetails.INTERNAL_EXCEPTION,\n      fatal: false,\n      event: 'demuxerWorker',\n      error,\n    });\n  };\n\n  private configureTransmuxer(config: TransmuxConfig) {\n    const { instanceNo, transmuxer } = this;\n    if (this.workerContext) {\n      this.workerContext.worker.postMessage({\n        instanceNo,\n        cmd: 'configure',\n        config,\n      });\n    } else if (transmuxer) {\n      transmuxer.configure(config);\n    }\n  }\n\n  private handleTransmuxComplete(result: TransmuxerResult) {\n    result.chunkMeta.transmuxing.end = self.performance.now();\n    this.onTransmuxComplete(result);\n  }\n}\n", "import BaseStreamController, { State } from './base-stream-controller';\nimport { findNearestWithCC } from './fragment-finders';\nimport { FragmentState } from './fragment-tracker';\nimport ChunkCache from '../demux/chunk-cache';\nimport TransmuxerInterface from '../demux/transmuxer-interface';\nimport { ErrorDetails } from '../errors';\nimport { Events } from '../events';\nimport { ElementaryStreamTypes, isMediaFragment } from '../loader/fragment';\nimport { Level } from '../types/level';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { ChunkMetadata } from '../types/transmuxer';\nimport {\n  alignDiscontinuities,\n  alignMediaPlaylistByPDT,\n} from '../utils/discontinuities';\nimport {\n  audioMatchPredicate,\n  matchesOption,\n  useAlternateAudio,\n} from '../utils/rendition-helper';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type Hls from '../hls';\nimport type { Fragment, MediaFragment, Part } from '../loader/fragment';\nimport type KeyLoader from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  AudioTracksUpdatedData,\n  AudioTrackSwitchingData,\n  BufferAppendingData,\n  BufferCodecsData,\n  BufferCreatedData,\n  BufferFlushedData,\n  BufferFlushingData,\n  ErrorData,\n  FragBufferedData,\n  FragLoadedData,\n  FragLoadingData,\n  FragParsingMetadataData,\n  FragParsingUserdataData,\n  InitPTSFoundData,\n  LevelLoadedData,\n  MediaDetachingData,\n  TrackLoadedData,\n} from '../types/events';\nimport type { MediaPlaylist } from '../types/media-playlist';\nimport type { TrackSet } from '../types/track';\nimport type { TransmuxerResult } from '../types/transmuxer';\n\nconst TICK_INTERVAL = 100; // how often to tick in ms\n\ntype WaitingForPTSData = {\n  frag: MediaFragment;\n  part: Part | null;\n  cache: ChunkCache;\n  complete: boolean;\n};\n\nclass AudioStreamController\n  extends BaseStreamController\n  implements NetworkComponentAPI\n{\n  private mainAnchor: MediaFragment | null = null;\n  private mainFragLoading: FragLoadingData | null = null;\n  private audioOnly: boolean = false;\n  private bufferedTrack: MediaPlaylist | null = null;\n  private switchingTrack: MediaPlaylist | null = null;\n  private trackId: number = -1;\n  private waitingData: WaitingForPTSData | null = null;\n  private mainDetails: LevelDetails | null = null;\n  private flushing: boolean = false;\n  private bufferFlushed: boolean = false;\n  private cachedTrackLoadedData: TrackLoadedData | null = null;\n\n  constructor(\n    hls: Hls,\n    fragmentTracker: FragmentTracker,\n    keyLoader: KeyLoader,\n  ) {\n    super(\n      hls,\n      fragmentTracker,\n      keyLoader,\n      'audio-stream-controller',\n      PlaylistLevelType.AUDIO,\n    );\n    this.registerListeners();\n  }\n\n  protected onHandlerDestroying() {\n    this.unregisterListeners();\n    super.onHandlerDestroying();\n    this.resetItem();\n  }\n\n  private resetItem() {\n    this.mainDetails =\n      this.mainAnchor =\n      this.mainFragLoading =\n      this.bufferedTrack =\n      this.switchingTrack =\n      this.waitingData =\n      this.cachedTrackLoadedData =\n        null;\n  }\n\n  protected registerListeners() {\n    super.registerListeners();\n    const { hls } = this;\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this);\n    hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n    hls.on(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n    hls.on(Events.BUFFER_RESET, this.onBufferReset, this);\n    hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n    hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n    hls.on(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n    hls.on(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n\n  protected unregisterListeners() {\n    const { hls } = this;\n    if (!hls) {\n      return;\n    }\n    super.unregisterListeners();\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this);\n    hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n    hls.off(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n    hls.off(Events.BUFFER_RESET, this.onBufferReset, this);\n    hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n    hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n    hls.off(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n    hls.off(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n\n  // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value\n  onInitPtsFound(\n    event: Events.INIT_PTS_FOUND,\n    { frag, id, initPTS, timescale, trackId }: InitPTSFoundData,\n  ) {\n    // Always update the new INIT PTS\n    // Can change due level switch\n    if (id === PlaylistLevelType.MAIN) {\n      const cc = frag.cc;\n      const inFlightFrag = this.fragCurrent;\n      this.initPTS[cc] = { baseTime: initPTS, timescale, trackId };\n      this.log(\n        `InitPTS for cc: ${cc} found from main: ${initPTS / timescale} (${initPTS}/${timescale}) trackId: ${trackId}`,\n      );\n      this.mainAnchor = frag;\n      // If we are waiting, tick immediately to unblock audio fragment transmuxing\n      if (this.state === State.WAITING_INIT_PTS) {\n        const waitingData = this.waitingData;\n        if (\n          (!waitingData && !this.loadingParts) ||\n          (waitingData && waitingData.frag.cc !== cc)\n        ) {\n          this.syncWithAnchor(frag, waitingData?.frag);\n        }\n      } else if (\n        !this.hls.hasEnoughToStart &&\n        inFlightFrag &&\n        inFlightFrag.cc !== cc\n      ) {\n        inFlightFrag.abortRequests();\n        this.syncWithAnchor(frag, inFlightFrag);\n      } else if (this.state === State.IDLE) {\n        this.tick();\n      }\n    }\n  }\n\n  protected getLoadPosition(): number {\n    if (!this.startFragRequested && this.nextLoadPosition >= 0) {\n      return this.nextLoadPosition;\n    }\n    return super.getLoadPosition();\n  }\n\n  private syncWithAnchor(\n    mainAnchor: MediaFragment,\n    waitingToAppend: Fragment | undefined,\n  ) {\n    // Drop waiting fragment if videoTrackCC has changed since waitingFragment was set and initPTS was not found\n    const mainFragLoading = this.mainFragLoading?.frag || null;\n    if (waitingToAppend) {\n      if (mainFragLoading?.cc === waitingToAppend.cc) {\n        // Wait for loading frag to complete and INIT_PTS_FOUND\n        return;\n      }\n    }\n    const targetDiscontinuity = (mainFragLoading || mainAnchor).cc;\n    const trackDetails = this.getLevelDetails();\n    const pos = this.getLoadPosition();\n    const syncFrag = findNearestWithCC(trackDetails, targetDiscontinuity, pos);\n    // Only stop waiting for audioFrag.cc if an audio segment of the same discontinuity domain (cc) is found\n    if (syncFrag) {\n      this.log(`Syncing with main frag at ${syncFrag.start} cc ${syncFrag.cc}`);\n      this.startFragRequested = false;\n      this.nextLoadPosition = syncFrag.start;\n      this.resetLoadingState();\n      if (this.state === State.IDLE) {\n        this.doTickIdle();\n      }\n    }\n  }\n\n  startLoad(startPosition: number, skipSeekToStartPosition?: boolean) {\n    if (!this.levels) {\n      this.startPosition = startPosition;\n      this.state = State.STOPPED;\n      return;\n    }\n    const lastCurrentTime = this.lastCurrentTime;\n    this.stopLoad();\n    this.setInterval(TICK_INTERVAL);\n    if (lastCurrentTime > 0 && startPosition === -1) {\n      this.log(\n        `Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(\n          3,\n        )}`,\n      );\n      startPosition = lastCurrentTime;\n      this.state = State.IDLE;\n    } else {\n      this.state = State.WAITING_TRACK;\n    }\n    this.nextLoadPosition = this.lastCurrentTime =\n      startPosition + this.timelineOffset;\n    this.startPosition = skipSeekToStartPosition ? -1 : startPosition;\n    this.tick();\n  }\n\n  doTick() {\n    switch (this.state) {\n      case State.IDLE:\n        this.doTickIdle();\n        break;\n      case State.WAITING_TRACK: {\n        const { levels, trackId } = this;\n        const currenTrack = levels?.[trackId];\n        const details = currenTrack?.details;\n        if (details && !this.waitForLive(currenTrack)) {\n          if (this.waitForCdnTuneIn(details)) {\n            break;\n          }\n          this.state = State.WAITING_INIT_PTS;\n        }\n        break;\n      }\n      case State.FRAG_LOADING_WAITING_RETRY: {\n        this.checkRetryDate();\n        break;\n      }\n      case State.WAITING_INIT_PTS: {\n        // Ensure we don't get stuck in the WAITING_INIT_PTS state if the waiting frag CC doesn't match any initPTS\n        const waitingData = this.waitingData;\n        if (waitingData) {\n          const { frag, part, cache, complete } = waitingData;\n          const mainAnchor = this.mainAnchor;\n          if (this.initPTS[frag.cc] !== undefined) {\n            this.waitingData = null;\n            this.state = State.FRAG_LOADING;\n            const payload = cache.flush().buffer;\n            const data: FragLoadedData = {\n              frag,\n              part,\n              payload,\n              networkDetails: null,\n            };\n            this._handleFragmentLoadProgress(data);\n            if (complete) {\n              super._handleFragmentLoadComplete(data);\n            }\n          } else if (mainAnchor && mainAnchor.cc !== waitingData.frag.cc) {\n            this.syncWithAnchor(mainAnchor, waitingData.frag);\n          }\n        } else {\n          this.state = State.IDLE;\n        }\n      }\n    }\n\n    this.onTickEnd();\n  }\n\n  protected resetLoadingState() {\n    const waitingData = this.waitingData;\n    if (waitingData) {\n      this.fragmentTracker.removeFragment(waitingData.frag);\n      this.waitingData = null;\n    }\n    super.resetLoadingState();\n  }\n\n  protected onTickEnd() {\n    const { media } = this;\n    if (!media?.readyState) {\n      // Exit early if we don't have media or if the media hasn't buffered anything yet (readyState 0)\n      return;\n    }\n\n    this.lastCurrentTime = media.currentTime;\n  }\n\n  private doTickIdle() {\n    const { hls, levels, media, trackId } = this;\n    const config = hls.config;\n\n    // 1. if buffering is suspended\n    // 2. if video not attached AND\n    //    start fragment already requested OR start frag prefetch not enabled\n    // 3. if tracks or track not loaded and selected\n    // then exit loop\n    // => if media not attached but start frag prefetch is enabled and start frag not requested yet, we will not exit loop\n    if (\n      !this.buffering ||\n      (!media &&\n        !this.primaryPrefetch &&\n        (this.startFragRequested || !config.startFragPrefetch)) ||\n      !levels?.[trackId]\n    ) {\n      return;\n    }\n\n    const levelInfo = levels[trackId];\n\n    const trackDetails = levelInfo.details;\n    if (\n      !trackDetails ||\n      this.waitForLive(levelInfo) ||\n      this.waitForCdnTuneIn(trackDetails)\n    ) {\n      this.state = State.WAITING_TRACK;\n      this.startFragRequested = false;\n      return;\n    }\n\n    const bufferable = this.mediaBuffer ? this.mediaBuffer : this.media;\n    if (this.bufferFlushed && bufferable) {\n      this.bufferFlushed = false;\n      this.afterBufferFlushed(\n        bufferable,\n        ElementaryStreamTypes.AUDIO,\n        PlaylistLevelType.AUDIO,\n      );\n    }\n\n    const bufferInfo = this.getFwdBufferInfo(\n      bufferable,\n      PlaylistLevelType.AUDIO,\n    );\n    if (bufferInfo === null) {\n      return;\n    }\n\n    if (!this.switchingTrack && this._streamEnded(bufferInfo, trackDetails)) {\n      hls.trigger(Events.BUFFER_EOS, { type: 'audio' });\n      this.state = State.ENDED;\n      return;\n    }\n\n    const bufferLen = bufferInfo.len;\n    const maxBufLen = hls.maxBufferLength;\n\n    const fragments = trackDetails.fragments;\n    const start = fragments[0].start;\n    const loadPosition = this.getLoadPosition();\n    const targetBufferTime = this.flushing ? loadPosition : bufferInfo.end;\n\n    if (this.switchingTrack && media) {\n      const pos = loadPosition;\n      // if currentTime (pos) is less than alt audio playlist start time, it means that alt audio is ahead of currentTime\n      if (trackDetails.PTSKnown && pos < start) {\n        // if everything is buffered from pos to start or if audio buffer upfront, let's seek to start\n        if (bufferInfo.end > start || bufferInfo.nextStart) {\n          this.log(\n            'Alt audio track ahead of main track, seek to start of alt audio track',\n          );\n          media.currentTime = start + 0.05;\n        }\n      }\n    }\n\n    // if buffer length is less than maxBufLen, or near the end, find a fragment to load\n    if (\n      bufferLen >= maxBufLen &&\n      !this.switchingTrack &&\n      targetBufferTime < fragments[fragments.length - 1].start\n    ) {\n      return;\n    }\n\n    let frag = this.getNextFragment(targetBufferTime, trackDetails);\n    // Avoid loop loading by using nextLoadPosition set for backtracking and skipping consecutive GAP tags\n    if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n      frag = this.getNextFragmentLoopLoading(\n        frag,\n        trackDetails,\n        bufferInfo,\n        PlaylistLevelType.MAIN,\n        maxBufLen,\n      );\n    }\n    if (!frag) {\n      this.bufferFlushed = true;\n      return;\n    }\n\n    if (this.exceedsMaxBuffer(bufferInfo, maxBufLen, frag)) {\n      return;\n    }\n\n    // Request audio segments up to one fragment ahead of main stream-controller\n    let mainFragLoading = this.mainFragLoading?.frag || null;\n    if (\n      !this.audioOnly &&\n      this.startFragRequested &&\n      mainFragLoading &&\n      isMediaFragment(frag) &&\n      !frag.endList &&\n      (!trackDetails.live ||\n        (!this.loadingParts && targetBufferTime < this.hls.liveSyncPosition!))\n    ) {\n      if (this.fragmentTracker.getState(mainFragLoading) === FragmentState.OK) {\n        this.mainFragLoading = mainFragLoading = null;\n      }\n      if (mainFragLoading && isMediaFragment(mainFragLoading)) {\n        if (frag.start > mainFragLoading.end) {\n          // Get buffered frag at target position from tracker (loaded out of sequence)\n          const mainFragAtPos = this.fragmentTracker.getFragAtPos(\n            targetBufferTime,\n            PlaylistLevelType.MAIN,\n          );\n          if (mainFragAtPos && mainFragAtPos.end > mainFragLoading.end) {\n            mainFragLoading = mainFragAtPos;\n            this.mainFragLoading = {\n              frag: mainFragAtPos,\n              targetBufferTime: null,\n            };\n          }\n        }\n        const atBufferSyncLimit = frag.start > mainFragLoading.end;\n        if (atBufferSyncLimit) {\n          return;\n        }\n      }\n    }\n\n    this.loadFragment(frag, levelInfo, targetBufferTime);\n  }\n\n  protected onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    this.bufferFlushed = this.flushing = false;\n    super.onMediaDetaching(event, data);\n  }\n\n  private onAudioTracksUpdated(\n    event: Events.AUDIO_TRACKS_UPDATED,\n    { audioTracks }: AudioTracksUpdatedData,\n  ) {\n    // Reset tranxmuxer is essential for large context switches (Content Steering)\n    this.resetTransmuxer();\n    this.levels = audioTracks.map((mediaPlaylist) => new Level(mediaPlaylist));\n  }\n\n  private onAudioTrackSwitching(\n    event: Events.AUDIO_TRACK_SWITCHING,\n    data: AudioTrackSwitchingData,\n  ) {\n    // if any URL found on new audio track, it is an alternate audio track\n    const altAudio = !!data.url;\n    this.trackId = data.id;\n    const { fragCurrent } = this;\n\n    if (fragCurrent) {\n      fragCurrent.abortRequests();\n      this.removeUnbufferedFrags(fragCurrent.start);\n    }\n    this.resetLoadingState();\n\n    // should we switch tracks ?\n    if (altAudio) {\n      this.switchingTrack = data;\n      // main audio track are handled by stream-controller, just do something if switching to alt audio track\n      this.flushAudioIfNeeded(data);\n      if (this.state !== State.STOPPED) {\n        // switching to audio track, start timer if not already started\n        this.setInterval(TICK_INTERVAL);\n        this.state = State.IDLE;\n        this.tick();\n      }\n    } else {\n      // destroy useless transmuxer when switching audio to main\n      this.resetTransmuxer();\n      this.switchingTrack = null;\n      this.bufferedTrack = data;\n      this.clearInterval();\n    }\n  }\n\n  protected onManifestLoading() {\n    super.onManifestLoading();\n    this.bufferFlushed = this.flushing = this.audioOnly = false;\n    this.resetItem();\n    this.trackId = -1;\n  }\n\n  private onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n    this.mainDetails = data.details;\n    const cachedTrackLoadedData = this.cachedTrackLoadedData;\n    if (cachedTrackLoadedData) {\n      this.cachedTrackLoadedData = null;\n      this.onAudioTrackLoaded(Events.AUDIO_TRACK_LOADED, cachedTrackLoadedData);\n    }\n  }\n\n  private onAudioTrackLoaded(\n    event: Events.AUDIO_TRACK_LOADED,\n    data: TrackLoadedData,\n  ) {\n    const { levels } = this;\n    const { details: newDetails, id: trackId, groupId, track } = data;\n    if (!levels) {\n      this.warn(\n        `Audio tracks reset while loading track ${trackId} \"${track.name}\" of \"${groupId}\"`,\n      );\n      return;\n    }\n    const mainDetails = this.mainDetails;\n    if (\n      !mainDetails ||\n      newDetails.endCC > mainDetails.endCC ||\n      mainDetails.expired\n    ) {\n      this.cachedTrackLoadedData = data;\n      if (this.state !== State.STOPPED) {\n        this.state = State.WAITING_TRACK;\n      }\n      return;\n    }\n    this.cachedTrackLoadedData = null;\n    this.log(\n      `Audio track ${trackId} \"${track.name}\" of \"${groupId}\" loaded [${newDetails.startSN},${\n        newDetails.endSN\n      }]${\n        newDetails.lastPartSn\n          ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`\n          : ''\n      },duration:${newDetails.totalduration}`,\n    );\n\n    const trackLevel = levels[trackId];\n    let sliding = 0;\n    if (newDetails.live || trackLevel.details?.live) {\n      this.checkLiveUpdate(newDetails);\n      if (newDetails.deltaUpdateFailed) {\n        return;\n      }\n\n      if (trackLevel.details) {\n        sliding = this.alignPlaylists(\n          newDetails,\n          trackLevel.details,\n          this.levelLastLoaded?.details,\n        );\n      }\n      if (!newDetails.alignedSliding) {\n        // Align audio rendition with the \"main\" playlist on discontinuity change\n        // or program-date-time (PDT)\n        alignDiscontinuities(newDetails, mainDetails);\n        if (!newDetails.alignedSliding) {\n          alignMediaPlaylistByPDT(newDetails, mainDetails);\n        }\n        sliding = newDetails.fragmentStart;\n      }\n    }\n    trackLevel.details = newDetails;\n    this.levelLastLoaded = trackLevel;\n\n    // compute start position if we are aligned with the main playlist\n    if (!this.startFragRequested) {\n      this.setStartPosition(mainDetails, sliding);\n    }\n\n    this.hls.trigger(Events.AUDIO_TRACK_UPDATED, {\n      details: newDetails,\n      id: trackId,\n      groupId: data.groupId,\n    });\n\n    // only switch back to IDLE state if we were waiting for track to start downloading a new fragment\n    if (\n      this.state === State.WAITING_TRACK &&\n      !this.waitForCdnTuneIn(newDetails)\n    ) {\n      this.state = State.IDLE;\n    }\n\n    // trigger handler right now\n    this.tick();\n  }\n\n  _handleFragmentLoadProgress(data: FragLoadedData) {\n    const frag = data.frag as MediaFragment;\n    const { part, payload } = data;\n    const { config, trackId, levels } = this;\n    if (!levels) {\n      this.warn(\n        `Audio tracks were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`,\n      );\n      return;\n    }\n\n    const track = levels[trackId] as Level;\n    if (!track) {\n      this.warn('Audio track is undefined on fragment load progress');\n      return;\n    }\n    const details = track.details as LevelDetails;\n    if (!details) {\n      this.warn('Audio track details undefined on fragment load progress');\n      this.removeUnbufferedFrags(frag.start);\n      return;\n    }\n    const audioCodec =\n      config.defaultAudioCodec || track.audioCodec || 'mp4a.40.2';\n\n    let transmuxer = this.transmuxer;\n    if (!transmuxer) {\n      transmuxer = this.transmuxer = new TransmuxerInterface(\n        this.hls,\n        PlaylistLevelType.AUDIO,\n        this._handleTransmuxComplete.bind(this),\n        this._handleTransmuxerFlush.bind(this),\n      );\n    }\n\n    // Check if we have video initPTS\n    // If not we need to wait for it\n    const initPTS = this.initPTS[frag.cc];\n    const initSegmentData = frag.initSegment?.data;\n    if (initPTS !== undefined) {\n      // this.log(`Transmuxing ${sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`);\n      // time Offset is accurate if level PTS is known, or if playlist is not sliding (not live)\n      const accurateTimeOffset = false; // details.PTSKnown || !details.live;\n      const partIndex = part ? part.index : -1;\n      const partial = partIndex !== -1;\n      const chunkMeta = new ChunkMetadata(\n        frag.level,\n        frag.sn,\n        frag.stats.chunkCount,\n        payload.byteLength,\n        partIndex,\n        partial,\n      );\n      transmuxer.push(\n        payload,\n        initSegmentData,\n        audioCodec,\n        '',\n        frag,\n        part,\n        details.totalduration,\n        accurateTimeOffset,\n        chunkMeta,\n        initPTS,\n      );\n    } else {\n      this.log(\n        `Unknown video PTS for cc ${frag.cc}, waiting for video PTS before demuxing audio frag ${frag.sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`,\n      );\n      const { cache } = (this.waitingData = this.waitingData || {\n        frag,\n        part,\n        cache: new ChunkCache(),\n        complete: false,\n      });\n      cache.push(new Uint8Array(payload));\n      if (this.state !== State.STOPPED) {\n        this.state = State.WAITING_INIT_PTS;\n      }\n    }\n  }\n\n  protected _handleFragmentLoadComplete(fragLoadedData: FragLoadedData) {\n    if (this.waitingData) {\n      this.waitingData.complete = true;\n      return;\n    }\n    super._handleFragmentLoadComplete(fragLoadedData);\n  }\n\n  private onBufferReset(/* event: Events.BUFFER_RESET */) {\n    // reset reference to sourcebuffers\n    this.mediaBuffer = null;\n  }\n\n  private onBufferCreated(\n    event: Events.BUFFER_CREATED,\n    data: BufferCreatedData,\n  ) {\n    this.bufferFlushed = this.flushing = false;\n    const audioTrack = data.tracks.audio;\n    if (audioTrack) {\n      this.mediaBuffer = audioTrack.buffer || null;\n    }\n  }\n\n  private onFragLoading(event: Events.FRAG_LOADING, data: FragLoadingData) {\n    if (\n      !this.audioOnly &&\n      data.frag.type === PlaylistLevelType.MAIN &&\n      isMediaFragment(data.frag)\n    ) {\n      this.mainFragLoading = data;\n      if (this.state === State.IDLE) {\n        this.tick();\n      }\n    }\n  }\n\n  private onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n    const { frag, part } = data;\n    if (frag.type !== PlaylistLevelType.AUDIO) {\n      if (\n        !this.audioOnly &&\n        frag.type === PlaylistLevelType.MAIN &&\n        !frag.elementaryStreams.video &&\n        !frag.elementaryStreams.audiovideo\n      ) {\n        this.audioOnly = true;\n        this.mainFragLoading = null;\n      }\n      return;\n    }\n    if (this.fragContextChanged(frag)) {\n      // If a level switch was requested while a fragment was buffering, it will emit the FRAG_BUFFERED event upon completion\n      // Avoid setting state back to IDLE or concluding the audio switch; otherwise, the switched-to track will not buffer\n      this.warn(\n        `Fragment ${frag.sn}${part ? ' p: ' + part.index : ''} of level ${\n          frag.level\n        } finished buffering, but was aborted. state: ${\n          this.state\n        }, audioSwitch: ${\n          this.switchingTrack ? this.switchingTrack.name : 'false'\n        }`,\n      );\n      return;\n    }\n    if (isMediaFragment(frag)) {\n      this.fragPrevious = frag;\n      const track = this.switchingTrack;\n      if (track) {\n        this.bufferedTrack = track;\n        this.switchingTrack = null;\n        this.hls.trigger(Events.AUDIO_TRACK_SWITCHED, { ...track });\n      }\n    }\n    this.fragBufferedComplete(frag, part);\n    if (this.media) {\n      this.tick();\n    }\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData) {\n    if (data.fatal) {\n      this.state = State.ERROR;\n      return;\n    }\n    switch (data.details) {\n      case ErrorDetails.FRAG_GAP:\n      case ErrorDetails.FRAG_PARSING_ERROR:\n      case ErrorDetails.FRAG_DECRYPT_ERROR:\n      case ErrorDetails.FRAG_LOAD_ERROR:\n      case ErrorDetails.FRAG_LOAD_TIMEOUT:\n      case ErrorDetails.KEY_LOAD_ERROR:\n      case ErrorDetails.KEY_LOAD_TIMEOUT:\n        this.onFragmentOrKeyLoadError(PlaylistLevelType.AUDIO, data);\n        break;\n      case ErrorDetails.AUDIO_TRACK_LOAD_ERROR:\n      case ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:\n      case ErrorDetails.LEVEL_PARSING_ERROR:\n        // in case of non fatal error while loading track, if not retrying to load track, switch back to IDLE\n        if (\n          !data.levelRetry &&\n          this.state === State.WAITING_TRACK &&\n          data.context?.type === PlaylistContextType.AUDIO_TRACK\n        ) {\n          this.state = State.IDLE;\n        }\n        break;\n      case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        if (data.parent !== 'audio') {\n          return;\n        }\n        if (!this.reduceLengthAndFlushBuffer(data)) {\n          this.resetLoadingState();\n        }\n        break;\n      case ErrorDetails.BUFFER_FULL_ERROR:\n        if (data.parent !== 'audio') {\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          this.bufferedTrack = null;\n          super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio');\n        }\n        break;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(data);\n        break;\n      default:\n        break;\n    }\n  }\n\n  private onBufferFlushing(\n    event: Events.BUFFER_FLUSHING,\n    { type }: BufferFlushingData,\n  ) {\n    if (type !== ElementaryStreamTypes.VIDEO) {\n      this.flushing = true;\n    }\n  }\n\n  private onBufferFlushed(\n    event: Events.BUFFER_FLUSHED,\n    { type }: BufferFlushedData,\n  ) {\n    if (type !== ElementaryStreamTypes.VIDEO) {\n      this.flushing = false;\n      this.bufferFlushed = true;\n      if (this.state === State.ENDED) {\n        this.state = State.IDLE;\n      }\n      const mediaBuffer = this.mediaBuffer || this.media;\n      if (mediaBuffer) {\n        this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.AUDIO);\n        this.tick();\n      }\n    }\n  }\n\n  private _handleTransmuxComplete(transmuxResult: TransmuxerResult) {\n    const id = 'audio';\n    const { hls } = this;\n    const { remuxResult, chunkMeta } = transmuxResult;\n\n    const context = this.getCurrentContext(chunkMeta);\n    if (!context) {\n      this.resetWhenMissingContext(chunkMeta);\n      return;\n    }\n    const { frag, part, level } = context;\n    const { details } = level;\n    const { audio, text, id3, initSegment } = remuxResult;\n\n    // Check if the current fragment has been aborted. We check this by first seeing if we're still playing the current level.\n    // If we are, subsequently check if the currently loading fragment (fragCurrent) has changed.\n    if (this.fragContextChanged(frag) || !details) {\n      this.fragmentTracker.removeFragment(frag);\n      return;\n    }\n\n    this.state = State.PARSING;\n    if (this.switchingTrack && audio) {\n      this.completeAudioSwitch(this.switchingTrack);\n    }\n\n    if (initSegment?.tracks) {\n      const mapFragment = frag.initSegment || frag;\n      if (this.unhandledEncryptionError(initSegment, frag)) {\n        return;\n      }\n      this._bufferInitSegment(\n        level,\n        initSegment.tracks,\n        mapFragment,\n        chunkMeta,\n      );\n      hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n        frag: mapFragment,\n        id,\n        tracks: initSegment.tracks,\n      });\n      // Only flush audio from old audio tracks when PTS is known on new audio track\n    }\n    if (audio) {\n      const { startPTS, endPTS, startDTS, endDTS } = audio;\n      if (part) {\n        part.elementaryStreams[ElementaryStreamTypes.AUDIO] = {\n          startPTS,\n          endPTS,\n          startDTS,\n          endDTS,\n        };\n      }\n      frag.setElementaryStreamInfo(\n        ElementaryStreamTypes.AUDIO,\n        startPTS,\n        endPTS,\n        startDTS,\n        endDTS,\n      );\n      this.bufferFragmentData(audio, frag, part, chunkMeta);\n    }\n\n    if (id3?.samples?.length) {\n      const emittedID3: FragParsingMetadataData = Object.assign(\n        {\n          id,\n          frag,\n          details,\n        },\n        id3,\n      );\n      hls.trigger(Events.FRAG_PARSING_METADATA, emittedID3);\n    }\n    if (text) {\n      const emittedText: FragParsingUserdataData = Object.assign(\n        {\n          id,\n          frag,\n          details,\n        },\n        text,\n      );\n      hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText);\n    }\n  }\n\n  private _bufferInitSegment(\n    currentLevel: Level,\n    tracks: TrackSet,\n    frag: Fragment,\n    chunkMeta: ChunkMetadata,\n  ) {\n    if (this.state !== State.PARSING) {\n      return;\n    }\n    // delete any video track found on audio transmuxer\n    if (tracks.video) {\n      delete tracks.video;\n    }\n    if (tracks.audiovideo) {\n      delete tracks.audiovideo;\n    }\n\n    // include levelCodec in audio and video tracks\n    if (!tracks.audio) {\n      return;\n    }\n    const track = tracks.audio;\n\n    track.id = PlaylistLevelType.AUDIO;\n\n    const variantAudioCodecs = currentLevel.audioCodec;\n    this.log(\n      `Init audio buffer, container:${track.container}, codecs[level/parsed]=[${variantAudioCodecs}/${track.codec}]`,\n    );\n    // SourceBuffer will use track.levelCodec if defined\n    if (variantAudioCodecs && variantAudioCodecs.split(',').length === 1) {\n      track.levelCodec = variantAudioCodecs;\n    }\n    this.hls.trigger(Events.BUFFER_CODECS, tracks as BufferCodecsData);\n    const initSegment = track.initSegment;\n    if (initSegment?.byteLength) {\n      const segment: BufferAppendingData = {\n        type: 'audio',\n        frag,\n        part: null,\n        chunkMeta,\n        parent: frag.type,\n        data: initSegment,\n      };\n      this.hls.trigger(Events.BUFFER_APPENDING, segment);\n    }\n    // trigger handler right now\n    this.tickImmediate();\n  }\n\n  protected loadFragment(\n    frag: Fragment,\n    track: Level,\n    targetBufferTime: number,\n  ) {\n    // only load if fragment is not loaded or if in audio switch\n    const fragState = this.fragmentTracker.getState(frag);\n\n    // we force a frag loading in audio switch as fragment tracker might not have evicted previous frags in case of quick audio switch\n    if (\n      this.switchingTrack ||\n      fragState === FragmentState.NOT_LOADED ||\n      fragState === FragmentState.PARTIAL\n    ) {\n      if (!isMediaFragment(frag)) {\n        this._loadInitSegment(frag, track);\n      } else if (track.details?.live && !this.initPTS[frag.cc]) {\n        this.log(\n          `Waiting for video PTS in continuity counter ${frag.cc} of live stream before loading audio fragment ${frag.sn} of level ${this.trackId}`,\n        );\n        this.state = State.WAITING_INIT_PTS;\n        const mainDetails = this.mainDetails;\n        if (\n          mainDetails &&\n          mainDetails.fragmentStart !== track.details.fragmentStart\n        ) {\n          alignMediaPlaylistByPDT(track.details, mainDetails);\n        }\n      } else {\n        super.loadFragment(frag, track, targetBufferTime);\n      }\n    } else {\n      this.clearTrackerIfNeeded(frag);\n    }\n  }\n\n  private flushAudioIfNeeded(switchingTrack: MediaPlaylist) {\n    if (this.media && this.bufferedTrack) {\n      const { name, lang, assocLang, characteristics, audioCodec, channels } =\n        this.bufferedTrack;\n      if (\n        !matchesOption(\n          { name, lang, assocLang, characteristics, audioCodec, channels },\n          switchingTrack,\n          audioMatchPredicate,\n        )\n      ) {\n        if (useAlternateAudio(switchingTrack.url, this.hls)) {\n          this.log('Switching audio track : flushing all audio');\n          super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio');\n          this.bufferedTrack = null;\n        } else {\n          // Main is being buffered. Set bufferedTrack so that it is flushed when switching back to alt-audio\n          this.bufferedTrack = switchingTrack;\n        }\n      }\n    }\n  }\n\n  private completeAudioSwitch(switchingTrack: MediaPlaylist) {\n    const { hls } = this;\n    this.flushAudioIfNeeded(switchingTrack);\n    this.bufferedTrack = switchingTrack;\n    this.switchingTrack = null;\n    hls.trigger(Events.AUDIO_TRACK_SWITCHED, { ...switchingTrack });\n  }\n}\nexport default AudioStreamController;\n", "import { NetworkErrorAction } from './error-controller';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport {\n  getSkipValue,\n  HlsSkip,\n  HlsUrlParameters,\n  type Level,\n} from '../types/level';\nimport { getRetryDelay, isTimeoutError } from '../utils/error-helper';\nimport { computeReloadInterval, mergeDetails } from '../utils/level-helper';\nimport { Logger } from '../utils/logger';\nimport type Hls from '../hls';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type { ErrorData } from '../types/events';\nimport type {\n  AudioTrackLoadedData,\n  LevelLoadedData,\n  TrackLoadedData,\n} from '../types/events';\nimport type { MediaPlaylist } from '../types/media-playlist';\n\nexport default class BasePlaylistController\n  extends Logger\n  implements NetworkComponentAPI\n{\n  protected hls: Hls;\n  protected canLoad: boolean = false;\n  private timer: number = -1;\n\n  constructor(hls: Hls, logPrefix: string) {\n    super(logPrefix, hls.logger);\n    this.hls = hls;\n  }\n\n  public destroy() {\n    this.clearTimer();\n    // @ts-ignore\n    this.hls = this.log = this.warn = null;\n  }\n\n  private clearTimer() {\n    if (this.timer !== -1) {\n      self.clearTimeout(this.timer);\n      this.timer = -1;\n    }\n  }\n\n  public startLoad() {\n    this.canLoad = true;\n    this.loadPlaylist();\n  }\n\n  public stopLoad() {\n    this.canLoad = false;\n    this.clearTimer();\n  }\n\n  protected switchParams(\n    playlistUri: string,\n    previous: LevelDetails | undefined,\n    current: LevelDetails | undefined,\n  ): HlsUrlParameters | undefined {\n    const renditionReports = previous?.renditionReports;\n    if (renditionReports) {\n      let foundIndex = -1;\n      for (let i = 0; i < renditionReports.length; i++) {\n        const attr = renditionReports[i];\n        let uri: string;\n        try {\n          uri = new self.URL(attr.URI, previous.url).href;\n        } catch (error) {\n          this.warn(\n            `Could not construct new URL for Rendition Report: ${error}`,\n          );\n          uri = attr.URI || '';\n        }\n        // Use exact match. Otherwise, the last partial match, if any, will be used\n        // (Playlist URI includes a query string that the Rendition Report does not)\n        if (uri === playlistUri) {\n          foundIndex = i;\n          break;\n        } else if (uri === playlistUri.substring(0, uri.length)) {\n          foundIndex = i;\n        }\n      }\n      if (foundIndex !== -1) {\n        const attr = renditionReports[foundIndex];\n        const msn = parseInt(attr['LAST-MSN']) || previous.lastPartSn;\n        let part = parseInt(attr['LAST-PART']) || previous.lastPartIndex;\n        if (this.hls.config.lowLatencyMode) {\n          const currentGoal = Math.min(\n            previous.age - previous.partTarget,\n            previous.targetduration,\n          );\n          if (part >= 0 && currentGoal > previous.partTarget) {\n            part += 1;\n          }\n        }\n        const skip = current && getSkipValue(current);\n        return new HlsUrlParameters(msn, part >= 0 ? part : undefined, skip);\n      }\n    }\n  }\n\n  protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters) {\n    // Loading is handled by the subclasses\n    this.clearTimer();\n  }\n\n  protected loadingPlaylist(\n    playlist: Level | MediaPlaylist,\n    hlsUrlParameters?: HlsUrlParameters,\n  ) {\n    // Loading is handled by the subclasses\n    this.clearTimer();\n  }\n\n  protected shouldLoadPlaylist(\n    playlist: Level | MediaPlaylist | null | undefined,\n  ): playlist is Level | MediaPlaylist {\n    return (\n      this.canLoad &&\n      !!playlist &&\n      !!playlist.url &&\n      (!playlist.details || playlist.details.live)\n    );\n  }\n\n  protected getUrlWithDirectives(\n    uri: string,\n    hlsUrlParameters: HlsUrlParameters | undefined,\n  ): string {\n    if (hlsUrlParameters) {\n      try {\n        return hlsUrlParameters.addDirectives(uri);\n      } catch (error) {\n        this.warn(\n          `Could not construct new URL with HLS Delivery Directives: ${error}`,\n        );\n      }\n    }\n    return uri;\n  }\n\n  protected playlistLoaded(\n    index: number,\n    data: LevelLoadedData | AudioTrackLoadedData | TrackLoadedData,\n    previousDetails?: LevelDetails,\n  ) {\n    const { details, stats } = data;\n\n    // Set last updated date-time\n    const now = self.performance.now();\n    const elapsed = stats.loading.first\n      ? Math.max(0, now - stats.loading.first)\n      : 0;\n    details.advancedDateTime = Date.now() - elapsed;\n\n    // shift fragment starts with timelineOffset\n    const timelineOffset = this.hls.config.timelineOffset;\n    if (timelineOffset !== details.appliedTimelineOffset) {\n      const offset = Math.max(timelineOffset || 0, 0);\n      details.appliedTimelineOffset = offset;\n      details.fragments.forEach((frag) => {\n        frag.setStart(frag.playlistOffset + offset);\n      });\n    }\n\n    // if current playlist is a live playlist, arm a timer to reload it\n    if (details.live || previousDetails?.live) {\n      const levelOrTrack = 'levelInfo' in data ? data.levelInfo : data.track;\n      details.reloaded(previousDetails);\n      // Merge live playlists to adjust fragment starts and fill in delta playlist skipped segments\n      if (previousDetails && details.fragments.length > 0) {\n        mergeDetails(previousDetails, details, this);\n        const error = details.playlistParsingError;\n        if (error) {\n          this.warn(error);\n          const hls = this.hls;\n          if (!hls.config.ignorePlaylistParsingErrors) {\n            const { networkDetails } = data;\n            hls.trigger(Events.ERROR, {\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.LEVEL_PARSING_ERROR,\n              fatal: false,\n              url: details.url,\n              error,\n              reason: error.message,\n              level: (data as any).level || undefined,\n              parent: details.fragments[0]?.type,\n              networkDetails,\n              stats,\n            });\n            return;\n          }\n          details.playlistParsingError = null;\n        }\n      }\n      if (details.requestScheduled === -1) {\n        details.requestScheduled = stats.loading.start;\n      }\n      const bufferInfo = this.hls.mainForwardBufferInfo;\n      const position = bufferInfo ? bufferInfo.end - bufferInfo.len : 0;\n      const distanceToLiveEdgeMs = (details.edge - position) * 1000;\n      const reloadInterval = computeReloadInterval(\n        details,\n        distanceToLiveEdgeMs,\n      );\n      if (details.requestScheduled + reloadInterval < now) {\n        details.requestScheduled = now;\n      } else {\n        details.requestScheduled += reloadInterval;\n      }\n      this.log(\n        `live playlist ${index} ${\n          details.advanced\n            ? 'REFRESHED ' + details.lastPartSn + '-' + details.lastPartIndex\n            : details.updated\n              ? 'UPDATED'\n              : 'MISSED'\n        }`,\n      );\n      if (!this.canLoad || !details.live) {\n        return;\n      }\n      let deliveryDirectives: HlsUrlParameters | undefined;\n      let msn: number | undefined = undefined;\n      let part: number | undefined = undefined;\n      if (details.canBlockReload && details.endSN && details.advanced) {\n        // Load level with LL-HLS delivery directives\n        const lowLatencyMode = this.hls.config.lowLatencyMode;\n        const lastPartSn = details.lastPartSn;\n        const endSn = details.endSN;\n        const lastPartIndex = details.lastPartIndex;\n        const hasParts = lastPartIndex !== -1;\n        const atLastPartOfSegment = lastPartSn === endSn;\n        if (hasParts) {\n          // When low latency mode is disabled, request the last part of the next segment\n          if (atLastPartOfSegment) {\n            msn = endSn + 1;\n            part = lowLatencyMode ? 0 : lastPartIndex;\n          } else {\n            msn = lastPartSn;\n            part = lowLatencyMode ? lastPartIndex + 1 : details.maxPartIndex;\n          }\n        } else {\n          msn = endSn + 1;\n        }\n        // Low-Latency CDN Tune-in: \"age\" header and time since load indicates we're behind by more than one part\n        // Update directives to obtain the Playlist that has the estimated additional duration of media\n        const lastAdvanced = details.age;\n        const cdnAge = lastAdvanced + details.ageHeader;\n        let currentGoal = Math.min(\n          cdnAge - details.partTarget,\n          details.targetduration * 1.5,\n        );\n        if (currentGoal > 0) {\n          if (cdnAge > details.targetduration * 3) {\n            // Omit segment and part directives when the last response was more than 3 target durations ago,\n            this.log(\n              `Playlist last advanced ${lastAdvanced.toFixed(\n                2,\n              )}s ago. Omitting segment and part directives.`,\n            );\n            msn = undefined;\n            part = undefined;\n          } else if (\n            previousDetails?.tuneInGoal &&\n            cdnAge - details.partTarget > previousDetails.tuneInGoal\n          ) {\n            // If we attempted to get the next or latest playlist update, but currentGoal increased,\n            // then we either can't catchup, or the \"age\" header cannot be trusted.\n            this.warn(\n              `CDN Tune-in goal increased from: ${previousDetails.tuneInGoal} to: ${currentGoal} with playlist age: ${details.age}`,\n            );\n            currentGoal = 0;\n          } else {\n            const segments = Math.floor(currentGoal / details.targetduration);\n            msn += segments;\n            if (part !== undefined) {\n              const parts = Math.round(\n                (currentGoal % details.targetduration) / details.partTarget,\n              );\n              part += parts;\n            }\n            this.log(\n              `CDN Tune-in age: ${\n                details.ageHeader\n              }s last advanced ${lastAdvanced.toFixed(\n                2,\n              )}s goal: ${currentGoal} skip sn ${segments} to part ${part}`,\n            );\n          }\n          details.tuneInGoal = currentGoal;\n        }\n        deliveryDirectives = this.getDeliveryDirectives(\n          details,\n          data.deliveryDirectives,\n          msn,\n          part,\n        );\n        if (lowLatencyMode || !atLastPartOfSegment) {\n          details.requestScheduled = now;\n          this.loadingPlaylist(levelOrTrack, deliveryDirectives);\n          return;\n        }\n      } else if (details.canBlockReload || details.canSkipUntil) {\n        deliveryDirectives = this.getDeliveryDirectives(\n          details,\n          data.deliveryDirectives,\n          msn,\n          part,\n        );\n      }\n      if (deliveryDirectives && msn !== undefined && details.canBlockReload) {\n        details.requestScheduled =\n          stats.loading.first +\n          Math.max(reloadInterval - elapsed * 2, reloadInterval / 2);\n      }\n      this.scheduleLoading(levelOrTrack, deliveryDirectives, details);\n    } else {\n      this.clearTimer();\n    }\n  }\n\n  protected scheduleLoading(\n    levelOrTrack: Level | MediaPlaylist,\n    deliveryDirectives?: HlsUrlParameters,\n    updatedDetails?: LevelDetails,\n  ) {\n    const details = updatedDetails || levelOrTrack.details;\n    if (!details) {\n      this.loadingPlaylist(levelOrTrack, deliveryDirectives);\n      return;\n    }\n    const now = self.performance.now();\n    const requestScheduled = details.requestScheduled;\n    if (now >= requestScheduled) {\n      this.loadingPlaylist(levelOrTrack, deliveryDirectives);\n      return;\n    }\n\n    const estimatedTimeUntilUpdate = requestScheduled - now;\n    this.log(\n      `reload live playlist ${levelOrTrack.name || levelOrTrack.bitrate + 'bps'} in ${Math.round(\n        estimatedTimeUntilUpdate,\n      )} ms`,\n    );\n\n    this.clearTimer();\n    this.timer = self.setTimeout(\n      () => this.loadingPlaylist(levelOrTrack, deliveryDirectives),\n      estimatedTimeUntilUpdate,\n    );\n  }\n\n  private getDeliveryDirectives(\n    details: LevelDetails,\n    previousDeliveryDirectives: HlsUrlParameters | null,\n    msn?: number,\n    part?: number,\n  ): HlsUrlParameters {\n    let skip = getSkipValue(details);\n    if (previousDeliveryDirectives?.skip && details.deltaUpdateFailed) {\n      msn = previousDeliveryDirectives.msn;\n      part = previousDeliveryDirectives.part;\n      skip = HlsSkip.No;\n    }\n    return new HlsUrlParameters(msn, part, skip);\n  }\n\n  protected checkRetry(errorEvent: ErrorData): boolean {\n    const errorDetails = errorEvent.details;\n    const isTimeout = isTimeoutError(errorEvent);\n    const errorAction = errorEvent.errorAction;\n    const { action, retryCount = 0, retryConfig } = errorAction || {};\n    const retry =\n      !!errorAction &&\n      !!retryConfig &&\n      (action === NetworkErrorAction.RetryRequest ||\n        (!errorAction.resolved &&\n          action === NetworkErrorAction.SendAlternateToPenaltyBox));\n    if (retry) {\n      if (retryCount >= retryConfig.maxNumRetry) {\n        return false;\n      }\n      if (isTimeout && errorEvent.context?.deliveryDirectives) {\n        // The LL-HLS request already timed out so retry immediately\n        this.warn(\n          `Retrying playlist loading ${retryCount + 1}/${\n            retryConfig.maxNumRetry\n          } after \"${errorDetails}\" without delivery-directives`,\n        );\n        this.loadPlaylist();\n      } else {\n        const delay = getRetryDelay(retryConfig, retryCount);\n        // Schedule level/track reload\n        this.clearTimer();\n        this.timer = self.setTimeout(() => this.loadPlaylist(), delay);\n        this.warn(\n          `Retrying playlist loading ${retryCount + 1}/${\n            retryConfig.maxNumRetry\n          } after \"${errorDetails}\" in ${delay}ms`,\n        );\n      }\n      // `levelRetry = true` used to inform other controllers that a retry is happening\n      errorEvent.levelRetry = true;\n      errorAction.resolved = true;\n    }\n    return retry;\n  }\n}\n", "import type { Level } from '../types/level';\nimport type { MediaAttributes, MediaPlaylist } from '../types/media-playlist';\n\nexport function subtitleOptionsIdentical(\n  trackList1: MediaPlaylist[] | Level[],\n  trackList2: MediaPlaylist[],\n): boolean {\n  if (trackList1.length !== trackList2.length) {\n    return false;\n  }\n  for (let i = 0; i < trackList1.length; i++) {\n    if (\n      !mediaAttributesIdentical(\n        trackList1[i].attrs as MediaAttributes,\n        trackList2[i].attrs,\n      )\n    ) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function mediaAttributesIdentical(\n  attrs1: MediaAttributes,\n  attrs2: MediaAttributes,\n  customAttributes?: string[],\n): boolean {\n  // Media options with the same rendition ID must be bit identical\n  const stableRenditionId = attrs1['STABLE-RENDITION-ID'];\n  if (stableRenditionId && !customAttributes) {\n    return stableRenditionId === attrs2['STABLE-RENDITION-ID'];\n  }\n  // When rendition ID is not present, compare attributes\n  return !(\n    customAttributes || [\n      'LANGUAGE',\n      'NAME',\n      'CHARACTERISTICS',\n      'AUTOSELECT',\n      'DEFAULT',\n      'FORCED',\n      'ASSOC-LANGUAGE',\n    ]\n  ).some(\n    (subtitleAttribute) =>\n      attrs1[subtitleAttribute] !== attrs2[subtitleAttribute],\n  );\n}\n\nexport function subtitleTrackMatchesTextTrack(\n  subtitleTrack: Pick<MediaPlaylist, 'name' | 'lang' | 'attrs'>,\n  textTrack: TextTrack,\n) {\n  return (\n    textTrack.label.toLowerCase() === subtitleTrack.name.toLowerCase() &&\n    (!textTrack.language ||\n      textTrack.language.toLowerCase() ===\n        (subtitleTrack.lang || '').toLowerCase())\n  );\n}\n", "import BasePlaylistController from './base-playlist-controller';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { PlaylistContextType } from '../types/loader';\nimport { mediaAttributesIdentical } from '../utils/media-option-attributes';\nimport {\n  audioMatchPredicate,\n  findClosestLevelWithAudioGroup,\n  findMatchingOption,\n  matchesOption,\n  useAlternateAudio,\n} from '../utils/rendition-helper';\nimport type Hls from '../hls';\nimport type {\n  AudioTrackLoadedData,\n  AudioTracksUpdatedData,\n  ErrorData,\n  LevelLoadingData,\n  LevelSwitchingData,\n  ManifestParsedData,\n} from '../types/events';\nimport type { HlsUrlParameters } from '../types/level';\nimport type {\n  AudioSelectionOption,\n  MediaPlaylist,\n} from '../types/media-playlist';\n\nclass AudioTrackController extends BasePlaylistController {\n  private tracks: MediaPlaylist[] = [];\n  private groupIds: (string | undefined)[] | null = null;\n  private tracksInGroup: MediaPlaylist[] = [];\n  private trackId: number = -1;\n  private currentTrack: MediaPlaylist | null = null;\n  private selectDefaultTrack: boolean = true;\n\n  constructor(hls: Hls) {\n    super(hls, 'audio-track-controller');\n    this.registerListeners();\n  }\n\n  private registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.on(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n    hls.on(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  private unregisterListeners() {\n    const { hls } = this;\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.off(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n    hls.off(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  public destroy() {\n    this.unregisterListeners();\n    this.tracks.length = 0;\n    this.tracksInGroup.length = 0;\n    this.currentTrack = null;\n    super.destroy();\n  }\n\n  protected onManifestLoading(): void {\n    this.tracks = [];\n    this.tracksInGroup = [];\n    this.groupIds = null;\n    this.currentTrack = null;\n    this.trackId = -1;\n    this.selectDefaultTrack = true;\n  }\n\n  protected onManifestParsed(\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ): void {\n    this.tracks = data.audioTracks || [];\n  }\n\n  protected onAudioTrackLoaded(\n    event: Events.AUDIO_TRACK_LOADED,\n    data: AudioTrackLoadedData,\n  ): void {\n    const { id, groupId, details } = data;\n    const trackInActiveGroup = this.tracksInGroup[id];\n\n    if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) {\n      this.warn(\n        `Audio track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup?.groupId}`,\n      );\n      return;\n    }\n\n    const curDetails = trackInActiveGroup.details;\n    trackInActiveGroup.details = data.details;\n    this.log(\n      `Audio track ${id} \"${trackInActiveGroup.name}\" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`,\n    );\n\n    if (id === this.trackId) {\n      this.playlistLoaded(id, data, curDetails);\n    }\n  }\n\n  protected onLevelLoading(\n    event: Events.LEVEL_LOADING,\n    data: LevelLoadingData,\n  ): void {\n    this.switchLevel(data.level);\n  }\n\n  protected onLevelSwitching(\n    event: Events.LEVEL_SWITCHING,\n    data: LevelSwitchingData,\n  ): void {\n    this.switchLevel(data.level);\n  }\n\n  private switchLevel(levelIndex: number) {\n    const levelInfo = this.hls.levels[levelIndex];\n    if (!levelInfo) {\n      return;\n    }\n    const audioGroups = levelInfo.audioGroups || null;\n    const currentGroups = this.groupIds;\n    let currentTrack = this.currentTrack;\n    if (\n      !audioGroups ||\n      currentGroups?.length !== audioGroups?.length ||\n      audioGroups?.some((groupId) => currentGroups?.indexOf(groupId) === -1)\n    ) {\n      this.groupIds = audioGroups;\n      this.trackId = -1;\n      this.currentTrack = null;\n\n      const audioTracks = this.tracks.filter(\n        (track): boolean =>\n          !audioGroups || audioGroups.indexOf(track.groupId) !== -1,\n      );\n      if (audioTracks.length) {\n        // Disable selectDefaultTrack if there are no default tracks\n        if (\n          this.selectDefaultTrack &&\n          !audioTracks.some((track) => track.default)\n        ) {\n          this.selectDefaultTrack = false;\n        }\n        // track.id should match hls.audioTracks index\n        audioTracks.forEach((track, i) => {\n          track.id = i;\n        });\n      } else if (!currentTrack && !this.tracksInGroup.length) {\n        // Do not dispatch AUDIO_TRACKS_UPDATED when there were and are no tracks\n        return;\n      }\n      this.tracksInGroup = audioTracks;\n\n      // Find preferred track\n      const audioPreference = this.hls.config.audioPreference;\n      if (!currentTrack && audioPreference) {\n        const groupIndex = findMatchingOption(\n          audioPreference,\n          audioTracks,\n          audioMatchPredicate,\n        );\n        if (groupIndex > -1) {\n          currentTrack = audioTracks[groupIndex];\n        } else {\n          const allIndex = findMatchingOption(audioPreference, this.tracks);\n          currentTrack = this.tracks[allIndex];\n        }\n      }\n\n      // Select initial track\n      let trackId = this.findTrackId(currentTrack);\n      if (trackId === -1 && currentTrack) {\n        trackId = this.findTrackId(null);\n      }\n\n      // Dispatch events and load track if needed\n      const audioTracksUpdated: AudioTracksUpdatedData = { audioTracks };\n      this.log(\n        `Updating audio tracks, ${\n          audioTracks.length\n        } track(s) found in group(s): ${audioGroups?.join(',')}`,\n      );\n      this.hls.trigger(Events.AUDIO_TRACKS_UPDATED, audioTracksUpdated);\n\n      const selectedTrackId = this.trackId;\n      if (trackId !== -1 && selectedTrackId === -1) {\n        this.setAudioTrack(trackId);\n      } else if (audioTracks.length && selectedTrackId === -1) {\n        const error = new Error(\n          `No audio track selected for current audio group-ID(s): ${this.groupIds?.join(\n            ',',\n          )} track count: ${audioTracks.length}`,\n        );\n        this.warn(error.message);\n\n        this.hls.trigger(Events.ERROR, {\n          type: ErrorTypes.MEDIA_ERROR,\n          details: ErrorDetails.AUDIO_TRACK_LOAD_ERROR,\n          fatal: true,\n          error,\n        });\n      }\n    }\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData): void {\n    if (data.fatal || !data.context) {\n      return;\n    }\n\n    if (\n      data.context.type === PlaylistContextType.AUDIO_TRACK &&\n      data.context.id === this.trackId &&\n      (!this.groupIds || this.groupIds.indexOf(data.context.groupId) !== -1)\n    ) {\n      this.checkRetry(data);\n    }\n  }\n\n  get allAudioTracks(): MediaPlaylist[] {\n    return this.tracks;\n  }\n\n  get audioTracks(): MediaPlaylist[] {\n    return this.tracksInGroup;\n  }\n\n  get audioTrack(): number {\n    return this.trackId;\n  }\n\n  set audioTrack(newId: number) {\n    // If audio track is selected from API then don't choose from the manifest default track\n    this.selectDefaultTrack = false;\n    this.setAudioTrack(newId);\n  }\n\n  public setAudioOption(\n    audioOption: MediaPlaylist | AudioSelectionOption | undefined,\n  ): MediaPlaylist | null {\n    const hls = this.hls;\n    hls.config.audioPreference = audioOption;\n    if (audioOption) {\n      const allAudioTracks = this.allAudioTracks;\n      this.selectDefaultTrack = false;\n      if (allAudioTracks.length) {\n        // First see if current option matches (no switch op)\n        const currentTrack = this.currentTrack;\n        if (\n          currentTrack &&\n          matchesOption(audioOption, currentTrack, audioMatchPredicate)\n        ) {\n          return currentTrack;\n        }\n        // Find option in available tracks (tracksInGroup)\n        const groupIndex = findMatchingOption(\n          audioOption,\n          this.tracksInGroup,\n          audioMatchPredicate,\n        );\n        if (groupIndex > -1) {\n          const track = this.tracksInGroup[groupIndex];\n          this.setAudioTrack(groupIndex);\n          return track;\n        } else if (currentTrack) {\n          // Find option in nearest level audio group\n          let searchIndex = hls.loadLevel;\n          if (searchIndex === -1) {\n            searchIndex = hls.firstAutoLevel;\n          }\n          const switchIndex = findClosestLevelWithAudioGroup(\n            audioOption,\n            hls.levels,\n            allAudioTracks,\n            searchIndex,\n            audioMatchPredicate,\n          );\n          if (switchIndex === -1) {\n            // could not find matching variant\n            return null;\n          }\n          // and switch level to acheive the audio group switch\n          hls.nextLoadLevel = switchIndex;\n        }\n        if (audioOption.channels || audioOption.audioCodec) {\n          // Could not find a match with codec / channels predicate\n          // Find a match without channels or codec\n          const withoutCodecAndChannelsMatch = findMatchingOption(\n            audioOption,\n            allAudioTracks,\n          );\n          if (withoutCodecAndChannelsMatch > -1) {\n            return allAudioTracks[withoutCodecAndChannelsMatch];\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  private setAudioTrack(newId: number): void {\n    const tracks = this.tracksInGroup;\n\n    // check if level idx is valid\n    if (newId < 0 || newId >= tracks.length) {\n      this.warn(`Invalid audio track id: ${newId}`);\n      return;\n    }\n\n    this.selectDefaultTrack = false;\n    const lastTrack = this.currentTrack;\n    const track = tracks[newId];\n    const trackLoaded = track.details && !track.details.live;\n    if (newId === this.trackId && track === lastTrack && trackLoaded) {\n      return;\n    }\n    this.log(\n      `Switching to audio-track ${newId} \"${track.name}\" lang:${track.lang} group:${track.groupId} channels:${track.channels}`,\n    );\n    this.trackId = newId;\n    this.currentTrack = track;\n    this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, { ...track });\n    // Do not reload track unless live\n    if (trackLoaded) {\n      return;\n    }\n    const hlsUrlParameters = this.switchParams(\n      track.url,\n      lastTrack?.details,\n      track.details,\n    );\n    this.loadPlaylist(hlsUrlParameters);\n  }\n\n  private findTrackId(currentTrack: MediaPlaylist | null): number {\n    const audioTracks = this.tracksInGroup;\n    for (let i = 0; i < audioTracks.length; i++) {\n      const track = audioTracks[i];\n      if (this.selectDefaultTrack && !track.default) {\n        continue;\n      }\n      if (\n        !currentTrack ||\n        matchesOption(currentTrack, track, audioMatchPredicate)\n      ) {\n        return i;\n      }\n    }\n    if (currentTrack) {\n      const { name, lang, assocLang, characteristics, audioCodec, channels } =\n        currentTrack;\n      for (let i = 0; i < audioTracks.length; i++) {\n        const track = audioTracks[i];\n        if (\n          matchesOption(\n            { name, lang, assocLang, characteristics, audioCodec, channels },\n            track,\n            audioMatchPredicate,\n          )\n        ) {\n          return i;\n        }\n      }\n      for (let i = 0; i < audioTracks.length; i++) {\n        const track = audioTracks[i];\n        if (\n          mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n            'LANGUAGE',\n            'ASSOC-LANGUAGE',\n            'CHARACTERISTICS',\n          ])\n        ) {\n          return i;\n        }\n      }\n      for (let i = 0; i < audioTracks.length; i++) {\n        const track = audioTracks[i];\n        if (\n          mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n            'LANGUAGE',\n          ])\n        ) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void {\n    super.loadPlaylist();\n    const audioTrack = this.currentTrack;\n    if (!this.shouldLoadPlaylist(audioTrack)) {\n      return;\n    }\n    // Do not load audio rendition with URI matching main variant URI\n    if (useAlternateAudio(audioTrack.url, this.hls)) {\n      this.scheduleLoading(audioTrack, hlsUrlParameters);\n    }\n  }\n\n  protected loadingPlaylist(\n    audioTrack: MediaPlaylist,\n    hlsUrlParameters: HlsUrlParameters | undefined,\n  ) {\n    super.loadingPlaylist(audioTrack, hlsUrlParameters);\n    const id = audioTrack.id;\n    const groupId = audioTrack.groupId as string;\n    const url = this.getUrlWithDirectives(audioTrack.url, hlsUrlParameters);\n    const details = audioTrack.details;\n    const age = details?.age;\n    this.log(\n      `Loading audio-track ${id} \"${audioTrack.name}\" lang:${audioTrack.lang} group:${groupId}${\n        hlsUrlParameters?.msn !== undefined\n          ? ' at sn ' + hlsUrlParameters.msn + ' part ' + hlsUrlParameters.part\n          : ''\n      }${age && details.live ? ' age ' + age.toFixed(1) + (details.type ? ' ' + details.type || '' : '') : ''} ${url}`,\n    );\n    this.hls.trigger(Events.AUDIO_TRACK_LOADING, {\n      url,\n      id,\n      groupId,\n      deliveryDirectives: hlsUrlParameters || null,\n      track: audioTrack,\n    });\n  }\n}\n\nexport default AudioTrackController;\n", "import type {\n  BufferOperation,\n  BufferOperationQueues,\n  SourceBufferName,\n  SourceBufferTrackSet,\n} from '../types/buffer';\n\nexport default class BufferOperationQueue {\n  private tracks: SourceBufferTrackSet | null;\n  private queues: BufferOperationQueues | null = {\n    video: [],\n    audio: [],\n    audiovideo: [],\n  };\n\n  constructor(sourceBufferReference: SourceBufferTrackSet) {\n    this.tracks = sourceBufferReference;\n  }\n\n  public destroy() {\n    this.tracks = this.queues = null;\n  }\n\n  public append(\n    operation: BufferOperation,\n    type: SourceBufferName,\n    pending?: boolean | undefined,\n  ) {\n    if (this.queues === null || this.tracks === null) {\n      return;\n    }\n    const queue = this.queues[type];\n    queue.push(operation);\n    if (queue.length === 1 && !pending) {\n      this.executeNext(type);\n    }\n  }\n\n  public appendBlocker(type: SourceBufferName): Promise<void> {\n    return new Promise((resolve) => {\n      const operation: BufferOperation = {\n        label: 'async-blocker',\n        execute: resolve,\n        onStart: () => {},\n        onComplete: () => {},\n        onError: () => {},\n      };\n      this.append(operation, type);\n    });\n  }\n\n  public prependBlocker(type: SourceBufferName): Promise<void> {\n    return new Promise((resolve) => {\n      if (this.queues) {\n        const operation: BufferOperation = {\n          label: 'async-blocker-prepend',\n          execute: resolve,\n          onStart: () => {},\n          onComplete: () => {},\n          onError: () => {},\n        };\n        this.queues[type].unshift(operation);\n      }\n    });\n  }\n\n  public removeBlockers() {\n    if (this.queues === null) {\n      return;\n    }\n    [this.queues.video, this.queues.audio, this.queues.audiovideo].forEach(\n      (queue) => {\n        const label = queue[0]?.label;\n        if (label === 'async-blocker' || label === 'async-blocker-prepend') {\n          queue[0].execute();\n          queue.splice(0, 1);\n        }\n      },\n    );\n  }\n\n  public unblockAudio(op: BufferOperation) {\n    if (this.queues === null) {\n      return;\n    }\n    const queue = this.queues.audio;\n    if (queue[0] === op) {\n      this.shiftAndExecuteNext('audio');\n    }\n  }\n\n  public executeNext(type: SourceBufferName) {\n    if (this.queues === null || this.tracks === null) {\n      return;\n    }\n    const queue = this.queues[type];\n    if (queue.length) {\n      const operation: BufferOperation = queue[0];\n      try {\n        // Operations are expected to result in an 'updateend' event being fired. If not, the queue will lock. Operations\n        // which do not end with this event must call _onSBUpdateEnd manually\n        operation.execute();\n      } catch (error) {\n        operation.onError(error);\n        if (this.queues === null || this.tracks === null) {\n          return;\n        }\n\n        // Only shift the current operation off, otherwise the updateend handler will do this for us\n        const sb = this.tracks[type]?.buffer;\n        if (!sb?.updating) {\n          this.shiftAndExecuteNext(type);\n        }\n      }\n    }\n  }\n\n  public shiftAndExecuteNext(type: SourceBufferName) {\n    if (this.queues === null) {\n      return;\n    }\n    this.queues[type].shift();\n    this.executeNext(type);\n  }\n\n  public current(type: SourceBufferName): BufferOperation | null {\n    return this.queues?.[type][0] || null;\n  }\n\n  public toString(): string {\n    const { queues, tracks } = this;\n    if (queues === null || tracks === null) {\n      return `<destroyed>`;\n    }\n    return `\n${this.list('video')}\n${this.list('audio')}\n${this.list('audiovideo')}}`;\n  }\n\n  public list(type: SourceBufferName): string {\n    return this.queues?.[type] || this.tracks?.[type]\n      ? `${type}: (${this.listSbInfo(type)}) ${this.listOps(type)}`\n      : '';\n  }\n\n  private listSbInfo(type: SourceBufferName): string {\n    const track = this.tracks?.[type];\n    const sb = track?.buffer;\n    if (!sb) {\n      return 'none';\n    }\n    return `SourceBuffer${sb.updating ? ' updating' : ''}${track.ended ? ' ended' : ''}${track.ending ? ' ending' : ''}`;\n  }\n\n  private listOps(type: SourceBufferName): string {\n    return this.queues?.[type].map((op) => op.label).join(', ') || '';\n  }\n}\n", "import BufferOperationQueue from './buffer-operation-queue';\nimport { createDoNothingErrorAction } from './error-controller';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { ElementaryStreamTypes } from '../loader/fragment';\nimport { PlaylistLevelType } from '../types/loader';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport {\n  areCodecsMediaSourceSupported,\n  getCodecCompatibleName,\n  pickMostCompleteCodecName,\n  replaceVideoCodec,\n} from '../utils/codecs';\nimport { Logger } from '../utils/logger';\nimport {\n  getMediaSource,\n  isCompatibleTrackChange,\n  isManagedMediaSource,\n} from '../utils/mediasource-helper';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type { HlsConfig } from '../config';\nimport type Hls from '../hls';\nimport type { MediaFragment, Part } from '../loader/fragment';\nimport type { LevelDetails } from '../loader/level-details';\nimport type {\n  AttachMediaSourceData,\n  BaseTrack,\n  BaseTrackSet,\n  BufferCreatedTrackSet,\n  BufferOperation,\n  EmptyTuple,\n  ExtendedSourceBuffer,\n  MediaOverrides,\n  ParsedTrack,\n  SourceBufferName,\n  SourceBuffersTuple,\n  SourceBufferTrack,\n  SourceBufferTrackSet,\n} from '../types/buffer';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  BufferAppendingData,\n  BufferCodecsData,\n  BufferEOSData,\n  BufferFlushingData,\n  ErrorData,\n  FragChangedData,\n  FragParsedData,\n  LevelUpdatedData,\n  ManifestParsedData,\n  MediaAttachingData,\n  MediaDetachingData,\n} from '../types/events';\nimport type { ChunkMetadata } from '../types/transmuxer';\n\ninterface BufferedChangeEvent extends Event {\n  readonly addedRanges?: TimeRanges;\n  readonly removedRanges?: TimeRanges;\n}\n\nconst VIDEO_CODEC_PROFILE_REPLACE =\n  /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\\.[^.,]+)+/;\n\nconst TRACK_REMOVED_ERROR_NAME = 'HlsJsTrackRemovedError';\n\nclass HlsJsTrackRemovedError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = TRACK_REMOVED_ERROR_NAME;\n  }\n}\n\nexport default class BufferController extends Logger implements ComponentAPI {\n  private hls: Hls;\n  private fragmentTracker: FragmentTracker;\n  // The level details used to determine duration, target-duration and live\n  private details: LevelDetails | null = null;\n  // cache the self generated object url to detect hijack of video tag\n  private _objectUrl: string | null = null;\n  // A queue of buffer operations which require the SourceBuffer to not be updating upon execution\n  private operationQueue: BufferOperationQueue | null = null;\n\n  // The total number track codecs expected before any sourceBuffers are created (2: audio and video or 1: audiovideo | audio | video)\n  private bufferCodecEventsTotal: number = 0;\n\n  // A reference to the attached media element\n  private media: HTMLMediaElement | null = null;\n\n  // A reference to the active media source\n  private mediaSource: MediaSource | null = null;\n\n  // Last MP3 audio chunk appended\n  private lastMpegAudioChunk: ChunkMetadata | null = null;\n\n  // Audio fragment blocked from appending until corresponding video appends or context changes\n  private blockedAudioAppend: {\n    op: BufferOperation;\n    frag: MediaFragment | Part;\n  } | null = null;\n  // Keep track of video append position for unblocking audio\n  private lastVideoAppendEnd: number = 0;\n  // Whether or not to use ManagedMediaSource API and append source element to media element.\n  private appendSource: boolean;\n  // Transferred MediaSource information used to detmerine if duration end endstream may be appended\n  private transferData?: MediaAttachingData;\n  // Directives used to override default MediaSource handling\n  private overrides?: MediaOverrides;\n  // Error counters\n  private appendErrors = {\n    audio: 0,\n    video: 0,\n    audiovideo: 0,\n  };\n  // Record of required or created buffers by type. SourceBuffer is stored in Track.buffer once created.\n  private tracks: SourceBufferTrackSet = {};\n  // Array of SourceBuffer type and SourceBuffer (or null). One entry per TrackSet in this.tracks.\n  private sourceBuffers: SourceBuffersTuple = [\n    [null, null],\n    [null, null],\n  ];\n\n  constructor(hls: Hls, fragmentTracker: FragmentTracker) {\n    super('buffer-controller', hls.logger);\n    this.hls = hls;\n    this.fragmentTracker = fragmentTracker;\n    this.appendSource = isManagedMediaSource(\n      getMediaSource(hls.config.preferManagedMediaSource),\n    );\n\n    this.initTracks();\n    this.registerListeners();\n  }\n\n  public hasSourceTypes(): boolean {\n    return Object.keys(this.tracks).length > 0;\n  }\n\n  public destroy() {\n    this.unregisterListeners();\n    this.details = null;\n    this.lastMpegAudioChunk = this.blockedAudioAppend = null;\n    this.transferData = this.overrides = undefined;\n    if (this.operationQueue) {\n      this.operationQueue.destroy();\n      this.operationQueue = null;\n    }\n    // @ts-ignore\n    this.hls = this.fragmentTracker = null;\n    // @ts-ignore\n    this._onMediaSourceOpen = this._onMediaSourceClose = null;\n    // @ts-ignore\n    this._onMediaSourceEnded = null;\n    // @ts-ignore\n    this._onStartStreaming = this._onEndStreaming = null;\n  }\n\n  private registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.on(Events.BUFFER_RESET, this.onBufferReset, this);\n    hls.on(Events.BUFFER_APPENDING, this.onBufferAppending, this);\n    hls.on(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n    hls.on(Events.BUFFER_EOS, this.onBufferEos, this);\n    hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    hls.on(Events.FRAG_PARSED, this.onFragParsed, this);\n    hls.on(Events.FRAG_CHANGED, this.onFragChanged, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  private unregisterListeners() {\n    const { hls } = this;\n    hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.off(Events.BUFFER_RESET, this.onBufferReset, this);\n    hls.off(Events.BUFFER_APPENDING, this.onBufferAppending, this);\n    hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n    hls.off(Events.BUFFER_EOS, this.onBufferEos, this);\n    hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    hls.off(Events.FRAG_PARSED, this.onFragParsed, this);\n    hls.off(Events.FRAG_CHANGED, this.onFragChanged, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  public transferMedia(): AttachMediaSourceData | null {\n    const { media, mediaSource } = this;\n    if (!media) {\n      return null;\n    }\n    const tracks = {};\n    if (this.operationQueue) {\n      const updating = this.isUpdating();\n      if (!updating) {\n        this.operationQueue.removeBlockers();\n      }\n      const queued = this.isQueued();\n      if (updating || queued) {\n        this.warn(\n          `Transfering MediaSource with${queued ? ' operations in queue' : ''}${updating ? ' updating SourceBuffer(s)' : ''} ${this.operationQueue}`,\n        );\n      }\n      this.operationQueue.destroy();\n    }\n    const transferData = this.transferData;\n    if (\n      !this.sourceBufferCount &&\n      transferData &&\n      transferData.mediaSource === mediaSource\n    ) {\n      Object.assign(tracks, transferData.tracks);\n    } else {\n      this.sourceBuffers.forEach((tuple) => {\n        const [type] = tuple;\n        if (type) {\n          tracks[type] = Object.assign({}, this.tracks[type]);\n          this.removeBuffer(type);\n        }\n        tuple[0] = tuple[1] = null;\n      });\n    }\n    return {\n      media,\n      mediaSource,\n      tracks,\n    };\n  }\n\n  private initTracks() {\n    const tracks = {};\n    this.sourceBuffers = [\n      [null, null],\n      [null, null],\n    ];\n    this.tracks = tracks;\n    this.resetQueue();\n    this.resetAppendErrors();\n    this.lastMpegAudioChunk = this.blockedAudioAppend = null;\n    this.lastVideoAppendEnd = 0;\n  }\n\n  private onManifestLoading() {\n    this.bufferCodecEventsTotal = 0;\n    this.details = null;\n  }\n\n  private onManifestParsed(\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ) {\n    // in case of alt audio 2 BUFFER_CODECS events will be triggered, one per stream controller\n    // sourcebuffers will be created all at once when the expected nb of tracks will be reached\n    // in case alt audio is not used, only one BUFFER_CODEC event will be fired from main stream controller\n    // it will contain the expected nb of source buffers, no need to compute it\n    let codecEvents: number = 2;\n    if ((data.audio && !data.video) || !data.altAudio) {\n      codecEvents = 1;\n    }\n    this.bufferCodecEventsTotal = codecEvents;\n    this.log(`${codecEvents} bufferCodec event(s) expected.`);\n    if (\n      this.transferData?.mediaSource &&\n      this.sourceBufferCount &&\n      codecEvents\n    ) {\n      this.bufferCreated();\n    }\n  }\n\n  private onMediaAttaching(\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ) {\n    const media = (this.media = data.media);\n    this.transferData = this.overrides = undefined;\n    const MediaSource = getMediaSource(this.appendSource);\n    if (MediaSource) {\n      const transferringMedia = !!data.mediaSource;\n      if (transferringMedia || data.overrides) {\n        this.transferData = data;\n        this.overrides = data.overrides;\n      }\n      const ms = (this.mediaSource = data.mediaSource || new MediaSource());\n      this.assignMediaSource(ms);\n      if (transferringMedia) {\n        this._objectUrl = media.src;\n        this.attachTransferred();\n      } else {\n        // cache the locally generated object url\n        const objectUrl = (this._objectUrl = self.URL.createObjectURL(ms));\n        // link video and media Source\n        if (this.appendSource) {\n          try {\n            media.removeAttribute('src');\n            // ManagedMediaSource will not open without disableRemotePlayback set to false or source alternatives\n            const MMS = (self as any).ManagedMediaSource;\n            media.disableRemotePlayback =\n              media.disableRemotePlayback || (MMS && ms instanceof MMS);\n            removeSourceChildren(media);\n            addSource(media, objectUrl);\n            media.load();\n          } catch (error) {\n            media.src = objectUrl;\n          }\n        } else {\n          media.src = objectUrl;\n        }\n      }\n      media.addEventListener('emptied', this._onMediaEmptied);\n    }\n  }\n\n  private assignMediaSource(ms: MediaSource) {\n    this.log(\n      `${this.transferData?.mediaSource === ms ? 'transferred' : 'created'} media source: ${(ms.constructor as any)?.name}`,\n    );\n    // MediaSource listeners are arrow functions with a lexical scope, and do not need to be bound\n    ms.addEventListener('sourceopen', this._onMediaSourceOpen);\n    ms.addEventListener('sourceended', this._onMediaSourceEnded);\n    ms.addEventListener('sourceclose', this._onMediaSourceClose);\n    if (this.appendSource) {\n      ms.addEventListener('startstreaming', this._onStartStreaming);\n      ms.addEventListener('endstreaming', this._onEndStreaming);\n    }\n  }\n\n  private attachTransferred() {\n    const media = this.media;\n    const data = this.transferData;\n    if (!data || !media) {\n      return;\n    }\n    const requiredTracks = this.tracks;\n    const transferredTracks = data.tracks;\n    const trackNames = transferredTracks\n      ? Object.keys(transferredTracks)\n      : null;\n    const trackCount = trackNames ? trackNames.length : 0;\n    const mediaSourceOpenCallback = () => {\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      Promise.resolve().then(() => {\n        if (this.media && this.mediaSourceOpenOrEnded) {\n          this._onMediaSourceOpen();\n        }\n      });\n    };\n    if (transferredTracks && trackNames && trackCount) {\n      if (!this.tracksReady) {\n        // Wait for CODECS event(s)\n        this.hls.config.startFragPrefetch = true;\n        this.log(`attachTransferred: waiting for SourceBuffer track info`);\n        return;\n      }\n      this\n        .log(`attachTransferred: (bufferCodecEventsTotal ${this.bufferCodecEventsTotal})\nrequired tracks: ${stringify(requiredTracks, (key, value) => (key === 'initSegment' ? undefined : value))};\ntransfer tracks: ${stringify(transferredTracks, (key, value) => (key === 'initSegment' ? undefined : value))}}`);\n      if (!isCompatibleTrackChange(transferredTracks, requiredTracks)) {\n        // destroy attaching media source\n        data.mediaSource = null;\n        data.tracks = undefined;\n\n        const currentTime = media.currentTime;\n\n        const details = this.details;\n        const startTime = Math.max(\n          currentTime,\n          details?.fragments[0].start || 0,\n        );\n        if (startTime - currentTime > 1) {\n          this.log(\n            `attachTransferred: waiting for playback to reach new tracks start time ${currentTime} -> ${startTime}`,\n          );\n          return;\n        }\n        this.warn(\n          `attachTransferred: resetting MediaSource for incompatible tracks (\"${Object.keys(transferredTracks)}\"->\"${Object.keys(requiredTracks)}\") start time: ${startTime} currentTime: ${currentTime}`,\n        );\n        this.onMediaDetaching(Events.MEDIA_DETACHING, {});\n        this.onMediaAttaching(Events.MEDIA_ATTACHING, data);\n        media.currentTime = startTime;\n        return;\n      }\n      this.transferData = undefined;\n      trackNames.forEach((trackName) => {\n        const type = trackName as SourceBufferName;\n        const track = transferredTracks[type];\n        if (track) {\n          const sb = track.buffer;\n          if (sb) {\n            // Purge fragment tracker of ejected segments for existing buffer\n            const fragmentTracker = this.fragmentTracker;\n            const playlistType = track.id as PlaylistLevelType;\n            if (\n              fragmentTracker.hasFragments(playlistType) ||\n              fragmentTracker.hasParts(playlistType)\n            ) {\n              const bufferedTimeRanges = BufferHelper.getBuffered(sb);\n              fragmentTracker.detectEvictedFragments(\n                type,\n                bufferedTimeRanges,\n                playlistType,\n                null,\n                true,\n              );\n            }\n            // Transfer SourceBuffer\n            const sbIndex = sourceBufferNameToIndex(type);\n            const sbTuple = [type, sb] as Exclude<\n              SourceBuffersTuple[typeof sbIndex],\n              EmptyTuple\n            >;\n            this.sourceBuffers[sbIndex] = sbTuple as any;\n            if (sb.updating && this.operationQueue) {\n              // eslint-disable-next-line @typescript-eslint/no-floating-promises\n              this.operationQueue.prependBlocker(type);\n            }\n            this.trackSourceBuffer(type, track);\n          }\n        }\n      });\n      mediaSourceOpenCallback();\n      this.bufferCreated();\n    } else {\n      this.log(`attachTransferred: MediaSource w/o SourceBuffers`);\n      mediaSourceOpenCallback();\n    }\n  }\n\n  private get mediaSourceOpenOrEnded(): boolean {\n    const readyState = this.mediaSource?.readyState;\n    return readyState === 'open' || readyState === 'ended';\n  }\n\n  private _onEndStreaming = (event) => {\n    if (!this.hls as any) {\n      return;\n    }\n    if (this.mediaSource?.readyState !== 'open') {\n      return;\n    }\n    this.hls.pauseBuffering();\n  };\n\n  private _onStartStreaming = (event) => {\n    if (!this.hls as any) {\n      return;\n    }\n    this.hls.resumeBuffering();\n  };\n\n  private onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    const transferringMedia = !!data.transferMedia;\n    this.transferData = this.overrides = undefined;\n    const { media, mediaSource, _objectUrl } = this;\n    if (mediaSource) {\n      this.log(\n        `media source ${transferringMedia ? 'transferring' : 'detaching'}`,\n      );\n      if (transferringMedia) {\n        // Detach SourceBuffers without removing from MediaSource\n        // and leave `tracks` (required SourceBuffers configuration)\n        this.sourceBuffers.forEach(([type]) => {\n          if (type) {\n            this.removeBuffer(type);\n          }\n        });\n        this.resetQueue();\n      } else {\n        if (this.mediaSourceOpenOrEnded) {\n          const open = mediaSource.readyState === 'open';\n          try {\n            const sourceBuffers = mediaSource.sourceBuffers;\n            for (let i = sourceBuffers.length; i--; ) {\n              if (open) {\n                sourceBuffers[i].abort();\n              }\n              mediaSource.removeSourceBuffer(sourceBuffers[i]);\n            }\n            if (open) {\n              // endOfStream could trigger exception if any sourcebuffer is in updating state\n              // we don't really care about checking sourcebuffer state here,\n              // as we are anyway detaching the MediaSource\n              // let's just avoid this exception to propagate\n              mediaSource.endOfStream();\n            }\n          } catch (err) {\n            this.warn(\n              `onMediaDetaching: ${err.message} while calling endOfStream`,\n            );\n          }\n        }\n        // Clean up the SourceBuffers by invoking onBufferReset\n        if (this.sourceBufferCount) {\n          this.onBufferReset();\n        }\n      }\n      mediaSource.removeEventListener('sourceopen', this._onMediaSourceOpen);\n      mediaSource.removeEventListener('sourceended', this._onMediaSourceEnded);\n      mediaSource.removeEventListener('sourceclose', this._onMediaSourceClose);\n      if (this.appendSource) {\n        mediaSource.removeEventListener(\n          'startstreaming',\n          this._onStartStreaming,\n        );\n        mediaSource.removeEventListener('endstreaming', this._onEndStreaming);\n      }\n\n      this.mediaSource = null;\n      this._objectUrl = null;\n    }\n\n    // Detach properly the MediaSource from the HTMLMediaElement as\n    // suggested in https://github.com/w3c/media-source/issues/53.\n    if (media) {\n      media.removeEventListener('emptied', this._onMediaEmptied);\n      if (!transferringMedia) {\n        if (_objectUrl) {\n          self.URL.revokeObjectURL(_objectUrl);\n        }\n\n        // clean up video tag src only if it's our own url. some external libraries might\n        // hijack the video tag and change its 'src' without destroying the Hls instance first\n        if (this.mediaSrc === _objectUrl) {\n          media.removeAttribute('src');\n          if (this.appendSource) {\n            removeSourceChildren(media);\n          }\n          media.load();\n        } else {\n          this.warn(\n            'media|source.src was changed by a third party - skip cleanup',\n          );\n        }\n      }\n      this.media = null;\n    }\n\n    this.hls.trigger(Events.MEDIA_DETACHED, data);\n  }\n\n  private onBufferReset() {\n    this.sourceBuffers.forEach(([type]) => {\n      if (type) {\n        this.resetBuffer(type);\n      }\n    });\n    this.initTracks();\n  }\n\n  private resetBuffer(type: SourceBufferName) {\n    const sb = this.tracks[type]?.buffer;\n    this.removeBuffer(type);\n    if (sb) {\n      try {\n        if (this.mediaSource?.sourceBuffers.length) {\n          this.mediaSource.removeSourceBuffer(sb);\n        }\n      } catch (err) {\n        this.warn(`onBufferReset ${type}`, err);\n      }\n    }\n    delete this.tracks[type];\n  }\n\n  private removeBuffer(type: SourceBufferName) {\n    this.removeBufferListeners(type);\n    this.sourceBuffers[sourceBufferNameToIndex(type)] = [null, null];\n    const track = this.tracks[type];\n    if (track) {\n      track.buffer = undefined;\n    }\n  }\n\n  private resetQueue() {\n    if (this.operationQueue) {\n      this.operationQueue.destroy();\n    }\n    this.operationQueue = new BufferOperationQueue(this.tracks);\n  }\n\n  private onBufferCodecs(event: Events.BUFFER_CODECS, data: BufferCodecsData) {\n    const tracks = this.tracks;\n    const trackNames = Object.keys(data);\n    this.log(\n      `BUFFER_CODECS: \"${trackNames}\" (current SB count ${this.sourceBufferCount})`,\n    );\n    const unmuxedToMuxed =\n      ('audiovideo' in data && (tracks.audio || tracks.video)) ||\n      (tracks.audiovideo && ('audio' in data || 'video' in data));\n    const muxedToUnmuxed =\n      !unmuxedToMuxed &&\n      this.sourceBufferCount &&\n      this.media &&\n      trackNames.some((sbName) => !tracks[sbName]);\n    if (unmuxedToMuxed || muxedToUnmuxed) {\n      this.warn(\n        `Unsupported transition between \"${Object.keys(tracks)}\" and \"${trackNames}\" SourceBuffers`,\n      );\n      // Do not add incompatible track ('audiovideo' <-> 'video'/'audio').\n      // Allow following onBufferAppending handle to trigger BUFFER_APPEND_ERROR.\n      // This will either be resolved by level switch or could be handled with recoverMediaError().\n      return;\n    }\n    trackNames.forEach((trackName: SourceBufferName) => {\n      const parsedTrack = data[trackName] as ParsedTrack;\n      const { id, codec, levelCodec, container, metadata, supplemental } =\n        parsedTrack;\n      let track = tracks[trackName];\n      const transferredTrack = this.transferData?.tracks?.[trackName];\n      const sbTrack = transferredTrack?.buffer ? transferredTrack : track;\n      const sbCodec = sbTrack?.pendingCodec || sbTrack?.codec;\n      const trackLevelCodec = sbTrack?.levelCodec;\n      if (!track) {\n        track = tracks[trackName] = {\n          buffer: undefined,\n          listeners: [],\n          codec,\n          supplemental,\n          container,\n          levelCodec,\n          metadata,\n          id,\n        };\n      }\n      // check if SourceBuffer codec needs to change\n      const currentCodecFull = pickMostCompleteCodecName(\n        sbCodec,\n        trackLevelCodec,\n      );\n      const currentCodec = currentCodecFull?.replace(\n        VIDEO_CODEC_PROFILE_REPLACE,\n        '$1',\n      );\n      let trackCodec = pickMostCompleteCodecName(codec, levelCodec);\n      const nextCodec = trackCodec?.replace(VIDEO_CODEC_PROFILE_REPLACE, '$1');\n      if (trackCodec && currentCodecFull && currentCodec !== nextCodec) {\n        if (trackName.slice(0, 5) === 'audio') {\n          trackCodec = getCodecCompatibleName(trackCodec, this.appendSource);\n        }\n        this.log(`switching codec ${sbCodec} to ${trackCodec}`);\n        if (trackCodec !== (track.pendingCodec || track.codec)) {\n          track.pendingCodec = trackCodec;\n        }\n        track.container = container;\n        this.appendChangeType(trackName, container, trackCodec);\n      }\n    });\n\n    if (this.tracksReady || this.sourceBufferCount) {\n      data.tracks = this.sourceBufferTracks;\n    }\n\n    // if sourcebuffers already created, do nothing ...\n    if (this.sourceBufferCount) {\n      return;\n    }\n\n    if (\n      this.bufferCodecEventsTotal > 1 &&\n      !this.tracks.video &&\n      !data.video &&\n      data.audio?.id === 'main'\n    ) {\n      // MVP is missing CODECS and only audio was found in main segment (#7524)\n      this.log(`Main audio-only`);\n      this.bufferCodecEventsTotal = 1;\n    }\n\n    if (this.mediaSourceOpenOrEnded) {\n      this.checkPendingTracks();\n    }\n  }\n\n  public get sourceBufferTracks(): BaseTrackSet {\n    return Object.keys(this.tracks).reduce((baseTracks: BaseTrackSet, type) => {\n      const track = this.tracks[type] as SourceBufferTrack;\n      baseTracks[type] = {\n        id: track.id,\n        container: track.container,\n        codec: track.codec,\n        levelCodec: track.levelCodec,\n      };\n      return baseTracks;\n    }, {});\n  }\n\n  private appendChangeType(\n    type: SourceBufferName,\n    container: string,\n    codec: string,\n  ) {\n    const mimeType = `${container};codecs=${codec}`;\n    const operation: BufferOperation = {\n      label: `change-type=${mimeType}`,\n      execute: () => {\n        const track = this.tracks[type];\n        if (track) {\n          const sb = track.buffer;\n          if (sb?.changeType) {\n            this.log(`changing ${type} sourceBuffer type to ${mimeType}`);\n            sb.changeType(mimeType);\n            track.codec = codec;\n            track.container = container;\n          }\n        }\n        this.shiftAndExecuteNext(type);\n      },\n      onStart: () => {},\n      onComplete: () => {},\n      onError: (error: Error) => {\n        this.warn(`Failed to change ${type} SourceBuffer type`, error);\n      },\n    };\n    this.append(operation, type, this.isPending(this.tracks[type]));\n  }\n\n  private blockAudio(partOrFrag: MediaFragment | Part) {\n    const pStart = partOrFrag.start;\n    const pTime = pStart + partOrFrag.duration * 0.05;\n    const atGap =\n      this.fragmentTracker.getAppendedFrag(pStart, PlaylistLevelType.MAIN)\n        ?.gap === true;\n    if (atGap) {\n      return;\n    }\n    const op: BufferOperation = {\n      label: 'block-audio',\n      execute: () => {\n        const videoTrack = this.tracks.video;\n        if (\n          this.lastVideoAppendEnd > pTime ||\n          (videoTrack?.buffer &&\n            BufferHelper.isBuffered(videoTrack.buffer, pTime)) ||\n          this.fragmentTracker.getAppendedFrag(pTime, PlaylistLevelType.MAIN)\n            ?.gap === true\n        ) {\n          this.blockedAudioAppend = null;\n          this.shiftAndExecuteNext('audio');\n        }\n      },\n      onStart: () => {},\n      onComplete: () => {},\n      onError: (error) => {\n        this.warn('Error executing block-audio operation', error);\n      },\n    };\n    this.blockedAudioAppend = { op, frag: partOrFrag };\n    this.append(op, 'audio', true);\n  }\n\n  private unblockAudio() {\n    const { blockedAudioAppend, operationQueue } = this;\n    if (blockedAudioAppend && operationQueue) {\n      this.blockedAudioAppend = null;\n      operationQueue.unblockAudio(blockedAudioAppend.op);\n    }\n  }\n\n  private onBufferAppending(\n    event: Events.BUFFER_APPENDING,\n    eventData: BufferAppendingData,\n  ) {\n    const { tracks } = this;\n    const { data, type, parent, frag, part, chunkMeta, offset } = eventData;\n    const chunkStats = chunkMeta.buffering[type];\n    const { sn, cc } = frag;\n    const bufferAppendingStart = self.performance.now();\n    chunkStats.start = bufferAppendingStart;\n    const fragBuffering = frag.stats.buffering;\n    const partBuffering = part ? part.stats.buffering : null;\n    if (fragBuffering.start === 0) {\n      fragBuffering.start = bufferAppendingStart;\n    }\n    if (partBuffering && partBuffering.start === 0) {\n      partBuffering.start = bufferAppendingStart;\n    }\n\n    // TODO: Only update timestampOffset when audio/mpeg fragment or part is not contiguous with previously appended\n    // Adjusting `SourceBuffer.timestampOffset` (desired point in the timeline where the next frames should be appended)\n    // in Chrome browser when we detect MPEG audio container and time delta between level PTS and `SourceBuffer.timestampOffset`\n    // is greater than 100ms (this is enough to handle seek for VOD or level change for LIVE videos).\n    // More info here: https://github.com/video-dev/hls.js/issues/332#issuecomment-257986486\n    const audioTrack = tracks.audio;\n    let checkTimestampOffset = false;\n    if (type === 'audio' && audioTrack?.container === 'audio/mpeg') {\n      checkTimestampOffset =\n        !this.lastMpegAudioChunk ||\n        chunkMeta.id === 1 ||\n        this.lastMpegAudioChunk.sn !== chunkMeta.sn;\n      this.lastMpegAudioChunk = chunkMeta;\n    }\n\n    // Block audio append until overlapping video append\n    const videoTrack = tracks.video;\n    const videoSb = videoTrack?.buffer;\n    if (videoSb && sn !== 'initSegment') {\n      const partOrFrag = part || (frag as MediaFragment);\n      const blockedAudioAppend = this.blockedAudioAppend;\n      if (\n        type === 'audio' &&\n        parent !== 'main' &&\n        !this.blockedAudioAppend &&\n        !(videoTrack.ending || videoTrack.ended)\n      ) {\n        const pStart = partOrFrag.start;\n        const pTime = pStart + partOrFrag.duration * 0.05;\n        const vbuffered = videoSb.buffered;\n        const vappending = this.currentOp('video');\n        if (!vbuffered.length && !vappending) {\n          // wait for video before appending audio\n          this.blockAudio(partOrFrag);\n        } else if (\n          !vappending &&\n          !BufferHelper.isBuffered(videoSb, pTime) &&\n          this.lastVideoAppendEnd < pTime\n        ) {\n          // audio is ahead of video\n          this.blockAudio(partOrFrag);\n        }\n      } else if (type === 'video') {\n        const videoAppendEnd = partOrFrag.end;\n        if (blockedAudioAppend) {\n          const audioStart = blockedAudioAppend.frag.start;\n          if (\n            videoAppendEnd > audioStart ||\n            videoAppendEnd < this.lastVideoAppendEnd ||\n            BufferHelper.isBuffered(videoSb, audioStart)\n          ) {\n            this.unblockAudio();\n          }\n        }\n        this.lastVideoAppendEnd = videoAppendEnd;\n      }\n    }\n\n    const fragStart = (part || frag).start;\n    const operation: BufferOperation = {\n      label: `append-${type}`,\n      execute: () => {\n        chunkStats.executeStart = self.performance.now();\n\n        const sb = this.tracks[type]?.buffer;\n        if (sb) {\n          if (checkTimestampOffset) {\n            this.updateTimestampOffset(sb, fragStart, 0.1, type, sn, cc);\n          } else if (offset !== undefined && Number.isFinite(offset)) {\n            this.updateTimestampOffset(sb, offset, 0.000001, type, sn, cc);\n          }\n        }\n        this.appendExecutor(data, type);\n      },\n      onStart: () => {\n        // logger.debug(`[buffer-controller]: ${type} SourceBuffer updatestart`);\n      },\n      onComplete: () => {\n        // logger.debug(`[buffer-controller]: ${type} SourceBuffer updateend`);\n        const end = self.performance.now();\n        chunkStats.executeEnd = chunkStats.end = end;\n        if (fragBuffering.first === 0) {\n          fragBuffering.first = end;\n        }\n        if (partBuffering && partBuffering.first === 0) {\n          partBuffering.first = end;\n        }\n\n        const timeRanges = {};\n        this.sourceBuffers.forEach(([type, sb]) => {\n          if (type) {\n            timeRanges[type] = BufferHelper.getBuffered(sb);\n          }\n        });\n        this.appendErrors[type] = 0;\n        if (type === 'audio' || type === 'video') {\n          this.appendErrors.audiovideo = 0;\n        } else {\n          this.appendErrors.audio = 0;\n          this.appendErrors.video = 0;\n        }\n        this.hls.trigger(Events.BUFFER_APPENDED, {\n          type,\n          frag,\n          part,\n          chunkMeta,\n          parent: frag.type,\n          timeRanges,\n        });\n      },\n      onError: (error: Error) => {\n        // in case any error occured while appending, put back segment in segments table\n        const event: ErrorData = {\n          type: ErrorTypes.MEDIA_ERROR,\n          parent: frag.type,\n          details: ErrorDetails.BUFFER_APPEND_ERROR,\n          sourceBufferName: type,\n          frag,\n          part,\n          chunkMeta,\n          error,\n          err: error,\n          fatal: false,\n        };\n        const mediaError = this.media?.error;\n        if (\n          (error as DOMException).code === DOMException.QUOTA_EXCEEDED_ERR ||\n          error.name == 'QuotaExceededError' ||\n          `quota` in error\n        ) {\n          // QuotaExceededError: http://www.w3.org/TR/html5/infrastructure.html#quotaexceedederror\n          // let's stop appending any segments, and report BUFFER_FULL_ERROR error\n          event.details = ErrorDetails.BUFFER_FULL_ERROR;\n        } else if (\n          (error as DOMException).code === DOMException.INVALID_STATE_ERR &&\n          this.mediaSourceOpenOrEnded &&\n          !mediaError\n        ) {\n          // Allow retry for \"Failed to execute 'appendBuffer' on 'SourceBuffer': This SourceBuffer is still processing\" errors\n          event.errorAction = createDoNothingErrorAction(true);\n        } else if (\n          error.name === TRACK_REMOVED_ERROR_NAME &&\n          this.sourceBufferCount === 0\n        ) {\n          // Do nothing if sourceBuffers were removed (media is detached and append was not aborted)\n          event.errorAction = createDoNothingErrorAction(true);\n        } else {\n          const appendErrorCount = ++this.appendErrors[type];\n          /* with UHD content, we could get loop of quota exceeded error until\n            browser is able to evict some data from sourcebuffer. Retrying can help recover.\n          */\n          this.warn(\n            `Failed ${appendErrorCount}/${this.hls.config.appendErrorMaxRetry} times to append segment in \"${type}\" sourceBuffer (${mediaError ? mediaError : 'no media error'})`,\n          );\n          if (\n            appendErrorCount >= this.hls.config.appendErrorMaxRetry ||\n            !!mediaError\n          ) {\n            event.fatal = true;\n          }\n        }\n        this.hls.trigger(Events.ERROR, event);\n      },\n    };\n    this.log(\n      `queuing \"${type}\" append sn: ${sn}${part ? ' p: ' + part.index : ''} of ${frag.type === PlaylistLevelType.MAIN ? 'level' : 'track'} ${frag.level} cc: ${cc}`,\n    );\n    this.append(operation, type, this.isPending(this.tracks[type]));\n  }\n\n  private getFlushOp(\n    type: SourceBufferName,\n    start: number,\n    end: number,\n  ): BufferOperation {\n    this.log(`queuing \"${type}\" remove ${start}-${end}`);\n    return {\n      label: 'remove',\n      execute: () => {\n        this.removeExecutor(type, start, end);\n      },\n      onStart: () => {\n        // logger.debug(`[buffer-controller]: Started flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`);\n      },\n      onComplete: () => {\n        // logger.debug(`[buffer-controller]: Finished flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`);\n        this.hls.trigger(Events.BUFFER_FLUSHED, { type });\n      },\n      onError: (error: Error) => {\n        this.warn(\n          `Failed to remove ${start}-${end} from \"${type}\" SourceBuffer`,\n          error,\n        );\n      },\n    };\n  }\n\n  private onBufferFlushing(\n    event: Events.BUFFER_FLUSHING,\n    data: BufferFlushingData,\n  ) {\n    const { type, startOffset, endOffset } = data;\n    if (type) {\n      this.append(this.getFlushOp(type, startOffset, endOffset), type);\n    } else {\n      this.sourceBuffers.forEach(([type]) => {\n        if (type) {\n          this.append(this.getFlushOp(type, startOffset, endOffset), type);\n        }\n      });\n    }\n  }\n\n  private onFragParsed(event: Events.FRAG_PARSED, data: FragParsedData) {\n    const { frag, part } = data;\n    const buffersAppendedTo: SourceBufferName[] = [];\n    const elementaryStreams = part\n      ? part.elementaryStreams\n      : frag.elementaryStreams;\n    if (elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO]) {\n      buffersAppendedTo.push('audiovideo');\n    } else {\n      if (elementaryStreams[ElementaryStreamTypes.AUDIO]) {\n        buffersAppendedTo.push('audio');\n      }\n      if (elementaryStreams[ElementaryStreamTypes.VIDEO]) {\n        buffersAppendedTo.push('video');\n      }\n    }\n\n    const onUnblocked = () => {\n      const now = self.performance.now();\n      frag.stats.buffering.end = now;\n      if (part) {\n        part.stats.buffering.end = now;\n      }\n      const stats = part ? part.stats : frag.stats;\n      this.hls.trigger(Events.FRAG_BUFFERED, {\n        frag,\n        part,\n        stats,\n        id: frag.type,\n      });\n    };\n\n    if (buffersAppendedTo.length === 0) {\n      this.warn(\n        `Fragments must have at least one ElementaryStreamType set. type: ${frag.type} level: ${frag.level} sn: ${frag.sn}`,\n      );\n    }\n\n    this.blockBuffers(onUnblocked, buffersAppendedTo).catch((error) => {\n      this.warn(`Fragment buffered callback ${error}`);\n      this.stepOperationQueue(this.sourceBufferTypes);\n    });\n  }\n\n  private onFragChanged(event: Events.FRAG_CHANGED, data: FragChangedData) {\n    this.trimBuffers();\n  }\n\n  public get bufferedToEnd(): boolean {\n    return (\n      this.sourceBufferCount > 0 &&\n      !this.sourceBuffers.some(([type]) => {\n        if (type) {\n          const track = this.tracks[type];\n          if (track) {\n            return !track.ended || track.ending;\n          }\n        }\n        return false;\n      })\n    );\n  }\n\n  // on BUFFER_EOS mark matching sourcebuffer(s) as \"ending\" and \"ended\" and queue endOfStream after remaining operations(s)\n  // an undefined data.type will mark all buffers as EOS.\n  private onBufferEos(event: Events.BUFFER_EOS, data: BufferEOSData) {\n    this.sourceBuffers.forEach(([type]) => {\n      if (type) {\n        const track = this.tracks[type] as SourceBufferTrack;\n        if (!data.type || data.type === type) {\n          track.ending = true;\n          if (!track.ended) {\n            track.ended = true;\n            this.log(`${type} buffer reached EOS`);\n          }\n        }\n      }\n    });\n\n    const allowEndOfStream = this.overrides?.endOfStream !== false;\n    const allTracksEnding =\n      this.sourceBufferCount > 0 &&\n      !this.sourceBuffers.some(([type]) => type && !this.tracks[type]?.ended);\n\n    if (allTracksEnding) {\n      if (allowEndOfStream) {\n        this.log(`Queueing EOS`);\n        this.blockUntilOpen(() => {\n          this.tracksEnded();\n          const { mediaSource } = this;\n          if (!mediaSource || mediaSource.readyState !== 'open') {\n            if (mediaSource) {\n              this.log(\n                `Could not call mediaSource.endOfStream(). mediaSource.readyState: ${mediaSource.readyState}`,\n              );\n            }\n            return;\n          }\n          this.log(`Calling mediaSource.endOfStream()`);\n          // Allow this to throw and be caught by the enqueueing function\n          mediaSource.endOfStream();\n\n          this.hls.trigger(Events.BUFFERED_TO_END, undefined);\n        });\n      } else {\n        this.tracksEnded();\n        this.hls.trigger(Events.BUFFERED_TO_END, undefined);\n      }\n    } else if (data.type === 'video') {\n      // Make sure pending audio appends are unblocked when video reaches end\n      this.unblockAudio();\n    }\n  }\n\n  private tracksEnded() {\n    this.sourceBuffers.forEach(([type]) => {\n      if (type !== null) {\n        const track = this.tracks[type];\n        if (track) {\n          track.ending = false;\n        }\n      }\n    });\n  }\n\n  private onLevelUpdated(\n    event: Events.LEVEL_UPDATED,\n    { details }: LevelUpdatedData,\n  ) {\n    if (!details.fragments.length) {\n      return;\n    }\n    this.details = details;\n    this.updateDuration();\n  }\n\n  private updateDuration() {\n    this.blockUntilOpen(() => {\n      const durationAndRange = this.getDurationAndRange();\n      if (!durationAndRange) {\n        return;\n      }\n      this.updateMediaSource(durationAndRange);\n    });\n  }\n\n  private onError(event: Events.ERROR, data: ErrorData) {\n    if (data.details === ErrorDetails.BUFFER_APPEND_ERROR && data.frag) {\n      const nextAutoLevel = data.errorAction?.nextAutoLevel;\n      if (Number.isFinite(nextAutoLevel) && nextAutoLevel !== data.frag.level) {\n        this.resetAppendErrors();\n      }\n    }\n  }\n\n  private resetAppendErrors() {\n    this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0,\n    };\n  }\n\n  private trimBuffers() {\n    const { hls, details, media } = this;\n    if (!media || details === null) {\n      return;\n    }\n\n    if (!this.sourceBufferCount) {\n      return;\n    }\n\n    const config: Readonly<HlsConfig> = hls.config;\n    const currentTime = media.currentTime;\n    const targetDuration = details.levelTargetDuration;\n\n    // Support for deprecated liveBackBufferLength\n    const backBufferLength =\n      details.live && config.liveBackBufferLength !== null\n        ? config.liveBackBufferLength\n        : config.backBufferLength;\n\n    if (Number.isFinite(backBufferLength) && backBufferLength >= 0) {\n      const maxBackBufferLength = Math.max(backBufferLength, targetDuration);\n      const targetBackBufferPosition =\n        Math.floor(currentTime / targetDuration) * targetDuration -\n        maxBackBufferLength;\n\n      this.flushBackBuffer(\n        currentTime,\n        targetDuration,\n        targetBackBufferPosition,\n      );\n    }\n\n    const frontBufferFlushThreshold = config.frontBufferFlushThreshold;\n    if (\n      Number.isFinite(frontBufferFlushThreshold) &&\n      frontBufferFlushThreshold > 0\n    ) {\n      const frontBufferLength = Math.max(\n        config.maxBufferLength,\n        frontBufferFlushThreshold,\n      );\n\n      const maxFrontBufferLength = Math.max(frontBufferLength, targetDuration);\n      const targetFrontBufferPosition =\n        Math.floor(currentTime / targetDuration) * targetDuration +\n        maxFrontBufferLength;\n\n      this.flushFrontBuffer(\n        currentTime,\n        targetDuration,\n        targetFrontBufferPosition,\n      );\n    }\n  }\n\n  private flushBackBuffer(\n    currentTime: number,\n    targetDuration: number,\n    targetBackBufferPosition: number,\n  ) {\n    this.sourceBuffers.forEach(([type, sb]) => {\n      if (sb) {\n        const buffered = BufferHelper.getBuffered(sb);\n        // when target buffer start exceeds actual buffer start\n        if (\n          buffered.length > 0 &&\n          targetBackBufferPosition > buffered.start(0)\n        ) {\n          this.hls.trigger(Events.BACK_BUFFER_REACHED, {\n            bufferEnd: targetBackBufferPosition,\n          });\n\n          // Support for deprecated event:\n          const track = this.tracks[type];\n          if (this.details?.live) {\n            this.hls.trigger(Events.LIVE_BACK_BUFFER_REACHED, {\n              bufferEnd: targetBackBufferPosition,\n            });\n          } else if (track?.ended) {\n            this.log(\n              `Cannot flush ${type} back buffer while SourceBuffer is in ended state`,\n            );\n            return;\n          }\n\n          this.hls.trigger(Events.BUFFER_FLUSHING, {\n            startOffset: 0,\n            endOffset: targetBackBufferPosition,\n            type,\n          });\n        }\n      }\n    });\n  }\n\n  private flushFrontBuffer(\n    currentTime: number,\n    targetDuration: number,\n    targetFrontBufferPosition: number,\n  ) {\n    this.sourceBuffers.forEach(([type, sb]) => {\n      if (sb) {\n        const buffered = BufferHelper.getBuffered(sb);\n        const numBufferedRanges = buffered.length;\n        // The buffer is either empty or contiguous\n        if (numBufferedRanges < 2) {\n          return;\n        }\n        const bufferStart = buffered.start(numBufferedRanges - 1);\n        const bufferEnd = buffered.end(numBufferedRanges - 1);\n        // No flush if we can tolerate the current buffer length or the current buffer range we would flush is contiguous with current position\n        if (\n          targetFrontBufferPosition > bufferStart ||\n          (currentTime >= bufferStart && currentTime <= bufferEnd)\n        ) {\n          return;\n        }\n\n        this.hls.trigger(Events.BUFFER_FLUSHING, {\n          startOffset: bufferStart,\n          endOffset: Infinity,\n          type,\n        });\n      }\n    });\n  }\n\n  /**\n   * Update Media Source duration to current level duration or override to Infinity if configuration parameter\n   * 'liveDurationInfinity` is set to `true`\n   * More details: https://github.com/video-dev/hls.js/issues/355\n   */\n  private getDurationAndRange(): {\n    duration: number;\n    start?: number;\n    end?: number;\n  } | null {\n    const { details, mediaSource } = this;\n    if (!details || !this.media || mediaSource?.readyState !== 'open') {\n      return null;\n    }\n    const playlistEnd = details.edge;\n    if (details.live && this.hls.config.liveDurationInfinity) {\n      const len = details.fragments.length;\n      if (len && !!(mediaSource as any).setLiveSeekableRange) {\n        const start = Math.max(0, details.fragmentStart);\n        const end = Math.max(start, playlistEnd);\n\n        return { duration: Infinity, start, end };\n      }\n      return { duration: Infinity };\n    }\n    const overrideDuration = this.overrides?.duration;\n    if (overrideDuration) {\n      if (!Number.isFinite(overrideDuration)) {\n        return null;\n      }\n      return { duration: overrideDuration };\n    }\n    const mediaDuration = this.media.duration;\n    const msDuration = Number.isFinite(mediaSource.duration)\n      ? mediaSource.duration\n      : 0;\n    if (\n      (playlistEnd > msDuration && playlistEnd > mediaDuration) ||\n      !Number.isFinite(mediaDuration)\n    ) {\n      return { duration: playlistEnd };\n    }\n    return null;\n  }\n\n  private updateMediaSource({\n    duration,\n    start,\n    end,\n  }: {\n    duration: number;\n    start?: number;\n    end?: number;\n  }) {\n    const mediaSource = this.mediaSource;\n    if (!this.media || !mediaSource || mediaSource.readyState !== 'open') {\n      return;\n    }\n    if (mediaSource.duration !== duration) {\n      if (Number.isFinite(duration)) {\n        this.log(`Updating MediaSource duration to ${duration.toFixed(3)}`);\n      }\n      mediaSource.duration = duration;\n    }\n    if (start !== undefined && end !== undefined) {\n      this.log(\n        `MediaSource duration is set to ${mediaSource.duration}. Setting seekable range to ${start}-${end}.`,\n      );\n      mediaSource.setLiveSeekableRange(start, end);\n    }\n  }\n\n  private get tracksReady(): boolean {\n    const pendingTrackCount = this.pendingTrackCount;\n    return (\n      pendingTrackCount > 0 &&\n      (pendingTrackCount >= this.bufferCodecEventsTotal ||\n        this.isPending(this.tracks.audiovideo))\n    );\n  }\n\n  private checkPendingTracks() {\n    const { bufferCodecEventsTotal, pendingTrackCount, tracks } = this;\n    this.log(\n      `checkPendingTracks (pending: ${pendingTrackCount} codec events expected: ${bufferCodecEventsTotal}) ${stringify(tracks)}`,\n    );\n    // Check if we've received all of the expected bufferCodec events. When none remain, create all the sourceBuffers at once.\n    // This is important because the MSE spec allows implementations to throw QuotaExceededErrors if creating new sourceBuffers after\n    // data has been appended to existing ones.\n    // 2 tracks is the max (one for audio, one for video). If we've reach this max go ahead and create the buffers.\n    if (this.tracksReady) {\n      const transferredTracks = this.transferData?.tracks;\n      if (transferredTracks && Object.keys(transferredTracks).length) {\n        this.attachTransferred();\n      } else {\n        // ok, let's create them now !\n        this.createSourceBuffers();\n      }\n    }\n  }\n\n  private bufferCreated() {\n    if (this.sourceBufferCount) {\n      const tracks: BufferCreatedTrackSet = {};\n      this.sourceBuffers.forEach(([type, buffer]) => {\n        if (type) {\n          const track = this.tracks[type] as SourceBufferTrack;\n          tracks[type] = {\n            buffer,\n            container: track.container,\n            codec: track.codec,\n            supplemental: track.supplemental,\n            levelCodec: track.levelCodec,\n            id: track.id,\n            metadata: track.metadata,\n          };\n        }\n      });\n      this.hls.trigger(Events.BUFFER_CREATED, {\n        tracks,\n      });\n      this.log(`SourceBuffers created. Running queue: ${this.operationQueue}`);\n      this.sourceBuffers.forEach(([type]) => {\n        this.executeNext(type);\n      });\n    } else {\n      const error = new Error(\n        'could not create source buffer for media codec(s)',\n      );\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n        fatal: true,\n        error,\n        reason: error.message,\n      });\n    }\n  }\n\n  private createSourceBuffers() {\n    const { tracks, sourceBuffers, mediaSource } = this;\n    if (!mediaSource) {\n      throw new Error('createSourceBuffers called when mediaSource was null');\n    }\n\n    for (const trackName in tracks) {\n      const type = trackName as SourceBufferName;\n      const track = tracks[type];\n      if (this.isPending(track)) {\n        const codec = this.getTrackCodec(track, type);\n        const mimeType = `${track.container};codecs=${codec}`;\n        track.codec = codec;\n        this.log(\n          `creating sourceBuffer(${mimeType})${this.currentOp(type) ? ' Queued' : ''} ${stringify(track)}`,\n        );\n        try {\n          const sb = mediaSource.addSourceBuffer(\n            mimeType,\n          ) as ExtendedSourceBuffer;\n          const sbIndex = sourceBufferNameToIndex(type);\n          const sbTuple = [type, sb] as Exclude<\n            SourceBuffersTuple[typeof sbIndex],\n            EmptyTuple\n          >;\n          sourceBuffers[sbIndex] = sbTuple as any;\n          track.buffer = sb;\n        } catch (error) {\n          this.error(\n            `error while trying to add sourceBuffer: ${error.message}`,\n          );\n          // remove init segment from queue and delete track info\n          this.shiftAndExecuteNext(type);\n          this.operationQueue?.removeBlockers();\n          delete this.tracks[type];\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.BUFFER_ADD_CODEC_ERROR,\n            fatal: false,\n            error,\n            sourceBufferName: type,\n            mimeType: mimeType,\n            parent: track.id as PlaylistLevelType,\n          });\n          return;\n        }\n        this.trackSourceBuffer(type, track);\n      }\n    }\n    this.bufferCreated();\n  }\n\n  private getTrackCodec(track: BaseTrack, trackName: SourceBufferName): string {\n    // Use supplemental video codec when supported when adding SourceBuffer (#5558)\n    const supplementalCodec = track.supplemental;\n    let trackCodec = track.codec;\n    if (\n      supplementalCodec &&\n      (trackName === 'video' || trackName === 'audiovideo') &&\n      areCodecsMediaSourceSupported(supplementalCodec, 'video')\n    ) {\n      trackCodec = replaceVideoCodec(trackCodec, supplementalCodec);\n    }\n    const codec = pickMostCompleteCodecName(trackCodec, track.levelCodec);\n    if (codec) {\n      if (trackName.slice(0, 5) === 'audio') {\n        return getCodecCompatibleName(codec, this.appendSource);\n      }\n      return codec;\n    }\n    return '';\n  }\n\n  private trackSourceBuffer(type: SourceBufferName, track: SourceBufferTrack) {\n    const buffer = track.buffer;\n    if (!buffer) {\n      return;\n    }\n    const codec = this.getTrackCodec(track, type);\n    this.tracks[type] = {\n      buffer,\n      codec,\n      container: track.container,\n      levelCodec: track.levelCodec,\n      supplemental: track.supplemental,\n      metadata: track.metadata,\n      id: track.id,\n      listeners: [],\n    };\n    this.removeBufferListeners(type);\n    this.addBufferListener(type, 'updatestart', this.onSBUpdateStart);\n    this.addBufferListener(type, 'updateend', this.onSBUpdateEnd);\n    this.addBufferListener(type, 'error', this.onSBUpdateError);\n    // ManagedSourceBuffer bufferedchange event\n    if (this.appendSource) {\n      this.addBufferListener(\n        type,\n        'bufferedchange',\n        (type: SourceBufferName, event: BufferedChangeEvent) => {\n          // If media was ejected check for a change. Added ranges are redundant with changes on 'updateend' event.\n          const removedRanges = event.removedRanges;\n          if (removedRanges?.length) {\n            this.hls.trigger(Events.BUFFER_FLUSHED, {\n              type: type,\n            });\n          }\n        },\n      );\n    }\n  }\n\n  // Keep as arrow functions so that we can directly reference these functions directly as event listeners\n  private _onMediaSourceOpen = (e?: Event) => {\n    const { media, mediaSource } = this;\n    if (e) {\n      this.log('Media source opened');\n    }\n    if (!media || !mediaSource) {\n      return;\n    }\n    // once received, don't listen anymore to sourceopen event\n    mediaSource.removeEventListener('sourceopen', this._onMediaSourceOpen);\n    media.removeEventListener('emptied', this._onMediaEmptied);\n    this.updateDuration();\n    this.hls.trigger(Events.MEDIA_ATTACHED, {\n      media,\n      mediaSource: mediaSource as MediaSource,\n    });\n\n    if (this.mediaSource !== null) {\n      this.checkPendingTracks();\n    }\n  };\n\n  private _onMediaSourceClose = () => {\n    this.log('Media source closed');\n  };\n\n  private _onMediaSourceEnded = () => {\n    this.log('Media source ended');\n  };\n\n  private _onMediaEmptied = () => {\n    const { mediaSrc, _objectUrl } = this;\n    if (mediaSrc !== _objectUrl) {\n      this.error(\n        `Media element src was set while attaching MediaSource (${_objectUrl} > ${mediaSrc})`,\n      );\n    }\n  };\n\n  private get mediaSrc(): string | undefined {\n    const media = (this.media?.querySelector as any)?.('source') || this.media;\n    return media?.src;\n  }\n\n  private onSBUpdateStart(type: SourceBufferName) {\n    const operation = this.currentOp(type);\n    if (!operation) {\n      return;\n    }\n    operation.onStart();\n  }\n\n  private onSBUpdateEnd(type: SourceBufferName) {\n    if (this.mediaSource?.readyState === 'closed') {\n      this.resetBuffer(type);\n      return;\n    }\n    const operation = this.currentOp(type);\n    if (!operation) {\n      return;\n    }\n    operation.onComplete();\n    this.shiftAndExecuteNext(type);\n  }\n\n  private onSBUpdateError(type: SourceBufferName, event: Event) {\n    const error = new Error(\n      `${type} SourceBuffer error. MediaSource readyState: ${this.mediaSource?.readyState}`,\n    );\n    this.error(`${error}`, event);\n    // according to http://www.w3.org/TR/media-source/#sourcebuffer-append-error\n    // SourceBuffer errors are not necessarily fatal; if so, the HTMLMediaElement will fire an error event\n    this.hls.trigger(Events.ERROR, {\n      type: ErrorTypes.MEDIA_ERROR,\n      details: ErrorDetails.BUFFER_APPENDING_ERROR,\n      sourceBufferName: type,\n      error,\n      fatal: false,\n    });\n    // updateend is always fired after error, so we'll allow that to shift the current operation off of the queue\n    const operation = this.currentOp(type);\n    if (operation) {\n      operation.onError(error);\n    }\n  }\n\n  private updateTimestampOffset(\n    sb: ExtendedSourceBuffer,\n    timestampOffset: number,\n    tolerance: number,\n    type: SourceBufferName,\n    sn: number | 'initSegment',\n    cc: number,\n  ) {\n    const delta = timestampOffset - sb.timestampOffset;\n    if (Math.abs(delta) >= tolerance) {\n      this.log(\n        `Updating ${type} SourceBuffer timestampOffset to ${timestampOffset} (sn: ${sn} cc: ${cc})`,\n      );\n      sb.timestampOffset = timestampOffset;\n    }\n  }\n\n  // This method must result in an updateend event; if remove is not called, onSBUpdateEnd must be called manually\n  private removeExecutor(\n    type: SourceBufferName,\n    startOffset: number,\n    endOffset: number,\n  ) {\n    const { media, mediaSource } = this;\n    const track = this.tracks[type];\n    const sb = track?.buffer;\n    if (!media || !mediaSource || !sb) {\n      this.warn(\n        `Attempting to remove from the ${type} SourceBuffer, but it does not exist`,\n      );\n      this.shiftAndExecuteNext(type);\n      return;\n    }\n    const mediaDuration = Number.isFinite(media.duration)\n      ? media.duration\n      : Infinity;\n    const msDuration = Number.isFinite(mediaSource.duration)\n      ? mediaSource.duration\n      : Infinity;\n    const removeStart = Math.max(0, startOffset);\n    const removeEnd = Math.min(endOffset, mediaDuration, msDuration);\n    if (removeEnd > removeStart && (!track.ending || track.ended)) {\n      track.ended = false;\n      this.log(\n        `Removing [${removeStart},${removeEnd}] from the ${type} SourceBuffer`,\n      );\n      sb.remove(removeStart, removeEnd);\n    } else {\n      // Cycle the queue\n      this.shiftAndExecuteNext(type);\n    }\n  }\n\n  // This method must result in an updateend event; if append is not called, onSBUpdateEnd must be called manually\n  private appendExecutor(\n    data: Uint8Array<ArrayBuffer>,\n    type: SourceBufferName,\n  ) {\n    const track = this.tracks[type];\n    const sb = track?.buffer;\n    if (!sb) {\n      throw new HlsJsTrackRemovedError(\n        `Attempting to append to the ${type} SourceBuffer, but it does not exist`,\n      );\n    }\n    track.ending = false;\n    track.ended = false;\n    sb.appendBuffer(data);\n  }\n\n  private blockUntilOpen(callback: () => void) {\n    if (this.isUpdating() || this.isQueued()) {\n      this.blockBuffers(callback).catch((error) => {\n        this.warn(`SourceBuffer blocked callback ${error}`);\n        this.stepOperationQueue(this.sourceBufferTypes);\n      });\n    } else {\n      try {\n        callback();\n      } catch (error) {\n        this.warn(\n          `Callback run without blocking ${this.operationQueue} ${error}`,\n        );\n      }\n    }\n  }\n\n  private isUpdating(): boolean {\n    return this.sourceBuffers.some(([type, sb]) => type && sb.updating);\n  }\n\n  private isQueued(): boolean {\n    return this.sourceBuffers.some(([type]) => type && !!this.currentOp(type));\n  }\n\n  private isPending(\n    track: SourceBufferTrack | undefined,\n  ): track is SourceBufferTrack {\n    return !!track && !track.buffer;\n  }\n\n  // Enqueues an operation to each SourceBuffer queue which, upon execution, resolves a promise. When all promises\n  // resolve, the onUnblocked function is executed. Functions calling this method do not need to unblock the queue\n  // upon completion, since we already do it here\n  private blockBuffers(\n    onUnblocked: () => void,\n    bufferNames: SourceBufferName[] = this.sourceBufferTypes,\n  ): Promise<void> {\n    if (!bufferNames.length) {\n      this.log('Blocking operation requested, but no SourceBuffers exist');\n      return Promise.resolve().then(onUnblocked);\n    }\n    const { operationQueue } = this;\n\n    // logger.debug(`[buffer-controller]: Blocking ${buffers} SourceBuffer`);\n    const blockingOperations = bufferNames.map((type) =>\n      this.appendBlocker(type),\n    );\n    const audioBlocked = bufferNames.length > 1 && !!this.blockedAudioAppend;\n    if (audioBlocked) {\n      this.unblockAudio();\n    }\n    return Promise.all(blockingOperations).then((result) => {\n      if (operationQueue !== this.operationQueue) {\n        return;\n      }\n      // logger.debug(`[buffer-controller]: Blocking operation resolved; unblocking ${buffers} SourceBuffer`);\n      onUnblocked();\n      this.stepOperationQueue(this.sourceBufferTypes);\n    });\n  }\n\n  private stepOperationQueue(bufferNames: SourceBufferName[]) {\n    bufferNames.forEach((type) => {\n      const sb = this.tracks[type]?.buffer;\n      // Only cycle the queue if the SB is not updating. There's a bug in Chrome which sets the SB updating flag to\n      // true when changing the MediaSource duration (https://bugs.chromium.org/p/chromium/issues/detail?id=959359&can=2&q=mediasource%20duration)\n      // While this is a workaround, it's probably useful to have around\n      if (!sb || sb.updating) {\n        return;\n      }\n      this.shiftAndExecuteNext(type);\n    });\n  }\n\n  private append(\n    operation: BufferOperation,\n    type: SourceBufferName,\n    pending?: boolean,\n  ) {\n    if (this.operationQueue) {\n      this.operationQueue.append(operation, type, pending);\n    }\n  }\n\n  private appendBlocker(type: SourceBufferName): Promise<void> | undefined {\n    if (this.operationQueue) {\n      return this.operationQueue.appendBlocker(type);\n    }\n  }\n\n  private currentOp(type: SourceBufferName): BufferOperation | null {\n    if (this.operationQueue) {\n      return this.operationQueue.current(type);\n    }\n    return null;\n  }\n\n  private executeNext(type: SourceBufferName | null) {\n    if (type && this.operationQueue) {\n      this.operationQueue.executeNext(type);\n    }\n  }\n\n  private shiftAndExecuteNext(type: SourceBufferName) {\n    if (this.operationQueue) {\n      this.operationQueue.shiftAndExecuteNext(type);\n    }\n  }\n\n  private get pendingTrackCount(): number {\n    return Object.keys(this.tracks).reduce(\n      (acc, type) =>\n        acc + (this.isPending(this.tracks[type as SourceBufferName]) ? 1 : 0),\n      0,\n    );\n  }\n\n  private get sourceBufferCount(): number {\n    return this.sourceBuffers.reduce((acc, [type]) => acc + (type ? 1 : 0), 0);\n  }\n\n  private get sourceBufferTypes(): SourceBufferName[] {\n    return this.sourceBuffers\n      .map(([type]) => type)\n      .filter((type) => !!type) as SourceBufferName[];\n  }\n\n  private addBufferListener(\n    type: SourceBufferName,\n    event: string,\n    fn: <K extends keyof SourceBufferEventMap>(\n      type: SourceBufferName,\n      event: SourceBufferEventMap[K],\n    ) => any,\n  ) {\n    const track = this.tracks[type];\n    if (!track) {\n      return;\n    }\n    const buffer = track.buffer;\n    if (!buffer) {\n      return;\n    }\n    const listener = fn.bind(this, type);\n    track.listeners.push({ event, listener });\n    buffer.addEventListener(event, listener);\n  }\n\n  private removeBufferListeners(type: SourceBufferName) {\n    const track = this.tracks[type];\n    if (!track) {\n      return;\n    }\n    const buffer = track.buffer;\n    if (!buffer) {\n      return;\n    }\n    track.listeners.forEach((l) => {\n      buffer.removeEventListener(l.event, l.listener);\n    });\n    track.listeners.length = 0;\n  }\n}\n\nfunction removeSourceChildren(node: HTMLElement) {\n  const sourceChildren = node.querySelectorAll('source');\n  [].slice.call(sourceChildren).forEach((source) => {\n    node.removeChild(source);\n  });\n}\n\nfunction addSource(media: HTMLMediaElement, url: string) {\n  const source = self.document.createElement('source');\n  source.type = 'video/mp4';\n  source.src = url;\n  media.appendChild(source);\n}\n\nfunction sourceBufferNameToIndex(type: SourceBufferName) {\n  return type === 'audio' ? 1 : 0;\n}\n", "/*\n * cap stream level to media size dimension controller\n */\n\nimport { Events } from '../events';\nimport type StreamController from './stream-controller';\nimport type Hls from '../hls';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  BufferCodecsData,\n  FPSDropLevelCappingData,\n  LevelsUpdatedData,\n  ManifestParsedData,\n  MediaAttachingData,\n} from '../types/events';\nimport type { Level } from '../types/level';\n\ntype RestrictedLevel = { width: number; height: number; bitrate: number };\nclass CapLevelController implements ComponentAPI {\n  private hls: Hls;\n  private autoLevelCapping: number;\n  private firstLevel: number;\n  private media: HTMLVideoElement | null;\n  private restrictedLevels: RestrictedLevel[];\n  private timer: number | undefined;\n  private clientRect: { width: number; height: number } | null;\n  private streamController?: StreamController;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n    this.autoLevelCapping = Number.POSITIVE_INFINITY;\n    this.firstLevel = -1;\n    this.media = null;\n    this.restrictedLevels = [];\n    this.timer = undefined;\n    this.clientRect = null;\n\n    this.registerListeners();\n  }\n\n  public setStreamController(streamController: StreamController) {\n    this.streamController = streamController;\n  }\n\n  public destroy() {\n    if (this.hls) {\n      this.unregisterListener();\n    }\n    if (this.timer) {\n      this.stopCapping();\n    }\n    this.media = null;\n    this.clientRect = null;\n    // @ts-ignore\n    this.hls = this.streamController = null;\n  }\n\n  protected registerListeners() {\n    const { hls } = this;\n    hls.on(Events.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this);\n    hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.on(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n\n  protected unregisterListener() {\n    const { hls } = this;\n    hls.off(Events.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this);\n    hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n\n  protected onFpsDropLevelCapping(\n    event: Events.FPS_DROP_LEVEL_CAPPING,\n    data: FPSDropLevelCappingData,\n  ) {\n    // Don't add a restricted level more than once\n    const level = this.hls.levels[data.droppedLevel];\n    if (this.isLevelAllowed(level)) {\n      this.restrictedLevels.push({\n        bitrate: level.bitrate,\n        height: level.height,\n        width: level.width,\n      });\n    }\n  }\n\n  protected onMediaAttaching(\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ) {\n    this.media = data.media instanceof HTMLVideoElement ? data.media : null;\n    this.clientRect = null;\n    if (this.timer && this.hls.levels.length) {\n      this.detectPlayerSize();\n    }\n  }\n\n  protected onManifestParsed(\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ) {\n    const hls = this.hls;\n    this.restrictedLevels = [];\n    this.firstLevel = data.firstLevel;\n    if (hls.config.capLevelToPlayerSize && data.video) {\n      // Start capping immediately if the manifest has signaled video codecs\n      this.startCapping();\n    }\n  }\n\n  private onLevelsUpdated(\n    event: Events.LEVELS_UPDATED,\n    data: LevelsUpdatedData,\n  ) {\n    if (this.timer && Number.isFinite(this.autoLevelCapping)) {\n      this.detectPlayerSize();\n    }\n  }\n\n  // Only activate capping when playing a video stream; otherwise, multi-bitrate audio-only streams will be restricted\n  // to the first level\n  protected onBufferCodecs(\n    event: Events.BUFFER_CODECS,\n    data: BufferCodecsData,\n  ) {\n    const hls = this.hls;\n    if (hls.config.capLevelToPlayerSize && data.video) {\n      // If the manifest did not signal a video codec capping has been deferred until we're certain video is present\n      this.startCapping();\n    }\n  }\n\n  protected onMediaDetaching() {\n    this.stopCapping();\n    this.media = null;\n  }\n\n  detectPlayerSize() {\n    if (this.media) {\n      if (this.mediaHeight <= 0 || this.mediaWidth <= 0) {\n        this.clientRect = null;\n        return;\n      }\n      const levels = this.hls.levels;\n      if (levels.length) {\n        const hls = this.hls;\n        const maxLevel = this.getMaxLevel(levels.length - 1);\n        if (maxLevel !== this.autoLevelCapping) {\n          hls.logger.log(\n            `Setting autoLevelCapping to ${maxLevel}: ${levels[maxLevel].height}p@${levels[maxLevel].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}`,\n          );\n        }\n        hls.autoLevelCapping = maxLevel;\n        if (\n          hls.autoLevelEnabled &&\n          hls.autoLevelCapping > this.autoLevelCapping &&\n          this.streamController\n        ) {\n          // if auto level capping has a higher value for the previous one, flush the buffer using nextLevelSwitch\n          // usually happen when the user go to the fullscreen mode.\n          this.streamController.nextLevelSwitch();\n        }\n        this.autoLevelCapping = hls.autoLevelCapping;\n      }\n    }\n  }\n\n  /*\n   * returns level should be the one with the dimensions equal or greater than the media (player) dimensions (so the video will be downscaled)\n   */\n  getMaxLevel(capLevelIndex: number): number {\n    const levels = this.hls.levels;\n    if (!levels.length) {\n      return -1;\n    }\n\n    const validLevels = levels.filter(\n      (level, index) => this.isLevelAllowed(level) && index <= capLevelIndex,\n    );\n\n    this.clientRect = null;\n    return CapLevelController.getMaxLevelByMediaSize(\n      validLevels,\n      this.mediaWidth,\n      this.mediaHeight,\n    );\n  }\n\n  startCapping() {\n    if (this.timer) {\n      // Don't reset capping if started twice; this can happen if the manifest signals a video codec\n      return;\n    }\n    this.autoLevelCapping = Number.POSITIVE_INFINITY;\n    self.clearInterval(this.timer);\n    this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1000);\n    this.detectPlayerSize();\n  }\n\n  stopCapping() {\n    this.restrictedLevels = [];\n    this.firstLevel = -1;\n    this.autoLevelCapping = Number.POSITIVE_INFINITY;\n    if (this.timer) {\n      self.clearInterval(this.timer);\n      this.timer = undefined;\n    }\n  }\n\n  getDimensions(): { width: number; height: number } {\n    if (this.clientRect) {\n      return this.clientRect;\n    }\n    const media = this.media;\n    const boundsRect = {\n      width: 0,\n      height: 0,\n    };\n\n    if (media) {\n      const clientRect = media.getBoundingClientRect();\n      boundsRect.width = clientRect.width;\n      boundsRect.height = clientRect.height;\n      if (!boundsRect.width && !boundsRect.height) {\n        // When the media element has no width or height (equivalent to not being in the DOM),\n        // then use its width and height attributes (media.width, media.height)\n        boundsRect.width =\n          clientRect.right - clientRect.left || media.width || 0;\n        boundsRect.height =\n          clientRect.bottom - clientRect.top || media.height || 0;\n      }\n    }\n    this.clientRect = boundsRect;\n    return boundsRect;\n  }\n\n  get mediaWidth(): number {\n    return this.getDimensions().width * this.contentScaleFactor;\n  }\n\n  get mediaHeight(): number {\n    return this.getDimensions().height * this.contentScaleFactor;\n  }\n\n  get contentScaleFactor(): number {\n    let pixelRatio = 1;\n    if (!this.hls.config.ignoreDevicePixelRatio) {\n      try {\n        pixelRatio = self.devicePixelRatio;\n      } catch (e) {\n        /* no-op */\n      }\n    }\n\n    return Math.min(pixelRatio, this.hls.config.maxDevicePixelRatio);\n  }\n\n  private isLevelAllowed(level: Level): boolean {\n    const restrictedLevels = this.restrictedLevels;\n    return !restrictedLevels.some((restrictedLevel) => {\n      return (\n        level.bitrate === restrictedLevel.bitrate &&\n        level.width === restrictedLevel.width &&\n        level.height === restrictedLevel.height\n      );\n    });\n  }\n\n  static getMaxLevelByMediaSize(\n    levels: Array<Level>,\n    width: number,\n    height: number,\n  ): number {\n    if (!levels?.length) {\n      return -1;\n    }\n\n    // Levels can have the same dimensions but differing bandwidths - since levels are ordered, we can look to the next\n    // to determine whether we've chosen the greatest bandwidth for the media's dimensions\n    const atGreatestBandwidth = (\n      curLevel: Level,\n      nextLevel: Level | undefined,\n    ) => {\n      if (!nextLevel) {\n        return true;\n      }\n\n      return (\n        curLevel.width !== nextLevel.width ||\n        curLevel.height !== nextLevel.height\n      );\n    };\n\n    // If we run through the loop without breaking, the media's dimensions are greater than every level, so default to\n    // the max level\n    let maxLevelIndex = levels.length - 1;\n    // Prevent changes in aspect-ratio from causing capping to toggle back and forth\n    const squareSize = Math.max(width, height);\n    for (let i = 0; i < levels.length; i += 1) {\n      const level = levels[i];\n      if (\n        (level.width >= squareSize || level.height >= squareSize) &&\n        atGreatestBandwidth(level, levels[i + 1])\n      ) {\n        maxLevelIndex = i;\n        break;\n      }\n    }\n\n    return maxLevelIndex;\n  }\n}\n\nexport default CapLevelController;\n", "/**\n * Common Media Object Type\n *\n * @internal\n */\nexport const CmObjectType = {\n    /**\n     * text file, such as a manifest or playlist\n     */\n    MANIFEST: 'm',\n    /**\n     * audio only\n     */\n    AUDIO: 'a',\n    /**\n     * video only\n     */\n    VIDEO: 'v',\n    /**\n     * muxed audio and video\n     */\n    MUXED: 'av',\n    /**\n     * init segment\n     */\n    INIT: 'i',\n    /**\n     * caption or subtitle\n     */\n    CAPTION: 'c',\n    /**\n     * ISOBMFF timed text track\n     */\n    TIMED_TEXT: 'tt',\n    /**\n     * cryptographic key, license or certificate.\n     */\n    KEY: 'k',\n    /**\n     * other\n     */\n    OTHER: 'o',\n};\n//# sourceMappingURL=CmObjectType.js.map", "import { CmObjectType } from '../cta/CmObjectType.js';\n/**\n * Common Media Client Data Object Type\n *\n * @group CMCD\n *\n * @beta\n *\n * @enum\n */\nexport const CmcdObjectType = CmObjectType;\n//# sourceMappingURL=CmcdObjectType.js.map", "/**\n * Common Media Streaming Format\n *\n * @internal\n */\nexport const CmStreamingFormat = {\n    /**\n     * MPEG DASH\n     */\n    DASH: 'd',\n    /**\n     * HTTP Live Streaming (HLS)\n     */\n    HLS: 'h',\n    /**\n     * Smooth Streaming\n     */\n    SMOOTH: 's',\n    /**\n     * Other\n     */\n    OTHER: 'o',\n};\n//# sourceMappingURL=CmStreamingFormat.js.map", "import { CmStreamingFormat } from '../cta/CmStreamingFormat.js';\n/**\n * Common Media Client Data Streaming Format\n *\n * @group CMCD\n *\n * @enum\n *\n * @beta\n */\nexport const CmcdStreamingFormat = CmStreamingFormat;\n//# sourceMappingURL=CmcdStreamingFormat.js.map", "/**\n * Structured Field Item\n *\n * @group Structured Field\n *\n * @beta\n */\nexport class SfItem {\n    constructor(value, params) {\n        if (Array.isArray(value)) {\n            value = value.map((v) => (v instanceof SfItem) ? v : new SfItem(v));\n        }\n        this.value = value;\n        this.params = params;\n    }\n}\n//# sourceMappingURL=SfItem.js.map", "export const DICT = 'Dict';\n//# sourceMappingURL=DICT.js.map", "function format(value) {\n    if (Array.isArray(value)) {\n        return JSON.stringify(value);\n    }\n    if (value instanceof Map) {\n        return 'Map{}';\n    }\n    if (value instanceof Set) {\n        return 'Set{}';\n    }\n    if (typeof value === 'object') {\n        return JSON.stringify(value);\n    }\n    return String(value);\n}\nexport function throwError(action, src, type, cause) {\n    return new Error(`failed to ${action} \"${format(src)}\" as ${type}`, { cause });\n}\n//# sourceMappingURL=throwError.js.map", "import { throwError } from '../utils/throwError.js';\nexport function serializeError(src, type, cause) {\n    return throwError('serialize', src, type, cause);\n}\n//# sourceMappingURL=serializeError.js.map", "/**\n * A class to represent structured field tokens when `Symbol` is not available.\n *\n * @group Structured Field\n *\n * @beta\n */\nexport class SfToken {\n    constructor(description) {\n        this.description = description;\n    }\n}\n//# sourceMappingURL=SfToken.js.map", "export const BARE_ITEM = 'Bare Item';\n//# sourceMappingURL=BARE_ITEM.js.map", "export const BOOLEAN = 'Boolean';\n//# sourceMappingURL=BOOLEAN.js.map", "import { BOOLEAN } from '../utils/BOOLEAN.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.9.  Serializing a Boolean\n//\n// Given a Boolean as input_boolean, return an ASCII string suitable for\n// use in a HTTP field value.\n//\n// 1.  If input_boolean is not a boolean, fail serialization.\n//\n// 2.  Let output be an empty string.\n//\n// 3.  Append \"?\" to output.\n//\n// 4.  If input_boolean is true, append \"1\" to output.\n//\n// 5.  If input_boolean is false, append \"0\" to output.\n//\n// 6.  Return output.\nexport function serializeBoolean(value) {\n    if (typeof value !== 'boolean') {\n        throw serializeError(value, BOOLEAN);\n    }\n    return value ? '?1' : '?0';\n}\n//# sourceMappingURL=serializeBoolean.js.map", "/**\n * Encodes binary data to base64\n *\n * @param binary - The binary data to encode\n * @returns The base64 encoded string\n *\n * @group Utils\n *\n * @beta\n */\nexport function encodeBase64(binary) {\n    return btoa(String.fromCharCode(...binary));\n}\n//# sourceMappingURL=encodeBase64.js.map", "export const BYTES = 'Byte Sequence';\n//# sourceMappingURL=BYTES.js.map", "import { encodeBase64 } from '../../utils/encodeBase64.js';\nimport { BYTES } from '../utils/BYTES.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.8.  Serializing a Byte Sequence\n//\n// Given a Byte Sequence as input_bytes, return an ASCII string suitable\n// for use in a HTTP field value.\n//\n// 1.  If input_bytes is not a sequence of bytes, fail serialization.\n//\n// 2.  Let output be an empty string.\n//\n// 3.  Append \":\" to output.\n//\n// 4.  Append the result of base64-encoding input_bytes as per\n//     [RFC4648], Section 4, taking account of the requirements below.\n//\n// 5.  Append \":\" to output.\n//\n// 6.  Return output.\n//\n// The encoded data is required to be padded with \"=\", as per [RFC4648],\n// Section 3.2.\n//\n// Likewise, encoded data SHOULD have pad bits set to zero, as per\n// [RFC4648], Section 3.5, unless it is not possible to do so due to\n// implementation constraints.\nexport function serializeByteSequence(value) {\n    if (ArrayBuffer.isView(value) === false) {\n        throw serializeError(value, BYTES);\n    }\n    return `:${encodeBase64(value)}:`;\n}\n//# sourceMappingURL=serializeByteSequence.js.map", "export const INTEGER = 'Integer';\n//# sourceMappingURL=INTEGER.js.map", "export function isInvalidInt(value) {\n    return value < -999999999999999 || 999999999999999 < value;\n}\n//# sourceMappingURL=isInvalidInt.js.map", "import { INTEGER } from '../utils/INTEGER.js';\nimport { isInvalidInt } from '../utils/isInvalidInt.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.4.  Serializing an Integer\n//\n// Given an Integer as input_integer, return an ASCII string suitable\n// for use in a HTTP field value.\n//\n// 1.  If input_integer is not an integer in the range of\n//     -999,999,999,999,999 to 999,999,999,999,999 inclusive, fail\n//     serialization.\n//\n// 2.  Let output be an empty string.\n//\n// 3.  If input_integer is less than (but not equal to) 0, append \"-\" to\n//     output.\n//\n// 4.  Append input_integer's numeric value represented in base 10 using\n//     only decimal digits to output.\n//\n// 5.  Return output.\nexport function serializeInteger(value) {\n    if (isInvalidInt(value)) {\n        throw serializeError(value, INTEGER);\n    }\n    return value.toString();\n}\n//# sourceMappingURL=serializeInteger.js.map", "import { serializeInteger } from './serializeInteger.js';\n// 4.1.10.  Serializing a Date\n//\n// Given a Date as input_integer, return an ASCII string suitable for\n// use in an HTTP field value.\n// 1.  Let output be \"@\".\n// 2.  Append to output the result of running Serializing an Integer\n//     with input_date (Section 4.1.4).\n// 3.  Return output.\nexport function serializeDate(value) {\n    return `@${serializeInteger(value.getTime() / 1000)}`;\n}\n//# sourceMappingURL=serializeDate.js.map", "/**\n * This implements the rounding procedure described in step 2 of the \"Serializing a Decimal\" specification.\n * This rounding style is known as \"even rounding\", \"banker's rounding\", or \"commercial rounding\".\n *\n * @param value - The value to round\n * @param precision - The number of decimal places to round to\n * @returns The rounded value\n *\n * @group Utils\n *\n * @beta\n */\nexport function roundToEven(value, precision) {\n    if (value < 0) {\n        return -roundToEven(-value, precision);\n    }\n    const decimalShift = Math.pow(10, precision);\n    const isEquidistant = Math.abs(((value * decimalShift) % 1) - 0.5) < Number.EPSILON;\n    if (isEquidistant) {\n        // If the tail of the decimal place is 'equidistant' we round to the nearest even value\n        const flooredValue = Math.floor(value * decimalShift);\n        return (flooredValue % 2 === 0 ? flooredValue : flooredValue + 1) / decimalShift;\n    }\n    else {\n        // Otherwise, proceed as normal\n        return Math.round(value * decimalShift) / decimalShift;\n    }\n}\n//# sourceMappingURL=roundToEven.js.map", "export const DECIMAL = 'Decimal';\n//# sourceMappingURL=DECIMAL.js.map", "import { roundToEven } from '../../utils/roundToEven.js';\nimport { DECIMAL } from '../utils/DECIMAL.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.5.  Serializing a Decimal\n//\n// Given a decimal number as input_decimal, return an ASCII string\n// suitable for use in a HTTP field value.\n//\n// 1.   If input_decimal is not a decimal number, fail serialization.\n//\n// 2.   If input_decimal has more than three significant digits to the\n//      right of the decimal point, round it to three decimal places,\n//      rounding the final digit to the nearest value, or to the even\n//      value if it is equidistant.\n//\n// 3.   If input_decimal has more than 12 significant digits to the left\n//      of the decimal point after rounding, fail serialization.\n//\n// 4.   Let output be an empty string.\n//\n// 5.   If input_decimal is less than (but not equal to) 0, append \"-\"\n//      to output.\n//\n// 6.   Append input_decimal's integer component represented in base 10\n//      (using only decimal digits) to output; if it is zero, append\n//      \"0\".\n//\n// 7.   Append \".\" to output.\n//\n// 8.   If input_decimal's fractional component is zero, append \"0\" to\n//      output.\n//\n// 9.   Otherwise, append the significant digits of input_decimal's\n//      fractional component represented in base 10 (using only decimal\n//      digits) to output.\n//\n// 10.  Return output.\nexport function serializeDecimal(value) {\n    const roundedValue = roundToEven(value, 3); // round to 3 decimal places\n    if (Math.floor(Math.abs(roundedValue)).toString().length > 12) {\n        throw serializeError(value, DECIMAL);\n    }\n    const stringValue = roundedValue.toString();\n    return stringValue.includes('.') ? stringValue : `${stringValue}.0`;\n}\n//# sourceMappingURL=serializeDecimal.js.map", "export const STRING = 'String';\n//# sourceMappingURL=STRING.js.map", "export const STRING_REGEX = /[\\x00-\\x1f\\x7f]+/;\n//# sourceMappingURL=STRING_REGEX.js.map", "import { STRING } from '../utils/STRING.js';\nimport { STRING_REGEX } from '../utils/STRING_REGEX.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.6.  Serializing a String\n//\n// Given a String as input_string, return an ASCII string suitable for\n// use in a HTTP field value.\n//\n// 1.  Convert input_string into a sequence of ASCII characters; if\n//     conversion fails, fail serialization.\n//\n// 2.  If input_string contains characters in the range %x00-1f or %x7f\n//     (i.e., not in VCHAR or SP), fail serialization.\n//\n// 3.  Let output be the string DQUOTE.\n//\n// 4.  For each character char in input_string:\n//\n//     1.  If char is \"\\\" or DQUOTE:\n//\n//         1.  Append \"\\\" to output.\n//\n//     2.  Append char to output.\n//\n// 5.  Append DQUOTE to output.\n//\n// 6.  Return output.\nexport function serializeString(value) {\n    if (STRING_REGEX.test(value)) {\n        throw serializeError(value, STRING);\n    }\n    return `\"${value.replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`)}\"`;\n}\n//# sourceMappingURL=serializeString.js.map", "/**\n * Converts a symbol to a string.\n *\n * @param symbol - The symbol to convert.\n *\n * @returns The string representation of the symbol.\n *\n * @internal\n */\nexport function symbolToStr(symbol) {\n    return symbol.description || symbol.toString().slice(7, -1);\n}\n//# sourceMappingURL=symbolToStr.js.map", "export const TOKEN = 'Token';\n//# sourceMappingURL=TOKEN.js.map", "import { symbolToStr } from '../../cta/utils/symbolToStr.js';\nimport { TOKEN } from '../utils/TOKEN.js';\nimport { serializeError } from './serializeError.js';\nexport function serializeToken(token) {\n    const value = symbolToStr(token);\n    if (/^([a-zA-Z*])([!#$%&'*+\\-.^_`|~\\w:/]*)$/.test(value) === false) {\n        throw serializeError(value, TOKEN);\n    }\n    return value;\n}\n//# sourceMappingURL=serializeToken.js.map", "import { SfToken } from '../SfToken.js';\nimport { BARE_ITEM } from '../utils/BARE_ITEM.js';\nimport { serializeBoolean } from './serializeBoolean.js';\nimport { serializeByteSequence } from './serializeByteSequence.js';\nimport { serializeDate } from './serializeDate.js';\nimport { serializeDecimal } from './serializeDecimal.js';\nimport { serializeError } from './serializeError.js';\nimport { serializeInteger } from './serializeInteger.js';\nimport { serializeString } from './serializeString.js';\nimport { serializeToken } from './serializeToken.js';\n// 4.1.3.1.  Serializing a Bare Item\n//\n// Given an Item as input_item, return an ASCII string suitable for use\n// in a HTTP field value.\n//\n// 1.  If input_item is an Integer, return the result of running\n//     Serializing an Integer (Section 4.1.4) with input_item.\n//\n// 2.  If input_item is a Decimal, return the result of running\n//     Serializing a Decimal (Section 4.1.5) with input_item.\n//\n// 3.  If input_item is a String, return the result of running\n//     Serializing a String (Section 4.1.6) with input_item.\n//\n// 4.  If input_item is a Token, return the result of running\n//     Serializing a Token (Section 4.1.7) with input_item.\n//\n// 5.  If input_item is a Boolean, return the result of running\n//     Serializing a Boolean (Section 4.1.9) with input_item.\n//\n// 6.  If input_item is a Byte Sequence, return the result of running\n//     Serializing a Byte Sequence (Section 4.1.8) with input_item.\n//\n// 7.  If input_item is a Date, return the result of running Serializing\n//     a Date (Section 4.1.10) with input_item.\n//\n// 8.  Otherwise, fail serialization.\nexport function serializeBareItem(value) {\n    switch (typeof value) {\n        case 'number':\n            if (!Number.isFinite(value)) {\n                throw serializeError(value, BARE_ITEM);\n            }\n            if (Number.isInteger(value)) {\n                return serializeInteger(value);\n            }\n            return serializeDecimal(value);\n        case 'string':\n            return serializeString(value);\n        case 'symbol':\n            return serializeToken(value);\n        case 'boolean':\n            return serializeBoolean(value);\n        case 'object':\n            if (value instanceof Date) {\n                return serializeDate(value);\n            }\n            if (value instanceof Uint8Array) {\n                return serializeByteSequence(value);\n            }\n            if (value instanceof SfToken) {\n                return serializeToken(value);\n            }\n        default:\n            // fail\n            throw serializeError(value, BARE_ITEM);\n    }\n}\n//# sourceMappingURL=serializeBareItem.js.map", "export const KEY = 'Key';\n//# sourceMappingURL=KEY.js.map", "import { KEY } from '../utils/KEY.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.1.3.  Serializing a Key\n//\n// Given a key as input_key, return an ASCII string suitable for use in\n// a HTTP field value.\n//\n// 1.  Convert input_key into a sequence of ASCII characters; if\n//     conversion fails, fail serialization.\n//\n// 2.  If input_key contains characters not in lcalpha, DIGIT, \"_\", \"-\",\n//     \".\", or \"*\" fail serialization.\n//\n// 3.  If the first character of input_key is not lcalpha or \"*\", fail\n//     serialization.\n//\n// 4.  Let output be an empty string.\n//\n// 5.  Append input_key to output.\n//\n// 6.  Return output.\nexport function serializeKey(value) {\n    if (/^[a-z*][a-z0-9\\-_.*]*$/.test(value) === false) {\n        throw serializeError(value, KEY);\n    }\n    return value;\n}\n//# sourceMappingURL=serializeKey.js.map", "import { serializeBareItem } from './serializeBareItem.js';\nimport { serializeKey } from './serializeKey.js';\n// 4.1.1.2.  Serializing Parameters\n//\n// Given an ordered Dictionary as input_parameters (each member having a\n// param_name and a param_value), return an ASCII string suitable for\n// use in a HTTP field value.\n//\n// 1.  Let output be an empty string.\n//\n// 2.  For each param_name with a value of param_value in\n//     input_parameters:\n//\n//     1.  Append \";\" to output.\n//\n//     2.  Append the result of running Serializing a Key\n//         (Section 4.1.1.3) with param_name to output.\n//\n//     3.  If param_value is not Boolean true:\n//\n//         1.  Append \"=\" to output.\n//\n//         2.  Append the result of running Serializing a bare Item\n//             (Section 4.1.3.1) with param_value to output.\n//\n// 3.  Return output.\nexport function serializeParams(params) {\n    if (params == null) {\n        return '';\n    }\n    return Object.entries(params)\n        .map(([key, value]) => {\n        if (value === true) {\n            return `;${serializeKey(key)}`; // omit true\n        }\n        return `;${serializeKey(key)}=${serializeBareItem(value)}`;\n    })\n        .join('');\n}\n//# sourceMappingURL=serializeParams.js.map", "import { SfItem } from '../SfItem.js';\nimport { serializeBareItem } from './serializeBareItem.js';\nimport { serializeParams } from './serializeParams.js';\n// 4.1.3.  Serializing an Item\n//\n// Given an Item as bare_item and Parameters as item_parameters, return\n// an ASCII string suitable for use in a HTTP field value.\n//\n// 1.  Let output be an empty string.\n//\n// 2.  Append the result of running Serializing a Bare Item\n//     Section 4.1.3.1 with bare_item to output.\n//\n// 3.  Append the result of running Serializing Parameters\n//     Section 4.1.1.2 with item_parameters to output.\n//\n// 4.  Return output.\nexport function serializeItem(value) {\n    if (value instanceof SfItem) {\n        return `${serializeBareItem(value.value)}${serializeParams(value.params)}`;\n    }\n    else {\n        return serializeBareItem(value);\n    }\n}\n//# sourceMappingURL=serializeItem.js.map", "import { serializeItem } from './serializeItem.js';\nimport { serializeParams } from './serializeParams.js';\n// 4.1.1.1.  Serializing an Inner List\n//\n// Given an array of (member_value, parameters) tuples as inner_list,\n// and parameters as list_parameters, return an ASCII string suitable\n// for use in a HTTP field value.\n//\n// 1.  Let output be the string \"(\".\n//\n// 2.  For each (member_value, parameters) of inner_list:\n//\n//     1.  Append the result of running Serializing an Item\n//         (Section 4.1.3) with (member_value, parameters) to output.\n//\n//     2.  If more values remain in inner_list, append a single SP to\n//         output.\n//\n// 3.  Append \")\" to output.\n//\n// 4.  Append the result of running Serializing Parameters\n//     (Section 4.1.1.2) with list_parameters to output.\n//\n// 5.  Return output.\nexport function serializeInnerList(value) {\n    return `(${value.value.map(serializeItem).join(' ')})${serializeParams(value.params)}`;\n}\n//# sourceMappingURL=serializeInnerList.js.map", "import { SfItem } from '../SfItem.js';\nimport { DICT } from '../utils/DICT.js';\nimport { serializeError } from './serializeError.js';\nimport { serializeInnerList } from './serializeInnerList.js';\nimport { serializeItem } from './serializeItem.js';\nimport { serializeKey } from './serializeKey.js';\nimport { serializeParams } from './serializeParams.js';\n// 4.1.2.  Serializing a Dictionary\n//\n// Given an ordered Dictionary as input_dictionary (each member having a\n// member_name and a tuple value of (member_value, parameters)), return\n// an ASCII string suitable for use in a HTTP field value.\n//\n// 1.  Let output be an empty string.\n//\n// 2.  For each member_name with a value of (member_value, parameters)\n//     in input_dictionary:\n//\n//     1.  Append the result of running Serializing a Key\n//         (Section 4.1.1.3) with member's member_name to output.\n//\n//     2.  If member_value is Boolean true:\n//\n//         1.  Append the result of running Serializing Parameters\n//             (Section 4.1.1.2) with parameters to output.\n//\n//     3.  Otherwise:\n//\n//         1.  Append \"=\" to output.\n//\n//         2.  If member_value is an array, append the result of running\n//             Serializing an Inner List (Section 4.1.1.1) with\n//             (member_value, parameters) to output.\n//\n//         3.  Otherwise, append the result of running Serializing an\n//             Item (Section 4.1.3) with (member_value, parameters) to\n//             output.\n//\n//     4.  If more members remain in input_dictionary:\n//\n//         1.  Append \",\" to output.\n//\n//         2.  Append a single SP to output.\n//\n// 3.  Return output.\nexport function serializeDict(dict, options = { whitespace: true }) {\n    if (typeof dict !== 'object' || dict == null) {\n        throw serializeError(dict, DICT);\n    }\n    const entries = dict instanceof Map ? dict.entries() : Object.entries(dict);\n    const optionalWhiteSpace = (options === null || options === void 0 ? void 0 : options.whitespace) ? ' ' : '';\n    return Array.from(entries)\n        .map(([key, item]) => {\n        if (item instanceof SfItem === false) {\n            item = new SfItem(item);\n        }\n        let output = serializeKey(key);\n        if (item.value === true) {\n            output += serializeParams(item.params);\n        }\n        else {\n            output += '=';\n            if (Array.isArray(item.value)) {\n                output += serializeInnerList(item);\n            }\n            else {\n                output += serializeItem(item);\n            }\n        }\n        return output;\n    })\n        .join(`,${optionalWhiteSpace}`);\n}\n//# sourceMappingURL=serializeDict.js.map", "import { serializeDict } from './serialize/serializeDict.js';\n/**\n * Encode an object into a structured field dictionary\n *\n * @param value - The structured field dictionary to encode\n * @param options - Encoding options\n *\n * @returns The structured field string\n *\n * @group Structured Field\n *\n * @beta\n */\nexport function encodeSfDict(value, options) {\n    return serializeDict(value, options);\n}\n//# sourceMappingURL=encodeSfDict.js.map", "/**\n * CMCD object header name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_OBJECT = 'CMCD-Object';\n//# sourceMappingURL=CMCD_OBJECT.js.map", "/**\n * CMCD request header name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_REQUEST = 'CMCD-Request';\n//# sourceMappingURL=CMCD_REQUEST.js.map", "/**\n * CMCD session header name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_SESSION = 'CMCD-Session';\n//# sourceMappingURL=CMCD_SESSION.js.map", "/**\n * CMCD status header name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_STATUS = 'CMCD-Status';\n//# sourceMappingURL=CMCD_STATUS.js.map", "import { CMCD_OBJECT } from './CMCD_OBJECT.js';\nimport { CMCD_REQUEST } from './CMCD_REQUEST.js';\nimport { CMCD_SESSION } from './CMCD_SESSION.js';\nimport { CMCD_STATUS } from './CMCD_STATUS.js';\n/**\n * The map of CMCD keys to their appropriate header shard.\n *\n * @group CMCD\n *\n * @internal\n */\nexport const CMCD_HEADER_MAP = {\n    // Object\n    br: CMCD_OBJECT,\n    ab: CMCD_OBJECT,\n    d: CMCD_OBJECT,\n    ot: CMCD_OBJECT,\n    tb: CMCD_OBJECT,\n    tpb: CMCD_OBJECT,\n    lb: CMCD_OBJECT,\n    tab: CMCD_OBJECT,\n    lab: CMCD_OBJECT,\n    url: CMCD_OBJECT,\n    // Request\n    pb: CMCD_REQUEST,\n    bl: CMCD_REQUEST,\n    tbl: CMCD_REQUEST,\n    dl: CMCD_REQUEST,\n    ltc: CMCD_REQUEST,\n    mtp: CMCD_REQUEST,\n    nor: CMCD_REQUEST,\n    nrr: CMCD_REQUEST,\n    rc: CMCD_REQUEST,\n    sn: CMCD_REQUEST,\n    sta: CMCD_REQUEST,\n    su: CMCD_REQUEST,\n    ttfb: CMCD_REQUEST,\n    ttfbb: CMCD_REQUEST,\n    ttlb: CMCD_REQUEST,\n    cmsdd: CMCD_REQUEST,\n    cmsds: CMCD_REQUEST,\n    smrt: CMCD_REQUEST,\n    df: CMCD_REQUEST,\n    cs: CMCD_REQUEST,\n    // TODO: Which header to put the `ts` field is not defined yet.\n    ts: CMCD_REQUEST,\n    // Session\n    cid: CMCD_SESSION,\n    pr: CMCD_SESSION,\n    sf: CMCD_SESSION,\n    sid: CMCD_SESSION,\n    st: CMCD_SESSION,\n    v: CMCD_SESSION,\n    msd: CMCD_SESSION,\n    // Status\n    bs: CMCD_STATUS,\n    bsd: CMCD_STATUS,\n    cdn: CMCD_STATUS,\n    rtp: CMCD_STATUS,\n    bg: CMCD_STATUS,\n    pt: CMCD_STATUS,\n    ec: CMCD_STATUS,\n    e: CMCD_STATUS,\n};\n//# sourceMappingURL=CMCD_HEADER_MAP.js.map", "import { CMCD_OBJECT } from './CMCD_OBJECT.js';\nimport { CMCD_REQUEST } from './CMCD_REQUEST.js';\nimport { CMCD_SESSION } from './CMCD_SESSION.js';\nimport { CMCD_STATUS } from './CMCD_STATUS.js';\n/**\n * CMCD header fields.\n *\n * @group CMCD\n *\n * @enum\n *\n * @beta\n */\nexport const CmcdHeaderField = {\n    /**\n     * keys whose values vary with the object being requested.\n     */\n    OBJECT: CMCD_OBJECT,\n    /**\n     * keys whose values vary with each request.\n     */\n    REQUEST: CMCD_REQUEST,\n    /**\n     * keys whose values are expected to be invariant over the life of the session.\n     */\n    SESSION: CMCD_SESSION,\n    /**\n     * keys whose values do not vary with every request or object.\n     */\n    STATUS: CMCD_STATUS,\n};\n//# sourceMappingURL=CmcdHeaderField.js.map", "import { CMCD_HEADER_MAP } from './CMCD_HEADER_MAP.js';\nimport { CmcdHeaderField } from './CmcdHeaderField.js';\nfunction createHeaderMap(headerMap) {\n    return Object.keys(headerMap)\n        .reduce((acc, field) => {\n        var _a;\n        (_a = headerMap[field]) === null || _a === void 0 ? void 0 : _a.forEach(key => acc[key] = field);\n        return acc;\n    }, {});\n}\n/**\n * Group a CMCD data object into header shards\n *\n * @param cmcd - The CMCD data object to convert.\n * @param customHeaderMap - A map of CMCD header fields to custom CMCD keys.\n *\n * @returns The CMCD header shards.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function groupCmcdHeaders(cmcd, customHeaderMap) {\n    const result = {};\n    if (!cmcd) {\n        return result;\n    }\n    const keys = Object.keys(cmcd);\n    const custom = customHeaderMap ? createHeaderMap(customHeaderMap) : {};\n    return keys.reduce((acc, key) => {\n        var _a;\n        const field = CMCD_HEADER_MAP[key] || custom[key] || CmcdHeaderField.REQUEST;\n        const data = (_a = acc[field]) !== null && _a !== void 0 ? _a : (acc[field] = {});\n        data[key] = cmcd[key];\n        return acc;\n    }, result);\n}\n//# sourceMappingURL=groupCmcdHeaders.js.map", "/**\n * Checks if the given key is a token field.\n *\n * @param key - The key to check.\n *\n * @returns `true` if the key is a token field.\n *\n * @internal\n */\nexport function isTokenField(key) {\n    return [\n        'ot',\n        'sf',\n        'st',\n        'e',\n        'sta',\n    ].includes(key);\n}\n//# sourceMappingURL=isTokenField.js.map", "/**\n * Checks if the given value is valid\n *\n * @param value - The value to check.\n *\n * @returns `true` if the key is a value is valid.\n *\n * @internal\n */\nexport function isValid(value) {\n    if (typeof value === 'number') {\n        return Number.isFinite(value);\n    }\n    return value != null && value !== '' && value !== false;\n}\n//# sourceMappingURL=isValid.js.map", "/**\n * CMCD event mode variable name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_EVENT_MODE = 'event';\n//# sourceMappingURL=CMCD_EVENT_MODE.js.map", "/**\n * Constructs a relative path from a URL.\n *\n * @param url - The destination URL\n * @param base - The base URL\n * @returns The relative path\n *\n * @group Utils\n *\n * @beta\n */\nexport function urlToRelativePath(url, base) {\n    const to = new URL(url);\n    const from = new URL(base);\n    if (to.origin !== from.origin) {\n        return url;\n    }\n    const toPath = to.pathname.split('/').slice(1);\n    const fromPath = from.pathname.split('/').slice(1, -1);\n    // remove common parents\n    while (toPath[0] === fromPath[0]) {\n        toPath.shift();\n        fromPath.shift();\n    }\n    // add back paths\n    while (fromPath.length) {\n        fromPath.shift();\n        toPath.unshift('..');\n    }\n    const relativePath = toPath.join('/');\n    // preserve query parameters and hash of the destination url\n    return relativePath + to.search + to.hash;\n}\n//# sourceMappingURL=urlToRelativePath.js.map", "import { SfItem } from '../structuredfield/SfItem.js';\nimport { urlToRelativePath } from '../utils/urlToRelativePath.js';\nconst toRounded = (value) => Math.round(value);\nconst toUrlSafe = (value, options) => {\n    if (Array.isArray(value)) {\n        return value.map(item => toUrlSafe(item, options));\n    }\n    if (value instanceof SfItem && typeof value.value === 'string') {\n        return new SfItem(toUrlSafe(value.value, options), value.params);\n    }\n    else {\n        if (options.baseUrl) {\n            value = urlToRelativePath(value, options.baseUrl);\n        }\n        return options.version === 1 ? encodeURIComponent(value) : value;\n    }\n};\nconst toHundred = (value) => toRounded(value / 100) * 100;\nconst nor = (value, options) => {\n    let norValue = value;\n    if (options.version >= 2) {\n        if (value instanceof SfItem && typeof value.value === 'string') {\n            norValue = new SfItem([value]);\n        }\n        else if (typeof value === 'string') {\n            norValue = [value];\n        }\n    }\n    return toUrlSafe(norValue, options);\n};\n/**\n * The default formatters for CMCD values.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_FORMATTER_MAP = {\n    /**\n     * Bitrate (kbps) rounded integer\n     */\n    br: toRounded,\n    /**\n     * Duration (milliseconds) rounded integer\n     */\n    d: toRounded,\n    /**\n     * Buffer Length (milliseconds) rounded nearest 100ms\n     */\n    bl: toHundred,\n    /**\n     * Deadline (milliseconds) rounded nearest 100ms\n     */\n    dl: toHundred,\n    /**\n     * Measured Throughput (kbps) rounded nearest 100kbps\n     */\n    mtp: toHundred,\n    /**\n     * Next Object Request URL encoded\n     */\n    nor,\n    /**\n     * Requested maximum throughput (kbps) rounded nearest 100kbps\n     */\n    rtp: toHundred,\n    /**\n     * Top Bitrate (kbps) rounded integer\n     */\n    tb: toRounded,\n};\n//# sourceMappingURL=CMCD_FORMATTER_MAP.js.map", "/**\n * CMCD request mode variable name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_REQUEST_MODE = 'request';\n//# sourceMappingURL=CMCD_REQUEST_MODE.js.map", "/**\n * CMCD response mode variable name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_RESPONSE_MODE = 'response';\n//# sourceMappingURL=CMCD_RESPONSE_MODE.js.map", "/**\n * Defines the common keys for CMCD (Common Media Client Data) version 2.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_COMMON_KEYS = [\n    'ab',\n    'bg',\n    'bl',\n    'br',\n    'bs',\n    'bsd',\n    'cdn',\n    'cid',\n    'cs',\n    'df',\n    'ec',\n    'lab',\n    'lb',\n    'ltc',\n    'msd',\n    'mtp',\n    'pb',\n    'pr',\n    'pt',\n    'sf',\n    'sid',\n    'sn',\n    'st',\n    'sta',\n    'tab',\n    'tb',\n    'tbl',\n    'tpb',\n    'ts',\n    'v',\n];\n//# sourceMappingURL=CMCD_COMMON_KEYS.js.map", "/**\n * Defines the event-specific keys for CMCD (Common Media Client Data) version 2.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_EVENT_KEYS = [\n    'e',\n];\n//# sourceMappingURL=CMCD_EVENT_KEYS.js.map", "const CUSTOM_KEY_REGEX = /^[a-zA-Z0-9-.]+-[a-zA-Z0-9-.]+$/;\n/**\n * Check if a key is a custom key.\n *\n * @param key - The key to check.\n *\n * @returns `true` if the key is a custom key, `false` otherwise.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function isCmcdCustomKey(key) {\n    return CUSTOM_KEY_REGEX.test(key);\n}\n//# sourceMappingURL=isCmcdCustomKey.js.map", "import { CMCD_COMMON_KEYS } from './CMCD_COMMON_KEYS.js';\nimport { CMCD_EVENT_KEYS } from './CMCD_EVENT_KEYS.js';\nimport { isCmcdCustomKey } from './isCmcdCustomKey.js';\n/**\n * Check if a key is a valid CMCD event key.\n *\n * @param key - The key to check.\n *\n * @returns `true` if the key is a valid CMCD event key, `false` otherwise.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/isCmcdEventKey.test.ts#example}\n */\nexport function isCmcdEventKey(key) {\n    return CMCD_COMMON_KEYS.includes(key) ||\n        CMCD_EVENT_KEYS.includes(key) ||\n        isCmcdCustomKey(key);\n}\n//# sourceMappingURL=isCmcdEventKey.js.map", "/**\n * Defines the request-specific keys for CMCD (Common Media Client Data) version 2.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_REQUEST_KEYS = [\n    'd',\n    'dl',\n    'nor',\n    'ot',\n    'rtp',\n    'su',\n];\n//# sourceMappingURL=CMCD_REQUEST_KEYS.js.map", "import { CMCD_COMMON_KEYS } from './CMCD_COMMON_KEYS.js';\nimport { CMCD_REQUEST_KEYS } from './CMCD_REQUEST_KEYS.js';\nimport { isCmcdCustomKey } from './isCmcdCustomKey.js';\n/**\n * Check if a key is a valid CMCD request key.\n *\n * @param key - The key to check.\n *\n * @returns `true` if the key is a valid CMCD request key, `false` otherwise.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/isCmcdRequestKey.test.ts#example}\n */\nexport function isCmcdRequestKey(key) {\n    return CMCD_COMMON_KEYS.includes(key) ||\n        CMCD_REQUEST_KEYS.includes(key) ||\n        isCmcdCustomKey(key);\n}\n//# sourceMappingURL=isCmcdRequestKey.js.map", "/**\n * CMCD v2 - Response-only and timing keys.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_RESPONSE_KEYS = [\n    'cmsdd',\n    'cmsds',\n    'rc',\n    'smrt',\n    'ttfb',\n    'ttfbb',\n    'ttlb',\n    'url',\n];\n//# sourceMappingURL=CMCD_RESPONSE_KEYS.js.map", "import { CMCD_COMMON_KEYS } from './CMCD_COMMON_KEYS.js';\nimport { CMCD_REQUEST_KEYS } from './CMCD_REQUEST_KEYS.js';\nimport { CMCD_RESPONSE_KEYS } from './CMCD_RESPONSE_KEYS.js';\nimport { isCmcdCustomKey } from './isCmcdCustomKey.js';\n/**\n * Check if a key is a valid CMCD response key.\n *\n * @param key - The key to check.\n *\n * @returns `true` if the key is a valid CMCD request key, `false` otherwise.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/isCmcdResponseKey.test.ts#example}\n */\nexport function isCmcdResponseKey(key) {\n    return CMCD_COMMON_KEYS.includes(key) ||\n        CMCD_REQUEST_KEYS.includes(key) ||\n        CMCD_RESPONSE_KEYS.includes(key) ||\n        isCmcdCustomKey(key);\n}\n//# sourceMappingURL=isCmcdResponseKey.js.map", "/**\n * Defines the keys for CMCD (Common Media Client Data) version 1.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_V1_KEYS = [\n    'bl',\n    'br',\n    'bs',\n    'cid',\n    'd',\n    'dl',\n    'mtp',\n    'nor',\n    'nrr',\n    'ot',\n    'pr',\n    'rtp',\n    'sf',\n    'sid',\n    'st',\n    'su',\n    'tb',\n    'v',\n];\n//# sourceMappingURL=CMCD_V1_KEYS.js.map", "import { CMCD_V1_KEYS } from './CMCD_V1_KEYS.js';\nimport { isCmcdCustomKey } from './isCmcdCustomKey.js';\n/**\n * Filter function for CMCD v1 keys.\n *\n * @param key - The CMCD key to filter.\n *\n * @returns `true` if the key should be included, `false` otherwise.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/isCmcdV1Key.test.ts#example}\n */\nexport function isCmcdV1Key(key) {\n    return CMCD_V1_KEYS.includes(key) || isCmcdCustomKey(key);\n}\n//# sourceMappingURL=isCmcdV1Key.js.map", "import { isTokenField } from '../cta/utils/isTokenField.js';\nimport { isValid } from '../cta/utils/isValid.js';\nimport { SfToken } from '../structuredfield/SfToken.js';\nimport { CMCD_EVENT_MODE } from './CMCD_EVENT_MODE.js';\nimport { CMCD_FORMATTER_MAP } from './CMCD_FORMATTER_MAP.js';\nimport { CMCD_REQUEST_MODE } from './CMCD_REQUEST_MODE.js';\nimport { CMCD_RESPONSE_MODE } from './CMCD_RESPONSE_MODE.js';\nimport { isCmcdEventKey } from './isCmcdEventKey.js';\nimport { isCmcdRequestKey } from './isCmcdRequestKey.js';\nimport { isCmcdResponseKey } from './isCmcdResponseKey.js';\nimport { isCmcdV1Key } from './isCmcdV1Key.js';\nconst filterMap = {\n    [CMCD_RESPONSE_MODE]: isCmcdResponseKey,\n    [CMCD_EVENT_MODE]: isCmcdEventKey,\n    [CMCD_REQUEST_MODE]: isCmcdRequestKey,\n};\n/**\n * Convert a generic object to CMCD data.\n *\n * @param obj - The CMCD object to process.\n * @param options - Options for encoding.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function prepareCmcdData(obj, options = {}) {\n    const results = {};\n    if (obj == null || typeof obj !== 'object') {\n        return results;\n    }\n    const version = options.version || obj['v'] || 1;\n    const reportingMode = options.reportingMode || CMCD_REQUEST_MODE;\n    const keyFilter = version === 1 ? isCmcdV1Key : filterMap[reportingMode];\n    // Filter keys based on the version, reporting mode and options\n    let keys = Object.keys(obj).filter(keyFilter);\n    const filter = options.filter;\n    if (typeof filter === 'function') {\n        keys = keys.filter(filter);\n    }\n    // Ensure all required keys are present before sorting\n    const needsTimestamp = reportingMode === CMCD_RESPONSE_MODE || reportingMode === CMCD_EVENT_MODE;\n    if (needsTimestamp && !keys.includes('ts')) {\n        keys.push('ts');\n    }\n    if (version > 1 && !keys.includes('v')) {\n        keys.push('v');\n    }\n    const formatters = Object.assign({}, CMCD_FORMATTER_MAP, options.formatters);\n    const formatterOptions = {\n        version,\n        reportingMode,\n        baseUrl: options.baseUrl,\n    };\n    keys.sort().forEach(key => {\n        let value = obj[key];\n        const formatter = formatters[key];\n        if (typeof formatter === 'function') {\n            value = formatter(value, formatterOptions);\n        }\n        // Version should only be reported if not equal to 1.\n        if (key === 'v') {\n            if (version === 1) {\n                return;\n            }\n            else {\n                value = version;\n            }\n        }\n        // Playback rate should only be sent if not equal to 1.\n        if (key == 'pr' && value === 1) {\n            return;\n        }\n        // Ensure a timestamp is set for response and event modes\n        if (needsTimestamp && key === 'ts' && !Number.isFinite(value)) {\n            value = Date.now();\n        }\n        // ignore invalid values\n        if (!isValid(value)) {\n            return;\n        }\n        if (isTokenField(key) && typeof value === 'string') {\n            value = new SfToken(value);\n        }\n        results[key] = value;\n    });\n    return results;\n}\n//# sourceMappingURL=prepareCmcdData.js.map", "import { encodeSfDict } from '../structuredfield/encodeSfDict.js';\nimport { groupCmcdHeaders } from './groupCmcdHeaders.js';\nimport { prepareCmcdData } from './prepareCmcdData.js';\n/**\n * Convert a CMCD data object to request headers\n *\n * @param cmcd - The CMCD data object to convert.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The CMCD header shards.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/toCmcdHeaders.test.ts#example}\n */\nexport function toCmcdHeaders(cmcd, options = {}) {\n    const result = {};\n    if (!cmcd) {\n        return result;\n    }\n    const data = prepareCmcdData(cmcd, options);\n    const shards = groupCmcdHeaders(data, options === null || options === void 0 ? void 0 : options.customHeaderMap);\n    return Object.entries(shards)\n        .reduce((acc, [field, value]) => {\n        const shard = encodeSfDict(value, { whitespace: false });\n        if (shard) {\n            acc[field] = shard;\n        }\n        return acc;\n    }, result);\n}\n//# sourceMappingURL=toCmcdHeaders.js.map", "import { toCmcdHeaders } from './toCmcdHeaders.js';\n/**\n * Append CMCD query args to a header object.\n *\n * @param headers - The headers to append to.\n * @param cmcd - The CMCD object to append.\n * @param options - Encode options.\n *\n * @returns The headers with the CMCD header shards appended.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/appendCmcdHeaders.test.ts#example}\n */\nexport function appendCmcdHeaders(headers, cmcd, options) {\n    return Object.assign(headers, toCmcdHeaders(cmcd, options));\n}\n//# sourceMappingURL=appendCmcdHeaders.js.map", "/**\n * CMCD parameter name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_PARAM = 'CMCD';\n//# sourceMappingURL=CMCD_PARAM.js.map", "import { encodeSfDict } from '../structuredfield/encodeSfDict.js';\nimport { prepareCmcdData } from './prepareCmcdData.js';\n/**\n * Encode a CMCD object to a string.\n *\n * @param cmcd - The CMCD object to encode.\n * @param options - Options for encoding.\n *\n * @returns The encoded CMCD string.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/encodeCmcd.test.ts#example}\n */\nexport function encodeCmcd(cmcd, options = {}) {\n    if (!cmcd) {\n        return '';\n    }\n    return encodeSfDict(prepareCmcdData(cmcd, options), { whitespace: false });\n}\n//# sourceMappingURL=encodeCmcd.js.map", "import { encodeCmcd } from './encodeCmcd.js';\n/**\n * Convert a CMCD data object to a URL encoded string.\n *\n * @param cmcd - The CMCD object to convert.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The URL encoded CMCD data.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function toCmcdUrl(cmcd, options = {}) {\n    if (!cmcd) {\n        return '';\n    }\n    const params = encodeCmcd(cmcd, options);\n    return encodeURIComponent(params);\n}\n//# sourceMappingURL=toCmcdUrl.js.map", "import { CMCD_PARAM } from './CMCD_PARAM.js';\nimport { toCmcdUrl } from './toCmcdUrl.js';\n/**\n * Convert a CMCD data object to a query arg.\n *\n * @param cmcd - The CMCD object to convert.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The CMCD query arg.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/toCmcdQuery.test.ts#example}\n */\nexport function toCmcdQuery(cmcd, options = {}) {\n    if (!cmcd) {\n        return '';\n    }\n    const value = toCmcdUrl(cmcd, options);\n    return `${CMCD_PARAM}=${value}`;\n}\n//# sourceMappingURL=toCmcdQuery.js.map", "import { toCmcdQuery } from './toCmcdQuery.js';\nconst REGEX = /CMCD=[^&#]+/;\n/**\n * Append CMCD query args to a URL.\n *\n * @param url - The URL to append to.\n * @param cmcd - The CMCD object to append.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The URL with the CMCD query args appended.\n *\n * @group CMCD\n *\n * @beta\n *\n * @example\n * {@includeCode ../../test/cmcd/appendCmcdQuery.test.ts#example}\n */\nexport function appendCmcdQuery(url, cmcd, options) {\n    // TODO: Replace with URLSearchParams once we drop Safari < 10.1 & Chrome < 49 support.\n    // https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams\n    const query = toCmcdQuery(cmcd, options);\n    if (!query) {\n        return url;\n    }\n    if (REGEX.test(url)) {\n        return url.replace(REGEX, query);\n    }\n    const separator = url.includes('?') ? '&' : '?';\n    return `${url}${separator}${query}`;\n}\n//# sourceMappingURL=appendCmcdQuery.js.map", "import { CmcdObjectType } from '@svta/common-media-library/cmcd/CmcdObjectType';\nimport { CmcdStreamingFormat } from '@svta/common-media-library/cmcd/CmcdStreamingFormat';\nimport { appendCmcdHeaders } from '@svta/common-media-library/cmcd/appendCmcdHeaders';\nimport { appendCmcdQuery } from '@svta/common-media-library/cmcd/appendCmcdQuery';\nimport { Events } from '../events';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport type {\n  FragmentLoaderConstructor,\n  HlsConfig,\n  PlaylistLoaderConstructor,\n} from '../config';\nimport type Hls from '../hls';\nimport type { Fragment, Part } from '../loader/fragment';\nimport type { ExtendedSourceBuffer } from '../types/buffer';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { BufferCreatedData, MediaAttachedData } from '../types/events';\nimport type {\n  FragmentLoaderContext,\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderContext,\n  PlaylistLoaderContext,\n} from '../types/loader';\nimport type { Cmcd } from '@svta/common-media-library/cmcd/Cmcd';\nimport type { CmcdEncodeOptions } from '@svta/common-media-library/cmcd/CmcdEncodeOptions';\n\n/**\n * Controller to deal with Common Media Client Data (CMCD)\n * @see https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf\n */\nexport default class CMCDController implements ComponentAPI {\n  private hls: Hls;\n  private config: HlsConfig;\n  private media?: HTMLMediaElement;\n  private sid?: string;\n  private cid?: string;\n  private useHeaders: boolean = false;\n  private includeKeys?: string[];\n  private initialized: boolean = false;\n  private starved: boolean = false;\n  private buffering: boolean = true;\n  private audioBuffer?: ExtendedSourceBuffer;\n  private videoBuffer?: ExtendedSourceBuffer;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n    const config = (this.config = hls.config);\n    const { cmcd } = config;\n\n    if (cmcd != null) {\n      config.pLoader = this.createPlaylistLoader();\n      config.fLoader = this.createFragmentLoader();\n\n      this.sid = cmcd.sessionId || hls.sessionId;\n      this.cid = cmcd.contentId;\n      this.useHeaders = cmcd.useHeaders === true;\n      this.includeKeys = cmcd.includeKeys;\n      this.registerListeners();\n    }\n  }\n\n  private registerListeners() {\n    const hls = this.hls;\n    hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.on(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n    hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n  }\n\n  private unregisterListeners() {\n    const hls = this.hls;\n    hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.off(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n    hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n  }\n\n  destroy() {\n    this.unregisterListeners();\n    this.onMediaDetached();\n\n    // @ts-ignore\n    this.hls = this.config = this.audioBuffer = this.videoBuffer = null;\n    // @ts-ignore\n    this.onWaiting = this.onPlaying = this.media = null;\n  }\n\n  private onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) {\n    this.media = data.media;\n    this.media.addEventListener('waiting', this.onWaiting);\n    this.media.addEventListener('playing', this.onPlaying);\n  }\n\n  private onMediaDetached() {\n    if (!this.media) {\n      return;\n    }\n\n    this.media.removeEventListener('waiting', this.onWaiting);\n    this.media.removeEventListener('playing', this.onPlaying);\n\n    // @ts-ignore\n    this.media = null;\n  }\n\n  private onBufferCreated(\n    event: Events.BUFFER_CREATED,\n    data: BufferCreatedData,\n  ) {\n    this.audioBuffer = data.tracks.audio?.buffer;\n    this.videoBuffer = data.tracks.video?.buffer;\n  }\n\n  private onWaiting = () => {\n    if (this.initialized) {\n      this.starved = true;\n    }\n\n    this.buffering = true;\n  };\n\n  private onPlaying = () => {\n    if (!this.initialized) {\n      this.initialized = true;\n    }\n\n    this.buffering = false;\n  };\n\n  /**\n   * Create baseline CMCD data\n   */\n  private createData(): Cmcd {\n    return {\n      v: 1,\n      sf: CmcdStreamingFormat.HLS,\n      sid: this.sid,\n      cid: this.cid,\n      pr: this.media?.playbackRate,\n      mtp: this.hls.bandwidthEstimate / 1000,\n    };\n  }\n\n  /**\n   * Apply CMCD data to a request.\n   */\n  private apply(context: LoaderContext, data: Cmcd = {}) {\n    // apply baseline data\n    Object.assign(data, this.createData());\n\n    const isVideo =\n      data.ot === CmcdObjectType.INIT ||\n      data.ot === CmcdObjectType.VIDEO ||\n      data.ot === CmcdObjectType.MUXED;\n\n    if (this.starved && isVideo) {\n      data.bs = true;\n      data.su = true;\n      this.starved = false;\n    }\n\n    if (data.su == null) {\n      data.su = this.buffering;\n    }\n\n    // TODO: Implement rtp, nrr, dl\n\n    const { includeKeys } = this;\n    if (includeKeys) {\n      data = Object.keys(data).reduce((acc, key) => {\n        includeKeys.includes(key) && (acc[key] = data[key]);\n        return acc;\n      }, {});\n    }\n\n    const options: CmcdEncodeOptions = { baseUrl: context.url };\n\n    if (this.useHeaders) {\n      if (!context.headers) {\n        context.headers = {};\n      }\n\n      appendCmcdHeaders(context.headers, data, options);\n    } else {\n      context.url = appendCmcdQuery(context.url, data, options);\n    }\n  }\n\n  /**\n   * Apply CMCD data to a manifest request.\n   */\n  private applyPlaylistData = (context: PlaylistLoaderContext) => {\n    try {\n      this.apply(context, {\n        ot: CmcdObjectType.MANIFEST,\n        su: !this.initialized,\n      });\n    } catch (error) {\n      this.hls.logger.warn('Could not generate manifest CMCD data.', error);\n    }\n  };\n\n  /**\n   * Apply CMCD data to a segment request\n   */\n  private applyFragmentData = (context: FragmentLoaderContext) => {\n    try {\n      const { frag, part } = context;\n      const level = this.hls.levels[frag.level];\n      const ot = this.getObjectType(frag);\n      const data: Cmcd = { d: (part || frag).duration * 1000, ot };\n\n      if (\n        ot === CmcdObjectType.VIDEO ||\n        ot === CmcdObjectType.AUDIO ||\n        ot == CmcdObjectType.MUXED\n      ) {\n        data.br = level.bitrate / 1000;\n        data.tb = this.getTopBandwidth(ot) / 1000;\n        data.bl = this.getBufferLength(ot);\n      }\n\n      const next = part ? this.getNextPart(part) : this.getNextFrag(frag);\n\n      if (next?.url && next.url !== frag.url) {\n        data.nor = next.url;\n      }\n\n      this.apply(context, data);\n    } catch (error) {\n      this.hls.logger.warn('Could not generate segment CMCD data.', error);\n    }\n  };\n\n  private getNextFrag(fragment: Fragment): Fragment | undefined {\n    const levelDetails = this.hls.levels[fragment.level]?.details;\n    if (levelDetails) {\n      const index = (fragment.sn as number) - levelDetails.startSN;\n      return levelDetails.fragments[index + 1];\n    }\n\n    return undefined;\n  }\n\n  private getNextPart(part: Part): Part | undefined {\n    const { index, fragment } = part;\n    const partList = this.hls.levels[fragment.level]?.details?.partList;\n\n    if (partList) {\n      const { sn } = fragment;\n      for (let i = partList.length - 1; i >= 0; i--) {\n        const p = partList[i];\n        if (p.index === index && p.fragment.sn === sn) {\n          return partList[i + 1];\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * The CMCD object type.\n   */\n  private getObjectType(fragment: Fragment): CmcdObjectType | undefined {\n    const { type } = fragment;\n\n    if (type === 'subtitle') {\n      return CmcdObjectType.TIMED_TEXT;\n    }\n\n    if (fragment.sn === 'initSegment') {\n      return CmcdObjectType.INIT;\n    }\n\n    if (type === 'audio') {\n      return CmcdObjectType.AUDIO;\n    }\n\n    if (type === 'main') {\n      if (!this.hls.audioTracks.length) {\n        return CmcdObjectType.MUXED;\n      }\n\n      return CmcdObjectType.VIDEO;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get the highest bitrate.\n   */\n  private getTopBandwidth(type: CmcdObjectType) {\n    let bitrate: number = 0;\n    let levels;\n    const hls = this.hls;\n\n    if (type === CmcdObjectType.AUDIO) {\n      levels = hls.audioTracks;\n    } else {\n      const max = hls.maxAutoLevel;\n      const len = max > -1 ? max + 1 : hls.levels.length;\n      levels = hls.levels.slice(0, len);\n    }\n\n    levels.forEach((level) => {\n      if (level.bitrate > bitrate) {\n        bitrate = level.bitrate;\n      }\n    });\n\n    return bitrate > 0 ? bitrate : NaN;\n  }\n\n  /**\n   * Get the buffer length for a media type in milliseconds\n   */\n  private getBufferLength(type: CmcdObjectType) {\n    const media = this.media;\n    const buffer =\n      type === CmcdObjectType.AUDIO ? this.audioBuffer : this.videoBuffer;\n\n    if (!buffer || !media) {\n      return NaN;\n    }\n\n    const info = BufferHelper.bufferInfo(\n      buffer,\n      media.currentTime,\n      this.config.maxBufferHole,\n    );\n\n    return info.len * 1000;\n  }\n\n  /**\n   * Create a playlist loader\n   */\n  private createPlaylistLoader(): PlaylistLoaderConstructor | undefined {\n    const { pLoader } = this.config;\n    const apply = this.applyPlaylistData;\n    const Ctor = pLoader || (this.config.loader as PlaylistLoaderConstructor);\n\n    return class CmcdPlaylistLoader {\n      private loader: Loader<PlaylistLoaderContext>;\n\n      constructor(config: HlsConfig) {\n        this.loader = new Ctor(config);\n      }\n\n      get stats() {\n        return this.loader.stats;\n      }\n\n      get context() {\n        return this.loader.context;\n      }\n\n      destroy() {\n        this.loader.destroy();\n      }\n\n      abort() {\n        this.loader.abort();\n      }\n\n      load(\n        context: PlaylistLoaderContext,\n        config: LoaderConfiguration,\n        callbacks: LoaderCallbacks<PlaylistLoaderContext>,\n      ) {\n        apply(context);\n        this.loader.load(context, config, callbacks);\n      }\n    };\n  }\n\n  /**\n   * Create a playlist loader\n   */\n  private createFragmentLoader(): FragmentLoaderConstructor | undefined {\n    const { fLoader } = this.config;\n    const apply = this.applyFragmentData;\n    const Ctor = fLoader || (this.config.loader as FragmentLoaderConstructor);\n\n    return class CmcdFragmentLoader {\n      private loader: Loader<FragmentLoaderContext>;\n\n      constructor(config: HlsConfig) {\n        this.loader = new Ctor(config);\n      }\n\n      get stats() {\n        return this.loader.stats;\n      }\n\n      get context() {\n        return this.loader.context;\n      }\n\n      destroy() {\n        this.loader.destroy();\n      }\n\n      abort() {\n        this.loader.abort();\n      }\n\n      load(\n        context: FragmentLoaderContext,\n        config: LoaderConfiguration,\n        callbacks: LoaderCallbacks<FragmentLoaderContext>,\n      ) {\n        apply(context);\n        this.loader.load(context, config, callbacks);\n      }\n    };\n  }\n}\n", "import { ErrorActionFlags, NetworkErrorAction } from './error-controller';\nimport { ErrorDetails } from '../errors';\nimport { Events } from '../events';\nimport { Level } from '../types/level';\nimport {\n  type Loader,\n  type LoaderCallbacks,\n  type LoaderConfiguration,\n  type LoaderContext,\n  type LoaderResponse,\n  type LoaderStats,\n  PlaylistContextType,\n} from '../types/loader';\nimport { AttrList } from '../utils/attr-list';\nimport { reassignFragmentLevelIndexes } from '../utils/level-helper';\nimport { Logger } from '../utils/logger';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type { RetryConfig } from '../config';\nimport type Hls from '../hls';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  ErrorData,\n  ManifestLoadedData,\n  ManifestParsedData,\n  SteeringManifestLoadedData,\n} from '../types/events';\nimport type { MediaAttributes, MediaPlaylist } from '../types/media-playlist';\n\nexport type SteeringManifest = {\n  VERSION: 1;\n  TTL: number;\n  'RELOAD-URI'?: string;\n  'PATHWAY-PRIORITY': string[];\n  'PATHWAY-CLONES'?: PathwayClone[];\n};\n\nexport type PathwayClone = {\n  'BASE-ID': string;\n  ID: string;\n  'URI-REPLACEMENT': UriReplacement;\n};\n\nexport type UriReplacement = {\n  HOST?: string;\n  PARAMS?: { [queryParameter: string]: string };\n  'PER-VARIANT-URIS'?: { [stableVariantId: string]: string };\n  'PER-RENDITION-URIS'?: { [stableRenditionId: string]: string };\n};\n\nconst PATHWAY_PENALTY_DURATION_MS = 300000;\n\nexport default class ContentSteeringController\n  extends Logger\n  implements NetworkComponentAPI\n{\n  private readonly hls: Hls;\n  private loader: Loader<LoaderContext> | null = null;\n  private uri: string | null = null;\n  private pathwayId: string = '.';\n  private _pathwayPriority: string[] | null = null;\n  private timeToLoad: number = 300;\n  private reloadTimer: number = -1;\n  private updated: number = 0;\n  private started: boolean = false;\n  private enabled: boolean = true;\n  private levels: Level[] | null = null;\n  private audioTracks: MediaPlaylist[] | null = null;\n  private subtitleTracks: MediaPlaylist[] | null = null;\n  private penalizedPathways: { [pathwayId: string]: number } = {};\n\n  constructor(hls: Hls) {\n    super('content-steering', hls.logger);\n    this.hls = hls;\n    this.registerListeners();\n  }\n\n  private registerListeners() {\n    const hls = this.hls;\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  private unregisterListeners() {\n    const hls = this.hls;\n    if (!hls) {\n      return;\n    }\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  pathways() {\n    return (this.levels || []).reduce((pathways, level) => {\n      if (pathways.indexOf(level.pathwayId) === -1) {\n        pathways.push(level.pathwayId);\n      }\n      return pathways;\n    }, [] as string[]);\n  }\n\n  get pathwayPriority(): string[] | null {\n    return this._pathwayPriority;\n  }\n\n  set pathwayPriority(pathwayPriority: string[]) {\n    this.updatePathwayPriority(pathwayPriority);\n  }\n\n  startLoad() {\n    this.started = true;\n    this.clearTimeout();\n    if (this.enabled && this.uri) {\n      if (this.updated) {\n        const ttl = this.timeToLoad * 1000 - (performance.now() - this.updated);\n        if (ttl > 0) {\n          this.scheduleRefresh(this.uri, ttl);\n          return;\n        }\n      }\n      this.loadSteeringManifest(this.uri);\n    }\n  }\n\n  stopLoad() {\n    this.started = false;\n    if (this.loader) {\n      this.loader.destroy();\n      this.loader = null;\n    }\n    this.clearTimeout();\n  }\n\n  clearTimeout() {\n    if (this.reloadTimer !== -1) {\n      self.clearTimeout(this.reloadTimer);\n      this.reloadTimer = -1;\n    }\n  }\n\n  destroy() {\n    this.unregisterListeners();\n    this.stopLoad();\n    // @ts-ignore\n    this.hls = null;\n    this.levels = this.audioTracks = this.subtitleTracks = null;\n  }\n\n  removeLevel(levelToRemove: Level) {\n    const levels = this.levels;\n    if (levels) {\n      this.levels = levels.filter((level) => level !== levelToRemove);\n    }\n  }\n\n  private onManifestLoading() {\n    this.stopLoad();\n    this.enabled = true;\n    this.timeToLoad = 300;\n    this.updated = 0;\n    this.uri = null;\n    this.pathwayId = '.';\n    this.levels = this.audioTracks = this.subtitleTracks = null;\n  }\n\n  private onManifestLoaded(\n    event: Events.MANIFEST_LOADED,\n    data: ManifestLoadedData,\n  ) {\n    const { contentSteering } = data;\n    if (contentSteering === null) {\n      return;\n    }\n    this.pathwayId = contentSteering.pathwayId;\n    this.uri = contentSteering.uri;\n    if (this.started) {\n      this.startLoad();\n    }\n  }\n\n  private onManifestParsed(\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ) {\n    this.audioTracks = data.audioTracks;\n    this.subtitleTracks = data.subtitleTracks;\n  }\n\n  private onError(event: Events.ERROR, data: ErrorData) {\n    const { errorAction } = data;\n    if (\n      errorAction?.action === NetworkErrorAction.SendAlternateToPenaltyBox &&\n      errorAction.flags === ErrorActionFlags.MoveAllAlternatesMatchingHost\n    ) {\n      const levels = this.levels;\n      let pathwayPriority = this._pathwayPriority;\n      let errorPathway = this.pathwayId;\n      if (data.context) {\n        const { groupId, pathwayId, type } = data.context;\n        if (groupId && levels) {\n          errorPathway = this.getPathwayForGroupId(groupId, type, errorPathway);\n        } else if (pathwayId) {\n          errorPathway = pathwayId;\n        }\n      }\n      if (!(errorPathway in this.penalizedPathways)) {\n        this.penalizedPathways[errorPathway] = performance.now();\n      }\n      if (!pathwayPriority && levels) {\n        // If PATHWAY-PRIORITY was not provided, list pathways for error handling\n        pathwayPriority = this.pathways();\n      }\n      if (pathwayPriority && pathwayPriority.length > 1) {\n        this.updatePathwayPriority(pathwayPriority);\n        errorAction.resolved = this.pathwayId !== errorPathway;\n      }\n      if (data.details === ErrorDetails.BUFFER_APPEND_ERROR && !data.fatal) {\n        // Error will become fatal in buffer-controller when reaching `appendErrorMaxRetry`\n        // Stream-controllers are expected to reduce buffer length even if this is not deemed a QuotaExceededError\n        errorAction.resolved = true;\n      } else if (!errorAction.resolved) {\n        this.warn(\n          `Could not resolve ${data.details} (\"${\n            data.error.message\n          }\") with content-steering for Pathway: ${errorPathway} levels: ${\n            levels ? levels.length : levels\n          } priorities: ${stringify(\n            pathwayPriority,\n          )} penalized: ${stringify(this.penalizedPathways)}`,\n        );\n      }\n    }\n  }\n\n  public filterParsedLevels(levels: Level[]): Level[] {\n    // Filter levels to only include those that are in the initial pathway\n    this.levels = levels;\n    let pathwayLevels = this.getLevelsForPathway(this.pathwayId);\n    if (pathwayLevels.length === 0) {\n      const pathwayId = levels[0].pathwayId;\n      this.log(\n        `No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to \"${pathwayId}\"`,\n      );\n      pathwayLevels = this.getLevelsForPathway(pathwayId);\n      this.pathwayId = pathwayId;\n    }\n    if (pathwayLevels.length !== levels.length) {\n      this.log(\n        `Found ${pathwayLevels.length}/${levels.length} levels in Pathway \"${this.pathwayId}\"`,\n      );\n    }\n    return pathwayLevels;\n  }\n\n  private getLevelsForPathway(pathwayId: string): Level[] {\n    if (this.levels === null) {\n      return [];\n    }\n    return this.levels.filter((level) => pathwayId === level.pathwayId);\n  }\n\n  private updatePathwayPriority(pathwayPriority: string[]) {\n    this._pathwayPriority = pathwayPriority;\n    let levels: Level[] | undefined;\n\n    // Evaluate if we should remove the pathway from the penalized list\n    const penalizedPathways = this.penalizedPathways;\n    const now = performance.now();\n    Object.keys(penalizedPathways).forEach((pathwayId) => {\n      if (now - penalizedPathways[pathwayId] > PATHWAY_PENALTY_DURATION_MS) {\n        delete penalizedPathways[pathwayId];\n      }\n    });\n    for (let i = 0; i < pathwayPriority.length; i++) {\n      const pathwayId = pathwayPriority[i];\n      if (pathwayId in penalizedPathways) {\n        continue;\n      }\n      if (pathwayId === this.pathwayId) {\n        return;\n      }\n      const selectedIndex = this.hls.nextLoadLevel;\n      const selectedLevel: Level = this.hls.levels[selectedIndex];\n      levels = this.getLevelsForPathway(pathwayId);\n      if (levels.length > 0) {\n        this.log(`Setting Pathway to \"${pathwayId}\"`);\n        this.pathwayId = pathwayId;\n        reassignFragmentLevelIndexes(levels);\n        this.hls.trigger(Events.LEVELS_UPDATED, { levels });\n        // Set LevelController's level to trigger LEVEL_SWITCHING which loads playlist if needed\n        const levelAfterChange = this.hls.levels[selectedIndex];\n        if (selectedLevel && levelAfterChange && this.levels) {\n          if (\n            levelAfterChange.attrs['STABLE-VARIANT-ID'] !==\n              selectedLevel.attrs['STABLE-VARIANT-ID'] &&\n            levelAfterChange.bitrate !== selectedLevel.bitrate\n          ) {\n            this.log(\n              `Unstable Pathways change from bitrate ${selectedLevel.bitrate} to ${levelAfterChange.bitrate}`,\n            );\n          }\n          this.hls.nextLoadLevel = selectedIndex;\n        }\n        break;\n      }\n    }\n  }\n\n  private getPathwayForGroupId(\n    groupId: string,\n    type: PlaylistContextType,\n    defaultPathway: string,\n  ): string {\n    const levels = this.getLevelsForPathway(defaultPathway).concat(\n      this.levels || [],\n    );\n    for (let i = 0; i < levels.length; i++) {\n      if (\n        (type === PlaylistContextType.AUDIO_TRACK &&\n          levels[i].hasAudioGroup(groupId)) ||\n        (type === PlaylistContextType.SUBTITLE_TRACK &&\n          levels[i].hasSubtitleGroup(groupId))\n      ) {\n        return levels[i].pathwayId;\n      }\n    }\n    return defaultPathway;\n  }\n\n  private clonePathways(pathwayClones: PathwayClone[]) {\n    const levels = this.levels;\n    if (!levels) {\n      return;\n    }\n    const audioGroupCloneMap: Record<string, string> = {};\n    const subtitleGroupCloneMap: Record<string, string> = {};\n    pathwayClones.forEach((pathwayClone) => {\n      const {\n        ID: cloneId,\n        'BASE-ID': baseId,\n        'URI-REPLACEMENT': uriReplacement,\n      } = pathwayClone;\n      if (levels.some((level) => level.pathwayId === cloneId)) {\n        return;\n      }\n      const clonedVariants = this.getLevelsForPathway(baseId).map(\n        (baseLevel) => {\n          const attributes = new AttrList(baseLevel.attrs);\n          attributes['PATHWAY-ID'] = cloneId;\n          const clonedAudioGroupId: string | undefined =\n            attributes.AUDIO && `${attributes.AUDIO}_clone_${cloneId}`;\n          const clonedSubtitleGroupId: string | undefined =\n            attributes.SUBTITLES && `${attributes.SUBTITLES}_clone_${cloneId}`;\n          if (clonedAudioGroupId) {\n            audioGroupCloneMap[attributes.AUDIO] = clonedAudioGroupId;\n            attributes.AUDIO = clonedAudioGroupId;\n          }\n          if (clonedSubtitleGroupId) {\n            subtitleGroupCloneMap[attributes.SUBTITLES] = clonedSubtitleGroupId;\n            attributes.SUBTITLES = clonedSubtitleGroupId;\n          }\n          const url = performUriReplacement(\n            baseLevel.uri,\n            attributes['STABLE-VARIANT-ID'],\n            'PER-VARIANT-URIS',\n            uriReplacement,\n          );\n          const clonedLevel = new Level({\n            attrs: attributes,\n            audioCodec: baseLevel.audioCodec,\n            bitrate: baseLevel.bitrate,\n            height: baseLevel.height,\n            name: baseLevel.name,\n            url,\n            videoCodec: baseLevel.videoCodec,\n            width: baseLevel.width,\n          });\n          if (baseLevel.audioGroups) {\n            for (let i = 1; i < baseLevel.audioGroups.length; i++) {\n              clonedLevel.addGroupId(\n                'audio',\n                `${baseLevel.audioGroups[i]}_clone_${cloneId}`,\n              );\n            }\n          }\n          if (baseLevel.subtitleGroups) {\n            for (let i = 1; i < baseLevel.subtitleGroups.length; i++) {\n              clonedLevel.addGroupId(\n                'text',\n                `${baseLevel.subtitleGroups[i]}_clone_${cloneId}`,\n              );\n            }\n          }\n          return clonedLevel;\n        },\n      );\n      levels.push(...clonedVariants);\n      cloneRenditionGroups(\n        this.audioTracks,\n        audioGroupCloneMap,\n        uriReplacement,\n        cloneId,\n      );\n      cloneRenditionGroups(\n        this.subtitleTracks,\n        subtitleGroupCloneMap,\n        uriReplacement,\n        cloneId,\n      );\n    });\n  }\n\n  private loadSteeringManifest(uri: string) {\n    const config = this.hls.config;\n    const Loader = config.loader;\n    if (this.loader) {\n      this.loader.destroy();\n    }\n    this.loader = new Loader(config) as Loader<LoaderContext>;\n\n    let url: URL;\n    try {\n      url = new self.URL(uri);\n    } catch (error) {\n      this.enabled = false;\n      this.log(`Failed to parse Steering Manifest URI: ${uri}`);\n      return;\n    }\n    if (url.protocol !== 'data:') {\n      const throughput =\n        (this.hls.bandwidthEstimate || config.abrEwmaDefaultEstimate) | 0;\n      url.searchParams.set('_HLS_pathway', this.pathwayId);\n      url.searchParams.set('_HLS_throughput', '' + throughput);\n    }\n    const context: LoaderContext = {\n      responseType: 'json',\n      url: url.href,\n    };\n\n    const loadPolicy = config.steeringManifestLoadPolicy.default;\n    const legacyRetryCompatibility: RetryConfig | Record<string, void> =\n      loadPolicy.errorRetry || loadPolicy.timeoutRetry || {};\n    const loaderConfig: LoaderConfiguration = {\n      loadPolicy,\n      timeout: loadPolicy.maxLoadTimeMs,\n      maxRetry: legacyRetryCompatibility.maxNumRetry || 0,\n      retryDelay: legacyRetryCompatibility.retryDelayMs || 0,\n      maxRetryDelay: legacyRetryCompatibility.maxRetryDelayMs || 0,\n    };\n\n    const callbacks: LoaderCallbacks<LoaderContext> = {\n      onSuccess: (\n        response: LoaderResponse,\n        stats: LoaderStats,\n        context: LoaderContext,\n        networkDetails: any,\n      ) => {\n        this.log(`Loaded steering manifest: \"${url}\"`);\n        const steeringData = response.data as SteeringManifest;\n        if (steeringData?.VERSION !== 1) {\n          this.log(`Steering VERSION ${steeringData.VERSION} not supported!`);\n          return;\n        }\n        this.updated = performance.now();\n        this.timeToLoad = steeringData.TTL;\n        const {\n          'RELOAD-URI': reloadUri,\n          'PATHWAY-CLONES': pathwayClones,\n          'PATHWAY-PRIORITY': pathwayPriority,\n        } = steeringData;\n        if (reloadUri) {\n          try {\n            this.uri = new self.URL(reloadUri, url).href;\n          } catch (error) {\n            this.enabled = false;\n            this.log(\n              `Failed to parse Steering Manifest RELOAD-URI: ${reloadUri}`,\n            );\n            return;\n          }\n        }\n        this.scheduleRefresh(this.uri || context.url);\n        if (pathwayClones) {\n          this.clonePathways(pathwayClones);\n        }\n\n        const loadedSteeringData: SteeringManifestLoadedData = {\n          steeringManifest: steeringData,\n          url: url.toString(),\n        };\n        this.hls.trigger(Events.STEERING_MANIFEST_LOADED, loadedSteeringData);\n\n        if (pathwayPriority) {\n          this.updatePathwayPriority(pathwayPriority);\n        }\n      },\n\n      onError: (\n        error: { code: number; text: string },\n        context: LoaderContext,\n        networkDetails: any,\n        stats: LoaderStats,\n      ) => {\n        this.log(\n          `Error loading steering manifest: ${error.code} ${error.text} (${context.url})`,\n        );\n        this.stopLoad();\n        if (error.code === 410) {\n          this.enabled = false;\n          this.log(`Steering manifest ${context.url} no longer available`);\n          return;\n        }\n        let ttl = this.timeToLoad * 1000;\n        if (error.code === 429) {\n          const loader = this.loader;\n          if (typeof loader?.getResponseHeader === 'function') {\n            const retryAfter = loader.getResponseHeader('Retry-After');\n            if (retryAfter) {\n              ttl = parseFloat(retryAfter) * 1000;\n            }\n          }\n          this.log(`Steering manifest ${context.url} rate limited`);\n          return;\n        }\n        this.scheduleRefresh(this.uri || context.url, ttl);\n      },\n\n      onTimeout: (\n        stats: LoaderStats,\n        context: LoaderContext,\n        networkDetails: any,\n      ) => {\n        this.log(`Timeout loading steering manifest (${context.url})`);\n        this.scheduleRefresh(this.uri || context.url);\n      },\n    };\n\n    this.log(`Requesting steering manifest: ${url}`);\n    this.loader.load(context, loaderConfig, callbacks);\n  }\n\n  private scheduleRefresh(uri: string, ttlMs: number = this.timeToLoad * 1000) {\n    this.clearTimeout();\n    this.reloadTimer = self.setTimeout(() => {\n      const media = this.hls?.media;\n      if (media && !media.ended) {\n        this.loadSteeringManifest(uri);\n        return;\n      }\n      this.scheduleRefresh(uri, this.timeToLoad * 1000);\n    }, ttlMs);\n  }\n}\n\nfunction cloneRenditionGroups(\n  tracks: MediaPlaylist[] | null,\n  groupCloneMap: Record<string, string>,\n  uriReplacement: UriReplacement,\n  cloneId: string,\n) {\n  if (!tracks) {\n    return;\n  }\n  Object.keys(groupCloneMap).forEach((audioGroupId) => {\n    const clonedTracks = tracks\n      .filter((track) => track.groupId === audioGroupId)\n      .map((track) => {\n        const clonedTrack = Object.assign({}, track);\n        clonedTrack.details = undefined;\n        clonedTrack.attrs = new AttrList(clonedTrack.attrs) as MediaAttributes;\n        clonedTrack.url = clonedTrack.attrs.URI = performUriReplacement(\n          track.url,\n          track.attrs['STABLE-RENDITION-ID'],\n          'PER-RENDITION-URIS',\n          uriReplacement,\n        );\n        clonedTrack.groupId = clonedTrack.attrs['GROUP-ID'] =\n          groupCloneMap[audioGroupId];\n        clonedTrack.attrs['PATHWAY-ID'] = cloneId;\n        return clonedTrack;\n      });\n    tracks.push(...clonedTracks);\n  });\n}\n\nfunction performUriReplacement(\n  uri: string,\n  stableId: string | undefined,\n  perOptionKey: 'PER-VARIANT-URIS' | 'PER-RENDITION-URIS',\n  uriReplacement: UriReplacement,\n): string {\n  const {\n    HOST: host,\n    PARAMS: params,\n    [perOptionKey]: perOptionUris,\n  } = uriReplacement;\n  let perVariantUri;\n  if (stableId) {\n    perVariantUri = perOptionUris?.[stableId];\n    if (perVariantUri) {\n      uri = perVariantUri;\n    }\n  }\n  const url = new self.URL(uri);\n  if (host && !perVariantUri) {\n    url.host = host;\n  }\n  if (params) {\n    Object.keys(params)\n      .sort()\n      .forEach((key) => {\n        if (key) {\n          url.searchParams.set(key, params[key]);\n        }\n      });\n  }\n  return url.href;\n}\n", "/**\n * @author Stephan Hesse <disparat@gmail.com> | <tchakabam@gmail.com>\n *\n * DRM support for Hls.js\n */\nimport { EventEmitter } from 'eventemitter3';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { LevelKey } from '../loader/level-key';\nimport { arrayValuesMatch } from '../utils/arrays';\nimport {\n  addEventListener,\n  removeEventListener,\n} from '../utils/event-listener-helper';\nimport { arrayToHex } from '../utils/hex';\nimport { changeEndianness } from '../utils/keysystem-util';\nimport { Logger } from '../utils/logger';\nimport {\n  getKeySystemsForConfig,\n  getSupportedMediaKeySystemConfigurations,\n  isPersistentSessionType,\n  keySystemDomainToKeySystemFormat,\n  keySystemFormatToKeySystemDomain,\n  KeySystems,\n  requestMediaKeySystemAccess,\n} from '../utils/mediakeys-helper';\nimport { bin2str, parseSinf } from '../utils/mp4-tools';\nimport { base64Decode } from '../utils/numeric-encoding-utils';\nimport { stringify } from '../utils/safe-json-stringify';\nimport { strToUtf8array } from '../utils/utf8-utils';\nimport type { EMEControllerConfig, HlsConfig, LoadPolicy } from '../config';\nimport type Hls from '../hls';\nimport type { Fragment } from '../loader/fragment';\nimport type { DecryptData } from '../loader/level-key';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  ErrorData,\n  KeyLoadedData,\n  ManifestLoadedData,\n  MediaAttachedData,\n} from '../types/events';\nimport type {\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderContext,\n} from '../types/loader';\nimport type { KeySystemFormats } from '../utils/mediakeys-helper';\n\ninterface KeySystemAccessPromises {\n  keySystemAccess: Promise<MediaKeySystemAccess>;\n  mediaKeys?: Promise<MediaKeys>;\n  certificate?: Promise<BufferSource | void>;\n  hasMediaKeys?: boolean;\n}\n\nexport interface MediaKeySessionContext {\n  keySystem: KeySystems;\n  mediaKeys: MediaKeys;\n  decryptdata: LevelKey;\n  mediaKeysSession: MediaKeySession;\n  keyStatus?: MediaKeyStatus;\n  keyStatusTimeouts?: { [keyId: string]: number };\n  licenseXhr?: XMLHttpRequest;\n  _onmessage?: (this: MediaKeySession, ev: MediaKeyMessageEvent) => any;\n  _onkeystatuseschange?: (this: MediaKeySession, ev: Event) => any;\n}\n\n/**\n * Controller to deal with encrypted media extensions (EME)\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Encrypted_Media_Extensions_API\n *\n * @class\n * @constructor\n */\nclass EMEController extends Logger implements ComponentAPI {\n  public static CDMCleanupPromise: Promise<void> | void;\n\n  private readonly hls: Hls;\n  private readonly config: EMEControllerConfig & {\n    loader: { new (confg: HlsConfig): Loader<LoaderContext> };\n    certLoadPolicy: LoadPolicy;\n    keyLoadPolicy: LoadPolicy;\n  };\n  private media: HTMLMediaElement | null = null;\n  private mediaResolved?: () => void;\n  private keyFormatPromise: Promise<KeySystemFormats> | null = null;\n  private keySystemAccessPromises: {\n    [keysystem: string]: KeySystemAccessPromises | undefined;\n  } = {};\n  private _requestLicenseFailureCount: number = 0;\n  private mediaKeySessions: MediaKeySessionContext[] = [];\n  private keyIdToKeySessionPromise: {\n    [keyId: string]: Promise<MediaKeySessionContext> | undefined;\n  } = {};\n  private mediaKeys: MediaKeys | null = null;\n  private setMediaKeysQueue: Promise<void>[] = EMEController.CDMCleanupPromise\n    ? [EMEController.CDMCleanupPromise]\n    : [];\n  private bannedKeyIds: { [keyId: string]: MediaKeyStatus | undefined } = {};\n\n  constructor(hls: Hls) {\n    super('eme', hls.logger);\n    this.hls = hls;\n    this.config = hls.config;\n    this.registerListeners();\n  }\n\n  public destroy() {\n    this.onDestroying();\n    this.onMediaDetached();\n    // Remove any references that could be held in config options or callbacks\n    const config = this.config;\n    config.requestMediaKeySystemAccessFunc = null;\n    config.licenseXhrSetup = config.licenseResponseCallback = undefined;\n    config.drmSystems = config.drmSystemOptions = {};\n    // @ts-ignore\n    this.hls = this.config = this.keyIdToKeySessionPromise = null;\n    // @ts-ignore\n    this.onMediaEncrypted = this.onWaitingForKey = null;\n  }\n\n  private registerListeners() {\n    this.hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    this.hls.on(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n    this.hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    this.hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    this.hls.on(Events.DESTROYING, this.onDestroying, this);\n  }\n\n  private unregisterListeners() {\n    this.hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    this.hls.off(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n    this.hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    this.hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    this.hls.off(Events.DESTROYING, this.onDestroying, this);\n  }\n\n  private getLicenseServerUrl(keySystem: KeySystems): string | undefined {\n    const { drmSystems, widevineLicenseUrl } = this.config;\n    const keySystemConfiguration = drmSystems?.[keySystem];\n\n    if (keySystemConfiguration) {\n      return keySystemConfiguration.licenseUrl;\n    }\n\n    // For backward compatibility\n    if (keySystem === KeySystems.WIDEVINE && widevineLicenseUrl) {\n      return widevineLicenseUrl;\n    }\n  }\n\n  private getLicenseServerUrlOrThrow(keySystem: KeySystems): string | never {\n    const url = this.getLicenseServerUrl(keySystem);\n    if (url === undefined) {\n      throw new Error(\n        `no license server URL configured for key-system \"${keySystem}\"`,\n      );\n    }\n    return url;\n  }\n\n  private getServerCertificateUrl(keySystem: KeySystems): string | void {\n    const { drmSystems } = this.config;\n    const keySystemConfiguration = drmSystems?.[keySystem];\n\n    if (keySystemConfiguration) {\n      return keySystemConfiguration.serverCertificateUrl;\n    } else {\n      this.log(`No Server Certificate in config.drmSystems[\"${keySystem}\"]`);\n    }\n  }\n\n  private attemptKeySystemAccess(\n    keySystemsToAttempt: KeySystems[],\n  ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> {\n    const levels = this.hls.levels;\n    const uniqueCodec = (value: string | undefined, i, a): value is string =>\n      !!value && a.indexOf(value) === i;\n    const audioCodecs = levels\n      .map((level) => level.audioCodec)\n      .filter(uniqueCodec);\n    const videoCodecs = levels\n      .map((level) => level.videoCodec)\n      .filter(uniqueCodec);\n    if (audioCodecs.length + videoCodecs.length === 0) {\n      videoCodecs.push('avc1.42e01e');\n    }\n\n    return new Promise(\n      (\n        resolve: (result: {\n          keySystem: KeySystems;\n          mediaKeys: MediaKeys;\n        }) => void,\n        reject: (Error) => void,\n      ) => {\n        const attempt = (keySystems) => {\n          const keySystem = keySystems.shift();\n          this.getMediaKeysPromise(keySystem, audioCodecs, videoCodecs)\n            .then((mediaKeys) => resolve({ keySystem, mediaKeys }))\n            .catch((error) => {\n              if (keySystems.length) {\n                attempt(keySystems);\n              } else if (error instanceof EMEKeyError) {\n                reject(error);\n              } else {\n                reject(\n                  new EMEKeyError(\n                    {\n                      type: ErrorTypes.KEY_SYSTEM_ERROR,\n                      details: ErrorDetails.KEY_SYSTEM_NO_ACCESS,\n                      error,\n                      fatal: true,\n                    },\n                    error.message,\n                  ),\n                );\n              }\n            });\n        };\n        attempt(keySystemsToAttempt);\n      },\n    );\n  }\n\n  private requestMediaKeySystemAccess(\n    keySystem: KeySystems,\n    supportedConfigurations: MediaKeySystemConfiguration[],\n  ): Promise<MediaKeySystemAccess> {\n    const { requestMediaKeySystemAccessFunc } = this.config;\n    if (!(typeof requestMediaKeySystemAccessFunc === 'function')) {\n      let errMessage = `Configured requestMediaKeySystemAccess is not a function ${requestMediaKeySystemAccessFunc}`;\n      if (\n        requestMediaKeySystemAccess === null &&\n        self.location.protocol === 'http:'\n      ) {\n        errMessage = `navigator.requestMediaKeySystemAccess is not available over insecure protocol ${location.protocol}`;\n      }\n      return Promise.reject(new Error(errMessage));\n    }\n\n    return requestMediaKeySystemAccessFunc(keySystem, supportedConfigurations);\n  }\n\n  private getMediaKeysPromise(\n    keySystem: KeySystems,\n    audioCodecs: string[],\n    videoCodecs: string[],\n  ): Promise<MediaKeys> {\n    // This can throw, but is caught in event handler callpath\n    const mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations(\n      keySystem,\n      audioCodecs,\n      videoCodecs,\n      this.config.drmSystemOptions || {},\n    );\n    let keySystemAccessPromises = this.keySystemAccessPromises[keySystem];\n    let keySystemAccess = keySystemAccessPromises?.keySystemAccess;\n    if (!keySystemAccess) {\n      this.log(\n        `Requesting encrypted media \"${keySystem}\" key-system access with config: ${stringify(\n          mediaKeySystemConfigs,\n        )}`,\n      );\n      keySystemAccess = this.requestMediaKeySystemAccess(\n        keySystem,\n        mediaKeySystemConfigs,\n      );\n      const keySystemAccessPromisesNew = (keySystemAccessPromises =\n        this.keySystemAccessPromises[keySystem] =\n          {\n            keySystemAccess,\n          }) as KeySystemAccessPromises;\n      keySystemAccess.catch((error) => {\n        this.log(\n          `Failed to obtain access to key-system \"${keySystem}\": ${error}`,\n        );\n      });\n      return keySystemAccess.then((mediaKeySystemAccess) => {\n        this.log(\n          `Access for key-system \"${mediaKeySystemAccess.keySystem}\" obtained`,\n        );\n\n        const certificateRequest = this.fetchServerCertificate(keySystem);\n\n        this.log(`Create media-keys for \"${keySystem}\"`);\n        const mediaKeys = (keySystemAccessPromisesNew.mediaKeys =\n          mediaKeySystemAccess.createMediaKeys().then((mediaKeys) => {\n            this.log(`Media-keys created for \"${keySystem}\"`);\n            keySystemAccessPromisesNew.hasMediaKeys = true;\n            return certificateRequest.then((certificate) => {\n              if (certificate) {\n                return this.setMediaKeysServerCertificate(\n                  mediaKeys,\n                  keySystem,\n                  certificate,\n                );\n              }\n              return mediaKeys;\n            });\n          }));\n\n        mediaKeys.catch((error) => {\n          this.error(\n            `Failed to create media-keys for \"${keySystem}\"}: ${error}`,\n          );\n        });\n\n        return mediaKeys;\n      });\n    }\n    return keySystemAccess.then(() => keySystemAccessPromises!.mediaKeys!);\n  }\n\n  private createMediaKeySessionContext({\n    decryptdata,\n    keySystem,\n    mediaKeys,\n  }: {\n    decryptdata: LevelKey;\n    keySystem: KeySystems;\n    mediaKeys: MediaKeys;\n  }): MediaKeySessionContext {\n    this.log(\n      `Creating key-system session \"${keySystem}\" keyId: ${arrayToHex(\n        decryptdata.keyId || ([] as number[]),\n      )} keyUri: ${decryptdata.uri}`,\n    );\n\n    const mediaKeysSession = mediaKeys.createSession();\n\n    const mediaKeySessionContext: MediaKeySessionContext = {\n      decryptdata,\n      keySystem,\n      mediaKeys,\n      mediaKeysSession,\n      keyStatus: 'status-pending',\n    };\n\n    this.mediaKeySessions.push(mediaKeySessionContext);\n\n    return mediaKeySessionContext;\n  }\n\n  private renewKeySession(mediaKeySessionContext: MediaKeySessionContext) {\n    const decryptdata = mediaKeySessionContext.decryptdata;\n    if (decryptdata.pssh) {\n      const keySessionContext = this.createMediaKeySessionContext(\n        mediaKeySessionContext,\n      );\n      const keyId = getKeyIdString(decryptdata);\n      const scheme = 'cenc';\n      this.keyIdToKeySessionPromise[keyId] =\n        this.generateRequestWithPreferredKeySession(\n          keySessionContext,\n          scheme,\n          decryptdata.pssh.buffer,\n          'expired',\n        );\n    } else {\n      this.warn(`Could not renew expired session. Missing pssh initData.`);\n    }\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.removeSession(mediaKeySessionContext);\n  }\n\n  private updateKeySession(\n    mediaKeySessionContext: MediaKeySessionContext,\n    data: Uint8Array<ArrayBuffer>,\n  ): Promise<void> {\n    const keySession = mediaKeySessionContext.mediaKeysSession;\n    this.log(\n      `Updating key-session \"${keySession.sessionId}\" for keyId ${arrayToHex(\n        mediaKeySessionContext.decryptdata.keyId || [],\n      )}\n      } (data length: ${data.byteLength})`,\n    );\n    return keySession.update(data);\n  }\n\n  public getSelectedKeySystemFormats(): KeySystemFormats[] {\n    return (Object.keys(this.keySystemAccessPromises) as KeySystems[])\n      .map((keySystem) => ({\n        keySystem,\n        hasMediaKeys: this.keySystemAccessPromises[keySystem]!.hasMediaKeys,\n      }))\n      .filter(({ hasMediaKeys }) => !!hasMediaKeys)\n      .map(({ keySystem }) => keySystemDomainToKeySystemFormat(keySystem))\n      .filter((keySystem): keySystem is KeySystemFormats => !!keySystem);\n  }\n\n  public getKeySystemAccess(keySystemsToAttempt: KeySystems[]): Promise<void> {\n    return this.getKeySystemSelectionPromise(keySystemsToAttempt).then(\n      ({ keySystem, mediaKeys }) => {\n        return this.attemptSetMediaKeys(keySystem, mediaKeys);\n      },\n    );\n  }\n\n  public selectKeySystem(\n    keySystemsToAttempt: KeySystems[],\n  ): Promise<KeySystemFormats> {\n    return new Promise((resolve, reject) => {\n      this.getKeySystemSelectionPromise(keySystemsToAttempt)\n        .then(({ keySystem }) => {\n          const keySystemFormat = keySystemDomainToKeySystemFormat(keySystem);\n          if (keySystemFormat) {\n            resolve(keySystemFormat);\n          } else {\n            reject(\n              new Error(`Unable to find format for key-system \"${keySystem}\"`),\n            );\n          }\n        })\n        .catch(reject);\n    });\n  }\n\n  public selectKeySystemFormat(frag: Fragment): Promise<KeySystemFormats> {\n    const keyFormats = Object.keys(frag.levelkeys || {}) as KeySystemFormats[];\n    if (!this.keyFormatPromise) {\n      this.log(\n        `Selecting key-system from fragment (sn: ${frag.sn} ${frag.type}: ${\n          frag.level\n        }) key formats ${keyFormats.join(', ')}`,\n      );\n      this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n    }\n    return this.keyFormatPromise;\n  }\n\n  private getKeyFormatPromise(\n    keyFormats: KeySystemFormats[],\n  ): Promise<KeySystemFormats> {\n    const keySystemsInConfig = getKeySystemsForConfig(this.config);\n    const keySystemsToAttempt = keyFormats\n      .map(keySystemFormatToKeySystemDomain)\n      .filter(\n        (value) => !!value && keySystemsInConfig.indexOf(value) !== -1,\n      ) as any as KeySystems[];\n\n    return this.selectKeySystem(keySystemsToAttempt);\n  }\n\n  public getKeyStatus(decryptdata: LevelKey): MediaKeyStatus | undefined {\n    const { mediaKeySessions } = this;\n    for (let i = 0; i < mediaKeySessions.length; i++) {\n      const status = getKeyStatus(decryptdata, mediaKeySessions[i]);\n      if (status) {\n        return status;\n      }\n    }\n    return undefined;\n  }\n\n  public loadKey(data: KeyLoadedData): Promise<MediaKeySessionContext> {\n    const decryptdata = data.keyInfo.decryptdata;\n\n    const keyId = getKeyIdString(decryptdata);\n    const badStatus = this.bannedKeyIds[keyId];\n    if (badStatus || this.getKeyStatus(decryptdata) === 'internal-error') {\n      const error = getKeyStatusError(\n        badStatus || 'internal-error',\n        decryptdata,\n      );\n      this.handleError(error, data.frag);\n      return Promise.reject(error);\n    }\n    const keyDetails = `(keyId: ${keyId} format: \"${decryptdata.keyFormat}\" method: ${decryptdata.method} uri: ${decryptdata.uri})`;\n\n    this.log(`Starting session for key ${keyDetails}`);\n\n    const keyContextPromise = this.keyIdToKeySessionPromise[keyId];\n    if (!keyContextPromise) {\n      const keySessionContextPromise = this.getKeySystemForKeyPromise(\n        decryptdata,\n      )\n        .then(({ keySystem, mediaKeys }) => {\n          this.throwIfDestroyed();\n          this.log(\n            `Handle encrypted media sn: ${data.frag.sn} ${data.frag.type}: ${data.frag.level} using key ${keyDetails}`,\n          );\n\n          return this.attemptSetMediaKeys(keySystem, mediaKeys).then(() => {\n            this.throwIfDestroyed();\n            return this.createMediaKeySessionContext({\n              keySystem,\n              mediaKeys,\n              decryptdata,\n            });\n          });\n        })\n        .then((keySessionContext) => {\n          const scheme = 'cenc';\n          const initData = decryptdata.pssh ? decryptdata.pssh.buffer : null;\n          return this.generateRequestWithPreferredKeySession(\n            keySessionContext,\n            scheme,\n            initData,\n            'playlist-key',\n          );\n        });\n\n      keySessionContextPromise.catch((error) =>\n        this.handleError(error, data.frag),\n      );\n      this.keyIdToKeySessionPromise[keyId] = keySessionContextPromise;\n\n      return keySessionContextPromise;\n    }\n\n    // Re-emit error for playlist key loading\n    keyContextPromise.catch((error) => {\n      if (error instanceof EMEKeyError) {\n        const errorData = { ...error.data };\n        if (this.getKeyStatus(decryptdata) === 'internal-error') {\n          errorData.decryptdata = decryptdata;\n        }\n        const clonedError = new EMEKeyError(errorData, error.message);\n        this.handleError(clonedError, data.frag);\n      }\n    });\n\n    return keyContextPromise;\n  }\n\n  private throwIfDestroyed(message = 'Invalid state'): void | never {\n    if (!this.hls as any) {\n      throw new Error('invalid state');\n    }\n  }\n\n  private handleError(error: EMEKeyError | Error, frag?: Fragment) {\n    if (!this.hls as any) {\n      return;\n    }\n\n    if (error instanceof EMEKeyError) {\n      if (frag) {\n        error.data.frag = frag;\n      }\n      const levelKey = error.data.decryptdata;\n      this.error(\n        `${error.message}${\n          levelKey ? ` (${arrayToHex(levelKey.keyId || [])})` : ''\n        }`,\n      );\n      this.hls.trigger(Events.ERROR, error.data);\n    } else {\n      this.error(error.message);\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_KEYS,\n        error,\n        fatal: true,\n      });\n    }\n  }\n\n  private getKeySystemForKeyPromise(\n    decryptdata: LevelKey,\n  ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> {\n    const keyId = getKeyIdString(decryptdata);\n    const mediaKeySessionContext = this.keyIdToKeySessionPromise[keyId];\n    if (!mediaKeySessionContext) {\n      const keySystem = keySystemFormatToKeySystemDomain(\n        decryptdata.keyFormat as KeySystemFormats,\n      );\n      const keySystemsToAttempt = keySystem\n        ? [keySystem]\n        : getKeySystemsForConfig(this.config);\n      return this.attemptKeySystemAccess(keySystemsToAttempt);\n    }\n    return mediaKeySessionContext;\n  }\n\n  private getKeySystemSelectionPromise(\n    keySystemsToAttempt: KeySystems[],\n  ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> | never {\n    if (!keySystemsToAttempt.length) {\n      keySystemsToAttempt = getKeySystemsForConfig(this.config);\n    }\n    if (keySystemsToAttempt.length === 0) {\n      throw new EMEKeyError(\n        {\n          type: ErrorTypes.KEY_SYSTEM_ERROR,\n          details: ErrorDetails.KEY_SYSTEM_NO_CONFIGURED_LICENSE,\n          fatal: true,\n        },\n        `Missing key-system license configuration options ${stringify({\n          drmSystems: this.config.drmSystems,\n        })}`,\n      );\n    }\n    return this.attemptKeySystemAccess(keySystemsToAttempt);\n  }\n\n  private onMediaEncrypted = (event: MediaEncryptedEvent) => {\n    const { initDataType, initData } = event;\n    const logMessage = `\"${event.type}\" event: init data type: \"${initDataType}\"`;\n    this.debug(logMessage);\n\n    // Ignore event when initData is null\n    if (initData === null) {\n      return;\n    }\n\n    if (!this.keyFormatPromise) {\n      let keySystems = Object.keys(\n        this.keySystemAccessPromises,\n      ) as KeySystems[];\n      if (!keySystems.length) {\n        keySystems = getKeySystemsForConfig(this.config);\n      }\n      const keyFormats = keySystems\n        .map(keySystemDomainToKeySystemFormat)\n        .filter((k) => !!k) as KeySystemFormats[];\n      this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n    }\n\n    this.keyFormatPromise\n      .then((keySystemFormat) => {\n        const keySystem = keySystemFormatToKeySystemDomain(keySystemFormat);\n        if (initDataType !== 'sinf' || keySystem !== KeySystems.FAIRPLAY) {\n          this.log(\n            `Ignoring \"${event.type}\" event with init data type: \"${initDataType}\" for selected key-system ${keySystem}`,\n          );\n          return;\n        }\n\n        // Match sinf keyId to playlist skd://keyId=\n        let keyId: Uint8Array<ArrayBuffer> | undefined;\n        try {\n          const json = bin2str(new Uint8Array(initData));\n          const sinf = base64Decode(JSON.parse(json).sinf);\n          const tenc = parseSinf(sinf);\n          if (!tenc) {\n            throw new Error(\n              `'schm' box missing or not cbcs/cenc with schi > tenc`,\n            );\n          }\n          keyId = new Uint8Array(tenc.subarray(8, 24));\n        } catch (error) {\n          this.warn(`${logMessage} Failed to parse sinf: ${error}`);\n          return;\n        }\n\n        const keyIdHex = arrayToHex(keyId);\n        const { keyIdToKeySessionPromise, mediaKeySessions } = this;\n        let keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex];\n\n        for (let i = 0; i < mediaKeySessions.length; i++) {\n          // Match playlist key\n          const keyContext = mediaKeySessions[i];\n          const decryptdata = keyContext.decryptdata;\n          if (!decryptdata.keyId) {\n            continue;\n          }\n          const oldKeyIdHex = arrayToHex(decryptdata.keyId);\n          if (\n            arrayValuesMatch(keyId, decryptdata.keyId) ||\n            decryptdata.uri.replace(/-/g, '').indexOf(keyIdHex) !== -1\n          ) {\n            keySessionContextPromise = keyIdToKeySessionPromise[oldKeyIdHex];\n            if (!keySessionContextPromise) {\n              continue;\n            }\n            if (decryptdata.pssh) {\n              break;\n            }\n            delete keyIdToKeySessionPromise[oldKeyIdHex];\n            decryptdata.pssh = new Uint8Array(initData);\n            decryptdata.keyId = keyId;\n            keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex] =\n              keySessionContextPromise.then(() => {\n                return this.generateRequestWithPreferredKeySession(\n                  keyContext,\n                  initDataType,\n                  initData,\n                  'encrypted-event-key-match',\n                );\n              });\n            keySessionContextPromise.catch((error) => this.handleError(error));\n            break;\n          }\n        }\n\n        if (!keySessionContextPromise) {\n          this.handleError(\n            new Error(\n              `Key ID ${keyIdHex} not encountered in playlist. Key-system sessions ${mediaKeySessions.length}.`,\n            ),\n          );\n        }\n      })\n      .catch((error) => this.handleError(error));\n  };\n\n  private onWaitingForKey = (event: Event) => {\n    this.log(`\"${event.type}\" event`);\n  };\n\n  private attemptSetMediaKeys(\n    keySystem: KeySystems,\n    mediaKeys: MediaKeys,\n  ): Promise<void> {\n    this.mediaResolved = undefined;\n    if (this.mediaKeys === mediaKeys) {\n      return Promise.resolve();\n    }\n    const queue = this.setMediaKeysQueue.slice();\n\n    this.log(`Setting media-keys for \"${keySystem}\"`);\n    // Only one setMediaKeys() can run at one time, and multiple setMediaKeys() operations\n    // can be queued for execution for multiple key sessions.\n    const setMediaKeysPromise = Promise.all(queue).then(() => {\n      if (!this.media) {\n        return new Promise((resolve: (value?: void) => void, reject) => {\n          this.mediaResolved = () => {\n            this.mediaResolved = undefined;\n            if (!this.media) {\n              return reject(\n                new Error(\n                  'Attempted to set mediaKeys without media element attached',\n                ),\n              );\n            }\n            this.mediaKeys = mediaKeys;\n            this.media.setMediaKeys(mediaKeys).then(resolve).catch(reject);\n          };\n        });\n      }\n      return this.media.setMediaKeys(mediaKeys);\n    });\n    this.mediaKeys = mediaKeys;\n    this.setMediaKeysQueue.push(setMediaKeysPromise);\n    return setMediaKeysPromise.then(() => {\n      this.log(`Media-keys set for \"${keySystem}\"`);\n      queue.push(setMediaKeysPromise!);\n      this.setMediaKeysQueue = this.setMediaKeysQueue.filter(\n        (p) => queue.indexOf(p) === -1,\n      );\n    });\n  }\n\n  private generateRequestWithPreferredKeySession(\n    context: MediaKeySessionContext,\n    initDataType: string,\n    initData: ArrayBuffer | null,\n    reason:\n      | 'playlist-key'\n      | 'encrypted-event-key-match'\n      | 'encrypted-event-no-match'\n      | 'expired',\n  ): Promise<MediaKeySessionContext> | never {\n    const generateRequestFilter =\n      this.config.drmSystems?.[context.keySystem]?.generateRequest;\n    if (generateRequestFilter) {\n      try {\n        const mappedInitData: ReturnType<typeof generateRequestFilter> =\n          generateRequestFilter.call(this.hls, initDataType, initData, context);\n        if (!mappedInitData) {\n          throw new Error(\n            'Invalid response from configured generateRequest filter',\n          );\n        }\n        initDataType = mappedInitData.initDataType;\n        initData = mappedInitData.initData ? mappedInitData.initData : null;\n        context.decryptdata.pssh = initData ? new Uint8Array(initData) : null;\n      } catch (error) {\n        this.warn(error.message);\n        if ((this.hls as any) && this.hls.config.debug) {\n          throw error;\n        }\n      }\n    }\n\n    if (initData === null) {\n      this.log(`Skipping key-session request for \"${reason}\" (no initData)`);\n      return Promise.resolve(context);\n    }\n\n    const keyId = getKeyIdString(context.decryptdata);\n    const keyUri = context.decryptdata.uri;\n    this.log(\n      `Generating key-session request for \"${reason}\" keyId: ${keyId} URI: ${keyUri} (init data type: ${initDataType} length: ${\n        initData.byteLength\n      })`,\n    );\n\n    const licenseStatus = new EventEmitter();\n\n    const onmessage = (context._onmessage = (event: MediaKeyMessageEvent) => {\n      const keySession = context.mediaKeysSession;\n      if (!keySession as any) {\n        licenseStatus.emit('error', new Error('invalid state'));\n        return;\n      }\n      const { messageType, message } = event;\n      this.log(\n        `\"${messageType}\" message event for session \"${keySession.sessionId}\" message size: ${message.byteLength}`,\n      );\n      if (\n        messageType === 'license-request' ||\n        messageType === 'license-renewal'\n      ) {\n        this.renewLicense(context, message).catch((error) => {\n          if (licenseStatus.eventNames().length) {\n            licenseStatus.emit('error', error);\n          } else {\n            this.handleError(error);\n          }\n        });\n      } else if (messageType === 'license-release') {\n        if (context.keySystem === KeySystems.FAIRPLAY) {\n          this.updateKeySession(context, strToUtf8array('acknowledged'))\n            .then(() => this.removeSession(context))\n            .catch((error) => this.handleError(error));\n        }\n      } else {\n        this.warn(`unhandled media key message type \"${messageType}\"`);\n      }\n    });\n\n    const handleKeyStatus = (\n      keyStatus: MediaKeyStatus,\n      context: MediaKeySessionContext,\n    ) => {\n      context.keyStatus = keyStatus;\n      let keyError: EMEKeyError | Error | undefined;\n      if (keyStatus.startsWith('usable')) {\n        licenseStatus.emit('resolved');\n      } else if (\n        keyStatus === 'internal-error' ||\n        keyStatus === 'output-restricted' ||\n        keyStatus === 'output-downscaled'\n      ) {\n        keyError = getKeyStatusError(keyStatus, context.decryptdata);\n      } else if (keyStatus === 'expired') {\n        keyError = new Error(`key expired (keyId: ${keyId})`);\n      } else if (keyStatus === 'released') {\n        keyError = new Error(`key released`);\n      } else if (keyStatus === 'status-pending') {\n        /* no-op */\n      } else {\n        this.warn(\n          `unhandled key status change \"${keyStatus}\" (keyId: ${keyId})`,\n        );\n      }\n      if (keyError) {\n        if (licenseStatus.eventNames().length) {\n          licenseStatus.emit('error', keyError);\n        } else {\n          this.handleError(keyError);\n        }\n      }\n    };\n    const onkeystatuseschange = (context._onkeystatuseschange = (\n      event: Event,\n    ) => {\n      const keySession = context.mediaKeysSession;\n      if (!keySession as any) {\n        licenseStatus.emit('error', new Error('invalid state'));\n        return;\n      }\n\n      const keyStatuses = this.getKeyStatuses(context);\n      const keyIds = Object.keys(keyStatuses);\n\n      // exit if all keys are status-pending\n      if (!keyIds.some((id) => keyStatuses[id] !== 'status-pending')) {\n        return;\n      }\n\n      // renew when a key status for a levelKey comes back expired\n      if (keyStatuses[keyId] === 'expired') {\n        // renew when a key status comes back expired\n        this.log(\n          `Expired key ${stringify(keyStatuses)} in key-session \"${context.mediaKeysSession.sessionId}\"`,\n        );\n        this.renewKeySession(context);\n        return;\n      }\n\n      let keyStatus = keyStatuses[keyId] as MediaKeyStatus | undefined;\n      if (keyStatus) {\n        // handle status of current key\n        handleKeyStatus(keyStatus, context);\n      } else {\n        // Timeout key-status\n        const timeout = 1000;\n        context.keyStatusTimeouts ||= {};\n        context.keyStatusTimeouts[keyId] ||= self.setTimeout(() => {\n          if ((!context.mediaKeysSession as any) || !this.mediaKeys) {\n            return;\n          }\n\n          // Find key status in another session if missing (PlayReady #7519 no key-status \"single-key\" setup with shared key)\n          const sessionKeyStatus = this.getKeyStatus(context.decryptdata);\n          if (sessionKeyStatus && sessionKeyStatus !== 'status-pending') {\n            this.log(\n              `No status for keyId ${keyId} in key-session \"${context.mediaKeysSession.sessionId}\". Using session key-status ${sessionKeyStatus} from other session.`,\n            );\n            return handleKeyStatus(sessionKeyStatus, context);\n          }\n\n          // Timeout key with internal-error\n          this.log(\n            `key status for ${keyId} in key-session \"${context.mediaKeysSession.sessionId}\" timed out after ${timeout}ms`,\n          );\n          keyStatus = 'internal-error';\n          handleKeyStatus(keyStatus, context);\n        }, timeout);\n\n        this.log(`No status for keyId ${keyId} (${stringify(keyStatuses)}).`);\n      }\n    });\n\n    addEventListener(context.mediaKeysSession, 'message', onmessage);\n    addEventListener(\n      context.mediaKeysSession,\n      'keystatuseschange',\n      onkeystatuseschange,\n    );\n\n    const keyUsablePromise = new Promise(\n      (resolve: (value?: void) => void, reject) => {\n        licenseStatus.on('error', reject);\n        licenseStatus.on('resolved', resolve);\n      },\n    );\n\n    return context.mediaKeysSession\n      .generateRequest(initDataType, initData)\n      .then(() => {\n        this.log(\n          `Request generated for key-session \"${context.mediaKeysSession.sessionId}\" keyId: ${keyId} URI: ${keyUri}`,\n        );\n      })\n      .catch((error) => {\n        throw new EMEKeyError(\n          {\n            type: ErrorTypes.KEY_SYSTEM_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_NO_SESSION,\n            error,\n            decryptdata: context.decryptdata,\n            fatal: false,\n          },\n          `Error generating key-session request: ${error}`,\n        );\n      })\n      .then(() => keyUsablePromise)\n      .catch((error) => {\n        licenseStatus.removeAllListeners();\n        return this.removeSession(context).then(() => {\n          throw error;\n        });\n      })\n      .then(() => {\n        licenseStatus.removeAllListeners();\n        return context;\n      });\n  }\n\n  private getKeyStatuses(mediaKeySessionContext: MediaKeySessionContext): {\n    [keyId: string]: MediaKeyStatus;\n  } {\n    const keyStatuses: { [keyId: string]: MediaKeyStatus } = {};\n    mediaKeySessionContext.mediaKeysSession.keyStatuses.forEach(\n      (status: MediaKeyStatus, keyId: BufferSource) => {\n        // keyStatuses.forEach is not standard API so the callback value looks weird on xboxone\n        // xboxone callback(keyId, status) so we need to exchange them\n        if (typeof keyId === 'string' && typeof status === 'object') {\n          const temp = keyId;\n          keyId = status;\n          status = temp;\n        }\n        const keyIdArray =\n          'buffer' in keyId\n            ? new Uint8Array(keyId.buffer, keyId.byteOffset, keyId.byteLength)\n            : new Uint8Array(keyId);\n\n        if (\n          mediaKeySessionContext.keySystem === KeySystems.PLAYREADY &&\n          keyIdArray.length === 16\n        ) {\n          // On some devices, the key ID has already been converted for endianness.\n          // In such cases, this key ID is the one we need to cache.\n          const originKeyIdWithStatusChange = arrayToHex(keyIdArray);\n          // Cache the original key IDs to ensure compatibility across all cases.\n          keyStatuses[originKeyIdWithStatusChange] = status;\n\n          changeEndianness(keyIdArray);\n        }\n        const keyIdWithStatusChange = arrayToHex(keyIdArray);\n        // Add to banned keys to prevent playlist usage and license requests\n        if (status === 'internal-error') {\n          this.bannedKeyIds[keyIdWithStatusChange] = status;\n        }\n        this.log(\n          `key status change \"${status}\" for keyStatuses keyId: ${keyIdWithStatusChange} key-session \"${mediaKeySessionContext.mediaKeysSession.sessionId}\"`,\n        );\n\n        keyStatuses[keyIdWithStatusChange] = status;\n      },\n    );\n    return keyStatuses;\n  }\n\n  private fetchServerCertificate(\n    keySystem: KeySystems,\n  ): Promise<BufferSource | void> {\n    const config = this.config;\n    const Loader = config.loader;\n    const certLoader = new Loader(config as HlsConfig) as Loader<LoaderContext>;\n    const url = this.getServerCertificateUrl(keySystem);\n    if (!url) {\n      return Promise.resolve();\n    }\n    this.log(`Fetching server certificate for \"${keySystem}\"`);\n    return new Promise((resolve, reject) => {\n      const loaderContext: LoaderContext = {\n        responseType: 'arraybuffer',\n        url,\n      };\n      const loadPolicy = config.certLoadPolicy.default;\n      const loaderConfig: LoaderConfiguration = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n      };\n      const loaderCallbacks: LoaderCallbacks<LoaderContext> = {\n        onSuccess: (response, stats, context, networkDetails) => {\n          resolve(response.data as ArrayBuffer);\n        },\n        onError: (response, contex, networkDetails, stats) => {\n          reject(\n            new EMEKeyError(\n              {\n                type: ErrorTypes.KEY_SYSTEM_ERROR,\n                details:\n                  ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n                fatal: true,\n                networkDetails,\n                response: {\n                  url: loaderContext.url,\n                  data: undefined,\n                  ...response,\n                },\n              },\n              `\"${keySystem}\" certificate request failed (${url}). Status: ${response.code} (${response.text})`,\n            ),\n          );\n        },\n        onTimeout: (stats, context, networkDetails) => {\n          reject(\n            new EMEKeyError(\n              {\n                type: ErrorTypes.KEY_SYSTEM_ERROR,\n                details:\n                  ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n                fatal: true,\n                networkDetails,\n                response: {\n                  url: loaderContext.url,\n                  data: undefined,\n                },\n              },\n              `\"${keySystem}\" certificate request timed out (${url})`,\n            ),\n          );\n        },\n        onAbort: (stats, context, networkDetails) => {\n          reject(new Error('aborted'));\n        },\n      };\n      certLoader.load(loaderContext, loaderConfig, loaderCallbacks);\n    });\n  }\n\n  private setMediaKeysServerCertificate(\n    mediaKeys: MediaKeys,\n    keySystem: KeySystems,\n    cert: BufferSource,\n  ): Promise<MediaKeys> {\n    return new Promise((resolve, reject) => {\n      mediaKeys\n        .setServerCertificate(cert)\n        .then((success) => {\n          this.log(\n            `setServerCertificate ${\n              success ? 'success' : 'not supported by CDM'\n            } (${cert.byteLength}) on \"${keySystem}\"`,\n          );\n          resolve(mediaKeys);\n        })\n        .catch((error) => {\n          reject(\n            new EMEKeyError(\n              {\n                type: ErrorTypes.KEY_SYSTEM_ERROR,\n                details:\n                  ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED,\n                error,\n                fatal: true,\n              },\n              error.message,\n            ),\n          );\n        });\n    });\n  }\n\n  private renewLicense(\n    context: MediaKeySessionContext,\n    keyMessage: ArrayBuffer,\n  ): Promise<void> {\n    return this.requestLicense(context, new Uint8Array(keyMessage)).then(\n      (data: ArrayBuffer) => {\n        return this.updateKeySession(context, new Uint8Array(data)).catch(\n          (error) => {\n            throw new EMEKeyError(\n              {\n                type: ErrorTypes.KEY_SYSTEM_ERROR,\n                details: ErrorDetails.KEY_SYSTEM_SESSION_UPDATE_FAILED,\n                decryptdata: context.decryptdata,\n                error,\n                fatal: false,\n              },\n              error.message,\n            );\n          },\n        );\n      },\n    );\n  }\n\n  private unpackPlayReadyKeyMessage(\n    xhr: XMLHttpRequest,\n    licenseChallenge: Uint8Array<ArrayBuffer>,\n  ): Uint8Array<ArrayBuffer> {\n    // On Edge, the raw license message is UTF-16-encoded XML.  We need\n    // to unpack the Challenge element (base64-encoded string containing the\n    // actual license request) and any HttpHeader elements (sent as request\n    // headers).\n    // For PlayReady CDMs, we need to dig the Challenge out of the XML.\n    const xmlString = String.fromCharCode.apply(\n      null,\n      new Uint16Array(licenseChallenge.buffer),\n    );\n    if (!xmlString.includes('PlayReadyKeyMessage')) {\n      // This does not appear to be a wrapped message as on Edge.  Some\n      // clients do not need this unwrapping, so we will assume this is one of\n      // them.  Note that \"xml\" at this point probably looks like random\n      // garbage, since we interpreted UTF-8 as UTF-16.\n      xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');\n      return licenseChallenge;\n    }\n    const keyMessageXml = new DOMParser().parseFromString(\n      xmlString,\n      'application/xml',\n    );\n    // Set request headers.\n    const headers = keyMessageXml.querySelectorAll('HttpHeader');\n    if (headers.length > 0) {\n      let header: Element;\n      for (let i = 0, len = headers.length; i < len; i++) {\n        header = headers[i];\n        const name = header.querySelector('name')?.textContent;\n        const value = header.querySelector('value')?.textContent;\n        if (name && value) {\n          xhr.setRequestHeader(name, value);\n        }\n      }\n    }\n    const challengeElement = keyMessageXml.querySelector('Challenge');\n    const challengeText = challengeElement?.textContent;\n    if (!challengeText) {\n      throw new Error(`Cannot find <Challenge> in key message`);\n    }\n    return strToUtf8array(atob(challengeText));\n  }\n\n  private setupLicenseXHR(\n    xhr: XMLHttpRequest,\n    url: string,\n    keysListItem: MediaKeySessionContext,\n    licenseChallenge: Uint8Array<ArrayBuffer>,\n  ): Promise<{\n    xhr: XMLHttpRequest;\n    licenseChallenge: Uint8Array<ArrayBuffer>;\n  }> {\n    const licenseXhrSetup = this.config.licenseXhrSetup;\n\n    if (!licenseXhrSetup) {\n      xhr.open('POST', url, true);\n\n      return Promise.resolve({ xhr, licenseChallenge });\n    }\n\n    return Promise.resolve()\n      .then(() => {\n        if (!keysListItem.decryptdata as any) {\n          throw new Error('Key removed');\n        }\n        return licenseXhrSetup.call(\n          this.hls,\n          xhr,\n          url,\n          keysListItem,\n          licenseChallenge,\n        );\n      })\n      .catch((error: Error) => {\n        if (!keysListItem.decryptdata as any) {\n          // Key session removed. Cancel license request.\n          throw error;\n        }\n        // let's try to open before running setup\n        xhr.open('POST', url, true);\n\n        return licenseXhrSetup.call(\n          this.hls,\n          xhr,\n          url,\n          keysListItem,\n          licenseChallenge,\n        );\n      })\n      .then((licenseXhrSetupResult) => {\n        // if licenseXhrSetup did not yet call open, let's do it now\n        if (!xhr.readyState) {\n          xhr.open('POST', url, true);\n        }\n        const finalLicenseChallenge = licenseXhrSetupResult\n          ? licenseXhrSetupResult\n          : licenseChallenge;\n        return { xhr, licenseChallenge: finalLicenseChallenge };\n      });\n  }\n\n  private requestLicense(\n    keySessionContext: MediaKeySessionContext,\n    licenseChallenge: Uint8Array<ArrayBuffer>,\n  ): Promise<ArrayBuffer> {\n    const keyLoadPolicy = this.config.keyLoadPolicy.default;\n    return new Promise((resolve, reject) => {\n      const url = this.getLicenseServerUrlOrThrow(keySessionContext.keySystem);\n      this.log(`Sending license request to URL: ${url}`);\n      const xhr = new XMLHttpRequest();\n      xhr.responseType = 'arraybuffer';\n      xhr.onreadystatechange = () => {\n        if (\n          (!this.hls as any) ||\n          (!keySessionContext.mediaKeysSession as any)\n        ) {\n          return reject(new Error('invalid state'));\n        }\n        if (xhr.readyState === 4) {\n          if (xhr.status === 200) {\n            this._requestLicenseFailureCount = 0;\n            let data = xhr.response;\n            this.log(\n              `License received ${\n                data instanceof ArrayBuffer ? data.byteLength : data\n              }`,\n            );\n            const licenseResponseCallback = this.config.licenseResponseCallback;\n            if (licenseResponseCallback) {\n              try {\n                data = licenseResponseCallback.call(\n                  this.hls,\n                  xhr,\n                  url,\n                  keySessionContext,\n                );\n              } catch (error) {\n                this.error(error);\n              }\n            }\n            resolve(data);\n          } else {\n            const retryConfig = keyLoadPolicy.errorRetry;\n            const maxNumRetry = retryConfig ? retryConfig.maxNumRetry : 0;\n            this._requestLicenseFailureCount++;\n            if (\n              this._requestLicenseFailureCount > maxNumRetry ||\n              (xhr.status >= 400 && xhr.status < 500)\n            ) {\n              reject(\n                new EMEKeyError(\n                  {\n                    type: ErrorTypes.KEY_SYSTEM_ERROR,\n                    details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,\n                    decryptdata: keySessionContext.decryptdata,\n                    fatal: true,\n                    networkDetails: xhr,\n                    response: {\n                      url,\n                      data: undefined as any,\n                      code: xhr.status,\n                      text: xhr.statusText,\n                    },\n                  },\n                  `License Request XHR failed (${url}). Status: ${xhr.status} (${xhr.statusText})`,\n                ),\n              );\n            } else {\n              const attemptsLeft =\n                maxNumRetry - this._requestLicenseFailureCount + 1;\n              this.warn(\n                `Retrying license request, ${attemptsLeft} attempts left`,\n              );\n              this.requestLicense(keySessionContext, licenseChallenge).then(\n                resolve,\n                reject,\n              );\n            }\n          }\n        }\n      };\n      if (\n        keySessionContext.licenseXhr &&\n        keySessionContext.licenseXhr.readyState !== XMLHttpRequest.DONE\n      ) {\n        keySessionContext.licenseXhr.abort();\n      }\n      keySessionContext.licenseXhr = xhr;\n\n      this.setupLicenseXHR(xhr, url, keySessionContext, licenseChallenge)\n        .then(({ xhr, licenseChallenge }) => {\n          if (keySessionContext.keySystem == KeySystems.PLAYREADY) {\n            licenseChallenge = this.unpackPlayReadyKeyMessage(\n              xhr,\n              licenseChallenge,\n            );\n          }\n          xhr.send(licenseChallenge);\n        })\n        .catch(reject);\n    });\n  }\n\n  private onDestroying() {\n    this.unregisterListeners();\n    this._clear();\n  }\n\n  private onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) {\n    if (!this.config.emeEnabled) {\n      return;\n    }\n\n    const media = data.media;\n\n    // keep reference of media\n    this.media = media;\n\n    addEventListener(media, 'encrypted', this.onMediaEncrypted);\n    addEventListener(media, 'waitingforkey', this.onWaitingForKey);\n\n    const mediaResolved = this.mediaResolved;\n    if (mediaResolved) {\n      mediaResolved();\n    } else {\n      this.mediaKeys = media.mediaKeys;\n    }\n  }\n\n  private onMediaDetached() {\n    const media = this.media;\n\n    if (media) {\n      removeEventListener(media, 'encrypted', this.onMediaEncrypted);\n      removeEventListener(media, 'waitingforkey', this.onWaitingForKey);\n      this.media = null;\n      this.mediaKeys = null;\n    }\n  }\n\n  private _clear() {\n    this._requestLicenseFailureCount = 0;\n    this.keyIdToKeySessionPromise = {};\n    this.bannedKeyIds = {};\n    const mediaResolved = this.mediaResolved;\n    if (mediaResolved) {\n      mediaResolved();\n    }\n    if (!this.mediaKeys && !this.mediaKeySessions.length) {\n      return;\n    }\n    const media = this.media;\n    const mediaKeysList = this.mediaKeySessions.slice();\n    this.mediaKeySessions = [];\n    this.mediaKeys = null;\n\n    LevelKey.clearKeyUriToKeyIdMap();\n\n    // Close all sessions and remove media keys from the video element.\n    const keySessionCount = mediaKeysList.length;\n    EMEController.CDMCleanupPromise = Promise.all(\n      mediaKeysList\n        .map((mediaKeySessionContext) =>\n          this.removeSession(mediaKeySessionContext),\n        )\n        .concat(\n          (media?.setMediaKeys(null) as Promise<void> | null)?.catch(\n            (error) => {\n              this.log(`Could not clear media keys: ${error}`);\n              if (!this.hls as any) return;\n              this.hls.trigger(Events.ERROR, {\n                type: ErrorTypes.OTHER_ERROR,\n                details: ErrorDetails.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR,\n                fatal: false,\n                error: new Error(`Could not clear media keys: ${error}`),\n              });\n            },\n          ) || Promise.resolve(),\n        ),\n    )\n      .catch((error) => {\n        this.log(`Could not close sessions and clear media keys: ${error}`);\n        if (!this.hls as any) return;\n        this.hls.trigger(Events.ERROR, {\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n          fatal: false,\n          error: new Error(\n            `Could not close sessions and clear media keys: ${error}`,\n          ),\n        });\n      })\n\n      .then(() => {\n        if (keySessionCount) {\n          this.log('finished closing key sessions and clearing media keys');\n        }\n      });\n  }\n\n  private onManifestLoading() {\n    this._clear();\n  }\n\n  private onManifestLoaded(\n    event: Events.MANIFEST_LOADED,\n    { sessionKeys }: ManifestLoadedData,\n  ) {\n    if (!sessionKeys || !this.config.emeEnabled) {\n      return;\n    }\n    if (!this.keyFormatPromise) {\n      const keyFormats: KeySystemFormats[] = sessionKeys.reduce(\n        (formats: KeySystemFormats[], sessionKey: LevelKey) => {\n          if (\n            formats.indexOf(sessionKey.keyFormat as KeySystemFormats) === -1\n          ) {\n            formats.push(sessionKey.keyFormat as KeySystemFormats);\n          }\n          return formats;\n        },\n        [],\n      );\n      this.log(\n        `Selecting key-system from session-keys ${keyFormats.join(', ')}`,\n      );\n      this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n    }\n  }\n\n  private removeSession(\n    mediaKeySessionContext: MediaKeySessionContext,\n  ): Promise<void> {\n    const { mediaKeysSession, licenseXhr, decryptdata } =\n      mediaKeySessionContext;\n    if (mediaKeysSession as MediaKeySession | undefined) {\n      this.log(\n        `Remove licenses and keys and close session \"${mediaKeysSession.sessionId}\" keyId: ${arrayToHex((decryptdata as LevelKey | undefined)?.keyId || [])}`,\n      );\n      if (mediaKeySessionContext._onmessage) {\n        mediaKeysSession.removeEventListener(\n          'message',\n          mediaKeySessionContext._onmessage,\n        );\n        mediaKeySessionContext._onmessage = undefined;\n      }\n      if (mediaKeySessionContext._onkeystatuseschange) {\n        mediaKeysSession.removeEventListener(\n          'keystatuseschange',\n          mediaKeySessionContext._onkeystatuseschange,\n        );\n        mediaKeySessionContext._onkeystatuseschange = undefined;\n      }\n\n      if (licenseXhr && licenseXhr.readyState !== XMLHttpRequest.DONE) {\n        licenseXhr.abort();\n      }\n      mediaKeySessionContext.mediaKeysSession =\n        mediaKeySessionContext.decryptdata =\n        mediaKeySessionContext.licenseXhr =\n          undefined!;\n      const index = this.mediaKeySessions.indexOf(mediaKeySessionContext);\n      if (index > -1) {\n        this.mediaKeySessions.splice(index, 1);\n      }\n      const { keyStatusTimeouts } = mediaKeySessionContext;\n      if (keyStatusTimeouts) {\n        Object.keys(keyStatusTimeouts).forEach((keyId) =>\n          self.clearTimeout(keyStatusTimeouts[keyId]),\n        );\n      }\n      const { drmSystemOptions } = this.config;\n      const removePromise = isPersistentSessionType(drmSystemOptions)\n        ? new Promise((resolve, reject) => {\n            self.setTimeout(\n              () => reject(new Error(`MediaKeySession.remove() timeout`)),\n              8000,\n            );\n            mediaKeysSession.remove().then(resolve).catch(reject);\n          })\n        : Promise.resolve();\n      return removePromise\n        .catch((error) => {\n          this.log(`Could not remove session: ${error}`);\n          if (!this.hls as any) return;\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.OTHER_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR,\n            fatal: false,\n            error: new Error(`Could not remove session: ${error}`),\n          });\n        })\n        .then(() => {\n          return mediaKeysSession.close();\n        })\n        .catch((error) => {\n          this.log(`Could not close session: ${error}`);\n          if (!this.hls as any) return;\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.OTHER_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n            fatal: false,\n            error: new Error(`Could not close session: ${error}`),\n          });\n        });\n    }\n    return Promise.resolve();\n  }\n}\n\nfunction getKeyIdString(decryptdata: DecryptData | undefined): string | never {\n  if (!decryptdata) {\n    throw new Error('Could not read keyId of undefined decryptdata');\n  }\n  if (decryptdata.keyId === null) {\n    throw new Error('keyId is null');\n  }\n  return arrayToHex(decryptdata.keyId);\n}\n\nfunction getKeyStatus(\n  decryptdata: LevelKey,\n  keyContext: MediaKeySessionContext,\n): MediaKeyStatus | undefined {\n  if (\n    decryptdata.keyId &&\n    keyContext.mediaKeysSession.keyStatuses.has(decryptdata.keyId)\n  ) {\n    return keyContext.mediaKeysSession.keyStatuses.get(decryptdata.keyId);\n  }\n  if (decryptdata.matches(keyContext.decryptdata)) {\n    return keyContext.keyStatus;\n  }\n  return undefined;\n}\n\nexport class EMEKeyError extends Error {\n  public readonly data: ErrorData;\n  constructor(\n    data: Omit<ErrorData, 'error'> & { error?: Error },\n    message: string,\n  ) {\n    super(message);\n    data.error ||= new Error(message);\n    this.data = data as ErrorData;\n    data.err = data.error;\n  }\n}\n\nfunction getKeyStatusError(\n  keyStatus: MediaKeyStatus,\n  decryptdata: LevelKey,\n): EMEKeyError {\n  const outputRestricted = keyStatus === 'output-restricted';\n  const details = outputRestricted\n    ? ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED\n    : ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR;\n  return new EMEKeyError(\n    {\n      type: ErrorTypes.KEY_SYSTEM_ERROR,\n      details,\n      fatal: false,\n      decryptdata,\n    },\n    outputRestricted\n      ? 'HDCP level output restricted'\n      : `key status changed to \"${keyStatus}\"`,\n  );\n}\n\nexport default EMEController;\n", "import { Events } from '../events';\nimport type StreamController from './stream-controller';\nimport type Hls from '../hls';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { MediaAttachingData } from '../types/events';\n\nclass FPSController implements ComponentAPI {\n  private hls: Hls;\n  private isVideoPlaybackQualityAvailable: boolean = false;\n  private timer?: number;\n  private media: HTMLVideoElement | null = null;\n  private lastTime: any;\n  private lastDroppedFrames: number = 0;\n  private lastDecodedFrames: number = 0;\n  // stream controller must be provided as a dependency!\n  private streamController!: StreamController;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n\n    this.registerListeners();\n  }\n\n  public setStreamController(streamController: StreamController) {\n    this.streamController = streamController;\n  }\n\n  protected registerListeners() {\n    this.hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    this.hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n\n  protected unregisterListeners() {\n    this.hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    this.hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n\n  destroy() {\n    if (this.timer) {\n      clearInterval(this.timer);\n    }\n\n    this.unregisterListeners();\n    this.isVideoPlaybackQualityAvailable = false;\n    this.media = null;\n  }\n\n  protected onMediaAttaching(\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ) {\n    const config = this.hls.config;\n    if (config.capLevelOnFPSDrop) {\n      const media =\n        data.media instanceof self.HTMLVideoElement ? data.media : null;\n      this.media = media;\n      if (media && typeof media.getVideoPlaybackQuality === 'function') {\n        this.isVideoPlaybackQualityAvailable = true;\n      }\n\n      self.clearInterval(this.timer);\n      this.timer = self.setInterval(\n        this.checkFPSInterval.bind(this),\n        config.fpsDroppedMonitoringPeriod,\n      );\n    }\n  }\n\n  private onMediaDetaching() {\n    this.media = null;\n  }\n\n  checkFPS(\n    video: HTMLVideoElement,\n    decodedFrames: number,\n    droppedFrames: number,\n  ) {\n    const currentTime = performance.now();\n    if (decodedFrames) {\n      if (this.lastTime) {\n        const currentPeriod = currentTime - this.lastTime;\n        const currentDropped = droppedFrames - this.lastDroppedFrames;\n        const currentDecoded = decodedFrames - this.lastDecodedFrames;\n        const droppedFPS = (1000 * currentDropped) / currentPeriod;\n        const hls = this.hls;\n        hls.trigger(Events.FPS_DROP, {\n          currentDropped: currentDropped,\n          currentDecoded: currentDecoded,\n          totalDroppedFrames: droppedFrames,\n        });\n        if (droppedFPS > 0) {\n          // hls.logger.log('checkFPS : droppedFPS/decodedFPS:' + droppedFPS/(1000 * currentDecoded / currentPeriod));\n          if (\n            currentDropped >\n            hls.config.fpsDroppedMonitoringThreshold * currentDecoded\n          ) {\n            let currentLevel = hls.currentLevel;\n            hls.logger.warn(\n              'drop FPS ratio greater than max allowed value for currentLevel: ' +\n                currentLevel,\n            );\n            if (\n              currentLevel > 0 &&\n              (hls.autoLevelCapping === -1 ||\n                hls.autoLevelCapping >= currentLevel)\n            ) {\n              currentLevel = currentLevel - 1;\n              hls.trigger(Events.FPS_DROP_LEVEL_CAPPING, {\n                level: currentLevel,\n                droppedLevel: hls.currentLevel,\n              });\n              hls.autoLevelCapping = currentLevel;\n              this.streamController.nextLevelSwitch();\n            }\n          }\n        }\n      }\n      this.lastTime = currentTime;\n      this.lastDroppedFrames = droppedFrames;\n      this.lastDecodedFrames = decodedFrames;\n    }\n  }\n\n  checkFPSInterval() {\n    const video = this.media;\n    if (video) {\n      if (this.isVideoPlaybackQualityAvailable) {\n        const videoPlaybackQuality = video.getVideoPlaybackQuality();\n        this.checkFPS(\n          video,\n          videoPlaybackQuality.totalVideoFrames,\n          videoPlaybackQuality.droppedVideoFrames,\n        );\n      } else {\n        // HTMLVideoElement doesn't include the webkit types\n        this.checkFPS(\n          video,\n          (video as any).webkitDecodedFrameCount as number,\n          (video as any).webkitDroppedFrameCount as number,\n        );\n      }\n    }\n  }\n}\n\nexport default FPSController;\n", "import { logger } from './logger';\n\nexport function sendAddTrackEvent(track: TextTrack, videoEl: HTMLMediaElement) {\n  let event: Event;\n  try {\n    event = new Event('addtrack');\n  } catch (err) {\n    // for IE11\n    event = document.createEvent('Event');\n    event.initEvent('addtrack', false, false);\n  }\n  (event as any).track = track;\n  videoEl.dispatchEvent(event);\n}\n\nexport function addCueToTrack(track: TextTrack, cue: VTTCue) {\n  // Sometimes there are cue overlaps on segmented vtts so the same\n  // cue can appear more than once in different vtt files.\n  // This avoid showing duplicated cues with same timecode and text.\n  const mode = track.mode;\n  if (mode === 'disabled') {\n    track.mode = 'hidden';\n  }\n  if (track.cues && !track.cues.getCueById(cue.id)) {\n    try {\n      track.addCue(cue);\n      if (!track.cues.getCueById(cue.id)) {\n        throw new Error(`addCue is failed for: ${cue}`);\n      }\n    } catch (err) {\n      logger.debug(`[texttrack-utils]: ${err}`);\n      try {\n        const textTrackCue = new (self.TextTrackCue as any)(\n          cue.startTime,\n          cue.endTime,\n          cue.text,\n        );\n        textTrackCue.id = cue.id;\n        track.addCue(textTrackCue);\n      } catch (err2) {\n        logger.debug(\n          `[texttrack-utils]: Legacy TextTrackCue fallback failed: ${err2}`,\n        );\n      }\n    }\n  }\n  if (mode === 'disabled') {\n    track.mode = mode;\n  }\n}\n\nexport function clearCurrentCues(\n  track: TextTrack,\n  enterHandler?: (e?: Event) => void,\n) {\n  // When track.mode is disabled, track.cues will be null.\n  // To guarantee the removal of cues, we need to temporarily\n  // change the mode to hidden\n  const mode = track.mode;\n  if (mode === 'disabled') {\n    track.mode = 'hidden';\n  }\n  if (track.cues) {\n    for (let i = track.cues.length; i--; ) {\n      if (enterHandler) {\n        track.cues[i].removeEventListener('enter', enterHandler);\n      }\n      track.removeCue(track.cues[i]);\n    }\n  }\n  if (mode === 'disabled') {\n    track.mode = mode;\n  }\n}\n\nexport function removeCuesInRange(\n  track: TextTrack,\n  start: number,\n  end: number,\n  predicate?: (cue: TextTrackCue) => boolean,\n) {\n  const mode = track.mode;\n  if (mode === 'disabled') {\n    track.mode = 'hidden';\n  }\n\n  if (track.cues && track.cues.length > 0) {\n    const cues = getCuesInRange(track.cues, start, end);\n    for (let i = 0; i < cues.length; i++) {\n      if (!predicate || predicate(cues[i])) {\n        track.removeCue(cues[i]);\n      }\n    }\n  }\n  if (mode === 'disabled') {\n    track.mode = mode;\n  }\n}\n\n// Find first cue starting at or after given time.\n// Modified version of binary search O(log(n)).\nfunction getFirstCueIndexFromTime(\n  cues: TextTrackCueList | TextTrackCue[],\n  time: number,\n): number {\n  // If first cue starts at or after time, start there\n  if (time <= cues[0].startTime) {\n    return 0;\n  }\n  // If the last cue ends before time there is no overlap\n  const len = cues.length - 1;\n  if (time > cues[len].endTime) {\n    return -1;\n  }\n\n  let left = 0;\n  let right = len;\n  let mid;\n  while (left <= right) {\n    mid = Math.floor((right + left) / 2);\n\n    if (time < cues[mid].startTime) {\n      right = mid - 1;\n    } else if (time > cues[mid].startTime && left < len) {\n      left = mid + 1;\n    } else {\n      // If it's not lower or higher, it must be equal.\n      return mid;\n    }\n  }\n  // At this point, left and right have swapped.\n  // No direct match was found, left or right element must be the closest. Check which one has the smallest diff.\n  return cues[left].startTime - time < time - cues[right].startTime\n    ? left\n    : right;\n}\n\nexport function getCuesInRange(\n  cues: TextTrackCueList | TextTrackCue[],\n  start: number,\n  end: number,\n): TextTrackCue[] {\n  const cuesFound: TextTrackCue[] = [];\n  const firstCueInRange = getFirstCueIndexFromTime(cues, start);\n  if (firstCueInRange > -1) {\n    for (let i = firstCueInRange, len = cues.length; i < len; i++) {\n      const cue = cues[i];\n      if (cue.startTime >= start && cue.endTime <= end) {\n        cuesFound.push(cue);\n      } else if (cue.startTime > end) {\n        return cuesFound;\n      }\n    }\n  }\n  return cuesFound;\n}\n\nexport function filterSubtitleTracks(\n  textTrackList: TextTrackList,\n): TextTrack[] {\n  const tracks: TextTrack[] = [];\n  for (let i = 0; i < textTrackList.length; i++) {\n    const track = textTrackList[i];\n    // Edge adds a track without a label; we don't want to use it\n    if (\n      (track.kind === 'subtitles' || track.kind === 'captions') &&\n      track.label\n    ) {\n      tracks.push(textTrackList[i]);\n    }\n  }\n  return tracks;\n}\n", "import BasePlaylistController from './base-playlist-controller';\nimport { Events } from '../events';\nimport { PlaylistContextType } from '../types/loader';\nimport {\n  mediaAttributesIdentical,\n  subtitleTrackMatchesTextTrack,\n} from '../utils/media-option-attributes';\nimport { findMatchingOption, matchesOption } from '../utils/rendition-helper';\nimport {\n  clearCurrentCues,\n  filterSubtitleTracks,\n} from '../utils/texttrack-utils';\nimport type Hls from '../hls';\nimport type {\n  ErrorData,\n  LevelLoadingData,\n  LevelSwitchingData,\n  ManifestParsedData,\n  MediaAttachedData,\n  MediaDetachingData,\n  SubtitleTracksUpdatedData,\n  TrackLoadedData,\n} from '../types/events';\nimport type { HlsUrlParameters } from '../types/level';\nimport type {\n  MediaPlaylist,\n  SubtitleSelectionOption,\n} from '../types/media-playlist';\n\nclass SubtitleTrackController extends BasePlaylistController {\n  private media: HTMLMediaElement | null = null;\n  private tracks: MediaPlaylist[] = [];\n  private groupIds: (string | undefined)[] | null = null;\n  private tracksInGroup: MediaPlaylist[] = [];\n  private trackId: number = -1;\n  private currentTrack: MediaPlaylist | null = null;\n  private selectDefaultTrack: boolean = true;\n  private queuedDefaultTrack: number = -1;\n  private useTextTrackPolling: boolean = false;\n  private subtitlePollingInterval: number = -1;\n  private _subtitleDisplay: boolean = true;\n\n  private asyncPollTrackChange = () => this.pollTrackChange(0);\n\n  constructor(hls: Hls) {\n    super(hls, 'subtitle-track-controller');\n    this.registerListeners();\n  }\n\n  public destroy() {\n    this.unregisterListeners();\n    this.tracks.length = 0;\n    this.tracksInGroup.length = 0;\n    this.currentTrack = null;\n    // @ts-ignore\n    this.onTextTracksChanged = this.asyncPollTrackChange = null;\n    super.destroy();\n  }\n\n  public get subtitleDisplay(): boolean {\n    return this._subtitleDisplay;\n  }\n\n  public set subtitleDisplay(value: boolean) {\n    this._subtitleDisplay = value;\n    if (this.trackId > -1) {\n      this.toggleTrackModes();\n    }\n  }\n\n  private registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.on(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n    hls.on(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  private unregisterListeners() {\n    const { hls } = this;\n    hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.off(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n    hls.off(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  // Listen for subtitle track change, then extract the current track ID.\n  protected onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ): void {\n    this.media = data.media;\n    if (!this.media) {\n      return;\n    }\n\n    if (this.queuedDefaultTrack > -1) {\n      this.subtitleTrack = this.queuedDefaultTrack;\n      this.queuedDefaultTrack = -1;\n    }\n\n    this.useTextTrackPolling = !(\n      this.media.textTracks && 'onchange' in this.media.textTracks\n    );\n    if (this.useTextTrackPolling) {\n      this.pollTrackChange(500);\n    } else {\n      this.media.textTracks.addEventListener(\n        'change',\n        this.asyncPollTrackChange,\n      );\n    }\n  }\n\n  private pollTrackChange(timeout: number) {\n    self.clearInterval(this.subtitlePollingInterval);\n    this.subtitlePollingInterval = self.setInterval(\n      this.onTextTracksChanged,\n      timeout,\n    );\n  }\n\n  protected onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n\n    const transferringMedia = !!data.transferMedia;\n    self.clearInterval(this.subtitlePollingInterval);\n    if (!this.useTextTrackPolling) {\n      media.textTracks.removeEventListener('change', this.asyncPollTrackChange);\n    }\n\n    if (this.trackId > -1) {\n      this.queuedDefaultTrack = this.trackId;\n    }\n\n    // Disable all subtitle tracks before detachment so when reattached only tracks in that content are enabled.\n    this.subtitleTrack = -1;\n    this.media = null;\n    if (transferringMedia) {\n      return;\n    }\n\n    const textTracks = filterSubtitleTracks(media.textTracks);\n    // Clear loaded cues on media detachment from tracks\n    textTracks.forEach((track) => {\n      clearCurrentCues(track);\n    });\n  }\n\n  protected onManifestLoading(): void {\n    this.tracks = [];\n    this.groupIds = null;\n    this.tracksInGroup = [];\n    this.trackId = -1;\n    this.currentTrack = null;\n    this.selectDefaultTrack = true;\n  }\n\n  // Fired whenever a new manifest is loaded.\n  protected onManifestParsed(\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ): void {\n    this.tracks = data.subtitleTracks;\n  }\n\n  protected onSubtitleTrackLoaded(\n    event: Events.SUBTITLE_TRACK_LOADED,\n    data: TrackLoadedData,\n  ): void {\n    const { id, groupId, details } = data;\n    const trackInActiveGroup = this.tracksInGroup[id];\n\n    if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) {\n      this.warn(\n        `Subtitle track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup?.groupId}`,\n      );\n      return;\n    }\n\n    const curDetails = trackInActiveGroup.details;\n    trackInActiveGroup.details = data.details;\n    this.log(\n      `Subtitle track ${id} \"${trackInActiveGroup.name}\" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`,\n    );\n\n    if (id === this.trackId) {\n      this.playlistLoaded(id, data, curDetails);\n    }\n  }\n\n  protected onLevelLoading(\n    event: Events.LEVEL_LOADING,\n    data: LevelLoadingData,\n  ): void {\n    this.switchLevel(data.level);\n  }\n\n  protected onLevelSwitching(\n    event: Events.LEVEL_SWITCHING,\n    data: LevelSwitchingData,\n  ): void {\n    this.switchLevel(data.level);\n  }\n\n  private switchLevel(levelIndex: number) {\n    const levelInfo = this.hls.levels[levelIndex];\n    if (!levelInfo) {\n      return;\n    }\n    const subtitleGroups = levelInfo.subtitleGroups || null;\n    const currentGroups = this.groupIds;\n    let currentTrack = this.currentTrack;\n    if (\n      !subtitleGroups ||\n      currentGroups?.length !== subtitleGroups?.length ||\n      subtitleGroups?.some((groupId) => currentGroups?.indexOf(groupId) === -1)\n    ) {\n      this.groupIds = subtitleGroups;\n      this.trackId = -1;\n      this.currentTrack = null;\n\n      const subtitleTracks = this.tracks.filter(\n        (track): boolean =>\n          !subtitleGroups || subtitleGroups.indexOf(track.groupId) !== -1,\n      );\n      if (subtitleTracks.length) {\n        // Disable selectDefaultTrack if there are no default tracks\n        if (\n          this.selectDefaultTrack &&\n          !subtitleTracks.some((track) => track.default)\n        ) {\n          this.selectDefaultTrack = false;\n        }\n        // track.id should match hls.audioTracks index\n        subtitleTracks.forEach((track, i) => {\n          track.id = i;\n        });\n      } else if (!currentTrack && !this.tracksInGroup.length) {\n        // Do not dispatch SUBTITLE_TRACKS_UPDATED when there were and are no tracks\n        return;\n      }\n      this.tracksInGroup = subtitleTracks;\n\n      // Find preferred track\n      const subtitlePreference = this.hls.config.subtitlePreference;\n      if (!currentTrack && subtitlePreference) {\n        this.selectDefaultTrack = false;\n        const groupIndex = findMatchingOption(\n          subtitlePreference,\n          subtitleTracks,\n        );\n        if (groupIndex > -1) {\n          currentTrack = subtitleTracks[groupIndex];\n        } else {\n          const allIndex = findMatchingOption(subtitlePreference, this.tracks);\n          currentTrack = this.tracks[allIndex];\n        }\n      }\n\n      // Select initial track\n      let trackId = this.findTrackId(currentTrack);\n      if (trackId === -1 && currentTrack) {\n        trackId = this.findTrackId(null);\n      }\n\n      // Dispatch events and load track if needed\n      const subtitleTracksUpdated: SubtitleTracksUpdatedData = {\n        subtitleTracks,\n      };\n      this.log(\n        `Updating subtitle tracks, ${\n          subtitleTracks.length\n        } track(s) found in \"${subtitleGroups?.join(',')}\" group-id`,\n      );\n      this.hls.trigger(Events.SUBTITLE_TRACKS_UPDATED, subtitleTracksUpdated);\n\n      if (trackId !== -1 && this.trackId === -1) {\n        this.setSubtitleTrack(trackId);\n      }\n    }\n  }\n\n  private findTrackId(currentTrack: MediaPlaylist | null): number {\n    const tracks = this.tracksInGroup;\n    const selectDefault = this.selectDefaultTrack;\n    for (let i = 0; i < tracks.length; i++) {\n      const track = tracks[i];\n      if (\n        (selectDefault && !track.default) ||\n        (!selectDefault && !currentTrack)\n      ) {\n        continue;\n      }\n      if (!currentTrack || matchesOption(track, currentTrack)) {\n        return i;\n      }\n    }\n    if (currentTrack) {\n      for (let i = 0; i < tracks.length; i++) {\n        const track = tracks[i];\n        if (\n          mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n            'LANGUAGE',\n            'ASSOC-LANGUAGE',\n            'CHARACTERISTICS',\n          ])\n        ) {\n          return i;\n        }\n      }\n      for (let i = 0; i < tracks.length; i++) {\n        const track = tracks[i];\n        if (\n          mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n            'LANGUAGE',\n          ])\n        ) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  private findTrackForTextTrack(textTrack: TextTrack | null): number {\n    if (textTrack) {\n      const tracks = this.tracksInGroup;\n      for (let i = 0; i < tracks.length; i++) {\n        const track = tracks[i];\n        if (subtitleTrackMatchesTextTrack(track, textTrack)) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData): void {\n    if (data.fatal || !data.context) {\n      return;\n    }\n\n    if (\n      data.context.type === PlaylistContextType.SUBTITLE_TRACK &&\n      data.context.id === this.trackId &&\n      (!this.groupIds || this.groupIds.indexOf(data.context.groupId) !== -1)\n    ) {\n      this.checkRetry(data);\n    }\n  }\n\n  get allSubtitleTracks(): MediaPlaylist[] {\n    return this.tracks;\n  }\n\n  /** get alternate subtitle tracks list from playlist **/\n  get subtitleTracks(): MediaPlaylist[] {\n    return this.tracksInGroup;\n  }\n\n  /** get/set index of the selected subtitle track (based on index in subtitle track lists) **/\n  get subtitleTrack(): number {\n    return this.trackId;\n  }\n\n  set subtitleTrack(newId: number) {\n    this.selectDefaultTrack = false;\n    this.setSubtitleTrack(newId);\n  }\n\n  public setSubtitleOption(\n    subtitleOption: MediaPlaylist | SubtitleSelectionOption | undefined,\n  ): MediaPlaylist | null {\n    this.hls.config.subtitlePreference = subtitleOption;\n    if (subtitleOption) {\n      if (subtitleOption.id === -1) {\n        this.setSubtitleTrack(-1);\n        return null;\n      }\n      const allSubtitleTracks = this.allSubtitleTracks;\n      this.selectDefaultTrack = false;\n      if (allSubtitleTracks.length) {\n        // First see if current option matches (no switch op)\n        const currentTrack = this.currentTrack;\n        if (currentTrack && matchesOption(subtitleOption, currentTrack)) {\n          return currentTrack;\n        }\n        // Find option in current group\n        const groupIndex = findMatchingOption(\n          subtitleOption,\n          this.tracksInGroup,\n        );\n        if (groupIndex > -1) {\n          const track = this.tracksInGroup[groupIndex];\n          this.setSubtitleTrack(groupIndex);\n          return track;\n        } else if (currentTrack) {\n          // If this is not the initial selection return null\n          // option should have matched one in active group\n          return null;\n        } else {\n          // Find the option in all tracks for initial selection\n          const allIndex = findMatchingOption(\n            subtitleOption,\n            allSubtitleTracks,\n          );\n          if (allIndex > -1) {\n            return allSubtitleTracks[allIndex];\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void {\n    super.loadPlaylist();\n    if (this.shouldLoadPlaylist(this.currentTrack)) {\n      this.scheduleLoading(this.currentTrack, hlsUrlParameters);\n    }\n  }\n\n  protected loadingPlaylist(\n    currentTrack: MediaPlaylist,\n    hlsUrlParameters: HlsUrlParameters | undefined,\n  ) {\n    super.loadingPlaylist(currentTrack, hlsUrlParameters);\n    const id = currentTrack.id;\n    const groupId = currentTrack.groupId as string;\n    const url = this.getUrlWithDirectives(currentTrack.url, hlsUrlParameters);\n    const details = currentTrack.details;\n    const age = details?.age;\n    this.log(\n      `Loading subtitle ${id} \"${currentTrack.name}\" lang:${currentTrack.lang} group:${groupId}${\n        hlsUrlParameters?.msn !== undefined\n          ? ' at sn ' + hlsUrlParameters.msn + ' part ' + hlsUrlParameters.part\n          : ''\n      }${age && details.live ? ' age ' + age.toFixed(1) + (details.type ? ' ' + details.type || '' : '') : ''} ${url}`,\n    );\n    this.hls.trigger(Events.SUBTITLE_TRACK_LOADING, {\n      url,\n      id,\n      groupId,\n      deliveryDirectives: hlsUrlParameters || null,\n      track: currentTrack,\n    });\n  }\n\n  /**\n   * Disables the old subtitleTrack and sets current mode on the next subtitleTrack.\n   * This operates on the DOM textTracks.\n   * A value of -1 will disable all subtitle tracks.\n   */\n  private toggleTrackModes(): void {\n    const { media } = this;\n    if (!media) {\n      return;\n    }\n\n    const textTracks = filterSubtitleTracks(media.textTracks);\n    const currentTrack = this.currentTrack;\n    let nextTrack;\n    if (currentTrack) {\n      nextTrack = textTracks.filter((textTrack) =>\n        subtitleTrackMatchesTextTrack(currentTrack, textTrack),\n      )[0];\n      if (!nextTrack) {\n        this.warn(\n          `Unable to find subtitle TextTrack with name \"${currentTrack.name}\" and language \"${currentTrack.lang}\"`,\n        );\n      }\n    }\n    [].slice.call(textTracks).forEach((track) => {\n      if (track.mode !== 'disabled' && track !== nextTrack) {\n        track.mode = 'disabled';\n      }\n    });\n    if (nextTrack) {\n      const mode = this.subtitleDisplay ? 'showing' : 'hidden';\n      if (nextTrack.mode !== mode) {\n        nextTrack.mode = mode;\n      }\n    }\n  }\n\n  /**\n   * This method is responsible for validating the subtitle index and periodically reloading if live.\n   * Dispatches the SUBTITLE_TRACK_SWITCH event, which instructs the subtitle-stream-controller to load the selected track.\n   */\n  private setSubtitleTrack(newId: number): void {\n    const tracks = this.tracksInGroup;\n\n    // setting this.subtitleTrack will trigger internal logic\n    // if media has not been attached yet, it will fail\n    // we keep a reference to the default track id\n    // and we'll set subtitleTrack when onMediaAttached is triggered\n    if (!this.media) {\n      this.queuedDefaultTrack = newId;\n      return;\n    }\n\n    // exit if track id as already set or invalid\n    if (newId < -1 || newId >= tracks.length || !Number.isFinite(newId)) {\n      this.warn(`Invalid subtitle track id: ${newId}`);\n      return;\n    }\n\n    this.selectDefaultTrack = false;\n    const lastTrack = this.currentTrack;\n    const track: MediaPlaylist | null = tracks[newId] || null;\n    this.trackId = newId;\n    this.currentTrack = track;\n    this.toggleTrackModes();\n    if (!track) {\n      // switch to -1\n      this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, { id: newId });\n      return;\n    }\n    const trackLoaded = !!track.details && !track.details.live;\n    if (newId === this.trackId && track === lastTrack && trackLoaded) {\n      return;\n    }\n    this.log(\n      `Switching to subtitle-track ${newId}` +\n        (track\n          ? ` \"${track.name}\" lang:${track.lang} group:${track.groupId}`\n          : ''),\n    );\n    const { id, groupId = '', name, type, url } = track;\n    this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, {\n      id,\n      groupId,\n      name,\n      type,\n      url,\n    });\n    const hlsUrlParameters = this.switchParams(\n      track.url,\n      lastTrack?.details,\n      track.details,\n    );\n    this.loadPlaylist(hlsUrlParameters);\n  }\n\n  private onTextTracksChanged = () => {\n    if (!this.useTextTrackPolling) {\n      self.clearInterval(this.subtitlePollingInterval);\n    }\n    // Media is undefined when switching streams via loadSource()\n    if (!this.media || !this.hls.config.renderTextTracksNatively) {\n      return;\n    }\n\n    let textTrack: TextTrack | null = null;\n    const tracks = filterSubtitleTracks(this.media.textTracks);\n    for (let i = 0; i < tracks.length; i++) {\n      if (tracks[i].mode === 'hidden') {\n        // Do not break in case there is a following track with showing.\n        textTrack = tracks[i];\n      } else if (tracks[i].mode === 'showing') {\n        textTrack = tracks[i];\n        break;\n      }\n    }\n\n    // Find internal track index for TextTrack\n    const trackId = this.findTrackForTextTrack(textTrack);\n    if (this.subtitleTrack !== trackId) {\n      this.setSubtitleTrack(trackId);\n    }\n  };\n}\n\nexport default SubtitleTrackController;\n", "/**\n * Generate a random v4 UUID\n *\n * @returns A random v4 UUID\n *\n * @group Utils\n *\n * @beta\n */\nexport function uuid() {\n    try {\n        return crypto.randomUUID();\n    }\n    catch (error) {\n        try {\n            const url = URL.createObjectURL(new Blob());\n            const uuid = url.toString();\n            URL.revokeObjectURL(url);\n            return uuid.slice(uuid.lastIndexOf('/') + 1);\n        }\n        catch (error) {\n            let dt = new Date().getTime();\n            const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n                const r = (dt + Math.random() * 16) % 16 | 0;\n                dt = Math.floor(dt / 16);\n                return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n            });\n            return uuid;\n        }\n    }\n}\n//# sourceMappingURL=uuid.js.map", "// From https://github.com/darkskyapp/string-hash\nexport function hash(text: string) {\n  let hash = 5381;\n  let i = text.length;\n  while (i) {\n    hash = (hash * 33) ^ text.charCodeAt(--i);\n  }\n\n  return (hash >>> 0).toString();\n}\n", "import { hash } from '../utils/hash';\nimport type { DateRange, DateRangeCue } from './date-range';\nimport type { MediaFragmentRef } from './fragment';\nimport type { Loader, LoaderContext } from '../types/loader';\n\nexport const ALIGNED_END_THRESHOLD_SECONDS = 0.025;\n\nexport type PlaybackRestrictions = {\n  skip: boolean;\n  jump: boolean;\n};\n\nexport type SnapOptions = {\n  out: boolean;\n  in: boolean;\n};\n\nexport enum TimelineOccupancy {\n  Point,\n  Range,\n}\n\nexport type AssetListJSON = {\n  ASSETS: Array<{ URI: string; DURATION: string }>;\n};\nexport interface InterstitialEventWithAssetList extends InterstitialEvent {\n  assetListUrl: string;\n}\n\nexport type BaseData = {\n  url: string;\n};\n\nexport type InterstitialId = string;\nexport type InterstitialAssetId = string;\n\nexport type InterstitialAssetItem = {\n  parentIdentifier: InterstitialId;\n  identifier: InterstitialAssetId;\n  duration: number | null;\n  startOffset: number; // asset start offset from start of interstitial event\n  timelineStart: number; // asset start on media element timeline\n  uri: string;\n  error?: Error;\n};\n\nexport function generateAssetIdentifier(\n  interstitial: InterstitialEvent,\n  uri: string,\n  assetListIndex: number,\n): string {\n  return `${interstitial.identifier}-${assetListIndex + 1}-${hash(uri)}`;\n}\n\nexport class InterstitialEvent {\n  private base: BaseData;\n  private _duration: number | null = null;\n  private _timelineStart: number | null = null;\n  private appendInPlaceDisabled?: boolean;\n  public appendInPlaceStarted?: boolean;\n  public dateRange: DateRange;\n  public hasPlayed: boolean = false;\n  public cumulativeDuration: number = 0;\n  public resumeOffset: number = NaN;\n  public playoutLimit: number = NaN;\n  public restrictions: PlaybackRestrictions = {\n    skip: false,\n    jump: false,\n  };\n  public snapOptions: SnapOptions = {\n    out: false,\n    in: false,\n  };\n  public assetList: InterstitialAssetItem[] = [];\n  public assetListLoader?: Loader<LoaderContext>;\n  public assetListResponse: AssetListJSON | null = null;\n  public resumeAnchor?: MediaFragmentRef;\n  public error?: Error;\n  public resetOnResume?: boolean;\n\n  constructor(dateRange: DateRange, base: BaseData) {\n    this.base = base;\n    this.dateRange = dateRange;\n    this.setDateRange(dateRange);\n  }\n\n  public setDateRange(dateRange: DateRange) {\n    this.dateRange = dateRange;\n    this.resumeOffset = dateRange.attr.optionalFloat(\n      'X-RESUME-OFFSET',\n      this.resumeOffset,\n    );\n    this.playoutLimit = dateRange.attr.optionalFloat(\n      'X-PLAYOUT-LIMIT',\n      this.playoutLimit,\n    );\n    this.restrictions = dateRange.attr.enumeratedStringList(\n      'X-RESTRICT',\n      this.restrictions,\n    );\n    this.snapOptions = dateRange.attr.enumeratedStringList(\n      'X-SNAP',\n      this.snapOptions,\n    );\n  }\n\n  public reset() {\n    this.appendInPlaceStarted = false;\n    this.assetListLoader?.destroy();\n    this.assetListLoader = undefined;\n    if (!this.supplementsPrimary) {\n      this.assetListResponse = null;\n      this.assetList = [];\n      this._duration = null;\n    }\n    // `error?` is reset when seeking back over interstitial `startOffset`\n    //  using `schedule.resetErrorsInRange(start, end)`.\n  }\n\n  public isAssetPastPlayoutLimit(assetIndex: number): boolean {\n    if (assetIndex > 0 && assetIndex >= this.assetList.length) {\n      return true;\n    }\n    const playoutLimit = this.playoutLimit;\n    if (assetIndex <= 0 || isNaN(playoutLimit)) {\n      return false;\n    }\n    if (playoutLimit === 0) {\n      return true;\n    }\n    const assetOffset = this.assetList[assetIndex]?.startOffset || 0;\n    return assetOffset > playoutLimit;\n  }\n\n  public findAssetIndex(asset: InterstitialAssetItem): number {\n    const index = this.assetList.indexOf(asset);\n    return index;\n  }\n\n  get identifier(): InterstitialId {\n    return this.dateRange.id;\n  }\n\n  get startDate(): Date {\n    return this.dateRange.startDate;\n  }\n\n  get startTime(): number {\n    // Primary media timeline start time\n    const startTime = this.dateRange.startTime;\n    if (this.snapOptions.out) {\n      const frag = this.dateRange.tagAnchor;\n      if (frag) {\n        return getSnapToFragmentTime(startTime, frag);\n      }\n    }\n    return startTime;\n  }\n\n  get startOffset(): number {\n    return this.cue.pre ? 0 : this.startTime;\n  }\n\n  get startIsAligned(): boolean {\n    if (this.startTime === 0 || this.snapOptions.out) {\n      return true;\n    }\n    const frag = this.dateRange.tagAnchor;\n    if (frag) {\n      const startTime = this.dateRange.startTime;\n      const snappedStart = getSnapToFragmentTime(startTime, frag);\n      return startTime - snappedStart < 0.1;\n    }\n    return false;\n  }\n\n  get resumptionOffset(): number {\n    const resumeOffset = this.resumeOffset;\n    const offset = Number.isFinite(resumeOffset) ? resumeOffset : this.duration;\n    return this.cumulativeDuration + offset;\n  }\n\n  get resumeTime(): number {\n    // Primary media timeline resumption time\n    const resumeTime = this.startOffset + this.resumptionOffset;\n    if (this.snapOptions.in) {\n      const frag = this.resumeAnchor;\n      if (frag) {\n        return getSnapToFragmentTime(resumeTime, frag);\n      }\n    }\n    return resumeTime;\n  }\n\n  get appendInPlace(): boolean {\n    if (this.appendInPlaceStarted) {\n      return true;\n    }\n    if (this.appendInPlaceDisabled) {\n      return false;\n    }\n    if (\n      !this.cue.once &&\n      !this.cue.pre && // preroll starts at startPosition before startPosition is known (live)\n      this.startIsAligned &&\n      ((isNaN(this.playoutLimit) && isNaN(this.resumeOffset)) ||\n        (this.resumeOffset &&\n          this.duration &&\n          Math.abs(this.resumeOffset - this.duration) <\n            ALIGNED_END_THRESHOLD_SECONDS))\n    ) {\n      return true;\n    }\n    return false;\n  }\n\n  set appendInPlace(value: boolean) {\n    if (this.appendInPlaceStarted) {\n      this.resetOnResume = !value;\n      return;\n    }\n    this.appendInPlaceDisabled = !value;\n  }\n\n  // Extended timeline start time\n  get timelineStart(): number {\n    if (this._timelineStart !== null) {\n      return this._timelineStart;\n    }\n    return this.startTime;\n  }\n\n  set timelineStart(value: number) {\n    this._timelineStart = value;\n  }\n\n  get duration(): number {\n    const playoutLimit = this.playoutLimit;\n    let duration: number;\n    if (this._duration !== null) {\n      duration = this._duration;\n    } else if (this.dateRange.duration) {\n      duration = this.dateRange.duration;\n    } else {\n      duration = this.dateRange.plannedDuration || 0;\n    }\n    if (!isNaN(playoutLimit) && playoutLimit < duration) {\n      duration = playoutLimit;\n    }\n    return duration;\n  }\n\n  set duration(value: number) {\n    this._duration = value;\n  }\n\n  get cue(): DateRangeCue {\n    return this.dateRange.cue;\n  }\n\n  get timelineOccupancy() {\n    if (this.dateRange.attr['X-TIMELINE-OCCUPIES'] === 'RANGE') {\n      return TimelineOccupancy.Range;\n    }\n    return TimelineOccupancy.Point;\n  }\n\n  get supplementsPrimary(): boolean {\n    return this.dateRange.attr['X-TIMELINE-STYLE'] === 'PRIMARY';\n  }\n\n  get contentMayVary(): boolean {\n    return this.dateRange.attr['X-CONTENT-MAY-VARY'] !== 'NO';\n  }\n\n  get assetUrl(): string | undefined {\n    return this.dateRange.attr['X-ASSET-URI'];\n  }\n\n  get assetListUrl(): string | undefined {\n    return this.dateRange.attr['X-ASSET-LIST'];\n  }\n\n  get baseUrl(): string {\n    return this.base.url;\n  }\n\n  get assetListLoaded(): boolean {\n    return this.assetList.length > 0 || this.assetListResponse !== null;\n  }\n\n  toString(): string {\n    return eventToString(this);\n  }\n}\n\nfunction getSnapToFragmentTime(time: number, frag: MediaFragmentRef) {\n  return time - frag.start < frag.duration / 2 &&\n    !(\n      Math.abs(time - (frag.start + frag.duration)) <\n      ALIGNED_END_THRESHOLD_SECONDS\n    )\n    ? frag.start\n    : frag.start + frag.duration;\n}\n\nexport function getInterstitialUrl(\n  uri: string,\n  sessionId: string,\n  baseUrl?: string,\n): URL | never {\n  const url = new self.URL(uri, baseUrl);\n  if (url.protocol !== 'data:') {\n    url.searchParams.set('_HLS_primary_id', sessionId);\n  }\n  return url;\n}\n\nexport function getNextAssetIndex(\n  interstitial: InterstitialEvent,\n  assetListIndex: number,\n): number {\n  while (interstitial.assetList[++assetListIndex]?.error) {\n    /* no-op */\n  }\n  return assetListIndex;\n}\n\nfunction eventToString(interstitial: InterstitialEvent): string {\n  return `[\"${interstitial.identifier}\" ${interstitial.cue.pre ? '<pre>' : interstitial.cue.post ? '<post>' : ''}${interstitial.timelineStart.toFixed(2)}-${interstitial.resumeTime.toFixed(2)}]`;\n}\n\nexport function eventAssetToString(asset: InterstitialAssetItem): string {\n  const start = asset.timelineStart;\n  const duration = asset.duration || 0;\n  return `[\"${asset.identifier}\" ${start.toFixed(2)}-${(start + duration).toFixed(2)}]`;\n}\n", "import { Events, type HlsListeners } from '../events';\nimport {\n  eventAssetToString,\n  getInterstitialUrl,\n  type InterstitialAssetId,\n  type InterstitialAssetItem,\n  type InterstitialEvent,\n  type InterstitialId,\n} from '../loader/interstitial-event';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport type { HlsConfig } from '../config';\nimport type { InterstitialScheduleEventItem } from '../controller/interstitials-schedule';\nimport type Hls from '../hls';\nimport type { BufferCodecsData, MediaAttachingData } from '../types/events';\n\nexport interface InterstitialPlayer {\n  bufferedEnd: number;\n  currentTime: number;\n  duration: number;\n  assetPlayers: (HlsAssetPlayer | null)[];\n  playingIndex: number;\n  scheduleItem: InterstitialScheduleEventItem | null;\n}\n\nexport type HlsAssetPlayerConfig = Partial<HlsConfig> &\n  Required<Pick<HlsConfig, 'assetPlayerId' | 'primarySessionId'>>;\n\nexport class HlsAssetPlayer {\n  public hls: Hls | null;\n  public interstitial: InterstitialEvent;\n  public readonly assetItem: InterstitialAssetItem;\n  public tracks: Partial<BufferCodecsData> | null = null;\n  private hasDetails: boolean = false;\n  private mediaAttached: HTMLMediaElement | null = null;\n  private _currentTime?: number;\n  private _bufferedEosTime?: number;\n\n  constructor(\n    HlsPlayerClass: typeof Hls,\n    userConfig: HlsAssetPlayerConfig,\n    interstitial: InterstitialEvent,\n    assetItem: InterstitialAssetItem,\n  ) {\n    const hls = (this.hls = new HlsPlayerClass(userConfig));\n    this.interstitial = interstitial;\n    this.assetItem = assetItem;\n    const detailsLoaded = () => {\n      this.hasDetails = true;\n    };\n    hls.once(Events.LEVEL_LOADED, detailsLoaded);\n    hls.once(Events.AUDIO_TRACK_LOADED, detailsLoaded);\n    hls.once(Events.SUBTITLE_TRACK_LOADED, detailsLoaded);\n    hls.on(Events.MEDIA_ATTACHING, (name, { media }) => {\n      this.removeMediaListeners();\n      this.mediaAttached = media;\n      const event = this.interstitial;\n      if (event.playoutLimit) {\n        media.addEventListener('timeupdate', this.checkPlayout);\n        if (this.appendInPlace) {\n          hls.on(Events.BUFFER_APPENDED, () => {\n            const bufferedEnd = this.bufferedEnd;\n            if (this.reachedPlayout(bufferedEnd)) {\n              this._bufferedEosTime = bufferedEnd;\n              hls.trigger(Events.BUFFERED_TO_END, undefined);\n            }\n          });\n        }\n      }\n    });\n  }\n\n  get appendInPlace(): boolean {\n    return this.interstitial.appendInPlace;\n  }\n\n  loadSource() {\n    const hls = this.hls;\n    if (!hls) {\n      return;\n    }\n    if (!hls.url) {\n      let uri: string = this.assetItem.uri;\n      try {\n        uri = getInterstitialUrl(uri, hls.config.primarySessionId || '').href;\n      } catch (error) {\n        // Ignore error parsing ASSET_URI or adding _HLS_primary_id to it. The\n        // issue should surface as an INTERSTITIAL_ASSET_ERROR loading the asset.\n      }\n      hls.loadSource(uri);\n    } else if (hls.levels.length && !(hls as any).started) {\n      hls.startLoad(-1, true);\n    }\n  }\n\n  bufferedInPlaceToEnd(media?: HTMLMediaElement | null) {\n    if (!this.appendInPlace) {\n      return false;\n    }\n    if (this.hls?.bufferedToEnd) {\n      return true;\n    }\n    if (!media) {\n      return false;\n    }\n    const duration = Math.min(this._bufferedEosTime || Infinity, this.duration);\n    const start = this.timelineOffset;\n    const bufferInfo = BufferHelper.bufferInfo(media, start, 0);\n    const bufferedEnd = this.getAssetTime(bufferInfo.end);\n    return bufferedEnd >= duration - 0.02;\n  }\n\n  private checkPlayout = () => {\n    if (this.reachedPlayout(this.currentTime) && this.hls) {\n      this.hls.trigger(Events.PLAYOUT_LIMIT_REACHED, {});\n    }\n  };\n\n  private reachedPlayout(time: number): boolean {\n    const interstitial = this.interstitial;\n    const playoutLimit = interstitial.playoutLimit;\n    return this.startOffset + time >= playoutLimit;\n  }\n\n  get destroyed(): boolean {\n    return !this.hls?.userConfig;\n  }\n\n  get assetId(): InterstitialAssetId {\n    return this.assetItem.identifier;\n  }\n\n  get interstitialId(): InterstitialId {\n    return this.assetItem.parentIdentifier;\n  }\n\n  get media(): HTMLMediaElement | null {\n    return this.hls?.media || null;\n  }\n\n  get bufferedEnd(): number {\n    const media = this.media || this.mediaAttached;\n    if (!media) {\n      if (this._bufferedEosTime) {\n        return this._bufferedEosTime;\n      }\n      return this.currentTime;\n    }\n    const bufferInfo = BufferHelper.bufferInfo(media, media.currentTime, 0.001);\n    return this.getAssetTime(bufferInfo.end);\n  }\n\n  get currentTime(): number {\n    const media = this.media || this.mediaAttached;\n    if (!media) {\n      return this._currentTime || 0;\n    }\n    return this.getAssetTime(media.currentTime);\n  }\n\n  get duration(): number {\n    const duration = this.assetItem.duration;\n    if (!duration) {\n      return 0;\n    }\n    const playoutLimit = this.interstitial.playoutLimit;\n    if (playoutLimit) {\n      const assetPlayout = playoutLimit - this.startOffset;\n      if (assetPlayout > 0 && assetPlayout < duration) {\n        return assetPlayout;\n      }\n    }\n    return duration;\n  }\n\n  get remaining(): number {\n    const duration = this.duration;\n    if (!duration) {\n      return 0;\n    }\n    return Math.max(0, duration - this.currentTime);\n  }\n\n  get startOffset(): number {\n    return this.assetItem.startOffset;\n  }\n\n  get timelineOffset(): number {\n    return this.hls?.config.timelineOffset || 0;\n  }\n\n  set timelineOffset(value: number) {\n    const timelineOffset = this.timelineOffset;\n    if (value !== timelineOffset) {\n      const diff = value - timelineOffset;\n      if (Math.abs(diff) > 1 / 90000 && this.hls) {\n        if (this.hasDetails) {\n          throw new Error(\n            `Cannot set timelineOffset after playlists are loaded`,\n          );\n        }\n        this.hls.config.timelineOffset = value;\n      }\n    }\n  }\n\n  private getAssetTime(time: number): number {\n    const timelineOffset = this.timelineOffset;\n    const duration = this.duration;\n    return Math.min(Math.max(0, time - timelineOffset), duration);\n  }\n\n  private removeMediaListeners() {\n    const media = this.mediaAttached;\n    if (media) {\n      this._currentTime = media.currentTime;\n      this.bufferSnapShot();\n      media.removeEventListener('timeupdate', this.checkPlayout);\n    }\n  }\n\n  private bufferSnapShot() {\n    if (this.mediaAttached) {\n      if (this.hls?.bufferedToEnd) {\n        this._bufferedEosTime = this.bufferedEnd;\n      }\n    }\n  }\n\n  destroy() {\n    this.removeMediaListeners();\n    if (this.hls) {\n      this.hls.destroy();\n    }\n    this.hls = null;\n    // @ts-ignore\n    this.tracks = this.mediaAttached = this.checkPlayout = null;\n  }\n\n  attachMedia(data: HTMLMediaElement | MediaAttachingData) {\n    this.loadSource();\n    this.hls?.attachMedia(data);\n  }\n\n  detachMedia() {\n    this.removeMediaListeners();\n    this.mediaAttached = null;\n    this.hls?.detachMedia();\n  }\n\n  resumeBuffering() {\n    this.hls?.resumeBuffering();\n  }\n\n  pauseBuffering() {\n    this.hls?.pauseBuffering();\n  }\n\n  transferMedia() {\n    this.bufferSnapShot();\n    return this.hls?.transferMedia() || null;\n  }\n\n  resetDetails() {\n    const hls = this.hls;\n    if (hls && this.hasDetails) {\n      hls.stopLoad();\n      const deleteDetails = (obj) => delete obj.details;\n      hls.levels.forEach(deleteDetails);\n      hls.allAudioTracks.forEach(deleteDetails);\n      hls.allSubtitleTracks.forEach(deleteDetails);\n      this.hasDetails = false;\n    }\n  }\n\n  on<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context?: Context,\n  ) {\n    this.hls?.on(event, listener);\n  }\n\n  once<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context?: Context,\n  ) {\n    this.hls?.once(event, listener);\n  }\n\n  off<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context?: Context,\n  ) {\n    this.hls?.off(event, listener);\n  }\n\n  toString(): string {\n    return `HlsAssetPlayer: ${eventAssetToString(this.assetItem)} ${this.hls?.sessionId} ${this.appendInPlace ? 'append-in-place' : ''}`;\n  }\n}\n", "import { findFragmentByPTS } from './fragment-finders';\nimport {\n  ALIGNED_END_THRESHOLD_SECONDS,\n  type BaseData,\n  InterstitialEvent,\n  type InterstitialId,\n  TimelineOccupancy,\n} from '../loader/interstitial-event';\nimport { Logger } from '../utils/logger';\nimport type { DateRange } from '../loader/date-range';\nimport type { MediaSelection } from '../types/media-playlist';\nimport type { ILogger } from '../utils/logger';\n\nconst ABUTTING_THRESHOLD_SECONDS = 0.033;\n\nexport type InterstitialScheduleEventItem = {\n  event: InterstitialEvent;\n  start: number;\n  end: number;\n  playout: {\n    start: number;\n    end: number;\n  };\n  integrated: {\n    start: number;\n    end: number;\n  };\n};\n\nexport type InterstitialSchedulePrimaryItem = {\n  nextEvent: InterstitialEvent | null;\n  previousEvent: InterstitialEvent | null;\n  event?: undefined;\n  start: number;\n  end: number;\n  playout: {\n    start: number;\n    end: number;\n  };\n  integrated: {\n    start: number;\n    end: number;\n  };\n};\n\nexport type InterstitialScheduleItem =\n  | InterstitialScheduleEventItem\n  | InterstitialSchedulePrimaryItem;\n\nexport type InterstitialScheduleDurations = {\n  primary: number;\n  playout: number;\n  integrated: number;\n};\n\nexport type TimelineType = 'primary' | 'playout' | 'integrated';\n\ntype ScheduleUpdateCallback = (\n  removed: InterstitialEvent[],\n  previousItems: InterstitialScheduleItem[] | null,\n) => void;\n\nexport class InterstitialsSchedule extends Logger {\n  private onScheduleUpdate: ScheduleUpdateCallback;\n  private eventMap: Record<string, InterstitialEvent | undefined> = {};\n  public events: InterstitialEvent[] | null = null;\n  public items: InterstitialScheduleItem[] | null = null;\n  public durations: InterstitialScheduleDurations = {\n    primary: 0,\n    playout: 0,\n    integrated: 0,\n  };\n\n  constructor(onScheduleUpdate: ScheduleUpdateCallback, logger: ILogger) {\n    super('interstitials-sched', logger);\n    this.onScheduleUpdate = onScheduleUpdate;\n  }\n\n  public destroy() {\n    this.reset();\n    // @ts-ignore\n    this.onScheduleUpdate = null;\n  }\n\n  public reset() {\n    this.eventMap = {};\n    this.setDurations(0, 0, 0);\n    if (this.events) {\n      this.events.forEach((interstitial) => interstitial.reset());\n    }\n    this.events = this.items = null;\n  }\n\n  public resetErrorsInRange(start: number, end: number): number {\n    if (this.events) {\n      return this.events.reduce((count, interstitial) => {\n        if (\n          start <= interstitial.startOffset &&\n          end > interstitial.startOffset\n        ) {\n          delete interstitial.error;\n          return count + 1;\n        }\n        return count;\n      }, 0);\n    }\n    return 0;\n  }\n\n  get duration(): number {\n    const items = this.items;\n    return items ? items[items.length - 1].end : 0;\n  }\n\n  get length(): number {\n    return this.items ? this.items.length : 0;\n  }\n\n  public getEvent(\n    identifier: InterstitialId | undefined,\n  ): InterstitialEvent | null {\n    return identifier ? this.eventMap[identifier] || null : null;\n  }\n\n  public hasEvent(identifier: InterstitialId): boolean {\n    return identifier in this.eventMap;\n  }\n\n  public findItemIndex(item: InterstitialScheduleItem, time?: number): number {\n    if (item.event) {\n      // Find Event Item\n      return this.findEventIndex(item.event.identifier);\n    }\n    // Find Primary Item\n    let index = -1;\n    if (item.nextEvent) {\n      index = this.findEventIndex(item.nextEvent.identifier) - 1;\n    } else if (item.previousEvent) {\n      index = this.findEventIndex(item.previousEvent.identifier) + 1;\n    }\n    const items = this.items;\n    if (items) {\n      if (!items[index]) {\n        if (time === undefined) {\n          time = item.start;\n        }\n        index = this.findItemIndexAtTime(time);\n      }\n      // Only return index of a Primary Item\n      while (index >= 0 && items[index]?.event) {\n        // If index found is an interstitial it is not a valid result as it should have been matched up top\n        // decrement until result is negative (not found) or a primary segment\n        index--;\n      }\n    }\n    return index;\n  }\n\n  public findItemIndexAtTime(\n    timelinePos: number,\n    timelineType?: TimelineType,\n  ): number {\n    const items = this.items;\n    if (items) {\n      for (let i = 0; i < items.length; i++) {\n        let timeRange: { start: number; end: number } = items[i];\n        if (timelineType && timelineType !== 'primary') {\n          timeRange = timeRange[timelineType];\n        }\n        if (\n          timelinePos === timeRange.start ||\n          (timelinePos > timeRange.start && timelinePos < timeRange.end)\n        ) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  public findJumpRestrictedIndex(startIndex: number, endIndex: number): number {\n    const items = this.items;\n    if (items) {\n      for (let i = startIndex; i <= endIndex; i++) {\n        if (!items[i]) {\n          break;\n        }\n        const event = items[i].event;\n        if (event?.restrictions.jump && !event.appendInPlace) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  public findEventIndex(identifier: InterstitialId): number {\n    const items = this.items;\n    if (items) {\n      for (let i = items.length; i--; ) {\n        if (items[i].event?.identifier === identifier) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  public findAssetIndex(event: InterstitialEvent, timelinePos: number): number {\n    const assetList = event.assetList;\n    const length = assetList.length;\n    if (length > 1) {\n      for (let i = 0; i < length; i++) {\n        const asset = assetList[i];\n        if (!asset.error) {\n          const timelineStart = asset.timelineStart;\n          if (\n            timelinePos === timelineStart ||\n            (timelinePos > timelineStart &&\n              (timelinePos < timelineStart + (asset.duration || 0) ||\n                i === length - 1))\n          ) {\n            return i;\n          }\n        }\n      }\n    }\n    return 0;\n  }\n\n  public get assetIdAtEnd(): string | null {\n    const interstitialAtEnd = this.items?.[this.length - 1]?.event;\n    if (interstitialAtEnd) {\n      const assetList = interstitialAtEnd.assetList;\n      const assetAtEnd = assetList[assetList.length - 1];\n      if (assetAtEnd) {\n        return assetAtEnd.identifier;\n      }\n    }\n    return null;\n  }\n\n  public parseInterstitialDateRanges(\n    mediaSelection: MediaSelection,\n    enableAppendInPlace: boolean,\n  ) {\n    const details = mediaSelection.main.details!;\n    const { dateRanges } = details;\n    const previousInterstitialEvents = this.events;\n    const interstitialEvents = this.parseDateRanges(\n      dateRanges,\n      {\n        url: details.url,\n      },\n      enableAppendInPlace,\n    );\n    const ids = Object.keys(dateRanges);\n    const removedInterstitials = previousInterstitialEvents\n      ? previousInterstitialEvents.filter(\n          (event) => !ids.includes(event.identifier),\n        )\n      : [];\n    if (interstitialEvents.length) {\n      // pre-rolls, post-rolls, and events with the same start time are played in playlist tag order\n      // all other events are ordered by start time\n      interstitialEvents.sort((a, b) => {\n        const aPre = a.cue.pre;\n        const aPost = a.cue.post;\n        const bPre = b.cue.pre;\n        const bPost = b.cue.post;\n        if (aPre && !bPre) {\n          return -1;\n        }\n        if (bPre && !aPre) {\n          return 1;\n        }\n        if (aPost && !bPost) {\n          return 1;\n        }\n        if (bPost && !aPost) {\n          return -1;\n        }\n        if (!aPre && !bPre && !aPost && !bPost) {\n          const startA = a.startTime;\n          const startB = b.startTime;\n          if (startA !== startB) {\n            return startA - startB;\n          }\n        }\n        return a.dateRange.tagOrder - b.dateRange.tagOrder;\n      });\n    }\n    this.events = interstitialEvents;\n\n    // Clear removed DateRanges from buffered list (kills playback of active Interstitials)\n    removedInterstitials.forEach((interstitial) => {\n      this.removeEvent(interstitial);\n    });\n\n    this.updateSchedule(mediaSelection, removedInterstitials);\n  }\n\n  public updateSchedule(\n    mediaSelection: MediaSelection,\n    removedInterstitials: InterstitialEvent[] = [],\n    forceUpdate: boolean = false,\n  ) {\n    const events = this.events || [];\n    if (events.length || removedInterstitials.length || this.length < 2) {\n      const currentItems = this.items;\n      const updatedItems = this.parseSchedule(events, mediaSelection);\n      const updated =\n        forceUpdate ||\n        removedInterstitials.length ||\n        currentItems?.length !== updatedItems.length ||\n        updatedItems.some((item, i) => {\n          return (\n            Math.abs(item.playout.start - currentItems[i].playout.start) >\n              0.005 ||\n            Math.abs(item.playout.end - currentItems[i].playout.end) > 0.005\n          );\n        });\n      if (updated) {\n        this.items = updatedItems;\n        // call interstitials-controller onScheduleUpdated()\n        this.onScheduleUpdate(removedInterstitials, currentItems);\n      }\n    }\n  }\n\n  private parseDateRanges(\n    dateRanges: Record<string, DateRange | undefined>,\n    baseData: BaseData,\n    enableAppendInPlace: boolean,\n  ): InterstitialEvent[] {\n    const interstitialEvents: InterstitialEvent[] = [];\n    const ids = Object.keys(dateRanges);\n    for (let i = 0; i < ids.length; i++) {\n      const id = ids[i];\n      const dateRange = dateRanges[id]!;\n      if (dateRange.isInterstitial) {\n        let interstitial = this.eventMap[id];\n        if (interstitial) {\n          // Update InterstitialEvent already parsed and mapped\n          // This retains already loaded duration and loaded asset list info\n          interstitial.setDateRange(dateRange);\n        } else {\n          interstitial = new InterstitialEvent(dateRange, baseData);\n          this.eventMap[id] = interstitial;\n          if (enableAppendInPlace === false) {\n            interstitial.appendInPlace = enableAppendInPlace;\n          }\n        }\n        interstitialEvents.push(interstitial);\n      }\n    }\n    return interstitialEvents;\n  }\n\n  private parseSchedule(\n    interstitialEvents: InterstitialEvent[],\n    mediaSelection: MediaSelection,\n  ): InterstitialScheduleItem[] {\n    const schedule: InterstitialScheduleItem[] = [];\n    const details = mediaSelection.main.details!;\n    const primaryDuration = details.live ? Infinity : details.edge;\n    let playoutDuration = 0;\n\n    // Filter events that have errored from the schedule (Primary fallback)\n    interstitialEvents = interstitialEvents.filter(\n      (event) => !event.error && !(event.cue.once && event.hasPlayed),\n    );\n    if (interstitialEvents.length) {\n      // Update Schedule\n      this.resolveOffsets(interstitialEvents, mediaSelection);\n\n      // Populate Schedule with Interstitial Event and Primary Segment Items\n      let primaryPosition = 0;\n      let integratedTime = 0;\n      interstitialEvents.forEach((interstitial, i) => {\n        const preroll = interstitial.cue.pre;\n        const postroll = interstitial.cue.post;\n        const previousEvent =\n          (interstitialEvents[i - 1] as InterstitialEvent | undefined) || null;\n        const appendInPlace = interstitial.appendInPlace;\n        const eventStart = postroll\n          ? primaryDuration\n          : interstitial.startOffset;\n        const interstitialDuration = interstitial.duration;\n        const timelineDuration =\n          interstitial.timelineOccupancy === TimelineOccupancy.Range\n            ? interstitialDuration\n            : 0;\n        const resumptionOffset = interstitial.resumptionOffset;\n        const inSameStartTimeSequence = previousEvent?.startTime === eventStart;\n        const start = eventStart + interstitial.cumulativeDuration;\n        let end = appendInPlace\n          ? start + interstitialDuration\n          : eventStart + resumptionOffset;\n        if (preroll || (!postroll && eventStart <= 0)) {\n          // preroll or in-progress midroll\n          const integratedStart = integratedTime;\n          integratedTime += timelineDuration;\n          interstitial.timelineStart = start;\n          const playoutStart = playoutDuration;\n          playoutDuration += interstitialDuration;\n          schedule.push({\n            event: interstitial,\n            start,\n            end,\n            playout: {\n              start: playoutStart,\n              end: playoutDuration,\n            },\n            integrated: {\n              start: integratedStart,\n              end: integratedTime,\n            },\n          });\n        } else if (eventStart <= primaryDuration) {\n          if (!inSameStartTimeSequence) {\n            const segmentDuration = eventStart - primaryPosition;\n            // Do not schedule a primary segment if interstitials are abutting by less than ABUTTING_THRESHOLD_SECONDS\n            if (segmentDuration > ABUTTING_THRESHOLD_SECONDS) {\n              // primary segment\n              const timelineStart = primaryPosition;\n              const integratedStart = integratedTime;\n              integratedTime += segmentDuration;\n              const playoutStart = playoutDuration;\n              playoutDuration += segmentDuration;\n              const primarySegment = {\n                previousEvent: interstitialEvents[i - 1] || null,\n                nextEvent: interstitial,\n                start: timelineStart,\n                end: timelineStart + segmentDuration,\n                playout: {\n                  start: playoutStart,\n                  end: playoutDuration,\n                },\n                integrated: {\n                  start: integratedStart,\n                  end: integratedTime,\n                },\n              };\n              schedule.push(primarySegment);\n            } else if (segmentDuration > 0 && previousEvent) {\n              // Add previous event `resumeTime` (based on duration or resumeOffset) so that it ends aligned with this one\n              previousEvent.cumulativeDuration += segmentDuration;\n              schedule[schedule.length - 1].end = eventStart;\n            }\n          }\n          // midroll / postroll\n          if (postroll) {\n            end = start;\n          }\n          interstitial.timelineStart = start;\n          const integratedStart = integratedTime;\n          integratedTime += timelineDuration;\n          const playoutStart = playoutDuration;\n          playoutDuration += interstitialDuration;\n          schedule.push({\n            event: interstitial,\n            start,\n            end,\n            playout: {\n              start: playoutStart,\n              end: playoutDuration,\n            },\n            integrated: {\n              start: integratedStart,\n              end: integratedTime,\n            },\n          });\n        } else {\n          // Interstitial starts after end of primary VOD - not included in schedule\n          return;\n        }\n        const resumeTime = interstitial.resumeTime;\n        if (postroll || resumeTime > primaryDuration) {\n          primaryPosition = primaryDuration;\n        } else {\n          primaryPosition = resumeTime;\n        }\n      });\n      if (primaryPosition < primaryDuration) {\n        // last primary segment\n        const timelineStart = primaryPosition;\n        const integratedStart = integratedTime;\n        const segmentDuration = primaryDuration - primaryPosition;\n        integratedTime += segmentDuration;\n        const playoutStart = playoutDuration;\n        playoutDuration += segmentDuration;\n        schedule.push({\n          previousEvent: schedule[schedule.length - 1]?.event || null,\n          nextEvent: null,\n          start: primaryPosition,\n          end: timelineStart + segmentDuration,\n          playout: {\n            start: playoutStart,\n            end: playoutDuration,\n          },\n          integrated: {\n            start: integratedStart,\n            end: integratedTime,\n          },\n        });\n      }\n      this.setDurations(primaryDuration, playoutDuration, integratedTime);\n    } else {\n      // no interstials - schedule is one primary segment\n      const start = 0;\n      schedule.push({\n        previousEvent: null,\n        nextEvent: null,\n        start,\n        end: primaryDuration,\n        playout: {\n          start,\n          end: primaryDuration,\n        },\n        integrated: {\n          start,\n          end: primaryDuration,\n        },\n      });\n      this.setDurations(primaryDuration, primaryDuration, primaryDuration);\n    }\n    return schedule;\n  }\n\n  private setDurations(primary: number, playout: number, integrated: number) {\n    this.durations = {\n      primary,\n      playout,\n      integrated,\n    };\n  }\n\n  private resolveOffsets(\n    interstitialEvents: InterstitialEvent[],\n    mediaSelection: MediaSelection,\n  ) {\n    const details = mediaSelection.main.details!;\n    const primaryDuration = details.live ? Infinity : details.edge;\n\n    // First resolve cumulative resumption offsets for Interstitials that start at the same DateTime\n    let cumulativeDuration = 0;\n    let lastScheduledStart = -1;\n    interstitialEvents.forEach((interstitial, i) => {\n      const preroll = interstitial.cue.pre;\n      const postroll = interstitial.cue.post;\n      const eventStart = preroll\n        ? 0\n        : postroll\n          ? primaryDuration\n          : interstitial.startTime;\n      this.updateAssetDurations(interstitial);\n\n      // X-RESUME-OFFSET values of interstitials scheduled at the same time are cumulative\n      const inSameStartTimeSequence = lastScheduledStart === eventStart;\n      if (inSameStartTimeSequence) {\n        interstitial.cumulativeDuration = cumulativeDuration;\n      } else {\n        cumulativeDuration = 0;\n        lastScheduledStart = eventStart;\n      }\n      if (!postroll && interstitial.snapOptions.in) {\n        // FIXME: Include audio playlist in snapping\n        interstitial.resumeAnchor =\n          findFragmentByPTS(\n            null,\n            details.fragments,\n            interstitial.startOffset + interstitial.resumptionOffset,\n            0,\n            0,\n          ) || undefined;\n      }\n      // Check if primary fragments align with resumption offset and disable appendInPlace if they do not\n      if (interstitial.appendInPlace && !interstitial.appendInPlaceStarted) {\n        const alignedSegmentStart = this.primaryCanResumeInPlaceAt(\n          interstitial,\n          mediaSelection,\n        );\n        if (!alignedSegmentStart) {\n          interstitial.appendInPlace = false;\n        }\n      }\n      if (!interstitial.appendInPlace && i + 1 < interstitialEvents.length) {\n        // abutting Interstitials must use the same MediaSource strategy, this applies to all whether or not they are back to back:\n        const timeBetween =\n          interstitialEvents[i + 1].startTime -\n          interstitialEvents[i].resumeTime;\n        if (timeBetween < ABUTTING_THRESHOLD_SECONDS) {\n          interstitialEvents[i + 1].appendInPlace = false;\n          if (interstitialEvents[i + 1].appendInPlace) {\n            this.warn(\n              `Could not change append strategy for abutting event ${interstitial}`,\n            );\n          }\n        }\n      }\n      // Update cumulativeDuration for next abutting interstitial with the same start date\n      const resumeOffset = Number.isFinite(interstitial.resumeOffset)\n        ? interstitial.resumeOffset\n        : interstitial.duration;\n      cumulativeDuration += resumeOffset;\n    });\n  }\n\n  private primaryCanResumeInPlaceAt(\n    interstitial: InterstitialEvent,\n    mediaSelection: MediaSelection,\n  ): boolean {\n    const resumeTime = interstitial.resumeTime;\n    const resumesInPlaceAt =\n      interstitial.startTime + interstitial.resumptionOffset;\n    if (\n      Math.abs(resumeTime - resumesInPlaceAt) > ALIGNED_END_THRESHOLD_SECONDS\n    ) {\n      this.log(\n        `\"${interstitial.identifier}\" resumption ${resumeTime} not aligned with estimated timeline end ${resumesInPlaceAt}`,\n      );\n      return false;\n    }\n    const playlists = Object.keys(mediaSelection);\n    return !playlists.some((playlistType) => {\n      const details = mediaSelection[playlistType].details;\n      const playlistEnd = details.edge;\n      if (resumeTime >= playlistEnd) {\n        // Live playback - resumption segments are not yet available\n        this.log(\n          `\"${interstitial.identifier}\" resumption ${resumeTime} past ${playlistType} playlist end ${playlistEnd}`,\n        );\n        // Assume alignment is possible (or reset can take place)\n        return false;\n      }\n      const startFragment = findFragmentByPTS(\n        null,\n        details.fragments,\n        resumeTime,\n      );\n      if (!startFragment) {\n        this.log(\n          `\"${interstitial.identifier}\" resumption ${resumeTime} does not align with any fragments in ${playlistType} playlist (${details.fragStart}-${details.fragmentEnd})`,\n        );\n        return true;\n      }\n      const allowance = playlistType === 'audio' ? 0.175 : 0;\n      const alignedWithSegment =\n        Math.abs(startFragment.start - resumeTime) <\n          ALIGNED_END_THRESHOLD_SECONDS + allowance ||\n        Math.abs(startFragment.end - resumeTime) <\n          ALIGNED_END_THRESHOLD_SECONDS + allowance;\n      if (!alignedWithSegment) {\n        this.log(\n          `\"${interstitial.identifier}\" resumption ${resumeTime} not aligned with ${playlistType} fragment bounds (${startFragment.start}-${startFragment.end} sn: ${startFragment.sn} cc: ${startFragment.cc})`,\n        );\n        return true;\n      }\n      return false;\n    });\n  }\n\n  private updateAssetDurations(interstitial: InterstitialEvent) {\n    if (!interstitial.assetListLoaded) {\n      return;\n    }\n    const eventStart = interstitial.timelineStart;\n    let sumDuration = 0;\n    let hasUnknownDuration = false;\n    let hasErrors = false;\n    for (let i = 0; i < interstitial.assetList.length; i++) {\n      const asset = interstitial.assetList[i];\n      const timelineStart = eventStart + sumDuration;\n      asset.startOffset = sumDuration;\n      asset.timelineStart = timelineStart;\n      hasUnknownDuration ||= asset.duration === null;\n      hasErrors ||= !!asset.error;\n      const duration = asset.error ? 0 : (asset.duration as number) || 0;\n      sumDuration += duration;\n    }\n    // Use the sum of known durations when it is greater than the stated duration\n    if (hasUnknownDuration && !hasErrors) {\n      interstitial.duration = Math.max(sumDuration, interstitial.duration);\n    } else {\n      interstitial.duration = sumDuration;\n    }\n  }\n\n  private removeEvent(interstitial: InterstitialEvent) {\n    interstitial.reset();\n    delete this.eventMap[interstitial.identifier];\n  }\n}\n\nexport function segmentToString(segment: InterstitialScheduleItem): string {\n  return `[${segment.event ? '\"' + segment.event.identifier + '\"' : 'primary'}: ${segment.start.toFixed(2)}-${segment.end.toFixed(2)}]`;\n}\n", "import {\n  type AssetListJSON,\n  getInterstitialUrl,\n  type InterstitialEventWithAssetList,\n} from './interstitial-event';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport type { InterstitialEvent } from './interstitial-event';\nimport type Hls from '../hls';\nimport type { ErrorData } from '../types/events';\nimport type {\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderContext,\n  LoaderResponse,\n  LoaderStats,\n} from '../types/loader';\n\nexport class AssetListLoader {\n  private hls: Hls;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n  }\n\n  destroy() {\n    // @ts-ignore\n    this.hls = null;\n  }\n\n  loadAssetList(\n    interstitial: InterstitialEventWithAssetList,\n    hlsStartOffset: number | undefined,\n  ): Loader<LoaderContext> | undefined {\n    const assetListUrl = interstitial.assetListUrl;\n    let url: URL;\n    try {\n      url = getInterstitialUrl(\n        assetListUrl,\n        this.hls.sessionId,\n        interstitial.baseUrl,\n      );\n    } catch (error) {\n      const errorData = this.assignAssetListError(\n        interstitial,\n        ErrorDetails.ASSET_LIST_LOAD_ERROR,\n        error,\n        assetListUrl,\n      );\n      this.hls.trigger(Events.ERROR, errorData);\n      return;\n    }\n    if (hlsStartOffset && url.protocol !== 'data:') {\n      url.searchParams.set('_HLS_start_offset', '' + hlsStartOffset);\n    }\n    const config = this.hls.config;\n    const Loader = config.loader;\n    const loader = new Loader(config) as Loader<LoaderContext>;\n    const context: LoaderContext = {\n      responseType: 'json',\n      url: url.href,\n    };\n    const loadPolicy = config.interstitialAssetListLoadPolicy.default;\n    const loaderConfig: LoaderConfiguration = {\n      loadPolicy,\n      timeout: loadPolicy.maxLoadTimeMs,\n      maxRetry: 0,\n      retryDelay: 0,\n      maxRetryDelay: 0,\n    };\n    const callbacks: LoaderCallbacks<LoaderContext> = {\n      onSuccess: (\n        response: LoaderResponse,\n        stats: LoaderStats,\n        context: LoaderContext,\n        networkDetails: any,\n      ) => {\n        const assetListResponse = response.data as AssetListJSON;\n        const assets = assetListResponse?.ASSETS;\n        if (!Array.isArray(assets)) {\n          const errorData = this.assignAssetListError(\n            interstitial,\n            ErrorDetails.ASSET_LIST_PARSING_ERROR,\n            new Error(`Invalid interstitial asset list`),\n            context.url,\n            stats,\n            networkDetails,\n          );\n          this.hls.trigger(Events.ERROR, errorData);\n          return;\n        }\n        interstitial.assetListResponse = assetListResponse;\n        this.hls.trigger(Events.ASSET_LIST_LOADED, {\n          event: interstitial,\n          assetListResponse,\n          networkDetails,\n        });\n      },\n      onError: (\n        error: { code: number; text: string },\n        context: LoaderContext,\n        networkDetails: any,\n        stats: LoaderStats,\n      ) => {\n        const errorData = this.assignAssetListError(\n          interstitial,\n          ErrorDetails.ASSET_LIST_LOAD_ERROR,\n          new Error(\n            `Error loading X-ASSET-LIST: HTTP status ${error.code} ${error.text} (${context.url})`,\n          ),\n          context.url,\n          stats,\n          networkDetails,\n        );\n        this.hls.trigger(Events.ERROR, errorData);\n      },\n      onTimeout: (\n        stats: LoaderStats,\n        context: LoaderContext,\n        networkDetails: any,\n      ) => {\n        const errorData = this.assignAssetListError(\n          interstitial,\n          ErrorDetails.ASSET_LIST_LOAD_TIMEOUT,\n          new Error(`Timeout loading X-ASSET-LIST (${context.url})`),\n          context.url,\n          stats,\n          networkDetails,\n        );\n        this.hls.trigger(Events.ERROR, errorData);\n      },\n    };\n    loader.load(context, loaderConfig, callbacks);\n    this.hls.trigger(Events.ASSET_LIST_LOADING, {\n      event: interstitial,\n    });\n    return loader;\n  }\n\n  assignAssetListError(\n    interstitial: InterstitialEvent,\n    details: ErrorDetails,\n    error: Error,\n    url: string,\n    stats?: LoaderStats,\n    networkDetails?: any,\n  ): ErrorData {\n    interstitial.error = error;\n    return {\n      type: ErrorTypes.NETWORK_ERROR,\n      details,\n      fatal: false,\n      interstitial,\n      url,\n      error,\n      networkDetails,\n      stats,\n    };\n  }\n}\n", "import { createDoNothingErrorAction } from './error-controller';\nimport { HlsAssetPlayer } from './interstitial-player';\nimport {\n  type InterstitialScheduleEventItem,\n  type InterstitialScheduleItem,\n  type InterstitialSchedulePrimaryItem,\n  InterstitialsSchedule,\n  segmentToString,\n  type TimelineType,\n} from './interstitials-schedule';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { AssetListLoader } from '../loader/interstitial-asset-list';\nimport {\n  ALIGNED_END_THRESHOLD_SECONDS,\n  eventAssetToString,\n  generateAssetIdentifier,\n  getNextAssetIndex,\n  type InterstitialAssetId,\n  type InterstitialAssetItem,\n  type InterstitialEvent,\n  type InterstitialEventWithAssetList,\n  TimelineOccupancy,\n} from '../loader/interstitial-event';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport {\n  addEventListener,\n  removeEventListener,\n} from '../utils/event-listener-helper';\nimport { hash } from '../utils/hash';\nimport { Logger } from '../utils/logger';\nimport { isCompatibleTrackChange } from '../utils/mediasource-helper';\nimport { getBasicSelectionOption } from '../utils/rendition-helper';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type {\n  HlsAssetPlayerConfig,\n  InterstitialPlayer,\n} from './interstitial-player';\nimport type Hls from '../hls';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { SourceBufferName } from '../types/buffer';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  AssetListLoadedData,\n  AudioTrackSwitchingData,\n  AudioTrackUpdatedData,\n  BufferAppendedData,\n  BufferCodecsData,\n  BufferFlushedData,\n  ErrorData,\n  LevelUpdatedData,\n  MediaAttachedData,\n  MediaAttachingData,\n  MediaDetachingData,\n  SubtitleTrackSwitchData,\n  SubtitleTrackUpdatedData,\n} from '../types/events';\nimport type { MediaPlaylist, MediaSelection } from '../types/media-playlist';\n\nexport interface InterstitialsManager {\n  events: InterstitialEvent[];\n  schedule: InterstitialScheduleItem[];\n  interstitialPlayer: InterstitialPlayer | null;\n  playerQueue: HlsAssetPlayer[];\n  bufferingAsset: InterstitialAssetItem | null;\n  bufferingItem: InterstitialScheduleItem | null;\n  bufferingIndex: number;\n  playingAsset: InterstitialAssetItem | null;\n  playingItem: InterstitialScheduleItem | null;\n  playingIndex: number;\n  primary: PlayheadTimes;\n  integrated: PlayheadTimes;\n  skip: () => void;\n}\n\nexport type PlayheadTimes = {\n  bufferedEnd: number;\n  currentTime: number;\n  duration: number;\n  seekableStart: number;\n};\n\nfunction playWithCatch(media: HTMLMediaElement | null) {\n  (media?.play() as Promise<void> | undefined)?.catch(() => {\n    /* no-op */\n  });\n}\n\nfunction timelineMessage(label: string, time: number) {\n  return `[${label}] Advancing timeline position to ${time}`;\n}\n\nexport default class InterstitialsController\n  extends Logger\n  implements NetworkComponentAPI\n{\n  private readonly HlsPlayerClass: typeof Hls;\n  private readonly hls: Hls;\n  private readonly assetListLoader: AssetListLoader;\n\n  // Last updated LevelDetails\n  private mediaSelection: MediaSelection | null = null;\n  private altSelection: {\n    audio?: MediaPlaylist;\n    subtitles?: MediaPlaylist;\n  } | null = null;\n\n  // Media and MediaSource/SourceBuffers\n  private media: HTMLMediaElement | null = null;\n  private detachedData: MediaAttachingData | null = null;\n  private requiredTracks: Partial<BufferCodecsData> | null = null;\n\n  // Public Interface for Interstitial playback state and control\n  private manager: InterstitialsManager | null = null;\n\n  // Interstitial Asset Players\n  private playerQueue: HlsAssetPlayer[] = [];\n\n  // Timeline position tracking\n  private bufferedPos: number = -1;\n  private timelinePos: number = -1;\n\n  // Schedule\n  private schedule: InterstitialsSchedule | null;\n\n  // Schedule playback and buffering state\n  private playingItem: InterstitialScheduleItem | null = null;\n  private bufferingItem: InterstitialScheduleItem | null = null;\n  private waitingItem: InterstitialScheduleEventItem | null = null;\n  private endedItem: InterstitialScheduleItem | null = null;\n  private playingAsset: InterstitialAssetItem | null = null;\n  private endedAsset: InterstitialAssetItem | null = null;\n  private bufferingAsset: InterstitialAssetItem | null = null;\n  private shouldPlay: boolean = false;\n\n  constructor(hls: Hls, HlsPlayerClass: typeof Hls) {\n    super('interstitials', hls.logger);\n    this.hls = hls;\n    this.HlsPlayerClass = HlsPlayerClass;\n    this.assetListLoader = new AssetListLoader(hls);\n    this.schedule = new InterstitialsSchedule(\n      this.onScheduleUpdate,\n      hls.logger,\n    );\n    this.registerListeners();\n  }\n\n  private registerListeners() {\n    const hls = this.hls;\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    if (hls) {\n      hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n      hls.on(Events.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this);\n      hls.on(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n      hls.on(Events.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this);\n      hls.on(Events.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this);\n      hls.on(Events.ASSET_LIST_LOADED, this.onAssetListLoaded, this);\n      hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n      hls.on(Events.BUFFERED_TO_END, this.onBufferedToEnd, this);\n      hls.on(Events.MEDIA_ENDED, this.onMediaEnded, this);\n      hls.on(Events.ERROR, this.onError, this);\n      hls.on(Events.DESTROYING, this.onDestroying, this);\n    }\n  }\n\n  private unregisterListeners() {\n    const hls = this.hls;\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    if (hls) {\n      hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n      hls.off(Events.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this);\n      hls.off(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n      hls.off(Events.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this);\n      hls.off(Events.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this);\n      hls.off(Events.ASSET_LIST_LOADED, this.onAssetListLoaded, this);\n      hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n      hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n      hls.off(Events.BUFFERED_TO_END, this.onBufferedToEnd, this);\n      hls.off(Events.MEDIA_ENDED, this.onMediaEnded, this);\n      hls.off(Events.ERROR, this.onError, this);\n      hls.off(Events.DESTROYING, this.onDestroying, this);\n    }\n  }\n\n  startLoad() {\n    // TODO: startLoad - check for waitingItem and retry by resetting schedule\n    this.resumeBuffering();\n  }\n\n  stopLoad() {\n    // TODO: stopLoad - stop all scheule.events[].assetListLoader?.abort() then delete the loaders\n    this.pauseBuffering();\n  }\n\n  resumeBuffering() {\n    this.getBufferingPlayer()?.resumeBuffering();\n  }\n\n  pauseBuffering() {\n    this.getBufferingPlayer()?.pauseBuffering();\n  }\n\n  destroy() {\n    this.unregisterListeners();\n    this.stopLoad();\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    if (this.assetListLoader) {\n      this.assetListLoader.destroy();\n    }\n    this.emptyPlayerQueue();\n    this.clearScheduleState();\n    if (this.schedule) {\n      this.schedule.destroy();\n    }\n    this.media =\n      this.detachedData =\n      this.mediaSelection =\n      this.requiredTracks =\n      this.altSelection =\n      this.schedule =\n      this.manager =\n        null;\n    // @ts-ignore\n    this.hls = this.HlsPlayerClass = this.log = null;\n    // @ts-ignore\n    this.assetListLoader = null;\n    // @ts-ignore\n    this.onPlay = this.onPause = this.onSeeking = this.onTimeupdate = null;\n    // @ts-ignore\n    this.onScheduleUpdate = null;\n  }\n\n  private onDestroying() {\n    const media = this.primaryMedia || this.media;\n    if (media) {\n      this.removeMediaListeners(media);\n    }\n  }\n\n  private removeMediaListeners(media: HTMLMediaElement) {\n    removeEventListener(media, 'play', this.onPlay);\n    removeEventListener(media, 'pause', this.onPause);\n    removeEventListener(media, 'seeking', this.onSeeking);\n    removeEventListener(media, 'timeupdate', this.onTimeupdate);\n  }\n\n  private onMediaAttaching(\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ) {\n    const media = (this.media = data.media);\n    addEventListener(media, 'seeking', this.onSeeking);\n    addEventListener(media, 'timeupdate', this.onTimeupdate);\n    addEventListener(media, 'play', this.onPlay);\n    addEventListener(media, 'pause', this.onPause);\n  }\n\n  private onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) {\n    const playingItem = this.effectivePlayingItem;\n    const detachedMedia = this.detachedData;\n    this.detachedData = null;\n    if (playingItem === null) {\n      this.checkStart();\n    } else if (!detachedMedia) {\n      // Resume schedule after detached externally\n      this.clearScheduleState();\n      const playingIndex = this.findItemIndex(playingItem);\n      this.setSchedulePosition(playingIndex);\n    }\n  }\n\n  private clearScheduleState() {\n    this.log(`clear schedule state`);\n    this.playingItem =\n      this.bufferingItem =\n      this.waitingItem =\n      this.endedItem =\n      this.playingAsset =\n      this.endedAsset =\n      this.bufferingAsset =\n        null;\n  }\n\n  private onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    const transferringMedia = !!data.transferMedia;\n    const media = this.media;\n    this.media = null;\n    if (transferringMedia) {\n      return;\n    }\n    if (media) {\n      this.removeMediaListeners(media);\n    }\n    // If detachMedia is called while in an Interstitial, detach the asset player as well and reset the schedule position\n    if (this.detachedData) {\n      const player = this.getBufferingPlayer();\n      if (player) {\n        this.log(`Removing schedule state for detachedData and ${player}`);\n        this.playingAsset =\n          this.endedAsset =\n          this.bufferingAsset =\n          this.bufferingItem =\n          this.waitingItem =\n          this.detachedData =\n            null;\n        player.detachMedia();\n      }\n      this.shouldPlay = false;\n    }\n  }\n\n  public get interstitialsManager(): InterstitialsManager | null {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    if (!this.hls) {\n      return null;\n    }\n    if (this.manager) {\n      return this.manager;\n    }\n    const c = this;\n    const effectiveBufferingItem = () => c.bufferingItem || c.waitingItem;\n    const getAssetPlayer = (asset: InterstitialAssetItem | null) =>\n      asset ? c.getAssetPlayer(asset.identifier) : asset;\n    const getMappedTime = (\n      item: InterstitialScheduleItem | null,\n      timelineType: TimelineType,\n      asset: InterstitialAssetItem | null,\n      controllerField: 'bufferedPos' | 'timelinePos',\n      assetPlayerField: 'bufferedEnd' | 'currentTime',\n    ): number => {\n      if (item) {\n        let time = (\n          item[timelineType] as {\n            start: number;\n            end: number;\n          }\n        ).start;\n        const interstitial = item.event;\n        if (interstitial) {\n          if (\n            timelineType === 'playout' ||\n            interstitial.timelineOccupancy !== TimelineOccupancy.Point\n          ) {\n            const assetPlayer = getAssetPlayer(asset);\n            if (assetPlayer?.interstitial === interstitial) {\n              time +=\n                assetPlayer.assetItem.startOffset +\n                assetPlayer[assetPlayerField];\n            }\n          }\n        } else {\n          const value =\n            controllerField === 'bufferedPos'\n              ? getBufferedEnd()\n              : c[controllerField];\n          time += value - item.start;\n        }\n        return time;\n      }\n      return 0;\n    };\n    const findMappedTime = (\n      primaryTime: number,\n      timelineType: TimelineType,\n    ): number => {\n      if (\n        primaryTime !== 0 &&\n        timelineType !== 'primary' &&\n        c.schedule?.length\n      ) {\n        const index = c.schedule.findItemIndexAtTime(primaryTime);\n        const item = c.schedule.items?.[index];\n        if (item) {\n          const diff = item[timelineType].start - item.start;\n          return primaryTime + diff;\n        }\n      }\n      return primaryTime;\n    };\n    const getBufferedEnd = (): number => {\n      const value = c.bufferedPos;\n      if (value === Number.MAX_VALUE) {\n        return getMappedDuration('primary');\n      }\n      return Math.max(value, 0);\n    };\n    const getMappedDuration = (timelineType: TimelineType): number => {\n      if (c.primaryDetails?.live) {\n        // return end of last event item or playlist\n        return c.primaryDetails.edge;\n      }\n      return c.schedule?.durations[timelineType] || 0;\n    };\n    const seekTo = (time: number, timelineType: TimelineType) => {\n      const item = c.effectivePlayingItem;\n      if (item?.event?.restrictions.skip || !c.schedule) {\n        return;\n      }\n      c.log(`seek to ${time} \"${timelineType}\"`);\n      const playingItem = c.effectivePlayingItem;\n      const targetIndex = c.schedule.findItemIndexAtTime(time, timelineType);\n      const targetItem = c.schedule.items?.[targetIndex];\n      const bufferingPlayer = c.getBufferingPlayer();\n      const bufferingInterstitial = bufferingPlayer?.interstitial;\n      const appendInPlace = bufferingInterstitial?.appendInPlace;\n      const seekInItem = playingItem && c.itemsMatch(playingItem, targetItem);\n      if (playingItem && (appendInPlace || seekInItem)) {\n        // seek in asset player or primary media (appendInPlace)\n        const assetPlayer = getAssetPlayer(c.playingAsset);\n        const media = assetPlayer?.media || c.primaryMedia;\n        if (media) {\n          const currentTime =\n            timelineType === 'primary'\n              ? media.currentTime\n              : getMappedTime(\n                  playingItem,\n                  timelineType,\n                  c.playingAsset,\n                  'timelinePos',\n                  'currentTime',\n                );\n\n          const diff = time - currentTime;\n          const seekToTime =\n            (appendInPlace ? currentTime : media.currentTime) + diff;\n          if (\n            seekToTime >= 0 &&\n            (!assetPlayer ||\n              appendInPlace ||\n              seekToTime <= assetPlayer.duration)\n          ) {\n            media.currentTime = seekToTime;\n            return;\n          }\n        }\n      }\n      // seek out of item or asset\n      if (targetItem) {\n        let seekToTime = time;\n        if (timelineType !== 'primary') {\n          const primarySegmentStart = targetItem[timelineType].start;\n          const diff = time - primarySegmentStart;\n          seekToTime = targetItem.start + diff;\n        }\n        const targetIsPrimary = !c.isInterstitial(targetItem);\n        if (\n          (!c.isInterstitial(playingItem) || playingItem.event.appendInPlace) &&\n          (targetIsPrimary || targetItem.event.appendInPlace)\n        ) {\n          const media =\n            c.media || (appendInPlace ? bufferingPlayer?.media : null);\n          if (media) {\n            media.currentTime = seekToTime;\n          }\n        } else if (playingItem) {\n          // check if an Interstitial between the current item and target item has an X-RESTRICT JUMP restriction\n          const playingIndex = c.findItemIndex(playingItem);\n          if (targetIndex > playingIndex) {\n            const jumpIndex = c.schedule.findJumpRestrictedIndex(\n              playingIndex + 1,\n              targetIndex,\n            );\n            if (jumpIndex > playingIndex) {\n              c.setSchedulePosition(jumpIndex);\n              return;\n            }\n          }\n\n          let assetIndex = 0;\n          if (targetIsPrimary) {\n            c.timelinePos = seekToTime;\n            c.checkBuffer();\n          } else {\n            const assetList = targetItem.event.assetList;\n            const eventTime =\n              time - (targetItem[timelineType] || targetItem).start;\n            for (let i = assetList.length; i--; ) {\n              const asset = assetList[i];\n              if (\n                asset.duration &&\n                eventTime >= asset.startOffset &&\n                eventTime < asset.startOffset + asset.duration\n              ) {\n                assetIndex = i;\n                break;\n              }\n            }\n          }\n          c.setSchedulePosition(targetIndex, assetIndex);\n        }\n      }\n    };\n    const getActiveInterstitial = () => {\n      const playingItem = c.effectivePlayingItem;\n      if (c.isInterstitial(playingItem)) {\n        return playingItem;\n      }\n      const bufferingItem = effectiveBufferingItem();\n      if (c.isInterstitial(bufferingItem)) {\n        return bufferingItem;\n      }\n      return null;\n    };\n    const interstitialPlayer: InterstitialPlayer = {\n      get bufferedEnd() {\n        const interstitialItem = effectiveBufferingItem();\n        const bufferingItem = c.bufferingItem;\n        if (bufferingItem && bufferingItem === interstitialItem) {\n          return (\n            getMappedTime(\n              bufferingItem,\n              'playout',\n              c.bufferingAsset,\n              'bufferedPos',\n              'bufferedEnd',\n            ) - bufferingItem.playout.start ||\n            c.bufferingAsset?.startOffset ||\n            0\n          );\n        }\n        return 0;\n      },\n      get currentTime() {\n        const interstitialItem = getActiveInterstitial();\n        const playingItem = c.effectivePlayingItem;\n        if (playingItem && playingItem === interstitialItem) {\n          return (\n            getMappedTime(\n              playingItem,\n              'playout',\n              c.effectivePlayingAsset,\n              'timelinePos',\n              'currentTime',\n            ) - playingItem.playout.start\n          );\n        }\n        return 0;\n      },\n      set currentTime(time: number) {\n        const interstitialItem = getActiveInterstitial();\n        const playingItem = c.effectivePlayingItem;\n        if (playingItem && playingItem === interstitialItem) {\n          seekTo(time + playingItem.playout.start, 'playout');\n        }\n      },\n      get duration() {\n        const interstitialItem = getActiveInterstitial();\n        if (interstitialItem) {\n          return interstitialItem.playout.end - interstitialItem.playout.start;\n        }\n        return 0;\n      },\n      get assetPlayers() {\n        const assetList = getActiveInterstitial()?.event.assetList;\n        if (assetList) {\n          return assetList.map((asset) => c.getAssetPlayer(asset.identifier));\n        }\n        return [];\n      },\n      get playingIndex() {\n        const interstitial = getActiveInterstitial()?.event;\n        if (interstitial && c.effectivePlayingAsset) {\n          return interstitial.findAssetIndex(c.effectivePlayingAsset);\n        }\n        return -1;\n      },\n      get scheduleItem() {\n        return getActiveInterstitial();\n      },\n    };\n    return (this.manager = {\n      get events() {\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        return c.schedule?.events?.slice(0) || [];\n      },\n      get schedule() {\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        return c.schedule?.items?.slice(0) || [];\n      },\n      get interstitialPlayer() {\n        if (getActiveInterstitial()) {\n          return interstitialPlayer;\n        }\n        return null;\n      },\n      get playerQueue() {\n        return c.playerQueue.slice(0);\n      },\n      get bufferingAsset() {\n        return c.bufferingAsset;\n      },\n      get bufferingItem() {\n        return effectiveBufferingItem();\n      },\n      get bufferingIndex() {\n        const item = effectiveBufferingItem();\n        return c.findItemIndex(item);\n      },\n      get playingAsset() {\n        return c.effectivePlayingAsset;\n      },\n      get playingItem() {\n        return c.effectivePlayingItem;\n      },\n      get playingIndex() {\n        const item = c.effectivePlayingItem;\n        return c.findItemIndex(item);\n      },\n      primary: {\n        get bufferedEnd() {\n          return getBufferedEnd();\n        },\n        get currentTime() {\n          const timelinePos = c.timelinePos;\n          return timelinePos > 0 ? timelinePos : 0;\n        },\n        set currentTime(time: number) {\n          seekTo(time, 'primary');\n        },\n        get duration() {\n          return getMappedDuration('primary');\n        },\n        get seekableStart() {\n          return c.primaryDetails?.fragmentStart || 0;\n        },\n      },\n      integrated: {\n        get bufferedEnd() {\n          return getMappedTime(\n            effectiveBufferingItem(),\n            'integrated',\n            c.bufferingAsset,\n            'bufferedPos',\n            'bufferedEnd',\n          );\n        },\n        get currentTime() {\n          return getMappedTime(\n            c.effectivePlayingItem,\n            'integrated',\n            c.effectivePlayingAsset,\n            'timelinePos',\n            'currentTime',\n          );\n        },\n        set currentTime(time: number) {\n          seekTo(time, 'integrated');\n        },\n        get duration() {\n          return getMappedDuration('integrated');\n        },\n        get seekableStart() {\n          return findMappedTime(\n            c.primaryDetails?.fragmentStart || 0,\n            'integrated',\n          );\n        },\n      },\n      skip: () => {\n        const item = c.effectivePlayingItem;\n        const event = item?.event;\n        if (event && !event.restrictions.skip) {\n          const index = c.findItemIndex(item);\n          if (event.appendInPlace) {\n            const time = item.playout.start + item.event.duration;\n            seekTo(time + 0.001, 'playout');\n          } else {\n            c.advanceAfterAssetEnded(event, index, Infinity);\n          }\n        }\n      },\n    });\n  }\n\n  // Schedule getters\n  private get effectivePlayingItem(): InterstitialScheduleItem | null {\n    return this.waitingItem || this.playingItem || this.endedItem;\n  }\n\n  private get effectivePlayingAsset(): InterstitialAssetItem | null {\n    return this.playingAsset || this.endedAsset;\n  }\n\n  private get playingLastItem(): boolean {\n    const playingItem = this.playingItem;\n    const items = this.schedule?.items;\n    if (!this.playbackStarted || !playingItem || !items) {\n      return false;\n    }\n\n    return this.findItemIndex(playingItem) === items.length - 1;\n  }\n\n  private get playbackStarted(): boolean {\n    return this.effectivePlayingItem !== null;\n  }\n\n  // Media getters and event callbacks\n  private get currentTime(): number | undefined {\n    if (this.mediaSelection === null) {\n      // Do not advance before schedule is known\n      return undefined;\n    }\n    // Ignore currentTime when detached for Interstitial playback with source reset\n    const queuedForPlayback = this.waitingItem || this.playingItem;\n    if (\n      this.isInterstitial(queuedForPlayback) &&\n      !queuedForPlayback.event.appendInPlace\n    ) {\n      return undefined;\n    }\n    let media = this.media;\n    if (!media && this.bufferingItem?.event?.appendInPlace) {\n      // Observe detached media currentTime when appending in place\n      media = this.primaryMedia;\n    }\n    const currentTime = media?.currentTime;\n    if (currentTime === undefined || !Number.isFinite(currentTime)) {\n      return undefined;\n    }\n    return currentTime;\n  }\n\n  private get primaryMedia(): HTMLMediaElement | null {\n    return this.media || this.detachedData?.media || null;\n  }\n\n  private isInterstitial(\n    item: InterstitialScheduleItem | null | undefined,\n  ): item is InterstitialScheduleEventItem {\n    return !!item?.event;\n  }\n\n  private retreiveMediaSource(\n    assetId: InterstitialAssetId,\n    toSegment: InterstitialScheduleItem | null,\n  ) {\n    const player = this.getAssetPlayer(assetId);\n    if (player) {\n      this.transferMediaFromPlayer(player, toSegment);\n    }\n  }\n\n  private transferMediaFromPlayer(\n    player: HlsAssetPlayer,\n    toSegment: InterstitialScheduleItem | null | undefined,\n  ) {\n    const appendInPlace = player.interstitial.appendInPlace;\n    const playerMedia = player.media;\n    if (appendInPlace && playerMedia === this.primaryMedia) {\n      this.bufferingAsset = null;\n      if (\n        !toSegment ||\n        (this.isInterstitial(toSegment) && !toSegment.event.appendInPlace)\n      ) {\n        // MediaSource cannot be transfered back to an Interstitial that requires a source reset\n        // no-op when toSegment is undefined\n        if (toSegment && playerMedia) {\n          this.detachedData = { media: playerMedia };\n          return;\n        }\n      }\n      const attachMediaSourceData = player.transferMedia();\n      this.log(\n        `transfer MediaSource from ${player} ${stringify(attachMediaSourceData)}`,\n      );\n      this.detachedData = attachMediaSourceData;\n    } else if (toSegment && playerMedia) {\n      this.shouldPlay ||= !playerMedia.paused;\n    }\n  }\n\n  private transferMediaTo(\n    player: Hls | HlsAssetPlayer,\n    media: HTMLMediaElement,\n  ) {\n    if (player.media === media) {\n      return;\n    }\n    let attachMediaSourceData: MediaAttachingData | null = null;\n    const primaryPlayer = this.hls;\n    const isAssetPlayer = player !== primaryPlayer;\n    const appendInPlace =\n      isAssetPlayer && (player as HlsAssetPlayer).interstitial.appendInPlace;\n    const detachedMediaSource = this.detachedData?.mediaSource;\n\n    let logFromSource: string;\n    if (primaryPlayer.media) {\n      if (appendInPlace) {\n        attachMediaSourceData = primaryPlayer.transferMedia();\n        this.detachedData = attachMediaSourceData;\n      }\n      logFromSource = `Primary`;\n    } else if (detachedMediaSource) {\n      const bufferingPlayer = this.getBufferingPlayer();\n      if (bufferingPlayer) {\n        attachMediaSourceData = bufferingPlayer.transferMedia();\n        logFromSource = `${bufferingPlayer}`;\n      } else {\n        logFromSource = `detached MediaSource`;\n      }\n    } else {\n      logFromSource = `detached media`;\n    }\n    if (!attachMediaSourceData) {\n      if (detachedMediaSource) {\n        attachMediaSourceData = this.detachedData;\n        this.log(\n          `using detachedData: MediaSource ${stringify(attachMediaSourceData)}`,\n        );\n      } else if (!this.detachedData || primaryPlayer.media === media) {\n        // Keep interstitial media transition consistent\n        const playerQueue = this.playerQueue;\n        if (playerQueue.length > 1) {\n          playerQueue.forEach((queuedPlayer) => {\n            if (\n              isAssetPlayer &&\n              queuedPlayer.interstitial.appendInPlace !== appendInPlace\n            ) {\n              const interstitial = queuedPlayer.interstitial;\n              this.clearInterstitial(queuedPlayer.interstitial, null);\n              interstitial.appendInPlace = false; // setter may be a no-op;\n              // `appendInPlace` getter may still return `true` after insterstitial streaming has begun in that mode.\n              if (interstitial.appendInPlace as boolean) {\n                this.warn(\n                  `Could not change append strategy for queued assets ${interstitial}`,\n                );\n              }\n            }\n          });\n        }\n        this.hls.detachMedia();\n        this.detachedData = { media };\n      }\n    }\n    const transferring =\n      attachMediaSourceData &&\n      'mediaSource' in attachMediaSourceData &&\n      attachMediaSourceData.mediaSource?.readyState !== 'closed';\n    const dataToAttach =\n      transferring && attachMediaSourceData ? attachMediaSourceData : media;\n    this.log(\n      `${transferring ? 'transfering MediaSource' : 'attaching media'} to ${\n        isAssetPlayer ? player : 'Primary'\n      } from ${logFromSource} (media.currentTime: ${media.currentTime})`,\n    );\n    const schedule = this.schedule;\n    if (dataToAttach === attachMediaSourceData && schedule) {\n      const isAssetAtEndOfSchedule =\n        isAssetPlayer &&\n        (player as HlsAssetPlayer).assetId === schedule.assetIdAtEnd;\n      // Prevent asset players from marking EoS on transferred MediaSource\n      dataToAttach.overrides = {\n        duration: schedule.duration,\n        endOfStream: !isAssetPlayer || isAssetAtEndOfSchedule,\n        cueRemoval: !isAssetPlayer,\n      };\n    }\n    player.attachMedia(dataToAttach);\n  }\n\n  private onPlay = () => {\n    this.shouldPlay = true;\n  };\n\n  private onPause = () => {\n    this.shouldPlay = false;\n  };\n\n  private onSeeking = () => {\n    const currentTime = this.currentTime;\n    if (currentTime === undefined || this.playbackDisabled || !this.schedule) {\n      return;\n    }\n    const diff = currentTime - this.timelinePos;\n    const roundingError = Math.abs(diff) < 1 / 705600000; // one flick\n    if (roundingError) {\n      return;\n    }\n    const backwardSeek = diff <= -0.01;\n    if (this.timelinePos === -1 && !this.effectivePlayingItem) {\n      this.checkStart();\n    }\n    this.timelinePos = currentTime;\n    this.bufferedPos = currentTime;\n\n    // Check if seeking out of an item\n    const playingItem = this.playingItem;\n    if (!playingItem) {\n      this.checkBuffer();\n      return;\n    }\n    if (backwardSeek) {\n      const resetCount = this.schedule.resetErrorsInRange(\n        currentTime,\n        currentTime - diff,\n      );\n      if (resetCount) {\n        this.updateSchedule(true);\n      }\n    }\n    this.checkBuffer();\n    if (\n      (backwardSeek && currentTime < playingItem.start) ||\n      currentTime >= playingItem.end\n    ) {\n      const playingIndex = this.findItemIndex(playingItem);\n      let scheduleIndex = this.schedule.findItemIndexAtTime(currentTime);\n      if (scheduleIndex === -1) {\n        scheduleIndex = playingIndex + (backwardSeek ? -1 : 1);\n        this.log(\n          `seeked ${backwardSeek ? 'back ' : ''}to position not covered by schedule ${currentTime} (resolving from ${playingIndex} to ${scheduleIndex})`,\n        );\n      }\n      if (!this.isInterstitial(playingItem) && this.media?.paused) {\n        this.shouldPlay = false;\n      }\n      if (!backwardSeek) {\n        // check if an Interstitial between the current item and target item has an X-RESTRICT JUMP restriction\n        if (scheduleIndex > playingIndex) {\n          const jumpIndex = this.schedule.findJumpRestrictedIndex(\n            playingIndex + 1,\n            scheduleIndex,\n          );\n          if (jumpIndex > playingIndex) {\n            this.setSchedulePosition(jumpIndex);\n            return;\n          }\n        }\n      }\n      this.setSchedulePosition(scheduleIndex);\n      return;\n    }\n    // Check if seeking out of an asset (assumes same item following above check)\n    const playingAsset = this.playingAsset;\n    if (!playingAsset) {\n      // restart Interstitial at end\n      if (this.playingLastItem && this.isInterstitial(playingItem)) {\n        const restartAsset = playingItem.event.assetList[0];\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        if (restartAsset) {\n          this.endedItem = this.playingItem;\n          this.playingItem = null;\n          this.setScheduleToAssetAtTime(currentTime, restartAsset);\n        }\n      }\n      return;\n    }\n    const start = playingAsset.timelineStart;\n    const duration = playingAsset.duration || 0;\n    if (\n      (backwardSeek && currentTime < start) ||\n      currentTime >= start + duration\n    ) {\n      if (playingItem.event?.appendInPlace) {\n        // Return SourceBuffer(s) to primary player and flush\n        this.clearAssetPlayers(playingItem.event, playingItem);\n        this.flushFrontBuffer(currentTime);\n      }\n      this.setScheduleToAssetAtTime(currentTime, playingAsset);\n    }\n  };\n\n  private onInterstitialCueEnter() {\n    this.onTimeupdate();\n  }\n\n  private onTimeupdate = () => {\n    const currentTime = this.currentTime;\n    if (currentTime === undefined || this.playbackDisabled) {\n      return;\n    }\n\n    if (this.timelinePos === -1 && !this.effectivePlayingItem) {\n      this.checkStart();\n    }\n\n    // Only allow timeupdate to advance primary position, seeking is used for jumping back\n    // this prevents primaryPos from being reset to 0 after re-attach\n    if (currentTime > this.timelinePos) {\n      this.timelinePos = currentTime;\n      if (currentTime > this.bufferedPos) {\n        this.checkBuffer();\n      }\n    } else {\n      return;\n    }\n\n    // Check if playback has entered the next item\n    const playingItem = this.playingItem;\n    if (!playingItem || this.playingLastItem) {\n      return;\n    }\n    if (currentTime >= playingItem.end) {\n      this.timelinePos = playingItem.end;\n      const playingIndex = this.findItemIndex(playingItem);\n      this.setSchedulePosition(playingIndex + 1);\n    }\n    // Check if playback has entered the next asset\n    const playingAsset = this.playingAsset;\n    if (!playingAsset) {\n      return;\n    }\n    const end = playingAsset.timelineStart + (playingAsset.duration || 0);\n    if (currentTime >= end) {\n      this.setScheduleToAssetAtTime(currentTime, playingAsset);\n    }\n  };\n\n  // Scheduling methods\n  private checkStart() {\n    const schedule = this.schedule;\n    const interstitialEvents = schedule?.events;\n    if (!interstitialEvents || this.playbackDisabled || !this.media) {\n      return;\n    }\n    // Check buffered to pre-roll\n    if (this.bufferedPos === -1) {\n      this.bufferedPos = 0;\n    }\n    // Start stepping through schedule when playback begins for the first time and we have a pre-roll\n    const timelinePos = this.timelinePos;\n    const effectivePlayingItem = this.effectivePlayingItem;\n    if (timelinePos === -1) {\n      const startPosition = this.hls.startPosition;\n      this.timelinePos = startPosition;\n      if (interstitialEvents.length === 0) {\n        this.setSchedulePosition(0);\n      } else if (interstitialEvents[0].cue.pre) {\n        this.log(timelineMessage('checkStart (preroll)', startPosition));\n        const index = schedule.findEventIndex(interstitialEvents[0].identifier);\n        this.setSchedulePosition(index);\n      } else if (startPosition >= 0 || !this.primaryLive) {\n        this.log(timelineMessage('checkStart', startPosition));\n        const start = (this.timelinePos =\n          startPosition > 0 ? startPosition : 0);\n        const index = schedule.findItemIndexAtTime(start);\n        this.setSchedulePosition(index);\n      } else if (this.hls.liveSyncPosition === 0) {\n        this.setSchedulePosition(0);\n      } else {\n        this.log('[checkStart] waiting for live start');\n      }\n    } else if (effectivePlayingItem && !this.playingItem) {\n      this.log(\n        timelineMessage(\n          'checkStart (playing item)',\n          effectivePlayingItem.start,\n        ),\n      );\n      const index = schedule.findItemIndex(effectivePlayingItem);\n      this.setSchedulePosition(index);\n    }\n  }\n\n  private advanceAssetBuffering(\n    item: InterstitialScheduleEventItem,\n    assetItem: InterstitialAssetItem,\n  ) {\n    const interstitial = item.event;\n    const assetListIndex = interstitial.findAssetIndex(assetItem);\n    const nextAssetIndex = getNextAssetIndex(interstitial, assetListIndex);\n    if (!interstitial.isAssetPastPlayoutLimit(nextAssetIndex)) {\n      this.bufferedToEvent(item, nextAssetIndex);\n    } else if (this.schedule) {\n      const nextItem = this.schedule.items?.[this.findItemIndex(item) + 1];\n      if (nextItem) {\n        this.bufferedToItem(nextItem);\n      }\n    }\n  }\n\n  private advanceAfterAssetEnded(\n    interstitial: InterstitialEvent,\n    index: number,\n    assetListIndex: number,\n  ) {\n    const nextAssetIndex = getNextAssetIndex(interstitial, assetListIndex);\n    if (!interstitial.isAssetPastPlayoutLimit(nextAssetIndex)) {\n      // Advance to next asset list item\n      if (interstitial.appendInPlace) {\n        const assetItem = interstitial.assetList[nextAssetIndex] as\n          | InterstitialAssetItem\n          | undefined;\n        if (assetItem) {\n          this.advanceInPlace(assetItem.timelineStart);\n        }\n      }\n      this.setSchedulePosition(index, nextAssetIndex);\n    } else if (this.schedule) {\n      // Advance to next schedule segment\n      // check if we've reached the end of the program\n      const scheduleItems = this.schedule.items;\n      if (scheduleItems) {\n        const nextIndex = index + 1;\n        const scheduleLength = scheduleItems.length;\n        if (nextIndex >= scheduleLength) {\n          this.setSchedulePosition(-1);\n          return;\n        }\n        const resumptionTime = interstitial.resumeTime;\n        if (this.timelinePos < resumptionTime) {\n          this.log(timelineMessage('advanceAfterAssetEnded', resumptionTime));\n          this.timelinePos = resumptionTime;\n          if (interstitial.appendInPlace) {\n            this.advanceInPlace(resumptionTime);\n          }\n          this.checkBuffer(this.bufferedPos < resumptionTime);\n        }\n        this.setSchedulePosition(nextIndex);\n      }\n    }\n  }\n\n  private setScheduleToAssetAtTime(\n    time: number,\n    playingAsset: InterstitialAssetItem,\n  ) {\n    const schedule = this.schedule;\n    if (!schedule) {\n      return;\n    }\n    const parentIdentifier = playingAsset.parentIdentifier;\n    const interstitial = schedule.getEvent(parentIdentifier);\n    if (interstitial) {\n      const itemIndex = schedule.findEventIndex(parentIdentifier);\n      const assetListIndex = schedule.findAssetIndex(interstitial, time);\n      this.advanceAfterAssetEnded(interstitial, itemIndex, assetListIndex - 1);\n    }\n  }\n\n  private setSchedulePosition(index: number, assetListIndex?: number) {\n    const scheduleItems = this.schedule?.items;\n    if (!scheduleItems || this.playbackDisabled) {\n      return;\n    }\n    const scheduledItem = index >= 0 ? scheduleItems[index] : null;\n    this.log(\n      `setSchedulePosition ${index}, ${assetListIndex} (${scheduledItem ? segmentToString(scheduledItem) : scheduledItem}) pos: ${this.timelinePos}`,\n    );\n    // Cleanup current item / asset\n    const currentItem = this.waitingItem || this.playingItem;\n    const playingLastItem = this.playingLastItem;\n    if (this.isInterstitial(currentItem)) {\n      const interstitial = currentItem.event;\n      const playingAsset = this.playingAsset;\n      const assetId = playingAsset?.identifier;\n      const player = assetId ? this.getAssetPlayer(assetId) : null;\n      if (\n        player &&\n        assetId &&\n        (!this.eventItemsMatch(currentItem, scheduledItem) ||\n          (assetListIndex !== undefined &&\n            assetId !== interstitial.assetList[assetListIndex].identifier))\n      ) {\n        const playingAssetListIndex = interstitial.findAssetIndex(playingAsset);\n        this.log(\n          `INTERSTITIAL_ASSET_ENDED ${playingAssetListIndex + 1}/${interstitial.assetList.length} ${eventAssetToString(playingAsset)}`,\n        );\n        this.endedAsset = playingAsset;\n        this.playingAsset = null;\n        this.hls.trigger(Events.INTERSTITIAL_ASSET_ENDED, {\n          asset: playingAsset,\n          assetListIndex: playingAssetListIndex,\n          event: interstitial,\n          schedule: scheduleItems.slice(0),\n          scheduleIndex: index,\n          player,\n        });\n        if (currentItem !== this.playingItem) {\n          // Schedule change occured on INTERSTITIAL_ASSET_ENDED\n          if (\n            this.itemsMatch(currentItem, this.playingItem) &&\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n            !this.playingAsset // INTERSTITIAL_ASSET_ENDED side-effect\n          ) {\n            this.advanceAfterAssetEnded(\n              interstitial,\n              this.findItemIndex(this.playingItem),\n              playingAssetListIndex,\n            );\n          }\n          // Navigation occured on INTERSTITIAL_ASSET_ENDED\n          return;\n        }\n        this.retreiveMediaSource(assetId, scheduledItem);\n        if (player.media && !this.detachedData?.mediaSource) {\n          player.detachMedia();\n        }\n      }\n      if (!this.eventItemsMatch(currentItem, scheduledItem)) {\n        this.endedItem = currentItem;\n        this.playingItem = null;\n        this.log(\n          `INTERSTITIAL_ENDED ${interstitial} ${segmentToString(currentItem)}`,\n        );\n        interstitial.hasPlayed = true;\n        this.hls.trigger(Events.INTERSTITIAL_ENDED, {\n          event: interstitial,\n          schedule: scheduleItems.slice(0),\n          scheduleIndex: index,\n        });\n        // Exiting an Interstitial\n        if (interstitial.cue.once) {\n          // Remove interstitial with CUE attribute value of ONCE after it has played\n          this.updateSchedule();\n          const updatedScheduleItems = this.schedule?.items;\n          if (scheduledItem && updatedScheduleItems) {\n            const updatedIndex = this.findItemIndex(scheduledItem);\n            this.advanceSchedule(\n              updatedIndex,\n              updatedScheduleItems,\n              assetListIndex,\n              currentItem,\n              playingLastItem,\n            );\n          }\n          return;\n        }\n      }\n    }\n    this.advanceSchedule(\n      index,\n      scheduleItems,\n      assetListIndex,\n      currentItem,\n      playingLastItem,\n    );\n  }\n  private advanceSchedule(\n    index: number,\n    scheduleItems: InterstitialScheduleItem[],\n    assetListIndex: number | undefined,\n    currentItem: InterstitialScheduleItem | null,\n    playedLastItem: boolean,\n  ) {\n    const schedule = this.schedule;\n    if (!schedule) {\n      return;\n    }\n    const scheduledItem = scheduleItems[index] || null;\n    const media = this.primaryMedia;\n    // Cleanup out of range Interstitials\n    const playerQueue = this.playerQueue;\n    if (playerQueue.length) {\n      playerQueue.forEach((player) => {\n        const interstitial = player.interstitial;\n        const queuedIndex = schedule.findEventIndex(interstitial.identifier);\n        if (queuedIndex < index || queuedIndex > index + 1) {\n          this.clearInterstitial(interstitial, scheduledItem);\n        }\n      });\n    }\n    // Setup scheduled item\n    if (this.isInterstitial(scheduledItem)) {\n      this.timelinePos = Math.min(\n        Math.max(this.timelinePos, scheduledItem.start),\n        scheduledItem.end,\n      );\n      // Handle Interstitial\n      const interstitial = scheduledItem.event;\n      // find asset index\n      if (assetListIndex === undefined) {\n        assetListIndex = schedule.findAssetIndex(\n          interstitial,\n          this.timelinePos,\n        );\n        const assetIndexCandidate = getNextAssetIndex(\n          interstitial,\n          assetListIndex - 1,\n        );\n        if (\n          interstitial.isAssetPastPlayoutLimit(assetIndexCandidate) ||\n          (interstitial.appendInPlace && this.timelinePos === scheduledItem.end)\n        ) {\n          this.advanceAfterAssetEnded(interstitial, index, assetListIndex);\n          return;\n        }\n        assetListIndex = assetIndexCandidate;\n      }\n      // Ensure Interstitial is enqueued\n      const waitingItem = this.waitingItem;\n      if (!this.assetsBuffered(scheduledItem, media)) {\n        this.setBufferingItem(scheduledItem);\n      }\n      let player = this.preloadAssets(interstitial, assetListIndex);\n      if (!this.eventItemsMatch(scheduledItem, waitingItem || currentItem)) {\n        this.waitingItem = scheduledItem;\n        this.log(\n          `INTERSTITIAL_STARTED ${segmentToString(scheduledItem)} ${interstitial.appendInPlace ? 'append in place' : ''}`,\n        );\n        this.hls.trigger(Events.INTERSTITIAL_STARTED, {\n          event: interstitial,\n          schedule: scheduleItems.slice(0),\n          scheduleIndex: index,\n        });\n      }\n      if (!interstitial.assetListLoaded) {\n        // Waiting at end of primary content segment\n        // Expect setSchedulePosition to be called again once ASSET-LIST is loaded\n        this.log(`Waiting for ASSET-LIST to complete loading ${interstitial}`);\n        return;\n      }\n      if (interstitial.assetListLoader) {\n        interstitial.assetListLoader.destroy();\n        interstitial.assetListLoader = undefined;\n      }\n      if (!media) {\n        this.log(\n          `Waiting for attachMedia to start Interstitial ${interstitial}`,\n        );\n        return;\n      }\n      // Update schedule and asset list position now that it can start\n      this.waitingItem = this.endedItem = null;\n      this.playingItem = scheduledItem;\n\n      // If asset-list is empty or missing asset index, advance to next item\n      const assetItem = interstitial.assetList[assetListIndex] as\n        | InterstitialAssetItem\n        | undefined;\n      if (!assetItem) {\n        this.advanceAfterAssetEnded(interstitial, index, assetListIndex || 0);\n        return;\n      }\n\n      // Start Interstitial Playback\n      if (!player) {\n        player = this.getAssetPlayer(assetItem.identifier);\n      }\n      if (player === null || player.destroyed) {\n        const assetListLength = interstitial.assetList.length;\n        this.warn(\n          `asset ${\n            assetListIndex + 1\n          }/${assetListLength} player destroyed ${interstitial}`,\n        );\n        player = this.createAssetPlayer(\n          interstitial,\n          assetItem,\n          assetListIndex,\n        );\n        player.loadSource();\n      }\n      if (!this.eventItemsMatch(scheduledItem, this.bufferingItem)) {\n        if (interstitial.appendInPlace && this.isAssetBuffered(assetItem)) {\n          return;\n        }\n      }\n      this.startAssetPlayer(\n        player,\n        assetListIndex,\n        scheduleItems,\n        index,\n        media,\n      );\n      if (this.shouldPlay) {\n        playWithCatch(player.media);\n      }\n    } else if (scheduledItem) {\n      this.resumePrimary(scheduledItem, index, currentItem);\n      if (this.shouldPlay) {\n        playWithCatch(this.hls.media);\n      }\n    } else if (playedLastItem && this.isInterstitial(currentItem)) {\n      // Maintain playingItem state at end of schedule (setSchedulePosition(-1) called to end program)\n      // this allows onSeeking handler to update schedule position\n      this.endedItem = null;\n      this.playingItem = currentItem;\n      if (!currentItem.event.appendInPlace) {\n        // Media must be re-attached to resume primary schedule if not sharing source\n        this.attachPrimary(schedule.durations.primary, null);\n      }\n    }\n  }\n\n  private get playbackDisabled(): boolean {\n    return this.hls.config.enableInterstitialPlayback === false;\n  }\n\n  private get primaryDetails(): LevelDetails | undefined {\n    return this.mediaSelection?.main.details;\n  }\n\n  private get primaryLive(): boolean {\n    return !!this.primaryDetails?.live;\n  }\n\n  private resumePrimary(\n    scheduledItem: InterstitialSchedulePrimaryItem,\n    index: number,\n    fromItem: InterstitialScheduleItem | null,\n  ) {\n    this.playingItem = scheduledItem;\n    this.playingAsset = this.endedAsset = null;\n    this.waitingItem = this.endedItem = null;\n\n    this.bufferedToItem(scheduledItem);\n\n    this.log(`resuming ${segmentToString(scheduledItem)}`);\n\n    if (!this.detachedData?.mediaSource) {\n      let timelinePos = this.timelinePos;\n      if (\n        timelinePos < scheduledItem.start ||\n        timelinePos >= scheduledItem.end\n      ) {\n        timelinePos = this.getPrimaryResumption(scheduledItem, index);\n        this.log(timelineMessage('resumePrimary', timelinePos));\n        this.timelinePos = timelinePos;\n      }\n      this.attachPrimary(timelinePos, scheduledItem);\n    }\n\n    if (!fromItem) {\n      return;\n    }\n\n    const scheduleItems = this.schedule?.items;\n    if (!scheduleItems) {\n      return;\n    }\n    this.log(`INTERSTITIALS_PRIMARY_RESUMED ${segmentToString(scheduledItem)}`);\n    this.hls.trigger(Events.INTERSTITIALS_PRIMARY_RESUMED, {\n      schedule: scheduleItems.slice(0),\n      scheduleIndex: index,\n    });\n    this.checkBuffer();\n  }\n\n  private getPrimaryResumption(\n    scheduledItem: InterstitialSchedulePrimaryItem,\n    index: number,\n  ): number {\n    const itemStart = scheduledItem.start;\n    if (this.primaryLive) {\n      const details = this.primaryDetails;\n      if (index === 0) {\n        return this.hls.startPosition;\n      } else if (\n        details &&\n        (itemStart < details.fragmentStart || itemStart > details.edge)\n      ) {\n        return this.hls.liveSyncPosition || -1;\n      }\n    }\n    return itemStart;\n  }\n\n  private isAssetBuffered(asset: InterstitialAssetItem): boolean {\n    const player = this.getAssetPlayer(asset.identifier);\n    if (player?.hls) {\n      return player.hls.bufferedToEnd;\n    }\n    const bufferInfo = BufferHelper.bufferInfo(\n      this.primaryMedia,\n      this.timelinePos,\n      0,\n    );\n    return bufferInfo.end + 1 >= asset.timelineStart + (asset.duration || 0);\n  }\n\n  private attachPrimary(\n    timelinePos: number,\n    item: InterstitialSchedulePrimaryItem | null,\n    skipSeekToStartPosition?: boolean,\n  ) {\n    if (item) {\n      this.setBufferingItem(item);\n    } else {\n      this.bufferingItem = this.playingItem;\n    }\n    this.bufferingAsset = null;\n\n    const media = this.primaryMedia;\n    if (!media) {\n      return;\n    }\n    const hls = this.hls;\n    if (hls.media) {\n      this.checkBuffer();\n    } else {\n      this.transferMediaTo(hls, media);\n      if (skipSeekToStartPosition) {\n        this.startLoadingPrimaryAt(timelinePos, skipSeekToStartPosition);\n      }\n    }\n    if (!skipSeekToStartPosition) {\n      // Set primary position to resume time\n      this.log(timelineMessage('attachPrimary', timelinePos));\n      this.timelinePos = timelinePos;\n      this.startLoadingPrimaryAt(timelinePos, skipSeekToStartPosition);\n    }\n  }\n\n  private startLoadingPrimaryAt(\n    timelinePos: number,\n    skipSeekToStartPosition?: boolean,\n  ) {\n    const hls = this.hls;\n    if (\n      !hls.loadingEnabled ||\n      !hls.media ||\n      Math.abs(\n        (hls.mainForwardBufferInfo?.start || hls.media.currentTime) -\n          timelinePos,\n      ) > 0.5\n    ) {\n      hls.startLoad(timelinePos, skipSeekToStartPosition);\n    } else if (!hls.bufferingEnabled) {\n      hls.resumeBuffering();\n    }\n  }\n\n  // HLS.js event callbacks\n  private onManifestLoading() {\n    this.stopLoad();\n    this.schedule?.reset();\n    this.emptyPlayerQueue();\n    this.clearScheduleState();\n    this.shouldPlay = false;\n    this.bufferedPos = this.timelinePos = -1;\n    this.mediaSelection =\n      this.altSelection =\n      this.manager =\n      this.requiredTracks =\n        null;\n    // BUFFER_CODECS listener added here for buffer-controller to handle it first where it adds tracks\n    this.hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n    this.hls.on(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n  }\n\n  private onLevelUpdated(event: Events.LEVEL_UPDATED, data: LevelUpdatedData) {\n    if (data.level === -1 || !this.schedule) {\n      // level was removed\n      return;\n    }\n    const main = this.hls.levels[data.level];\n    if (!main.details) {\n      return;\n    }\n    const currentSelection = {\n      ...(this.mediaSelection || this.altSelection),\n      main,\n    };\n    this.mediaSelection = currentSelection;\n    this.schedule.parseInterstitialDateRanges(\n      currentSelection,\n      this.hls.config.interstitialAppendInPlace,\n    );\n\n    if (!this.effectivePlayingItem && this.schedule.items) {\n      this.checkStart();\n    }\n  }\n\n  private onAudioTrackUpdated(\n    event: Events.AUDIO_TRACK_UPDATED,\n    data: AudioTrackUpdatedData,\n  ) {\n    const audio = this.hls.audioTracks[data.id];\n    const previousSelection = this.mediaSelection;\n    if (!previousSelection) {\n      this.altSelection = { ...this.altSelection, audio };\n      return;\n    }\n    const currentSelection = { ...previousSelection, audio };\n    this.mediaSelection = currentSelection;\n  }\n\n  private onSubtitleTrackUpdated(\n    event: Events.SUBTITLE_TRACK_UPDATED,\n    data: SubtitleTrackUpdatedData,\n  ) {\n    const subtitles = this.hls.subtitleTracks[data.id];\n    const previousSelection = this.mediaSelection;\n    if (!previousSelection) {\n      this.altSelection = { ...this.altSelection, subtitles };\n      return;\n    }\n    const currentSelection = { ...previousSelection, subtitles };\n    this.mediaSelection = currentSelection;\n  }\n\n  private onAudioTrackSwitching(\n    event: Events.AUDIO_TRACK_SWITCHING,\n    data: AudioTrackSwitchingData,\n  ) {\n    const audioOption = getBasicSelectionOption(data);\n    this.playerQueue.forEach(\n      ({ hls }) =>\n        hls && (hls.setAudioOption(data) || hls.setAudioOption(audioOption)),\n    );\n  }\n\n  private onSubtitleTrackSwitch(\n    event: Events.SUBTITLE_TRACK_SWITCH,\n    data: SubtitleTrackSwitchData,\n  ) {\n    const subtitleOption = getBasicSelectionOption(data);\n    this.playerQueue.forEach(\n      ({ hls }) =>\n        hls &&\n        (hls.setSubtitleOption(data) ||\n          (data.id !== -1 && hls.setSubtitleOption(subtitleOption))),\n    );\n  }\n\n  private onBufferCodecs(event: Events.BUFFER_CODECS, data: BufferCodecsData) {\n    const requiredTracks = data.tracks;\n    if (requiredTracks) {\n      this.requiredTracks = requiredTracks;\n    }\n  }\n\n  private onBufferAppended(\n    event: Events.BUFFER_APPENDED,\n    data: BufferAppendedData,\n  ) {\n    this.checkBuffer();\n  }\n\n  private onBufferFlushed(\n    event: Events.BUFFER_FLUSHED,\n    data: BufferFlushedData,\n  ) {\n    const playingItem = this.playingItem;\n    if (\n      playingItem &&\n      !this.itemsMatch(playingItem, this.bufferingItem) &&\n      !this.isInterstitial(playingItem)\n    ) {\n      const timelinePos = this.timelinePos;\n      this.bufferedPos = timelinePos;\n      this.checkBuffer();\n    }\n  }\n\n  private onBufferedToEnd(event: Events.BUFFERED_TO_END) {\n    if (!this.schedule) {\n      return;\n    }\n    // Buffered to post-roll\n    const interstitialEvents = this.schedule.events;\n    if (this.bufferedPos < Number.MAX_VALUE && interstitialEvents) {\n      for (let i = 0; i < interstitialEvents.length; i++) {\n        const interstitial = interstitialEvents[i];\n        if (interstitial.cue.post) {\n          const scheduleIndex = this.schedule.findEventIndex(\n            interstitial.identifier,\n          );\n          const item = this.schedule.items?.[scheduleIndex];\n          if (\n            this.isInterstitial(item) &&\n            this.eventItemsMatch(item, this.bufferingItem)\n          ) {\n            this.bufferedToItem(item, 0);\n          }\n          break;\n        }\n      }\n      this.bufferedPos = Number.MAX_VALUE;\n    }\n  }\n\n  private onMediaEnded(event: Events.MEDIA_ENDED) {\n    const playingItem = this.playingItem;\n    if (!this.playingLastItem && playingItem) {\n      const playingIndex = this.findItemIndex(playingItem);\n      this.setSchedulePosition(playingIndex + 1);\n    } else {\n      this.shouldPlay = false;\n    }\n  }\n\n  // Schedule update callback\n  private onScheduleUpdate = (\n    removedInterstitials: InterstitialEvent[],\n    previousItems: InterstitialScheduleItem[] | null,\n  ) => {\n    const schedule = this.schedule;\n    if (!schedule) {\n      return;\n    }\n    const playingItem = this.playingItem;\n    const interstitialEvents = schedule.events || [];\n    const scheduleItems = schedule.items || [];\n    const durations = schedule.durations;\n    const removedIds = removedInterstitials.map(\n      (interstitial) => interstitial.identifier,\n    );\n    const interstitialsUpdated = !!(\n      interstitialEvents.length || removedIds.length\n    );\n    if (interstitialsUpdated || previousItems) {\n      this.log(\n        `INTERSTITIALS_UPDATED (${\n          interstitialEvents.length\n        }): ${interstitialEvents}\nSchedule: ${scheduleItems.map((seg) => segmentToString(seg))} pos: ${this.timelinePos}`,\n      );\n    }\n    if (removedIds.length) {\n      this.log(`Removed events ${removedIds}`);\n    }\n\n    // Update schedule item references\n    // Do not replace Interstitial playingItem without a match - used for INTERSTITIAL_ASSET_ENDED and INTERSTITIAL_ENDED\n    let updatedPlayingItem: InterstitialScheduleItem | null = null;\n    let updatedBufferingItem: InterstitialScheduleItem | null = null;\n    if (playingItem) {\n      updatedPlayingItem = this.updateItem(playingItem, this.timelinePos);\n      if (this.itemsMatch(playingItem, updatedPlayingItem)) {\n        this.playingItem = updatedPlayingItem;\n      } else {\n        this.waitingItem = this.endedItem = null;\n      }\n    }\n    // Clear waitingItem if it has been removed from the schedule\n    this.waitingItem = this.updateItem(this.waitingItem);\n    this.endedItem = this.updateItem(this.endedItem);\n    // Do not replace Interstitial bufferingItem without a match - used for transfering media element or source\n    const bufferingItem = this.bufferingItem;\n    if (bufferingItem) {\n      updatedBufferingItem = this.updateItem(bufferingItem, this.bufferedPos);\n      if (this.itemsMatch(bufferingItem, updatedBufferingItem)) {\n        this.bufferingItem = updatedBufferingItem;\n      } else if (bufferingItem.event) {\n        // Interstitial removed from schedule (Live -> VOD or other scenario where Start Date is outside the range of VOD Playlist)\n        this.bufferingItem = this.playingItem;\n        this.clearInterstitial(bufferingItem.event, null);\n      }\n    }\n\n    removedInterstitials.forEach((interstitial) => {\n      interstitial.assetList.forEach((asset) => {\n        this.clearAssetPlayer(asset.identifier, null);\n      });\n    });\n\n    this.playerQueue.forEach((player) => {\n      if (player.interstitial.appendInPlace) {\n        const timelineStart = player.assetItem.timelineStart;\n        const diff = player.timelineOffset - timelineStart;\n        if (diff) {\n          try {\n            player.timelineOffset = timelineStart;\n          } catch (e) {\n            if (Math.abs(diff) > ALIGNED_END_THRESHOLD_SECONDS) {\n              this.warn(\n                `${e} (\"${player.assetId}\" ${player.timelineOffset}->${timelineStart})`,\n              );\n            }\n          }\n        }\n      }\n    });\n\n    if (interstitialsUpdated || previousItems) {\n      this.hls.trigger(Events.INTERSTITIALS_UPDATED, {\n        events: interstitialEvents.slice(0),\n        schedule: scheduleItems.slice(0),\n        durations,\n        removedIds,\n      });\n\n      if (\n        this.isInterstitial(playingItem) &&\n        removedIds.includes(playingItem.event.identifier)\n      ) {\n        this.warn(\n          `Interstitial \"${playingItem.event.identifier}\" removed while playing`,\n        );\n        this.primaryFallback(playingItem.event);\n        return;\n      }\n\n      if (playingItem) {\n        this.trimInPlace(updatedPlayingItem, playingItem);\n      }\n      if (bufferingItem && updatedBufferingItem !== updatedPlayingItem) {\n        this.trimInPlace(updatedBufferingItem, bufferingItem);\n      }\n\n      // Check if buffered to new Interstitial event boundary\n      // (Live update publishes Interstitial with new segment)\n      this.checkBuffer();\n    }\n  };\n\n  private updateItem<T extends InterstitialScheduleItem>(\n    previousItem: T | null,\n    time?: number,\n  ): T | null {\n    // find item in this.schedule.items;\n    const items = this.schedule?.items;\n    if (previousItem && items) {\n      const index = this.findItemIndex(previousItem, time);\n      return (items[index] as T | undefined) || null;\n    }\n    return null;\n  }\n\n  private trimInPlace(\n    updatedItem: InterstitialScheduleItem | null,\n    itemBeforeUpdate: InterstitialScheduleItem,\n  ) {\n    if (\n      this.isInterstitial(updatedItem) &&\n      updatedItem.event.appendInPlace &&\n      itemBeforeUpdate.end - updatedItem.end > 0.25\n    ) {\n      updatedItem.event.assetList.forEach((asset, index) => {\n        if (updatedItem.event.isAssetPastPlayoutLimit(index)) {\n          this.clearAssetPlayer(asset.identifier, null);\n        }\n      });\n      const flushStart = updatedItem.end + 0.25;\n      const bufferInfo = BufferHelper.bufferInfo(\n        this.primaryMedia,\n        flushStart,\n        0,\n      );\n      if (\n        bufferInfo.end > flushStart ||\n        (bufferInfo.nextStart || 0) > flushStart\n      ) {\n        this.log(\n          `trim buffered interstitial ${segmentToString(updatedItem)} (was ${segmentToString(itemBeforeUpdate)})`,\n        );\n        const skipSeekToStartPosition = true;\n        this.attachPrimary(flushStart, null, skipSeekToStartPosition);\n        this.flushFrontBuffer(flushStart);\n      }\n    }\n  }\n\n  private itemsMatch(\n    a: InterstitialScheduleItem,\n    b: InterstitialScheduleItem | null | undefined,\n  ): boolean {\n    return (\n      !!b &&\n      (a === b ||\n        (a.event && b.event && this.eventItemsMatch(a, b)) ||\n        (!a.event &&\n          !b.event &&\n          this.findItemIndex(a) === this.findItemIndex(b)))\n    );\n  }\n\n  private eventItemsMatch(\n    a: InterstitialScheduleEventItem,\n    b: InterstitialScheduleItem | null | undefined,\n  ): boolean {\n    return !!b && (a === b || a.event.identifier === b.event?.identifier);\n  }\n\n  private findItemIndex(\n    item: InterstitialScheduleItem | null,\n    time?: number,\n  ): number {\n    return item && this.schedule ? this.schedule.findItemIndex(item, time) : -1;\n  }\n\n  private updateSchedule(forceUpdate: boolean = false) {\n    const mediaSelection = this.mediaSelection;\n    if (!mediaSelection) {\n      return;\n    }\n    this.schedule?.updateSchedule(mediaSelection, [], forceUpdate);\n  }\n\n  // Schedule buffer control\n  private checkBuffer(starved?: boolean) {\n    const items = this.schedule?.items;\n    if (!items) {\n      return;\n    }\n    // Find when combined forward buffer change reaches next schedule segment\n    const bufferInfo = BufferHelper.bufferInfo(\n      this.primaryMedia,\n      this.timelinePos,\n      0,\n    );\n    if (starved) {\n      this.bufferedPos = this.timelinePos;\n    }\n    starved ||= bufferInfo.len < 1;\n    this.updateBufferedPos(bufferInfo.end, items, starved);\n  }\n\n  private updateBufferedPos(\n    bufferEnd: number,\n    items: InterstitialScheduleItem[],\n    bufferIsEmpty?: boolean,\n  ) {\n    const schedule = this.schedule;\n    const bufferingItem = this.bufferingItem;\n    if (this.bufferedPos > bufferEnd || !schedule) {\n      return;\n    }\n    if (items.length === 1 && this.itemsMatch(items[0], bufferingItem)) {\n      this.bufferedPos = bufferEnd;\n      return;\n    }\n    const playingItem = this.playingItem;\n    const playingIndex = this.findItemIndex(playingItem);\n    let bufferEndIndex = schedule.findItemIndexAtTime(bufferEnd);\n\n    if (this.bufferedPos < bufferEnd) {\n      const bufferingIndex = this.findItemIndex(bufferingItem);\n      const nextToBufferIndex = Math.min(bufferingIndex + 1, items.length - 1);\n      const nextItemToBuffer = items[nextToBufferIndex];\n      if (\n        (bufferEndIndex === -1 &&\n          bufferingItem &&\n          bufferEnd >= bufferingItem.end) ||\n        (nextItemToBuffer.event?.appendInPlace &&\n          bufferEnd + 0.01 >= nextItemToBuffer.start)\n      ) {\n        bufferEndIndex = nextToBufferIndex;\n      }\n      if (this.isInterstitial(bufferingItem)) {\n        const interstitial = bufferingItem.event;\n        if (\n          nextToBufferIndex - playingIndex > 1 &&\n          interstitial.appendInPlace === false\n        ) {\n          // do not advance buffering item past Interstitial that requires source reset\n          return;\n        }\n        if (\n          interstitial.assetList.length === 0 &&\n          interstitial.assetListLoader\n        ) {\n          // do not advance buffering item past Interstitial loading asset-list\n          return;\n        }\n      }\n      this.bufferedPos = bufferEnd;\n      if (bufferEndIndex > bufferingIndex && bufferEndIndex > playingIndex) {\n        this.bufferedToItem(nextItemToBuffer);\n      } else {\n        // allow more time than distance from edge for assets to load\n        const details = this.primaryDetails;\n        if (\n          this.primaryLive &&\n          details &&\n          bufferEnd > details.edge - details.targetduration &&\n          nextItemToBuffer.start <\n            details.edge + this.hls.config.interstitialLiveLookAhead &&\n          this.isInterstitial(nextItemToBuffer)\n        ) {\n          this.preloadAssets(nextItemToBuffer.event, 0);\n        }\n      }\n    } else if (\n      bufferIsEmpty &&\n      playingItem &&\n      !this.itemsMatch(playingItem, bufferingItem)\n    ) {\n      if (bufferEndIndex === playingIndex) {\n        this.bufferedToItem(playingItem);\n      } else if (bufferEndIndex === playingIndex + 1) {\n        this.bufferedToItem(items[bufferEndIndex]);\n      }\n    }\n  }\n\n  private assetsBuffered(\n    item: InterstitialScheduleEventItem,\n    media: HTMLMediaElement | null,\n  ): boolean {\n    const assetList = item.event.assetList;\n    if (assetList.length === 0) {\n      return false;\n    }\n    return !item.event.assetList.some((asset) => {\n      const player = this.getAssetPlayer(asset.identifier);\n      return !player?.bufferedInPlaceToEnd(media);\n    });\n  }\n\n  private setBufferingItem(\n    item: InterstitialScheduleItem,\n  ): InterstitialScheduleItem | null {\n    const bufferingLast = this.bufferingItem;\n    const schedule = this.schedule;\n\n    if (!this.itemsMatch(item, bufferingLast) && schedule) {\n      const { items, events } = schedule;\n      if (!items || !events) {\n        return bufferingLast;\n      }\n      const isInterstitial = this.isInterstitial(item);\n      const bufferingPlayer = this.getBufferingPlayer();\n      this.bufferingItem = item;\n      this.bufferedPos = Math.max(\n        item.start,\n        Math.min(item.end, this.timelinePos),\n      );\n      const timeRemaining = bufferingPlayer\n        ? bufferingPlayer.remaining\n        : bufferingLast\n          ? bufferingLast.end - this.timelinePos\n          : 0;\n      this.log(\n        `INTERSTITIALS_BUFFERED_TO_BOUNDARY ${segmentToString(item)}` +\n          (bufferingLast ? ` (${timeRemaining.toFixed(2)} remaining)` : ''),\n      );\n      if (!this.playbackDisabled) {\n        if (isInterstitial) {\n          const bufferIndex = schedule.findAssetIndex(\n            item.event,\n            this.bufferedPos,\n          );\n          // primary fragment loading will exit early in base-stream-controller while `bufferingItem` is set to an Interstitial block\n          item.event.assetList.forEach((asset, i) => {\n            const player = this.getAssetPlayer(asset.identifier);\n            if (player) {\n              if (i === bufferIndex) {\n                player.loadSource();\n              }\n              player.resumeBuffering();\n            }\n          });\n        } else {\n          this.hls.resumeBuffering();\n          this.playerQueue.forEach((player) => player.pauseBuffering());\n        }\n      }\n      this.hls.trigger(Events.INTERSTITIALS_BUFFERED_TO_BOUNDARY, {\n        events: events.slice(0),\n        schedule: items.slice(0),\n        bufferingIndex: this.findItemIndex(item),\n        playingIndex: this.findItemIndex(this.playingItem),\n      });\n    } else if (this.bufferingItem !== item) {\n      this.bufferingItem = item;\n    }\n    return bufferingLast;\n  }\n\n  private bufferedToItem(\n    item: InterstitialScheduleItem,\n    assetListIndex: number = 0,\n  ) {\n    const bufferingLast = this.setBufferingItem(item);\n    if (this.playbackDisabled) {\n      return;\n    }\n    if (this.isInterstitial(item)) {\n      // Ensure asset list is loaded\n      this.bufferedToEvent(item, assetListIndex);\n    } else if (bufferingLast !== null) {\n      // If primary player is detached, it is also stopped, restart loading at primary position\n      this.bufferingAsset = null;\n      const detachedData = this.detachedData;\n      if (detachedData) {\n        if (detachedData.mediaSource) {\n          const skipSeekToStartPosition = true;\n          this.attachPrimary(item.start, item, skipSeekToStartPosition);\n        } else {\n          this.preloadPrimary(item);\n        }\n      } else {\n        // If not detached seek to resumption point\n        this.preloadPrimary(item);\n      }\n    }\n  }\n\n  private preloadPrimary(item: InterstitialSchedulePrimaryItem) {\n    const index = this.findItemIndex(item);\n    const timelinePos = this.getPrimaryResumption(item, index);\n    this.startLoadingPrimaryAt(timelinePos);\n  }\n\n  private bufferedToEvent(\n    item: InterstitialScheduleEventItem,\n    assetListIndex: number,\n  ) {\n    const interstitial = item.event;\n    const neverLoaded =\n      interstitial.assetList.length === 0 && !interstitial.assetListLoader;\n    const playOnce = interstitial.cue.once;\n    if (neverLoaded || !playOnce) {\n      // Buffered to Interstitial boundary\n      const player = this.preloadAssets(interstitial, assetListIndex);\n      if (player?.interstitial.appendInPlace) {\n        const media = this.primaryMedia;\n        if (media) {\n          this.bufferAssetPlayer(player, media);\n        }\n      }\n    }\n  }\n\n  private preloadAssets(\n    interstitial: InterstitialEvent,\n    assetListIndex: number,\n  ): HlsAssetPlayer | null {\n    const uri = interstitial.assetUrl;\n    const assetListLength = interstitial.assetList.length;\n    const neverLoaded = assetListLength === 0 && !interstitial.assetListLoader;\n    const playOnce = interstitial.cue.once;\n    if (neverLoaded) {\n      const timelineStart = interstitial.timelineStart;\n      if (interstitial.appendInPlace) {\n        const playingItem = this.playingItem;\n        if (\n          !this.isInterstitial(playingItem) &&\n          playingItem?.nextEvent?.identifier === interstitial.identifier\n        ) {\n          this.flushFrontBuffer(timelineStart + 0.25);\n        }\n      }\n      let hlsStartOffset;\n      let liveStartPosition = 0;\n      if (!this.playingItem && this.primaryLive) {\n        liveStartPosition = this.hls.startPosition;\n        if (liveStartPosition === -1) {\n          liveStartPosition = this.hls.liveSyncPosition || 0;\n        }\n      }\n      if (\n        liveStartPosition &&\n        !(interstitial.cue.pre || interstitial.cue.post)\n      ) {\n        const startOffset = liveStartPosition - timelineStart;\n        if (startOffset > 0) {\n          hlsStartOffset = Math.round(startOffset * 1000) / 1000;\n        }\n      }\n      this.log(\n        `Load interstitial asset ${assetListIndex + 1}/${uri ? 1 : assetListLength} ${interstitial}${\n          hlsStartOffset\n            ? ` live-start: ${liveStartPosition} start-offset: ${hlsStartOffset}`\n            : ''\n        }`,\n      );\n      if (uri) {\n        return this.createAsset(\n          interstitial,\n          0,\n          0,\n          timelineStart,\n          interstitial.duration,\n          uri,\n        );\n      }\n      const assetListLoader = this.assetListLoader.loadAssetList(\n        interstitial as InterstitialEventWithAssetList,\n        hlsStartOffset,\n      );\n      if (assetListLoader) {\n        interstitial.assetListLoader = assetListLoader;\n      }\n    } else if (!playOnce && assetListLength) {\n      // Re-buffered to Interstitial boundary, re-create asset player(s)\n      for (let i = assetListIndex; i < assetListLength; i++) {\n        const asset = interstitial.assetList[i];\n        const playerIndex = this.getAssetPlayerQueueIndex(asset.identifier);\n        if (\n          (playerIndex === -1 || this.playerQueue[playerIndex].destroyed) &&\n          !asset.error\n        ) {\n          this.createAssetPlayer(interstitial, asset, i);\n        }\n      }\n      const asset = interstitial.assetList[assetListIndex];\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      if (asset) {\n        const player = this.getAssetPlayer(asset.identifier);\n        if (player) {\n          player.loadSource();\n        }\n        return player;\n      }\n    }\n    return null;\n  }\n\n  private flushFrontBuffer(startOffset: number) {\n    // Force queued flushing of all buffers\n    const requiredTracks = this.requiredTracks;\n    if (!requiredTracks) {\n      return;\n    }\n    this.log(`Removing front buffer starting at ${startOffset}`);\n    const sourceBufferNames = Object.keys(requiredTracks);\n    sourceBufferNames.forEach((type: SourceBufferName) => {\n      this.hls.trigger(Events.BUFFER_FLUSHING, {\n        startOffset,\n        endOffset: Infinity,\n        type,\n      });\n    });\n  }\n\n  // Interstitial Asset Player control\n  private getAssetPlayerQueueIndex(assetId: InterstitialAssetId): number {\n    const playerQueue = this.playerQueue;\n    for (let i = 0; i < playerQueue.length; i++) {\n      if (assetId === playerQueue[i].assetId) {\n        return i;\n      }\n    }\n    return -1;\n  }\n\n  private getAssetPlayer(assetId: InterstitialAssetId): HlsAssetPlayer | null {\n    const index = this.getAssetPlayerQueueIndex(assetId);\n    return this.playerQueue[index] || null;\n  }\n\n  private getBufferingPlayer(): HlsAssetPlayer | null {\n    const { playerQueue, primaryMedia } = this;\n    if (primaryMedia) {\n      for (let i = 0; i < playerQueue.length; i++) {\n        if (playerQueue[i].media === primaryMedia) {\n          return playerQueue[i];\n        }\n      }\n    }\n    return null;\n  }\n\n  private createAsset(\n    interstitial: InterstitialEvent,\n    assetListIndex: number,\n    startOffset: number,\n    timelineStart: number,\n    duration: number,\n    uri: string,\n  ): HlsAssetPlayer {\n    const assetItem: InterstitialAssetItem = {\n      parentIdentifier: interstitial.identifier,\n      identifier: generateAssetIdentifier(interstitial, uri, assetListIndex),\n      duration,\n      startOffset,\n      timelineStart,\n      uri,\n    };\n    return this.createAssetPlayer(interstitial, assetItem, assetListIndex);\n  }\n\n  private createAssetPlayer(\n    interstitial: InterstitialEvent,\n    assetItem: InterstitialAssetItem,\n    assetListIndex: number,\n  ): HlsAssetPlayer {\n    const primary = this.hls;\n    const userConfig = primary.userConfig;\n    let videoPreference = userConfig.videoPreference;\n    const currentLevel =\n      primary.loadLevelObj || primary.levels[primary.currentLevel];\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n    if (videoPreference || currentLevel) {\n      videoPreference = Object.assign({}, videoPreference);\n      if (currentLevel.videoCodec) {\n        videoPreference.videoCodec = currentLevel.videoCodec;\n      }\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      if (currentLevel.videoRange) {\n        videoPreference.allowedVideoRanges = [currentLevel.videoRange];\n      }\n    }\n    const selectedAudio = primary.audioTracks[primary.audioTrack];\n    const selectedSubtitle = primary.subtitleTracks[primary.subtitleTrack];\n    let startPosition = 0;\n    if (this.primaryLive || interstitial.appendInPlace) {\n      const timePastStart = this.timelinePos - assetItem.timelineStart;\n      if (timePastStart > 1) {\n        const duration = assetItem.duration;\n        if (duration && timePastStart < duration) {\n          startPosition = timePastStart;\n        }\n      }\n    }\n    const assetId = assetItem.identifier;\n    const playerConfig: HlsAssetPlayerConfig = {\n      ...userConfig,\n      maxMaxBufferLength: Math.min(180, primary.config.maxMaxBufferLength),\n      autoStartLoad: true,\n      startFragPrefetch: true,\n      primarySessionId: primary.sessionId,\n      assetPlayerId: assetId,\n      abrEwmaDefaultEstimate: primary.bandwidthEstimate,\n      interstitialsController: undefined,\n      startPosition,\n      liveDurationInfinity: false,\n      testBandwidth: false,\n      videoPreference,\n      audioPreference:\n        (selectedAudio as MediaPlaylist | undefined) ||\n        userConfig.audioPreference,\n      subtitlePreference:\n        (selectedSubtitle as MediaPlaylist | undefined) ||\n        userConfig.subtitlePreference,\n    };\n    // TODO: limit maxMaxBufferLength in asset players to prevent QEE\n    if (interstitial.appendInPlace) {\n      interstitial.appendInPlaceStarted = true;\n      if (assetItem.timelineStart) {\n        playerConfig.timelineOffset = assetItem.timelineStart;\n      }\n    }\n    const cmcd = playerConfig.cmcd;\n    if (cmcd?.sessionId && cmcd.contentId) {\n      playerConfig.cmcd = Object.assign({}, cmcd, {\n        contentId: hash(assetItem.uri),\n      });\n    }\n    if (this.getAssetPlayer(assetId)) {\n      this.warn(\n        `Duplicate date range identifier ${interstitial} and asset ${assetId}`,\n      );\n    }\n    const player = new HlsAssetPlayer(\n      this.HlsPlayerClass,\n      playerConfig,\n      interstitial,\n      assetItem,\n    );\n    this.playerQueue.push(player);\n    interstitial.assetList[assetListIndex] = assetItem;\n    // Listen for LevelDetails and PTS change to update duration\n    let initialDuration = true;\n    const updateAssetPlayerDetails = (details: LevelDetails) => {\n      if (details.live) {\n        const error = new Error(\n          `Interstitials MUST be VOD assets ${interstitial}`,\n        );\n        const errorData: ErrorData = {\n          fatal: true,\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.INTERSTITIAL_ASSET_ITEM_ERROR,\n          error,\n        };\n        const scheduleIndex =\n          this.schedule?.findEventIndex(interstitial.identifier) || -1;\n        this.handleAssetItemError(\n          errorData,\n          interstitial,\n          scheduleIndex,\n          assetListIndex,\n          error.message,\n        );\n        return;\n      }\n      // Get time at end of last fragment\n      const duration = details.edge - details.fragmentStart;\n      const currentAssetDuration = assetItem.duration;\n      if (\n        initialDuration ||\n        currentAssetDuration === null ||\n        duration > currentAssetDuration\n      ) {\n        initialDuration = false;\n        this.log(\n          `Interstitial asset \"${assetId}\" duration change ${currentAssetDuration} > ${duration}`,\n        );\n        assetItem.duration = duration;\n        // Update schedule with new event and asset duration\n        this.updateSchedule();\n      }\n    };\n    player.on(Events.LEVEL_UPDATED, (event, { details }) =>\n      updateAssetPlayerDetails(details),\n    );\n    player.on(Events.LEVEL_PTS_UPDATED, (event, { details }) =>\n      updateAssetPlayerDetails(details),\n    );\n    player.on(Events.EVENT_CUE_ENTER, () => this.onInterstitialCueEnter());\n    const onBufferCodecs = (\n      event: Events.BUFFER_CODECS,\n      data: BufferCodecsData,\n    ) => {\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      if (inQueuPlayer && data.tracks) {\n        inQueuPlayer.off(Events.BUFFER_CODECS, onBufferCodecs);\n        inQueuPlayer.tracks = data.tracks;\n        const media = this.primaryMedia;\n        if (\n          this.bufferingAsset === inQueuPlayer.assetItem &&\n          media &&\n          !inQueuPlayer.media\n        ) {\n          this.bufferAssetPlayer(inQueuPlayer, media);\n        }\n      }\n    };\n    player.on(Events.BUFFER_CODECS, onBufferCodecs);\n    const bufferedToEnd = () => {\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      this.log(`buffered to end of asset ${inQueuPlayer}`);\n      if (!inQueuPlayer || !this.schedule) {\n        return;\n      }\n      // Preload at end of asset\n      const scheduleIndex = this.schedule.findEventIndex(\n        interstitial.identifier,\n      );\n      const item = this.schedule.items?.[scheduleIndex];\n      if (this.isInterstitial(item)) {\n        this.advanceAssetBuffering(item, assetItem);\n      }\n    };\n    player.on(Events.BUFFERED_TO_END, bufferedToEnd);\n    const endedWithAssetIndex = (assetIndex) => {\n      return () => {\n        const inQueuPlayer = this.getAssetPlayer(assetId);\n        if (!inQueuPlayer || !this.schedule) {\n          return;\n        }\n        this.shouldPlay = true;\n        const scheduleIndex = this.schedule.findEventIndex(\n          interstitial.identifier,\n        );\n        this.advanceAfterAssetEnded(interstitial, scheduleIndex, assetIndex);\n      };\n    };\n    player.once(Events.MEDIA_ENDED, endedWithAssetIndex(assetListIndex));\n    player.once(Events.PLAYOUT_LIMIT_REACHED, endedWithAssetIndex(Infinity));\n    player.on(Events.ERROR, (event: Events.ERROR, data: ErrorData) => {\n      if (!this.schedule) {\n        return;\n      }\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      if (data.details === ErrorDetails.BUFFER_STALLED_ERROR) {\n        if (inQueuPlayer?.appendInPlace) {\n          this.handleInPlaceStall(interstitial);\n          return;\n        }\n        this.onTimeupdate();\n        this.checkBuffer(true);\n        return;\n      }\n      this.handleAssetItemError(\n        data,\n        interstitial,\n        this.schedule.findEventIndex(interstitial.identifier),\n        assetListIndex,\n        `Asset player error ${data.error} ${interstitial}`,\n      );\n    });\n    player.on(Events.DESTROYING, () => {\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      if (!inQueuPlayer || !this.schedule) {\n        return;\n      }\n      const error = new Error(`Asset player destroyed unexpectedly ${assetId}`);\n      const errorData: ErrorData = {\n        fatal: true,\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.INTERSTITIAL_ASSET_ITEM_ERROR,\n        error,\n      };\n      this.handleAssetItemError(\n        errorData,\n        interstitial,\n        this.schedule.findEventIndex(interstitial.identifier),\n        assetListIndex,\n        error.message,\n      );\n    });\n    this.log(\n      `INTERSTITIAL_ASSET_PLAYER_CREATED ${eventAssetToString(assetItem)}`,\n    );\n    this.hls.trigger(Events.INTERSTITIAL_ASSET_PLAYER_CREATED, {\n      asset: assetItem,\n      assetListIndex,\n      event: interstitial,\n      player,\n    });\n    return player;\n  }\n\n  private clearInterstitial(\n    interstitial: InterstitialEvent,\n    toSegment: InterstitialScheduleItem | null,\n  ) {\n    this.clearAssetPlayers(interstitial, toSegment);\n    // Remove asset list and resolved duration\n    interstitial.reset();\n  }\n\n  private clearAssetPlayers(\n    interstitial: InterstitialEvent,\n    toSegment: InterstitialScheduleItem | null,\n  ) {\n    interstitial.assetList.forEach((asset) => {\n      this.clearAssetPlayer(asset.identifier, toSegment);\n    });\n  }\n\n  private resetAssetPlayer(assetId: InterstitialAssetId) {\n    // Reset asset player so that it's timeline can be adjusted without reloading the MVP\n    const playerIndex = this.getAssetPlayerQueueIndex(assetId);\n    if (playerIndex !== -1) {\n      this.log(`reset asset player \"${assetId}\" after error`);\n      const player = this.playerQueue[playerIndex];\n      this.transferMediaFromPlayer(player, null);\n      player.resetDetails();\n    }\n  }\n\n  private clearAssetPlayer(\n    assetId: InterstitialAssetId,\n    toSegment: InterstitialScheduleItem | null,\n  ) {\n    const playerIndex = this.getAssetPlayerQueueIndex(assetId);\n    if (playerIndex !== -1) {\n      const player = this.playerQueue[playerIndex];\n      this.log(\n        `clear ${player} toSegment: ${toSegment ? segmentToString(toSegment) : toSegment}`,\n      );\n      this.transferMediaFromPlayer(player, toSegment);\n      this.playerQueue.splice(playerIndex, 1);\n      player.destroy();\n    }\n  }\n\n  private emptyPlayerQueue() {\n    let player: HlsAssetPlayer | undefined;\n    while ((player = this.playerQueue.pop())) {\n      player.destroy();\n    }\n    this.playerQueue = [];\n  }\n\n  private startAssetPlayer(\n    player: HlsAssetPlayer,\n    assetListIndex: number,\n    scheduleItems: InterstitialScheduleItem[],\n    scheduleIndex: number,\n    media: HTMLMediaElement,\n  ) {\n    const { interstitial, assetItem, assetId } = player;\n    const assetListLength = interstitial.assetList.length;\n\n    const playingAsset = this.playingAsset;\n    this.endedAsset = null;\n    this.playingAsset = assetItem;\n    if (!playingAsset || playingAsset.identifier !== assetId) {\n      if (playingAsset) {\n        // Exiting another Interstitial asset\n        this.clearAssetPlayer(\n          playingAsset.identifier,\n          scheduleItems[scheduleIndex],\n        );\n        delete playingAsset.error;\n      }\n      this.log(\n        `INTERSTITIAL_ASSET_STARTED ${assetListIndex + 1}/${assetListLength} ${eventAssetToString(assetItem)}`,\n      );\n      this.hls.trigger(Events.INTERSTITIAL_ASSET_STARTED, {\n        asset: assetItem,\n        assetListIndex,\n        event: interstitial,\n        schedule: scheduleItems.slice(0),\n        scheduleIndex,\n        player,\n      });\n    }\n\n    // detach media and attach to interstitial player if it does not have another element attached\n    this.bufferAssetPlayer(player, media);\n  }\n\n  private bufferAssetPlayer(player: HlsAssetPlayer, media: HTMLMediaElement) {\n    if (!this.schedule) {\n      return;\n    }\n    const { interstitial, assetItem } = player;\n    const scheduleIndex = this.schedule.findEventIndex(interstitial.identifier);\n    const item = this.schedule.items?.[scheduleIndex];\n    if (!item) {\n      return;\n    }\n    player.loadSource();\n    this.setBufferingItem(item);\n    this.bufferingAsset = assetItem;\n    const bufferingPlayer = this.getBufferingPlayer();\n    if (bufferingPlayer === player) {\n      return;\n    }\n    const appendInPlaceNext = interstitial.appendInPlace;\n    if (\n      appendInPlaceNext &&\n      bufferingPlayer?.interstitial.appendInPlace === false\n    ) {\n      // Media is detached and not available to append in place\n      return;\n    }\n    const activeTracks =\n      bufferingPlayer?.tracks ||\n      this.detachedData?.tracks ||\n      this.requiredTracks;\n    if (appendInPlaceNext && assetItem !== this.playingAsset) {\n      // Do not buffer another item if tracks are unknown or incompatible\n      if (!player.tracks) {\n        this.log(`Waiting for track info before buffering ${player}`);\n        return;\n      }\n      if (\n        activeTracks &&\n        !isCompatibleTrackChange(activeTracks, player.tracks)\n      ) {\n        const error = new Error(\n          `Asset ${eventAssetToString(assetItem)} SourceBuffer tracks ('${Object.keys(player.tracks)}') are not compatible with primary content tracks ('${Object.keys(activeTracks)}')`,\n        );\n        const errorData: ErrorData = {\n          fatal: true,\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.INTERSTITIAL_ASSET_ITEM_ERROR,\n          error,\n        };\n        const assetListIndex = interstitial.findAssetIndex(assetItem);\n        this.handleAssetItemError(\n          errorData,\n          interstitial,\n          scheduleIndex,\n          assetListIndex,\n          error.message,\n        );\n        return;\n      }\n    }\n\n    this.transferMediaTo(player, media);\n  }\n\n  private handleInPlaceStall(interstitial: InterstitialEvent) {\n    const schedule = this.schedule;\n    const media = this.primaryMedia;\n    if (!schedule || !media) {\n      return;\n    }\n    const currentTime = media.currentTime;\n    const foundAssetIndex = schedule.findAssetIndex(interstitial, currentTime);\n    const stallingAsset = interstitial.assetList[foundAssetIndex] as\n      | InterstitialAssetItem\n      | undefined;\n    if (stallingAsset) {\n      const player = this.getAssetPlayer(stallingAsset.identifier);\n      if (player) {\n        const assetCurrentTime =\n          player.currentTime || currentTime - stallingAsset.timelineStart;\n        const distanceFromEnd = player.duration - assetCurrentTime;\n        this.warn(\n          `Stalled at ${assetCurrentTime} of ${assetCurrentTime + distanceFromEnd} in ${player} ${interstitial} (media.currentTime: ${currentTime})`,\n        );\n        if (\n          assetCurrentTime &&\n          (distanceFromEnd / media.playbackRate < 0.5 ||\n            player.bufferedInPlaceToEnd(media)) &&\n          player.hls\n        ) {\n          const scheduleIndex = schedule.findEventIndex(\n            interstitial.identifier,\n          );\n          this.advanceAfterAssetEnded(\n            interstitial,\n            scheduleIndex,\n            foundAssetIndex,\n          );\n        }\n      }\n    }\n  }\n\n  private advanceInPlace(time: number) {\n    const media = this.primaryMedia;\n    if (media && media.currentTime < time) {\n      media.currentTime = time;\n    }\n  }\n\n  private handleAssetItemError(\n    data: ErrorData,\n    interstitial: InterstitialEvent,\n    scheduleIndex: number,\n    assetListIndex: number,\n    errorMessage: string,\n  ) {\n    if (data.details === ErrorDetails.BUFFER_STALLED_ERROR) {\n      return;\n    }\n    const assetItem = (interstitial.assetList[assetListIndex] ||\n      null) as InterstitialAssetItem | null;\n    this.warn(\n      `INTERSTITIAL_ASSET_ERROR ${assetItem ? eventAssetToString(assetItem) : assetItem} ${data.error}`,\n    );\n    if (!this.schedule) {\n      return;\n    }\n    const assetId = assetItem?.identifier || '';\n    const playerIndex = this.getAssetPlayerQueueIndex(assetId);\n    const player = this.playerQueue[playerIndex] || null;\n    const items = this.schedule.items;\n    const interstitialAssetError = Object.assign({}, data, {\n      fatal: false,\n      errorAction: createDoNothingErrorAction(true),\n      asset: assetItem,\n      assetListIndex,\n      event: interstitial,\n      schedule: items,\n      scheduleIndex,\n      player,\n    });\n    this.hls.trigger(Events.INTERSTITIAL_ASSET_ERROR, interstitialAssetError);\n    if (!data.fatal) {\n      return;\n    }\n\n    const playingAsset = this.playingAsset;\n    const bufferingAsset = this.bufferingAsset;\n    const error = new Error(errorMessage);\n    if (assetItem) {\n      this.clearAssetPlayer(assetId, null);\n      assetItem.error = error;\n    }\n\n    // If all assets in interstitial fail, mark the interstitial with an error\n    if (!interstitial.assetList.some((asset) => !asset.error)) {\n      interstitial.error = error;\n    } else {\n      // Reset level details and reload/parse media playlists to align with updated schedule\n      for (let i = assetListIndex; i < interstitial.assetList.length; i++) {\n        this.resetAssetPlayer(interstitial.assetList[i].identifier);\n      }\n    }\n    this.updateSchedule(true);\n    if (interstitial.error) {\n      this.primaryFallback(interstitial);\n    } else if (playingAsset && playingAsset.identifier === assetId) {\n      this.advanceAfterAssetEnded(interstitial, scheduleIndex, assetListIndex);\n    } else if (\n      bufferingAsset &&\n      bufferingAsset.identifier === assetId &&\n      this.isInterstitial(this.bufferingItem)\n    ) {\n      this.advanceAssetBuffering(this.bufferingItem, bufferingAsset);\n    }\n  }\n\n  private primaryFallback(interstitial: InterstitialEvent) {\n    // Fallback to Primary by on current or future events by updating schedule to skip errored interstitials/assets\n    const flushStart = interstitial.timelineStart;\n    const playingItem = this.effectivePlayingItem;\n    let timelinePos = this.timelinePos;\n    // Update schedule now that interstitial/assets are flagged with `error` for fallback\n    if (playingItem) {\n      this.log(\n        `Fallback to primary from event \"${interstitial.identifier}\" start: ${\n          flushStart\n        } pos: ${timelinePos} playing: ${segmentToString(\n          playingItem,\n        )} error: ${interstitial.error}`,\n      );\n      if (timelinePos === -1) {\n        timelinePos = this.hls.startPosition;\n      }\n      const newPlayingItem = this.updateItem(playingItem, timelinePos);\n      if (this.itemsMatch(playingItem, newPlayingItem)) {\n        this.clearInterstitial(interstitial, null);\n      }\n      if (interstitial.appendInPlace) {\n        this.attachPrimary(flushStart, null);\n        this.flushFrontBuffer(flushStart);\n      }\n    } else if (timelinePos === -1) {\n      this.checkStart();\n      return;\n    }\n    if (!this.schedule) {\n      return;\n    }\n    const scheduleIndex = this.schedule.findItemIndexAtTime(timelinePos);\n    this.setSchedulePosition(scheduleIndex);\n  }\n\n  // Asset List loading\n  private onAssetListLoaded(\n    event: Events.ASSET_LIST_LOADED,\n    data: AssetListLoadedData,\n  ) {\n    const interstitial = data.event;\n    const interstitialId = interstitial.identifier;\n    const assets = data.assetListResponse.ASSETS;\n    if (!this.schedule?.hasEvent(interstitialId)) {\n      // Interstitial with id was removed\n      return;\n    }\n    const eventStart = interstitial.timelineStart;\n    const previousDuration = interstitial.duration;\n    let sumDuration = 0;\n    assets.forEach((asset, assetListIndex) => {\n      const duration = parseFloat(asset.DURATION);\n      this.createAsset(\n        interstitial,\n        assetListIndex,\n        sumDuration,\n        eventStart + sumDuration,\n        duration,\n        asset.URI,\n      );\n      sumDuration += duration;\n    });\n    interstitial.duration = sumDuration;\n    this.log(\n      `Loaded asset-list with duration: ${sumDuration} (was: ${previousDuration}) ${interstitial}`,\n    );\n    const waitingItem = this.waitingItem;\n    const waitingForItem = waitingItem?.event.identifier === interstitialId;\n\n    // Update schedule now that asset.DURATION(s) are parsed\n    this.updateSchedule();\n\n    const bufferingEvent = this.bufferingItem?.event;\n\n    // If buffer reached Interstitial, start buffering first asset\n    if (waitingForItem) {\n      // Advance schedule when waiting for asset list data to play\n      const scheduleIndex = this.schedule.findEventIndex(interstitialId);\n      const item = this.schedule.items?.[scheduleIndex];\n      if (item) {\n        if (!this.playingItem && this.timelinePos > item.end) {\n          // Abandon if new duration is reduced enough to land playback in primary start\n          const index = this.schedule.findItemIndexAtTime(this.timelinePos);\n          if (index !== scheduleIndex) {\n            interstitial.error = new Error(\n              `Interstitial ${assets.length ? 'no longer within playback range' : 'asset-list is empty'} ${this.timelinePos} ${interstitial}`,\n            );\n            this.log(interstitial.error.message);\n            this.updateSchedule(true);\n            this.primaryFallback(interstitial);\n            return;\n          }\n        }\n        this.setBufferingItem(item);\n      }\n      this.setSchedulePosition(scheduleIndex);\n    } else if (bufferingEvent?.identifier === interstitialId) {\n      const assetItem = interstitial.assetList[0];\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      if (assetItem) {\n        const player = this.getAssetPlayer(assetItem.identifier);\n        if (bufferingEvent.appendInPlace) {\n          // If buffering (but not playback) has reached this item transfer media-source\n          const media = this.primaryMedia;\n          if (player && media) {\n            this.bufferAssetPlayer(player, media);\n          }\n        } else if (player) {\n          player.loadSource();\n        }\n      }\n    }\n  }\n\n  private onError(event: Events.ERROR, data: ErrorData) {\n    if (!this.schedule) {\n      return;\n    }\n    switch (data.details) {\n      case ErrorDetails.ASSET_LIST_PARSING_ERROR:\n      case ErrorDetails.ASSET_LIST_LOAD_ERROR:\n      case ErrorDetails.ASSET_LIST_LOAD_TIMEOUT: {\n        const interstitial = data.interstitial;\n        if (interstitial) {\n          this.updateSchedule(true);\n          this.primaryFallback(interstitial);\n        }\n        break;\n      }\n      case ErrorDetails.BUFFER_STALLED_ERROR: {\n        const stallingItem =\n          this.endedItem || this.waitingItem || this.playingItem;\n        if (\n          this.isInterstitial(stallingItem) &&\n          stallingItem.event.appendInPlace\n        ) {\n          this.handleInPlaceStall(stallingItem.event);\n          return;\n        }\n        this.log(\n          `Primary player stall @${this.timelinePos} bufferedPos: ${this.bufferedPos}`,\n        );\n        this.onTimeupdate();\n        this.checkBuffer(true);\n        break;\n      }\n    }\n  }\n}\n", "import BaseStreamController, { State } from './base-stream-controller';\nimport { findFragmentByPTS } from './fragment-finders';\nimport { FragmentState } from './fragment-tracker';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport {\n  type Fragment,\n  isMediaFragment,\n  type MediaFragment,\n} from '../loader/fragment';\nimport { Level } from '../types/level';\nimport { PlaylistLevelType } from '../types/loader';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport { alignMediaPlaylistByPDT } from '../utils/discontinuities';\nimport {\n  getAesModeFromFullSegmentMethod,\n  isFullSegmentEncryption,\n} from '../utils/encryption-methods-util';\nimport { addSliding } from '../utils/level-helper';\nimport { subtitleOptionsIdentical } from '../utils/media-option-attributes';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type Hls from '../hls';\nimport type KeyLoader from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  BufferFlushingData,\n  ErrorData,\n  FragLoadedData,\n  LevelLoadedData,\n  MediaDetachingData,\n  SubtitleFragProcessed,\n  SubtitleTracksUpdatedData,\n  TrackLoadedData,\n  TrackSwitchedData,\n} from '../types/events';\nimport type { Bufferable } from '../utils/buffer-helper';\n\nconst TICK_INTERVAL = 500; // how often to tick in ms\n\ninterface TimeRange {\n  start: number;\n  end: number;\n}\n\nexport class SubtitleStreamController\n  extends BaseStreamController\n  implements NetworkComponentAPI\n{\n  private currentTrackId: number = -1;\n  private tracksBuffered: Array<TimeRange[]> = [];\n  private mainDetails: LevelDetails | null = null;\n\n  constructor(\n    hls: Hls,\n    fragmentTracker: FragmentTracker,\n    keyLoader: KeyLoader,\n  ) {\n    super(\n      hls,\n      fragmentTracker,\n      keyLoader,\n      'subtitle-stream-controller',\n      PlaylistLevelType.SUBTITLE,\n    );\n    this.registerListeners();\n  }\n\n  protected onHandlerDestroying() {\n    this.unregisterListeners();\n    super.onHandlerDestroying();\n    this.mainDetails = null;\n  }\n\n  protected registerListeners() {\n    super.registerListeners();\n    const { hls } = this;\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n    hls.on(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n    hls.on(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n    hls.on(Events.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this);\n    hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n\n  protected unregisterListeners() {\n    super.unregisterListeners();\n    const { hls } = this;\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n    hls.off(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n    hls.off(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n    hls.off(Events.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this);\n    hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n\n  startLoad(startPosition: number, skipSeekToStartPosition?: boolean) {\n    this.stopLoad();\n    this.state = State.IDLE;\n\n    this.setInterval(TICK_INTERVAL);\n\n    this.nextLoadPosition = this.lastCurrentTime =\n      startPosition + this.timelineOffset;\n    this.startPosition = skipSeekToStartPosition ? -1 : startPosition;\n\n    this.tick();\n  }\n\n  protected onManifestLoading() {\n    super.onManifestLoading();\n    this.mainDetails = null;\n  }\n\n  protected onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    this.tracksBuffered = [];\n    super.onMediaDetaching(event, data);\n  }\n\n  private onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n    this.mainDetails = data.details;\n  }\n\n  private onSubtitleFragProcessed(\n    event: Events.SUBTITLE_FRAG_PROCESSED,\n    data: SubtitleFragProcessed,\n  ) {\n    const { frag, success } = data;\n    if (!this.fragContextChanged(frag)) {\n      if (isMediaFragment(frag)) {\n        this.fragPrevious = frag;\n      }\n      this.state = State.IDLE;\n    }\n    if (!success) {\n      return;\n    }\n\n    const buffered = this.tracksBuffered[this.currentTrackId];\n    if (!buffered) {\n      return;\n    }\n\n    // Create/update a buffered array matching the interface used by BufferHelper.bufferedInfo\n    // so we can re-use the logic used to detect how much has been buffered\n    let timeRange: TimeRange | undefined;\n    const fragStart = frag.start;\n    for (let i = 0; i < buffered.length; i++) {\n      if (fragStart >= buffered[i].start && fragStart <= buffered[i].end) {\n        timeRange = buffered[i];\n        break;\n      }\n    }\n\n    const fragEnd = frag.start + frag.duration;\n    if (timeRange) {\n      timeRange.end = fragEnd;\n    } else {\n      timeRange = {\n        start: fragStart,\n        end: fragEnd,\n      };\n      buffered.push(timeRange);\n    }\n    this.fragmentTracker.fragBuffered(frag as MediaFragment);\n    this.fragBufferedComplete(frag, null);\n    if (this.media) {\n      this.tick();\n    }\n  }\n\n  private onBufferFlushing(\n    event: Events.BUFFER_FLUSHING,\n    data: BufferFlushingData,\n  ) {\n    const { startOffset, endOffset } = data;\n    if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {\n      const endOffsetSubtitles = endOffset - 1;\n      if (endOffsetSubtitles <= 0) {\n        return;\n      }\n      data.endOffsetSubtitles = Math.max(0, endOffsetSubtitles);\n      this.tracksBuffered.forEach((buffered) => {\n        for (let i = 0; i < buffered.length; ) {\n          if (buffered[i].end <= endOffsetSubtitles) {\n            buffered.shift();\n            continue;\n          } else if (buffered[i].start < endOffsetSubtitles) {\n            buffered[i].start = endOffsetSubtitles;\n          } else {\n            break;\n          }\n          i++;\n        }\n      });\n      this.fragmentTracker.removeFragmentsInRange(\n        startOffset,\n        endOffsetSubtitles,\n        PlaylistLevelType.SUBTITLE,\n      );\n    }\n  }\n\n  // If something goes wrong, proceed to next frag, if we were processing one.\n  protected onError(event: Events.ERROR, data: ErrorData) {\n    const frag = data.frag;\n\n    if (frag?.type === PlaylistLevelType.SUBTITLE) {\n      if (data.details === ErrorDetails.FRAG_GAP) {\n        this.fragmentTracker.fragBuffered(frag as MediaFragment, true);\n      }\n      if (this.fragCurrent) {\n        this.fragCurrent.abortRequests();\n      }\n      if (this.state !== State.STOPPED) {\n        this.state = State.IDLE;\n      }\n    }\n  }\n\n  // Got all new subtitle levels.\n  private onSubtitleTracksUpdated(\n    event: Events.SUBTITLE_TRACKS_UPDATED,\n    { subtitleTracks }: SubtitleTracksUpdatedData,\n  ) {\n    if (this.levels && subtitleOptionsIdentical(this.levels, subtitleTracks)) {\n      this.levels = subtitleTracks.map(\n        (mediaPlaylist) => new Level(mediaPlaylist),\n      );\n      return;\n    }\n    this.tracksBuffered = [];\n    this.levels = subtitleTracks.map((mediaPlaylist) => {\n      const level = new Level(mediaPlaylist);\n      this.tracksBuffered[level.id] = [];\n      return level;\n    });\n    this.fragmentTracker.removeFragmentsInRange(\n      0,\n      Number.POSITIVE_INFINITY,\n      PlaylistLevelType.SUBTITLE,\n    );\n    this.fragPrevious = null;\n    this.mediaBuffer = null;\n  }\n\n  private onSubtitleTrackSwitch(\n    event: Events.SUBTITLE_TRACK_SWITCH,\n    data: TrackSwitchedData,\n  ) {\n    this.currentTrackId = data.id;\n\n    if (!this.levels?.length || this.currentTrackId === -1) {\n      this.clearInterval();\n      return;\n    }\n\n    // Check if track has the necessary details to load fragments\n    const currentTrack = this.levels[this.currentTrackId];\n    if (currentTrack?.details) {\n      this.mediaBuffer = this.mediaBufferTimeRanges;\n    } else {\n      this.mediaBuffer = null;\n    }\n    if (currentTrack && this.state !== State.STOPPED) {\n      this.setInterval(TICK_INTERVAL);\n    }\n  }\n\n  // Got a new set of subtitle fragments.\n  private onSubtitleTrackLoaded(\n    event: Events.SUBTITLE_TRACK_LOADED,\n    data: TrackLoadedData,\n  ) {\n    const { currentTrackId, levels } = this;\n    const { details: newDetails, id: trackId } = data;\n    if (!levels) {\n      this.warn(`Subtitle tracks were reset while loading level ${trackId}`);\n      return;\n    }\n    const track: Level = levels[trackId];\n    if (trackId >= levels.length || !track) {\n      return;\n    }\n    this.log(\n      `Subtitle track ${trackId} loaded [${newDetails.startSN},${\n        newDetails.endSN\n      }]${\n        newDetails.lastPartSn\n          ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`\n          : ''\n      },duration:${newDetails.totalduration}`,\n    );\n    this.mediaBuffer = this.mediaBufferTimeRanges;\n    let sliding = 0;\n    if (newDetails.live || track.details?.live) {\n      if (newDetails.deltaUpdateFailed) {\n        return;\n      }\n      const mainDetails = this.mainDetails;\n      if (!mainDetails) {\n        this.startFragRequested = false;\n        return;\n      }\n      const mainSlidingStartFragment = mainDetails.fragments[0];\n      if (!track.details) {\n        if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {\n          alignMediaPlaylistByPDT(newDetails, mainDetails);\n          sliding = newDetails.fragmentStart;\n        } else if (mainSlidingStartFragment) {\n          // line up live playlist with main so that fragments in range are loaded\n          sliding = mainSlidingStartFragment.start;\n          addSliding(newDetails, sliding);\n        }\n      } else {\n        sliding = this.alignPlaylists(\n          newDetails,\n          track.details,\n          this.levelLastLoaded?.details,\n        );\n        if (sliding === 0 && mainSlidingStartFragment) {\n          // realign with main when there is no overlap with last refresh\n          sliding = mainSlidingStartFragment.start;\n          addSliding(newDetails, sliding);\n        }\n      }\n      // compute start position if we are aligned with the main playlist\n      if (mainDetails && !this.startFragRequested) {\n        this.setStartPosition(mainDetails, sliding);\n      }\n    }\n    track.details = newDetails;\n    this.levelLastLoaded = track;\n\n    if (trackId !== currentTrackId) {\n      return;\n    }\n\n    this.hls.trigger(Events.SUBTITLE_TRACK_UPDATED, {\n      details: newDetails,\n      id: trackId,\n      groupId: data.groupId,\n    });\n\n    // trigger handler right now\n    this.tick();\n\n    // If playlist is misaligned because of bad PDT or drift, delete details to resync with main on reload\n    if (\n      newDetails.live &&\n      !this.fragCurrent &&\n      this.media &&\n      this.state === State.IDLE\n    ) {\n      const foundFrag = findFragmentByPTS(\n        null,\n        newDetails.fragments,\n        this.media.currentTime,\n        0,\n      );\n      if (!foundFrag) {\n        this.warn('Subtitle playlist not aligned with playback');\n        track.details = undefined;\n      }\n    }\n  }\n\n  _handleFragmentLoadComplete(fragLoadedData: FragLoadedData) {\n    const { frag, payload } = fragLoadedData;\n    const decryptData = frag.decryptdata;\n    const hls = this.hls;\n\n    if (this.fragContextChanged(frag)) {\n      return;\n    }\n    // check to see if the payload needs to be decrypted\n    if (\n      payload &&\n      payload.byteLength > 0 &&\n      decryptData?.key &&\n      decryptData.iv &&\n      isFullSegmentEncryption(decryptData.method)\n    ) {\n      const startTime = performance.now();\n      // decrypt the subtitles\n      this.decrypter\n        .decrypt(\n          new Uint8Array(payload),\n          decryptData.key.buffer,\n          decryptData.iv.buffer,\n          getAesModeFromFullSegmentMethod(decryptData.method),\n        )\n        .catch((err) => {\n          hls.trigger(Events.ERROR, {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.FRAG_DECRYPT_ERROR,\n            fatal: false,\n            error: err,\n            reason: err.message,\n            frag,\n          });\n          throw err;\n        })\n        .then((decryptedData) => {\n          const endTime = performance.now();\n          hls.trigger(Events.FRAG_DECRYPTED, {\n            frag,\n            payload: decryptedData,\n            stats: {\n              tstart: startTime,\n              tdecrypt: endTime,\n            },\n          });\n        })\n        .catch((err) => {\n          this.warn(`${err.name}: ${err.message}`);\n          this.state = State.IDLE;\n        });\n    }\n  }\n\n  doTick() {\n    if (!this.media) {\n      this.state = State.IDLE;\n      return;\n    }\n\n    if (this.state === State.IDLE) {\n      const { currentTrackId, levels } = this;\n      const track = levels?.[currentTrackId];\n      if (!track || !levels.length || !track.details) {\n        return;\n      }\n      if (this.waitForLive(track)) {\n        return;\n      }\n      const { config } = this;\n      const currentTime = this.getLoadPosition();\n      const bufferedInfo = BufferHelper.bufferedInfo(\n        this.tracksBuffered[this.currentTrackId] || [],\n        currentTime,\n        config.maxBufferHole,\n      );\n      const { end: targetBufferTime, len: bufferLen } = bufferedInfo;\n      const trackDetails = track.details as LevelDetails;\n      const maxBufLen =\n        this.hls.maxBufferLength + trackDetails.levelTargetDuration;\n\n      if (bufferLen > maxBufLen) {\n        return;\n      }\n      const fragments = trackDetails.fragments;\n      const fragLen = fragments.length;\n      const end = trackDetails.edge;\n\n      let foundFrag: MediaFragment | null = null;\n      const fragPrevious = this.fragPrevious;\n      if (targetBufferTime < end) {\n        const tolerance = config.maxFragLookUpTolerance;\n        const lookupTolerance =\n          targetBufferTime > end - tolerance ? 0 : tolerance;\n        foundFrag = findFragmentByPTS(\n          fragPrevious,\n          fragments,\n          Math.max(fragments[0].start, targetBufferTime),\n          lookupTolerance,\n        );\n        if (\n          !foundFrag &&\n          fragPrevious &&\n          fragPrevious.start < fragments[0].start\n        ) {\n          foundFrag = fragments[0];\n        }\n      } else {\n        foundFrag = fragments[fragLen - 1];\n      }\n      foundFrag = this.filterReplacedPrimary(foundFrag, track.details);\n      if (!foundFrag) {\n        return;\n      }\n      // Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment\n      const curSNIdx = foundFrag.sn - trackDetails.startSN;\n      const prevFrag = fragments[curSNIdx - 1];\n      if (\n        prevFrag &&\n        prevFrag.cc === foundFrag.cc &&\n        this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED\n      ) {\n        foundFrag = prevFrag;\n      }\n      if (\n        this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED\n      ) {\n        // only load if fragment is not loaded\n        const fragToLoad = this.mapToInitFragWhenRequired(foundFrag);\n        if (fragToLoad) {\n          this.loadFragment(fragToLoad, track, targetBufferTime);\n        }\n      }\n    }\n  }\n\n  protected loadFragment(\n    frag: Fragment,\n    level: Level,\n    targetBufferTime: number,\n  ) {\n    if (!isMediaFragment(frag)) {\n      this._loadInitSegment(frag, level);\n    } else {\n      super.loadFragment(frag, level, targetBufferTime);\n    }\n  }\n\n  get mediaBufferTimeRanges(): Bufferable {\n    return new BufferableInstance(\n      this.tracksBuffered[this.currentTrackId] || [],\n    );\n  }\n}\n\nclass BufferableInstance implements Bufferable {\n  public readonly buffered: TimeRanges;\n\n  constructor(timeranges: TimeRange[]) {\n    const getRange = (\n      name: 'start' | 'end',\n      index: number,\n      length: number,\n    ): number => {\n      index = index >>> 0;\n      if (index > length - 1) {\n        throw new DOMException(\n          `Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length})`,\n        );\n      }\n      return timeranges[index][name];\n    };\n    this.buffered = {\n      get length() {\n        return timeranges.length;\n      },\n      end(index: number): number {\n        return getRange('end', index, timeranges.length);\n      },\n      start(index: number): number {\n        return getRange('start', index, timeranges.length);\n      },\n    };\n  }\n}\n", "import { stringify } from './safe-json-stringify';\nimport { logger } from '../utils/logger';\nimport type OutputFilter from './output-filter';\n\n/**\n *\n * This code was ported from the dash.js project at:\n *   https://github.com/Dash-Industry-Forum/dash.js/blob/development/externals/cea608-parser.js\n *   https://github.com/Dash-Industry-Forum/dash.js/commit/8269b26a761e0853bb21d78780ed945144ecdd4d#diff-71bc295a2d6b6b7093a1d3290d53a4b2\n *\n * The original copyright appears below:\n *\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2015-2016, DASH Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *  1. Redistributions of source code must retain the above copyright notice, this\n *  list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above copyright notice,\n *  this list of conditions and the following disclaimer in the documentation and/or\n *  other materials provided with the distribution.\n *  2. Neither the name of Dash Industry Forum nor the names of its\n *  contributors may be used to endorse or promote products derived from this software\n *  without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n *  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n *  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n *  Exceptions from regular ASCII. CodePoints are mapped to UTF-16 codes\n */\n\nconst specialCea608CharsCodes = {\n  0x2a: 0xe1, // lowercase a, acute accent\n  0x5c: 0xe9, // lowercase e, acute accent\n  0x5e: 0xed, // lowercase i, acute accent\n  0x5f: 0xf3, // lowercase o, acute accent\n  0x60: 0xfa, // lowercase u, acute accent\n  0x7b: 0xe7, // lowercase c with cedilla\n  0x7c: 0xf7, // division symbol\n  0x7d: 0xd1, // uppercase N tilde\n  0x7e: 0xf1, // lowercase n tilde\n  0x7f: 0x2588, // Full block\n  // THIS BLOCK INCLUDES THE 16 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n  // THAT COME FROM HI BYTE=0x11 AND LOW BETWEEN 0x30 AND 0x3F\n  // THIS MEANS THAT \\x50 MUST BE ADDED TO THE VALUES\n  0x80: 0xae, // Registered symbol (R)\n  0x81: 0xb0, // degree sign\n  0x82: 0xbd, // 1/2 symbol\n  0x83: 0xbf, // Inverted (open) question mark\n  0x84: 0x2122, // Trademark symbol (TM)\n  0x85: 0xa2, // Cents symbol\n  0x86: 0xa3, // Pounds sterling\n  0x87: 0x266a, // Music 8'th note\n  0x88: 0xe0, // lowercase a, grave accent\n  0x89: 0x20, // transparent space (regular)\n  0x8a: 0xe8, // lowercase e, grave accent\n  0x8b: 0xe2, // lowercase a, circumflex accent\n  0x8c: 0xea, // lowercase e, circumflex accent\n  0x8d: 0xee, // lowercase i, circumflex accent\n  0x8e: 0xf4, // lowercase o, circumflex accent\n  0x8f: 0xfb, // lowercase u, circumflex accent\n  // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n  // THAT COME FROM HI BYTE=0x12 AND LOW BETWEEN 0x20 AND 0x3F\n  0x90: 0xc1, // capital letter A with acute\n  0x91: 0xc9, // capital letter E with acute\n  0x92: 0xd3, // capital letter O with acute\n  0x93: 0xda, // capital letter U with acute\n  0x94: 0xdc, // capital letter U with diaresis\n  0x95: 0xfc, // lowercase letter U with diaeresis\n  0x96: 0x2018, // opening single quote\n  0x97: 0xa1, // inverted exclamation mark\n  0x98: 0x2a, // asterisk\n  0x99: 0x2019, // closing single quote\n  0x9a: 0x2501, // box drawings heavy horizontal\n  0x9b: 0xa9, // copyright sign\n  0x9c: 0x2120, // Service mark\n  0x9d: 0x2022, // (round) bullet\n  0x9e: 0x201c, // Left double quotation mark\n  0x9f: 0x201d, // Right double quotation mark\n  0xa0: 0xc0, // uppercase A, grave accent\n  0xa1: 0xc2, // uppercase A, circumflex\n  0xa2: 0xc7, // uppercase C with cedilla\n  0xa3: 0xc8, // uppercase E, grave accent\n  0xa4: 0xca, // uppercase E, circumflex\n  0xa5: 0xcb, // capital letter E with diaresis\n  0xa6: 0xeb, // lowercase letter e with diaresis\n  0xa7: 0xce, // uppercase I, circumflex\n  0xa8: 0xcf, // uppercase I, with diaresis\n  0xa9: 0xef, // lowercase i, with diaresis\n  0xaa: 0xd4, // uppercase O, circumflex\n  0xab: 0xd9, // uppercase U, grave accent\n  0xac: 0xf9, // lowercase u, grave accent\n  0xad: 0xdb, // uppercase U, circumflex\n  0xae: 0xab, // left-pointing double angle quotation mark\n  0xaf: 0xbb, // right-pointing double angle quotation mark\n  // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n  // THAT COME FROM HI BYTE=0x13 AND LOW BETWEEN 0x20 AND 0x3F\n  0xb0: 0xc3, // Uppercase A, tilde\n  0xb1: 0xe3, // Lowercase a, tilde\n  0xb2: 0xcd, // Uppercase I, acute accent\n  0xb3: 0xcc, // Uppercase I, grave accent\n  0xb4: 0xec, // Lowercase i, grave accent\n  0xb5: 0xd2, // Uppercase O, grave accent\n  0xb6: 0xf2, // Lowercase o, grave accent\n  0xb7: 0xd5, // Uppercase O, tilde\n  0xb8: 0xf5, // Lowercase o, tilde\n  0xb9: 0x7b, // Open curly brace\n  0xba: 0x7d, // Closing curly brace\n  0xbb: 0x5c, // Backslash\n  0xbc: 0x5e, // Caret\n  0xbd: 0x5f, // Underscore\n  0xbe: 0x7c, // Pipe (vertical line)\n  0xbf: 0x223c, // Tilde operator\n  0xc0: 0xc4, // Uppercase A, umlaut\n  0xc1: 0xe4, // Lowercase A, umlaut\n  0xc2: 0xd6, // Uppercase O, umlaut\n  0xc3: 0xf6, // Lowercase o, umlaut\n  0xc4: 0xdf, // Esszett (sharp S)\n  0xc5: 0xa5, // Yen symbol\n  0xc6: 0xa4, // Generic currency sign\n  0xc7: 0x2503, // Box drawings heavy vertical\n  0xc8: 0xc5, // Uppercase A, ring\n  0xc9: 0xe5, // Lowercase A, ring\n  0xca: 0xd8, // Uppercase O, stroke\n  0xcb: 0xf8, // Lowercase o, strok\n  0xcc: 0x250f, // Box drawings heavy down and right\n  0xcd: 0x2513, // Box drawings heavy down and left\n  0xce: 0x2517, // Box drawings heavy up and right\n  0xcf: 0x251b, // Box drawings heavy up and left\n};\n\n/**\n * Utils\n */\nconst getCharForByte = (byte: number) =>\n  String.fromCharCode(specialCea608CharsCodes[byte] || byte);\n\nconst NR_ROWS = 15;\nconst NR_COLS = 100;\n// Tables to look up row from PAC data\nconst rowsLowCh1 = {\n  0x11: 1,\n  0x12: 3,\n  0x15: 5,\n  0x16: 7,\n  0x17: 9,\n  0x10: 11,\n  0x13: 12,\n  0x14: 14,\n};\nconst rowsHighCh1 = {\n  0x11: 2,\n  0x12: 4,\n  0x15: 6,\n  0x16: 8,\n  0x17: 10,\n  0x13: 13,\n  0x14: 15,\n};\nconst rowsLowCh2 = {\n  0x19: 1,\n  0x1a: 3,\n  0x1d: 5,\n  0x1e: 7,\n  0x1f: 9,\n  0x18: 11,\n  0x1b: 12,\n  0x1c: 14,\n};\nconst rowsHighCh2 = {\n  0x19: 2,\n  0x1a: 4,\n  0x1d: 6,\n  0x1e: 8,\n  0x1f: 10,\n  0x1b: 13,\n  0x1c: 15,\n};\n\nconst backgroundColors = [\n  'white',\n  'green',\n  'blue',\n  'cyan',\n  'red',\n  'yellow',\n  'magenta',\n  'black',\n  'transparent',\n];\n\nconst enum VerboseLevel {\n  ERROR = 0,\n  TEXT = 1,\n  WARNING = 2,\n  INFO = 2,\n  DEBUG = 3,\n  DATA = 3,\n}\n\nclass CaptionsLogger {\n  public time: number | null = null;\n  public verboseLevel: VerboseLevel = VerboseLevel.ERROR;\n\n  log(severity: VerboseLevel, msg: string | (() => string)): void {\n    if (this.verboseLevel >= severity) {\n      const m: string = typeof msg === 'function' ? msg() : msg;\n      logger.log(`${this.time} [${severity}] ${m}`);\n    }\n  }\n}\n\nconst numArrayToHexArray = function (numArray: number[]): string[] {\n  const hexArray: string[] = [];\n  for (let j = 0; j < numArray.length; j++) {\n    hexArray.push(numArray[j].toString(16));\n  }\n\n  return hexArray;\n};\n\ntype PenStyles = {\n  foreground: string | null;\n  underline: boolean;\n  italics: boolean;\n  background: string;\n  flash: boolean;\n};\n\nclass PenState {\n  public foreground: string = 'white';\n  public underline: boolean = false;\n  public italics: boolean = false;\n  public background: string = 'black';\n  public flash: boolean = false;\n\n  reset() {\n    this.foreground = 'white';\n    this.underline = false;\n    this.italics = false;\n    this.background = 'black';\n    this.flash = false;\n  }\n\n  setStyles(styles: Partial<PenStyles>) {\n    const attribs = [\n      'foreground',\n      'underline',\n      'italics',\n      'background',\n      'flash',\n    ];\n    for (let i = 0; i < attribs.length; i++) {\n      const style = attribs[i];\n      if (styles.hasOwnProperty(style)) {\n        this[style] = styles[style];\n      }\n    }\n  }\n\n  isDefault() {\n    return (\n      this.foreground === 'white' &&\n      !this.underline &&\n      !this.italics &&\n      this.background === 'black' &&\n      !this.flash\n    );\n  }\n\n  equals(other: PenState) {\n    return (\n      this.foreground === other.foreground &&\n      this.underline === other.underline &&\n      this.italics === other.italics &&\n      this.background === other.background &&\n      this.flash === other.flash\n    );\n  }\n\n  copy(newPenState: PenState) {\n    this.foreground = newPenState.foreground;\n    this.underline = newPenState.underline;\n    this.italics = newPenState.italics;\n    this.background = newPenState.background;\n    this.flash = newPenState.flash;\n  }\n\n  toString(): string {\n    return (\n      'color=' +\n      this.foreground +\n      ', underline=' +\n      this.underline +\n      ', italics=' +\n      this.italics +\n      ', background=' +\n      this.background +\n      ', flash=' +\n      this.flash\n    );\n  }\n}\n\n/**\n * Unicode character with styling and background.\n * @constructor\n */\nclass StyledUnicodeChar {\n  uchar: string = ' ';\n  penState: PenState = new PenState();\n\n  reset() {\n    this.uchar = ' ';\n    this.penState.reset();\n  }\n\n  setChar(uchar: string, newPenState: PenState) {\n    this.uchar = uchar;\n    this.penState.copy(newPenState);\n  }\n\n  setPenState(newPenState: PenState) {\n    this.penState.copy(newPenState);\n  }\n\n  equals(other: StyledUnicodeChar) {\n    return this.uchar === other.uchar && this.penState.equals(other.penState);\n  }\n\n  copy(newChar: StyledUnicodeChar) {\n    this.uchar = newChar.uchar;\n    this.penState.copy(newChar.penState);\n  }\n\n  isEmpty(): boolean {\n    return this.uchar === ' ' && this.penState.isDefault();\n  }\n}\n\n/**\n * CEA-608 row consisting of NR_COLS instances of StyledUnicodeChar.\n * @constructor\n */\nexport class Row {\n  public chars: StyledUnicodeChar[] = [];\n  public pos: number = 0;\n  public currPenState: PenState = new PenState();\n  public cueStartTime: number | null = null;\n  private logger: CaptionsLogger;\n\n  constructor(logger: CaptionsLogger) {\n    for (let i = 0; i < NR_COLS; i++) {\n      this.chars.push(new StyledUnicodeChar());\n    }\n    this.logger = logger;\n  }\n\n  equals(other: Row) {\n    for (let i = 0; i < NR_COLS; i++) {\n      if (!this.chars[i].equals(other.chars[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  copy(other: Row) {\n    for (let i = 0; i < NR_COLS; i++) {\n      this.chars[i].copy(other.chars[i]);\n    }\n  }\n\n  isEmpty(): boolean {\n    let empty = true;\n    for (let i = 0; i < NR_COLS; i++) {\n      if (!this.chars[i].isEmpty()) {\n        empty = false;\n        break;\n      }\n    }\n    return empty;\n  }\n\n  /**\n   *  Set the cursor to a valid column.\n   */\n  setCursor(absPos: number) {\n    if (this.pos !== absPos) {\n      this.pos = absPos;\n    }\n\n    if (this.pos < 0) {\n      this.logger.log(\n        VerboseLevel.DEBUG,\n        'Negative cursor position ' + this.pos,\n      );\n      this.pos = 0;\n    } else if (this.pos > NR_COLS) {\n      this.logger.log(\n        VerboseLevel.DEBUG,\n        'Too large cursor position ' + this.pos,\n      );\n      this.pos = NR_COLS;\n    }\n  }\n\n  /**\n   * Move the cursor relative to current position.\n   */\n  moveCursor(relPos: number) {\n    const newPos = this.pos + relPos;\n    if (relPos > 1) {\n      for (let i = this.pos + 1; i < newPos + 1; i++) {\n        this.chars[i].setPenState(this.currPenState);\n      }\n    }\n    this.setCursor(newPos);\n  }\n\n  /**\n   * Backspace, move one step back and clear character.\n   */\n  backSpace() {\n    this.moveCursor(-1);\n    this.chars[this.pos].setChar(' ', this.currPenState);\n  }\n\n  insertChar(byte: number) {\n    if (byte >= 0x90) {\n      // Extended char\n      this.backSpace();\n    }\n    const char = getCharForByte(byte);\n    if (this.pos >= NR_COLS) {\n      this.logger.log(\n        VerboseLevel.ERROR,\n        () =>\n          'Cannot insert ' +\n          byte.toString(16) +\n          ' (' +\n          char +\n          ') at position ' +\n          this.pos +\n          '. Skipping it!',\n      );\n      return;\n    }\n    this.chars[this.pos].setChar(char, this.currPenState);\n    this.moveCursor(1);\n  }\n\n  clearFromPos(startPos: number) {\n    let i: number;\n    for (i = startPos; i < NR_COLS; i++) {\n      this.chars[i].reset();\n    }\n  }\n\n  clear() {\n    this.clearFromPos(0);\n    this.pos = 0;\n    this.currPenState.reset();\n  }\n\n  clearToEndOfRow() {\n    this.clearFromPos(this.pos);\n  }\n\n  getTextString() {\n    const chars: string[] = [];\n    let empty = true;\n    for (let i = 0; i < NR_COLS; i++) {\n      const char = this.chars[i].uchar;\n      if (char !== ' ') {\n        empty = false;\n      }\n\n      chars.push(char);\n    }\n    if (empty) {\n      return '';\n    } else {\n      return chars.join('');\n    }\n  }\n\n  setPenStyles(styles: Partial<PenStyles>) {\n    this.currPenState.setStyles(styles);\n    const currChar = this.chars[this.pos];\n    currChar.setPenState(this.currPenState);\n  }\n}\n\n/**\n * Keep a CEA-608 screen of 32x15 styled characters\n * @constructor\n */\nexport class CaptionScreen {\n  rows: Row[] = [];\n  currRow: number = NR_ROWS - 1;\n  nrRollUpRows: number | null = null;\n  lastOutputScreen: CaptionScreen | null = null;\n  logger: CaptionsLogger;\n\n  constructor(logger: CaptionsLogger) {\n    for (let i = 0; i < NR_ROWS; i++) {\n      this.rows.push(new Row(logger));\n    }\n    this.logger = logger;\n  }\n\n  reset() {\n    for (let i = 0; i < NR_ROWS; i++) {\n      this.rows[i].clear();\n    }\n    this.currRow = NR_ROWS - 1;\n  }\n\n  equals(other: CaptionScreen): boolean {\n    let equal = true;\n    for (let i = 0; i < NR_ROWS; i++) {\n      if (!this.rows[i].equals(other.rows[i])) {\n        equal = false;\n        break;\n      }\n    }\n    return equal;\n  }\n\n  copy(other: CaptionScreen) {\n    for (let i = 0; i < NR_ROWS; i++) {\n      this.rows[i].copy(other.rows[i]);\n    }\n  }\n\n  isEmpty(): boolean {\n    let empty = true;\n    for (let i = 0; i < NR_ROWS; i++) {\n      if (!this.rows[i].isEmpty()) {\n        empty = false;\n        break;\n      }\n    }\n    return empty;\n  }\n\n  backSpace() {\n    const row = this.rows[this.currRow];\n    row.backSpace();\n  }\n\n  clearToEndOfRow() {\n    const row = this.rows[this.currRow];\n    row.clearToEndOfRow();\n  }\n\n  /**\n   * Insert a character (without styling) in the current row.\n   */\n  insertChar(char: number) {\n    const row = this.rows[this.currRow];\n    row.insertChar(char);\n  }\n\n  setPen(styles: Partial<PenStyles>) {\n    const row = this.rows[this.currRow];\n    row.setPenStyles(styles);\n  }\n\n  moveCursor(relPos: number) {\n    const row = this.rows[this.currRow];\n    row.moveCursor(relPos);\n  }\n\n  setCursor(absPos: number) {\n    this.logger.log(VerboseLevel.INFO, 'setCursor: ' + absPos);\n    const row = this.rows[this.currRow];\n    row.setCursor(absPos);\n  }\n\n  setPAC(pacData: PACData) {\n    this.logger.log(VerboseLevel.INFO, () => 'pacData = ' + stringify(pacData));\n    let newRow = pacData.row - 1;\n    if (this.nrRollUpRows && newRow < this.nrRollUpRows - 1) {\n      newRow = this.nrRollUpRows - 1;\n    }\n\n    // Make sure this only affects Roll-up Captions by checking this.nrRollUpRows\n    if (this.nrRollUpRows && this.currRow !== newRow) {\n      // clear all rows first\n      for (let i = 0; i < NR_ROWS; i++) {\n        this.rows[i].clear();\n      }\n\n      // Copy this.nrRollUpRows rows from lastOutputScreen and place it in the newRow location\n      // topRowIndex - the start of rows to copy (inclusive index)\n      const topRowIndex = this.currRow + 1 - this.nrRollUpRows;\n      // We only copy if the last position was already shown.\n      // We use the cueStartTime value to check this.\n      const lastOutputScreen = this.lastOutputScreen;\n      if (lastOutputScreen) {\n        const prevLineTime = lastOutputScreen.rows[topRowIndex].cueStartTime;\n        const time = this.logger.time;\n        if (prevLineTime !== null && time !== null && prevLineTime < time) {\n          for (let i = 0; i < this.nrRollUpRows; i++) {\n            this.rows[newRow - this.nrRollUpRows + i + 1].copy(\n              lastOutputScreen.rows[topRowIndex + i],\n            );\n          }\n        }\n      }\n    }\n\n    this.currRow = newRow;\n    const row = this.rows[this.currRow];\n    if (pacData.indent !== null) {\n      const indent = pacData.indent;\n      const prevPos = Math.max(indent - 1, 0);\n      row.setCursor(pacData.indent);\n      pacData.color = row.chars[prevPos].penState.foreground;\n    }\n    const styles: PenStyles = {\n      foreground: pacData.color,\n      underline: pacData.underline,\n      italics: pacData.italics,\n      background: 'black',\n      flash: false,\n    };\n    this.setPen(styles);\n  }\n\n  /**\n   * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility).\n   */\n  setBkgData(bkgData: Partial<PenStyles>) {\n    this.logger.log(VerboseLevel.INFO, () => 'bkgData = ' + stringify(bkgData));\n    this.backSpace();\n    this.setPen(bkgData);\n    this.insertChar(0x20); // Space\n  }\n\n  setRollUpRows(nrRows: number | null) {\n    this.nrRollUpRows = nrRows;\n  }\n\n  rollUp() {\n    if (this.nrRollUpRows === null) {\n      this.logger.log(\n        VerboseLevel.DEBUG,\n        'roll_up but nrRollUpRows not set yet',\n      );\n      return; // Not properly setup\n    }\n    this.logger.log(VerboseLevel.TEXT, () => this.getDisplayText());\n    const topRowIndex = this.currRow + 1 - this.nrRollUpRows;\n    const topRow = this.rows.splice(topRowIndex, 1)[0];\n    topRow.clear();\n    this.rows.splice(this.currRow, 0, topRow);\n    this.logger.log(VerboseLevel.INFO, 'Rolling up');\n    // this.logger.log(VerboseLevel.TEXT, this.get_display_text())\n  }\n\n  /**\n   * Get all non-empty rows with as unicode text.\n   */\n  getDisplayText(asOneRow?: boolean) {\n    asOneRow = asOneRow || false;\n    const displayText: string[] = [];\n    let text = '';\n    let rowNr = -1;\n    for (let i = 0; i < NR_ROWS; i++) {\n      const rowText = this.rows[i].getTextString();\n      if (rowText) {\n        rowNr = i + 1;\n        if (asOneRow) {\n          displayText.push('Row ' + rowNr + \": '\" + rowText + \"'\");\n        } else {\n          displayText.push(rowText.trim());\n        }\n      }\n    }\n    if (displayText.length > 0) {\n      if (asOneRow) {\n        text = '[' + displayText.join(' | ') + ']';\n      } else {\n        text = displayText.join('\\n');\n      }\n    }\n    return text;\n  }\n\n  getTextAndFormat() {\n    return this.rows;\n  }\n}\n\n// var modes = ['MODE_ROLL-UP', 'MODE_POP-ON', 'MODE_PAINT-ON', 'MODE_TEXT'];\n\ntype CaptionModes =\n  | 'MODE_ROLL-UP'\n  | 'MODE_POP-ON'\n  | 'MODE_PAINT-ON'\n  | 'MODE_TEXT'\n  | null;\n\nclass Cea608Channel {\n  chNr: number;\n  outputFilter: OutputFilter;\n  mode: CaptionModes;\n  verbose: number;\n  displayedMemory: CaptionScreen;\n  nonDisplayedMemory: CaptionScreen;\n  lastOutputScreen: CaptionScreen;\n  currRollUpRow: Row;\n  writeScreen: CaptionScreen;\n  cueStartTime: number | null;\n  logger: CaptionsLogger;\n\n  constructor(\n    channelNumber: number,\n    outputFilter: OutputFilter,\n    logger: CaptionsLogger,\n  ) {\n    this.chNr = channelNumber;\n    this.outputFilter = outputFilter;\n    this.mode = null;\n    this.verbose = 0;\n    this.displayedMemory = new CaptionScreen(logger);\n    this.nonDisplayedMemory = new CaptionScreen(logger);\n    this.lastOutputScreen = new CaptionScreen(logger);\n    this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1];\n    this.writeScreen = this.displayedMemory;\n    this.mode = null;\n    this.cueStartTime = null; // Keeps track of where a cue started.\n    this.logger = logger;\n  }\n\n  reset() {\n    this.mode = null;\n    this.displayedMemory.reset();\n    this.nonDisplayedMemory.reset();\n    this.lastOutputScreen.reset();\n    this.outputFilter.reset();\n    this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1];\n    this.writeScreen = this.displayedMemory;\n    this.mode = null;\n    this.cueStartTime = null;\n  }\n\n  getHandler(): OutputFilter {\n    return this.outputFilter;\n  }\n\n  setHandler(newHandler: OutputFilter) {\n    this.outputFilter = newHandler;\n  }\n\n  setPAC(pacData: PACData) {\n    this.writeScreen.setPAC(pacData);\n  }\n\n  setBkgData(bkgData: Partial<PenStyles>) {\n    this.writeScreen.setBkgData(bkgData);\n  }\n\n  setMode(newMode: CaptionModes) {\n    if (newMode === this.mode) {\n      return;\n    }\n\n    this.mode = newMode;\n    this.logger.log(VerboseLevel.INFO, () => 'MODE=' + newMode);\n    if (this.mode === 'MODE_POP-ON') {\n      this.writeScreen = this.nonDisplayedMemory;\n    } else {\n      this.writeScreen = this.displayedMemory;\n      this.writeScreen.reset();\n    }\n    if (this.mode !== 'MODE_ROLL-UP') {\n      this.displayedMemory.nrRollUpRows = null;\n      this.nonDisplayedMemory.nrRollUpRows = null;\n    }\n    this.mode = newMode;\n  }\n\n  insertChars(chars: number[]) {\n    for (let i = 0; i < chars.length; i++) {\n      this.writeScreen.insertChar(chars[i]);\n    }\n\n    const screen =\n      this.writeScreen === this.displayedMemory ? 'DISP' : 'NON_DISP';\n    this.logger.log(\n      VerboseLevel.INFO,\n      () => screen + ': ' + this.writeScreen.getDisplayText(true),\n    );\n    if (this.mode === 'MODE_PAINT-ON' || this.mode === 'MODE_ROLL-UP') {\n      this.logger.log(\n        VerboseLevel.TEXT,\n        () => 'DISPLAYED: ' + this.displayedMemory.getDisplayText(true),\n      );\n      this.outputDataUpdate();\n    }\n  }\n\n  ccRCL() {\n    // Resume Caption Loading (switch mode to Pop On)\n    this.logger.log(VerboseLevel.INFO, 'RCL - Resume Caption Loading');\n    this.setMode('MODE_POP-ON');\n  }\n\n  ccBS() {\n    // BackSpace\n    this.logger.log(VerboseLevel.INFO, 'BS - BackSpace');\n    if (this.mode === 'MODE_TEXT') {\n      return;\n    }\n\n    this.writeScreen.backSpace();\n    if (this.writeScreen === this.displayedMemory) {\n      this.outputDataUpdate();\n    }\n  }\n\n  ccAOF() {\n    // Reserved (formerly Alarm Off)\n  }\n\n  ccAON() {\n    // Reserved (formerly Alarm On)\n  }\n\n  ccDER() {\n    // Delete to End of Row\n    this.logger.log(VerboseLevel.INFO, 'DER- Delete to End of Row');\n    this.writeScreen.clearToEndOfRow();\n    this.outputDataUpdate();\n  }\n\n  ccRU(nrRows: number | null) {\n    // Roll-Up Captions-2,3,or 4 Rows\n    this.logger.log(VerboseLevel.INFO, 'RU(' + nrRows + ') - Roll Up');\n    this.writeScreen = this.displayedMemory;\n    this.setMode('MODE_ROLL-UP');\n    this.writeScreen.setRollUpRows(nrRows);\n  }\n\n  ccFON() {\n    // Flash On\n    this.logger.log(VerboseLevel.INFO, 'FON - Flash On');\n    this.writeScreen.setPen({ flash: true });\n  }\n\n  ccRDC() {\n    // Resume Direct Captioning (switch mode to PaintOn)\n    this.logger.log(VerboseLevel.INFO, 'RDC - Resume Direct Captioning');\n    this.setMode('MODE_PAINT-ON');\n  }\n\n  ccTR() {\n    // Text Restart in text mode (not supported, however)\n    this.logger.log(VerboseLevel.INFO, 'TR');\n    this.setMode('MODE_TEXT');\n  }\n\n  ccRTD() {\n    // Resume Text Display in Text mode (not supported, however)\n    this.logger.log(VerboseLevel.INFO, 'RTD');\n    this.setMode('MODE_TEXT');\n  }\n\n  ccEDM() {\n    // Erase Displayed Memory\n    this.logger.log(VerboseLevel.INFO, 'EDM - Erase Displayed Memory');\n    this.displayedMemory.reset();\n    this.outputDataUpdate(true);\n  }\n\n  ccCR() {\n    // Carriage Return\n    this.logger.log(VerboseLevel.INFO, 'CR - Carriage Return');\n    this.writeScreen.rollUp();\n    this.outputDataUpdate(true);\n  }\n\n  ccENM() {\n    // Erase Non-Displayed Memory\n    this.logger.log(VerboseLevel.INFO, 'ENM - Erase Non-displayed Memory');\n    this.nonDisplayedMemory.reset();\n  }\n\n  ccEOC() {\n    // End of Caption (Flip Memories)\n    this.logger.log(VerboseLevel.INFO, 'EOC - End Of Caption');\n    if (this.mode === 'MODE_POP-ON') {\n      const tmp = this.displayedMemory;\n      this.displayedMemory = this.nonDisplayedMemory;\n      this.nonDisplayedMemory = tmp;\n      this.writeScreen = this.nonDisplayedMemory;\n      this.logger.log(\n        VerboseLevel.TEXT,\n        () => 'DISP: ' + this.displayedMemory.getDisplayText(),\n      );\n    }\n    this.outputDataUpdate(true);\n  }\n\n  ccTO(nrCols: number) {\n    // Tab Offset 1,2, or 3 columns\n    this.logger.log(VerboseLevel.INFO, 'TO(' + nrCols + ') - Tab Offset');\n    this.writeScreen.moveCursor(nrCols);\n  }\n\n  ccMIDROW(secondByte: number) {\n    // Parse MIDROW command\n    const styles: Partial<PenStyles> = { flash: false };\n    styles.underline = secondByte % 2 === 1;\n    styles.italics = secondByte >= 0x2e;\n    if (!styles.italics) {\n      const colorIndex = Math.floor(secondByte / 2) - 0x10;\n      const colors = [\n        'white',\n        'green',\n        'blue',\n        'cyan',\n        'red',\n        'yellow',\n        'magenta',\n      ];\n      styles.foreground = colors[colorIndex];\n    } else {\n      styles.foreground = 'white';\n    }\n    this.logger.log(VerboseLevel.INFO, 'MIDROW: ' + stringify(styles));\n    this.writeScreen.setPen(styles);\n  }\n\n  outputDataUpdate(dispatch: boolean = false) {\n    const time = this.logger.time;\n    if (time === null) {\n      return;\n    }\n\n    if (this.outputFilter) {\n      if (this.cueStartTime === null && !this.displayedMemory.isEmpty()) {\n        // Start of a new cue\n        this.cueStartTime = time;\n      } else {\n        if (!this.displayedMemory.equals(this.lastOutputScreen)) {\n          this.outputFilter.newCue(\n            this.cueStartTime!,\n            time,\n            this.lastOutputScreen,\n          );\n          if (dispatch && this.outputFilter.dispatchCue) {\n            this.outputFilter.dispatchCue();\n          }\n\n          this.cueStartTime = this.displayedMemory.isEmpty() ? null : time;\n        }\n      }\n      this.lastOutputScreen.copy(this.displayedMemory);\n    }\n  }\n\n  cueSplitAtTime(t: number) {\n    if (this.outputFilter) {\n      if (!this.displayedMemory.isEmpty()) {\n        if (this.outputFilter.newCue) {\n          this.outputFilter.newCue(this.cueStartTime!, t, this.displayedMemory);\n        }\n\n        this.cueStartTime = t;\n      }\n    }\n  }\n}\n\ninterface PACData {\n  row: number;\n  indent: number | null;\n  color: string | null;\n  underline: boolean;\n  italics: boolean;\n}\n\ntype SupportedField = 1 | 3;\n\ntype Channels = 0 | 1 | 2; // Will be 1 or 2 when parsing captions\n\ntype CmdHistory = {\n  a: number | null;\n  b: number | null;\n};\n\nclass Cea608Parser {\n  channels: Array<Cea608Channel | null>;\n  currentChannel: Channels = 0;\n  cmdHistory: CmdHistory = createCmdHistory();\n  logger: CaptionsLogger;\n\n  constructor(field: SupportedField, out1: OutputFilter, out2: OutputFilter) {\n    const logger = (this.logger = new CaptionsLogger());\n    this.channels = [\n      null,\n      new Cea608Channel(field, out1, logger),\n      new Cea608Channel(field + 1, out2, logger),\n    ];\n  }\n\n  getHandler(channel: number) {\n    return (this.channels[channel] as Cea608Channel).getHandler();\n  }\n\n  setHandler(channel: number, newHandler: OutputFilter) {\n    (this.channels[channel] as Cea608Channel).setHandler(newHandler);\n  }\n\n  /**\n   * Add data for time t in forms of list of bytes (unsigned ints). The bytes are treated as pairs.\n   */\n  addData(time: number | null, byteList: number[]) {\n    this.logger.time = time;\n    for (let i = 0; i < byteList.length; i += 2) {\n      const a = byteList[i] & 0x7f;\n      const b = byteList[i + 1] & 0x7f;\n      let cmdFound: boolean = false;\n      let charsFound: number[] | null = null;\n\n      if (a === 0 && b === 0) {\n        continue;\n      } else {\n        this.logger.log(\n          VerboseLevel.DATA,\n          () =>\n            '[' +\n            numArrayToHexArray([byteList[i], byteList[i + 1]]) +\n            '] -> (' +\n            numArrayToHexArray([a, b]) +\n            ')',\n        );\n      }\n\n      const cmdHistory = this.cmdHistory;\n      const isControlCode = a >= 0x10 && a <= 0x1f;\n      if (isControlCode) {\n        // Skip redundant control codes\n        if (hasCmdRepeated(a, b, cmdHistory)) {\n          setLastCmd(null, null, cmdHistory);\n          this.logger.log(\n            VerboseLevel.DEBUG,\n            () =>\n              'Repeated command (' +\n              numArrayToHexArray([a, b]) +\n              ') is dropped',\n          );\n          continue;\n        }\n        setLastCmd(a, b, this.cmdHistory);\n\n        cmdFound = this.parseCmd(a, b);\n\n        if (!cmdFound) {\n          cmdFound = this.parseMidrow(a, b);\n        }\n\n        if (!cmdFound) {\n          cmdFound = this.parsePAC(a, b);\n        }\n\n        if (!cmdFound) {\n          cmdFound = this.parseBackgroundAttributes(a, b);\n        }\n      } else {\n        setLastCmd(null, null, cmdHistory);\n      }\n      if (!cmdFound) {\n        charsFound = this.parseChars(a, b);\n        if (charsFound) {\n          const currChNr = this.currentChannel;\n          if (currChNr && currChNr > 0) {\n            const channel = this.channels[currChNr] as Cea608Channel;\n            channel.insertChars(charsFound);\n          } else {\n            this.logger.log(\n              VerboseLevel.WARNING,\n              'No channel found yet. TEXT-MODE?',\n            );\n          }\n        }\n      }\n      if (!cmdFound && !charsFound) {\n        this.logger.log(\n          VerboseLevel.WARNING,\n          () =>\n            \"Couldn't parse cleaned data \" +\n            numArrayToHexArray([a, b]) +\n            ' orig: ' +\n            numArrayToHexArray([byteList[i], byteList[i + 1]]),\n        );\n      }\n    }\n  }\n\n  /**\n   * Parse Command.\n   * @returns True if a command was found\n   */\n  parseCmd(a: number, b: number): boolean {\n    const cond1 =\n      (a === 0x14 || a === 0x1c || a === 0x15 || a === 0x1d) &&\n      b >= 0x20 &&\n      b <= 0x2f;\n    const cond2 = (a === 0x17 || a === 0x1f) && b >= 0x21 && b <= 0x23;\n    if (!(cond1 || cond2)) {\n      return false;\n    }\n\n    const chNr = a === 0x14 || a === 0x15 || a === 0x17 ? 1 : 2;\n    const channel = this.channels[chNr] as Cea608Channel;\n\n    if (a === 0x14 || a === 0x15 || a === 0x1c || a === 0x1d) {\n      if (b === 0x20) {\n        channel.ccRCL();\n      } else if (b === 0x21) {\n        channel.ccBS();\n      } else if (b === 0x22) {\n        channel.ccAOF();\n      } else if (b === 0x23) {\n        channel.ccAON();\n      } else if (b === 0x24) {\n        channel.ccDER();\n      } else if (b === 0x25) {\n        channel.ccRU(2);\n      } else if (b === 0x26) {\n        channel.ccRU(3);\n      } else if (b === 0x27) {\n        channel.ccRU(4);\n      } else if (b === 0x28) {\n        channel.ccFON();\n      } else if (b === 0x29) {\n        channel.ccRDC();\n      } else if (b === 0x2a) {\n        channel.ccTR();\n      } else if (b === 0x2b) {\n        channel.ccRTD();\n      } else if (b === 0x2c) {\n        channel.ccEDM();\n      } else if (b === 0x2d) {\n        channel.ccCR();\n      } else if (b === 0x2e) {\n        channel.ccENM();\n      } else if (b === 0x2f) {\n        channel.ccEOC();\n      }\n    } else {\n      // a == 0x17 || a == 0x1F\n      channel.ccTO(b - 0x20);\n    }\n    this.currentChannel = chNr;\n    return true;\n  }\n\n  /**\n   * Parse midrow styling command\n   */\n  parseMidrow(a: number, b: number): boolean {\n    let chNr: number = 0;\n\n    if ((a === 0x11 || a === 0x19) && b >= 0x20 && b <= 0x2f) {\n      if (a === 0x11) {\n        chNr = 1;\n      } else {\n        chNr = 2;\n      }\n\n      if (chNr !== this.currentChannel) {\n        this.logger.log(\n          VerboseLevel.ERROR,\n          'Mismatch channel in midrow parsing',\n        );\n        return false;\n      }\n      const channel = this.channels[chNr];\n      if (!channel) {\n        return false;\n      }\n      channel.ccMIDROW(b);\n      this.logger.log(\n        VerboseLevel.DEBUG,\n        () => 'MIDROW (' + numArrayToHexArray([a, b]) + ')',\n      );\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Parse Preable Access Codes (Table 53).\n   * @returns {Boolean} Tells if PAC found\n   */\n  parsePAC(a: number, b: number): boolean {\n    let row: number;\n\n    const case1 =\n      ((a >= 0x11 && a <= 0x17) || (a >= 0x19 && a <= 0x1f)) &&\n      b >= 0x40 &&\n      b <= 0x7f;\n    const case2 = (a === 0x10 || a === 0x18) && b >= 0x40 && b <= 0x5f;\n    if (!(case1 || case2)) {\n      return false;\n    }\n\n    const chNr: Channels = a <= 0x17 ? 1 : 2;\n\n    if (b >= 0x40 && b <= 0x5f) {\n      row = chNr === 1 ? rowsLowCh1[a] : rowsLowCh2[a];\n    } else {\n      // 0x60 <= b <= 0x7F\n      row = chNr === 1 ? rowsHighCh1[a] : rowsHighCh2[a];\n    }\n    const channel = this.channels[chNr];\n    if (!channel) {\n      return false;\n    }\n    channel.setPAC(this.interpretPAC(row, b));\n    this.currentChannel = chNr;\n    return true;\n  }\n\n  /**\n   * Interpret the second byte of the pac, and return the information.\n   * @returns pacData with style parameters\n   */\n  interpretPAC(row: number, byte: number): PACData {\n    let pacIndex;\n    const pacData: PACData = {\n      color: null,\n      italics: false,\n      indent: null,\n      underline: false,\n      row: row,\n    };\n\n    if (byte > 0x5f) {\n      pacIndex = byte - 0x60;\n    } else {\n      pacIndex = byte - 0x40;\n    }\n\n    pacData.underline = (pacIndex & 1) === 1;\n    if (pacIndex <= 0xd) {\n      pacData.color = [\n        'white',\n        'green',\n        'blue',\n        'cyan',\n        'red',\n        'yellow',\n        'magenta',\n        'white',\n      ][Math.floor(pacIndex / 2)];\n    } else if (pacIndex <= 0xf) {\n      pacData.italics = true;\n      pacData.color = 'white';\n    } else {\n      pacData.indent = Math.floor((pacIndex - 0x10) / 2) * 4;\n    }\n    return pacData; // Note that row has zero offset. The spec uses 1.\n  }\n\n  /**\n   * Parse characters.\n   * @returns An array with 1 to 2 codes corresponding to chars, if found. null otherwise.\n   */\n  parseChars(a: number, b: number): number[] | null {\n    let channelNr: Channels;\n    let charCodes: number[] | null = null;\n    let charCode1: number | null = null;\n\n    if (a >= 0x19) {\n      channelNr = 2;\n      charCode1 = a - 8;\n    } else {\n      channelNr = 1;\n      charCode1 = a;\n    }\n    if (charCode1 >= 0x11 && charCode1 <= 0x13) {\n      // Special character\n      let oneCode;\n      if (charCode1 === 0x11) {\n        oneCode = b + 0x50;\n      } else if (charCode1 === 0x12) {\n        oneCode = b + 0x70;\n      } else {\n        oneCode = b + 0x90;\n      }\n\n      this.logger.log(\n        VerboseLevel.INFO,\n        () =>\n          \"Special char '\" +\n          getCharForByte(oneCode) +\n          \"' in channel \" +\n          channelNr,\n      );\n      charCodes = [oneCode];\n    } else if (a >= 0x20 && a <= 0x7f) {\n      charCodes = b === 0 ? [a] : [a, b];\n    }\n    if (charCodes) {\n      this.logger.log(\n        VerboseLevel.DEBUG,\n        () => 'Char codes =  ' + numArrayToHexArray(charCodes).join(','),\n      );\n    }\n    return charCodes;\n  }\n\n  /**\n   * Parse extended background attributes as well as new foreground color black.\n   * @returns True if background attributes are found\n   */\n  parseBackgroundAttributes(a: number, b: number): boolean {\n    const case1 = (a === 0x10 || a === 0x18) && b >= 0x20 && b <= 0x2f;\n    const case2 = (a === 0x17 || a === 0x1f) && b >= 0x2d && b <= 0x2f;\n    if (!(case1 || case2)) {\n      return false;\n    }\n    let index: number;\n    const bkgData: Partial<PenStyles> = {};\n    if (a === 0x10 || a === 0x18) {\n      index = Math.floor((b - 0x20) / 2);\n      bkgData.background = backgroundColors[index];\n      if (b % 2 === 1) {\n        bkgData.background = bkgData.background + '_semi';\n      }\n    } else if (b === 0x2d) {\n      bkgData.background = 'transparent';\n    } else {\n      bkgData.foreground = 'black';\n      if (b === 0x2f) {\n        bkgData.underline = true;\n      }\n    }\n    const chNr: Channels = a <= 0x17 ? 1 : 2;\n    const channel: Cea608Channel = this.channels[chNr] as Cea608Channel;\n    channel.setBkgData(bkgData);\n    return true;\n  }\n\n  /**\n   * Reset state of parser and its channels.\n   */\n  reset() {\n    for (let i = 0; i < Object.keys(this.channels).length; i++) {\n      const channel = this.channels[i];\n      if (channel) {\n        channel.reset();\n      }\n    }\n    setLastCmd(null, null, this.cmdHistory);\n  }\n\n  /**\n   * Trigger the generation of a cue, and the start of a new one if displayScreens are not empty.\n   */\n  cueSplitAtTime(t: number) {\n    for (let i = 0; i < this.channels.length; i++) {\n      const channel = this.channels[i];\n      if (channel) {\n        channel.cueSplitAtTime(t);\n      }\n    }\n  }\n}\n\nfunction setLastCmd(\n  a: number | null,\n  b: number | null,\n  cmdHistory: CmdHistory,\n) {\n  cmdHistory.a = a;\n  cmdHistory.b = b;\n}\n\nfunction hasCmdRepeated(a: number, b: number, cmdHistory: CmdHistory) {\n  return cmdHistory.a === a && cmdHistory.b === b;\n}\n\nfunction createCmdHistory(): CmdHistory {\n  return {\n    a: null,\n    b: null,\n  };\n}\n\nexport default Cea608Parser;\n", "/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { optionalSelf } from './global';\n\ndeclare interface VTTCuePolyfill extends VTTCue {\n  new (...args): VTTCuePolyfill;\n  hasBeenReset: boolean;\n  displayState: void;\n}\n\nexport default (function () {\n  if (optionalSelf?.VTTCue) {\n    return self.VTTCue;\n  }\n\n  const AllowedDirections = ['', 'lr', 'rl'] as const;\n  type Direction = (typeof AllowedDirections)[number];\n\n  const AllowedAlignments = [\n    'start',\n    'middle',\n    'end',\n    'left',\n    'right',\n  ] as const;\n  type Alignment = (typeof AllowedAlignments)[number];\n\n  function isAllowedValue<T, A>(allowed: T, value: string): A | false {\n    if (typeof value !== 'string') {\n      return false;\n    }\n    // necessary for assuring the generic conforms to the Array interface\n    if (!Array.isArray(allowed)) {\n      return false;\n    }\n    // reset the type so that the next narrowing works well\n    const lcValue = value.toLowerCase() as any;\n    // use the allow list to narrow the type to a specific subset of strings\n    if (~allowed.indexOf(lcValue)) {\n      return lcValue;\n    }\n\n    return false;\n  }\n\n  function findDirectionSetting(value: string) {\n    return isAllowedValue<typeof AllowedDirections, Direction>(\n      AllowedDirections,\n      value,\n    );\n  }\n\n  function findAlignSetting(value: string) {\n    return isAllowedValue<typeof AllowedAlignments, Alignment>(\n      AllowedAlignments,\n      value,\n    );\n  }\n\n  function extend(obj: Record<string, any>, ...rest: Record<string, any>[]) {\n    let i = 1;\n    for (; i < arguments.length; i++) {\n      const cobj = arguments[i];\n      for (const p in cobj) {\n        obj[p] = cobj[p];\n      }\n    }\n\n    return obj;\n  }\n\n  function VTTCue(startTime: number, endTime: number, text: string) {\n    const cue = this as VTTCuePolyfill;\n    const baseObj = { enumerable: true };\n    /**\n     * Shim implementation specific properties. These properties are not in\n     * the spec.\n     */\n\n    // Lets us know when the VTTCue's data has changed in such a way that we need\n    // to recompute its display state. This lets us compute its display state\n    // lazily.\n    cue.hasBeenReset = false;\n\n    /**\n     * VTTCue and TextTrackCue properties\n     * http://dev.w3.org/html5/webvtt/#vttcue-interface\n     */\n\n    let _id = '';\n    let _pauseOnExit = false;\n    let _startTime = startTime;\n    let _endTime = endTime;\n    let _text = text;\n    let _region = null;\n    let _vertical: Direction = '';\n    let _snapToLines = true;\n    let _line: number | 'auto' = 'auto';\n    let _lineAlign: Alignment = 'start';\n    let _position = 50;\n    let _positionAlign: Alignment = 'middle';\n    let _size = 50;\n    let _align: Alignment = 'middle';\n\n    Object.defineProperty(\n      cue,\n      'id',\n      extend({}, baseObj, {\n        get: function () {\n          return _id;\n        },\n        set: function (value: string) {\n          _id = '' + value;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'pauseOnExit',\n      extend({}, baseObj, {\n        get: function () {\n          return _pauseOnExit;\n        },\n        set: function (value: boolean) {\n          _pauseOnExit = !!value;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'startTime',\n      extend({}, baseObj, {\n        get: function () {\n          return _startTime;\n        },\n        set: function (value: number) {\n          if (typeof value !== 'number') {\n            throw new TypeError('Start time must be set to a number.');\n          }\n\n          _startTime = value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'endTime',\n      extend({}, baseObj, {\n        get: function () {\n          return _endTime;\n        },\n        set: function (value: number) {\n          if (typeof value !== 'number') {\n            throw new TypeError('End time must be set to a number.');\n          }\n\n          _endTime = value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'text',\n      extend({}, baseObj, {\n        get: function () {\n          return _text;\n        },\n        set: function (value: string) {\n          _text = '' + value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    // todo: implement VTTRegion polyfill?\n    Object.defineProperty(\n      cue,\n      'region',\n      extend({}, baseObj, {\n        get: function () {\n          return _region;\n        },\n        set: function (value: any) {\n          _region = value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'vertical',\n      extend({}, baseObj, {\n        get: function () {\n          return _vertical;\n        },\n        set: function (value: string) {\n          const setting = findDirectionSetting(value);\n          // Have to check for false because the setting an be an empty string.\n          if (setting === false) {\n            throw new SyntaxError(\n              'An invalid or illegal string was specified.',\n            );\n          }\n\n          _vertical = setting;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'snapToLines',\n      extend({}, baseObj, {\n        get: function () {\n          return _snapToLines;\n        },\n        set: function (value: boolean) {\n          _snapToLines = !!value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'line',\n      extend({}, baseObj, {\n        get: function () {\n          return _line;\n        },\n        set: function (value: number | 'auto') {\n          if (typeof value !== 'number' && value !== 'auto') {\n            throw new SyntaxError(\n              'An invalid number or illegal string was specified.',\n            );\n          }\n\n          _line = value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'lineAlign',\n      extend({}, baseObj, {\n        get: function () {\n          return _lineAlign;\n        },\n        set: function (value: string) {\n          const setting = findAlignSetting(value);\n          if (!setting) {\n            throw new SyntaxError(\n              'An invalid or illegal string was specified.',\n            );\n          }\n\n          _lineAlign = setting;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'position',\n      extend({}, baseObj, {\n        get: function () {\n          return _position;\n        },\n        set: function (value: number) {\n          if (value < 0 || value > 100) {\n            throw new Error('Position must be between 0 and 100.');\n          }\n\n          _position = value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'positionAlign',\n      extend({}, baseObj, {\n        get: function () {\n          return _positionAlign;\n        },\n        set: function (value: string) {\n          const setting = findAlignSetting(value);\n          if (!setting) {\n            throw new SyntaxError(\n              'An invalid or illegal string was specified.',\n            );\n          }\n\n          _positionAlign = setting;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'size',\n      extend({}, baseObj, {\n        get: function () {\n          return _size;\n        },\n        set: function (value: number) {\n          if (value < 0 || value > 100) {\n            throw new Error('Size must be between 0 and 100.');\n          }\n\n          _size = value;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    Object.defineProperty(\n      cue,\n      'align',\n      extend({}, baseObj, {\n        get: function () {\n          return _align;\n        },\n        set: function (value: string) {\n          const setting = findAlignSetting(value);\n          if (!setting) {\n            throw new SyntaxError(\n              'An invalid or illegal string was specified.',\n            );\n          }\n\n          _align = setting;\n          this.hasBeenReset = true;\n        },\n      }),\n    );\n\n    /**\n     * Other <track> spec defined properties\n     */\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n    cue.displayState = undefined;\n  }\n\n  /**\n   * VTTCue methods\n   */\n\n  VTTCue.prototype.getCueAsHTML = function () {\n    // Assume WebVTT.convertCueToDOMTree is on the global.\n    const WebVTT = (self as any).WebVTT;\n    return WebVTT.convertCueToDOMTree(self, this.text);\n  };\n  // this is a polyfill hack\n  return VTTCue as any as VTTCuePolyfill;\n})();\n", "/*\n * Source: https://github.com/mozilla/vtt.js/blob/master/dist/vtt.js\n */\n\nimport VTTCue from './vttcue';\n\nclass StringDecoder {\n  decode(data: string | any, options?: Object): string | never {\n    if (!data) {\n      return '';\n    }\n\n    if (typeof data !== 'string') {\n      throw new Error('Error - expected string data.');\n    }\n\n    return decodeURIComponent(encodeURIComponent(data));\n  }\n}\n\n// Try to parse input as a time stamp.\nexport function parseTimeStamp(input: string) {\n  function computeSeconds(h, m, s, f) {\n    return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + parseFloat(f || 0);\n  }\n\n  const m = input.match(/^(?:(\\d+):)?(\\d{2}):(\\d{2})(\\.\\d+)?/);\n  if (!m) {\n    return null;\n  }\n\n  if (parseFloat(m[2]) > 59) {\n    // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n    // First position is hours as it's over 59.\n    return computeSeconds(m[2], m[3], 0, m[4]);\n  }\n  // Timestamp takes the form of [hours (optional)]:[minutes]:[seconds].[milliseconds]\n  return computeSeconds(m[1], m[2], m[3], m[4]);\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nclass Settings {\n  private readonly values: { [key: string]: any } = Object.create(null);\n\n  // Only accept the first assignment to any key.\n  set(k: string, v: any) {\n    if (!this.get(k) && v !== '') {\n      this.values[k] = v;\n    }\n  }\n  // Return the value for a key, or a default value.\n  // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n  // a number of possible default values as properties where 'defaultKey' is\n  // the key of the property that will be chosen; otherwise it's assumed to be\n  // a single value.\n  get(k: string, dflt?: any, defaultKey?: string): any {\n    if (defaultKey) {\n      return this.has(k) ? this.values[k] : dflt[defaultKey];\n    }\n\n    return this.has(k) ? this.values[k] : dflt;\n  }\n  // Check whether we have a value for a key.\n  has(k: string): boolean {\n    return k in this.values;\n  }\n  // Accept a setting if its one of the given alternatives.\n  alt(k: string, v: any, a: any[]) {\n    for (let n = 0; n < a.length; ++n) {\n      if (v === a[n]) {\n        this.set(k, v);\n        break;\n      }\n    }\n  }\n  // Accept a setting if its a valid (signed) integer.\n  integer(k: string, v: any) {\n    if (/^-?\\d+$/.test(v)) {\n      // integer\n      this.set(k, parseInt(v, 10));\n    }\n  }\n  // Accept a setting if its a valid percentage.\n  percent(k: string, v: any): boolean {\n    if (/^([\\d]{1,3})(\\.[\\d]*)?%$/.test(v)) {\n      const percent = parseFloat(v);\n      if (percent >= 0 && percent <= 100) {\n        this.set(k, percent);\n        return true;\n      }\n    }\n    return false;\n  }\n}\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interpret each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(\n  input: string,\n  callback: (k: string, v: any) => void,\n  keyValueDelim: RegExp,\n  groupDelim?: RegExp,\n) {\n  const groups = groupDelim ? input.split(groupDelim) : [input];\n  for (const i in groups) {\n    if (typeof groups[i] !== 'string') {\n      continue;\n    }\n\n    const kv = groups[i].split(keyValueDelim);\n    if (kv.length !== 2) {\n      continue;\n    }\n\n    const k = kv[0];\n    const v = kv[1];\n    callback(k, v);\n  }\n}\n\nconst defaults = new VTTCue(0, 0, '');\n// 'middle' was changed to 'center' in the spec: https://github.com/w3c/webvtt/pull/244\n//  Safari doesn't yet support this change, but FF and Chrome do.\nconst center = (defaults.align as string) === 'middle' ? 'middle' : 'center';\n\nfunction parseCue(input: string, cue: VTTCue, regionList: Region[]) {\n  // Remember the original input if we need to throw an error.\n  const oInput = input;\n  // 4.1 WebVTT timestamp\n  function consumeTimeStamp(): number | never {\n    const ts = parseTimeStamp(input);\n    if (ts === null) {\n      throw new Error('Malformed timestamp: ' + oInput);\n    }\n\n    // Remove time stamp from input.\n    input = input.replace(/^[^\\sa-zA-Z-]+/, '');\n    return ts;\n  }\n\n  // 4.4.2 WebVTT cue settings\n  function consumeCueSettings(input: string, cue: VTTCue) {\n    const settings = new Settings();\n\n    parseOptions(\n      input,\n      function (k, v) {\n        let vals;\n        switch (k) {\n          case 'region':\n            // Find the last region we parsed with the same region id.\n            for (let i = regionList.length - 1; i >= 0; i--) {\n              if (regionList[i].id === v) {\n                settings.set(k, regionList[i].region);\n                break;\n              }\n            }\n            break;\n          case 'vertical':\n            settings.alt(k, v, ['rl', 'lr']);\n            break;\n          case 'line':\n            vals = v.split(',');\n            settings.integer(k, vals[0]);\n            if (settings.percent(k, vals[0])) {\n              settings.set('snapToLines', false);\n            }\n\n            settings.alt(k, vals[0], ['auto']);\n            if (vals.length === 2) {\n              settings.alt('lineAlign', vals[1], ['start', center, 'end']);\n            }\n\n            break;\n          case 'position':\n            vals = v.split(',');\n            settings.percent(k, vals[0]);\n            if (vals.length === 2) {\n              settings.alt('positionAlign', vals[1], [\n                'start',\n                center,\n                'end',\n                'line-left',\n                'line-right',\n                'auto',\n              ]);\n            }\n\n            break;\n          case 'size':\n            settings.percent(k, v);\n            break;\n          case 'align':\n            settings.alt(k, v, ['start', center, 'end', 'left', 'right']);\n            break;\n        }\n      },\n      /:/,\n      /\\s/,\n    );\n\n    // Apply default values for any missing fields.\n    cue.region = settings.get('region', null);\n    cue.vertical = settings.get('vertical', '');\n    let line = settings.get('line', 'auto');\n    if (line === 'auto' && defaults.line === -1) {\n      // set numeric line number for Safari\n      line = -1;\n    }\n    cue.line = line;\n    cue.lineAlign = settings.get('lineAlign', 'start');\n    cue.snapToLines = settings.get('snapToLines', true);\n    cue.size = settings.get('size', 100);\n    cue.align = settings.get('align', center);\n    let position = settings.get('position', 'auto');\n    if (position === 'auto' && defaults.position === 50) {\n      // set numeric position for Safari\n      position =\n        cue.align === 'start' || cue.align === 'left'\n          ? 0\n          : cue.align === 'end' || cue.align === 'right'\n            ? 100\n            : 50;\n    }\n    cue.position = position;\n  }\n\n  function skipWhitespace() {\n    input = input.replace(/^\\s+/, '');\n  }\n\n  // 4.1 WebVTT cue timings.\n  skipWhitespace();\n  cue.startTime = consumeTimeStamp(); // (1) collect cue start time\n  skipWhitespace();\n  if (input.slice(0, 3) !== '-->') {\n    // (3) next characters must match '-->'\n    throw new Error(\n      \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n        oInput,\n    );\n  }\n  input = input.slice(3);\n  skipWhitespace();\n  cue.endTime = consumeTimeStamp(); // (5) collect cue end time\n\n  // 4.1 WebVTT cue settings list.\n  skipWhitespace();\n  consumeCueSettings(input, cue);\n}\n\nexport function fixLineBreaks(input: string): string {\n  return input.replace(/<br(?: \\/)?>/gi, '\\n');\n}\n\ntype Region = {\n  id: string;\n  region: any;\n};\n\nexport class VTTParser {\n  private state:\n    | 'INITIAL'\n    | 'HEADER'\n    | 'ID'\n    | 'CUE'\n    | 'CUETEXT'\n    | 'NOTE'\n    | 'BADWEBVTT'\n    | 'BADCUE' = 'INITIAL';\n  private buffer: string = '';\n  private decoder: StringDecoder = new StringDecoder();\n  private regionList: Region[] = [];\n  private cue: VTTCue | null = null;\n  public oncue?: (cue: VTTCue) => void;\n  public onparsingerror?: (error: Error) => void;\n  public onflush?: () => void;\n\n  parse(data?: string): VTTParser {\n    const _this = this;\n\n    // If there is no data then we won't decode it, but will just try to parse\n    // whatever is in buffer already. This may occur in circumstances, for\n    // example when flush() is called.\n    if (data) {\n      // Try to decode the data that we received.\n      _this.buffer += _this.decoder.decode(data, { stream: true });\n    }\n\n    function collectNextLine(): string {\n      let buffer: string = _this.buffer;\n      let pos = 0;\n\n      buffer = fixLineBreaks(buffer);\n\n      while (\n        pos < buffer.length &&\n        buffer[pos] !== '\\r' &&\n        buffer[pos] !== '\\n'\n      ) {\n        ++pos;\n      }\n\n      const line: string = buffer.slice(0, pos);\n      // Advance the buffer early in case we fail below.\n      if (buffer[pos] === '\\r') {\n        ++pos;\n      }\n\n      if (buffer[pos] === '\\n') {\n        ++pos;\n      }\n\n      _this.buffer = buffer.slice(pos);\n      return line;\n    }\n\n    // 3.2 WebVTT metadata header syntax\n    function parseHeader(input) {\n      parseOptions(\n        input,\n        function (k, v) {\n          // switch (k) {\n          // case 'region':\n          // 3.3 WebVTT region metadata header syntax\n          // console.log('parse region', v);\n          // parseRegion(v);\n          // break;\n          // }\n        },\n        /:/,\n      );\n    }\n\n    // 5.1 WebVTT file parsing.\n    try {\n      let line: string = '';\n      if (_this.state === 'INITIAL') {\n        // We can't start parsing until we have the first line.\n        if (!/\\r\\n|\\n/.test(_this.buffer)) {\n          return this;\n        }\n\n        line = collectNextLine();\n        // strip of UTF-8 BOM if any\n        // https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8\n        const m = line.match(/^(ï»¿)?WEBVTT([ \\t].*)?$/);\n        if (!m?.[0]) {\n          throw new Error('Malformed WebVTT signature.');\n        }\n\n        _this.state = 'HEADER';\n      }\n\n      let alreadyCollectedLine = false;\n      while (_this.buffer) {\n        // We can't parse a line until we have the full line.\n        if (!/\\r\\n|\\n/.test(_this.buffer)) {\n          return this;\n        }\n\n        if (!alreadyCollectedLine) {\n          line = collectNextLine();\n        } else {\n          alreadyCollectedLine = false;\n        }\n\n        switch (_this.state) {\n          case 'HEADER':\n            // 13-18 - Allow a header (metadata) under the WEBVTT line.\n            if (/:/.test(line)) {\n              parseHeader(line);\n            } else if (!line) {\n              // An empty line terminates the header and starts the body (cues).\n              _this.state = 'ID';\n            }\n            continue;\n          case 'NOTE':\n            // Ignore NOTE blocks.\n            if (!line) {\n              _this.state = 'ID';\n            }\n\n            continue;\n          case 'ID':\n            // Check for the start of NOTE blocks.\n            if (/^NOTE($|[ \\t])/.test(line)) {\n              _this.state = 'NOTE';\n              break;\n            }\n            // 19-29 - Allow any number of line terminators, then initialize new cue values.\n            if (!line) {\n              continue;\n            }\n\n            _this.cue = new VTTCue(0, 0, '');\n            _this.state = 'CUE';\n            // 30-39 - Check if self line contains an optional identifier or timing data.\n            if (line.indexOf('-->') === -1) {\n              _this.cue.id = line;\n              continue;\n            }\n          // Process line as start of a cue.\n          /* falls through */\n          case 'CUE':\n            // 40 - Collect cue timings and settings.\n            if (!_this.cue) {\n              _this.state = 'BADCUE';\n              continue;\n            }\n            try {\n              parseCue(line, _this.cue, _this.regionList);\n            } catch (e) {\n              // In case of an error ignore rest of the cue.\n              _this.cue = null;\n              _this.state = 'BADCUE';\n              continue;\n            }\n            _this.state = 'CUETEXT';\n            continue;\n          case 'CUETEXT':\n            {\n              const hasSubstring = line.indexOf('-->') !== -1;\n              // 34 - If we have an empty line then report the cue.\n              // 35 - If we have the special substring '-->' then report the cue,\n              // but do not collect the line as we need to process the current\n              // one as a new cue.\n              if (!line || (hasSubstring && (alreadyCollectedLine = true))) {\n                // We are done parsing self cue.\n                if (_this.oncue && _this.cue) {\n                  _this.oncue(_this.cue);\n                }\n\n                _this.cue = null;\n                _this.state = 'ID';\n                continue;\n              }\n              if (_this.cue === null) {\n                continue;\n              }\n\n              if (_this.cue.text) {\n                _this.cue.text += '\\n';\n              }\n              _this.cue.text += line;\n            }\n            continue;\n          case 'BADCUE':\n            // 54-62 - Collect and discard the remaining cue.\n            if (!line) {\n              _this.state = 'ID';\n            }\n        }\n      }\n    } catch (e) {\n      // If we are currently parsing a cue, report what we have.\n      if (_this.state === 'CUETEXT' && _this.cue && _this.oncue) {\n        _this.oncue(_this.cue);\n      }\n\n      _this.cue = null;\n      // Enter BADWEBVTT state if header was not parsed correctly otherwise\n      // another exception occurred so enter BADCUE state.\n      _this.state = _this.state === 'INITIAL' ? 'BADWEBVTT' : 'BADCUE';\n    }\n    return this;\n  }\n\n  flush(): VTTParser {\n    const _this = this;\n    try {\n      // Finish decoding the stream.\n      // _this.buffer += _this.decoder.decode();\n      // Synthesize the end of the current cue or region.\n      if (_this.cue || _this.state === 'HEADER') {\n        _this.buffer += '\\n\\n';\n        _this.parse();\n      }\n      // If we've flushed, parsed, and we're still on the INITIAL state then\n      // that means we don't have enough of the stream to parse the first\n      // line.\n      if (_this.state === 'INITIAL' || _this.state === 'BADWEBVTT') {\n        throw new Error('Malformed WebVTT signature.');\n      }\n    } catch (e) {\n      if (_this.onparsingerror) {\n        _this.onparsingerror(e);\n      }\n    }\n    if (_this.onflush) {\n      _this.onflush();\n    }\n\n    return this;\n  }\n}\n", "import { utf8ArrayToStr } from '@svta/common-media-library/utils/utf8ArrayToStr';\nimport { hash } from './hash';\nimport { toMpegTsClockFromTimescale } from './timescale-conversion';\nimport { VTTParser } from './vttparser';\nimport { normalizePts } from '../remux/mp4-remuxer';\nimport type { TimestampOffset } from './timescale-conversion';\nimport type { VTTCCs } from '../types/vtt';\n\nconst LINEBREAKS = /\\r\\n|\\n\\r|\\n|\\r/g;\n\n// String.prototype.startsWith is not supported in IE11\nconst startsWith = function (\n  inputString: string,\n  searchString: string,\n  position: number = 0,\n) {\n  return (\n    inputString.slice(position, position + searchString.length) === searchString\n  );\n};\n\nconst cueString2millis = function (timeString: string) {\n  let ts = parseInt(timeString.slice(-3));\n  const secs = parseInt(timeString.slice(-6, -4));\n  const mins = parseInt(timeString.slice(-9, -7));\n  const hours =\n    timeString.length > 9\n      ? parseInt(timeString.substring(0, timeString.indexOf(':')))\n      : 0;\n\n  if (\n    !Number.isFinite(ts) ||\n    !Number.isFinite(secs) ||\n    !Number.isFinite(mins) ||\n    !Number.isFinite(hours)\n  ) {\n    throw Error(`Malformed X-TIMESTAMP-MAP: Local:${timeString}`);\n  }\n\n  ts += 1000 * secs;\n  ts += 60 * 1000 * mins;\n  ts += 60 * 60 * 1000 * hours;\n\n  return ts;\n};\n\n// Create a unique hash id for a cue based on start/end times and text.\n// This helps timeline-controller to avoid showing repeated captions.\nexport function generateCueId(\n  startTime: number,\n  endTime: number,\n  text: string,\n) {\n  return hash(startTime.toString()) + hash(endTime.toString()) + hash(text);\n}\n\nconst calculateOffset = function (vttCCs: VTTCCs, cc, presentationTime) {\n  let currCC = vttCCs[cc];\n  let prevCC = vttCCs[currCC.prevCC];\n\n  // This is the first discontinuity or cues have been processed since the last discontinuity\n  // Offset = current discontinuity time\n  if (!prevCC || (!prevCC.new && currCC.new)) {\n    vttCCs.ccOffset = vttCCs.presentationOffset = currCC.start;\n    currCC.new = false;\n    return;\n  }\n\n  // There have been discontinuities since cues were last parsed.\n  // Offset = time elapsed\n  while (prevCC?.new) {\n    vttCCs.ccOffset += currCC.start - prevCC.start;\n    currCC.new = false;\n    currCC = prevCC;\n    prevCC = vttCCs[currCC.prevCC];\n  }\n\n  vttCCs.presentationOffset = presentationTime;\n};\n\nexport function parseWebVTT(\n  vttByteArray: ArrayBuffer,\n  initPTS: TimestampOffset | undefined,\n  vttCCs: VTTCCs,\n  cc: number,\n  timeOffset: number,\n  callBack: (cues: VTTCue[]) => void,\n  errorCallBack: (error: Error) => void,\n) {\n  const parser = new VTTParser();\n  // Convert byteArray into string, replacing any somewhat exotic linefeeds with \"\\n\", then split on that character.\n  // Uint8Array.prototype.reduce is not implemented in IE11\n  const vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray))\n    .trim()\n    .replace(LINEBREAKS, '\\n')\n    .split('\\n');\n  const cues: VTTCue[] = [];\n  const init90kHz = initPTS\n    ? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale)\n    : 0;\n  let cueTime = '00:00.000';\n  let timestampMapMPEGTS = 0;\n  let timestampMapLOCAL = 0;\n  let parsingError: Error;\n  let inHeader = true;\n\n  parser.oncue = function (cue: VTTCue) {\n    // Adjust cue timing; clamp cues to start no earlier than - and drop cues that don't end after - 0 on timeline.\n    const currCC = vttCCs[cc];\n    let cueOffset = vttCCs.ccOffset;\n\n    // Calculate subtitle PTS offset\n    const webVttMpegTsMapOffset = (timestampMapMPEGTS - init90kHz) / 90000;\n\n    // Update offsets for new discontinuities\n    if (currCC?.new) {\n      if (timestampMapLOCAL !== undefined) {\n        // When local time is provided, offset = discontinuity start time - local time\n        cueOffset = vttCCs.ccOffset = currCC.start;\n      } else {\n        calculateOffset(vttCCs, cc, webVttMpegTsMapOffset);\n      }\n    }\n    if (webVttMpegTsMapOffset) {\n      if (!initPTS) {\n        parsingError = new Error('Missing initPTS for VTT MPEGTS');\n        return;\n      }\n      // If we have MPEGTS, offset = presentation time + discontinuity offset\n      cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;\n    }\n\n    const duration = cue.endTime - cue.startTime;\n    const startTime =\n      normalizePts(\n        (cue.startTime + cueOffset - timestampMapLOCAL) * 90000,\n        timeOffset * 90000,\n      ) / 90000;\n    cue.startTime = Math.max(startTime, 0);\n    cue.endTime = Math.max(startTime + duration, 0);\n\n    //trim trailing webvtt block whitespaces\n    const text = cue.text.trim();\n\n    // Fix encoding of special characters\n    cue.text = decodeURIComponent(encodeURIComponent(text));\n\n    // If the cue was not assigned an id from the VTT file (line above the content), create one.\n    if (!cue.id) {\n      cue.id = generateCueId(cue.startTime, cue.endTime, text);\n    }\n\n    if (cue.endTime > 0) {\n      cues.push(cue);\n    }\n  };\n\n  parser.onparsingerror = function (error: Error) {\n    parsingError = error;\n  };\n\n  parser.onflush = function () {\n    if (parsingError) {\n      errorCallBack(parsingError);\n      return;\n    }\n    callBack(cues);\n  };\n\n  // Go through contents line by line.\n  vttLines.forEach((line) => {\n    if (inHeader) {\n      // Look for X-TIMESTAMP-MAP in header.\n      if (startsWith(line, 'X-TIMESTAMP-MAP=')) {\n        // Once found, no more are allowed anyway, so stop searching.\n        inHeader = false;\n        // Extract LOCAL and MPEGTS.\n        line\n          .slice(16)\n          .split(',')\n          .forEach((timestamp) => {\n            if (startsWith(timestamp, 'LOCAL:')) {\n              cueTime = timestamp.slice(6);\n            } else if (startsWith(timestamp, 'MPEGTS:')) {\n              timestampMapMPEGTS = parseInt(timestamp.slice(7));\n            }\n          });\n        try {\n          // Convert cue time to seconds\n          timestampMapLOCAL = cueString2millis(cueTime) / 1000;\n        } catch (error) {\n          parsingError = error;\n        }\n        // Return without parsing X-TIMESTAMP-MAP line.\n        return;\n      } else if (line === '') {\n        inHeader = false;\n      }\n    }\n    // Parse line by default.\n    parser.parse(line + '\\n');\n  });\n\n  parser.flush();\n}\n", "import { utf8ArrayToStr } from '@svta/common-media-library/utils/utf8ArrayToStr';\nimport { findBox } from './mp4-tools';\nimport { toTimescaleFromScale } from './timescale-conversion';\nimport VTTCue from './vttcue';\nimport { parseTimeStamp } from './vttparser';\nimport { generateCueId } from './webvtt-parser';\nimport type { TimestampOffset } from './timescale-conversion';\n\nexport const IMSC1_CODEC = 'stpp.ttml.im1t';\n\n// Time format: h:m:s:frames(.subframes)\nconst HMSF_REGEX = /^(\\d{2,}):(\\d{2}):(\\d{2}):(\\d{2})\\.?(\\d+)?$/;\n\n// Time format: hours, minutes, seconds, milliseconds, frames, ticks\nconst TIME_UNIT_REGEX = /^(\\d*(?:\\.\\d*)?)(h|m|s|ms|f|t)$/;\n\nconst textAlignToLineAlign: Partial<Record<string, LineAlignSetting>> = {\n  left: 'start',\n  center: 'center',\n  right: 'end',\n  start: 'start',\n  end: 'end',\n};\n\nexport function parseIMSC1(\n  payload: ArrayBuffer,\n  initPTS: TimestampOffset,\n  callBack: (cues: Array<VTTCue>) => any,\n  errorCallBack: (error: Error) => any,\n) {\n  const results = findBox(new Uint8Array(payload), ['mdat']);\n  if (results.length === 0) {\n    errorCallBack(new Error('Could not parse IMSC1 mdat'));\n    return;\n  }\n\n  const ttmlList = results.map((mdat) => utf8ArrayToStr(mdat));\n\n  const syncTime = toTimescaleFromScale(initPTS.baseTime, 1, initPTS.timescale);\n\n  try {\n    ttmlList.forEach((ttml) => callBack(parseTTML(ttml, syncTime)));\n  } catch (error) {\n    errorCallBack(error);\n  }\n}\n\nfunction parseTTML(ttml: string, syncTime: number): Array<VTTCue> {\n  const parser = new DOMParser();\n  const xmlDoc = parser.parseFromString(ttml, 'text/xml');\n  const tt = xmlDoc.getElementsByTagName('tt')[0];\n  if (!tt) {\n    throw new Error('Invalid ttml');\n  }\n  const defaultRateInfo = {\n    frameRate: 30,\n    subFrameRate: 1,\n    frameRateMultiplier: 0,\n    tickRate: 0,\n  };\n  const rateInfo: Object = Object.keys(defaultRateInfo).reduce(\n    (result, key) => {\n      result[key] = tt.getAttribute(`ttp:${key}`) || defaultRateInfo[key];\n      return result;\n    },\n    {},\n  );\n\n  const trim = tt.getAttribute('xml:space') !== 'preserve';\n\n  const styleElements = collectionToDictionary(\n    getElementCollection(tt, 'styling', 'style'),\n  );\n  const regionElements = collectionToDictionary(\n    getElementCollection(tt, 'layout', 'region'),\n  );\n  const cueElements = getElementCollection(tt, 'body', '[begin]');\n\n  return [].map\n    .call(cueElements, (cueElement) => {\n      const cueText = getTextContent(cueElement, trim);\n\n      if (!cueText || !cueElement.hasAttribute('begin')) {\n        return null;\n      }\n      const startTime = parseTtmlTime(\n        cueElement.getAttribute('begin'),\n        rateInfo,\n      );\n      const duration = parseTtmlTime(cueElement.getAttribute('dur'), rateInfo);\n      let endTime = parseTtmlTime(cueElement.getAttribute('end'), rateInfo);\n      if (startTime === null) {\n        throw timestampParsingError(cueElement);\n      }\n      if (endTime === null) {\n        if (duration === null) {\n          throw timestampParsingError(cueElement);\n        }\n        endTime = startTime + duration;\n      }\n      const cue = new VTTCue(startTime - syncTime, endTime - syncTime, cueText);\n      cue.id = generateCueId(cue.startTime, cue.endTime, cue.text);\n\n      const region = regionElements[cueElement.getAttribute('region')];\n      const style = styleElements[cueElement.getAttribute('style')];\n\n      // Apply styles to cue\n      const styles = getTtmlStyles(region, style, styleElements);\n      const { textAlign } = styles;\n      if (textAlign) {\n        // cue.positionAlign not settable in FF~2016\n        const lineAlign = textAlignToLineAlign[textAlign];\n        if (lineAlign) {\n          cue.lineAlign = lineAlign;\n        }\n        cue.align = textAlign as AlignSetting;\n      }\n      Object.assign(cue, styles);\n\n      return cue;\n    })\n    .filter((cue) => cue !== null);\n}\n\nfunction getElementCollection(\n  fromElement,\n  parentName,\n  childName,\n): Array<HTMLElement> {\n  const parent = fromElement.getElementsByTagName(parentName)[0];\n  if (parent) {\n    return [].slice.call(parent.querySelectorAll(childName));\n  }\n  return [];\n}\n\nfunction collectionToDictionary(elementsWithId: Array<HTMLElement>): {\n  [id: string]: HTMLElement;\n} {\n  return elementsWithId.reduce((dict, element: HTMLElement) => {\n    const id = element.getAttribute('xml:id');\n    if (id) {\n      dict[id] = element;\n    }\n    return dict;\n  }, {});\n}\n\nfunction getTextContent(element, trim): string {\n  return [].slice.call(element.childNodes).reduce((str, node, i) => {\n    if (node.nodeName === 'br' && i) {\n      return str + '\\n';\n    }\n    if (node.childNodes?.length) {\n      return getTextContent(node, trim);\n    } else if (trim) {\n      return str + node.textContent.trim().replace(/\\s+/g, ' ');\n    }\n    return str + node.textContent;\n  }, '');\n}\n\nfunction getTtmlStyles(\n  region,\n  style,\n  styleElements,\n): { [style: string]: string } {\n  const ttsNs = 'http://www.w3.org/ns/ttml#styling';\n  let regionStyle = null;\n  const styleAttributes = [\n    'displayAlign',\n    'textAlign',\n    'color',\n    'backgroundColor',\n    'fontSize',\n    'fontFamily',\n    // 'fontWeight',\n    // 'lineHeight',\n    // 'wrapOption',\n    // 'fontStyle',\n    // 'direction',\n    // 'writingMode'\n  ];\n\n  const regionStyleName = region?.hasAttribute('style')\n    ? region.getAttribute('style')\n    : null;\n\n  if (regionStyleName && styleElements.hasOwnProperty(regionStyleName)) {\n    regionStyle = styleElements[regionStyleName];\n  }\n\n  return styleAttributes.reduce((styles, name) => {\n    const value =\n      getAttributeNS(style, ttsNs, name) ||\n      getAttributeNS(region, ttsNs, name) ||\n      getAttributeNS(regionStyle, ttsNs, name);\n    if (value) {\n      styles[name] = value;\n    }\n    return styles;\n  }, {});\n}\n\nfunction getAttributeNS(element, ns, name): string | null {\n  if (!element) {\n    return null;\n  }\n  return element.hasAttributeNS(ns, name)\n    ? element.getAttributeNS(ns, name)\n    : null;\n}\n\nfunction timestampParsingError(node) {\n  return new Error(`Could not parse ttml timestamp ${node}`);\n}\n\nfunction parseTtmlTime(timeAttributeValue, rateInfo): number | null {\n  if (!timeAttributeValue) {\n    return null;\n  }\n  let seconds: number | null = parseTimeStamp(timeAttributeValue);\n  if (seconds === null) {\n    if (HMSF_REGEX.test(timeAttributeValue)) {\n      seconds = parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo);\n    } else if (TIME_UNIT_REGEX.test(timeAttributeValue)) {\n      seconds = parseTimeUnits(timeAttributeValue, rateInfo);\n    }\n  }\n  return seconds;\n}\n\nfunction parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo): number {\n  const m = HMSF_REGEX.exec(timeAttributeValue) as Array<any>;\n  const frames = (m[4] | 0) + (m[5] | 0) / rateInfo.subFrameRate;\n  return (\n    (m[1] | 0) * 3600 +\n    (m[2] | 0) * 60 +\n    (m[3] | 0) +\n    frames / rateInfo.frameRate\n  );\n}\n\nfunction parseTimeUnits(timeAttributeValue, rateInfo): number {\n  const m = TIME_UNIT_REGEX.exec(timeAttributeValue) as Array<any>;\n  const value = Number(m[1]);\n  const unit = m[2];\n  switch (unit) {\n    case 'h':\n      return value * 3600;\n    case 'm':\n      return value * 60;\n    case 'ms':\n      return value * 1000;\n    case 'f':\n      return value / rateInfo.frameRate;\n    case 't':\n      return value / rateInfo.tickRate;\n  }\n  return value;\n}\n", "import type { CaptionScreen } from './cea-608-parser';\nimport type { TimelineController } from '../controller/timeline-controller';\n\nexport default class OutputFilter {\n  private timelineController: TimelineController;\n  private cueRanges: Array<[number, number]> = [];\n  private trackName: string;\n  private startTime: number | null = null;\n  private endTime: number | null = null;\n  private screen: CaptionScreen | null = null;\n\n  constructor(timelineController: TimelineController, trackName: string) {\n    this.timelineController = timelineController;\n    this.trackName = trackName;\n  }\n\n  dispatchCue() {\n    if (this.startTime === null) {\n      return;\n    }\n\n    this.timelineController.addCues(\n      this.trackName,\n      this.startTime,\n      this.endTime as number,\n      this.screen as CaptionScreen,\n      this.cueRanges,\n    );\n    this.startTime = null;\n  }\n\n  newCue(startTime: number, endTime: number, screen: CaptionScreen) {\n    if (this.startTime === null || this.startTime > startTime) {\n      this.startTime = startTime;\n    }\n\n    this.endTime = endTime;\n    this.screen = screen;\n    this.timelineController.createCaptionsTrack(this.trackName);\n  }\n\n  reset() {\n    this.cueRanges = [];\n    this.startTime = null;\n  }\n}\n", "import { Events } from '../events';\nimport { PlaylistLevelType } from '../types/loader';\nimport Cea608Parser from '../utils/cea-608-parser';\nimport { IMSC1_CODEC, parseIMSC1 } from '../utils/imsc1-ttml-parser';\nimport {\n  subtitleOptionsIdentical,\n  subtitleTrackMatchesTextTrack,\n} from '../utils/media-option-attributes';\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport OutputFilter from '../utils/output-filter';\nimport {\n  addCueToTrack,\n  clearCurrentCues,\n  filterSubtitleTracks,\n  removeCuesInRange,\n  sendAddTrackEvent,\n} from '../utils/texttrack-utils';\nimport { parseWebVTT } from '../utils/webvtt-parser';\nimport type { HlsConfig } from '../config';\nimport type Hls from '../hls';\nimport type { Fragment } from '../loader/fragment';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  BufferFlushingData,\n  FragDecryptedData,\n  FragLoadedData,\n  FragLoadingData,\n  FragParsingUserdataData,\n  InitPTSFoundData,\n  ManifestLoadedData,\n  MediaAttachingData,\n  MediaDetachingData,\n  SubtitleTracksUpdatedData,\n} from '../types/events';\nimport type { MediaPlaylist } from '../types/media-playlist';\nimport type { VTTCCs } from '../types/vtt';\nimport type { CaptionScreen } from '../utils/cea-608-parser';\nimport type { CuesInterface } from '../utils/cues';\nimport type { TimestampOffset } from '../utils/timescale-conversion';\n\ntype TrackProperties = {\n  label: string;\n  languageCode: string;\n  media?: MediaPlaylist;\n};\n\ntype NonNativeCaptionsTrack = {\n  _id?: string;\n  label: string;\n  kind: string;\n  default: boolean;\n  closedCaptions?: MediaPlaylist;\n  subtitleTrack?: MediaPlaylist;\n};\n\nexport class TimelineController implements ComponentAPI {\n  private hls: Hls;\n  private media: HTMLMediaElement | null = null;\n  private config: HlsConfig;\n  private enabled: boolean = true;\n  private Cues: CuesInterface;\n  private textTracks: Array<TextTrack> = [];\n  private tracks: Array<MediaPlaylist> = [];\n  private initPTS: TimestampOffset[] = [];\n  private unparsedVttFrags: Array<FragLoadedData | FragDecryptedData> = [];\n  private captionsTracks: Record<string, TextTrack> = {};\n  private nonNativeCaptionsTracks: Record<string, NonNativeCaptionsTrack> = {};\n  private cea608Parser1?: Cea608Parser;\n  private cea608Parser2?: Cea608Parser;\n  private lastCc: number = -1; // Last video (CEA-608) fragment CC\n  private lastSn: number = -1; // Last video (CEA-608) fragment MSN\n  private lastPartIndex: number = -1; // Last video (CEA-608) fragment Part Index\n  private prevCC: number = -1; // Last subtitle fragment CC\n  private vttCCs: VTTCCs = newVTTCCs();\n  private captionsProperties: {\n    textTrack1: TrackProperties;\n    textTrack2: TrackProperties;\n    textTrack3: TrackProperties;\n    textTrack4: TrackProperties;\n  };\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n    this.config = hls.config;\n    this.Cues = hls.config.cueHandler;\n\n    this.captionsProperties = {\n      textTrack1: {\n        label: this.config.captionsTextTrack1Label,\n        languageCode: this.config.captionsTextTrack1LanguageCode,\n      },\n      textTrack2: {\n        label: this.config.captionsTextTrack2Label,\n        languageCode: this.config.captionsTextTrack2LanguageCode,\n      },\n      textTrack3: {\n        label: this.config.captionsTextTrack3Label,\n        languageCode: this.config.captionsTextTrack3LanguageCode,\n      },\n      textTrack4: {\n        label: this.config.captionsTextTrack4Label,\n        languageCode: this.config.captionsTextTrack4LanguageCode,\n      },\n    };\n\n    hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.on(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n    hls.on(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n    hls.on(Events.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this);\n    hls.on(Events.FRAG_DECRYPTED, this.onFragDecrypted, this);\n    hls.on(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n    hls.on(Events.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this);\n    hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n\n  public destroy(): void {\n    const { hls } = this;\n    hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.off(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n    hls.off(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n    hls.off(Events.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this);\n    hls.off(Events.FRAG_DECRYPTED, this.onFragDecrypted, this);\n    hls.off(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n    hls.off(Events.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this);\n    hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    // @ts-ignore\n    this.hls = this.config = this.media = null;\n    this.cea608Parser1 = this.cea608Parser2 = undefined;\n  }\n\n  private initCea608Parsers() {\n    const channel1 = new OutputFilter(this, 'textTrack1');\n    const channel2 = new OutputFilter(this, 'textTrack2');\n    const channel3 = new OutputFilter(this, 'textTrack3');\n    const channel4 = new OutputFilter(this, 'textTrack4');\n    this.cea608Parser1 = new Cea608Parser(1, channel1, channel2);\n    this.cea608Parser2 = new Cea608Parser(3, channel3, channel4);\n  }\n\n  public addCues(\n    trackName: string,\n    startTime: number,\n    endTime: number,\n    screen: CaptionScreen,\n    cueRanges: Array<[number, number]>,\n  ) {\n    // skip cues which overlap more than 50% with previously parsed time ranges\n    let merged = false;\n    for (let i = cueRanges.length; i--; ) {\n      const cueRange = cueRanges[i];\n      const overlap = intersection(\n        cueRange[0],\n        cueRange[1],\n        startTime,\n        endTime,\n      );\n      if (overlap >= 0) {\n        cueRange[0] = Math.min(cueRange[0], startTime);\n        cueRange[1] = Math.max(cueRange[1], endTime);\n        merged = true;\n        if (overlap / (endTime - startTime) > 0.5) {\n          return;\n        }\n      }\n    }\n    if (!merged) {\n      cueRanges.push([startTime, endTime]);\n    }\n\n    if (this.config.renderTextTracksNatively) {\n      const track = this.captionsTracks[trackName];\n      this.Cues.newCue(track, startTime, endTime, screen);\n    } else {\n      const cues = this.Cues.newCue(null, startTime, endTime, screen);\n      this.hls.trigger(Events.CUES_PARSED, {\n        type: 'captions',\n        cues,\n        track: trackName,\n      });\n    }\n  }\n\n  // Triggered when an initial PTS is found; used for synchronisation of WebVTT.\n  private onInitPtsFound(\n    event: Events.INIT_PTS_FOUND,\n    { frag, id, initPTS, timescale, trackId }: InitPTSFoundData,\n  ) {\n    const { unparsedVttFrags } = this;\n    if (id === PlaylistLevelType.MAIN) {\n      this.initPTS[frag.cc] = { baseTime: initPTS, timescale, trackId };\n    }\n\n    // Due to asynchronous processing, initial PTS may arrive later than the first VTT fragments are loaded.\n    // Parse any unparsed fragments upon receiving the initial PTS.\n    if (unparsedVttFrags.length) {\n      this.unparsedVttFrags = [];\n      unparsedVttFrags.forEach((data) => {\n        if (this.initPTS[data.frag.cc]) {\n          this.onFragLoaded(Events.FRAG_LOADED, data as FragLoadedData);\n        } else {\n          this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n            success: false,\n            frag: data.frag,\n            error: new Error(\n              'Subtitle discontinuity domain does not match main',\n            ),\n          });\n        }\n      });\n    }\n  }\n\n  private getExistingTrack(label: string, language: string): TextTrack | null {\n    const { media } = this;\n    if (media) {\n      for (let i = 0; i < media.textTracks.length; i++) {\n        const textTrack = media.textTracks[i];\n        if (\n          canReuseVttTextTrack(textTrack, {\n            name: label,\n            lang: language,\n            characteristics:\n              'transcribes-spoken-dialog,describes-music-and-sound',\n            attrs: {} as any,\n          })\n        ) {\n          return textTrack;\n        }\n      }\n    }\n    return null;\n  }\n\n  public createCaptionsTrack(trackName: string) {\n    if (this.config.renderTextTracksNatively) {\n      this.createNativeTrack(trackName);\n    } else {\n      this.createNonNativeTrack(trackName);\n    }\n  }\n\n  private createNativeTrack(trackName: string) {\n    if (this.captionsTracks[trackName]) {\n      return;\n    }\n    const { captionsProperties, captionsTracks, media } = this;\n    const { label, languageCode } = captionsProperties[trackName];\n    // Enable reuse of existing text track.\n    const existingTrack = this.getExistingTrack(label, languageCode);\n    if (!existingTrack) {\n      const textTrack = this.createTextTrack('captions', label, languageCode);\n      if (textTrack) {\n        // Set a special property on the track so we know it's managed by Hls.js\n        textTrack[trackName] = true;\n        captionsTracks[trackName] = textTrack;\n      }\n    } else {\n      captionsTracks[trackName] = existingTrack;\n      clearCurrentCues(captionsTracks[trackName]);\n      sendAddTrackEvent(captionsTracks[trackName], media as HTMLMediaElement);\n    }\n  }\n\n  private createNonNativeTrack(trackName: string) {\n    if (this.nonNativeCaptionsTracks[trackName]) {\n      return;\n    }\n    // Create a list of a single track for the provider to consume\n    const trackProperties: TrackProperties = this.captionsProperties[trackName];\n    if (!trackProperties) {\n      return;\n    }\n    const label = trackProperties.label as string;\n    const track = {\n      _id: trackName,\n      label,\n      kind: 'captions',\n      default: trackProperties.media ? !!trackProperties.media.default : false,\n      closedCaptions: trackProperties.media,\n    };\n    this.nonNativeCaptionsTracks[trackName] = track;\n    this.hls.trigger(Events.NON_NATIVE_TEXT_TRACKS_FOUND, { tracks: [track] });\n  }\n\n  private createTextTrack(\n    kind: TextTrackKind,\n    label: string,\n    lang?: string,\n  ): TextTrack | undefined {\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    return media.addTextTrack(kind, label, lang);\n  }\n\n  private onMediaAttaching(\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ) {\n    this.media = data.media;\n    if (!data.mediaSource) {\n      this._cleanTracks();\n    }\n  }\n\n  private onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    const transferringMedia = !!data.transferMedia;\n    this.media = null;\n    if (transferringMedia) {\n      return;\n    }\n\n    const { captionsTracks } = this;\n    Object.keys(captionsTracks).forEach((trackName) => {\n      clearCurrentCues(captionsTracks[trackName]);\n      delete captionsTracks[trackName];\n    });\n    this.nonNativeCaptionsTracks = {};\n  }\n\n  private onManifestLoading() {\n    // Detect discontinuity in video fragment (CEA-608) parsing\n    this.lastCc = -1;\n    this.lastSn = -1;\n    this.lastPartIndex = -1;\n    // Detect discontinuity in subtitle manifests\n    this.prevCC = -1;\n    this.vttCCs = newVTTCCs();\n    // Reset tracks\n    this._cleanTracks();\n    this.tracks = [];\n    this.captionsTracks = {};\n    this.nonNativeCaptionsTracks = {};\n    this.textTracks = [];\n    this.unparsedVttFrags = [];\n    this.initPTS = [];\n    if (this.cea608Parser1 && this.cea608Parser2) {\n      this.cea608Parser1.reset();\n      this.cea608Parser2.reset();\n    }\n  }\n\n  private _cleanTracks() {\n    // clear outdated subtitles\n    const { media } = this;\n    if (!media) {\n      return;\n    }\n    const textTracks = media.textTracks;\n    if (textTracks) {\n      for (let i = 0; i < textTracks.length; i++) {\n        clearCurrentCues(textTracks[i]);\n      }\n    }\n  }\n\n  private onSubtitleTracksUpdated(\n    event: Events.SUBTITLE_TRACKS_UPDATED,\n    data: SubtitleTracksUpdatedData,\n  ) {\n    const tracks: Array<MediaPlaylist> = data.subtitleTracks || [];\n    const hasIMSC1 = tracks.some((track) => track.textCodec === IMSC1_CODEC);\n    if (this.config.enableWebVTT || (hasIMSC1 && this.config.enableIMSC1)) {\n      const listIsIdentical = subtitleOptionsIdentical(this.tracks, tracks);\n      if (listIsIdentical) {\n        this.tracks = tracks;\n        return;\n      }\n      this.textTracks = [];\n      this.tracks = tracks;\n\n      if (this.config.renderTextTracksNatively) {\n        const media = this.media;\n        const inUseTracks: (TextTrack | null)[] | null = media\n          ? filterSubtitleTracks(media.textTracks)\n          : null;\n\n        this.tracks.forEach((track, index) => {\n          // Reuse tracks with the same label and lang, but do not reuse 608/708 tracks\n          let textTrack: TextTrack | undefined;\n          if (inUseTracks) {\n            let inUseTrack: TextTrack | null = null;\n            for (let i = 0; i < inUseTracks.length; i++) {\n              if (\n                inUseTracks[i] &&\n                canReuseVttTextTrack(inUseTracks[i], track)\n              ) {\n                inUseTrack = inUseTracks[i];\n                inUseTracks[i] = null;\n                break;\n              }\n            }\n            if (inUseTrack) {\n              textTrack = inUseTrack;\n            }\n          }\n          if (textTrack) {\n            clearCurrentCues(textTrack);\n          } else {\n            const textTrackKind = captionsOrSubtitlesFromCharacteristics(track);\n            textTrack = this.createTextTrack(\n              textTrackKind,\n              track.name,\n              track.lang,\n            );\n            if (textTrack) {\n              textTrack.mode = 'disabled';\n            }\n          }\n          if (textTrack) {\n            this.textTracks.push(textTrack);\n          }\n        });\n        // Warn when video element has captions or subtitle TextTracks carried over from another source\n        if (inUseTracks?.length) {\n          const unusedTextTracks = inUseTracks\n            .filter((t) => t !== null)\n            .map((t) => (t as TextTrack).label);\n          if (unusedTextTracks.length) {\n            this.hls.logger.warn(\n              `Media element contains unused subtitle tracks: ${unusedTextTracks.join(\n                ', ',\n              )}. Replace media element for each source to clear TextTracks and captions menu.`,\n            );\n          }\n        }\n      } else if (this.tracks.length) {\n        // Create a list of tracks for the provider to consume\n        const tracksList = this.tracks.map((track) => {\n          return {\n            label: track.name,\n            kind: track.type.toLowerCase(),\n            default: track.default,\n            subtitleTrack: track,\n          };\n        });\n        this.hls.trigger(Events.NON_NATIVE_TEXT_TRACKS_FOUND, {\n          tracks: tracksList,\n        });\n      }\n    }\n  }\n\n  private onManifestLoaded(\n    event: Events.MANIFEST_LOADED,\n    data: ManifestLoadedData,\n  ) {\n    if (this.config.enableCEA708Captions && data.captions) {\n      data.captions.forEach((captionsTrack) => {\n        const instreamIdMatch = /(?:CC|SERVICE)([1-4])/.exec(\n          captionsTrack.instreamId as string,\n        );\n        if (!instreamIdMatch) {\n          return;\n        }\n        const trackName = `textTrack${instreamIdMatch[1]}`;\n        const trackProperties: TrackProperties =\n          this.captionsProperties[trackName];\n        if (!trackProperties) {\n          return;\n        }\n        trackProperties.label = captionsTrack.name;\n        if (captionsTrack.lang) {\n          // optional attribute\n          trackProperties.languageCode = captionsTrack.lang;\n        }\n        trackProperties.media = captionsTrack;\n      });\n    }\n  }\n\n  private closedCaptionsForLevel(frag: Fragment): string | undefined {\n    const level = this.hls.levels[frag.level];\n    return level?.attrs['CLOSED-CAPTIONS'];\n  }\n\n  private onFragLoading(event: Events.FRAG_LOADING, data: FragLoadingData) {\n    // if this frag isn't contiguous, clear the parser so cues with bad start/end times aren't added to the textTrack\n    if (this.enabled && data.frag.type === PlaylistLevelType.MAIN) {\n      const { cea608Parser1, cea608Parser2, lastSn } = this;\n      const { cc, sn } = data.frag;\n      const partIndex = data.part?.index ?? -1;\n      if (cea608Parser1 && cea608Parser2) {\n        if (\n          sn !== lastSn + 1 ||\n          (sn === lastSn && partIndex !== this.lastPartIndex + 1) ||\n          cc !== this.lastCc\n        ) {\n          cea608Parser1.reset();\n          cea608Parser2.reset();\n        }\n      }\n      this.lastCc = cc as number;\n      this.lastSn = sn as number;\n      this.lastPartIndex = partIndex;\n    }\n  }\n\n  private onFragLoaded(\n    event: Events.FRAG_LOADED,\n    data: FragDecryptedData | FragLoadedData,\n  ) {\n    const { frag, payload } = data;\n    if (frag.type === PlaylistLevelType.SUBTITLE) {\n      // If fragment is subtitle type, parse as WebVTT.\n      if (payload.byteLength) {\n        const decryptData = frag.decryptdata;\n        // fragment after decryption has a stats object\n        const decrypted = 'stats' in data;\n        // If the subtitles are not encrypted, parse VTTs now. Otherwise, we need to wait.\n        if (decryptData == null || !decryptData.encrypted || decrypted) {\n          const trackPlaylistMedia = this.tracks[frag.level];\n          const vttCCs = this.vttCCs;\n          if (!vttCCs[frag.cc]) {\n            vttCCs[frag.cc] = {\n              start: frag.start,\n              prevCC: this.prevCC,\n              new: true,\n            };\n            this.prevCC = frag.cc;\n          }\n          if (\n            trackPlaylistMedia &&\n            trackPlaylistMedia.textCodec === IMSC1_CODEC\n          ) {\n            this._parseIMSC1(frag, payload);\n          } else {\n            this._parseVTTs(data);\n          }\n        }\n      } else {\n        // In case there is no payload, finish unsuccessfully.\n        this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n          success: false,\n          frag,\n          error: new Error('Empty subtitle payload'),\n        });\n      }\n    }\n  }\n\n  private _parseIMSC1(frag: Fragment, payload: ArrayBuffer) {\n    const hls = this.hls;\n    parseIMSC1(\n      payload,\n      this.initPTS[frag.cc],\n      (cues) => {\n        this._appendCues(cues, frag.level);\n        hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n          success: true,\n          frag: frag,\n        });\n      },\n      (error) => {\n        hls.logger.log(`Failed to parse IMSC1: ${error}`);\n        hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n          success: false,\n          frag: frag,\n          error,\n        });\n      },\n    );\n  }\n\n  private _parseVTTs(data: FragDecryptedData | FragLoadedData) {\n    const { frag, payload } = data;\n    // We need an initial synchronisation PTS. Store fragments as long as none has arrived\n    const { initPTS, unparsedVttFrags } = this;\n    const maxAvCC = initPTS.length - 1;\n    if (!initPTS[frag.cc] && maxAvCC === -1) {\n      unparsedVttFrags.push(data);\n      return;\n    }\n\n    const hls = this.hls;\n    // Parse the WebVTT file contents.\n    const payloadWebVTT = frag.initSegment?.data\n      ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)).buffer\n      : payload;\n    parseWebVTT(\n      payloadWebVTT,\n      this.initPTS[frag.cc],\n      this.vttCCs,\n      frag.cc,\n      frag.start,\n      (cues) => {\n        this._appendCues(cues, frag.level);\n        hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n          success: true,\n          frag: frag,\n        });\n      },\n      (error) => {\n        const missingInitPTS =\n          error.message === 'Missing initPTS for VTT MPEGTS';\n        if (missingInitPTS) {\n          unparsedVttFrags.push(data);\n        } else {\n          this._fallbackToIMSC1(frag, payload);\n        }\n        // Something went wrong while parsing. Trigger event with success false.\n        hls.logger.log(`Failed to parse VTT cue: ${error}`);\n        if (missingInitPTS && maxAvCC > frag.cc) {\n          return;\n        }\n        hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n          success: false,\n          frag: frag,\n          error,\n        });\n      },\n    );\n  }\n\n  private _fallbackToIMSC1(frag: Fragment, payload: ArrayBuffer) {\n    // If textCodec is unknown, try parsing as IMSC1. Set textCodec based on the result\n    const trackPlaylistMedia = this.tracks[frag.level];\n    if (!trackPlaylistMedia.textCodec) {\n      parseIMSC1(\n        payload,\n        this.initPTS[frag.cc],\n        () => {\n          trackPlaylistMedia.textCodec = IMSC1_CODEC;\n          this._parseIMSC1(frag, payload);\n        },\n        () => {\n          trackPlaylistMedia.textCodec = 'wvtt';\n        },\n      );\n    }\n  }\n\n  private _appendCues(cues: VTTCue[], fragLevel: number) {\n    const hls = this.hls;\n    if (this.config.renderTextTracksNatively) {\n      const textTrack = this.textTracks[fragLevel];\n      // WebVTTParser.parse is an async method and if the currently selected text track mode is set to \"disabled\"\n      // before parsing is done then don't try to access currentTrack.cues.getCueById as cues will be null\n      // and trying to access getCueById method of cues will throw an exception\n      // Because we check if the mode is disabled, we can force check `cues` below. They can't be null.\n      if (!textTrack || textTrack.mode === 'disabled') {\n        return;\n      }\n      cues.forEach((cue) => addCueToTrack(textTrack, cue));\n    } else {\n      const currentTrack = this.tracks[fragLevel];\n      if (!currentTrack) {\n        return;\n      }\n      const track = currentTrack.default ? 'default' : 'subtitles' + fragLevel;\n      hls.trigger(Events.CUES_PARSED, { type: 'subtitles', cues, track });\n    }\n  }\n\n  private onFragDecrypted(\n    event: Events.FRAG_DECRYPTED,\n    data: FragDecryptedData,\n  ) {\n    const { frag } = data;\n    if (frag.type === PlaylistLevelType.SUBTITLE) {\n      this.onFragLoaded(Events.FRAG_LOADED, data as unknown as FragLoadedData);\n    }\n  }\n\n  private onSubtitleTracksCleared() {\n    this.tracks = [];\n    this.captionsTracks = {};\n  }\n\n  private onFragParsingUserdata(\n    event: Events.FRAG_PARSING_USERDATA,\n    data: FragParsingUserdataData,\n  ) {\n    if (!this.enabled || !this.config.enableCEA708Captions) {\n      return;\n    }\n    const { frag, samples } = data;\n    if (\n      frag.type === PlaylistLevelType.MAIN &&\n      this.closedCaptionsForLevel(frag) === 'NONE'\n    ) {\n      return;\n    }\n    // If the event contains captions (found in the bytes property), push all bytes into the parser immediately\n    // It will create the proper timestamps based on the PTS value\n    for (let i = 0; i < samples.length; i++) {\n      const ccBytes = samples[i].bytes;\n      if (ccBytes) {\n        if (!this.cea608Parser1) {\n          this.initCea608Parsers();\n        }\n        const ccdatas = this.extractCea608Data(ccBytes);\n        this.cea608Parser1!.addData(samples[i].pts, ccdatas[0]);\n        this.cea608Parser2!.addData(samples[i].pts, ccdatas[1]);\n      }\n    }\n  }\n\n  onBufferFlushing(\n    event: Events.BUFFER_FLUSHING,\n    { startOffset, endOffset, endOffsetSubtitles, type }: BufferFlushingData,\n  ) {\n    const { media } = this;\n    if (!media || media.currentTime < endOffset) {\n      return;\n    }\n    // Clear 608 caption cues from the captions TextTracks when the video back buffer is flushed\n    // Forward cues are never removed because we can loose streamed 608 content from recent fragments\n    if (!type || type === 'video') {\n      const { captionsTracks } = this;\n      Object.keys(captionsTracks).forEach((trackName) =>\n        removeCuesInRange(captionsTracks[trackName], startOffset, endOffset),\n      );\n    }\n    if (this.config.renderTextTracksNatively) {\n      // Clear VTT/IMSC1 subtitle cues from the subtitle TextTracks when the back buffer is flushed\n      if (startOffset === 0 && endOffsetSubtitles !== undefined) {\n        const { textTracks } = this;\n        Object.keys(textTracks).forEach((trackName) =>\n          removeCuesInRange(\n            textTracks[trackName],\n            startOffset,\n            endOffsetSubtitles,\n          ),\n        );\n      }\n    }\n  }\n\n  private extractCea608Data(byteArray: Uint8Array): number[][] {\n    const actualCCBytes: number[][] = [[], []];\n    const count = byteArray[0] & 0x1f;\n    let position = 2;\n\n    for (let j = 0; j < count; j++) {\n      const tmpByte = byteArray[position++];\n      const ccbyte1 = 0x7f & byteArray[position++];\n      const ccbyte2 = 0x7f & byteArray[position++];\n      if (ccbyte1 === 0 && ccbyte2 === 0) {\n        continue;\n      }\n      const ccValid = (0x04 & tmpByte) !== 0; // Support all four channels\n      if (ccValid) {\n        const ccType = 0x03 & tmpByte;\n        if (\n          0x00 /* CEA608 field1*/ === ccType ||\n          0x01 /* CEA608 field2*/ === ccType\n        ) {\n          // Exclude CEA708 CC data.\n          actualCCBytes[ccType].push(ccbyte1);\n          actualCCBytes[ccType].push(ccbyte2);\n        }\n      }\n    }\n    return actualCCBytes;\n  }\n}\n\nfunction captionsOrSubtitlesFromCharacteristics(\n  track: Pick<MediaPlaylist, 'name' | 'lang' | 'attrs' | 'characteristics'>,\n): TextTrackKind {\n  if (track.characteristics) {\n    if (\n      /transcribes-spoken-dialog/gi.test(track.characteristics) &&\n      /describes-music-and-sound/gi.test(track.characteristics)\n    ) {\n      return 'captions';\n    }\n  }\n\n  return 'subtitles';\n}\n\nfunction canReuseVttTextTrack(\n  inUseTrack: TextTrack | null,\n  manifestTrack: Pick<\n    MediaPlaylist,\n    'name' | 'lang' | 'attrs' | 'characteristics'\n  >,\n): boolean {\n  return (\n    !!inUseTrack &&\n    inUseTrack.kind === captionsOrSubtitlesFromCharacteristics(manifestTrack) &&\n    subtitleTrackMatchesTextTrack(manifestTrack, inUseTrack)\n  );\n}\n\nfunction intersection(x1: number, x2: number, y1: number, y2: number): number {\n  return Math.min(x2, y2) - Math.max(x1, y1);\n}\n\nfunction newVTTCCs(): VTTCCs {\n  return {\n    ccOffset: 0,\n    presentationOffset: 0,\n    0: {\n      start: 0,\n      prevCC: -1,\n      new: true,\n    },\n  };\n}\n", "import { addCueToTrack } from './texttrack-utils';\nimport { fixLineBreaks } from './vttparser';\nimport { generateCueId } from './webvtt-parser';\nimport type { CaptionScreen, Row } from './cea-608-parser';\n\nconst WHITESPACE_CHAR = /\\s/;\n\nexport interface CuesInterface {\n  newCue(\n    track: TextTrack | null,\n    startTime: number,\n    endTime: number,\n    captionScreen: CaptionScreen,\n  ): VTTCue[];\n}\n\nconst Cues: CuesInterface = {\n  newCue(\n    track: TextTrack | null,\n    startTime: number,\n    endTime: number,\n    captionScreen: CaptionScreen,\n  ): VTTCue[] {\n    const result: VTTCue[] = [];\n    let row: Row;\n    // the type data states this is VTTCue, but it can potentially be a TextTrackCue on old browsers\n    let cue: VTTCue;\n    let indenting: boolean;\n    let indent: number;\n    let text: string;\n    const Cue = (self.VTTCue || self.TextTrackCue) as any;\n\n    for (let r = 0; r < captionScreen.rows.length; r++) {\n      row = captionScreen.rows[r];\n      indenting = true;\n      indent = 0;\n      text = '';\n\n      if (!row.isEmpty()) {\n        for (let c = 0; c < row.chars.length; c++) {\n          if (WHITESPACE_CHAR.test(row.chars[c].uchar) && indenting) {\n            indent++;\n          } else {\n            text += row.chars[c].uchar;\n            indenting = false;\n          }\n        }\n        // To be used for cleaning-up orphaned roll-up captions\n        row.cueStartTime = startTime;\n\n        // Give a slight bump to the endTime if it's equal to startTime to avoid a SyntaxError in IE\n        if (startTime === endTime) {\n          endTime += 0.0001;\n        }\n\n        if (indent >= 16) {\n          indent--;\n        } else {\n          indent++;\n        }\n\n        const cueText = fixLineBreaks(text.trim());\n        const id = generateCueId(startTime, endTime, cueText);\n\n        // If this cue already exists in the track do not push it\n        if (!track?.cues?.getCueById(id)) {\n          cue = new Cue(startTime, endTime, cueText);\n          cue.id = id;\n          cue.line = r + 1;\n          cue.align = 'left';\n          // Clamp the position between 10 and 80 percent (CEA-608 PAC indent code)\n          // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-608\n          // Firefox throws an exception and captions break with out of bounds 0-100 values\n          cue.position = 10 + Math.min(80, Math.floor((indent * 8) / 32) * 10);\n          result.push(cue);\n        }\n      }\n    }\n    if (track && result.length) {\n      // Sort bottom cues in reverse order so that they render in line order when overlapping in Chrome\n      result.sort((cueA, cueB) => {\n        if (cueA.line === 'auto' || cueB.line === 'auto') {\n          return 0;\n        }\n        if (cueA.line > 8 && cueB.line > 8) {\n          return cueB.line - cueA.line;\n        }\n        return cueA.line - cueB.line;\n      });\n      result.forEach((cue) => addCueToTrack(track, cue));\n    }\n    return result;\n  },\n};\n\nexport default Cues;\n", "import ChunkCache from '../demux/chunk-cache';\nimport { isPromise } from '../demux/transmuxer';\nimport { LoadStats } from '../loader/load-stats';\nimport type { HlsConfig } from '../config';\nimport type {\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderContext,\n  LoaderOnProgress,\n  LoaderResponse,\n  LoaderStats,\n} from '../types/loader';\n\nexport function fetchSupported() {\n  if (\n    // @ts-ignore\n    self.fetch &&\n    self.AbortController &&\n    self.ReadableStream &&\n    self.Request\n  ) {\n    try {\n      new self.ReadableStream({}); // eslint-disable-line no-new\n      return true;\n    } catch (e) {\n      /* noop */\n    }\n  }\n  return false;\n}\n\nconst BYTERANGE = /(\\d+)-(\\d+)\\/(\\d+)/;\n\nclass FetchLoader implements Loader<LoaderContext> {\n  private fetchSetup: NonNullable<HlsConfig['fetchSetup']>;\n  private requestTimeout?: number;\n  private request: Promise<Request> | Request | null = null;\n  private response: Response | null = null;\n  private controller: AbortController;\n  public context: LoaderContext | null = null;\n  private config: LoaderConfiguration | null = null;\n  private callbacks: LoaderCallbacks<LoaderContext> | null = null;\n  public stats: LoaderStats;\n  private loader: Response | null = null;\n\n  constructor(config: HlsConfig) {\n    this.fetchSetup = config.fetchSetup || getRequest;\n    this.controller = new self.AbortController();\n    this.stats = new LoadStats();\n  }\n\n  destroy(): void {\n    this.loader =\n      this.callbacks =\n      this.context =\n      this.config =\n      this.request =\n        null;\n    this.abortInternal();\n    this.response = null;\n    // @ts-ignore\n    this.fetchSetup = this.controller = this.stats = null;\n  }\n\n  abortInternal(): void {\n    if (this.controller && !this.stats.loading.end) {\n      this.stats.aborted = true;\n      this.controller.abort();\n    }\n  }\n\n  abort(): void {\n    this.abortInternal();\n    if (this.callbacks?.onAbort) {\n      this.callbacks.onAbort(\n        this.stats,\n        this.context as LoaderContext,\n        this.response,\n      );\n    }\n  }\n\n  load(\n    context: LoaderContext,\n    config: LoaderConfiguration,\n    callbacks: LoaderCallbacks<LoaderContext>,\n  ): void {\n    const stats = this.stats;\n    if (stats.loading.start) {\n      throw new Error('Loader can only be used once.');\n    }\n    stats.loading.start = self.performance.now();\n\n    const initParams = getRequestParameters(context, this.controller.signal);\n    const isArrayBuffer = context.responseType === 'arraybuffer';\n    const LENGTH = isArrayBuffer ? 'byteLength' : 'length';\n    const { maxTimeToFirstByteMs, maxLoadTimeMs } = config.loadPolicy;\n\n    this.context = context;\n    this.config = config;\n    this.callbacks = callbacks;\n    this.request = this.fetchSetup(context, initParams);\n    self.clearTimeout(this.requestTimeout);\n    config.timeout =\n      maxTimeToFirstByteMs && Number.isFinite(maxTimeToFirstByteMs)\n        ? maxTimeToFirstByteMs\n        : maxLoadTimeMs;\n    this.requestTimeout = self.setTimeout(() => {\n      if (this.callbacks) {\n        this.abortInternal();\n        this.callbacks.onTimeout(stats, context, this.response);\n      }\n    }, config.timeout);\n\n    const fetchPromise = isPromise(this.request)\n      ? this.request.then(self.fetch)\n      : self.fetch(this.request);\n\n    fetchPromise\n      .then((response: Response): Promise<string | ArrayBuffer> => {\n        this.response = this.loader = response;\n\n        const first = Math.max(self.performance.now(), stats.loading.start);\n\n        self.clearTimeout(this.requestTimeout);\n        config.timeout = maxLoadTimeMs;\n        this.requestTimeout = self.setTimeout(\n          () => {\n            if (this.callbacks) {\n              this.abortInternal();\n              this.callbacks.onTimeout(stats, context, this.response);\n            }\n          },\n          maxLoadTimeMs - (first - stats.loading.start),\n        );\n\n        if (!response.ok) {\n          const { status, statusText } = response;\n          throw new FetchError(\n            statusText || 'fetch, bad network response',\n            status,\n            response,\n          );\n        }\n        stats.loading.first = first;\n\n        stats.total = getContentLength(response.headers) || stats.total;\n\n        const onProgress = this.callbacks?.onProgress;\n        if (onProgress && Number.isFinite(config.highWaterMark)) {\n          return this.loadProgressively(\n            response,\n            stats,\n            context,\n            config.highWaterMark,\n            onProgress,\n          );\n        }\n\n        if (isArrayBuffer) {\n          return response.arrayBuffer();\n        }\n        if (context.responseType === 'json') {\n          return response.json();\n        }\n        return response.text();\n      })\n      .then((responseData: string | ArrayBuffer) => {\n        const response = this.response;\n        if (!response) {\n          throw new Error('loader destroyed');\n        }\n        self.clearTimeout(this.requestTimeout);\n        stats.loading.end = Math.max(\n          self.performance.now(),\n          stats.loading.first,\n        );\n        const total = responseData[LENGTH];\n        if (total) {\n          stats.loaded = stats.total = total;\n        }\n\n        const loaderResponse: LoaderResponse = {\n          url: response.url,\n          data: responseData,\n          code: response.status,\n        };\n\n        const onProgress = this.callbacks?.onProgress;\n        if (onProgress && !Number.isFinite(config.highWaterMark)) {\n          onProgress(stats, context, responseData, response);\n        }\n\n        this.callbacks?.onSuccess(loaderResponse, stats, context, response);\n      })\n      .catch((error) => {\n        self.clearTimeout(this.requestTimeout);\n        if (stats.aborted) {\n          return;\n        }\n        // CORS errors result in an undefined code. Set it to 0 here to align with XHR's behavior\n        // when destroying, 'error' itself can be undefined\n        const code: number = !error ? 0 : error.code || 0;\n        const text: string = !error ? null : error.message;\n        this.callbacks?.onError(\n          { code, text },\n          context,\n          error ? error.details : null,\n          stats,\n        );\n      });\n  }\n\n  getCacheAge(): number | null {\n    let result: number | null = null;\n    if (this.response) {\n      const ageHeader = this.response.headers.get('age');\n      result = ageHeader ? parseFloat(ageHeader) : null;\n    }\n    return result;\n  }\n\n  getResponseHeader(name: string): string | null {\n    return this.response ? this.response.headers.get(name) : null;\n  }\n\n  private loadProgressively(\n    response: Response,\n    stats: LoaderStats,\n    context: LoaderContext,\n    highWaterMark: number = 0,\n    onProgress: LoaderOnProgress<LoaderContext>,\n  ): Promise<ArrayBuffer> {\n    const chunkCache = new ChunkCache();\n    const reader = (response.body as ReadableStream).getReader();\n\n    const pump = (): Promise<ArrayBuffer> => {\n      return reader\n        .read()\n        .then((data) => {\n          if (data.done) {\n            if (chunkCache.dataLength) {\n              onProgress(stats, context, chunkCache.flush().buffer, response);\n            }\n\n            return Promise.resolve(new ArrayBuffer(0));\n          }\n          const chunk: Uint8Array<ArrayBuffer> = data.value;\n          const len = chunk.length;\n          stats.loaded += len;\n          if (len < highWaterMark || chunkCache.dataLength) {\n            // The current chunk is too small to to be emitted or the cache already has data\n            // Push it to the cache\n            chunkCache.push(chunk);\n            if (chunkCache.dataLength >= highWaterMark) {\n              // flush in order to join the typed arrays\n              onProgress(stats, context, chunkCache.flush().buffer, response);\n            }\n          } else {\n            // If there's nothing cached already, and the chache is large enough\n            // just emit the progress event\n            onProgress(stats, context, chunk.buffer, response);\n          }\n          return pump();\n        })\n        .catch(() => {\n          /* aborted */\n          return Promise.reject();\n        });\n    };\n\n    return pump();\n  }\n}\n\nfunction getRequestParameters(context: LoaderContext, signal): any {\n  const initParams: any = {\n    method: 'GET',\n    mode: 'cors',\n    credentials: 'same-origin',\n    signal,\n    headers: new self.Headers(Object.assign({}, context.headers)),\n  };\n\n  if (context.rangeEnd) {\n    initParams.headers.set(\n      'Range',\n      'bytes=' + context.rangeStart + '-' + String(context.rangeEnd - 1),\n    );\n  }\n\n  return initParams;\n}\n\nfunction getByteRangeLength(byteRangeHeader: string): number | undefined {\n  const result = BYTERANGE.exec(byteRangeHeader);\n  if (result) {\n    return parseInt(result[2]) - parseInt(result[1]) + 1;\n  }\n}\n\nfunction getContentLength(headers: Headers): number | undefined {\n  const contentRange = headers.get('Content-Range');\n  if (contentRange) {\n    const byteRangeLength = getByteRangeLength(contentRange);\n    if (Number.isFinite(byteRangeLength)) {\n      return byteRangeLength;\n    }\n  }\n  const contentLength = headers.get('Content-Length');\n  if (contentLength) {\n    return parseInt(contentLength);\n  }\n}\n\nfunction getRequest(context: LoaderContext, initParams: any): Request {\n  return new self.Request(context.url, initParams);\n}\n\nclass FetchError extends Error {\n  public code: number;\n  public details: any;\n  constructor(message: string, code: number, details: any) {\n    super(message);\n    this.code = code;\n    this.details = details;\n  }\n}\n\nexport default FetchLoader;\n", "import { getRetryDelay, shouldRetry } from './error-helper';\nimport { LoadStats } from '../loader/load-stats';\nimport { logger } from '../utils/logger';\nimport type { HlsConfig } from '../config';\nimport type { RetryConfig } from '../config';\nimport type {\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderContext,\n  LoaderResponse,\n  LoaderStats,\n} from '../types/loader';\n\nconst AGE_HEADER_LINE_REGEX = /^age:\\s*[\\d.]+\\s*$/im;\n\nclass XhrLoader implements Loader<LoaderContext> {\n  private xhrSetup:\n    | ((xhr: XMLHttpRequest, url: string) => Promise<void> | void)\n    | null;\n  private requestTimeout?: number;\n  private retryTimeout?: number;\n  private retryDelay: number;\n  private config: LoaderConfiguration | null = null;\n  private callbacks: LoaderCallbacks<LoaderContext> | null = null;\n  public context: LoaderContext | null = null;\n\n  private loader: XMLHttpRequest | null = null;\n  public stats: LoaderStats;\n\n  constructor(config: HlsConfig) {\n    this.xhrSetup = config ? config.xhrSetup || null : null;\n    this.stats = new LoadStats();\n    this.retryDelay = 0;\n  }\n\n  destroy() {\n    this.callbacks = null;\n    this.abortInternal();\n    this.loader = null;\n    this.config = null;\n    this.context = null;\n    this.xhrSetup = null;\n  }\n\n  abortInternal() {\n    const loader = this.loader;\n    self.clearTimeout(this.requestTimeout);\n    self.clearTimeout(this.retryTimeout);\n    if (loader) {\n      loader.onreadystatechange = null;\n      loader.onprogress = null;\n      if (loader.readyState !== 4) {\n        this.stats.aborted = true;\n        loader.abort();\n      }\n    }\n  }\n\n  abort() {\n    this.abortInternal();\n    if (this.callbacks?.onAbort) {\n      this.callbacks.onAbort(\n        this.stats,\n        this.context as LoaderContext,\n        this.loader,\n      );\n    }\n  }\n\n  load(\n    context: LoaderContext,\n    config: LoaderConfiguration,\n    callbacks: LoaderCallbacks<LoaderContext>,\n  ) {\n    if (this.stats.loading.start) {\n      throw new Error('Loader can only be used once.');\n    }\n    this.stats.loading.start = self.performance.now();\n    this.context = context;\n    this.config = config;\n    this.callbacks = callbacks;\n    this.loadInternal();\n  }\n\n  loadInternal() {\n    const { config, context } = this;\n    if (!config || !context) {\n      return;\n    }\n    const xhr = (this.loader = new self.XMLHttpRequest());\n\n    const stats = this.stats;\n    stats.loading.first = 0;\n    stats.loaded = 0;\n    stats.aborted = false;\n    const xhrSetup = this.xhrSetup;\n\n    if (xhrSetup) {\n      Promise.resolve()\n        .then(() => {\n          if (this.loader !== xhr || this.stats.aborted) return;\n          return xhrSetup(xhr, context.url);\n        })\n        .catch((error: Error) => {\n          if (this.loader !== xhr || this.stats.aborted) return;\n          xhr.open('GET', context.url, true);\n          return xhrSetup(xhr, context.url);\n        })\n        .then(() => {\n          if (this.loader !== xhr || this.stats.aborted) return;\n          this.openAndSendXhr(xhr, context, config);\n        })\n        .catch((error: Error) => {\n          // IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS\n          this.callbacks?.onError(\n            { code: xhr.status, text: error.message },\n            context,\n            xhr,\n            stats,\n          );\n          return;\n        });\n    } else {\n      this.openAndSendXhr(xhr, context, config);\n    }\n  }\n\n  openAndSendXhr(\n    xhr: XMLHttpRequest,\n    context: LoaderContext,\n    config: LoaderConfiguration,\n  ) {\n    if (!xhr.readyState) {\n      xhr.open('GET', context.url, true);\n    }\n\n    const headers = context.headers;\n    const { maxTimeToFirstByteMs, maxLoadTimeMs } = config.loadPolicy;\n    if (headers) {\n      for (const header in headers) {\n        xhr.setRequestHeader(header, headers[header]);\n      }\n    }\n\n    if (context.rangeEnd) {\n      xhr.setRequestHeader(\n        'Range',\n        'bytes=' + context.rangeStart + '-' + (context.rangeEnd - 1),\n      );\n    }\n\n    xhr.onreadystatechange = this.readystatechange.bind(this);\n    xhr.onprogress = this.loadprogress.bind(this);\n    xhr.responseType = context.responseType as XMLHttpRequestResponseType;\n    // setup timeout before we perform request\n    self.clearTimeout(this.requestTimeout);\n    config.timeout =\n      maxTimeToFirstByteMs && Number.isFinite(maxTimeToFirstByteMs)\n        ? maxTimeToFirstByteMs\n        : maxLoadTimeMs;\n    this.requestTimeout = self.setTimeout(\n      this.loadtimeout.bind(this),\n      config.timeout,\n    );\n    xhr.send();\n  }\n\n  readystatechange() {\n    const { context, loader: xhr, stats } = this;\n    if (!context || !xhr) {\n      return;\n    }\n    const readyState = xhr.readyState;\n    const config = this.config as LoaderConfiguration;\n\n    // don't proceed if xhr has been aborted\n    if (stats.aborted) {\n      return;\n    }\n\n    // >= HEADERS_RECEIVED\n    if (readyState >= 2) {\n      if (stats.loading.first === 0) {\n        stats.loading.first = Math.max(\n          self.performance.now(),\n          stats.loading.start,\n        );\n        // readyState >= 2 AND readyState !==4 (readyState = HEADERS_RECEIVED || LOADING) rearm timeout as xhr not finished yet\n        if (config.timeout !== config.loadPolicy.maxLoadTimeMs) {\n          self.clearTimeout(this.requestTimeout);\n          config.timeout = config.loadPolicy.maxLoadTimeMs;\n          this.requestTimeout = self.setTimeout(\n            this.loadtimeout.bind(this),\n            config.loadPolicy.maxLoadTimeMs -\n              (stats.loading.first - stats.loading.start),\n          );\n        }\n      }\n\n      if (readyState === 4) {\n        self.clearTimeout(this.requestTimeout);\n        xhr.onreadystatechange = null;\n        xhr.onprogress = null;\n        const status = xhr.status;\n        // http status between 200 to 299 are all successful\n        const useResponseText =\n          xhr.responseType === 'text' ? xhr.responseText : null;\n        if (status >= 200 && status < 300) {\n          const data = useResponseText ?? xhr.response;\n          if (data != null) {\n            stats.loading.end = Math.max(\n              self.performance.now(),\n              stats.loading.first,\n            );\n            const len =\n              xhr.responseType === 'arraybuffer'\n                ? data.byteLength\n                : data.length;\n            stats.loaded = stats.total = len;\n            stats.bwEstimate =\n              (stats.total * 8000) / (stats.loading.end - stats.loading.first);\n            const onProgress = this.callbacks?.onProgress;\n            if (onProgress) {\n              onProgress(stats, context, data, xhr);\n            }\n            const response: LoaderResponse = {\n              url: xhr.responseURL,\n              data: data,\n              code: status,\n            };\n            this.callbacks?.onSuccess(response, stats, context, xhr);\n            return;\n          }\n        }\n\n        // Handle bad status or nullish response\n        const retryConfig = config.loadPolicy.errorRetry;\n        const retryCount = stats.retry;\n        // if max nb of retries reached or if http status between 400 and 499 (such error cannot be recovered, retrying is useless), return error\n        const response: LoaderResponse = {\n          url: context.url,\n          data: undefined,\n          code: status,\n        };\n        if (shouldRetry(retryConfig, retryCount, false, response)) {\n          this.retry(retryConfig);\n        } else {\n          logger.error(`${status} while loading ${context.url}`);\n          this.callbacks?.onError(\n            { code: status, text: xhr.statusText },\n            context,\n            xhr,\n            stats,\n          );\n        }\n      }\n    }\n  }\n\n  loadtimeout() {\n    if (!this.config) return;\n    const retryConfig = this.config.loadPolicy.timeoutRetry;\n    const retryCount = this.stats.retry;\n    if (shouldRetry(retryConfig, retryCount, true)) {\n      this.retry(retryConfig);\n    } else {\n      logger.warn(`timeout while loading ${this.context?.url}`);\n      const callbacks = this.callbacks;\n      if (callbacks) {\n        this.abortInternal();\n        callbacks.onTimeout(\n          this.stats,\n          this.context as LoaderContext,\n          this.loader,\n        );\n      }\n    }\n  }\n\n  retry(retryConfig: RetryConfig) {\n    const { context, stats } = this;\n    this.retryDelay = getRetryDelay(retryConfig, stats.retry);\n    stats.retry++;\n    logger.warn(\n      `${\n        status ? 'HTTP Status ' + status : 'Timeout'\n      } while loading ${context?.url}, retrying ${stats.retry}/${\n        retryConfig.maxNumRetry\n      } in ${this.retryDelay}ms`,\n    );\n    // abort and reset internal state\n    this.abortInternal();\n    this.loader = null;\n    // schedule retry\n    self.clearTimeout(this.retryTimeout);\n    this.retryTimeout = self.setTimeout(\n      this.loadInternal.bind(this),\n      this.retryDelay,\n    );\n  }\n\n  loadprogress(event: ProgressEvent) {\n    const stats = this.stats;\n\n    stats.loaded = event.loaded;\n    if (event.lengthComputable) {\n      stats.total = event.total;\n    }\n  }\n\n  getCacheAge(): number | null {\n    let result: number | null = null;\n    if (\n      this.loader &&\n      AGE_HEADER_LINE_REGEX.test(this.loader.getAllResponseHeaders())\n    ) {\n      const ageHeader = this.loader.getResponseHeader('age');\n      result = ageHeader ? parseFloat(ageHeader) : null;\n    }\n    return result;\n  }\n\n  getResponseHeader(name: string): string | null {\n    if (\n      this.loader &&\n      new RegExp(`^${name}:\\\\s*[\\\\d.]+\\\\s*$`, 'im').test(\n        this.loader.getAllResponseHeaders(),\n      )\n    ) {\n      return this.loader.getResponseHeader(name);\n    }\n    return null;\n  }\n}\n\nexport default XhrLoader;\n", "import AbrController from './controller/abr-controller';\nimport AudioStreamController from './controller/audio-stream-controller';\nimport AudioTrackController from './controller/audio-track-controller';\nimport BufferController from './controller/buffer-controller';\nimport CapLevelController from './controller/cap-level-controller';\nimport CMCDController from './controller/cmcd-controller';\nimport ContentSteeringController from './controller/content-steering-controller';\nimport EMEController from './controller/eme-controller';\nimport ErrorController from './controller/error-controller';\nimport FPSController from './controller/fps-controller';\nimport InterstitialsController from './controller/interstitials-controller';\nimport { SubtitleStreamController } from './controller/subtitle-stream-controller';\nimport SubtitleTrackController from './controller/subtitle-track-controller';\nimport { TimelineController } from './controller/timeline-controller';\nimport Cues from './utils/cues';\nimport FetchLoader, { fetchSupported } from './utils/fetch-loader';\nimport { requestMediaKeySystemAccess } from './utils/mediakeys-helper';\nimport { stringify } from './utils/safe-json-stringify';\nimport XhrLoader from './utils/xhr-loader';\nimport type { MediaKeySessionContext } from './controller/eme-controller';\nimport type Hls from './hls';\nimport type {\n  FragmentLoaderContext,\n  Loader,\n  LoaderContext,\n  LoaderResponse,\n  PlaylistLoaderContext,\n} from './types/loader';\nimport type {\n  AudioSelectionOption,\n  SubtitleSelectionOption,\n  VideoSelectionOption,\n} from './types/media-playlist';\nimport type { CuesInterface } from './utils/cues';\nimport type { ILogger } from './utils/logger';\nimport type { KeySystems, MediaKeyFunc } from './utils/mediakeys-helper';\n\nexport type ABRControllerConfig = {\n  abrEwmaFastLive: number;\n  abrEwmaSlowLive: number;\n  abrEwmaFastVoD: number;\n  abrEwmaSlowVoD: number;\n  /**\n   * Default bandwidth estimate in bits/s prior to collecting fragment bandwidth samples\n   */\n  abrEwmaDefaultEstimate: number;\n  abrEwmaDefaultEstimateMax: number;\n  abrBandWidthFactor: number;\n  abrBandWidthUpFactor: number;\n  abrMaxWithRealBitrate: boolean;\n  maxStarvationDelay: number;\n  maxLoadingDelay: number;\n};\n\nexport type BufferControllerConfig = {\n  appendErrorMaxRetry: number;\n  backBufferLength: number;\n  frontBufferFlushThreshold: number;\n  liveDurationInfinity: boolean;\n  /**\n   * @deprecated use backBufferLength\n   */\n  liveBackBufferLength: number | null;\n};\n\nexport type CapLevelControllerConfig = {\n  capLevelToPlayerSize: boolean;\n};\n\nexport type CMCDControllerConfig = {\n  sessionId?: string;\n  contentId?: string;\n  useHeaders?: boolean;\n  includeKeys?: string[];\n};\n\nexport type DRMSystemOptions = {\n  audioRobustness?: string;\n  videoRobustness?: string;\n  audioEncryptionScheme?: string | null;\n  videoEncryptionScheme?: string | null;\n  persistentState?: MediaKeysRequirement;\n  distinctiveIdentifier?: MediaKeysRequirement;\n  sessionTypes?: string[];\n  sessionType?: string;\n};\n\nexport type DRMSystemConfiguration = {\n  licenseUrl: string;\n  serverCertificateUrl?: string;\n  generateRequest?: (\n    this: Hls,\n    initDataType: string,\n    initData: ArrayBuffer | null,\n    keyContext: MediaKeySessionContext,\n  ) =>\n    | { initDataType: string; initData: ArrayBuffer | null }\n    | undefined\n    | never;\n};\n\nexport type DRMSystemsConfiguration = Partial<\n  Record<KeySystems, DRMSystemConfiguration>\n>;\n\nexport type EMEControllerConfig = {\n  licenseXhrSetup?: (\n    this: Hls,\n    xhr: XMLHttpRequest,\n    url: string,\n    keyContext: MediaKeySessionContext,\n    licenseChallenge: Uint8Array,\n  ) => void | Uint8Array | Promise<Uint8Array | void>;\n  licenseResponseCallback?: (\n    this: Hls,\n    xhr: XMLHttpRequest,\n    url: string,\n    keyContext: MediaKeySessionContext,\n  ) => ArrayBuffer;\n  emeEnabled: boolean;\n  widevineLicenseUrl?: string;\n  drmSystems: DRMSystemsConfiguration | undefined;\n  drmSystemOptions: DRMSystemOptions | undefined;\n  requestMediaKeySystemAccessFunc: MediaKeyFunc | null;\n  requireKeySystemAccessOnStart: boolean;\n};\n\nexport interface FragmentLoaderConstructor {\n  new (confg: HlsConfig): Loader<FragmentLoaderContext>;\n}\n\n/**\n * @deprecated use fragLoadPolicy.default\n */\nexport type FragmentLoaderConfig = {\n  fragLoadingTimeOut: number;\n  fragLoadingMaxRetry: number;\n  fragLoadingRetryDelay: number;\n  fragLoadingMaxRetryTimeout: number;\n};\n\nexport type FPSControllerConfig = {\n  capLevelOnFPSDrop: boolean;\n  fpsDroppedMonitoringPeriod: number;\n  fpsDroppedMonitoringThreshold: number;\n};\n\nexport type LevelControllerConfig = {\n  startLevel?: number;\n};\n\nexport type MP4RemuxerConfig = {\n  stretchShortVideoTrack: boolean;\n  maxAudioFramesDrift: number;\n};\n\nexport interface PlaylistLoaderConstructor {\n  new (confg: HlsConfig): Loader<PlaylistLoaderContext>;\n}\n\n/**\n * @deprecated use manifestLoadPolicy.default and playlistLoadPolicy.default\n */\nexport type PlaylistLoaderConfig = {\n  manifestLoadingTimeOut: number;\n  manifestLoadingMaxRetry: number;\n  manifestLoadingRetryDelay: number;\n  manifestLoadingMaxRetryTimeout: number;\n\n  levelLoadingTimeOut: number;\n  levelLoadingMaxRetry: number;\n  levelLoadingRetryDelay: number;\n  levelLoadingMaxRetryTimeout: number;\n};\n\nexport type HlsLoadPolicies = {\n  fragLoadPolicy: LoadPolicy;\n  keyLoadPolicy: LoadPolicy;\n  certLoadPolicy: LoadPolicy;\n  playlistLoadPolicy: LoadPolicy;\n  manifestLoadPolicy: LoadPolicy;\n  steeringManifestLoadPolicy: LoadPolicy;\n  interstitialAssetListLoadPolicy: LoadPolicy;\n};\n\nexport type LoadPolicy = {\n  default: LoaderConfig;\n};\n\nexport type LoaderConfig = {\n  maxTimeToFirstByteMs: number; // Max time to first byte\n  maxLoadTimeMs: number; // Max time for load completion\n  timeoutRetry: RetryConfig | null;\n  errorRetry: RetryConfig | null;\n};\n\nexport type RetryConfig = {\n  maxNumRetry: number; // Maximum number of retries\n  retryDelayMs: number; // Retry delay = 2^retryCount * retryDelayMs (exponential) or retryCount * retryDelayMs (linear)\n  maxRetryDelayMs: number; // Maximum delay between retries\n  backoff?: 'exponential' | 'linear'; // used to determine retry backoff duration (see retryDelayMs)\n  shouldRetry?: (\n    retryConfig: RetryConfig | null | undefined,\n    retryCount: number,\n    isTimeout: boolean,\n    loaderResponse: LoaderResponse | undefined,\n    retry: boolean,\n  ) => boolean;\n};\n\nexport type StreamControllerConfig = {\n  autoStartLoad: boolean;\n  startPosition: number;\n  defaultAudioCodec?: string;\n  initialLiveManifestSize: number;\n  maxBufferLength: number;\n  maxBufferSize: number;\n  maxBufferHole: number;\n  maxFragLookUpTolerance: number;\n  maxMaxBufferLength: number;\n  startFragPrefetch: boolean;\n  testBandwidth: boolean;\n  liveSyncMode?: 'edge' | 'buffered';\n  startOnSegmentBoundary: boolean;\n};\n\nexport type GapControllerConfig = {\n  detectStallWithCurrentTimeMs: number;\n  highBufferWatchdogPeriod: number;\n  nudgeOffset: number;\n  nudgeMaxRetry: number;\n  nudgeOnVideoHole: boolean;\n};\n\nexport type SelectionPreferences = {\n  videoPreference?: VideoSelectionOption;\n  audioPreference?: AudioSelectionOption;\n  subtitlePreference?: SubtitleSelectionOption;\n};\n\nexport type LatencyControllerConfig = {\n  liveSyncDurationCount: number;\n  liveMaxLatencyDurationCount: number;\n  liveSyncDuration?: number;\n  liveMaxLatencyDuration?: number;\n  maxLiveSyncPlaybackRate: number;\n  liveSyncOnStallIncrease: number;\n};\n\nexport type MetadataControllerConfig = {\n  enableDateRangeMetadataCues: boolean;\n  enableEmsgMetadataCues: boolean;\n  enableEmsgKLVMetadata: boolean;\n  enableID3MetadataCues: boolean;\n};\n\nexport type TimelineControllerConfig = {\n  cueHandler: CuesInterface;\n  enableWebVTT: boolean;\n  enableIMSC1: boolean;\n  enableCEA708Captions: boolean;\n  captionsTextTrack1Label: string;\n  captionsTextTrack1LanguageCode: string;\n  captionsTextTrack2Label: string;\n  captionsTextTrack2LanguageCode: string;\n  captionsTextTrack3Label: string;\n  captionsTextTrack3LanguageCode: string;\n  captionsTextTrack4Label: string;\n  captionsTextTrack4LanguageCode: string;\n  renderTextTracksNatively: boolean;\n};\n\nexport type TSDemuxerConfig = {\n  forceKeyFrameOnDiscontinuity: boolean;\n};\n\nexport type HlsConfig = {\n  debug: boolean | ILogger;\n  enableWorker: boolean;\n  workerPath: null | string;\n  enableSoftwareAES: boolean;\n  minAutoBitrate: number;\n  ignoreDevicePixelRatio: boolean;\n  maxDevicePixelRatio: number;\n  preferManagedMediaSource: boolean;\n  preserveManualLevelOnError: boolean;\n  timelineOffset?: number;\n  ignorePlaylistParsingErrors: boolean;\n  loader: { new (confg: HlsConfig): Loader<LoaderContext> };\n  fLoader?: FragmentLoaderConstructor;\n  pLoader?: PlaylistLoaderConstructor;\n  fetchSetup?: (\n    context: LoaderContext,\n    initParams: any,\n  ) => Promise<Request> | Request;\n  xhrSetup?: (xhr: XMLHttpRequest, url: string) => Promise<void> | void;\n\n  // Alt Audio\n  audioStreamController?: typeof AudioStreamController;\n  audioTrackController?: typeof AudioTrackController;\n  // Subtitle\n  subtitleStreamController?: typeof SubtitleStreamController;\n  subtitleTrackController?: typeof SubtitleTrackController;\n  timelineController?: typeof TimelineController;\n  // EME\n  emeController?: typeof EMEController;\n  // CMCD\n  cmcd?: CMCDControllerConfig;\n  cmcdController?: typeof CMCDController;\n  // Content Steering\n  contentSteeringController?: typeof ContentSteeringController;\n  // Interstitial Controller (setting to null disables Interstitials parsing and playback)\n  interstitialsController?: typeof InterstitialsController;\n  // Option to disable internal playback handling of Interstitials (set to false to disable Interstitials playback without disabling parsing and schedule events)\n  enableInterstitialPlayback: boolean;\n  // Option to disable appending Interstitials inline on same timeline and MediaSource as Primary media\n  interstitialAppendInPlace: boolean;\n  // How many seconds past the end of a live playlist to preload Interstitial assets\n  interstitialLiveLookAhead: number;\n  // An optional `Hls` instance ID prefixed to debug logs\n  assetPlayerId?: string;\n  // MediaCapabilies API for level, track, and switch filtering\n  useMediaCapabilities: boolean;\n\n  abrController: typeof AbrController;\n  bufferController: typeof BufferController;\n  capLevelController: typeof CapLevelController;\n  errorController: typeof ErrorController;\n  fpsController: typeof FPSController;\n  progressive: boolean;\n  lowLatencyMode: boolean;\n  primarySessionId?: string;\n} & ABRControllerConfig &\n  BufferControllerConfig &\n  CapLevelControllerConfig &\n  EMEControllerConfig &\n  FPSControllerConfig &\n  GapControllerConfig &\n  LevelControllerConfig &\n  MP4RemuxerConfig &\n  StreamControllerConfig &\n  SelectionPreferences &\n  LatencyControllerConfig &\n  MetadataControllerConfig &\n  TimelineControllerConfig &\n  TSDemuxerConfig &\n  HlsLoadPolicies &\n  FragmentLoaderConfig &\n  PlaylistLoaderConfig;\n\nconst defaultLoadPolicy: LoaderConfig = {\n  maxTimeToFirstByteMs: 8000,\n  maxLoadTimeMs: 20000,\n  timeoutRetry: null,\n  errorRetry: null,\n};\n\n/**\n * @ignore\n * If possible, keep hlsDefaultConfig shallow\n * It is cloned whenever a new Hls instance is created, by keeping the config\n * shallow the properties are cloned, and we don't end up manipulating the default\n */\nexport const hlsDefaultConfig: HlsConfig = {\n  autoStartLoad: true, // used by stream-controller\n  startPosition: -1, // used by stream-controller\n  defaultAudioCodec: undefined, // used by stream-controller\n  debug: false, // used by logger\n  capLevelOnFPSDrop: false, // used by fps-controller\n  capLevelToPlayerSize: false, // used by cap-level-controller\n  ignoreDevicePixelRatio: false, // used by cap-level-controller\n  maxDevicePixelRatio: Number.POSITIVE_INFINITY, // used by cap-level-controller\n  preferManagedMediaSource: true,\n  initialLiveManifestSize: 1, // used by stream-controller\n  maxBufferLength: 30, // used by stream-controller\n  backBufferLength: Infinity, // used by buffer-controller\n  frontBufferFlushThreshold: Infinity,\n  startOnSegmentBoundary: false, // used by stream-controller\n  maxBufferSize: 60 * 1000 * 1000, // used by stream-controller\n  maxFragLookUpTolerance: 0.25, // used by stream-controller\n  maxBufferHole: 0.1, // used by stream-controller and gap-controller\n  detectStallWithCurrentTimeMs: 1250, // used by gap-controller\n  highBufferWatchdogPeriod: 2, // used by gap-controller\n  nudgeOffset: 0.1, // used by gap-controller\n  nudgeMaxRetry: 3, // used by gap-controller\n  nudgeOnVideoHole: true, // used by gap-controller\n  liveSyncMode: 'edge', // used by stream-controller\n  liveSyncDurationCount: 3, // used by latency-controller\n  liveSyncOnStallIncrease: 1, // used by latency-controller\n  liveMaxLatencyDurationCount: Infinity, // used by latency-controller\n  liveSyncDuration: undefined, // used by latency-controller\n  liveMaxLatencyDuration: undefined, // used by latency-controller\n  maxLiveSyncPlaybackRate: 1, // used by latency-controller\n  liveDurationInfinity: false, // used by buffer-controller\n  /**\n   * @deprecated use backBufferLength\n   */\n  liveBackBufferLength: null, // used by buffer-controller\n  maxMaxBufferLength: 600, // used by stream-controller\n  enableWorker: true, // used by transmuxer\n  workerPath: null, // used by transmuxer\n  enableSoftwareAES: true, // used by decrypter\n  startLevel: undefined, // used by level-controller\n  startFragPrefetch: false, // used by stream-controller\n  fpsDroppedMonitoringPeriod: 5000, // used by fps-controller\n  fpsDroppedMonitoringThreshold: 0.2, // used by fps-controller\n  appendErrorMaxRetry: 3, // used by buffer-controller\n  ignorePlaylistParsingErrors: false,\n  loader: XhrLoader,\n  // loader: FetchLoader,\n  fLoader: undefined, // used by fragment-loader\n  pLoader: undefined, // used by playlist-loader\n  xhrSetup: undefined, // used by xhr-loader\n  licenseXhrSetup: undefined, // used by eme-controller\n  licenseResponseCallback: undefined, // used by eme-controller\n  abrController: AbrController,\n  bufferController: BufferController,\n  capLevelController: CapLevelController,\n  errorController: ErrorController,\n  fpsController: FPSController,\n  stretchShortVideoTrack: false, // used by mp4-remuxer\n  maxAudioFramesDrift: 1, // used by mp4-remuxer\n  forceKeyFrameOnDiscontinuity: true, // used by ts-demuxer\n  abrEwmaFastLive: 3, // used by abr-controller\n  abrEwmaSlowLive: 9, // used by abr-controller\n  abrEwmaFastVoD: 3, // used by abr-controller\n  abrEwmaSlowVoD: 9, // used by abr-controller\n  abrEwmaDefaultEstimate: 5e5, // 500 kbps  // used by abr-controller\n  abrEwmaDefaultEstimateMax: 5e6, // 5 mbps\n  abrBandWidthFactor: 0.95, // used by abr-controller\n  abrBandWidthUpFactor: 0.7, // used by abr-controller\n  abrMaxWithRealBitrate: false, // used by abr-controller\n  maxStarvationDelay: 4, // used by abr-controller\n  maxLoadingDelay: 4, // used by abr-controller\n  minAutoBitrate: 0, // used by hls\n  emeEnabled: false, // used by eme-controller\n  widevineLicenseUrl: undefined, // used by eme-controller\n  drmSystems: {}, // used by eme-controller\n  drmSystemOptions: {}, // used by eme-controller\n  requestMediaKeySystemAccessFunc: __USE_EME_DRM__\n    ? requestMediaKeySystemAccess\n    : null, // used by eme-controller\n  requireKeySystemAccessOnStart: false, // used by eme-controller\n  testBandwidth: true,\n  progressive: false,\n  lowLatencyMode: true,\n  cmcd: undefined,\n  enableDateRangeMetadataCues: true,\n  enableEmsgMetadataCues: true,\n  enableEmsgKLVMetadata: false,\n  enableID3MetadataCues: true,\n  enableInterstitialPlayback: __USE_INTERSTITIALS__,\n  interstitialAppendInPlace: true,\n  interstitialLiveLookAhead: 10,\n  useMediaCapabilities: __USE_MEDIA_CAPABILITIES__,\n  preserveManualLevelOnError: false,\n\n  certLoadPolicy: {\n    default: defaultLoadPolicy,\n  },\n  keyLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 8000,\n      maxLoadTimeMs: 20000,\n      timeoutRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1000,\n        maxRetryDelayMs: 20000,\n        backoff: 'linear',\n      },\n      errorRetry: {\n        maxNumRetry: 8,\n        retryDelayMs: 1000,\n        maxRetryDelayMs: 20000,\n        backoff: 'linear',\n      },\n    },\n  },\n  manifestLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: Infinity,\n      maxLoadTimeMs: 20000,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0,\n      },\n      errorRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1000,\n        maxRetryDelayMs: 8000,\n      },\n    },\n  },\n  playlistLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 10000,\n      maxLoadTimeMs: 20000,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0,\n      },\n      errorRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 1000,\n        maxRetryDelayMs: 8000,\n      },\n    },\n  },\n  fragLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 10000,\n      maxLoadTimeMs: 120000,\n      timeoutRetry: {\n        maxNumRetry: 4,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0,\n      },\n      errorRetry: {\n        maxNumRetry: 6,\n        retryDelayMs: 1000,\n        maxRetryDelayMs: 8000,\n      },\n    },\n  },\n  steeringManifestLoadPolicy: {\n    default: __USE_CONTENT_STEERING__\n      ? {\n          maxTimeToFirstByteMs: 10000,\n          maxLoadTimeMs: 20000,\n          timeoutRetry: {\n            maxNumRetry: 2,\n            retryDelayMs: 0,\n            maxRetryDelayMs: 0,\n          },\n          errorRetry: {\n            maxNumRetry: 1,\n            retryDelayMs: 1000,\n            maxRetryDelayMs: 8000,\n          },\n        }\n      : defaultLoadPolicy,\n  },\n  interstitialAssetListLoadPolicy: {\n    default: __USE_INTERSTITIALS__\n      ? {\n          maxTimeToFirstByteMs: 10000,\n          maxLoadTimeMs: 30000,\n          timeoutRetry: {\n            maxNumRetry: 0,\n            retryDelayMs: 0,\n            maxRetryDelayMs: 0,\n          },\n          errorRetry: {\n            maxNumRetry: 0,\n            retryDelayMs: 1000,\n            maxRetryDelayMs: 8000,\n          },\n        }\n      : defaultLoadPolicy,\n  },\n\n  // These default settings are deprecated in favor of the above policies\n  // and are maintained for backwards compatibility\n  manifestLoadingTimeOut: 10000,\n  manifestLoadingMaxRetry: 1,\n  manifestLoadingRetryDelay: 1000,\n  manifestLoadingMaxRetryTimeout: 64000,\n  levelLoadingTimeOut: 10000,\n  levelLoadingMaxRetry: 4,\n  levelLoadingRetryDelay: 1000,\n  levelLoadingMaxRetryTimeout: 64000,\n  fragLoadingTimeOut: 20000,\n  fragLoadingMaxRetry: 6,\n  fragLoadingRetryDelay: 1000,\n  fragLoadingMaxRetryTimeout: 64000,\n\n  // Dynamic Modules\n  ...timelineConfig(),\n  subtitleStreamController: __USE_SUBTITLES__\n    ? SubtitleStreamController\n    : undefined,\n  subtitleTrackController: __USE_SUBTITLES__\n    ? SubtitleTrackController\n    : undefined,\n  timelineController: __USE_SUBTITLES__ ? TimelineController : undefined,\n  audioStreamController: __USE_ALT_AUDIO__ ? AudioStreamController : undefined,\n  audioTrackController: __USE_ALT_AUDIO__ ? AudioTrackController : undefined,\n  emeController: __USE_EME_DRM__ ? EMEController : undefined,\n  cmcdController: __USE_CMCD__ ? CMCDController : undefined,\n  contentSteeringController: __USE_CONTENT_STEERING__\n    ? ContentSteeringController\n    : undefined,\n  interstitialsController: __USE_INTERSTITIALS__\n    ? InterstitialsController\n    : undefined,\n};\n\nfunction timelineConfig(): TimelineControllerConfig {\n  return {\n    cueHandler: Cues, // used by timeline-controller\n    enableWebVTT: __USE_SUBTITLES__, // used by timeline-controller\n    enableIMSC1: __USE_SUBTITLES__, // used by timeline-controller\n    enableCEA708Captions: __USE_SUBTITLES__, // used by timeline-controller\n    captionsTextTrack1Label: 'English', // used by timeline-controller\n    captionsTextTrack1LanguageCode: 'en', // used by timeline-controller\n    captionsTextTrack2Label: 'Spanish', // used by timeline-controller\n    captionsTextTrack2LanguageCode: 'es', // used by timeline-controller\n    captionsTextTrack3Label: 'Unknown CC', // used by timeline-controller\n    captionsTextTrack3LanguageCode: '', // used by timeline-controller\n    captionsTextTrack4Label: 'Unknown CC', // used by timeline-controller\n    captionsTextTrack4LanguageCode: '', // used by timeline-controller\n    renderTextTracksNatively: true,\n  };\n}\n\n/**\n * @ignore\n */\nexport function mergeConfig(\n  defaultConfig: HlsConfig,\n  userConfig: Partial<HlsConfig>,\n  logger: ILogger,\n): HlsConfig {\n  if (\n    (userConfig.liveSyncDurationCount ||\n      userConfig.liveMaxLatencyDurationCount) &&\n    (userConfig.liveSyncDuration || userConfig.liveMaxLatencyDuration)\n  ) {\n    throw new Error(\n      \"Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration\",\n    );\n  }\n\n  if (\n    userConfig.liveMaxLatencyDurationCount !== undefined &&\n    (userConfig.liveSyncDurationCount === undefined ||\n      userConfig.liveMaxLatencyDurationCount <=\n        userConfig.liveSyncDurationCount)\n  ) {\n    throw new Error(\n      'Illegal hls.js config: \"liveMaxLatencyDurationCount\" must be greater than \"liveSyncDurationCount\"',\n    );\n  }\n\n  if (\n    userConfig.liveMaxLatencyDuration !== undefined &&\n    (userConfig.liveSyncDuration === undefined ||\n      userConfig.liveMaxLatencyDuration <= userConfig.liveSyncDuration)\n  ) {\n    throw new Error(\n      'Illegal hls.js config: \"liveMaxLatencyDuration\" must be greater than \"liveSyncDuration\"',\n    );\n  }\n\n  const defaultsCopy = deepCpy(defaultConfig);\n\n  // Backwards compatibility with deprecated config values\n  const deprecatedSettingTypes = ['manifest', 'level', 'frag'];\n  const deprecatedSettings = [\n    'TimeOut',\n    'MaxRetry',\n    'RetryDelay',\n    'MaxRetryTimeout',\n  ];\n  deprecatedSettingTypes.forEach((type) => {\n    const policyName = `${type === 'level' ? 'playlist' : type}LoadPolicy`;\n    const policyNotSet = userConfig[policyName] === undefined;\n    const report: string[] = [];\n    deprecatedSettings.forEach((setting) => {\n      const deprecatedSetting = `${type}Loading${setting}`;\n      const value = userConfig[deprecatedSetting];\n      if (value !== undefined && policyNotSet) {\n        report.push(deprecatedSetting);\n        const settings: LoaderConfig = defaultsCopy[policyName].default;\n        userConfig[policyName] = { default: settings };\n        switch (setting) {\n          case 'TimeOut':\n            settings.maxLoadTimeMs = value;\n            settings.maxTimeToFirstByteMs = value;\n            break;\n          case 'MaxRetry':\n            settings.errorRetry!.maxNumRetry = value;\n            settings.timeoutRetry!.maxNumRetry = value;\n            break;\n          case 'RetryDelay':\n            settings.errorRetry!.retryDelayMs = value;\n            settings.timeoutRetry!.retryDelayMs = value;\n            break;\n          case 'MaxRetryTimeout':\n            settings.errorRetry!.maxRetryDelayMs = value;\n            settings.timeoutRetry!.maxRetryDelayMs = value;\n            break;\n        }\n      }\n    });\n    if (report.length) {\n      logger.warn(\n        `hls.js config: \"${report.join(\n          '\", \"',\n        )}\" setting(s) are deprecated, use \"${policyName}\": ${stringify(\n          userConfig[policyName],\n        )}`,\n      );\n    }\n  });\n\n  return {\n    ...defaultsCopy,\n    ...userConfig,\n  };\n}\n\nfunction deepCpy(obj: any): any {\n  if (obj && typeof obj === 'object') {\n    if (Array.isArray(obj)) {\n      return obj.map(deepCpy);\n    }\n    return Object.keys(obj).reduce((result, key) => {\n      result[key] = deepCpy(obj[key]);\n      return result;\n    }, {});\n  }\n  return obj;\n}\n\n/**\n * @ignore\n */\nexport function enableStreamingMode(config: HlsConfig, logger: ILogger) {\n  const currentLoader = config.loader;\n  if (currentLoader !== FetchLoader && currentLoader !== XhrLoader) {\n    // If a developer has configured their own loader, respect that choice\n    logger.log(\n      '[config]: Custom loader detected, cannot enable progressive streaming',\n    );\n    config.progressive = false;\n  } else {\n    const canStreamProgressively = fetchSupported();\n    if (canStreamProgressively) {\n      config.loader = FetchLoader;\n      config.progressive = true;\n      config.enableSoftwareAES = true;\n      logger.log('[config]: Progressive streaming enabled, using FetchLoader');\n    }\n  }\n}\n", "import { State } from './base-stream-controller';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport TaskLoop from '../task-loop';\nimport { PlaylistLevelType } from '../types/loader';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport {\n  addEventListener,\n  removeEventListener,\n} from '../utils/event-listener-helper';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type { InFlightData } from './base-stream-controller';\nimport type { InFlightFragments } from '../hls';\nimport type Hls from '../hls';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type { Fragment, MediaFragment, Part } from '../loader/fragment';\nimport type { SourceBufferName } from '../types/buffer';\nimport type {\n  BufferAppendedData,\n  MediaAttachedData,\n  MediaDetachingData,\n} from '../types/events';\nimport type { ErrorData } from '../types/events';\nimport type { BufferInfo } from '../utils/buffer-helper';\n\nexport const MAX_START_GAP_JUMP = 2.0;\nexport const SKIP_BUFFER_HOLE_STEP_SECONDS = 0.1;\nexport const SKIP_BUFFER_RANGE_START = 0.05;\nconst TICK_INTERVAL = 100;\n\nexport default class GapController extends TaskLoop {\n  private hls: Hls | null;\n  private fragmentTracker: FragmentTracker | null;\n  private media: HTMLMediaElement | null = null;\n  private mediaSource?: MediaSource;\n\n  private nudgeRetry: number = 0;\n  private stallReported: boolean = false;\n  private stalled: number | null = null;\n  private moved: boolean = false;\n  private seeking: boolean = false;\n  private buffered: Partial<Record<SourceBufferName, TimeRanges>> = {};\n\n  private lastCurrentTime: number = 0;\n  public ended: number = 0;\n  public waiting: number = 0;\n\n  constructor(hls: Hls, fragmentTracker: FragmentTracker) {\n    super('gap-controller', hls.logger);\n    this.hls = hls;\n    this.fragmentTracker = fragmentTracker;\n    this.registerListeners();\n  }\n\n  private registerListeners() {\n    const { hls } = this;\n    if (hls) {\n      hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n    }\n  }\n\n  private unregisterListeners() {\n    const { hls } = this;\n    if (hls) {\n      hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n    }\n  }\n\n  public destroy() {\n    super.destroy();\n    this.unregisterListeners();\n    this.media = this.hls = this.fragmentTracker = null;\n    this.mediaSource = undefined;\n  }\n\n  private onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) {\n    this.setInterval(TICK_INTERVAL);\n    this.mediaSource = data.mediaSource;\n    const media = (this.media = data.media);\n    addEventListener(media, 'playing', this.onMediaPlaying);\n    addEventListener(media, 'waiting', this.onMediaWaiting);\n    addEventListener(media, 'ended', this.onMediaEnded);\n  }\n\n  private onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    this.clearInterval();\n    const { media } = this;\n    if (media) {\n      removeEventListener(media, 'playing', this.onMediaPlaying);\n      removeEventListener(media, 'waiting', this.onMediaWaiting);\n      removeEventListener(media, 'ended', this.onMediaEnded);\n      this.media = null;\n    }\n    this.mediaSource = undefined;\n  }\n\n  private onBufferAppended(\n    event: Events.BUFFER_APPENDED,\n    data: BufferAppendedData,\n  ) {\n    this.buffered = data.timeRanges;\n  }\n\n  private onMediaPlaying = () => {\n    this.ended = 0;\n    this.waiting = 0;\n  };\n\n  private onMediaWaiting = () => {\n    if (this.media?.seeking) {\n      return;\n    }\n    this.waiting = self.performance.now();\n    this.tick();\n  };\n\n  private onMediaEnded = () => {\n    if (this.hls) {\n      // ended is set when triggering MEDIA_ENDED so that we do not trigger it again on stall or on tick with media.ended\n      this.ended = this.media?.currentTime || 1;\n      this.hls.trigger(Events.MEDIA_ENDED, {\n        stalled: false,\n      });\n    }\n  };\n\n  public get hasBuffered(): boolean {\n    return Object.keys(this.buffered).length > 0;\n  }\n\n  public tick() {\n    if (!this.media?.readyState || !this.hasBuffered) {\n      return;\n    }\n\n    const currentTime = this.media.currentTime;\n    this.poll(currentTime, this.lastCurrentTime);\n    this.lastCurrentTime = currentTime;\n  }\n\n  /**\n   * Checks if the playhead is stuck within a gap, and if so, attempts to free it.\n   * A gap is an unbuffered range between two buffered ranges (or the start and the first buffered range).\n   *\n   * @param lastCurrentTime - Previously read playhead position\n   */\n  public poll(currentTime: number, lastCurrentTime: number) {\n    const config = this.hls?.config;\n    if (!config) {\n      return;\n    }\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    const { seeking } = media;\n    const seeked = this.seeking && !seeking;\n    const beginSeek = !this.seeking && seeking;\n    const pausedEndedOrHalted =\n      (media.paused && !seeking) || media.ended || media.playbackRate === 0;\n\n    this.seeking = seeking;\n\n    // The playhead is moving, no-op\n    if (currentTime !== lastCurrentTime) {\n      if (lastCurrentTime) {\n        this.ended = 0;\n      }\n      this.moved = true;\n      if (!seeking) {\n        this.nudgeRetry = 0;\n        // When crossing between buffered video time ranges, but not audio, flush pipeline with seek (Chrome)\n        if (\n          config.nudgeOnVideoHole &&\n          !pausedEndedOrHalted &&\n          currentTime > lastCurrentTime\n        ) {\n          this.nudgeOnVideoHole(currentTime, lastCurrentTime);\n        }\n      }\n      if (this.waiting === 0) {\n        this.stallResolved(currentTime);\n      }\n      return;\n    }\n\n    // Clear stalled state when beginning or finishing seeking so that we don't report stalls coming out of a seek\n    if (beginSeek || seeked) {\n      if (seeked) {\n        this.stallResolved(currentTime);\n      }\n      return;\n    }\n\n    // The playhead should not be moving\n    if (pausedEndedOrHalted) {\n      this.nudgeRetry = 0;\n      this.stallResolved(currentTime);\n      // Fire MEDIA_ENDED to workaround event not being dispatched by browser\n      if (!this.ended && media.ended && this.hls) {\n        this.ended = currentTime || 1;\n        this.hls.trigger(Events.MEDIA_ENDED, {\n          stalled: false,\n        });\n      }\n      return;\n    }\n\n    if (!BufferHelper.getBuffered(media).length) {\n      this.nudgeRetry = 0;\n      return;\n    }\n\n    // Resolve stalls at buffer holes using the main buffer, whose ranges are the intersections of the A/V sourcebuffers\n    const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n    const nextStart = bufferInfo.nextStart || 0;\n    const fragmentTracker = this.fragmentTracker;\n\n    if (seeking && fragmentTracker && this.hls) {\n      // Is there a fragment loading/parsing/appending before currentTime?\n      const inFlightDependency = getInFlightDependency(\n        this.hls.inFlightFragments,\n        currentTime,\n      );\n\n      // Waiting for seeking in a buffered range to complete\n      const hasEnoughBuffer = bufferInfo.len > MAX_START_GAP_JUMP;\n      // Next buffered range is too far ahead to jump to while still seeking\n      const noBufferHole =\n        !nextStart ||\n        inFlightDependency ||\n        (nextStart - currentTime > MAX_START_GAP_JUMP &&\n          !fragmentTracker.getPartialFragment(currentTime));\n      if (hasEnoughBuffer || noBufferHole) {\n        return;\n      }\n      // Reset moved state when seeking to a point in or before a gap/hole\n      this.moved = false;\n    }\n\n    // Skip start gaps if we haven't played, but the last poll detected the start of a stall\n    // The addition poll gives the browser a chance to jump the gap for us\n    const levelDetails = this.hls?.latestLevelDetails;\n    if (!this.moved && this.stalled !== null && fragmentTracker) {\n      // There is no playable buffer (seeked, waiting for buffer)\n      const isBuffered = bufferInfo.len > 0;\n      if (!isBuffered && !nextStart) {\n        return;\n      }\n      // Jump start gaps within jump threshold\n      const startJump =\n        Math.max(nextStart, bufferInfo.start || 0) - currentTime;\n\n      // When joining a live stream with audio tracks, account for live playlist window sliding by allowing\n      // a larger jump over start gaps caused by the audio-stream-controller buffering a start fragment\n      // that begins over 1 target duration after the video start position.\n      const isLive = !!levelDetails?.live;\n      const maxStartGapJump = isLive\n        ? levelDetails!.targetduration * 2\n        : MAX_START_GAP_JUMP;\n      const appended = appendedFragAtPosition(currentTime, fragmentTracker);\n      if (startJump > 0 && (startJump <= maxStartGapJump || appended)) {\n        if (!media.paused) {\n          this._trySkipBufferHole(appended);\n        }\n        return;\n      }\n    }\n\n    // Start tracking stall time\n    const detectStallWithCurrentTimeMs = config.detectStallWithCurrentTimeMs;\n    const tnow = self.performance.now();\n    const tWaiting = this.waiting;\n    let stalled = this.stalled;\n    if (stalled === null) {\n      // Use time of recent \"waiting\" event\n      if (tWaiting > 0 && tnow - tWaiting < detectStallWithCurrentTimeMs) {\n        stalled = this.stalled = tWaiting;\n      } else {\n        this.stalled = tnow;\n        return;\n      }\n    }\n\n    const stalledDuration = tnow - stalled;\n    if (\n      !seeking &&\n      (stalledDuration >= detectStallWithCurrentTimeMs || tWaiting) &&\n      this.hls\n    ) {\n      // Dispatch MEDIA_ENDED when media.ended/ended event is not signalled at end of stream\n      if (\n        this.mediaSource?.readyState === 'ended' &&\n        !levelDetails?.live &&\n        Math.abs(currentTime - (levelDetails?.edge || 0)) < 1\n      ) {\n        if (this.ended) {\n          return;\n        }\n        this.ended = currentTime || 1;\n        this.hls.trigger(Events.MEDIA_ENDED, {\n          stalled: true,\n        });\n        return;\n      }\n      // Report stalling after trying to fix\n      this._reportStall(bufferInfo);\n      if (!this.media || (!this.hls as any)) {\n        return;\n      }\n    }\n\n    const bufferedWithHoles = BufferHelper.bufferInfo(\n      media,\n      currentTime,\n      config.maxBufferHole,\n    );\n    this._tryFixBufferStall(bufferedWithHoles, stalledDuration, currentTime);\n  }\n\n  private stallResolved(currentTime: number) {\n    const stalled = this.stalled;\n    if (stalled && this.hls) {\n      this.stalled = null;\n      // The playhead is now moving, but was previously stalled\n      if (this.stallReported) {\n        const stalledDuration = self.performance.now() - stalled;\n        this.log(\n          `playback not stuck anymore @${currentTime}, after ${Math.round(\n            stalledDuration,\n          )}ms`,\n        );\n        this.stallReported = false;\n        this.waiting = 0;\n        this.hls.trigger(Events.STALL_RESOLVED, {});\n      }\n    }\n  }\n\n  private nudgeOnVideoHole(currentTime: number, lastCurrentTime: number) {\n    // Chrome will play one second past a hole in video buffered time ranges without rendering any video from the subsequent range and then stall as long as audio is buffered:\n    // https://github.com/video-dev/hls.js/issues/5631\n    // https://issues.chromium.org/issues/40280613#comment10\n    // Detect the potential for this situation and proactively seek to flush the video pipeline once the playhead passes the start of the video hole.\n    // When there are audio and video buffers and currentTime is past the end of the first video buffered range...\n    const videoSourceBuffered = this.buffered.video;\n    if (\n      this.hls &&\n      this.media &&\n      this.fragmentTracker &&\n      this.buffered.audio?.length &&\n      videoSourceBuffered &&\n      videoSourceBuffered.length > 1 &&\n      currentTime > videoSourceBuffered.end(0)\n    ) {\n      // and audio is buffered at the playhead\n      const audioBufferInfo = BufferHelper.bufferedInfo(\n        BufferHelper.timeRangesToArray(this.buffered.audio),\n        currentTime,\n        0,\n      );\n      if (audioBufferInfo.len > 1 && lastCurrentTime >= audioBufferInfo.start) {\n        const videoTimes = BufferHelper.timeRangesToArray(videoSourceBuffered);\n        const lastBufferedIndex = BufferHelper.bufferedInfo(\n          videoTimes,\n          lastCurrentTime,\n          0,\n        ).bufferedIndex;\n        // nudge when crossing into another video buffered range (hole).\n        if (\n          lastBufferedIndex > -1 &&\n          lastBufferedIndex < videoTimes.length - 1\n        ) {\n          const bufferedIndex = BufferHelper.bufferedInfo(\n            videoTimes,\n            currentTime,\n            0,\n          ).bufferedIndex;\n          const holeStart = videoTimes[lastBufferedIndex].end;\n          const holeEnd = videoTimes[lastBufferedIndex + 1].start;\n          if (\n            (bufferedIndex === -1 || bufferedIndex > lastBufferedIndex) &&\n            holeEnd - holeStart < 1 && // `maxBufferHole` may be too small and setting it to 0 should not disable this feature\n            currentTime - holeStart < 2\n          ) {\n            const error = new Error(\n              `nudging playhead to flush pipeline after video hole. currentTime: ${currentTime} hole: ${holeStart} -> ${holeEnd} buffered index: ${bufferedIndex}`,\n            );\n            this.warn(error.message);\n            // Magic number to flush the pipeline without interuption to audio playback:\n            this.media.currentTime += 0.000001;\n            let frag: MediaFragment | Part | null | undefined =\n              appendedFragAtPosition(currentTime, this.fragmentTracker);\n            if (frag && 'fragment' in frag) {\n              frag = frag.fragment;\n            } else if (!frag) {\n              frag = undefined;\n            }\n            const bufferInfo = BufferHelper.bufferInfo(\n              this.media,\n              currentTime,\n              0,\n            );\n            this.hls.trigger(Events.ERROR, {\n              type: ErrorTypes.MEDIA_ERROR,\n              details: ErrorDetails.BUFFER_SEEK_OVER_HOLE,\n              fatal: false,\n              error,\n              reason: error.message,\n              frag,\n              buffer: bufferInfo.len,\n              bufferInfo,\n            });\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Detects and attempts to fix known buffer stalling issues.\n   * @param bufferInfo - The properties of the current buffer.\n   * @param stalledDurationMs - The amount of time Hls.js has been stalling for.\n   * @private\n   */\n  private _tryFixBufferStall(\n    bufferInfo: BufferInfo,\n    stalledDurationMs: number,\n    currentTime: number,\n  ) {\n    const { fragmentTracker, media } = this;\n    const config = this.hls?.config;\n    if (!media || !fragmentTracker || !config) {\n      return;\n    }\n\n    const levelDetails = this.hls?.latestLevelDetails;\n    const appended = appendedFragAtPosition(currentTime, fragmentTracker);\n    if (\n      appended ||\n      (levelDetails?.live && currentTime < levelDetails.fragmentStart)\n    ) {\n      // Try to skip over the buffer hole caused by a partial fragment\n      // This method isn't limited by the size of the gap between buffered ranges\n      const targetTime = this._trySkipBufferHole(appended);\n      // we return here in this case, meaning\n      // the branch below only executes when we haven't seeked to a new position\n      if (targetTime || !this.media) {\n        return;\n      }\n    }\n\n    // if we haven't had to skip over a buffer hole of a partial fragment\n    // we may just have to \"nudge\" the playlist as the browser decoding/rendering engine\n    // needs to cross some sort of threshold covering all source-buffers content\n    // to start playing properly.\n    const bufferedRanges = bufferInfo.buffered;\n    const adjacentTraversal = this.adjacentTraversal(bufferInfo, currentTime);\n    if (\n      ((bufferedRanges &&\n        bufferedRanges.length > 1 &&\n        bufferInfo.len > config.maxBufferHole) ||\n        (bufferInfo.nextStart &&\n          (bufferInfo.nextStart - currentTime < config.maxBufferHole ||\n            adjacentTraversal))) &&\n      (stalledDurationMs > config.highBufferWatchdogPeriod * 1000 ||\n        this.waiting)\n    ) {\n      this.warn('Trying to nudge playhead over buffer-hole');\n      // Try to nudge currentTime over a buffer hole if we've been stalling for the configured amount of seconds\n      // We only try to jump the hole if it's under the configured size\n      this._tryNudgeBuffer(bufferInfo);\n    }\n  }\n\n  private adjacentTraversal(bufferInfo: BufferInfo, currentTime: number) {\n    const fragmentTracker = this.fragmentTracker;\n    const nextStart = bufferInfo.nextStart;\n    if (fragmentTracker && nextStart) {\n      const current = fragmentTracker.getFragAtPos(\n        currentTime,\n        PlaylistLevelType.MAIN,\n      );\n      const next = fragmentTracker.getFragAtPos(\n        nextStart,\n        PlaylistLevelType.MAIN,\n      );\n      if (current && next) {\n        return next.sn - current.sn < 2;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Triggers a BUFFER_STALLED_ERROR event, but only once per stall period.\n   * @param bufferLen - The playhead distance from the end of the current buffer segment.\n   * @private\n   */\n  private _reportStall(bufferInfo: BufferInfo) {\n    const { hls, media, stallReported, stalled } = this;\n    if (!stallReported && stalled !== null && media && hls) {\n      // Report stalled error once\n      this.stallReported = true;\n      const error = new Error(\n        `Playback stalling at @${\n          media.currentTime\n        } due to low buffer (${stringify(bufferInfo)})`,\n      );\n      this.warn(error.message);\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_STALLED_ERROR,\n        fatal: false,\n        error,\n        buffer: bufferInfo.len,\n        bufferInfo,\n        stalled: { start: stalled },\n      });\n    }\n  }\n\n  /**\n   * Attempts to fix buffer stalls by jumping over known gaps caused by partial fragments\n   * @param appended - The fragment or part found at the current time (where playback is stalling).\n   * @private\n   */\n  private _trySkipBufferHole(appended: MediaFragment | Part | null): number {\n    const { fragmentTracker, media } = this;\n    const config = this.hls?.config;\n    if (!media || !fragmentTracker || !config) {\n      return 0;\n    }\n\n    // Check if currentTime is between unbuffered regions of partial fragments\n    const currentTime = media.currentTime;\n    const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n    const startTime =\n      currentTime < bufferInfo.start ? bufferInfo.start : bufferInfo.nextStart;\n    if (startTime && this.hls) {\n      const bufferStarved = bufferInfo.len <= config.maxBufferHole;\n      const waiting =\n        bufferInfo.len > 0 && bufferInfo.len < 1 && media.readyState < 3;\n      const gapLength = startTime - currentTime;\n      if (gapLength > 0 && (bufferStarved || waiting)) {\n        // Only allow large gaps to be skipped if it is a start gap, or all fragments in skip range are partial\n        if (gapLength > config.maxBufferHole) {\n          let startGap = false;\n          if (currentTime === 0) {\n            const startFrag = fragmentTracker.getAppendedFrag(\n              0,\n              PlaylistLevelType.MAIN,\n            );\n            if (startFrag && startTime < startFrag.end) {\n              startGap = true;\n            }\n          }\n          if (!startGap && appended) {\n            // Do not seek when selected variant playlist is unloaded\n            if (!this.hls.loadLevelObj?.details) {\n              return 0;\n            }\n            // Do not seek when required fragments are inflight or appending\n            const inFlightDependency = getInFlightDependency(\n              this.hls.inFlightFragments,\n              startTime,\n            );\n            if (inFlightDependency) {\n              return 0;\n            }\n            // Do not seek if we can't walk tracked fragments to end of gap\n            let moreToLoad = false;\n            let pos = appended.end;\n            while (pos < startTime) {\n              const provisioned = appendedFragAtPosition(pos, fragmentTracker);\n              if (provisioned) {\n                pos += provisioned.duration;\n              } else {\n                moreToLoad = true;\n                break;\n              }\n            }\n            if (moreToLoad) {\n              return 0;\n            }\n          }\n        }\n        const targetTime = Math.max(\n          startTime + SKIP_BUFFER_RANGE_START,\n          currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS,\n        );\n        this.warn(\n          `skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}`,\n        );\n        this.moved = true;\n        media.currentTime = targetTime;\n        if (!appended?.gap) {\n          const error = new Error(\n            `fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}`,\n          );\n          const errorData: ErrorData = {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.BUFFER_SEEK_OVER_HOLE,\n            fatal: false,\n            error,\n            reason: error.message,\n            buffer: bufferInfo.len,\n            bufferInfo,\n          };\n          if (appended) {\n            if ('fragment' in appended) {\n              errorData.part = appended;\n            } else {\n              errorData.frag = appended;\n            }\n          }\n          this.hls.trigger(Events.ERROR, errorData);\n        }\n        return targetTime;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * Attempts to fix buffer stalls by advancing the mediaElement's current time by a small amount.\n   * @private\n   */\n  private _tryNudgeBuffer(bufferInfo: BufferInfo) {\n    const { hls, media, nudgeRetry } = this;\n    const config = hls?.config;\n    if (!media || !config) {\n      return 0;\n    }\n    const currentTime = media.currentTime;\n    this.nudgeRetry++;\n\n    if (nudgeRetry < config.nudgeMaxRetry) {\n      const targetTime = currentTime + (nudgeRetry + 1) * config.nudgeOffset;\n      // playback stalled in buffered area ... let's nudge currentTime to try to overcome this\n      const error = new Error(\n        `Nudging 'currentTime' from ${currentTime} to ${targetTime}`,\n      );\n      this.warn(error.message);\n      media.currentTime = targetTime;\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_NUDGE_ON_STALL,\n        error,\n        fatal: false,\n        buffer: bufferInfo.len,\n        bufferInfo,\n      });\n    } else {\n      const error = new Error(\n        `Playhead still not moving while enough data buffered @${currentTime} after ${config.nudgeMaxRetry} nudges`,\n      );\n      this.error(error.message);\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_STALLED_ERROR,\n        error,\n        fatal: true,\n        buffer: bufferInfo.len,\n        bufferInfo,\n      });\n    }\n  }\n}\n\nfunction getInFlightDependency(\n  inFlightFragments: InFlightFragments,\n  currentTime: number,\n): Fragment | null {\n  const main = inFlight(inFlightFragments.main);\n  if (main && main.start <= currentTime) {\n    return main;\n  }\n  const audio = inFlight(inFlightFragments.audio);\n  if (audio && audio.start <= currentTime) {\n    return audio;\n  }\n  return null;\n}\n\nfunction inFlight(inFlightData: InFlightData | undefined): Fragment | null {\n  if (!inFlightData) {\n    return null;\n  }\n  switch (inFlightData.state) {\n    case State.IDLE:\n    case State.STOPPED:\n    case State.ENDED:\n    case State.ERROR:\n      return null;\n  }\n  return inFlightData.frag;\n}\n\nfunction appendedFragAtPosition(pos: number, fragmentTracker: FragmentTracker) {\n  return (\n    fragmentTracker.getAppendedFrag(pos, PlaylistLevelType.MAIN) ||\n    fragmentTracker.getPartialFragment(pos)\n  );\n}\n", "import { getId3Frames } from '@svta/common-media-library/id3/getId3Frames';\nimport { isId3TimestampFrame } from '@svta/common-media-library/id3/isId3TimestampFrame';\nimport { Events } from '../events';\nimport {\n  isDateRangeCueAttribute,\n  isSCTE35Attribute,\n} from '../loader/date-range';\nimport { MetadataSchema } from '../types/demuxer';\nimport { hexToArrayBuffer } from '../utils/hex';\nimport { stringify } from '../utils/safe-json-stringify';\nimport {\n  clearCurrentCues,\n  removeCuesInRange,\n  sendAddTrackEvent,\n} from '../utils/texttrack-utils';\nimport type { MediaFragment } from '../hls';\nimport type Hls from '../hls';\nimport type { DateRange } from '../loader/date-range';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  BufferFlushingData,\n  FragParsingMetadataData,\n  LevelPTSUpdatedData,\n  LevelUpdatedData,\n  MediaAttachingData,\n  MediaDetachingData,\n} from '../types/events';\n\ndeclare global {\n  interface Window {\n    WebKitDataCue: VTTCue | void;\n  }\n}\n\nconst MIN_CUE_DURATION = 0.25;\n\nfunction getCueClass(): typeof VTTCue | typeof TextTrackCue | undefined {\n  if (typeof self === 'undefined') return undefined;\n  return (self.VTTCue as typeof VTTCue | undefined) || self.TextTrackCue;\n}\n\nfunction createCueWithDataFields(\n  Cue: typeof VTTCue | typeof TextTrackCue,\n  startTime: number,\n  endTime: number,\n  data: Object,\n  type?: string,\n): VTTCue | TextTrackCue | undefined {\n  let cue = new Cue(startTime, endTime, '');\n  try {\n    (cue as any).value = data;\n    if (type) {\n      (cue as any).type = type;\n    }\n  } catch (e) {\n    cue = new Cue(\n      startTime,\n      endTime,\n      stringify(type ? { type, ...data } : data),\n    );\n  }\n  return cue;\n}\n\n// VTTCue latest draft allows an infinite duration, fallback\n// to MAX_VALUE if necessary\nconst MAX_CUE_ENDTIME = (() => {\n  const Cue = getCueClass();\n  try {\n    Cue && new Cue(0, Number.POSITIVE_INFINITY, '');\n  } catch (e) {\n    return Number.MAX_VALUE;\n  }\n  return Number.POSITIVE_INFINITY;\n})();\n\nclass ID3TrackController implements ComponentAPI {\n  private hls: Hls | null;\n  private id3Track: TextTrack | null = null;\n  private media: HTMLMediaElement | null = null;\n  private dateRangeCuesAppended: Record<\n    string,\n    | {\n        cues: Record<string, VTTCue | TextTrackCue | undefined>;\n        dateRange: DateRange;\n        durationKnown: boolean;\n      }\n    | undefined\n  > = {};\n  private removeCues: boolean = true;\n  private assetCue?: VTTCue | TextTrackCue;\n\n  constructor(hls) {\n    this.hls = hls;\n    this._registerListeners();\n  }\n\n  public destroy() {\n    this._unregisterListeners();\n    this.id3Track = null;\n    this.media = null;\n    this.dateRangeCuesAppended = {};\n    // @ts-ignore\n    this.hls = this.onEventCueEnter = null;\n  }\n\n  private _registerListeners() {\n    const { hls } = this;\n    if (hls) {\n      hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.on(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);\n      hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n      hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.on(Events.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this);\n    }\n  }\n\n  private _unregisterListeners() {\n    const { hls } = this;\n    if (hls) {\n      hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.off(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);\n      hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n      hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.off(Events.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this);\n    }\n  }\n\n  private onEventCueEnter = () => {\n    if (!this.hls) {\n      return;\n    }\n    this.hls.trigger(Events.EVENT_CUE_ENTER, {});\n  };\n\n  // Add ID3 metatadata text track.\n  private onMediaAttaching(\n    event: Events.MEDIA_ATTACHING,\n    data: MediaAttachingData,\n  ): void {\n    this.media = data.media;\n    if (data.overrides?.cueRemoval === false) {\n      this.removeCues = false;\n    }\n  }\n\n  private onMediaAttached() {\n    const details = this.hls?.latestLevelDetails;\n    if (details) {\n      this.updateDateRangeCues(details);\n    }\n  }\n\n  private onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    this.media = null;\n    const transferringMedia = !!data.transferMedia;\n    if (transferringMedia) {\n      return;\n    }\n    if (this.id3Track) {\n      if (this.removeCues) {\n        clearCurrentCues(this.id3Track, this.onEventCueEnter);\n      }\n      this.id3Track = null;\n    }\n    this.dateRangeCuesAppended = {};\n  }\n\n  private onManifestLoading() {\n    this.dateRangeCuesAppended = {};\n  }\n\n  private createTrack(media: HTMLMediaElement): TextTrack {\n    const track = this.getID3Track(media.textTracks) as TextTrack;\n    track.mode = 'hidden';\n    return track;\n  }\n\n  private getID3Track(textTracks: TextTrackList): TextTrack | void {\n    if (!this.media) {\n      return;\n    }\n    for (let i = 0; i < textTracks.length; i++) {\n      const textTrack: TextTrack = textTracks[i];\n      if (textTrack.kind === 'metadata' && textTrack.label === 'id3') {\n        // send 'addtrack' when reusing the textTrack for metadata,\n        // same as what we do for captions\n        sendAddTrackEvent(textTrack, this.media);\n\n        return textTrack;\n      }\n    }\n    return this.media.addTextTrack('metadata', 'id3');\n  }\n\n  private onFragParsingMetadata(\n    event: Events.FRAG_PARSING_METADATA,\n    data: FragParsingMetadataData,\n  ) {\n    if (!this.media || !this.hls) {\n      return;\n    }\n\n    const { enableEmsgMetadataCues, enableID3MetadataCues } = this.hls.config;\n    if (!enableEmsgMetadataCues && !enableID3MetadataCues) {\n      return;\n    }\n\n    const { samples } = data;\n\n    // create track dynamically\n    if (!this.id3Track) {\n      this.id3Track = this.createTrack(this.media);\n    }\n\n    const Cue = getCueClass();\n    if (!Cue) {\n      return;\n    }\n\n    for (let i = 0; i < samples.length; i++) {\n      const type = samples[i].type;\n      if (\n        (type === MetadataSchema.emsg && !enableEmsgMetadataCues) ||\n        !enableID3MetadataCues\n      ) {\n        continue;\n      }\n\n      const frames = getId3Frames(samples[i].data);\n      const startTime = samples[i].pts;\n      let endTime: number = startTime + samples[i].duration;\n\n      if (endTime > MAX_CUE_ENDTIME) {\n        endTime = MAX_CUE_ENDTIME;\n      }\n\n      const timeDiff = endTime - startTime;\n      if (timeDiff <= 0) {\n        endTime = startTime + MIN_CUE_DURATION;\n      }\n\n      for (let j = 0; j < frames.length; j++) {\n        const frame = frames[j];\n        // Safari doesn't put the timestamp frame in the TextTrack\n        if (!isId3TimestampFrame(frame)) {\n          // add a bounds to any unbounded cues\n          this.updateId3CueEnds(startTime, type);\n          const cue = createCueWithDataFields(\n            Cue,\n            startTime,\n            endTime,\n            frame,\n            type,\n          );\n          if (cue) {\n            this.id3Track.addCue(cue);\n          }\n        }\n      }\n    }\n  }\n\n  private updateId3CueEnds(startTime: number, type: MetadataSchema) {\n    const cues = this.id3Track?.cues;\n    if (cues) {\n      for (let i = cues.length; i--; ) {\n        const cue = cues[i] as any;\n        if (\n          cue.type === type &&\n          cue.startTime < startTime &&\n          cue.endTime === MAX_CUE_ENDTIME\n        ) {\n          cue.endTime = startTime;\n        }\n      }\n    }\n  }\n\n  private onBufferFlushing(\n    event: Events.BUFFER_FLUSHING,\n    { startOffset, endOffset, type }: BufferFlushingData,\n  ) {\n    const { id3Track, hls } = this;\n    if (!hls) {\n      return;\n    }\n\n    const {\n      config: { enableEmsgMetadataCues, enableID3MetadataCues },\n    } = hls;\n    if (id3Track && (enableEmsgMetadataCues || enableID3MetadataCues)) {\n      let predicate;\n\n      if (type === 'audio') {\n        predicate = (cue) =>\n          (cue as any).type === MetadataSchema.audioId3 &&\n          enableID3MetadataCues;\n      } else if (type === 'video') {\n        predicate = (cue) =>\n          (cue as any).type === MetadataSchema.emsg && enableEmsgMetadataCues;\n      } else {\n        predicate = (cue) =>\n          ((cue as any).type === MetadataSchema.audioId3 &&\n            enableID3MetadataCues) ||\n          ((cue as any).type === MetadataSchema.emsg && enableEmsgMetadataCues);\n      }\n      removeCuesInRange(id3Track, startOffset, endOffset, predicate);\n    }\n  }\n\n  private onLevelUpdated(\n    event: Events.LEVEL_UPDATED,\n    { details }: LevelUpdatedData,\n  ) {\n    this.updateDateRangeCues(details, true);\n  }\n\n  private onLevelPtsUpdated(\n    event: Events.LEVEL_PTS_UPDATED,\n    data: LevelPTSUpdatedData,\n  ) {\n    if (Math.abs(data.drift) > 0.01) {\n      this.updateDateRangeCues(data.details);\n    }\n  }\n\n  private updateDateRangeCues(details: LevelDetails, removeOldCues?: true) {\n    if (!this.hls || !this.media) {\n      return;\n    }\n    const {\n      assetPlayerId,\n      timelineOffset,\n      enableDateRangeMetadataCues,\n      interstitialsController,\n    } = this.hls.config;\n    if (!enableDateRangeMetadataCues) {\n      return;\n    }\n\n    const Cue = getCueClass();\n    if (\n      __USE_INTERSTITIALS__ &&\n      assetPlayerId &&\n      timelineOffset &&\n      !interstitialsController\n    ) {\n      const { fragmentStart, fragmentEnd } = details;\n      let cue = this.assetCue;\n      if (cue) {\n        cue.startTime = fragmentStart;\n        cue.endTime = fragmentEnd;\n      } else if (Cue) {\n        cue = this.assetCue = createCueWithDataFields(\n          Cue,\n          fragmentStart,\n          fragmentEnd,\n          { assetPlayerId: this.hls.config.assetPlayerId },\n          'hlsjs.interstitial.asset',\n        );\n        if (cue) {\n          cue.id = assetPlayerId;\n          this.id3Track ||= this.createTrack(this.media);\n          this.id3Track.addCue(cue);\n          cue.addEventListener('enter', this.onEventCueEnter);\n        }\n      }\n    }\n\n    if (!details.hasProgramDateTime) {\n      return;\n    }\n    const { id3Track } = this;\n    const { dateRanges } = details;\n    const ids = Object.keys(dateRanges);\n    let dateRangeCuesAppended = this.dateRangeCuesAppended;\n    // Remove cues from track not found in details.dateRanges\n    if (id3Track && removeOldCues) {\n      if (id3Track.cues?.length) {\n        const idsToRemove = Object.keys(dateRangeCuesAppended).filter(\n          (id) => !ids.includes(id),\n        );\n        for (let i = idsToRemove.length; i--; ) {\n          const id = idsToRemove[i];\n          const cues = dateRangeCuesAppended[id]?.cues;\n          delete dateRangeCuesAppended[id];\n          if (cues) {\n            Object.keys(cues).forEach((key) => {\n              const cue = cues[key];\n              if (cue) {\n                cue.removeEventListener('enter', this.onEventCueEnter);\n                try {\n                  id3Track.removeCue(cue);\n                } catch (e) {\n                  /* no-op */\n                }\n              }\n            });\n          }\n        }\n      } else {\n        dateRangeCuesAppended = this.dateRangeCuesAppended = {};\n      }\n    }\n    // Exit if the playlist does not have Date Ranges or does not have Program Date Time\n    const lastFragment = details.fragments[details.fragments.length - 1] as\n      | MediaFragment\n      | undefined;\n    if (ids.length === 0 || !Number.isFinite(lastFragment?.programDateTime)) {\n      return;\n    }\n\n    this.id3Track ||= this.createTrack(this.media);\n\n    for (let i = 0; i < ids.length; i++) {\n      const id = ids[i];\n      const dateRange = dateRanges[id]!;\n      const startTime = dateRange.startTime;\n\n      // Process DateRanges to determine end-time (known DURATION, END-DATE, or END-ON-NEXT)\n      const appendedDateRangeCues = dateRangeCuesAppended[id];\n      const cues = appendedDateRangeCues?.cues || {};\n      let durationKnown = appendedDateRangeCues?.durationKnown || false;\n      let endTime = MAX_CUE_ENDTIME;\n      const { duration, endDate } = dateRange;\n      if (endDate && duration !== null) {\n        endTime = startTime + duration;\n        durationKnown = true;\n      } else if (dateRange.endOnNext && !durationKnown) {\n        const nextDateRangeWithSameClass = ids.reduce(\n          (candidateDateRange: DateRange | null, id) => {\n            if (id !== dateRange.id) {\n              const otherDateRange = dateRanges[id]!;\n              if (\n                otherDateRange.class === dateRange.class &&\n                otherDateRange.startDate > dateRange.startDate &&\n                (!candidateDateRange ||\n                  dateRange.startDate < candidateDateRange.startDate)\n              ) {\n                return otherDateRange;\n              }\n            }\n            return candidateDateRange;\n          },\n          null,\n        );\n        if (nextDateRangeWithSameClass) {\n          endTime = nextDateRangeWithSameClass.startTime;\n          durationKnown = true;\n        }\n      }\n\n      // Create TextTrack Cues for each MetadataGroup Item (select DateRange attribute)\n      // This is to emulate Safari HLS playback handling of DateRange tags\n      const attributes = Object.keys(dateRange.attr);\n      for (let j = 0; j < attributes.length; j++) {\n        const key = attributes[j];\n        if (!isDateRangeCueAttribute(key)) {\n          continue;\n        }\n        const cue = cues[key];\n        if (cue) {\n          if (durationKnown && !appendedDateRangeCues?.durationKnown) {\n            cue.endTime = endTime;\n          } else if (Math.abs(cue.startTime - startTime) > 0.01) {\n            cue.startTime = startTime;\n            cue.endTime = endTime;\n          }\n        } else if (Cue) {\n          let data = dateRange.attr[key];\n          if (isSCTE35Attribute(key)) {\n            data = hexToArrayBuffer(data);\n          }\n          const payload: any = { key, data };\n          const cue = createCueWithDataFields(\n            Cue,\n            startTime,\n            endTime,\n            payload,\n            MetadataSchema.dateRange,\n          );\n          if (cue) {\n            cue.id = id;\n            this.id3Track.addCue(cue);\n            cues[key] = cue;\n            if (__USE_INTERSTITIALS__ && interstitialsController) {\n              if (key === 'X-ASSET-LIST' || key === 'X-ASSET-URL') {\n                cue.addEventListener('enter', this.onEventCueEnter);\n              }\n            }\n          }\n        }\n      }\n\n      // Keep track of processed DateRanges by ID for updating cues with new DateRange tag attributes\n      dateRangeCuesAppended[id] = {\n        cues,\n        dateRange,\n        durationKnown,\n      };\n    }\n  }\n}\n\nexport default ID3TrackController;\n", "import { ErrorDetails } from '../errors';\nimport { Events } from '../events';\nimport type { HlsConfig } from '../config';\nimport type Hls from '../hls';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n  ErrorData,\n  LevelUpdatedData,\n  MediaAttachingData,\n} from '../types/events';\n\nexport default class LatencyController implements ComponentAPI {\n  private hls: Hls | null;\n  private readonly config: HlsConfig;\n  private media: HTMLMediaElement | null = null;\n  private currentTime: number = 0;\n  private stallCount: number = 0;\n  private _latency: number | null = null;\n  private _targetLatencyUpdated = false;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n    this.config = hls.config;\n    this.registerListeners();\n  }\n\n  private get levelDetails(): LevelDetails | null {\n    return this.hls?.latestLevelDetails || null;\n  }\n\n  get latency(): number {\n    return this._latency || 0;\n  }\n\n  get maxLatency(): number {\n    const { config } = this;\n    if (config.liveMaxLatencyDuration !== undefined) {\n      return config.liveMaxLatencyDuration;\n    }\n    const levelDetails = this.levelDetails;\n    return levelDetails\n      ? config.liveMaxLatencyDurationCount * levelDetails.targetduration\n      : 0;\n  }\n\n  get targetLatency(): number | null {\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null || this.hls === null) {\n      return null;\n    }\n    const { holdBack, partHoldBack, targetduration } = levelDetails;\n    const { liveSyncDuration, liveSyncDurationCount, lowLatencyMode } =\n      this.config;\n    const userConfig = this.hls.userConfig;\n    let targetLatency = lowLatencyMode ? partHoldBack || holdBack : holdBack;\n    if (\n      this._targetLatencyUpdated ||\n      userConfig.liveSyncDuration ||\n      userConfig.liveSyncDurationCount ||\n      targetLatency === 0\n    ) {\n      targetLatency =\n        liveSyncDuration !== undefined\n          ? liveSyncDuration\n          : liveSyncDurationCount * targetduration;\n    }\n    const maxLiveSyncOnStallIncrease = targetduration;\n    return (\n      targetLatency +\n      Math.min(\n        this.stallCount * this.config.liveSyncOnStallIncrease,\n        maxLiveSyncOnStallIncrease,\n      )\n    );\n  }\n\n  set targetLatency(latency: number) {\n    this.stallCount = 0;\n    this.config.liveSyncDuration = latency;\n    this._targetLatencyUpdated = true;\n  }\n\n  get liveSyncPosition(): number | null {\n    const liveEdge = this.estimateLiveEdge();\n    const targetLatency = this.targetLatency;\n    if (liveEdge === null || targetLatency === null) {\n      return null;\n    }\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null) {\n      return null;\n    }\n    const edge = levelDetails.edge;\n    const syncPosition = liveEdge - targetLatency - this.edgeStalled;\n    const min = edge - levelDetails.totalduration;\n    const max =\n      edge -\n      ((this.config.lowLatencyMode && levelDetails.partTarget) ||\n        levelDetails.targetduration);\n    return Math.min(Math.max(min, syncPosition), max);\n  }\n\n  get drift(): number {\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null) {\n      return 1;\n    }\n    return levelDetails.drift;\n  }\n\n  get edgeStalled(): number {\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null) {\n      return 0;\n    }\n    const maxLevelUpdateAge =\n      ((this.config.lowLatencyMode && levelDetails.partTarget) ||\n        levelDetails.targetduration) * 3;\n    return Math.max(levelDetails.age - maxLevelUpdateAge, 0);\n  }\n\n  private get forwardBufferLength(): number {\n    const { media } = this;\n    const levelDetails = this.levelDetails;\n    if (!media || !levelDetails) {\n      return 0;\n    }\n    const bufferedRanges = media.buffered.length;\n    return (\n      (bufferedRanges\n        ? media.buffered.end(bufferedRanges - 1)\n        : levelDetails.edge) - this.currentTime\n    );\n  }\n\n  public destroy(): void {\n    this.unregisterListeners();\n    this.onMediaDetaching();\n    this.hls = null;\n  }\n\n  private registerListeners() {\n    const { hls } = this;\n    if (!hls) {\n      return;\n    }\n    hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  private unregisterListeners() {\n    const { hls } = this;\n    if (!hls) {\n      return;\n    }\n    hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  private onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachingData,\n  ) {\n    this.media = data.media;\n    this.media.addEventListener('timeupdate', this.onTimeupdate);\n  }\n\n  private onMediaDetaching() {\n    if (this.media) {\n      this.media.removeEventListener('timeupdate', this.onTimeupdate);\n      this.media = null;\n    }\n  }\n\n  private onManifestLoading() {\n    this._latency = null;\n    this.stallCount = 0;\n  }\n\n  private onLevelUpdated(\n    event: Events.LEVEL_UPDATED,\n    { details }: LevelUpdatedData,\n  ) {\n    if (details.advanced) {\n      this.onTimeupdate();\n    }\n    if (!details.live && this.media) {\n      this.media.removeEventListener('timeupdate', this.onTimeupdate);\n    }\n  }\n\n  private onError(event: Events.ERROR, data: ErrorData) {\n    if (data.details !== ErrorDetails.BUFFER_STALLED_ERROR) {\n      return;\n    }\n    this.stallCount++;\n    if (this.hls && this.levelDetails?.live) {\n      this.hls.logger.warn(\n        '[latency-controller]: Stall detected, adjusting target latency',\n      );\n    }\n  }\n\n  private onTimeupdate = () => {\n    const { media } = this;\n    const levelDetails = this.levelDetails;\n    if (!media || !levelDetails) {\n      return;\n    }\n    this.currentTime = media.currentTime;\n\n    const latency = this.computeLatency();\n    if (latency === null) {\n      return;\n    }\n    this._latency = latency;\n\n    // Adapt playbackRate to meet target latency in low-latency mode\n    const { lowLatencyMode, maxLiveSyncPlaybackRate } = this.config;\n    if (\n      !lowLatencyMode ||\n      maxLiveSyncPlaybackRate === 1 ||\n      !levelDetails.live\n    ) {\n      return;\n    }\n    const targetLatency = this.targetLatency;\n    if (targetLatency === null) {\n      return;\n    }\n    const distanceFromTarget = latency - targetLatency;\n    // Only adjust playbackRate when within one target duration of targetLatency\n    // and more than one second from under-buffering.\n    // Playback further than one target duration from target can be considered DVR playback.\n    const liveMinLatencyDuration = Math.min(\n      this.maxLatency,\n      targetLatency + levelDetails.targetduration,\n    );\n    const inLiveRange = distanceFromTarget < liveMinLatencyDuration;\n\n    if (\n      inLiveRange &&\n      distanceFromTarget > 0.05 &&\n      this.forwardBufferLength > 1\n    ) {\n      const max = Math.min(2, Math.max(1.0, maxLiveSyncPlaybackRate));\n      const rate =\n        Math.round(\n          (2 / (1 + Math.exp(-0.75 * distanceFromTarget - this.edgeStalled))) *\n            20,\n        ) / 20;\n      const playbackRate = Math.min(max, Math.max(1, rate));\n      this.changeMediaPlaybackRate(media, playbackRate);\n    } else if (media.playbackRate !== 1 && media.playbackRate !== 0) {\n      this.changeMediaPlaybackRate(media, 1);\n    }\n  };\n\n  private changeMediaPlaybackRate(\n    media: HTMLMediaElement,\n    playbackRate: number,\n  ) {\n    if (media.playbackRate === playbackRate) {\n      return;\n    }\n    this.hls?.logger.debug(\n      `[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${this.targetLatency?.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${media.playbackRate} to ${playbackRate}`,\n    );\n    media.playbackRate = playbackRate;\n  }\n\n  private estimateLiveEdge(): number | null {\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null) {\n      return null;\n    }\n    return levelDetails.edge + levelDetails.age;\n  }\n\n  private computeLatency(): number | null {\n    const liveEdge = this.estimateLiveEdge();\n    if (liveEdge === null) {\n      return null;\n    }\n    return liveEdge - this.currentTime;\n  }\n}\n", "import BasePlaylistController from './base-playlist-controller';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { isVideoRange, Level, VideoRangeValues } from '../types/level';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport {\n  areCodecsMediaSourceSupported,\n  codecsSetSelectionPreferenceValue,\n  convertAVC1ToAVCOTI,\n  getCodecCompatibleName,\n  videoCodecPreferenceValue,\n} from '../utils/codecs';\nimport { reassignFragmentLevelIndexes } from '../utils/level-helper';\nimport { getUnsupportedResult } from '../utils/mediacapabilities-helper';\nimport { stringify } from '../utils/safe-json-stringify';\nimport type ContentSteeringController from './content-steering-controller';\nimport type Hls from '../hls';\nimport type {\n  ErrorData,\n  FragBufferedData,\n  LevelLoadedData,\n  LevelsUpdatedData,\n  LevelSwitchingData,\n  ManifestLoadedData,\n  ManifestLoadingData,\n  ManifestParsedData,\n} from '../types/events';\nimport type { HlsUrlParameters, LevelParsed } from '../types/level';\nimport type { MediaPlaylist } from '../types/media-playlist';\n\nexport default class LevelController extends BasePlaylistController {\n  private _levels: Level[] = [];\n  private _firstLevel: number = -1;\n  private _maxAutoLevel: number = -1;\n  private _startLevel?: number;\n  private currentLevel: Level | null = null;\n  private currentLevelIndex: number = -1;\n  private manualLevelIndex: number = -1;\n  private steering: ContentSteeringController | null;\n\n  public onParsedComplete!: Function;\n\n  constructor(\n    hls: Hls,\n    contentSteeringController: ContentSteeringController | null,\n  ) {\n    super(hls, 'level-controller');\n    this.steering = contentSteeringController;\n    this._registerListeners();\n  }\n\n  private _registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n\n  private _unregisterListeners() {\n    const { hls } = this;\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n\n  public destroy() {\n    this._unregisterListeners();\n    this.steering = null;\n    this.resetLevels();\n    super.destroy();\n  }\n\n  public stopLoad(): void {\n    const levels = this._levels;\n\n    // clean up live level details to force reload them, and reset load errors\n    levels.forEach((level) => {\n      level.loadError = 0;\n      level.fragmentError = 0;\n    });\n\n    super.stopLoad();\n  }\n\n  private resetLevels() {\n    this._startLevel = undefined;\n    this.manualLevelIndex = -1;\n    this.currentLevelIndex = -1;\n    this.currentLevel = null;\n    this._levels = [];\n    this._maxAutoLevel = -1;\n  }\n\n  private onManifestLoading(\n    event: Events.MANIFEST_LOADING,\n    data: ManifestLoadingData,\n  ) {\n    this.resetLevels();\n  }\n\n  protected onManifestLoaded(\n    event: Events.MANIFEST_LOADED,\n    data: ManifestLoadedData,\n  ) {\n    const preferManagedMediaSource = this.hls.config.preferManagedMediaSource;\n    const levels: Level[] = [];\n    const redundantSet: { [key: string]: Level } = {};\n    const generatePathwaySet: { [key: string]: number } = {};\n    let resolutionFound = false;\n    let videoCodecFound = false;\n    let audioCodecFound = false;\n\n    data.levels.forEach((levelParsed: LevelParsed) => {\n      const attributes = levelParsed.attrs;\n      let { audioCodec, videoCodec } = levelParsed;\n      if (audioCodec) {\n        // Returns empty and set to undefined for 'mp4a.40.34' with fallback to 'audio/mpeg' SourceBuffer\n        levelParsed.audioCodec = audioCodec =\n          getCodecCompatibleName(audioCodec, preferManagedMediaSource) ||\n          undefined;\n      }\n\n      if (videoCodec) {\n        videoCodec = levelParsed.videoCodec = convertAVC1ToAVCOTI(videoCodec);\n      }\n\n      // only keep levels with supported audio/video codecs\n      const { width, height, unknownCodecs } = levelParsed;\n      const unknownUnsupportedCodecCount = unknownCodecs?.length || 0;\n\n      resolutionFound ||= !!(width && height);\n      videoCodecFound ||= !!videoCodec;\n      audioCodecFound ||= !!audioCodec;\n      if (\n        unknownUnsupportedCodecCount ||\n        (audioCodec && !this.isAudioSupported(audioCodec)) ||\n        (videoCodec && !this.isVideoSupported(videoCodec))\n      ) {\n        this.log(`Some or all CODECS not supported \"${attributes.CODECS}\"`);\n        return;\n      }\n\n      const {\n        CODECS,\n        'FRAME-RATE': FRAMERATE,\n        'HDCP-LEVEL': HDCP,\n        'PATHWAY-ID': PATHWAY,\n        RESOLUTION,\n        'VIDEO-RANGE': VIDEO_RANGE,\n      } = attributes;\n      const contentSteeringPrefix = `${PATHWAY || '.'}-`;\n      const levelKey = `${contentSteeringPrefix}${levelParsed.bitrate}-${RESOLUTION}-${FRAMERATE}-${CODECS}-${VIDEO_RANGE}-${HDCP}`;\n\n      if (!redundantSet[levelKey]) {\n        const level = this.createLevel(levelParsed);\n        redundantSet[levelKey] = level;\n        generatePathwaySet[levelKey] = 1;\n        levels.push(level);\n      } else if (\n        redundantSet[levelKey].uri !== levelParsed.url &&\n        !levelParsed.attrs['PATHWAY-ID']\n      ) {\n        // Assign Pathway IDs to Redundant Streams (default Pathways is \".\". Redundant Streams \"..\", \"...\", and so on.)\n        // Content Steering controller to handles Pathway fallback on error\n        const pathwayCount = (generatePathwaySet[levelKey] += 1);\n        levelParsed.attrs['PATHWAY-ID'] = new Array(pathwayCount + 1).join('.');\n        const level = this.createLevel(levelParsed);\n        redundantSet[levelKey] = level;\n        levels.push(level);\n      } else {\n        redundantSet[levelKey].addGroupId('audio', attributes.AUDIO);\n        redundantSet[levelKey].addGroupId('text', attributes.SUBTITLES);\n      }\n    });\n\n    this.filterAndSortMediaOptions(\n      levels,\n      data,\n      resolutionFound,\n      videoCodecFound,\n      audioCodecFound,\n    );\n  }\n\n  private createLevel(levelParsed: LevelParsed): Level {\n    const level = new Level(levelParsed);\n    const supplemental = levelParsed.supplemental;\n    if (\n      supplemental?.videoCodec &&\n      !this.isVideoSupported(supplemental.videoCodec)\n    ) {\n      const error = new Error(\n        `SUPPLEMENTAL-CODECS not supported \"${supplemental.videoCodec}\"`,\n      );\n      this.log(error.message);\n      level.supportedResult = getUnsupportedResult(error, []);\n    }\n    return level;\n  }\n\n  private isAudioSupported(codec: string): boolean {\n    return areCodecsMediaSourceSupported(\n      codec,\n      'audio',\n      this.hls.config.preferManagedMediaSource,\n    );\n  }\n\n  private isVideoSupported(codec: string): boolean {\n    return areCodecsMediaSourceSupported(\n      codec,\n      'video',\n      this.hls.config.preferManagedMediaSource,\n    );\n  }\n\n  private filterAndSortMediaOptions(\n    filteredLevels: Level[],\n    data: ManifestLoadedData,\n    resolutionFound: boolean,\n    videoCodecFound: boolean,\n    audioCodecFound: boolean,\n  ) {\n    let audioTracks: MediaPlaylist[] = [];\n    let subtitleTracks: MediaPlaylist[] = [];\n    let levels = filteredLevels;\n    const statsParsing = data.stats?.parsing || {};\n\n    // remove audio-only and invalid video-range levels if we also have levels with video codecs or RESOLUTION signalled\n    if ((resolutionFound || videoCodecFound) && audioCodecFound) {\n      levels = levels.filter(\n        ({ videoCodec, videoRange, width, height }) =>\n          (!!videoCodec || !!(width && height)) && isVideoRange(videoRange),\n      );\n    }\n\n    if (levels.length === 0) {\n      // Dispatch error after MANIFEST_LOADED is done propagating\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      Promise.resolve().then(() => {\n        if (this.hls) {\n          let message = 'no level with compatible codecs found in manifest';\n          let reason = message;\n          if (data.levels.length) {\n            reason = `one or more CODECS in variant not supported: ${stringify(\n              data.levels\n                .map((level) => level.attrs.CODECS)\n                .filter(\n                  (value, index, array) => array.indexOf(value) === index,\n                ),\n            )}`;\n            this.warn(reason);\n            message += ` (${reason})`;\n          }\n          const error = new Error(message);\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n            fatal: true,\n            url: data.url,\n            error,\n            reason,\n          });\n        }\n      });\n      statsParsing.end = performance.now();\n      return;\n    }\n\n    if (data.audioTracks) {\n      audioTracks = data.audioTracks.filter(\n        (track) => !track.audioCodec || this.isAudioSupported(track.audioCodec),\n      );\n      // Assign ids after filtering as array indices by group-id\n      assignTrackIdsByGroup(audioTracks);\n    }\n\n    if (data.subtitles) {\n      subtitleTracks = data.subtitles;\n      assignTrackIdsByGroup(subtitleTracks);\n    }\n    // start bitrate is the first bitrate of the manifest\n    const unsortedLevels = levels.slice(0);\n    // sort levels from lowest to highest\n    levels.sort((a, b) => {\n      if (a.attrs['HDCP-LEVEL'] !== b.attrs['HDCP-LEVEL']) {\n        return (a.attrs['HDCP-LEVEL'] || '') > (b.attrs['HDCP-LEVEL'] || '')\n          ? 1\n          : -1;\n      }\n      // sort on height before bitrate for cap-level-controller\n      if (resolutionFound && a.height !== b.height) {\n        return a.height - b.height;\n      }\n      if (a.frameRate !== b.frameRate) {\n        return a.frameRate - b.frameRate;\n      }\n      if (a.videoRange !== b.videoRange) {\n        return (\n          VideoRangeValues.indexOf(a.videoRange) -\n          VideoRangeValues.indexOf(b.videoRange)\n        );\n      }\n      if (a.videoCodec !== b.videoCodec) {\n        const valueA = videoCodecPreferenceValue(a.videoCodec);\n        const valueB = videoCodecPreferenceValue(b.videoCodec);\n        if (valueA !== valueB) {\n          return valueB - valueA;\n        }\n      }\n      if (a.uri === b.uri && a.codecSet !== b.codecSet) {\n        const valueA = codecsSetSelectionPreferenceValue(a.codecSet);\n        const valueB = codecsSetSelectionPreferenceValue(b.codecSet);\n        if (valueA !== valueB) {\n          return valueB - valueA;\n        }\n      }\n      if (a.averageBitrate !== b.averageBitrate) {\n        return a.averageBitrate - b.averageBitrate;\n      }\n      return 0;\n    });\n\n    let firstLevelInPlaylist = unsortedLevels[0];\n    if (this.steering) {\n      levels = this.steering.filterParsedLevels(levels);\n      if (levels.length !== unsortedLevels.length) {\n        for (let i = 0; i < unsortedLevels.length; i++) {\n          if (unsortedLevels[i].pathwayId === levels[0].pathwayId) {\n            firstLevelInPlaylist = unsortedLevels[i];\n            break;\n          }\n        }\n      }\n    }\n\n    this._levels = levels;\n\n    // find index of first level in sorted levels\n    for (let i = 0; i < levels.length; i++) {\n      if (levels[i] === firstLevelInPlaylist) {\n        this._firstLevel = i;\n        const firstLevelBitrate = firstLevelInPlaylist.bitrate;\n        const bandwidthEstimate = this.hls.bandwidthEstimate;\n        this.log(\n          `manifest loaded, ${levels.length} level(s) found, first bitrate: ${firstLevelBitrate}`,\n        );\n        // Update default bwe to first variant bitrate as long it has not been configured or set\n        if (this.hls.userConfig?.abrEwmaDefaultEstimate === undefined) {\n          const startingBwEstimate = Math.min(\n            firstLevelBitrate,\n            this.hls.config.abrEwmaDefaultEstimateMax,\n          );\n          if (\n            startingBwEstimate > bandwidthEstimate &&\n            bandwidthEstimate === this.hls.abrEwmaDefaultEstimate\n          ) {\n            this.hls.bandwidthEstimate = startingBwEstimate;\n          }\n        }\n        break;\n      }\n    }\n\n    // Audio is only alternate if manifest include a URI along with the audio group tag,\n    // and this is not an audio-only stream where levels contain audio-only\n    const audioOnly = audioCodecFound && !videoCodecFound;\n    const config = this.hls.config;\n    const altAudioEnabled = !!(\n      config.audioStreamController && config.audioTrackController\n    );\n    const edata: ManifestParsedData = {\n      levels,\n      audioTracks,\n      subtitleTracks,\n      sessionData: data.sessionData,\n      sessionKeys: data.sessionKeys,\n      firstLevel: this._firstLevel,\n      stats: data.stats,\n      audio: audioCodecFound,\n      video: videoCodecFound,\n      altAudio:\n        altAudioEnabled && !audioOnly && audioTracks.some((t) => !!t.url),\n    };\n    statsParsing.end = performance.now();\n    this.hls.trigger(Events.MANIFEST_PARSED, edata);\n  }\n\n  get levels(): Level[] | null {\n    if (this._levels.length === 0) {\n      return null;\n    }\n    return this._levels;\n  }\n\n  get loadLevelObj(): Level | null {\n    return this.currentLevel;\n  }\n\n  get level(): number {\n    return this.currentLevelIndex;\n  }\n\n  set level(newLevel: number) {\n    const levels = this._levels;\n    if (levels.length === 0) {\n      return;\n    }\n    // check if level idx is valid\n    if (newLevel < 0 || newLevel >= levels.length) {\n      // invalid level id given, trigger error\n      const error = new Error('invalid level idx');\n      const fatal = newLevel < 0;\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.LEVEL_SWITCH_ERROR,\n        level: newLevel,\n        fatal,\n        error,\n        reason: error.message,\n      });\n      if (fatal) {\n        return;\n      }\n      newLevel = Math.min(newLevel, levels.length - 1);\n    }\n\n    const lastLevelIndex = this.currentLevelIndex;\n    const lastLevel = this.currentLevel;\n    const lastPathwayId = lastLevel ? lastLevel.attrs['PATHWAY-ID'] : undefined;\n    const level = levels[newLevel];\n    const pathwayId = level.attrs['PATHWAY-ID'];\n    this.currentLevelIndex = newLevel;\n    this.currentLevel = level;\n\n    if (\n      lastLevelIndex === newLevel &&\n      lastLevel &&\n      lastPathwayId === pathwayId\n    ) {\n      return;\n    }\n\n    this.log(\n      `Switching to level ${newLevel} (${\n        level.height ? level.height + 'p ' : ''\n      }${level.videoRange ? level.videoRange + ' ' : ''}${\n        level.codecSet ? level.codecSet + ' ' : ''\n      }@${level.bitrate})${\n        pathwayId ? ' with Pathway ' + pathwayId : ''\n      } from level ${lastLevelIndex}${\n        lastPathwayId ? ' with Pathway ' + lastPathwayId : ''\n      }`,\n    );\n\n    const levelSwitchingData: LevelSwitchingData = {\n      level: newLevel,\n      attrs: level.attrs,\n      details: level.details,\n      bitrate: level.bitrate,\n      averageBitrate: level.averageBitrate,\n      maxBitrate: level.maxBitrate,\n      realBitrate: level.realBitrate,\n      width: level.width,\n      height: level.height,\n      codecSet: level.codecSet,\n      audioCodec: level.audioCodec,\n      videoCodec: level.videoCodec,\n      audioGroups: level.audioGroups,\n      subtitleGroups: level.subtitleGroups,\n      loaded: level.loaded,\n      loadError: level.loadError,\n      fragmentError: level.fragmentError,\n      name: level.name,\n      id: level.id,\n      uri: level.uri,\n      url: level.url,\n      urlId: 0,\n      audioGroupIds: level.audioGroupIds,\n      textGroupIds: level.textGroupIds,\n    };\n\n    this.hls.trigger(Events.LEVEL_SWITCHING, levelSwitchingData);\n    // check if we need to load playlist for this level\n    const levelDetails = level.details;\n    if (!levelDetails || levelDetails.live) {\n      // level not retrieved yet, or live playlist we need to (re)load it\n      const hlsUrlParameters = this.switchParams(\n        level.uri,\n        lastLevel?.details,\n        levelDetails,\n      );\n      this.loadPlaylist(hlsUrlParameters);\n    }\n  }\n\n  get manualLevel(): number {\n    return this.manualLevelIndex;\n  }\n\n  set manualLevel(newLevel) {\n    this.manualLevelIndex = newLevel;\n    if (this._startLevel === undefined) {\n      this._startLevel = newLevel;\n    }\n\n    if (newLevel !== -1) {\n      this.level = newLevel;\n    }\n  }\n\n  get firstLevel(): number {\n    return this._firstLevel;\n  }\n\n  set firstLevel(newLevel) {\n    this._firstLevel = newLevel;\n  }\n\n  get startLevel(): number {\n    // Setting hls.startLevel (this._startLevel) overrides config.startLevel\n    if (this._startLevel === undefined) {\n      const configStartLevel = this.hls.config.startLevel;\n      if (configStartLevel !== undefined) {\n        return configStartLevel;\n      }\n      return this.hls.firstAutoLevel;\n    }\n    return this._startLevel;\n  }\n\n  set startLevel(newLevel: number) {\n    this._startLevel = newLevel;\n  }\n\n  get pathways(): string[] {\n    if (this.steering) {\n      return this.steering.pathways();\n    }\n\n    return [];\n  }\n\n  get pathwayPriority(): string[] | null {\n    if (this.steering) {\n      return this.steering.pathwayPriority;\n    }\n\n    return null;\n  }\n\n  set pathwayPriority(pathwayPriority: string[]) {\n    if (this.steering) {\n      const pathwaysList = this.steering.pathways();\n      const filteredPathwayPriority = pathwayPriority.filter((pathwayId) => {\n        return pathwaysList.indexOf(pathwayId) !== -1;\n      });\n      if (pathwayPriority.length < 1) {\n        this.warn(\n          `pathwayPriority ${pathwayPriority} should contain at least one pathway from list: ${pathwaysList}`,\n        );\n        return;\n      }\n      this.steering.pathwayPriority = filteredPathwayPriority;\n    }\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData) {\n    if (data.fatal || !data.context) {\n      return;\n    }\n\n    if (\n      data.context.type === PlaylistContextType.LEVEL &&\n      data.context.level === this.level\n    ) {\n      this.checkRetry(data);\n    }\n  }\n\n  // reset errors on the successful load of a fragment\n  protected onFragBuffered(\n    event: Events.FRAG_BUFFERED,\n    { frag }: FragBufferedData,\n  ) {\n    if (frag !== undefined && frag.type === PlaylistLevelType.MAIN) {\n      const el = frag.elementaryStreams;\n      if (!Object.keys(el).some((type) => !!el[type])) {\n        return;\n      }\n      const level = this._levels[frag.level];\n      if (level?.loadError) {\n        this.log(\n          `Resetting level error count of ${level.loadError} on frag buffered`,\n        );\n        level.loadError = 0;\n      }\n    }\n  }\n\n  protected onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n    const { level, details } = data;\n    const curLevel = data.levelInfo;\n\n    if (!curLevel) {\n      this.warn(`Invalid level index ${level}`);\n      if (data.deliveryDirectives?.skip) {\n        details.deltaUpdateFailed = true;\n      }\n      return;\n    }\n\n    // only process level loaded events matching with expected level or prior to switch when media playlist is loaded directly\n    if (curLevel === this.currentLevel || data.withoutMultiVariant) {\n      // reset level load error counter on successful level loaded only if there is no issues with fragments\n      if (curLevel.fragmentError === 0) {\n        curLevel.loadError = 0;\n      }\n      // Ignore matching details populated by loading a Media Playlist directly\n      let previousDetails = curLevel.details;\n      if (previousDetails === data.details && previousDetails.advanced) {\n        previousDetails = undefined;\n      }\n\n      this.playlistLoaded(level, data, previousDetails);\n    } else if (data.deliveryDirectives?.skip) {\n      // received a delta playlist update that cannot be merged\n      details.deltaUpdateFailed = true;\n    }\n  }\n\n  protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters) {\n    super.loadPlaylist();\n    if (this.shouldLoadPlaylist(this.currentLevel)) {\n      this.scheduleLoading(this.currentLevel, hlsUrlParameters);\n    }\n  }\n\n  protected loadingPlaylist(\n    currentLevel: Level,\n    hlsUrlParameters: HlsUrlParameters | undefined,\n  ) {\n    super.loadingPlaylist(currentLevel, hlsUrlParameters);\n    const url = this.getUrlWithDirectives(currentLevel.uri, hlsUrlParameters);\n    const currentLevelIndex = this.currentLevelIndex;\n    const pathwayId = currentLevel.attrs['PATHWAY-ID'];\n    const details = currentLevel.details;\n    const age = details?.age;\n    this.log(\n      `Loading level index ${currentLevelIndex}${\n        hlsUrlParameters?.msn !== undefined\n          ? ' at sn ' + hlsUrlParameters.msn + ' part ' + hlsUrlParameters.part\n          : ''\n      }${pathwayId ? ' Pathway ' + pathwayId : ''}${age && details.live ? ' age ' + age.toFixed(1) + (details.type ? ' ' + details.type || '' : '') : ''} ${url}`,\n    );\n\n    this.hls.trigger(Events.LEVEL_LOADING, {\n      url,\n      level: currentLevelIndex,\n      levelInfo: currentLevel,\n      pathwayId: currentLevel.attrs['PATHWAY-ID'],\n      id: 0, // Deprecated Level urlId\n      deliveryDirectives: hlsUrlParameters || null,\n    });\n  }\n\n  get nextLoadLevel() {\n    if (this.manualLevelIndex !== -1) {\n      return this.manualLevelIndex;\n    } else {\n      return this.hls.nextAutoLevel;\n    }\n  }\n\n  set nextLoadLevel(nextLevel) {\n    this.level = nextLevel;\n    if (this.manualLevelIndex === -1) {\n      this.hls.nextAutoLevel = nextLevel;\n    }\n  }\n\n  removeLevel(levelIndex: number) {\n    if (this._levels.length === 1) {\n      return;\n    }\n    const levels = this._levels.filter((level, index) => {\n      if (index !== levelIndex) {\n        return true;\n      }\n      if (this.steering) {\n        this.steering.removeLevel(level);\n      }\n      if (level === this.currentLevel) {\n        this.currentLevel = null;\n        this.currentLevelIndex = -1;\n        if (level.details) {\n          level.details.fragments.forEach((f) => (f.level = -1));\n        }\n      }\n      return false;\n    });\n    reassignFragmentLevelIndexes(levels);\n    this._levels = levels;\n    if (this.currentLevelIndex > -1 && this.currentLevel?.details) {\n      this.currentLevelIndex = this.currentLevel.details.fragments[0].level;\n    }\n    if (this.manualLevelIndex > -1) {\n      this.manualLevelIndex = this.currentLevelIndex;\n    }\n    const maxLevel = levels.length - 1;\n    this._firstLevel = Math.min(this._firstLevel, maxLevel);\n    if (this._startLevel) {\n      this._startLevel = Math.min(this._startLevel, maxLevel);\n    }\n    this.hls.trigger(Events.LEVELS_UPDATED, { levels });\n  }\n\n  private onLevelsUpdated(\n    event: Events.LEVELS_UPDATED,\n    { levels }: LevelsUpdatedData,\n  ) {\n    this._levels = levels;\n  }\n\n  public checkMaxAutoUpdated() {\n    const { autoLevelCapping, maxAutoLevel, maxHdcpLevel } = this.hls;\n    if (this._maxAutoLevel !== maxAutoLevel) {\n      this._maxAutoLevel = maxAutoLevel;\n      this.hls.trigger(Events.MAX_AUTO_LEVEL_UPDATED, {\n        autoLevelCapping,\n        levels: this.levels,\n        maxAutoLevel,\n        minAutoLevel: this.hls.minAutoLevel,\n        maxHdcpLevel,\n      });\n    }\n  }\n}\n\nfunction assignTrackIdsByGroup(tracks: MediaPlaylist[]): void {\n  const groups = {};\n  tracks.forEach((track) => {\n    const groupId = track.groupId || '';\n    track.id = groups[groupId] = groups[groupId] || 0;\n    groups[groupId]++;\n  });\n}\n", "import { mimeTypeForCodec } from './utils/codecs';\nimport { getMediaSource } from './utils/mediasource-helper';\nimport type { ExtendedSourceBuffer } from './types/buffer';\n\nfunction getSourceBuffer(): typeof self.SourceBuffer {\n  return self.SourceBuffer || (self as any).WebKitSourceBuffer;\n}\n\nexport function isMSESupported(): boolean {\n  const mediaSource = getMediaSource();\n  if (!mediaSource) {\n    return false;\n  }\n\n  // if SourceBuffer is exposed ensure its API is valid\n  // Older browsers do not expose SourceBuffer globally so checking SourceBuffer.prototype is impossible\n  const sourceBuffer = getSourceBuffer();\n  return (\n    !sourceBuffer ||\n    (sourceBuffer.prototype &&\n      typeof sourceBuffer.prototype.appendBuffer === 'function' &&\n      typeof sourceBuffer.prototype.remove === 'function')\n  );\n}\n\nexport function isSupported(): boolean {\n  if (!isMSESupported()) {\n    return false;\n  }\n\n  const mediaSource = getMediaSource();\n  return (\n    typeof mediaSource?.isTypeSupported === 'function' &&\n    (['avc1.42E01E,mp4a.40.2', 'av01.0.01M.08', 'vp09.00.50.08'].some(\n      (codecsForVideoContainer) =>\n        mediaSource.isTypeSupported(\n          mimeTypeForCodec(codecsForVideoContainer, 'video'),\n        ),\n    ) ||\n      ['mp4a.40.2', 'fLaC'].some((codecForAudioContainer) =>\n        mediaSource.isTypeSupported(\n          mimeTypeForCodec(codecForAudioContainer, 'audio'),\n        ),\n      ))\n  );\n}\n\nexport function changeTypeSupported(): boolean {\n  const sourceBuffer = getSourceBuffer();\n  return (\n    typeof (sourceBuffer?.prototype as ExtendedSourceBuffer)?.changeType ===\n    'function'\n  );\n}\n", "import BaseStreamController, { State } from './base-stream-controller';\nimport { findFragmentByPTS } from './fragment-finders';\nimport { FragmentState } from './fragment-tracker';\nimport { MAX_START_GAP_JUMP } from './gap-controller';\nimport TransmuxerInterface from '../demux/transmuxer-interface';\nimport { ErrorDetails } from '../errors';\nimport { Events } from '../events';\nimport { changeTypeSupported } from '../is-supported';\nimport { ElementaryStreamTypes, isMediaFragment } from '../loader/fragment';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { ChunkMetadata } from '../types/transmuxer';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport { pickMostCompleteCodecName } from '../utils/codecs';\nimport {\n  addEventListener,\n  removeEventListener,\n} from '../utils/event-listener-helper';\nimport { useAlternateAudio } from '../utils/rendition-helper';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type Hls from '../hls';\nimport type { Fragment, MediaFragment } from '../loader/fragment';\nimport type KeyLoader from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\nimport type {\n  BufferCreatedTrack,\n  ExtendedSourceBuffer,\n  SourceBufferName,\n} from '../types/buffer';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  AudioTrackSwitchedData,\n  AudioTrackSwitchingData,\n  BufferCodecsData,\n  BufferCreatedData,\n  BufferEOSData,\n  BufferFlushedData,\n  ErrorData,\n  FragBufferedData,\n  FragLoadedData,\n  FragParsingMetadataData,\n  FragParsingUserdataData,\n  LevelLoadedData,\n  LevelLoadingData,\n  LevelsUpdatedData,\n  ManifestParsedData,\n  MediaAttachedData,\n  MediaDetachingData,\n} from '../types/events';\nimport type { Level } from '../types/level';\nimport type { Track, TrackSet } from '../types/track';\nimport type { TransmuxerResult } from '../types/transmuxer';\nimport type { BufferInfo } from '../utils/buffer-helper';\n\nconst TICK_INTERVAL = 100; // how often to tick in ms\n\nconst enum AlternateAudio {\n  DISABLED = 0,\n  SWITCHING,\n  SWITCHED,\n}\n\nexport default class StreamController\n  extends BaseStreamController\n  implements NetworkComponentAPI\n{\n  private audioCodecSwap: boolean = false;\n  private level: number = -1;\n  private _forceStartLoad: boolean = false;\n  private _hasEnoughToStart: boolean = false;\n  private altAudio: AlternateAudio = AlternateAudio.DISABLED;\n  private audioOnly: boolean = false;\n  private fragPlaying: Fragment | null = null;\n  private fragLastKbps: number = 0;\n  private couldBacktrack: boolean = false;\n  private backtrackFragment: Fragment | null = null;\n  private audioCodecSwitch: boolean = false;\n  private videoBuffer: ExtendedSourceBuffer | null = null;\n\n  constructor(\n    hls: Hls,\n    fragmentTracker: FragmentTracker,\n    keyLoader: KeyLoader,\n  ) {\n    super(\n      hls,\n      fragmentTracker,\n      keyLoader,\n      'stream-controller',\n      PlaylistLevelType.MAIN,\n    );\n    this.registerListeners();\n  }\n\n  protected registerListeners() {\n    super.registerListeners();\n    const { hls } = this;\n    hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(\n      Events.FRAG_LOAD_EMERGENCY_ABORTED,\n      this.onFragLoadEmergencyAborted,\n      this,\n    );\n    hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n    hls.on(Events.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this);\n    hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n    hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n    hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n\n  protected unregisterListeners() {\n    super.unregisterListeners();\n    const { hls } = this;\n    hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(\n      Events.FRAG_LOAD_EMERGENCY_ABORTED,\n      this.onFragLoadEmergencyAborted,\n      this,\n    );\n    hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n    hls.off(Events.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this);\n    hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n    hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n    hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n    hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n\n  protected onHandlerDestroying() {\n    // @ts-ignore\n    this.onMediaPlaying = this.onMediaSeeked = null;\n    this.unregisterListeners();\n    super.onHandlerDestroying();\n  }\n\n  public startLoad(\n    startPosition: number,\n    skipSeekToStartPosition?: boolean,\n  ): void {\n    if (this.levels) {\n      const { lastCurrentTime, hls } = this;\n      this.stopLoad();\n      this.setInterval(TICK_INTERVAL);\n      this.level = -1;\n      if (!this.startFragRequested) {\n        // determine load level\n        let startLevel = hls.startLevel;\n        if (startLevel === -1) {\n          if (hls.config.testBandwidth && this.levels.length > 1) {\n            // -1 : guess start Level by doing a bitrate test by loading first fragment of lowest quality level\n            startLevel = 0;\n            this.bitrateTest = true;\n          } else {\n            startLevel = hls.firstAutoLevel;\n          }\n        }\n        // set new level to playlist loader : this will trigger start level load\n        // hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded\n        hls.nextLoadLevel = startLevel;\n        this.level = hls.loadLevel;\n        this._hasEnoughToStart = !!skipSeekToStartPosition;\n      }\n      // if startPosition undefined but lastCurrentTime set, set startPosition to last currentTime\n      if (\n        lastCurrentTime > 0 &&\n        startPosition === -1 &&\n        !skipSeekToStartPosition\n      ) {\n        this.log(\n          `Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(\n            3,\n          )}`,\n        );\n        startPosition = lastCurrentTime;\n      }\n      this.state = State.IDLE;\n      this.nextLoadPosition = this.lastCurrentTime =\n        startPosition + this.timelineOffset;\n      this.startPosition = skipSeekToStartPosition ? -1 : startPosition;\n      this.tick();\n    } else {\n      this._forceStartLoad = true;\n      this.state = State.STOPPED;\n    }\n  }\n\n  public stopLoad() {\n    this._forceStartLoad = false;\n    super.stopLoad();\n  }\n\n  protected doTick() {\n    switch (this.state) {\n      case State.WAITING_LEVEL: {\n        const { levels, level } = this;\n        const currentLevel = levels?.[level];\n        const details = currentLevel?.details;\n        if (\n          details &&\n          (!details.live ||\n            (this.levelLastLoaded === currentLevel &&\n              !this.waitForLive(currentLevel)))\n        ) {\n          if (this.waitForCdnTuneIn(details)) {\n            break;\n          }\n          this.state = State.IDLE;\n          break;\n        } else if (this.hls.nextLoadLevel !== this.level) {\n          this.state = State.IDLE;\n          break;\n        }\n        break;\n      }\n      case State.FRAG_LOADING_WAITING_RETRY:\n        this.checkRetryDate();\n        break;\n      default:\n        break;\n    }\n    if (this.state === State.IDLE) {\n      this.doTickIdle();\n    }\n    this.onTickEnd();\n  }\n\n  protected onTickEnd() {\n    super.onTickEnd();\n    if (this.media?.readyState && this.media.seeking === false) {\n      this.lastCurrentTime = this.media.currentTime;\n    }\n    this.checkFragmentChanged();\n  }\n\n  private doTickIdle() {\n    const { hls, levelLastLoaded, levels, media } = this;\n\n    // if start level not parsed yet OR\n    // if video not attached AND start fragment already requested OR start frag prefetch not enabled\n    // exit loop, as we either need more info (level not parsed) or we need media to be attached to load new fragment\n    if (\n      levelLastLoaded === null ||\n      (!media &&\n        !this.primaryPrefetch &&\n        (this.startFragRequested || !hls.config.startFragPrefetch))\n    ) {\n      return;\n    }\n\n    // If the \"main\" level is audio-only but we are loading an alternate track in the same group, do not load anything\n    if (this.altAudio && this.audioOnly) {\n      return;\n    }\n\n    const level = this.buffering ? hls.nextLoadLevel : hls.loadLevel;\n    if (!levels?.[level]) {\n      return;\n    }\n\n    const levelInfo = levels[level];\n\n    // if buffer length is less than maxBufLen try to load a new fragment\n\n    const bufferInfo = this.getMainFwdBufferInfo();\n    if (bufferInfo === null) {\n      return;\n    }\n\n    const lastDetails = this.getLevelDetails();\n    if (lastDetails && this._streamEnded(bufferInfo, lastDetails)) {\n      const data: BufferEOSData = {};\n      if (this.altAudio === AlternateAudio.SWITCHED) {\n        data.type = 'video';\n      }\n\n      this.hls.trigger(Events.BUFFER_EOS, data);\n      this.state = State.ENDED;\n      return;\n    }\n    if (!this.buffering) {\n      return;\n    }\n\n    // set next load level : this will trigger a playlist load if needed\n    if (hls.loadLevel !== level && hls.manualLevel === -1) {\n      this.log(`Adapting to level ${level} from level ${this.level}`);\n    }\n    this.level = hls.nextLoadLevel = level;\n\n    const levelDetails = levelInfo.details;\n    // if level info not retrieved yet, switch state and wait for level retrieval\n    // if live playlist, ensure that new playlist has been refreshed to avoid loading/try to load\n    // a useless and outdated fragment (that might even introduce load error if it is already out of the live playlist)\n    if (\n      !levelDetails ||\n      this.state === State.WAITING_LEVEL ||\n      this.waitForLive(levelInfo)\n    ) {\n      this.level = level;\n      this.state = State.WAITING_LEVEL;\n      this.startFragRequested = false;\n      return;\n    }\n\n    const bufferLen = bufferInfo.len;\n\n    // compute max Buffer Length that we could get from this load level, based on level bitrate. don't buffer more than 60 MB and more than 30s\n    const maxBufLen = this.getMaxBufferLength(levelInfo.maxBitrate);\n\n    // Stay idle if we are still with buffer margins\n    if (bufferLen >= maxBufLen) {\n      return;\n    }\n\n    if (\n      this.backtrackFragment &&\n      this.backtrackFragment.start > bufferInfo.end\n    ) {\n      this.backtrackFragment = null;\n    }\n    const targetBufferTime = this.backtrackFragment\n      ? this.backtrackFragment.start\n      : bufferInfo.end;\n    let frag = this.getNextFragment(targetBufferTime, levelDetails);\n    // Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)\n    if (\n      this.couldBacktrack &&\n      !this.fragPrevious &&\n      frag &&\n      isMediaFragment(frag) &&\n      this.fragmentTracker.getState(frag) !== FragmentState.OK\n    ) {\n      const backtrackSn = (this.backtrackFragment ?? frag).sn as number;\n      const fragIdx = backtrackSn - levelDetails.startSN;\n      const backtrackFrag = levelDetails.fragments[fragIdx - 1];\n      if ((backtrackFrag as any) && frag.cc === backtrackFrag.cc) {\n        frag = backtrackFrag;\n        this.fragmentTracker.removeFragment(backtrackFrag);\n      }\n    } else if (this.backtrackFragment && bufferInfo.len) {\n      this.backtrackFragment = null;\n    }\n    // Avoid loop loading by using nextLoadPosition set for backtracking and skipping consecutive GAP tags\n    if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n      const gapStart = frag.gap;\n      if (!gapStart) {\n        // Cleanup the fragment tracker before trying to find the next unbuffered fragment\n        const type =\n          this.audioOnly && !this.altAudio\n            ? ElementaryStreamTypes.AUDIO\n            : ElementaryStreamTypes.VIDEO;\n        const mediaBuffer =\n          (type === ElementaryStreamTypes.VIDEO\n            ? this.videoBuffer\n            : this.mediaBuffer) || this.media;\n        if (mediaBuffer) {\n          this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n        }\n      }\n      frag = this.getNextFragmentLoopLoading(\n        frag,\n        levelDetails,\n        bufferInfo,\n        PlaylistLevelType.MAIN,\n        maxBufLen,\n      );\n    }\n    if (!frag) {\n      return;\n    }\n\n    if (this.exceedsMaxBuffer(bufferInfo, maxBufLen, frag)) {\n      return;\n    }\n\n    if (frag.initSegment && !frag.initSegment.data && !this.bitrateTest) {\n      frag = frag.initSegment;\n    }\n\n    this.loadFragment(frag, levelInfo, targetBufferTime);\n  }\n\n  protected loadFragment(\n    frag: Fragment,\n    level: Level,\n    targetBufferTime: number,\n  ) {\n    // Check if fragment is not loaded\n    const fragState = this.fragmentTracker.getState(frag);\n    if (\n      fragState === FragmentState.NOT_LOADED ||\n      fragState === FragmentState.PARTIAL\n    ) {\n      if (!isMediaFragment(frag)) {\n        this._loadInitSegment(frag, level);\n      } else if (this.bitrateTest) {\n        this.log(\n          `Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered`,\n        );\n        this._loadBitrateTestFrag(frag, level);\n      } else {\n        super.loadFragment(frag, level, targetBufferTime);\n      }\n    } else {\n      this.clearTrackerIfNeeded(frag);\n    }\n  }\n\n  private getBufferedFrag(position: number) {\n    return this.fragmentTracker.getBufferedFrag(\n      position,\n      PlaylistLevelType.MAIN,\n    );\n  }\n\n  private followingBufferedFrag(frag: Fragment | null) {\n    if (frag) {\n      // try to get range of next fragment (500ms after this range)\n      return this.getBufferedFrag(frag.end + 0.5);\n    }\n    return null;\n  }\n\n  /*\n    on immediate level switch :\n     - pause playback if playing\n     - cancel any pending load request\n     - and trigger a buffer flush\n  */\n  public immediateLevelSwitch() {\n    this.abortCurrentFrag();\n    this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n    if (this.altAudio !== AlternateAudio.DISABLED) {\n      // If behind the live window, remove audio too to keep buffered media aligned\n      const liveWindowStart = this.getLevelDetails()?.fragmentStart || 0;\n      if (liveWindowStart > this.lastCurrentTime) {\n        super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio');\n      }\n    }\n  }\n\n  /**\n   * try to switch ASAP without breaking video playback:\n   * in order to ensure smooth but quick level switching,\n   * we need to find the next flushable buffer range\n   * we should take into account new segment fetch time\n   */\n  public nextLevelSwitch() {\n    const { levels, media } = this;\n    // ensure that media is defined and that metadata are available (to retrieve currentTime)\n    if (media?.readyState) {\n      let fetchdelay;\n      const fragPlayingCurrent = this.getAppendedFrag(media.currentTime);\n      if (fragPlayingCurrent && fragPlayingCurrent.start > 1) {\n        // flush buffer preceding current fragment (flush until current fragment start offset)\n        // minus 1s to avoid video freezing, that could happen if we flush keyframe of current video ...\n        this.flushMainBuffer(0, fragPlayingCurrent.start - 1);\n      }\n      const levelDetails = this.getLevelDetails();\n      if (levelDetails?.live) {\n        const bufferInfo = this.getMainFwdBufferInfo();\n        // Do not flush in live stream with low buffer\n        if (!bufferInfo || bufferInfo.len < levelDetails.targetduration * 2) {\n          return;\n        }\n      }\n      if (!media.paused && levels) {\n        // add a safety delay of 1s\n        const nextLevelId = this.hls.nextLoadLevel;\n        const nextLevel = levels[nextLevelId];\n        const fragLastKbps = this.fragLastKbps;\n        if (fragLastKbps && this.fragCurrent) {\n          fetchdelay =\n            (this.fragCurrent.duration * nextLevel.maxBitrate) /\n              (1000 * fragLastKbps) +\n            1;\n        } else {\n          fetchdelay = 0;\n        }\n      } else {\n        fetchdelay = 0;\n      }\n      // this.log('fetchdelay:'+fetchdelay);\n      // find buffer range that will be reached once new fragment will be fetched\n      const bufferedFrag = this.getBufferedFrag(media.currentTime + fetchdelay);\n      if (bufferedFrag) {\n        // we can flush buffer range following this one without stalling playback\n        const nextBufferedFrag = this.followingBufferedFrag(bufferedFrag);\n        if (nextBufferedFrag) {\n          // if we are here, we can also cancel any loading/demuxing in progress, as they are useless\n          this.abortCurrentFrag();\n          // start flush position is in next buffered frag. Leave some padding for non-independent segments and smoother playback.\n          const maxStart = nextBufferedFrag.maxStartPTS\n            ? nextBufferedFrag.maxStartPTS\n            : nextBufferedFrag.start;\n          const fragDuration = nextBufferedFrag.duration;\n          const startPts = Math.max(\n            bufferedFrag.end,\n            maxStart +\n              Math.min(\n                Math.max(\n                  fragDuration - this.config.maxFragLookUpTolerance,\n                  fragDuration * (this.couldBacktrack ? 0.5 : 0.125),\n                ),\n                fragDuration * (this.couldBacktrack ? 0.75 : 0.25),\n              ),\n          );\n          this.flushMainBuffer(startPts, Number.POSITIVE_INFINITY);\n        }\n      }\n    }\n  }\n\n  private abortCurrentFrag() {\n    const fragCurrent = this.fragCurrent;\n    this.fragCurrent = null;\n    this.backtrackFragment = null;\n    if (fragCurrent) {\n      fragCurrent.abortRequests();\n      this.fragmentTracker.removeFragment(fragCurrent);\n    }\n    switch (this.state) {\n      case State.KEY_LOADING:\n      case State.FRAG_LOADING:\n      case State.FRAG_LOADING_WAITING_RETRY:\n      case State.PARSING:\n      case State.PARSED:\n        this.state = State.IDLE;\n        break;\n    }\n    this.nextLoadPosition = this.getLoadPosition();\n  }\n\n  protected flushMainBuffer(startOffset: number, endOffset: number) {\n    super.flushMainBuffer(\n      startOffset,\n      endOffset,\n      this.altAudio === AlternateAudio.SWITCHED ? 'video' : null,\n    );\n  }\n\n  protected onMediaAttached(\n    event: Events.MEDIA_ATTACHED,\n    data: MediaAttachedData,\n  ) {\n    super.onMediaAttached(event, data);\n    const media = data.media;\n    addEventListener(media, 'playing', this.onMediaPlaying);\n    addEventListener(media, 'seeked', this.onMediaSeeked);\n  }\n\n  protected onMediaDetaching(\n    event: Events.MEDIA_DETACHING,\n    data: MediaDetachingData,\n  ) {\n    const { media } = this;\n    if (media) {\n      removeEventListener(media, 'playing', this.onMediaPlaying);\n      removeEventListener(media, 'seeked', this.onMediaSeeked);\n    }\n    this.videoBuffer = null;\n    this.fragPlaying = null;\n    super.onMediaDetaching(event, data);\n    const transferringMedia = !!data.transferMedia;\n    if (transferringMedia) {\n      return;\n    }\n    this._hasEnoughToStart = false;\n  }\n\n  private onMediaPlaying = () => {\n    // tick to speed up FRAG_CHANGED triggering\n    this.tick();\n  };\n\n  private onMediaSeeked = () => {\n    const media = this.media;\n    const currentTime = media ? media.currentTime : null;\n    if (currentTime === null || !Number.isFinite(currentTime)) {\n      return;\n    }\n\n    this.log(`Media seeked to ${currentTime.toFixed(3)}`);\n\n    // If seeked was issued before buffer was appended do not tick immediately\n    if (!this.getBufferedFrag(currentTime)) {\n      return;\n    }\n    const bufferInfo = this.getFwdBufferInfoAtPos(\n      media,\n      currentTime,\n      PlaylistLevelType.MAIN,\n      0,\n    );\n    if (bufferInfo === null || bufferInfo.len === 0) {\n      this.warn(\n        `Main forward buffer length at ${currentTime} on \"seeked\" event ${\n          bufferInfo ? bufferInfo.len : 'empty'\n        })`,\n      );\n      return;\n    }\n\n    // tick to speed up FRAG_CHANGED triggering\n    this.tick();\n  };\n\n  protected onManifestLoading() {\n    super.onManifestLoading();\n    // reset buffer on manifest loading\n    this.log('Trigger BUFFER_RESET');\n    this.hls.trigger(Events.BUFFER_RESET, undefined);\n    this.couldBacktrack = false;\n    this.fragLastKbps = 0;\n    this.fragPlaying = this.backtrackFragment = null;\n    this.altAudio = AlternateAudio.DISABLED;\n    this.audioOnly = false;\n  }\n\n  private onManifestParsed(\n    event: Events.MANIFEST_PARSED,\n    data: ManifestParsedData,\n  ) {\n    // detect if we have different kind of audio codecs used amongst playlists\n    let aac = false;\n    let heaac = false;\n    for (let i = 0; i < data.levels.length; i++) {\n      const codec = data.levels[i].audioCodec;\n      if (codec) {\n        aac = aac || codec.indexOf('mp4a.40.2') !== -1;\n        heaac = heaac || codec.indexOf('mp4a.40.5') !== -1;\n      }\n    }\n    this.audioCodecSwitch = aac && heaac && !changeTypeSupported();\n    if (this.audioCodecSwitch) {\n      this.log(\n        'Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC',\n      );\n    }\n\n    this.levels = data.levels;\n    this.startFragRequested = false;\n  }\n\n  private onLevelLoading(event: Events.LEVEL_LOADING, data: LevelLoadingData) {\n    const { levels } = this;\n    if (!levels || this.state !== State.IDLE) {\n      return;\n    }\n    const level = data.levelInfo;\n    if (\n      !level.details ||\n      (level.details.live &&\n        (this.levelLastLoaded !== level || level.details.expired)) ||\n      this.waitForCdnTuneIn(level.details)\n    ) {\n      this.state = State.WAITING_LEVEL;\n    }\n  }\n\n  private onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n    const { levels, startFragRequested } = this;\n    const newLevelId = data.level;\n    const newDetails = data.details;\n    const duration = newDetails.totalduration;\n\n    if (!levels) {\n      this.warn(`Levels were reset while loading level ${newLevelId}`);\n      return;\n    }\n    this.log(\n      `Level ${newLevelId} loaded [${newDetails.startSN},${newDetails.endSN}]${\n        newDetails.lastPartSn\n          ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`\n          : ''\n      }, cc [${newDetails.startCC}, ${newDetails.endCC}] duration:${duration}`,\n    );\n\n    const curLevel = data.levelInfo;\n    const fragCurrent = this.fragCurrent;\n    if (\n      fragCurrent &&\n      (this.state === State.FRAG_LOADING ||\n        this.state === State.FRAG_LOADING_WAITING_RETRY)\n    ) {\n      if (fragCurrent.level !== data.level && fragCurrent.loader) {\n        this.abortCurrentFrag();\n      }\n    }\n\n    let sliding = 0;\n    if (newDetails.live || curLevel.details?.live) {\n      this.checkLiveUpdate(newDetails);\n      if (newDetails.deltaUpdateFailed) {\n        return;\n      }\n      sliding = this.alignPlaylists(\n        newDetails,\n        curLevel.details,\n        this.levelLastLoaded?.details,\n      );\n    }\n    // override level info\n    curLevel.details = newDetails;\n    this.levelLastLoaded = curLevel;\n\n    if (!startFragRequested) {\n      this.setStartPosition(newDetails, sliding);\n    }\n\n    this.hls.trigger(Events.LEVEL_UPDATED, {\n      details: newDetails,\n      level: newLevelId,\n    });\n\n    // only switch back to IDLE state if we were waiting for level to start downloading a new fragment\n    if (this.state === State.WAITING_LEVEL) {\n      if (this.waitForCdnTuneIn(newDetails)) {\n        // Wait for Low-Latency CDN Tune-in\n        return;\n      }\n      this.state = State.IDLE;\n    }\n\n    if (startFragRequested && newDetails.live) {\n      this.synchronizeToLiveEdge(newDetails);\n    }\n\n    // trigger handler right now\n    this.tick();\n  }\n\n  private synchronizeToLiveEdge(levelDetails: LevelDetails) {\n    const { config, media } = this;\n    if (!media) {\n      return;\n    }\n    const liveSyncPosition = this.hls.liveSyncPosition;\n    const currentTime = this.getLoadPosition();\n    const start = levelDetails.fragmentStart;\n    const end = levelDetails.edge;\n    const withinSlidingWindow =\n      currentTime >= start - config.maxFragLookUpTolerance &&\n      currentTime <= end;\n    // Continue if we can seek forward to sync position or if current time is outside of sliding window\n    if (\n      liveSyncPosition !== null &&\n      media.duration > liveSyncPosition &&\n      (currentTime < liveSyncPosition || !withinSlidingWindow)\n    ) {\n      // Continue if buffer is starving or if current time is behind max latency\n      const maxLatency =\n        config.liveMaxLatencyDuration !== undefined\n          ? config.liveMaxLatencyDuration\n          : config.liveMaxLatencyDurationCount * levelDetails.targetduration;\n      if (\n        (!withinSlidingWindow && media.readyState < 4) ||\n        currentTime < end - maxLatency\n      ) {\n        if (!this._hasEnoughToStart) {\n          this.nextLoadPosition = liveSyncPosition;\n        }\n        // Only seek if ready and there is not a significant forward buffer available for playback\n        if (media.readyState) {\n          this.warn(\n            `Playback: ${currentTime.toFixed(\n              3,\n            )} is located too far from the end of live sliding playlist: ${end}, reset currentTime to : ${liveSyncPosition.toFixed(\n              3,\n            )}`,\n          );\n\n          if (this.config.liveSyncMode === 'buffered') {\n            const bufferInfo = BufferHelper.bufferInfo(\n              media,\n              liveSyncPosition,\n              0,\n            );\n\n            if (!bufferInfo.buffered?.length) {\n              media.currentTime = liveSyncPosition;\n              return;\n            }\n\n            const isLiveSyncInBuffer = bufferInfo.start <= currentTime;\n\n            if (isLiveSyncInBuffer) {\n              media.currentTime = liveSyncPosition;\n              return;\n            }\n\n            const { nextStart } = BufferHelper.bufferedInfo(\n              bufferInfo.buffered,\n              currentTime,\n              0,\n            );\n            if (nextStart) {\n              media.currentTime = nextStart;\n            }\n          } else {\n            media.currentTime = liveSyncPosition;\n          }\n        }\n      }\n    }\n  }\n\n  protected _handleFragmentLoadProgress(data: FragLoadedData) {\n    const frag = data.frag as MediaFragment;\n    const { part, payload } = data;\n    const { levels } = this;\n    if (!levels) {\n      this.warn(\n        `Levels were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`,\n      );\n      return;\n    }\n    const currentLevel = levels[frag.level];\n    if (!currentLevel as any) {\n      this.warn(`Level ${frag.level} not found on progress`);\n      return;\n    }\n    const details = currentLevel.details;\n    if (!details) {\n      this.warn(\n        `Dropping fragment ${frag.sn} of level ${frag.level} after level details were reset`,\n      );\n      this.fragmentTracker.removeFragment(frag);\n      return;\n    }\n    const videoCodec = currentLevel.videoCodec;\n\n    // time Offset is accurate if level PTS is known, or if playlist is not sliding (not live)\n    const accurateTimeOffset = details.PTSKnown || !details.live;\n    const initSegmentData = frag.initSegment?.data;\n    const audioCodec = this._getAudioCodec(currentLevel);\n\n    // transmux the MPEG-TS data to ISO-BMFF segments\n    // this.log(`Transmuxing ${frag.sn} of [${details.startSN} ,${details.endSN}],level ${frag.level}, cc ${frag.cc}`);\n    const transmuxer = (this.transmuxer =\n      this.transmuxer ||\n      new TransmuxerInterface(\n        this.hls,\n        PlaylistLevelType.MAIN,\n        this._handleTransmuxComplete.bind(this),\n        this._handleTransmuxerFlush.bind(this),\n      ));\n    const partIndex = part ? part.index : -1;\n    const partial = partIndex !== -1;\n    const chunkMeta = new ChunkMetadata(\n      frag.level,\n      frag.sn,\n      frag.stats.chunkCount,\n      payload.byteLength,\n      partIndex,\n      partial,\n    );\n    const initPTS = this.initPTS[frag.cc];\n\n    transmuxer.push(\n      payload,\n      initSegmentData,\n      audioCodec,\n      videoCodec,\n      frag,\n      part,\n      details.totalduration,\n      accurateTimeOffset,\n      chunkMeta,\n      initPTS,\n    );\n  }\n\n  private onAudioTrackSwitching(\n    event: Events.AUDIO_TRACK_SWITCHING,\n    data: AudioTrackSwitchingData,\n  ) {\n    const hls = this.hls;\n    // if any URL found on new audio track, it is an alternate audio track\n    const fromAltAudio = this.altAudio !== AlternateAudio.DISABLED;\n    const altAudio = useAlternateAudio(data.url, hls);\n    // if we switch on main audio, ensure that main fragment scheduling is synced with media.buffered\n    // don't do anything if we switch to alt audio: audio stream controller is handling it.\n    // we will just have to change buffer scheduling on audioTrackSwitched\n    if (!altAudio) {\n      if (this.mediaBuffer !== this.media) {\n        this.log(\n          'Switching on main audio, use media.buffered to schedule main fragment loading',\n        );\n        this.mediaBuffer = this.media;\n        const fragCurrent = this.fragCurrent;\n        // we need to refill audio buffer from main: cancel any frag loading to speed up audio switch\n        if (fragCurrent) {\n          this.log('Switching to main audio track, cancel main fragment load');\n          fragCurrent.abortRequests();\n          this.fragmentTracker.removeFragment(fragCurrent);\n        }\n        // destroy transmuxer to force init segment generation (following audio switch)\n        this.resetTransmuxer();\n        // switch to IDLE state to load new fragment\n        this.resetLoadingState();\n      } else if (this.audioOnly) {\n        // Reset audio transmuxer so when switching back to main audio we're not still appending where we left off\n        this.resetTransmuxer();\n      }\n      // If switching from alt to main audio, flush all audio and trigger track switched\n      if (fromAltAudio) {\n        this.altAudio = AlternateAudio.DISABLED;\n        this.fragmentTracker.removeAllFragments();\n        hls.once(Events.BUFFER_FLUSHED, () => {\n          if (!this.hls as any) {\n            return;\n          }\n          this.hls.trigger(Events.AUDIO_TRACK_SWITCHED, data);\n        });\n        hls.trigger(Events.BUFFER_FLUSHING, {\n          startOffset: 0,\n          endOffset: Number.POSITIVE_INFINITY,\n          type: null,\n        });\n        return;\n      }\n      hls.trigger(Events.AUDIO_TRACK_SWITCHED, data);\n    } else {\n      this.altAudio = AlternateAudio.SWITCHING;\n    }\n  }\n\n  private onAudioTrackSwitched(\n    event: Events.AUDIO_TRACK_SWITCHED,\n    data: AudioTrackSwitchedData,\n  ) {\n    const altAudio = useAlternateAudio(data.url, this.hls);\n    if (altAudio) {\n      const videoBuffer = this.videoBuffer;\n      // if we switched on alternate audio, ensure that main fragment scheduling is synced with video sourcebuffer buffered\n      if (videoBuffer && this.mediaBuffer !== videoBuffer) {\n        this.log(\n          'Switching on alternate audio, use video.buffered to schedule main fragment loading',\n        );\n        this.mediaBuffer = videoBuffer;\n      }\n    }\n    this.altAudio = altAudio\n      ? AlternateAudio.SWITCHED\n      : AlternateAudio.DISABLED;\n    this.tick();\n  }\n\n  private onBufferCreated(\n    event: Events.BUFFER_CREATED,\n    data: BufferCreatedData,\n  ) {\n    const tracks = data.tracks;\n    let mediaTrack: BufferCreatedTrack | undefined;\n    let name: string | undefined;\n    let alternate = false;\n    for (const type in tracks) {\n      const track: BufferCreatedTrack = tracks[type];\n      if (track.id === 'main') {\n        name = type;\n        mediaTrack = track;\n        // keep video source buffer reference\n        if (type === 'video') {\n          const videoTrack = tracks[type];\n          if (videoTrack) {\n            this.videoBuffer = videoTrack.buffer;\n          }\n        }\n      } else {\n        alternate = true;\n      }\n    }\n    if (alternate && mediaTrack) {\n      this.log(\n        `Alternate track found, use ${name}.buffered to schedule main fragment loading`,\n      );\n      this.mediaBuffer = mediaTrack.buffer;\n    } else {\n      this.mediaBuffer = this.media;\n    }\n  }\n\n  private onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n    const { frag, part } = data;\n    const bufferedMainFragment = frag.type === PlaylistLevelType.MAIN;\n    if (bufferedMainFragment) {\n      if (this.fragContextChanged(frag)) {\n        // If a level switch was requested while a fragment was buffering, it will emit the FRAG_BUFFERED event upon completion\n        // Avoid setting state back to IDLE, since that will interfere with a level switch\n        this.warn(\n          `Fragment ${frag.sn}${part ? ' p: ' + part.index : ''} of level ${\n            frag.level\n          } finished buffering, but was aborted. state: ${this.state}`,\n        );\n        if (this.state === State.PARSED) {\n          this.state = State.IDLE;\n        }\n        return;\n      }\n      const stats = part ? part.stats : frag.stats;\n      this.fragLastKbps = Math.round(\n        (8 * stats.total) / (stats.buffering.end - stats.loading.first),\n      );\n      if (isMediaFragment(frag)) {\n        this.fragPrevious = frag;\n      }\n      this.fragBufferedComplete(frag, part);\n    }\n\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    if (!this._hasEnoughToStart && BufferHelper.getBuffered(media).length) {\n      this._hasEnoughToStart = true;\n      this.seekToStartPos();\n    }\n    if (bufferedMainFragment) {\n      this.tick();\n    }\n  }\n\n  public get hasEnoughToStart(): boolean {\n    return this._hasEnoughToStart;\n  }\n\n  protected onError(event: Events.ERROR, data: ErrorData) {\n    if (data.fatal) {\n      this.state = State.ERROR;\n      return;\n    }\n    switch (data.details) {\n      case ErrorDetails.FRAG_GAP:\n      case ErrorDetails.FRAG_PARSING_ERROR:\n      case ErrorDetails.FRAG_DECRYPT_ERROR:\n      case ErrorDetails.FRAG_LOAD_ERROR:\n      case ErrorDetails.FRAG_LOAD_TIMEOUT:\n      case ErrorDetails.KEY_LOAD_ERROR:\n      case ErrorDetails.KEY_LOAD_TIMEOUT:\n        this.onFragmentOrKeyLoadError(PlaylistLevelType.MAIN, data);\n        break;\n      case ErrorDetails.LEVEL_LOAD_ERROR:\n      case ErrorDetails.LEVEL_LOAD_TIMEOUT:\n      case ErrorDetails.LEVEL_PARSING_ERROR:\n        // in case of non fatal error while loading level, if level controller is not retrying to load level, switch back to IDLE\n        if (\n          !data.levelRetry &&\n          this.state === State.WAITING_LEVEL &&\n          data.context?.type === PlaylistContextType.LEVEL\n        ) {\n          this.state = State.IDLE;\n        }\n        break;\n      case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        if (data.parent !== 'main') {\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          this.resetLoadingState();\n        }\n        break;\n      case ErrorDetails.BUFFER_FULL_ERROR:\n        if (data.parent !== 'main') {\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          const isAssetPlayer =\n            !this.config.interstitialsController && this.config.assetPlayerId;\n          if (isAssetPlayer) {\n            // Use currentTime in buffer estimate to prevent loading more until playback advances\n            this._hasEnoughToStart = true;\n          } else {\n            this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n          }\n        }\n        break;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(data);\n        break;\n      default:\n        break;\n    }\n  }\n\n  private onFragLoadEmergencyAborted() {\n    this.state = State.IDLE;\n    // if loadedmetadata is not set, it means that we are emergency switch down on first frag\n    // in that case, reset startFragRequested flag\n    if (!this._hasEnoughToStart) {\n      this.startFragRequested = false;\n      this.nextLoadPosition = this.lastCurrentTime;\n    }\n    this.tickImmediate();\n  }\n\n  private onBufferFlushed(\n    event: Events.BUFFER_FLUSHED,\n    { type }: BufferFlushedData,\n  ) {\n    if (type !== ElementaryStreamTypes.AUDIO || !this.altAudio) {\n      const mediaBuffer =\n        (type === ElementaryStreamTypes.VIDEO\n          ? this.videoBuffer\n          : this.mediaBuffer) || this.media;\n      if (mediaBuffer) {\n        this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n        this.tick();\n      }\n    }\n  }\n\n  private onLevelsUpdated(\n    event: Events.LEVELS_UPDATED,\n    data: LevelsUpdatedData,\n  ) {\n    if (this.level > -1 && this.fragCurrent) {\n      this.level = this.fragCurrent.level;\n      if (this.level === -1) {\n        this.resetWhenMissingContext(this.fragCurrent);\n      }\n    }\n    this.levels = data.levels;\n  }\n\n  public swapAudioCodec() {\n    this.audioCodecSwap = !this.audioCodecSwap;\n  }\n\n  /**\n   * Seeks to the set startPosition if not equal to the mediaElement's current time.\n   */\n  protected seekToStartPos() {\n    const { media } = this;\n    if (!media) {\n      return;\n    }\n    const currentTime = media.currentTime;\n    let startPosition = this.startPosition;\n    // only adjust currentTime if different from startPosition or if startPosition not buffered\n    // at that stage, there should be only one buffered range, as we reach that code after first fragment has been buffered\n    if (startPosition >= 0 && currentTime < startPosition) {\n      if (media.seeking) {\n        this.log(\n          `could not seek to ${startPosition}, already seeking at ${currentTime}`,\n        );\n        return;\n      }\n\n      // Offset start position by timeline offset\n      const timelineOffset = this.timelineOffset;\n      if (timelineOffset && startPosition) {\n        startPosition += timelineOffset;\n      }\n      const details = this.getLevelDetails();\n      const buffered = BufferHelper.getBuffered(media);\n      const bufferStart = buffered.length ? buffered.start(0) : 0;\n      const delta = bufferStart - startPosition;\n      const skipTolerance = Math.max(\n        this.config.maxBufferHole,\n        this.config.maxFragLookUpTolerance,\n      );\n      if (\n        this.config.startOnSegmentBoundary ||\n        (delta > 0 &&\n          (delta < skipTolerance ||\n            (this.loadingParts && delta < 2 * (details?.partTarget || 0))))\n      ) {\n        this.log(`adjusting start position by ${delta} to match buffer start`);\n        startPosition += delta;\n        this.startPosition = startPosition;\n      }\n      if (currentTime < startPosition) {\n        this.log(\n          `seek to target start position ${startPosition} from current time ${currentTime} buffer start ${bufferStart}`,\n        );\n        media.currentTime = startPosition;\n      }\n    }\n  }\n\n  private _getAudioCodec(currentLevel) {\n    let audioCodec = this.config.defaultAudioCodec || currentLevel.audioCodec;\n    if (this.audioCodecSwap && audioCodec) {\n      this.log('Swapping audio codec');\n      if (audioCodec.indexOf('mp4a.40.5') !== -1) {\n        audioCodec = 'mp4a.40.2';\n      } else {\n        audioCodec = 'mp4a.40.5';\n      }\n    }\n\n    return audioCodec;\n  }\n\n  private _loadBitrateTestFrag(fragment: Fragment, level: Level) {\n    fragment.bitrateTest = true;\n    this._doFragLoad(fragment, level)\n      .then((data) => {\n        const { hls } = this;\n        const frag = data?.frag;\n        if (!frag || this.fragContextChanged(frag)) {\n          return;\n        }\n        level.fragmentError = 0;\n        this.state = State.IDLE;\n        this.startFragRequested = false;\n        this.bitrateTest = false;\n        const stats = frag.stats;\n        // Bitrate tests fragments are neither parsed nor buffered\n        stats.parsing.start =\n          stats.parsing.end =\n          stats.buffering.start =\n          stats.buffering.end =\n            self.performance.now();\n        hls.trigger(Events.FRAG_LOADED, data as FragLoadedData);\n        frag.bitrateTest = false;\n      })\n      .catch((reason) => {\n        if (this.state === State.STOPPED || this.state === State.ERROR) {\n          return;\n        }\n        this.warn(reason);\n        this.resetFragmentLoading(fragment);\n      });\n  }\n\n  private _handleTransmuxComplete(transmuxResult: TransmuxerResult) {\n    const id = this.playlistType;\n    const { hls } = this;\n    const { remuxResult, chunkMeta } = transmuxResult;\n\n    const context = this.getCurrentContext(chunkMeta);\n    if (!context) {\n      this.resetWhenMissingContext(chunkMeta);\n      return;\n    }\n    const { frag, part, level } = context;\n    const { video, text, id3, initSegment } = remuxResult;\n    const { details } = level;\n    // The audio-stream-controller handles audio buffering if Hls.js is playing an alternate audio track\n    const audio = this.altAudio ? undefined : remuxResult.audio;\n\n    // Check if the current fragment has been aborted. We check this by first seeing if we're still playing the current level.\n    // If we are, subsequently check if the currently loading fragment (fragCurrent) has changed.\n    if (this.fragContextChanged(frag)) {\n      this.fragmentTracker.removeFragment(frag);\n      return;\n    }\n\n    this.state = State.PARSING;\n\n    if (initSegment) {\n      const tracks = initSegment.tracks;\n      if (tracks) {\n        const mapFragment = frag.initSegment || frag;\n        if (this.unhandledEncryptionError(initSegment, frag)) {\n          return;\n        }\n        this._bufferInitSegment(level, tracks, mapFragment, chunkMeta);\n        hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n          frag: mapFragment,\n          id,\n          tracks,\n        });\n      }\n\n      const baseTime = initSegment.initPTS as number;\n      const timescale = initSegment.timescale as number;\n      const initPTS = this.initPTS[frag.cc];\n      if (\n        Number.isFinite(baseTime) &&\n        ((!initPTS as any) ||\n          initPTS.baseTime !== baseTime ||\n          initPTS.timescale !== timescale)\n      ) {\n        const trackId = initSegment.trackId as number;\n        this.initPTS[frag.cc] = {\n          baseTime,\n          timescale,\n          trackId,\n        };\n        hls.trigger(Events.INIT_PTS_FOUND, {\n          frag,\n          id,\n          initPTS: baseTime,\n          timescale,\n          trackId,\n        });\n      }\n    }\n\n    // Avoid buffering if backtracking this fragment\n    if (video && details) {\n      if (audio && video.type === 'audiovideo') {\n        this.logMuxedErr(frag);\n      }\n      const prevFrag = details.fragments[frag.sn - 1 - details.startSN];\n      const isFirstFragment = frag.sn === details.startSN;\n      const isFirstInDiscontinuity =\n        (!prevFrag as any) || frag.cc > prevFrag.cc;\n      if (remuxResult.independent !== false) {\n        const { startPTS, endPTS, startDTS, endDTS } = video;\n        if (part) {\n          part.elementaryStreams[video.type] = {\n            startPTS,\n            endPTS,\n            startDTS,\n            endDTS,\n          };\n        } else {\n          if (\n            video.firstKeyFrame &&\n            video.independent &&\n            chunkMeta.id === 1 &&\n            !isFirstInDiscontinuity\n          ) {\n            this.couldBacktrack = true;\n          }\n          if (video.dropped && video.independent) {\n            // Backtrack if dropped frames create a gap after currentTime\n\n            const bufferInfo = this.getMainFwdBufferInfo();\n            const targetBufferTime =\n              (bufferInfo ? bufferInfo.end : this.getLoadPosition()) +\n              this.config.maxBufferHole;\n            const startTime = video.firstKeyFramePTS\n              ? video.firstKeyFramePTS\n              : startPTS;\n            if (\n              !isFirstFragment &&\n              targetBufferTime < startTime - this.config.maxBufferHole &&\n              !isFirstInDiscontinuity\n            ) {\n              this.backtrack(frag);\n              return;\n            } else if (isFirstInDiscontinuity) {\n              // Mark segment with a gap to avoid loop loading\n              frag.gap = true;\n            }\n            // Set video stream start to fragment start so that truncated samples do not distort the timeline, and mark it partial\n            frag.setElementaryStreamInfo(\n              video.type as ElementaryStreamTypes,\n              frag.start,\n              endPTS,\n              frag.start,\n              endDTS,\n              true,\n            );\n          } else if (\n            isFirstFragment &&\n            startPTS - (details.appliedTimelineOffset || 0) > MAX_START_GAP_JUMP\n          ) {\n            // Mark segment with a gap to skip large start gap\n            frag.gap = true;\n          }\n        }\n        frag.setElementaryStreamInfo(\n          video.type as ElementaryStreamTypes,\n          startPTS,\n          endPTS,\n          startDTS,\n          endDTS,\n        );\n        if (this.backtrackFragment) {\n          this.backtrackFragment = frag;\n        }\n        this.bufferFragmentData(\n          video,\n          frag,\n          part,\n          chunkMeta,\n          isFirstFragment || isFirstInDiscontinuity,\n        );\n      } else if (isFirstFragment || isFirstInDiscontinuity) {\n        // Mark segment with a gap to avoid loop loading\n        frag.gap = true;\n      } else {\n        this.backtrack(frag);\n        return;\n      }\n    }\n\n    if (audio) {\n      const { startPTS, endPTS, startDTS, endDTS } = audio;\n      if (part) {\n        part.elementaryStreams[ElementaryStreamTypes.AUDIO] = {\n          startPTS,\n          endPTS,\n          startDTS,\n          endDTS,\n        };\n      }\n      frag.setElementaryStreamInfo(\n        ElementaryStreamTypes.AUDIO,\n        startPTS,\n        endPTS,\n        startDTS,\n        endDTS,\n      );\n      this.bufferFragmentData(audio, frag, part, chunkMeta);\n    }\n\n    if (details && id3?.samples.length) {\n      const emittedID3: FragParsingMetadataData = {\n        id,\n        frag,\n        details,\n        samples: id3.samples,\n      };\n      hls.trigger(Events.FRAG_PARSING_METADATA, emittedID3);\n    }\n    if (details && text) {\n      const emittedText: FragParsingUserdataData = {\n        id,\n        frag,\n        details,\n        samples: text.samples,\n      };\n      hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText);\n    }\n  }\n\n  private logMuxedErr(frag: Fragment) {\n    this.warn(\n      `${isMediaFragment(frag) ? 'Media' : 'Init'} segment with muxed audiovideo where only video expected: ${frag.url}`,\n    );\n  }\n\n  private _bufferInitSegment(\n    currentLevel: Level,\n    tracks: TrackSet,\n    frag: Fragment,\n    chunkMeta: ChunkMetadata,\n  ) {\n    if (this.state !== State.PARSING) {\n      return;\n    }\n\n    this.audioOnly = !!tracks.audio && !tracks.video;\n\n    // if audio track is expected to come from audio stream controller, discard any coming from main\n    if (this.altAudio && !this.audioOnly) {\n      delete tracks.audio;\n      if (tracks.audiovideo) {\n        this.logMuxedErr(frag);\n      }\n    }\n    // include levelCodec in audio and video tracks\n    const { audio, video, audiovideo } = tracks;\n    if (audio) {\n      const levelCodec = currentLevel.audioCodec;\n      let audioCodec = pickMostCompleteCodecName(audio.codec, levelCodec);\n      // Add level and profile to make up for remuxer not being able to parse full codec\n      // (logger warning \"Unhandled audio codec...\")\n      if (audioCodec === 'mp4a') {\n        audioCodec = 'mp4a.40.5';\n      }\n      // Handle `audioCodecSwitch`\n      const ua = navigator.userAgent.toLowerCase();\n      if (this.audioCodecSwitch) {\n        if (audioCodec) {\n          if (audioCodec.indexOf('mp4a.40.5') !== -1) {\n            audioCodec = 'mp4a.40.2';\n          } else {\n            audioCodec = 'mp4a.40.5';\n          }\n        }\n        // In the case that AAC and HE-AAC audio codecs are signalled in manifest,\n        // force HE-AAC, as it seems that most browsers prefers it.\n        // don't force HE-AAC if mono stream, or in Firefox\n        const audioMetadata = audio.metadata;\n        if (\n          audioMetadata &&\n          'channelCount' in audioMetadata &&\n          (audioMetadata.channelCount || 1) !== 1 &&\n          ua.indexOf('firefox') === -1\n        ) {\n          audioCodec = 'mp4a.40.5';\n        }\n      }\n      // HE-AAC is broken on Android, always signal audio codec as AAC even if variant manifest states otherwise\n      if (\n        audioCodec &&\n        audioCodec.indexOf('mp4a.40.5') !== -1 &&\n        ua.indexOf('android') !== -1 &&\n        audio.container !== 'audio/mpeg'\n      ) {\n        // Exclude mpeg audio\n        audioCodec = 'mp4a.40.2';\n        this.log(`Android: force audio codec to ${audioCodec}`);\n      }\n      if (levelCodec && levelCodec !== audioCodec) {\n        this.log(\n          `Swapping manifest audio codec \"${levelCodec}\" for \"${audioCodec}\"`,\n        );\n      }\n      audio.levelCodec = audioCodec;\n      audio.id = PlaylistLevelType.MAIN;\n      this.log(\n        `Init audio buffer, container:${\n          audio.container\n        }, codecs[selected/level/parsed]=[${audioCodec || ''}/${\n          levelCodec || ''\n        }/${audio.codec}]`,\n      );\n      delete tracks.audiovideo;\n    }\n    if (video) {\n      video.levelCodec = currentLevel.videoCodec;\n      video.id = PlaylistLevelType.MAIN;\n      const parsedVideoCodec = video.codec;\n      if (parsedVideoCodec?.length === 4) {\n        // Make up for passthrough-remuxer not being able to parse full codec\n        // (logger warning \"Unhandled video codec...\")\n        switch (parsedVideoCodec) {\n          case 'hvc1':\n          case 'hev1':\n            video.codec = 'hvc1.1.6.L120.90';\n            break;\n          case 'av01':\n            video.codec = 'av01.0.04M.08';\n            break;\n          case 'avc1':\n            video.codec = 'avc1.42e01e';\n            break;\n        }\n      }\n      this.log(\n        `Init video buffer, container:${\n          video.container\n        }, codecs[level/parsed]=[${currentLevel.videoCodec || ''}/${\n          parsedVideoCodec\n        }]${video.codec !== parsedVideoCodec ? ' parsed-corrected=' + video.codec : ''}${video.supplemental ? ' supplemental=' + video.supplemental : ''}`,\n      );\n      delete tracks.audiovideo;\n    }\n    if (audiovideo) {\n      this.log(\n        `Init audiovideo buffer, container:${audiovideo.container}, codecs[level/parsed]=[${currentLevel.codecs}/${audiovideo.codec}]`,\n      );\n      delete tracks.video;\n      delete tracks.audio;\n    }\n    const trackTypes = Object.keys(tracks);\n    if (trackTypes.length) {\n      this.hls.trigger(Events.BUFFER_CODECS, tracks as BufferCodecsData);\n      if (!this.hls as any) {\n        // Exit after fatal tracks error\n        return;\n      }\n      // loop through tracks that are going to be provided to bufferController\n      trackTypes.forEach((trackName) => {\n        const track = tracks[trackName] as Track;\n        const initSegment = track.initSegment;\n        if (initSegment?.byteLength) {\n          this.hls.trigger(Events.BUFFER_APPENDING, {\n            type: trackName as SourceBufferName,\n            data: initSegment,\n            frag,\n            part: null,\n            chunkMeta,\n            parent: frag.type,\n          });\n        }\n      });\n    }\n    // trigger handler right now\n    this.tickImmediate();\n  }\n\n  public getMainFwdBufferInfo(): BufferInfo | null {\n    // Observe video SourceBuffer (this.mediaBuffer) only when alt-audio is used, otherwise observe combined media buffer\n    const bufferOutput =\n      this.mediaBuffer && this.altAudio === AlternateAudio.SWITCHED\n        ? this.mediaBuffer\n        : this.media;\n    return this.getFwdBufferInfo(bufferOutput, PlaylistLevelType.MAIN);\n  }\n\n  public get maxBufferLength(): number {\n    const { levels, level } = this;\n    const levelInfo = levels?.[level];\n    if (!levelInfo) {\n      return this.config.maxBufferLength;\n    }\n    return this.getMaxBufferLength(levelInfo.maxBitrate);\n  }\n\n  private backtrack(frag: Fragment) {\n    this.couldBacktrack = true;\n    // Causes findFragments to backtrack through fragments to find the keyframe\n    this.backtrackFragment = frag;\n    this.resetTransmuxer();\n    this.flushBufferGap(frag);\n    this.fragmentTracker.removeFragment(frag);\n    this.fragPrevious = null;\n    this.nextLoadPosition = frag.start;\n    this.state = State.IDLE;\n  }\n\n  private checkFragmentChanged() {\n    const video = this.media;\n    let fragPlayingCurrent: Fragment | null = null;\n    if (video && video.readyState > 1 && video.seeking === false) {\n      const currentTime = video.currentTime;\n      /* if video element is in seeked state, currentTime can only increase.\n        (assuming that playback rate is positive ...)\n        As sometimes currentTime jumps back to zero after a\n        media decode error, check this, to avoid seeking back to\n        wrong position after a media decode error\n      */\n\n      if (BufferHelper.isBuffered(video, currentTime)) {\n        fragPlayingCurrent = this.getAppendedFrag(currentTime);\n      } else if (BufferHelper.isBuffered(video, currentTime + 0.1)) {\n        /* ensure that FRAG_CHANGED event is triggered at startup,\n          when first video frame is displayed and playback is paused.\n          add a tolerance of 100ms, in case current position is not buffered,\n          check if current pos+100ms is buffered and use that buffer range\n          for FRAG_CHANGED event reporting */\n        fragPlayingCurrent = this.getAppendedFrag(currentTime + 0.1);\n      }\n      if (fragPlayingCurrent) {\n        this.backtrackFragment = null;\n        const fragPlaying = this.fragPlaying;\n        const fragCurrentLevel = fragPlayingCurrent.level;\n        if (\n          !fragPlaying ||\n          fragPlayingCurrent.sn !== fragPlaying.sn ||\n          fragPlaying.level !== fragCurrentLevel\n        ) {\n          this.fragPlaying = fragPlayingCurrent;\n          this.hls.trigger(Events.FRAG_CHANGED, { frag: fragPlayingCurrent });\n          if (!fragPlaying || fragPlaying.level !== fragCurrentLevel) {\n            this.hls.trigger(Events.LEVEL_SWITCHED, {\n              level: fragCurrentLevel,\n            });\n          }\n        }\n      }\n    }\n  }\n\n  get nextLevel(): number {\n    const frag = this.nextBufferedFrag;\n    if (frag) {\n      return frag.level;\n    }\n    return -1;\n  }\n\n  get currentFrag(): Fragment | null {\n    if (this.fragPlaying) {\n      return this.fragPlaying;\n    }\n    const currentTime = this.media?.currentTime || this.lastCurrentTime;\n    if (Number.isFinite(currentTime)) {\n      return this.getAppendedFrag(currentTime);\n    }\n    return null;\n  }\n\n  get currentProgramDateTime(): Date | null {\n    const currentTime = this.media?.currentTime || this.lastCurrentTime;\n    if (Number.isFinite(currentTime)) {\n      const details = this.getLevelDetails();\n      const frag =\n        this.currentFrag ||\n        (details\n          ? findFragmentByPTS(null, details.fragments, currentTime)\n          : null);\n      if (frag) {\n        const programDateTime = frag.programDateTime;\n        if (programDateTime !== null) {\n          const epocMs = programDateTime + (currentTime - frag.start) * 1000;\n          return new Date(epocMs);\n        }\n      }\n    }\n    return null;\n  }\n\n  get currentLevel(): number {\n    const frag = this.currentFrag;\n    if (frag) {\n      return frag.level;\n    }\n    return -1;\n  }\n\n  get nextBufferedFrag() {\n    const frag = this.currentFrag;\n    if (frag) {\n      return this.followingBufferedFrag(frag);\n    }\n    return null;\n  }\n\n  get forceStartLoad() {\n    return this._forceStartLoad;\n  }\n}\n", "import { LoadError } from './fragment-loader';\nimport { LevelKey } from './level-key';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { type Fragment, isMediaFragment } from '../loader/fragment';\nimport { arrayToHex } from '../utils/hex';\nimport { Logger } from '../utils/logger';\nimport {\n  getKeySystemsForConfig,\n  keySystemFormatToKeySystemDomain,\n} from '../utils/mediakeys-helper';\nimport { KeySystemFormats } from '../utils/mediakeys-helper';\nimport { parseKeyIdsFromTenc } from '../utils/mp4-tools';\nimport type { HlsConfig } from '../config';\nimport type EMEController from '../controller/eme-controller';\nimport type {\n  EMEKeyError,\n  MediaKeySessionContext,\n} from '../controller/eme-controller';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { KeyLoadedData } from '../types/events';\nimport type {\n  KeyLoaderContext,\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderResponse,\n  LoaderStats,\n  PlaylistLevelType,\n} from '../types/loader';\nimport type { ILogger } from '../utils/logger';\n\nexport interface KeyLoaderInfo {\n  decryptdata: LevelKey;\n  keyLoadPromise: Promise<KeyLoadedData> | null;\n  loader: Loader<KeyLoaderContext> | null;\n  mediaKeySessionContext: MediaKeySessionContext | null;\n}\nexport default class KeyLoader extends Logger implements ComponentAPI {\n  private readonly config: HlsConfig;\n  private keyIdToKeyInfo: { [keyId: string]: KeyLoaderInfo | undefined } = {};\n  public emeController: EMEController | null = null;\n\n  constructor(config: HlsConfig, logger: ILogger) {\n    super('key-loader', logger);\n    this.config = config;\n  }\n\n  abort(type?: PlaylistLevelType) {\n    for (const id in this.keyIdToKeyInfo) {\n      const loader = this.keyIdToKeyInfo[id]!.loader;\n      if (loader) {\n        if (type && type !== loader.context?.frag.type) {\n          return;\n        }\n        loader.abort();\n      }\n    }\n  }\n\n  detach() {\n    for (const id in this.keyIdToKeyInfo) {\n      const keyInfo = this.keyIdToKeyInfo[id]!;\n      // Remove cached EME keys on detach\n      if (\n        keyInfo.mediaKeySessionContext ||\n        keyInfo.decryptdata.isCommonEncryption\n      ) {\n        delete this.keyIdToKeyInfo[id];\n      }\n    }\n  }\n\n  destroy() {\n    this.detach();\n    for (const id in this.keyIdToKeyInfo) {\n      const loader = this.keyIdToKeyInfo[id]!.loader;\n      if (loader) {\n        loader.destroy();\n      }\n    }\n    this.keyIdToKeyInfo = {};\n  }\n\n  createKeyLoadError(\n    frag: Fragment,\n    details: ErrorDetails = ErrorDetails.KEY_LOAD_ERROR,\n    error: Error,\n    networkDetails?: any,\n    response?: { url: string; data: undefined; code: number; text: string },\n  ): LoadError {\n    return new LoadError({\n      type: ErrorTypes.NETWORK_ERROR,\n      details,\n      fatal: false,\n      frag,\n      response,\n      error,\n      networkDetails,\n    });\n  }\n\n  loadClear(\n    loadingFrag: Fragment,\n    encryptedFragments: Fragment[],\n    startFragRequested: boolean,\n  ): null | Promise<void> {\n    if (\n      __USE_EME_DRM__ &&\n      this.emeController &&\n      this.config.emeEnabled &&\n      !this.emeController.getSelectedKeySystemFormats().length\n    ) {\n      // Access key-system with nearest key on start (loading frag is unencrypted)\n      if (encryptedFragments.length) {\n        for (let i = 0, l = encryptedFragments.length; i < l; i++) {\n          const frag = encryptedFragments[i];\n          // Loading at or before segment with EXT-X-KEY, or first frag loading and last EXT-X-KEY\n          if (\n            (loadingFrag.cc <= frag.cc &&\n              (!isMediaFragment(loadingFrag) ||\n                !isMediaFragment(frag) ||\n                loadingFrag.sn < frag.sn)) ||\n            (!startFragRequested && i == l - 1)\n          ) {\n            return this.emeController\n              .selectKeySystemFormat(frag)\n              .then((keySystemFormat) => {\n                if (!this.emeController) {\n                  return;\n                }\n                frag.setKeyFormat(keySystemFormat);\n                const keySystem =\n                  keySystemFormatToKeySystemDomain(keySystemFormat);\n                if (keySystem) {\n                  return this.emeController.getKeySystemAccess([keySystem]);\n                }\n              });\n          }\n        }\n      }\n      if (this.config.requireKeySystemAccessOnStart) {\n        const keySystemsInConfig = getKeySystemsForConfig(this.config);\n        if (keySystemsInConfig.length) {\n          return this.emeController.getKeySystemAccess(keySystemsInConfig);\n        }\n      }\n    }\n    return null;\n  }\n\n  load(frag: Fragment): Promise<KeyLoadedData> {\n    if (\n      !frag.decryptdata &&\n      frag.encrypted &&\n      this.emeController &&\n      this.config.emeEnabled\n    ) {\n      // Multiple keys, but none selected, resolve in eme-controller\n      return this.emeController\n        .selectKeySystemFormat(frag)\n        .then((keySystemFormat) => {\n          return this.loadInternal(frag, keySystemFormat);\n        });\n    }\n\n    return this.loadInternal(frag);\n  }\n\n  loadInternal(\n    frag: Fragment,\n    keySystemFormat?: KeySystemFormats,\n  ): Promise<KeyLoadedData> {\n    if (__USE_EME_DRM__ && keySystemFormat) {\n      frag.setKeyFormat(keySystemFormat);\n    }\n    const decryptdata = frag.decryptdata;\n    if (!decryptdata) {\n      const error = new Error(\n        keySystemFormat\n          ? `Expected frag.decryptdata to be defined after setting format ${keySystemFormat}`\n          : `Missing decryption data on fragment in onKeyLoading (emeEnabled with controller: ${this.emeController && this.config.emeEnabled})`,\n      );\n      return Promise.reject(\n        this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, error),\n      );\n    }\n    const uri = decryptdata.uri;\n    if (!uri) {\n      return Promise.reject(\n        this.createKeyLoadError(\n          frag,\n          ErrorDetails.KEY_LOAD_ERROR,\n          new Error(`Invalid key URI: \"${uri}\"`),\n        ),\n      );\n    }\n    const id = getKeyId(decryptdata);\n    let keyInfo = this.keyIdToKeyInfo[id];\n\n    if (keyInfo?.decryptdata.key) {\n      decryptdata.key = keyInfo.decryptdata.key;\n      return Promise.resolve({ frag, keyInfo });\n    }\n    // Return key load promise once it has a mediakey session with an usable key status\n    if (this.emeController && keyInfo?.keyLoadPromise) {\n      const keyStatus = this.emeController.getKeyStatus(keyInfo.decryptdata);\n      switch (keyStatus) {\n        case 'usable':\n        case 'usable-in-future':\n          return keyInfo.keyLoadPromise.then((keyLoadedData) => {\n            // Return the correct fragment with updated decryptdata key and loaded keyInfo\n            const { keyInfo } = keyLoadedData;\n            decryptdata.key = keyInfo.decryptdata.key;\n            return { frag, keyInfo };\n          });\n      }\n      // If we have a key session and status and it is not pending or usable, continue\n      // This will go back to the eme-controller for expired keys to get a new keyLoadPromise\n    }\n\n    // Load the key or return the loading promise\n    this.log(\n      `${this.keyIdToKeyInfo[id] ? 'Rel' : 'L'}oading${decryptdata.keyId ? ' keyId: ' + arrayToHex(decryptdata.keyId) : ''} URI: ${decryptdata.uri} from ${frag.type} ${frag.level}`,\n    );\n\n    keyInfo = this.keyIdToKeyInfo[id] = {\n      decryptdata,\n      keyLoadPromise: null,\n      loader: null,\n      mediaKeySessionContext: null,\n    };\n\n    switch (decryptdata.method) {\n      case 'SAMPLE-AES':\n      case 'SAMPLE-AES-CENC':\n      case 'SAMPLE-AES-CTR':\n        if (decryptdata.keyFormat === 'identity') {\n          // loadKeyHTTP handles http(s) and data URLs\n          return this.loadKeyHTTP(keyInfo, frag);\n        }\n        return this.loadKeyEME(keyInfo, frag);\n      case 'AES-128':\n      case 'AES-256':\n      case 'AES-256-CTR':\n        return this.loadKeyHTTP(keyInfo, frag);\n      default:\n        return Promise.reject(\n          this.createKeyLoadError(\n            frag,\n            ErrorDetails.KEY_LOAD_ERROR,\n            new Error(\n              `Key supplied with unsupported METHOD: \"${decryptdata.method}\"`,\n            ),\n          ),\n        );\n    }\n  }\n\n  loadKeyEME(keyInfo: KeyLoaderInfo, frag: Fragment): Promise<KeyLoadedData> {\n    const keyLoadedData: KeyLoadedData = { frag, keyInfo };\n    if (this.emeController && this.config.emeEnabled) {\n      if (!keyInfo.decryptdata.keyId && frag.initSegment?.data) {\n        const keyIds = parseKeyIdsFromTenc(\n          frag.initSegment.data as Uint8Array<ArrayBuffer>,\n        );\n        if (keyIds.length) {\n          let keyId = keyIds[0];\n          if (keyId.some((b) => b !== 0)) {\n            this.log(`Using keyId found in init segment ${arrayToHex(keyId)}`);\n            LevelKey.setKeyIdForUri(keyInfo.decryptdata.uri, keyId);\n          } else {\n            keyId = LevelKey.addKeyIdForUri(keyInfo.decryptdata.uri);\n            this.log(`Generating keyId to patch media ${arrayToHex(keyId)}`);\n          }\n          keyInfo.decryptdata.keyId = keyId;\n        }\n      }\n      if (!keyInfo.decryptdata.keyId && !isMediaFragment(frag)) {\n        // Resolve so that unencrypted init segment is loaded\n        // key id is extracted from tenc box when processing key for next segment above\n        return Promise.resolve(keyLoadedData);\n      }\n      const keySessionContextPromise =\n        this.emeController.loadKey(keyLoadedData);\n      return (keyInfo.keyLoadPromise = keySessionContextPromise.then(\n        (keySessionContext) => {\n          keyInfo.mediaKeySessionContext = keySessionContext;\n          return keyLoadedData;\n        },\n      )).catch((error: EMEKeyError | Error) => {\n        // Remove promise for license renewal or retry\n        keyInfo.keyLoadPromise = null;\n        if ('data' in error) {\n          error.data.frag = frag;\n        }\n        throw error;\n      });\n    }\n    return Promise.resolve(keyLoadedData);\n  }\n\n  loadKeyHTTP(keyInfo: KeyLoaderInfo, frag: Fragment): Promise<KeyLoadedData> {\n    const config = this.config;\n    const Loader = config.loader;\n    const keyLoader = new Loader(config) as Loader<KeyLoaderContext>;\n    frag.keyLoader = keyInfo.loader = keyLoader;\n\n    return (keyInfo.keyLoadPromise = new Promise((resolve, reject) => {\n      const loaderContext: KeyLoaderContext = {\n        keyInfo,\n        frag,\n        responseType: 'arraybuffer',\n        url: keyInfo.decryptdata.uri,\n      };\n\n      // maxRetry is 0 so that instead of retrying the same key on the same variant multiple times,\n      // key-loader will trigger an error and rely on stream-controller to handle retry logic.\n      // this will also align retry logic with fragment-loader\n      const loadPolicy = config.keyLoadPolicy.default;\n      const loaderConfig: LoaderConfiguration = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n      };\n\n      const loaderCallbacks: LoaderCallbacks<KeyLoaderContext> = {\n        onSuccess: (\n          response: LoaderResponse,\n          stats: LoaderStats,\n          context: KeyLoaderContext,\n          networkDetails: any,\n        ) => {\n          const { frag, keyInfo } = context;\n          const id = getKeyId(keyInfo.decryptdata);\n          if (!frag.decryptdata || keyInfo !== this.keyIdToKeyInfo[id]) {\n            return reject(\n              this.createKeyLoadError(\n                frag,\n                ErrorDetails.KEY_LOAD_ERROR,\n                new Error('after key load, decryptdata unset or changed'),\n                networkDetails,\n              ),\n            );\n          }\n\n          keyInfo.decryptdata.key = frag.decryptdata.key = new Uint8Array(\n            response.data as ArrayBuffer,\n          );\n\n          // detach fragment key loader on load success\n          frag.keyLoader = null;\n          keyInfo.loader = null;\n          resolve({ frag, keyInfo });\n        },\n\n        onError: (\n          response: { code: number; text: string },\n          context: KeyLoaderContext,\n          networkDetails: any,\n          stats: LoaderStats,\n        ) => {\n          this.resetLoader(context);\n          reject(\n            this.createKeyLoadError(\n              frag,\n              ErrorDetails.KEY_LOAD_ERROR,\n              new Error(\n                `HTTP Error ${response.code} loading key ${response.text}`,\n              ),\n              networkDetails,\n              { url: loaderContext.url, data: undefined, ...response },\n            ),\n          );\n        },\n\n        onTimeout: (\n          stats: LoaderStats,\n          context: KeyLoaderContext,\n          networkDetails: any,\n        ) => {\n          this.resetLoader(context);\n          reject(\n            this.createKeyLoadError(\n              frag,\n              ErrorDetails.KEY_LOAD_TIMEOUT,\n              new Error('key loading timed out'),\n              networkDetails,\n            ),\n          );\n        },\n\n        onAbort: (\n          stats: LoaderStats,\n          context: KeyLoaderContext,\n          networkDetails: any,\n        ) => {\n          this.resetLoader(context);\n          reject(\n            this.createKeyLoadError(\n              frag,\n              ErrorDetails.INTERNAL_ABORTED,\n              new Error('key loading aborted'),\n              networkDetails,\n            ),\n          );\n        },\n      };\n\n      keyLoader.load(loaderContext, loaderConfig, loaderCallbacks);\n    }));\n  }\n\n  private resetLoader(context: KeyLoaderContext) {\n    const { frag, keyInfo, url: uri } = context;\n    const loader = keyInfo.loader;\n    if (frag.keyLoader === loader) {\n      frag.keyLoader = null;\n      keyInfo.loader = null;\n    }\n    const id = getKeyId(keyInfo.decryptdata) || uri;\n    delete this.keyIdToKeyInfo[id];\n    if (loader) {\n      loader.destroy();\n    }\n  }\n}\n\nfunction getKeyId(decryptdata: LevelKey) {\n  if (__USE_EME_DRM__ && decryptdata.keyFormat !== KeySystemFormats.FAIRPLAY) {\n    const keyId = decryptdata.keyId;\n    if (keyId) {\n      return arrayToHex(keyId);\n    }\n  }\n  return decryptdata.uri;\n}\n", "/**\n * PlaylistLoader - delegate for media manifest/playlist loading tasks. Takes care of parsing media to internal data-models.\n *\n * Once loaded, dispatches events with parsed data-models of manifest/levels/audio/subtitle tracks.\n *\n * Uses loader(s) set in config to do actual internal loading of resource tasks.\n */\n\nimport M3U8Parser from './m3u8-parser';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { Events } from '../events';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { AttrList } from '../utils/attr-list';\nimport {\n  areCodecsMediaSourceSupported,\n  sampleEntryCodesISO,\n} from '../utils/codecs';\nimport { computeReloadInterval } from '../utils/level-helper';\nimport type { LevelDetails } from './level-details';\nimport type { LoaderConfig, RetryConfig } from '../config';\nimport type Hls from '../hls';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n  ErrorData,\n  LevelLoadingData,\n  LevelsUpdatedData,\n  ManifestLoadingData,\n  TrackLoadingData,\n} from '../types/events';\nimport type { Level, LevelParsed, VariableMap } from '../types/level';\nimport type {\n  Loader,\n  LoaderCallbacks,\n  LoaderConfiguration,\n  LoaderContext,\n  LoaderResponse,\n  LoaderStats,\n  PlaylistLoaderContext,\n} from '../types/loader';\nimport type { MediaAttributes, MediaPlaylist } from '../types/media-playlist';\n\nfunction mapContextToLevelType(\n  context: PlaylistLoaderContext,\n): PlaylistLevelType {\n  const { type } = context;\n\n  switch (type) {\n    case PlaylistContextType.AUDIO_TRACK:\n      return PlaylistLevelType.AUDIO;\n    case PlaylistContextType.SUBTITLE_TRACK:\n      return PlaylistLevelType.SUBTITLE;\n    default:\n      return PlaylistLevelType.MAIN;\n  }\n}\n\nfunction getResponseUrl(\n  response: LoaderResponse,\n  context: PlaylistLoaderContext,\n): string {\n  let url = response.url;\n  // responseURL not supported on some browsers (it is used to detect URL redirection)\n  // data-uri mode also not supported (but no need to detect redirection)\n  if (url === undefined || url.indexOf('data:') === 0) {\n    // fallback to initial URL\n    url = context.url;\n  }\n  return url;\n}\n\nclass PlaylistLoader implements NetworkComponentAPI {\n  private readonly hls: Hls;\n  private readonly loaders: {\n    [key: string]: Loader<LoaderContext>;\n  } = Object.create(null);\n  private variableList: VariableMap | null = null;\n  public onManifestLoaded = this.checkAutostartLoad;\n\n  constructor(hls: Hls) {\n    this.hls = hls;\n    this.registerListeners();\n  }\n\n  public startLoad(startPosition: number): void {}\n\n  public stopLoad(): void {\n    this.destroyInternalLoaders();\n  }\n\n  private registerListeners() {\n    const { hls } = this;\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.on(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);\n    hls.on(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);\n    hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n  }\n\n  private unregisterListeners() {\n    const { hls } = this;\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);\n    hls.off(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);\n    hls.off(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);\n    hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n  }\n\n  /**\n   * Returns defaults or configured loader-type overloads (pLoader and loader config params)\n   */\n  private createInternalLoader(\n    context: PlaylistLoaderContext,\n  ): Loader<LoaderContext> {\n    const config = this.hls.config;\n    const PLoader = config.pLoader;\n    const Loader = config.loader;\n    const InternalLoader = PLoader || Loader;\n    const loader = new InternalLoader(config) as Loader<PlaylistLoaderContext>;\n\n    this.loaders[context.type] = loader;\n    return loader;\n  }\n\n  private getInternalLoader(\n    context: PlaylistLoaderContext,\n  ): Loader<LoaderContext> | undefined {\n    return this.loaders[context.type];\n  }\n\n  private resetInternalLoader(contextType: PlaylistContextType): void {\n    if (this.loaders[contextType]) {\n      delete this.loaders[contextType];\n    }\n  }\n\n  /**\n   * Call `destroy` on all internal loader instances mapped (one per context type)\n   */\n  private destroyInternalLoaders(): void {\n    for (const contextType in this.loaders) {\n      const loader = this.loaders[contextType];\n      if (loader) {\n        loader.destroy();\n      }\n\n      this.resetInternalLoader(contextType as PlaylistContextType);\n    }\n  }\n\n  public destroy(): void {\n    this.variableList = null;\n    this.unregisterListeners();\n    this.destroyInternalLoaders();\n  }\n\n  private onManifestLoading(\n    event: Events.MANIFEST_LOADING,\n    data: ManifestLoadingData,\n  ) {\n    const { url } = data;\n    this.variableList = null;\n    this.load({\n      id: null,\n      level: 0,\n      responseType: 'text',\n      type: PlaylistContextType.MANIFEST,\n      url,\n      deliveryDirectives: null,\n      levelOrTrack: null,\n    });\n  }\n\n  private onLevelLoading(event: Events.LEVEL_LOADING, data: LevelLoadingData) {\n    const { id, level, pathwayId, url, deliveryDirectives, levelInfo } = data;\n    this.load({\n      id,\n      level,\n      pathwayId,\n      responseType: 'text',\n      type: PlaylistContextType.LEVEL,\n      url,\n      deliveryDirectives,\n      levelOrTrack: levelInfo,\n    });\n  }\n\n  private onAudioTrackLoading(\n    event: Events.AUDIO_TRACK_LOADING,\n    data: TrackLoadingData,\n  ) {\n    const { id, groupId, url, deliveryDirectives, track } = data;\n    this.load({\n      id,\n      groupId,\n      level: null,\n      responseType: 'text',\n      type: PlaylistContextType.AUDIO_TRACK,\n      url,\n      deliveryDirectives,\n      levelOrTrack: track,\n    });\n  }\n\n  private onSubtitleTrackLoading(\n    event: Events.SUBTITLE_TRACK_LOADING,\n    data: TrackLoadingData,\n  ) {\n    const { id, groupId, url, deliveryDirectives, track } = data;\n    this.load({\n      id,\n      groupId,\n      level: null,\n      responseType: 'text',\n      type: PlaylistContextType.SUBTITLE_TRACK,\n      url,\n      deliveryDirectives,\n      levelOrTrack: track,\n    });\n  }\n\n  private onLevelsUpdated(\n    event: Events.LEVELS_UPDATED,\n    data: LevelsUpdatedData,\n  ) {\n    // abort and delete loader of removed levels\n    const loader = this.loaders[PlaylistContextType.LEVEL];\n    if (loader) {\n      const context = loader.context;\n      if (\n        context &&\n        !data.levels.some(\n          (lvl) => lvl === (context as PlaylistLoaderContext).levelOrTrack,\n        )\n      ) {\n        loader.abort();\n        delete this.loaders[PlaylistContextType.LEVEL];\n      }\n    }\n  }\n\n  private load(context: PlaylistLoaderContext): void {\n    const config = this.hls.config;\n\n    // logger.debug(`[playlist-loader]: Loading playlist of type ${context.type}, level: ${context.level}, id: ${context.id}`);\n\n    // Check if a loader for this context already exists\n    let loader = this.getInternalLoader(context);\n    if (loader) {\n      const logger = this.hls.logger;\n      const loaderContext = loader.context as PlaylistLoaderContext;\n      if (\n        loaderContext &&\n        loaderContext.levelOrTrack === context.levelOrTrack &&\n        (loaderContext.url === context.url ||\n          (loaderContext.deliveryDirectives && !context.deliveryDirectives))\n      ) {\n        // same URL can't overlap, or wait for blocking request\n        if (loaderContext.url === context.url) {\n          logger.log(\n            `[playlist-loader]: ignore ${context.url} ongoing request`,\n          );\n        } else {\n          logger.log(\n            `[playlist-loader]: ignore ${context.url} in favor of ${loaderContext.url}`,\n          );\n        }\n        return;\n      }\n      logger.log(\n        `[playlist-loader]: aborting previous loader for type: ${context.type}`,\n      );\n      loader.abort();\n    }\n\n    // apply different configs for retries depending on\n    // context (manifest, level, audio/subs playlist)\n    let loadPolicy: LoaderConfig;\n    if (context.type === PlaylistContextType.MANIFEST) {\n      loadPolicy = config.manifestLoadPolicy.default;\n    } else {\n      loadPolicy = Object.assign({}, config.playlistLoadPolicy.default, {\n        timeoutRetry: null,\n        errorRetry: null,\n      });\n    }\n    loader = this.createInternalLoader(context);\n\n    // Override level/track timeout for LL-HLS requests\n    // (the default of 10000ms is counter productive to blocking playlist reload requests)\n    if (Number.isFinite(context.deliveryDirectives?.part)) {\n      let levelDetails: LevelDetails | undefined;\n      if (\n        context.type === PlaylistContextType.LEVEL &&\n        context.level !== null\n      ) {\n        levelDetails = this.hls.levels[context.level].details;\n      } else if (\n        context.type === PlaylistContextType.AUDIO_TRACK &&\n        context.id !== null\n      ) {\n        levelDetails = this.hls.audioTracks[context.id].details;\n      } else if (\n        context.type === PlaylistContextType.SUBTITLE_TRACK &&\n        context.id !== null\n      ) {\n        levelDetails = this.hls.subtitleTracks[context.id].details;\n      }\n      if (levelDetails) {\n        const partTarget = levelDetails.partTarget;\n        const targetDuration = levelDetails.targetduration;\n        if (partTarget && targetDuration) {\n          const maxLowLatencyPlaylistRefresh =\n            Math.max(partTarget * 3, targetDuration * 0.8) * 1000;\n          loadPolicy = Object.assign({}, loadPolicy, {\n            maxTimeToFirstByteMs: Math.min(\n              maxLowLatencyPlaylistRefresh,\n              loadPolicy.maxTimeToFirstByteMs,\n            ),\n            maxLoadTimeMs: Math.min(\n              maxLowLatencyPlaylistRefresh,\n              loadPolicy.maxTimeToFirstByteMs,\n            ),\n          });\n        }\n      }\n    }\n\n    const legacyRetryCompatibility: RetryConfig | Record<string, void> =\n      loadPolicy.errorRetry || loadPolicy.timeoutRetry || {};\n    const loaderConfig: LoaderConfiguration = {\n      loadPolicy,\n      timeout: loadPolicy.maxLoadTimeMs,\n      maxRetry: legacyRetryCompatibility.maxNumRetry || 0,\n      retryDelay: legacyRetryCompatibility.retryDelayMs || 0,\n      maxRetryDelay: legacyRetryCompatibility.maxRetryDelayMs || 0,\n    };\n\n    const loaderCallbacks: LoaderCallbacks<PlaylistLoaderContext> = {\n      onSuccess: (response, stats, context, networkDetails) => {\n        const loader = this.getInternalLoader(context) as\n          | Loader<PlaylistLoaderContext>\n          | undefined;\n        this.resetInternalLoader(context.type);\n\n        const string = response.data as string;\n\n        stats.parsing.start = performance.now();\n        if (\n          M3U8Parser.isMediaPlaylist(string) ||\n          context.type !== PlaylistContextType.MANIFEST\n        ) {\n          this.handleTrackOrLevelPlaylist(\n            response,\n            stats,\n            context,\n            networkDetails || null,\n            loader,\n          );\n        } else {\n          this.handleMasterPlaylist(response, stats, context, networkDetails);\n        }\n      },\n      onError: (response, context, networkDetails, stats) => {\n        this.handleNetworkError(\n          context,\n          networkDetails,\n          false,\n          response,\n          stats,\n        );\n      },\n      onTimeout: (stats, context, networkDetails) => {\n        this.handleNetworkError(\n          context,\n          networkDetails,\n          true,\n          undefined,\n          stats,\n        );\n      },\n    };\n\n    // logger.debug(`[playlist-loader]: Calling internal loader delegate for URL: ${context.url}`);\n\n    loader.load(context, loaderConfig, loaderCallbacks);\n  }\n\n  private checkAutostartLoad() {\n    if (!this.hls) {\n      return;\n    }\n    const {\n      config: { autoStartLoad, startPosition },\n      forceStartLoad,\n    } = this.hls;\n    if (autoStartLoad || forceStartLoad) {\n      this.hls.logger.log(\n        `${autoStartLoad ? 'auto' : 'force'} startLoad with configured startPosition ${startPosition}`,\n      );\n      this.hls.startLoad(startPosition);\n    }\n  }\n\n  private handleMasterPlaylist(\n    response: LoaderResponse,\n    stats: LoaderStats,\n    context: PlaylistLoaderContext,\n    networkDetails: any,\n  ): void {\n    const hls = this.hls;\n    const string = response.data as string;\n\n    const url = getResponseUrl(response, context);\n\n    const parsedResult = M3U8Parser.parseMasterPlaylist(string, url);\n\n    if (parsedResult.playlistParsingError) {\n      stats.parsing.end = performance.now();\n      this.handleManifestParsingError(\n        response,\n        context,\n        parsedResult.playlistParsingError,\n        networkDetails,\n        stats,\n      );\n      return;\n    }\n\n    const {\n      contentSteering,\n      levels,\n      sessionData,\n      sessionKeys,\n      startTimeOffset,\n      variableList,\n    } = parsedResult;\n\n    this.variableList = variableList;\n\n    // Treat unknown codec as audio or video codec based on passing `isTypeSupported` check\n    // (allows for playback of any supported codec even if not indexed in utils/codecs)\n    levels.forEach((levelParsed: LevelParsed) => {\n      const { unknownCodecs } = levelParsed;\n      if (unknownCodecs) {\n        const { preferManagedMediaSource } = this.hls.config;\n        let { audioCodec, videoCodec } = levelParsed;\n        for (let i = unknownCodecs.length; i--; ) {\n          const unknownCodec = unknownCodecs[i];\n          if (\n            areCodecsMediaSourceSupported(\n              unknownCodec,\n              'audio',\n              preferManagedMediaSource,\n            )\n          ) {\n            levelParsed.audioCodec = audioCodec = audioCodec\n              ? `${audioCodec},${unknownCodec}`\n              : unknownCodec;\n            sampleEntryCodesISO.audio[audioCodec.substring(0, 4)] = 2;\n            unknownCodecs.splice(i, 1);\n          } else if (\n            areCodecsMediaSourceSupported(\n              unknownCodec,\n              'video',\n              preferManagedMediaSource,\n            )\n          ) {\n            levelParsed.videoCodec = videoCodec = videoCodec\n              ? `${videoCodec},${unknownCodec}`\n              : unknownCodec;\n            sampleEntryCodesISO.video[videoCodec.substring(0, 4)] = 2;\n            unknownCodecs.splice(i, 1);\n          }\n        }\n      }\n    });\n\n    const {\n      AUDIO: audioTracks = [],\n      SUBTITLES: subtitles,\n      'CLOSED-CAPTIONS': captions,\n    } = M3U8Parser.parseMasterPlaylistMedia(string, url, parsedResult);\n\n    if (audioTracks.length) {\n      // check if we have found an audio track embedded in main playlist (audio track without URI attribute)\n      const embeddedAudioFound: boolean = audioTracks.some(\n        (audioTrack) => !audioTrack.url,\n      );\n\n      // if no embedded audio track defined, but audio codec signaled in quality level,\n      // we need to signal this main audio track this could happen with playlists with\n      // alt audio rendition in which quality levels (main)\n      // contains both audio+video. but with mixed audio track not signaled\n      if (\n        !embeddedAudioFound &&\n        levels[0].audioCodec &&\n        !levels[0].attrs.AUDIO\n      ) {\n        this.hls.logger.log(\n          '[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one',\n        );\n        audioTracks.unshift({\n          type: 'main',\n          name: 'main',\n          groupId: 'main',\n          default: false,\n          autoselect: false,\n          forced: false,\n          id: -1,\n          attrs: new AttrList({}) as MediaAttributes,\n          bitrate: 0,\n          url: '',\n        });\n      }\n    }\n\n    hls.trigger(Events.MANIFEST_LOADED, {\n      levels,\n      audioTracks,\n      subtitles,\n      captions,\n      contentSteering,\n      url,\n      stats,\n      networkDetails,\n      sessionData,\n      sessionKeys,\n      startTimeOffset,\n      variableList,\n    });\n  }\n\n  private handleTrackOrLevelPlaylist(\n    response: LoaderResponse,\n    stats: LoaderStats,\n    context: PlaylistLoaderContext,\n    networkDetails: any,\n    loader: Loader<PlaylistLoaderContext> | undefined,\n  ): void {\n    const hls = this.hls;\n    const { id, level, type } = context;\n\n    const url = getResponseUrl(response, context);\n    const levelId = Number.isFinite(level as number)\n      ? (level as number)\n      : Number.isFinite(id as number)\n        ? (id as number)\n        : 0;\n    const levelType = mapContextToLevelType(context);\n    const levelDetails = M3U8Parser.parseLevelPlaylist(\n      response.data as string,\n      url,\n      levelId,\n      levelType,\n      0,\n      this.variableList,\n    );\n\n    // We have done our first request (Manifest-type) and receive\n    // not a master playlist but a chunk-list (track/level)\n    // We fire the manifest-loaded event anyway with the parsed level-details\n    // by creating a single-level structure for it.\n    if (type === PlaylistContextType.MANIFEST) {\n      const singleLevel: LevelParsed = {\n        attrs: new AttrList({}),\n        bitrate: 0,\n        details: levelDetails,\n        name: '',\n        url,\n      };\n      levelDetails.requestScheduled =\n        stats.loading.start + computeReloadInterval(levelDetails, 0);\n\n      hls.trigger(Events.MANIFEST_LOADED, {\n        levels: [singleLevel],\n        audioTracks: [],\n        url,\n        stats,\n        networkDetails,\n        sessionData: null,\n        sessionKeys: null,\n        contentSteering: null,\n        startTimeOffset: null,\n        variableList: null,\n      });\n    }\n\n    // save parsing time\n    stats.parsing.end = performance.now();\n\n    // extend the context with the new levelDetails property\n    context.levelDetails = levelDetails;\n\n    this.handlePlaylistLoaded(\n      levelDetails,\n      response,\n      stats,\n      context,\n      networkDetails,\n      loader,\n    );\n  }\n\n  private handleManifestParsingError(\n    response: LoaderResponse,\n    context: PlaylistLoaderContext,\n    error: Error,\n    networkDetails: any,\n    stats: LoaderStats,\n  ): void {\n    this.hls.trigger(Events.ERROR, {\n      type: ErrorTypes.NETWORK_ERROR,\n      details: ErrorDetails.MANIFEST_PARSING_ERROR,\n      fatal: context.type === PlaylistContextType.MANIFEST,\n      url: response.url,\n      err: error,\n      error,\n      reason: error.message,\n      response,\n      context,\n      networkDetails,\n      stats,\n    });\n  }\n\n  private handleNetworkError(\n    context: PlaylistLoaderContext,\n    networkDetails: any,\n    timeout = false,\n    response: { code: number; text: string } | undefined,\n    stats: LoaderStats,\n  ): void {\n    let message = `A network ${\n      timeout\n        ? 'timeout'\n        : 'error' + (response ? ' (status ' + response.code + ')' : '')\n    } occurred while loading ${context.type}`;\n    if (context.type === PlaylistContextType.LEVEL) {\n      message += `: ${context.level} id: ${context.id}`;\n    } else if (\n      context.type === PlaylistContextType.AUDIO_TRACK ||\n      context.type === PlaylistContextType.SUBTITLE_TRACK\n    ) {\n      message += ` id: ${context.id} group-id: \"${context.groupId}\"`;\n    }\n    const error = new Error(message);\n    this.hls.logger.warn(`[playlist-loader]: ${message}`);\n    let details = ErrorDetails.UNKNOWN;\n    let fatal = false;\n\n    const loader = this.getInternalLoader(context);\n\n    switch (context.type) {\n      case PlaylistContextType.MANIFEST:\n        details = timeout\n          ? ErrorDetails.MANIFEST_LOAD_TIMEOUT\n          : ErrorDetails.MANIFEST_LOAD_ERROR;\n        fatal = true;\n        break;\n      case PlaylistContextType.LEVEL:\n        details = timeout\n          ? ErrorDetails.LEVEL_LOAD_TIMEOUT\n          : ErrorDetails.LEVEL_LOAD_ERROR;\n        fatal = false;\n        break;\n      case PlaylistContextType.AUDIO_TRACK:\n        details = timeout\n          ? ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT\n          : ErrorDetails.AUDIO_TRACK_LOAD_ERROR;\n        fatal = false;\n        break;\n      case PlaylistContextType.SUBTITLE_TRACK:\n        details = timeout\n          ? ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT\n          : ErrorDetails.SUBTITLE_LOAD_ERROR;\n        fatal = false;\n        break;\n    }\n\n    if (loader) {\n      this.resetInternalLoader(context.type);\n    }\n\n    const errorData: ErrorData = {\n      type: ErrorTypes.NETWORK_ERROR,\n      details,\n      fatal,\n      url: context.url,\n      loader,\n      context,\n      error,\n      networkDetails,\n      stats,\n    };\n\n    if (response) {\n      const url = networkDetails?.url || context.url;\n      errorData.response = { url, data: undefined as any, ...response };\n    }\n\n    this.hls.trigger(Events.ERROR, errorData);\n  }\n\n  private handlePlaylistLoaded(\n    levelDetails: LevelDetails,\n    response: LoaderResponse,\n    stats: LoaderStats,\n    context: PlaylistLoaderContext,\n    networkDetails: any,\n    loader: Loader<PlaylistLoaderContext> | undefined,\n  ): void {\n    const hls = this.hls;\n    const { type, level, levelOrTrack, id, groupId, deliveryDirectives } =\n      context;\n    const url = getResponseUrl(response, context);\n    const parent = mapContextToLevelType(context);\n    let levelIndex =\n      typeof context.level === 'number' && parent === PlaylistLevelType.MAIN\n        ? (level as number)\n        : undefined;\n    const error = levelDetails.playlistParsingError;\n    if (error) {\n      this.hls.logger.warn(`${error} ${levelDetails.url}`);\n      if (!hls.config.ignorePlaylistParsingErrors) {\n        hls.trigger(Events.ERROR, {\n          type: ErrorTypes.NETWORK_ERROR,\n          details: ErrorDetails.LEVEL_PARSING_ERROR,\n          fatal: false,\n          url,\n          error,\n          reason: error.message,\n          response,\n          context,\n          level: levelIndex,\n          parent,\n          networkDetails,\n          stats,\n        });\n        return;\n      }\n      levelDetails.playlistParsingError = null;\n    }\n    if (!levelDetails.fragments.length) {\n      const error = (levelDetails.playlistParsingError = new Error(\n        'No Segments found in Playlist',\n      ));\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.NETWORK_ERROR,\n        details: ErrorDetails.LEVEL_EMPTY_ERROR,\n        fatal: false,\n        url,\n        error,\n        reason: error.message,\n        response,\n        context,\n        level: levelIndex,\n        parent,\n        networkDetails,\n        stats,\n      });\n      return;\n    }\n\n    if (levelDetails.live && loader) {\n      if (loader.getCacheAge) {\n        levelDetails.ageHeader = loader.getCacheAge() || 0;\n      }\n      if (!loader.getCacheAge || isNaN(levelDetails.ageHeader)) {\n        levelDetails.ageHeader = 0;\n      }\n    }\n\n    switch (type) {\n      case PlaylistContextType.MANIFEST:\n      case PlaylistContextType.LEVEL:\n        if (levelIndex) {\n          if (!levelOrTrack) {\n            // fall-through to hls.levels[0]\n            levelIndex = 0;\n          } else {\n            if (levelOrTrack !== hls.levels[levelIndex]) {\n              // correct levelIndex when lower levels were removed from hls.levels\n              const updatedIndex = hls.levels.indexOf(levelOrTrack as Level);\n              if (updatedIndex > -1) {\n                levelIndex = updatedIndex;\n              }\n            }\n          }\n        }\n        hls.trigger(Events.LEVEL_LOADED, {\n          details: levelDetails,\n          levelInfo: (levelOrTrack as Level | null) || hls.levels[0],\n          level: levelIndex || 0,\n          id: id || 0,\n          stats,\n          networkDetails,\n          deliveryDirectives,\n          withoutMultiVariant: type === PlaylistContextType.MANIFEST,\n        });\n        break;\n      case PlaylistContextType.AUDIO_TRACK:\n        hls.trigger(Events.AUDIO_TRACK_LOADED, {\n          details: levelDetails,\n          track: levelOrTrack as MediaPlaylist,\n          id: id || 0,\n          groupId: groupId || '',\n          stats,\n          networkDetails,\n          deliveryDirectives,\n        });\n        break;\n      case PlaylistContextType.SUBTITLE_TRACK:\n        hls.trigger(Events.SUBTITLE_TRACK_LOADED, {\n          details: levelDetails,\n          track: levelOrTrack as MediaPlaylist,\n          id: id || 0,\n          groupId: groupId || '',\n          stats,\n          networkDetails,\n          deliveryDirectives,\n        });\n        break;\n    }\n  }\n}\n\nexport default PlaylistLoader;\n", "import { uuid } from '@svta/common-media-library/utils/uuid';\nimport { EventEmitter } from 'eventemitter3';\nimport { buildAbsoluteURL } from 'url-toolkit';\nimport { enableStreamingMode, hlsDefaultConfig, mergeConfig } from './config';\nimport { FragmentTracker } from './controller/fragment-tracker';\nimport GapController from './controller/gap-controller';\nimport ID3TrackController from './controller/id3-track-controller';\nimport LatencyController from './controller/latency-controller';\nimport LevelController from './controller/level-controller';\nimport StreamController from './controller/stream-controller';\nimport { ErrorDetails, ErrorTypes } from './errors';\nimport { Events } from './events';\nimport { isMSESupported, isSupported } from './is-supported';\nimport KeyLoader from './loader/key-loader';\nimport PlaylistLoader from './loader/playlist-loader';\nimport { MetadataSchema } from './types/demuxer';\nimport { type HdcpLevel, isHdcpLevel, type Level } from './types/level';\nimport { PlaylistLevelType } from './types/loader';\nimport { enableLogs, type ILogger } from './utils/logger';\nimport { getMediaDecodingInfoPromise } from './utils/mediacapabilities-helper';\nimport { getMediaSource } from './utils/mediasource-helper';\nimport { getAudioTracksByGroup } from './utils/rendition-helper';\nimport { version } from './version';\nimport type { HlsConfig } from './config';\nimport type AbrController from './controller/abr-controller';\nimport type AudioStreamController from './controller/audio-stream-controller';\nimport type AudioTrackController from './controller/audio-track-controller';\nimport type BasePlaylistController from './controller/base-playlist-controller';\nimport type { InFlightData, State } from './controller/base-stream-controller';\nimport type BaseStreamController from './controller/base-stream-controller';\nimport type BufferController from './controller/buffer-controller';\nimport type CapLevelController from './controller/cap-level-controller';\nimport type CMCDController from './controller/cmcd-controller';\nimport type ContentSteeringController from './controller/content-steering-controller';\nimport type EMEController from './controller/eme-controller';\nimport type ErrorController from './controller/error-controller';\nimport type FPSController from './controller/fps-controller';\nimport type InterstitialsController from './controller/interstitials-controller';\nimport type { InterstitialsManager } from './controller/interstitials-controller';\nimport type { SubtitleStreamController } from './controller/subtitle-stream-controller';\nimport type SubtitleTrackController from './controller/subtitle-track-controller';\nimport type Decrypter from './crypt/decrypter';\nimport type TransmuxerInterface from './demux/transmuxer-interface';\nimport type { HlsEventEmitter, HlsListeners } from './events';\nimport type FragmentLoader from './loader/fragment-loader';\nimport type { LevelDetails } from './loader/level-details';\nimport type M3U8Parser from './loader/m3u8-parser';\nimport type TaskLoop from './task-loop';\nimport type { AttachMediaSourceData } from './types/buffer';\nimport type {\n  AbrComponentAPI,\n  ComponentAPI,\n  NetworkComponentAPI,\n} from './types/component-api';\nimport type { MediaAttachingData } from './types/events';\nimport type {\n  AudioSelectionOption,\n  MediaPlaylist,\n  SubtitleSelectionOption,\n  VideoSelectionOption,\n} from './types/media-playlist';\nimport type { BufferInfo, BufferTimeRange } from './utils/buffer-helper';\nimport type Cues from './utils/cues';\nimport type EwmaBandWidthEstimator from './utils/ewma-bandwidth-estimator';\nimport type FetchLoader from './utils/fetch-loader';\nimport type { MediaDecodingInfo } from './utils/mediacapabilities-helper';\nimport type XhrLoader from './utils/xhr-loader';\n\n/**\n * The `Hls` class is the core of the HLS.js library used to instantiate player instances.\n * @public\n */\nexport default class Hls implements HlsEventEmitter {\n  private static defaultConfig: HlsConfig | undefined;\n\n  /**\n   * The runtime configuration used by the player. At instantiation this is combination of `hls.userConfig` merged over `Hls.DefaultConfig`.\n   */\n  public readonly config: HlsConfig;\n\n  /**\n   * The configuration object provided on player instantiation.\n   */\n  public readonly userConfig: Partial<HlsConfig>;\n\n  /**\n   * The logger functions used by this player instance, configured on player instantiation.\n   */\n  public readonly logger: ILogger;\n\n  private coreComponents: ComponentAPI[];\n  private networkControllers: NetworkComponentAPI[];\n  private _emitter: HlsEventEmitter = new EventEmitter();\n  private _autoLevelCapping: number = -1;\n  private _maxHdcpLevel: HdcpLevel = null;\n  private abrController: AbrComponentAPI;\n  private bufferController: BufferController;\n  private capLevelController: CapLevelController;\n  private latencyController: LatencyController;\n  private levelController: LevelController;\n  private streamController: StreamController;\n  private audioStreamController?: AudioStreamController;\n  private subtititleStreamController?: SubtitleStreamController;\n  private audioTrackController?: AudioTrackController;\n  private subtitleTrackController?: SubtitleTrackController;\n  private interstitialsController?: InterstitialsController;\n  private gapController: GapController;\n  private emeController?: EMEController;\n  private cmcdController?: CMCDController;\n  private _media: HTMLMediaElement | null = null;\n  private _url: string | null = null;\n  private _sessionId?: string;\n  private triggeringException?: boolean;\n  private started: boolean = false;\n\n  /**\n   * Get the video-dev/hls.js package version.\n   */\n  static get version(): string {\n    return version;\n  }\n\n  /**\n   * Check if the required MediaSource Extensions are available.\n   */\n  static isMSESupported(): boolean {\n    return isMSESupported();\n  }\n\n  /**\n   * Check if MediaSource Extensions are available and isTypeSupported checks pass for any baseline codecs.\n   */\n  static isSupported(): boolean {\n    return isSupported();\n  }\n\n  /**\n   * Get the MediaSource global used for MSE playback (ManagedMediaSource, MediaSource, or WebKitMediaSource).\n   */\n  static getMediaSource(): typeof MediaSource | undefined {\n    return getMediaSource();\n  }\n\n  static get Events(): typeof Events {\n    return Events;\n  }\n\n  static get MetadataSchema(): typeof MetadataSchema {\n    return MetadataSchema;\n  }\n\n  static get ErrorTypes(): typeof ErrorTypes {\n    return ErrorTypes;\n  }\n\n  static get ErrorDetails(): typeof ErrorDetails {\n    return ErrorDetails;\n  }\n\n  /**\n   * Get the default configuration applied to new instances.\n   */\n  static get DefaultConfig(): HlsConfig {\n    if (!Hls.defaultConfig) {\n      return hlsDefaultConfig;\n    }\n\n    return Hls.defaultConfig;\n  }\n\n  /**\n   * Replace the default configuration applied to new instances.\n   */\n  static set DefaultConfig(defaultConfig: HlsConfig) {\n    Hls.defaultConfig = defaultConfig;\n  }\n\n  /**\n   * Creates an instance of an HLS client that can attach to exactly one `HTMLMediaElement`.\n   * @param userConfig - Configuration options applied over `Hls.DefaultConfig`\n   */\n  constructor(userConfig: Partial<HlsConfig> = {}) {\n    const logger = (this.logger = enableLogs(\n      userConfig.debug || false,\n      'Hls instance',\n      userConfig.assetPlayerId,\n    ));\n    const config = (this.config = mergeConfig(\n      Hls.DefaultConfig,\n      userConfig,\n      logger,\n    ));\n    this.userConfig = userConfig;\n\n    if (config.progressive) {\n      enableStreamingMode(config, logger);\n    }\n\n    // core controllers and network loaders\n    const {\n      abrController: _AbrController,\n      bufferController: _BufferController,\n      capLevelController: _CapLevelController,\n      errorController: _ErrorController,\n      fpsController: _FpsController,\n    } = config;\n    const errorController = new _ErrorController(this);\n    const abrController = (this.abrController = new _AbrController(this));\n    // FragmentTracker must be defined before StreamController because the order of event handling is important\n    const fragmentTracker = new FragmentTracker(this);\n    const _InterstitialsController = config.interstitialsController;\n    const interstitialsController = _InterstitialsController\n      ? (this.interstitialsController = new _InterstitialsController(this, Hls))\n      : null;\n    const bufferController = (this.bufferController = new _BufferController(\n      this,\n      fragmentTracker,\n    ));\n    const capLevelController = (this.capLevelController =\n      new _CapLevelController(this));\n\n    const fpsController = new _FpsController(this);\n    const playListLoader = new PlaylistLoader(this);\n\n    const _ContentSteeringController = config.contentSteeringController;\n    // Instantiate ConentSteeringController before LevelController to receive Multivariant Playlist events first\n    const contentSteering = _ContentSteeringController\n      ? new _ContentSteeringController(this)\n      : null;\n    const levelController = (this.levelController = new LevelController(\n      this,\n      contentSteering,\n    ));\n\n    const id3TrackController = new ID3TrackController(this);\n    const keyLoader = new KeyLoader(this.config, this.logger);\n    const streamController = (this.streamController = new StreamController(\n      this,\n      fragmentTracker,\n      keyLoader,\n    ));\n\n    const gapController = (this.gapController = new GapController(\n      this,\n      fragmentTracker,\n    ));\n\n    // Cap level controller uses streamController to flush the buffer\n    capLevelController.setStreamController(streamController);\n    // fpsController uses streamController to switch when frames are being dropped\n    fpsController.setStreamController(streamController);\n\n    const networkControllers: NetworkComponentAPI[] = [\n      playListLoader,\n      levelController,\n      streamController,\n    ];\n    if (interstitialsController) {\n      networkControllers.splice(1, 0, interstitialsController);\n    }\n    if (contentSteering) {\n      networkControllers.splice(1, 0, contentSteering);\n    }\n\n    this.networkControllers = networkControllers;\n    const coreComponents: ComponentAPI[] = [\n      abrController,\n      bufferController,\n      gapController,\n      capLevelController,\n      fpsController,\n      id3TrackController,\n      fragmentTracker,\n    ];\n\n    this.audioTrackController = this.createController(\n      config.audioTrackController,\n      networkControllers,\n    );\n    const AudioStreamControllerClass = config.audioStreamController;\n    if (AudioStreamControllerClass) {\n      networkControllers.push(\n        (this.audioStreamController = new AudioStreamControllerClass(\n          this,\n          fragmentTracker,\n          keyLoader,\n        )),\n      );\n    }\n    // Instantiate subtitleTrackController before SubtitleStreamController to receive level events first\n    this.subtitleTrackController = this.createController(\n      config.subtitleTrackController,\n      networkControllers,\n    );\n    const SubtitleStreamControllerClass = config.subtitleStreamController;\n    if (SubtitleStreamControllerClass) {\n      networkControllers.push(\n        (this.subtititleStreamController = new SubtitleStreamControllerClass(\n          this,\n          fragmentTracker,\n          keyLoader,\n        )),\n      );\n    }\n    this.createController(config.timelineController, coreComponents);\n    keyLoader.emeController = this.emeController = this.createController(\n      config.emeController,\n      coreComponents,\n    );\n    this.cmcdController = this.createController(\n      config.cmcdController,\n      coreComponents,\n    );\n    this.latencyController = this.createController(\n      LatencyController,\n      coreComponents,\n    );\n\n    this.coreComponents = coreComponents;\n\n    // Error controller handles errors before and after all other controllers\n    // This listener will be invoked after all other controllers error listeners\n    networkControllers.push(errorController);\n    const onErrorOut = errorController.onErrorOut;\n    if (typeof onErrorOut === 'function') {\n      this.on(Events.ERROR, onErrorOut, errorController);\n    }\n    // Autostart load handler\n    this.on(\n      Events.MANIFEST_LOADED,\n      playListLoader.onManifestLoaded,\n      playListLoader,\n    );\n  }\n\n  createController(ControllerClass, components) {\n    if (ControllerClass) {\n      const controllerInstance = new ControllerClass(this);\n      if (components) {\n        components.push(controllerInstance);\n      }\n      return controllerInstance;\n    }\n    return null;\n  }\n\n  // Delegate the EventEmitter through the public API of Hls.js\n  on<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context: Context = this as any,\n  ) {\n    this._emitter.on(event, listener, context);\n  }\n\n  once<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener: HlsListeners[E],\n    context: Context = this as any,\n  ) {\n    this._emitter.once(event, listener, context);\n  }\n\n  removeAllListeners<E extends keyof HlsListeners>(event?: E | undefined) {\n    this._emitter.removeAllListeners(event);\n  }\n\n  off<E extends keyof HlsListeners, Context = undefined>(\n    event: E,\n    listener?: HlsListeners[E] | undefined,\n    context: Context = this as any,\n    once?: boolean | undefined,\n  ) {\n    this._emitter.off(event, listener, context, once);\n  }\n\n  listeners<E extends keyof HlsListeners>(event: E): HlsListeners[E][] {\n    return this._emitter.listeners(event);\n  }\n\n  emit<E extends keyof HlsListeners>(\n    event: E,\n    name: E,\n    eventObject: Parameters<HlsListeners[E]>[1],\n  ): boolean {\n    return this._emitter.emit(event, name, eventObject);\n  }\n\n  trigger<E extends keyof HlsListeners>(\n    event: E,\n    eventObject: Parameters<HlsListeners[E]>[1],\n  ): boolean {\n    if (this.config.debug) {\n      return this.emit(event, event, eventObject);\n    } else {\n      try {\n        return this.emit(event, event, eventObject);\n      } catch (error) {\n        this.logger.error(\n          'An internal error happened while handling event ' +\n            event +\n            '. Error message: \"' +\n            error.message +\n            '\". Here is a stacktrace:',\n          error,\n        );\n        // Prevent recursion in error event handlers that throw #5497\n        if (!this.triggeringException) {\n          this.triggeringException = true;\n          const fatal = event === Events.ERROR;\n          this.trigger(Events.ERROR, {\n            type: ErrorTypes.OTHER_ERROR,\n            details: ErrorDetails.INTERNAL_EXCEPTION,\n            fatal,\n            event,\n            error,\n          });\n          this.triggeringException = false;\n        }\n      }\n    }\n    return false;\n  }\n\n  listenerCount<E extends keyof HlsListeners>(event: E): number {\n    return this._emitter.listenerCount(event);\n  }\n\n  /**\n   * Dispose of the instance\n   */\n  destroy() {\n    this.logger.log('destroy');\n    this.trigger(Events.DESTROYING, undefined);\n    this.detachMedia();\n    this.removeAllListeners();\n    this._autoLevelCapping = -1;\n    this._url = null;\n\n    this.networkControllers.forEach((component) => component.destroy());\n    this.networkControllers.length = 0;\n\n    this.coreComponents.forEach((component) => component.destroy());\n    this.coreComponents.length = 0;\n    // Remove any references that could be held in config options or callbacks\n    const config = this.config;\n    config.xhrSetup = config.fetchSetup = undefined;\n    // @ts-ignore\n    this.userConfig = null;\n  }\n\n  /**\n   * Attaches Hls.js to a media element\n   */\n  attachMedia(data: HTMLMediaElement | MediaAttachingData) {\n    if (!data || ('media' in data && !data.media)) {\n      const error = new Error(`attachMedia failed: invalid argument (${data})`);\n      this.trigger(Events.ERROR, {\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.ATTACH_MEDIA_ERROR,\n        fatal: true,\n        error,\n      });\n      return;\n    }\n    this.logger.log(`attachMedia`);\n    if (this._media) {\n      this.logger.warn(`media must be detached before attaching`);\n      this.detachMedia();\n    }\n    const attachMediaSource = 'media' in data;\n    const media = attachMediaSource ? data.media : data;\n    const attachingData = attachMediaSource ? data : { media };\n    this._media = media;\n    this.trigger(Events.MEDIA_ATTACHING, attachingData);\n  }\n\n  /**\n   * Detach Hls.js from the media\n   */\n  detachMedia() {\n    this.logger.log('detachMedia');\n    this.trigger(Events.MEDIA_DETACHING, {});\n    this._media = null;\n  }\n\n  /**\n   * Detach HTMLMediaElement, MediaSource, and SourceBuffers without reset, for attaching to another instance\n   */\n  transferMedia(): AttachMediaSourceData | null {\n    this._media = null;\n    const transferMedia = this.bufferController.transferMedia();\n    this.trigger(Events.MEDIA_DETACHING, { transferMedia });\n    return transferMedia;\n  }\n\n  /**\n   * Set the source URL. Can be relative or absolute.\n   */\n  loadSource(url: string) {\n    this.stopLoad();\n    const media = this.media;\n    const loadedSource = this._url;\n    const loadingSource = (this._url = buildAbsoluteURL(\n      self.location.href,\n      url,\n      {\n        alwaysNormalize: true,\n      },\n    ));\n    this._autoLevelCapping = -1;\n    this._maxHdcpLevel = null;\n    this.logger.log(`loadSource:${loadingSource}`);\n    if (\n      media &&\n      loadedSource &&\n      (loadedSource !== loadingSource || this.bufferController.hasSourceTypes())\n    ) {\n      // Remove and re-create MediaSource\n      this.detachMedia();\n      this.attachMedia(media);\n    }\n    // when attaching to a source URL, trigger a playlist load\n    this.trigger(Events.MANIFEST_LOADING, { url: url });\n  }\n\n  /**\n   * Gets the currently loaded URL\n   */\n  public get url(): string | null {\n    return this._url;\n  }\n\n  /**\n   * Whether or not enough has been buffered to seek to start position or use `media.currentTime` to determine next load position\n   */\n  get hasEnoughToStart(): boolean {\n    return this.streamController.hasEnoughToStart;\n  }\n\n  /**\n   * Get the startPosition set on startLoad(position) or on autostart with config.startPosition\n   */\n  get startPosition(): number {\n    return this.streamController.startPositionValue;\n  }\n\n  /**\n   * Start loading data from the stream source.\n   * Depending on default config, client starts loading automatically when a source is set.\n   *\n   * @param startPosition - Set the start position to stream from.\n   * Defaults to -1 (None: starts from earliest point)\n   */\n  startLoad(startPosition: number = -1, skipSeekToStartPosition?: boolean) {\n    this.logger.log(\n      `startLoad(${\n        startPosition +\n        (skipSeekToStartPosition ? ', <skip seek to start>' : '')\n      })`,\n    );\n    this.started = true;\n    this.resumeBuffering();\n    for (let i = 0; i < this.networkControllers.length; i++) {\n      this.networkControllers[i].startLoad(\n        startPosition,\n        skipSeekToStartPosition,\n      );\n      if (!this.started || !this.networkControllers) {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Stop loading of any stream data.\n   */\n  stopLoad() {\n    this.logger.log('stopLoad');\n    this.started = false;\n    for (let i = 0; i < this.networkControllers.length; i++) {\n      this.networkControllers[i].stopLoad();\n      if (this.started || !this.networkControllers) {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Returns whether loading, toggled with `startLoad()` and `stopLoad()`, is active or not`.\n   */\n  get loadingEnabled(): boolean {\n    return this.started;\n  }\n\n  /**\n   * Returns state of fragment loading toggled by calling `pauseBuffering()` and `resumeBuffering()`.\n   */\n  get bufferingEnabled(): boolean {\n    return this.streamController.bufferingEnabled;\n  }\n\n  /**\n   * Resumes stream controller segment loading after `pauseBuffering` has been called.\n   */\n  resumeBuffering() {\n    if (!this.bufferingEnabled) {\n      this.logger.log(`resume buffering`);\n      this.networkControllers.forEach((controller) => {\n        if (controller.resumeBuffering) {\n          controller.resumeBuffering();\n        }\n      });\n    }\n  }\n\n  /**\n   * Prevents stream controller from loading new segments until `resumeBuffering` is called.\n   * This allows for media buffering to be paused without interupting playlist loading.\n   */\n  pauseBuffering() {\n    if (this.bufferingEnabled) {\n      this.logger.log(`pause buffering`);\n      this.networkControllers.forEach((controller) => {\n        if (controller.pauseBuffering) {\n          controller.pauseBuffering();\n        }\n      });\n    }\n  }\n\n  get inFlightFragments(): InFlightFragments {\n    const inFlightData = {\n      [PlaylistLevelType.MAIN]: this.streamController.inFlightFrag,\n    };\n    if (this.audioStreamController) {\n      inFlightData[PlaylistLevelType.AUDIO] =\n        this.audioStreamController.inFlightFrag;\n    }\n    if (this.subtititleStreamController) {\n      inFlightData[PlaylistLevelType.SUBTITLE] =\n        this.subtititleStreamController.inFlightFrag;\n    }\n    return inFlightData;\n  }\n\n  /**\n   * Swap through possible audio codecs in the stream (for example to switch from stereo to 5.1)\n   */\n  swapAudioCodec() {\n    this.logger.log('swapAudioCodec');\n    this.streamController.swapAudioCodec();\n  }\n\n  /**\n   * When the media-element fails, this allows to detach and then re-attach it\n   * as one call (convenience method).\n   *\n   * Automatic recovery of media-errors by this process is configurable.\n   */\n  recoverMediaError() {\n    this.logger.log('recoverMediaError');\n    const media = this._media;\n    const time = media?.currentTime;\n    this.detachMedia();\n    if (media) {\n      this.attachMedia(media);\n      if (time) {\n        this.startLoad(time);\n      }\n    }\n  }\n\n  removeLevel(levelIndex: number) {\n    this.levelController.removeLevel(levelIndex);\n  }\n\n  /**\n   * @returns a UUID for this player instance\n   */\n  get sessionId(): string {\n    let _sessionId = this._sessionId;\n    if (!_sessionId) {\n      _sessionId = this._sessionId = uuid();\n    }\n    return _sessionId;\n  }\n\n  /**\n   * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH\n   */\n  get levels(): Level[] {\n    const levels = this.levelController.levels;\n    return levels ? levels : [];\n  }\n\n  /**\n   * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.\n   */\n  get latestLevelDetails(): LevelDetails | null {\n    return this.streamController.getLevelDetails() || null;\n  }\n\n  /**\n   * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.\n   */\n  get loadLevelObj(): Level | null {\n    return this.levelController.loadLevelObj;\n  }\n\n  /**\n   * Index of quality level (variant) currently played\n   */\n  get currentLevel(): number {\n    return this.streamController.currentLevel;\n  }\n\n  /**\n   * Set quality level index immediately. This will flush the current buffer to replace the quality asap. That means playback will interrupt at least shortly to re-buffer and re-sync eventually. Set to -1 for automatic level selection.\n   */\n  set currentLevel(newLevel: number) {\n    this.logger.log(`set currentLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n    this.streamController.immediateLevelSwitch();\n  }\n\n  /**\n   * Index of next quality level loaded as scheduled by stream controller.\n   */\n  get nextLevel(): number {\n    return this.streamController.nextLevel;\n  }\n\n  /**\n   * Set quality level index for next loaded data.\n   * This will switch the video quality asap, without interrupting playback.\n   * May abort current loading of data, and flush parts of buffer (outside currently played fragment region).\n   * @param newLevel - Pass -1 for automatic level selection\n   */\n  set nextLevel(newLevel: number) {\n    this.logger.log(`set nextLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n    this.streamController.nextLevelSwitch();\n  }\n\n  /**\n   * Return the quality level of the currently or last (of none is loaded currently) segment\n   */\n  get loadLevel(): number {\n    return this.levelController.level;\n  }\n\n  /**\n   * Set quality level index for next loaded data in a conservative way.\n   * This will switch the quality without flushing, but interrupt current loading.\n   * Thus the moment when the quality switch will appear in effect will only be after the already existing buffer.\n   * @param newLevel - Pass -1 for automatic level selection\n   */\n  set loadLevel(newLevel: number) {\n    this.logger.log(`set loadLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n  }\n\n  /**\n   * get next quality level loaded\n   */\n  get nextLoadLevel(): number {\n    return this.levelController.nextLoadLevel;\n  }\n\n  /**\n   * Set quality level of next loaded segment in a fully \"non-destructive\" way.\n   * Same as `loadLevel` but will wait for next switch (until current loading is done).\n   */\n  set nextLoadLevel(level: number) {\n    this.levelController.nextLoadLevel = level;\n  }\n\n  /**\n   * Return \"first level\": like a default level, if not set,\n   * falls back to index of first level referenced in manifest\n   */\n  get firstLevel(): number {\n    return Math.max(this.levelController.firstLevel, this.minAutoLevel);\n  }\n\n  /**\n   * Sets \"first-level\", see getter.\n   */\n  set firstLevel(newLevel: number) {\n    this.logger.log(`set firstLevel:${newLevel}`);\n    this.levelController.firstLevel = newLevel;\n  }\n\n  /**\n   * Return the desired start level for the first fragment that will be loaded.\n   * The default value of -1 indicates automatic start level selection.\n   * Setting hls.nextAutoLevel without setting a startLevel will result in\n   * the nextAutoLevel value being used for one fragment load.\n   */\n  get startLevel(): number {\n    const startLevel = this.levelController.startLevel;\n    if (startLevel === -1 && this.abrController.forcedAutoLevel > -1) {\n      return this.abrController.forcedAutoLevel;\n    }\n    return startLevel;\n  }\n\n  /**\n   * set  start level (level of first fragment that will be played back)\n   * if not overrided by user, first level appearing in manifest will be used as start level\n   * if -1 : automatic start level selection, playback will start from level matching download bandwidth\n   * (determined from download of first segment)\n   */\n  set startLevel(newLevel: number) {\n    this.logger.log(`set startLevel:${newLevel}`);\n    // if not in automatic start level detection, ensure startLevel is greater than minAutoLevel\n    if (newLevel !== -1) {\n      newLevel = Math.max(newLevel, this.minAutoLevel);\n    }\n\n    this.levelController.startLevel = newLevel;\n  }\n\n  /**\n   * Whether level capping is enabled.\n   * Default value is set via `config.capLevelToPlayerSize`.\n   */\n  get capLevelToPlayerSize(): boolean {\n    return this.config.capLevelToPlayerSize;\n  }\n\n  /**\n   * Enables or disables level capping. If disabled after previously enabled, `nextLevelSwitch` will be immediately called.\n   */\n  set capLevelToPlayerSize(shouldStartCapping: boolean) {\n    const newCapLevelToPlayerSize = !!shouldStartCapping;\n\n    if (newCapLevelToPlayerSize !== this.config.capLevelToPlayerSize) {\n      if (newCapLevelToPlayerSize) {\n        this.capLevelController.startCapping(); // If capping occurs, nextLevelSwitch will happen based on size.\n      } else {\n        this.capLevelController.stopCapping();\n        this.autoLevelCapping = -1;\n        this.streamController.nextLevelSwitch(); // Now we're uncapped, get the next level asap.\n      }\n\n      this.config.capLevelToPlayerSize = newCapLevelToPlayerSize;\n    }\n  }\n\n  /**\n   * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n   */\n  get autoLevelCapping(): number {\n    return this._autoLevelCapping;\n  }\n\n  /**\n   * Returns the current bandwidth estimate in bits per second, when available. Otherwise, `NaN` is returned.\n   */\n  get bandwidthEstimate(): number {\n    const { bwEstimator } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.getEstimate();\n  }\n\n  set bandwidthEstimate(abrEwmaDefaultEstimate: number) {\n    this.abrController.resetEstimator(abrEwmaDefaultEstimate);\n  }\n\n  get abrEwmaDefaultEstimate(): number {\n    const { bwEstimator } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.defaultEstimate;\n  }\n\n  /**\n   * get time to first byte estimate\n   * @type {number}\n   */\n  get ttfbEstimate(): number {\n    const { bwEstimator } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.getEstimateTTFB();\n  }\n\n  /**\n   * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n   */\n  set autoLevelCapping(newLevel: number) {\n    if (this._autoLevelCapping !== newLevel) {\n      this.logger.log(`set autoLevelCapping:${newLevel}`);\n      this._autoLevelCapping = newLevel;\n      this.levelController.checkMaxAutoUpdated();\n    }\n  }\n\n  get maxHdcpLevel(): HdcpLevel {\n    return this._maxHdcpLevel;\n  }\n\n  set maxHdcpLevel(value: HdcpLevel) {\n    if (isHdcpLevel(value) && this._maxHdcpLevel !== value) {\n      this._maxHdcpLevel = value;\n      this.levelController.checkMaxAutoUpdated();\n    }\n  }\n\n  /**\n   * True when automatic level selection enabled\n   */\n  get autoLevelEnabled(): boolean {\n    return this.levelController.manualLevel === -1;\n  }\n\n  /**\n   * Level set manually (if any)\n   */\n  get manualLevel(): number {\n    return this.levelController.manualLevel;\n  }\n\n  /**\n   * min level selectable in auto mode according to config.minAutoBitrate\n   */\n  get minAutoLevel(): number {\n    const {\n      levels,\n      config: { minAutoBitrate },\n    } = this;\n    if (!levels) return 0;\n\n    const len = levels.length;\n    for (let i = 0; i < len; i++) {\n      if (levels[i].maxBitrate >= minAutoBitrate) {\n        return i;\n      }\n    }\n\n    return 0;\n  }\n\n  /**\n   * max level selectable in auto mode according to autoLevelCapping\n   */\n  get maxAutoLevel(): number {\n    const { levels, autoLevelCapping, maxHdcpLevel } = this;\n\n    let maxAutoLevel;\n    if (autoLevelCapping === -1 && levels?.length) {\n      maxAutoLevel = levels.length - 1;\n    } else {\n      maxAutoLevel = autoLevelCapping;\n    }\n\n    if (maxHdcpLevel) {\n      for (let i = maxAutoLevel; i--; ) {\n        const hdcpLevel = levels[i].attrs['HDCP-LEVEL'];\n        if (hdcpLevel && hdcpLevel <= maxHdcpLevel) {\n          return i;\n        }\n      }\n    }\n\n    return maxAutoLevel;\n  }\n\n  get firstAutoLevel(): number {\n    return this.abrController.firstAutoLevel;\n  }\n\n  /**\n   * next automatically selected quality level\n   */\n  get nextAutoLevel(): number {\n    return this.abrController.nextAutoLevel;\n  }\n\n  /**\n   * this setter is used to force next auto level.\n   * this is useful to force a switch down in auto mode:\n   * in case of load error on level N, hls.js can set nextAutoLevel to N-1 for example)\n   * forced value is valid for one fragment. upon successful frag loading at forced level,\n   * this value will be resetted to -1 by ABR controller.\n   */\n  set nextAutoLevel(nextLevel: number) {\n    this.abrController.nextAutoLevel = nextLevel;\n  }\n\n  /**\n   * get the datetime value relative to media.currentTime for the active level Program Date Time if present\n   */\n  public get playingDate(): Date | null {\n    return this.streamController.currentProgramDateTime;\n  }\n\n  public get mainForwardBufferInfo(): BufferInfo | null {\n    return this.streamController.getMainFwdBufferInfo();\n  }\n\n  public get maxBufferLength(): number {\n    return this.streamController.maxBufferLength;\n  }\n\n  /**\n   * Find and select the best matching audio track, making a level switch when a Group change is necessary.\n   * Updates `hls.config.audioPreference`. Returns the selected track, or null when no matching track is found.\n   */\n  public setAudioOption(\n    audioOption: MediaPlaylist | AudioSelectionOption | undefined,\n  ): MediaPlaylist | null {\n    return this.audioTrackController?.setAudioOption(audioOption) || null;\n  }\n  /**\n   * Find and select the best matching subtitle track, making a level switch when a Group change is necessary.\n   * Updates `hls.config.subtitlePreference`. Returns the selected track, or null when no matching track is found.\n   */\n  public setSubtitleOption(\n    subtitleOption: MediaPlaylist | SubtitleSelectionOption | undefined,\n  ): MediaPlaylist | null {\n    return (\n      this.subtitleTrackController?.setSubtitleOption(subtitleOption) || null\n    );\n  }\n\n  /**\n   * Get the complete list of audio tracks across all media groups\n   */\n  get allAudioTracks(): MediaPlaylist[] {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.allAudioTracks : [];\n  }\n\n  /**\n   * Get the list of selectable audio tracks\n   */\n  get audioTracks(): MediaPlaylist[] {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.audioTracks : [];\n  }\n\n  /**\n   * index of the selected audio track (index in audio track lists)\n   */\n  get audioTrack(): number {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.audioTrack : -1;\n  }\n\n  /**\n   * selects an audio track, based on its index in audio track lists\n   */\n  set audioTrack(audioTrackId: number) {\n    const audioTrackController = this.audioTrackController;\n    if (audioTrackController) {\n      audioTrackController.audioTrack = audioTrackId;\n    }\n  }\n\n  /**\n   * get the complete list of subtitle tracks across all media groups\n   */\n  get allSubtitleTracks(): MediaPlaylist[] {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController\n      ? subtitleTrackController.allSubtitleTracks\n      : [];\n  }\n\n  /**\n   * get alternate subtitle tracks list from playlist\n   */\n  get subtitleTracks(): MediaPlaylist[] {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController\n      ? subtitleTrackController.subtitleTracks\n      : [];\n  }\n\n  /**\n   * index of the selected subtitle track (index in subtitle track lists)\n   */\n  get subtitleTrack(): number {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.subtitleTrack : -1;\n  }\n\n  get media() {\n    return this._media;\n  }\n\n  /**\n   * select an subtitle track, based on its index in subtitle track lists\n   */\n  set subtitleTrack(subtitleTrackId: number) {\n    const subtitleTrackController = this.subtitleTrackController;\n    if (subtitleTrackController) {\n      subtitleTrackController.subtitleTrack = subtitleTrackId;\n    }\n  }\n\n  /**\n   * Whether subtitle display is enabled or not\n   */\n  get subtitleDisplay(): boolean {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController\n      ? subtitleTrackController.subtitleDisplay\n      : false;\n  }\n\n  /**\n   * Enable/disable subtitle display rendering\n   */\n  set subtitleDisplay(value: boolean) {\n    const subtitleTrackController = this.subtitleTrackController;\n    if (subtitleTrackController) {\n      subtitleTrackController.subtitleDisplay = value;\n    }\n  }\n\n  /**\n   * get mode for Low-Latency HLS loading\n   */\n  get lowLatencyMode(): boolean {\n    return this.config.lowLatencyMode;\n  }\n\n  /**\n   * Enable/disable Low-Latency HLS part playlist and segment loading, and start live streams at playlist PART-HOLD-BACK rather than HOLD-BACK.\n   */\n  set lowLatencyMode(mode: boolean) {\n    this.config.lowLatencyMode = mode;\n  }\n\n  /**\n   * Position (in seconds) of live sync point (ie edge of live position minus safety delay defined by ```hls.config.liveSyncDuration```)\n   * @returns null prior to loading live Playlist\n   */\n  get liveSyncPosition(): number | null {\n    return this.latencyController.liveSyncPosition;\n  }\n\n  /**\n   * Estimated position (in seconds) of live edge (ie edge of live playlist plus time sync playlist advanced)\n   * @returns 0 before first playlist is loaded\n   */\n  get latency(): number {\n    return this.latencyController.latency;\n  }\n\n  /**\n   * maximum distance from the edge before the player seeks forward to ```hls.liveSyncPosition```\n   * configured using ```liveMaxLatencyDurationCount``` (multiple of target duration) or ```liveMaxLatencyDuration```\n   * @returns 0 before first playlist is loaded\n   */\n  get maxLatency(): number {\n    return this.latencyController.maxLatency;\n  }\n\n  /**\n   * target distance from the edge as calculated by the latency controller\n   */\n  get targetLatency(): number | null {\n    return this.latencyController.targetLatency;\n  }\n\n  set targetLatency(latency: number) {\n    this.latencyController.targetLatency = latency;\n  }\n\n  /**\n   * the rate at which the edge of the current live playlist is advancing or 1 if there is none\n   */\n  get drift(): number | null {\n    return this.latencyController.drift;\n  }\n\n  /**\n   * set to true when startLoad is called before MANIFEST_PARSED event\n   */\n  get forceStartLoad(): boolean {\n    return this.streamController.forceStartLoad;\n  }\n\n  /**\n   * ContentSteering pathways getter\n   */\n  get pathways(): string[] {\n    return this.levelController.pathways;\n  }\n\n  /**\n   * ContentSteering pathwayPriority getter/setter\n   */\n  get pathwayPriority(): string[] | null {\n    return this.levelController.pathwayPriority;\n  }\n\n  set pathwayPriority(pathwayPriority: string[]) {\n    this.levelController.pathwayPriority = pathwayPriority;\n  }\n\n  /**\n   * returns true when all SourceBuffers are buffered to the end\n   */\n  get bufferedToEnd(): boolean {\n    return !!this.bufferController?.bufferedToEnd;\n  }\n\n  /**\n   * returns Interstitials Program Manager\n   */\n  get interstitialsManager(): InterstitialsManager | null {\n    return this.interstitialsController?.interstitialsManager || null;\n  }\n\n  /**\n   * returns mediaCapabilities.decodingInfo for a variant/rendition\n   */\n  getMediaDecodingInfo(\n    level: Level,\n    audioTracks: MediaPlaylist[] = this.allAudioTracks,\n  ): Promise<MediaDecodingInfo> {\n    const audioTracksByGroup = getAudioTracksByGroup(audioTracks);\n    return getMediaDecodingInfoPromise(\n      level,\n      audioTracksByGroup,\n      navigator.mediaCapabilities,\n    );\n  }\n}\n\nexport type InFlightFragments = {\n  [PlaylistLevelType.MAIN]: InFlightData;\n  [PlaylistLevelType.AUDIO]?: InFlightData;\n  [PlaylistLevelType.SUBTITLE]?: InFlightData;\n};\nexport type {\n  AudioSelectionOption,\n  SubtitleSelectionOption,\n  VideoSelectionOption,\n  MediaPlaylist,\n  ErrorDetails,\n  ErrorTypes,\n  Events,\n  Level,\n  LevelDetails,\n  HlsListeners,\n  HlsEventEmitter,\n  HlsConfig,\n  BufferInfo,\n  BufferTimeRange,\n  HdcpLevel,\n  AbrController,\n  AudioStreamController,\n  AudioTrackController,\n  BasePlaylistController,\n  BaseStreamController,\n  BufferController,\n  CapLevelController,\n  CMCDController,\n  ContentSteeringController,\n  EMEController,\n  ErrorController,\n  FPSController,\n  InterstitialsController,\n  StreamController,\n  SubtitleStreamController,\n  SubtitleTrackController,\n  EwmaBandWidthEstimator,\n  InterstitialsManager,\n  Decrypter,\n  FragmentLoader,\n  KeyLoader,\n  TaskLoop,\n  TransmuxerInterface,\n  InFlightData,\n  State,\n  XhrLoader,\n  FetchLoader,\n  Cues,\n  M3U8Parser,\n};\nexport type {\n  ABRControllerConfig,\n  BufferControllerConfig,\n  CapLevelControllerConfig,\n  CMCDControllerConfig,\n  EMEControllerConfig,\n  DRMSystemConfiguration,\n  DRMSystemsConfiguration,\n  DRMSystemOptions,\n  FPSControllerConfig,\n  FragmentLoaderConfig,\n  FragmentLoaderConstructor,\n  GapControllerConfig,\n  HlsLoadPolicies,\n  LevelControllerConfig,\n  LoaderConfig,\n  LoadPolicy,\n  MP4RemuxerConfig,\n  PlaylistLoaderConfig,\n  PlaylistLoaderConstructor,\n  RetryConfig,\n  SelectionPreferences,\n  StreamControllerConfig,\n  LatencyControllerConfig,\n  MetadataControllerConfig,\n  TimelineControllerConfig,\n  TSDemuxerConfig,\n} from './config';\nexport type { MediaKeySessionContext } from './controller/eme-controller';\nexport type {\n  FragmentState,\n  FragmentTracker,\n} from './controller/fragment-tracker';\nexport type {\n  PathwayClone,\n  SteeringManifest,\n  UriReplacement,\n} from './controller/content-steering-controller';\nexport type {\n  NetworkErrorAction,\n  ErrorActionFlags,\n  IErrorAction,\n} from './controller/error-controller';\nexport type {\n  HlsAssetPlayer,\n  HlsAssetPlayerConfig,\n  InterstitialPlayer,\n} from './controller/interstitial-player';\nexport type { PlayheadTimes } from './controller/interstitials-controller';\nexport type {\n  InterstitialScheduleDurations,\n  InterstitialScheduleEventItem,\n  InterstitialScheduleItem,\n  InterstitialSchedulePrimaryItem,\n} from './controller/interstitials-schedule';\nexport type { TimelineController } from './controller/timeline-controller';\nexport type { DecrypterAesMode } from './crypt/decrypter-aes-mode';\nexport type { DateRange, DateRangeCue } from './loader/date-range';\nexport type { LoadStats } from './loader/load-stats';\nexport type { LevelKey } from './loader/level-key';\nexport type {\n  BaseSegment,\n  Fragment,\n  MediaFragment,\n  Part,\n  ElementaryStreams,\n  ElementaryStreamTypes,\n  ElementaryStreamInfo,\n} from './loader/fragment';\nexport type {\n  FragLoadFailResult,\n  FragmentLoadProgressCallback,\n  LoadError,\n} from './loader/fragment-loader';\nexport type { KeyLoaderInfo } from './loader/key-loader';\nexport type { DecryptData } from './loader/level-key';\nexport type {\n  AssetListJSON,\n  BaseData,\n  InterstitialAssetId,\n  InterstitialAssetItem,\n  InterstitialEvent,\n  InterstitialEventWithAssetList,\n  InterstitialId,\n  PlaybackRestrictions,\n  SnapOptions,\n  TimelineOccupancy,\n} from './loader/interstitial-event';\nexport type { ParsedMultivariantPlaylist } from './loader/m3u8-parser';\nexport type {\n  AttachMediaSourceData,\n  BaseTrack,\n  BaseTrackSet,\n  BufferCreatedTrack,\n  BufferCreatedTrackSet,\n  ExtendedSourceBuffer,\n  MediaOverrides,\n  ParsedTrack,\n  SourceBufferName,\n  SourceBufferListener,\n  SourceBufferTrack,\n  SourceBufferTrackSet,\n} from './types/buffer';\nexport type {\n  ComponentAPI,\n  AbrComponentAPI,\n  NetworkComponentAPI,\n} from './types/component-api';\nexport type {\n  TrackLoadingData,\n  TrackLoadedData,\n  AssetListLoadedData,\n  AssetListLoadingData,\n  AudioTrackLoadedData,\n  AudioTrackUpdatedData,\n  AudioTracksUpdatedData,\n  AudioTrackSwitchedData,\n  AudioTrackSwitchingData,\n  BackBufferData,\n  BufferAppendedData,\n  BufferAppendingData,\n  BufferCodecsData,\n  BufferCreatedData,\n  BufferEOSData,\n  BufferFlushedData,\n  BufferFlushingData,\n  CuesParsedData,\n  ErrorData,\n  FPSDropData,\n  FPSDropLevelCappingData,\n  FragBufferedData,\n  FragChangedData,\n  FragDecryptedData,\n  FragLoadedData,\n  FragLoadEmergencyAbortedData,\n  FragLoadingData,\n  FragParsedData,\n  FragParsingInitSegmentData,\n  FragParsingMetadataData,\n  FragParsingUserdataData,\n  InitPTSFoundData,\n  KeyLoadedData,\n  KeyLoadingData,\n  LevelLoadedData,\n  LevelLoadingData,\n  LevelPTSUpdatedData,\n  LevelsUpdatedData,\n  LevelSwitchedData,\n  LevelSwitchingData,\n  LevelUpdatedData,\n  LiveBackBufferData,\n  ContentSteeringOptions,\n  ManifestLoadedData,\n  ManifestLoadingData,\n  ManifestParsedData,\n  MaxAutoLevelUpdatedData,\n  MediaAttachedData,\n  MediaAttachingData,\n  MediaDetachedData,\n  MediaDetachingData,\n  MediaEndedData,\n  NonNativeTextTrack,\n  NonNativeTextTracksData,\n  PartsLoadedData,\n  SteeringManifestLoadedData,\n  SubtitleFragProcessedData,\n  SubtitleTrackLoadedData,\n  SubtitleTrackUpdatedData,\n  SubtitleTracksUpdatedData,\n  SubtitleTrackSwitchData,\n  InterstitialsUpdatedData,\n  InterstitialsBufferedToBoundaryData,\n  InterstitialAssetPlayerCreatedData,\n  InterstitialStartedData,\n  InterstitialEndedData,\n  InterstitialAssetStartedData,\n  InterstitialAssetEndedData,\n  InterstitialAssetErrorData,\n  InterstitialsPrimaryResumed,\n} from './types/events';\nexport type {\n  MetadataSample,\n  MetadataSchema,\n  UserdataSample,\n} from './types/demuxer';\nexport type {\n  InitSegmentData,\n  RemuxedMetadata,\n  RemuxedTrack,\n  RemuxedUserdata,\n  RemuxerResult,\n} from './types/remuxer';\nexport type { AttrList } from './utils/attr-list';\nexport type { Bufferable } from './utils/buffer-helper';\nexport type { CaptionScreen } from './utils/cea-608-parser';\nexport type { CuesInterface } from './utils/cues';\nexport type {\n  CodecsParsed,\n  HdcpLevels,\n  HlsSkip,\n  HlsUrlParameters,\n  LevelAttributes,\n  LevelParsed,\n  VariableMap,\n  VideoRange,\n  VideoRangeValues,\n} from './types/level';\nexport type {\n  PlaylistLevelType,\n  HlsChunkPerformanceTiming,\n  HlsPerformanceTiming,\n  HlsProgressivePerformanceTiming,\n  PlaylistContextType,\n  PlaylistLoaderContext,\n  FragmentLoaderContext,\n  KeyLoaderContext,\n  Loader,\n  LoaderStats,\n  LoaderContext,\n  LoaderResponse,\n  LoaderConfiguration,\n  LoaderCallbacks,\n  LoaderOnProgress,\n  LoaderOnAbort,\n  LoaderOnError,\n  LoaderOnSuccess,\n  LoaderOnTimeout,\n} from './types/loader';\nexport type { ILogFunction, ILogger, Logger } from './utils/logger';\nexport type {\n  MediaAttributes,\n  MediaPlaylistType,\n  MainPlaylistType,\n  AudioPlaylistType,\n  SubtitlePlaylistType,\n} from './types/media-playlist';\nexport type { Track, TrackSet } from './types/track';\nexport type { ChunkMetadata, TransmuxerResult } from './types/transmuxer';\nexport type { MediaDecodingInfo } from './utils/mediacapabilities-helper';\nexport type {\n  MediaKeyFunc,\n  KeySystems,\n  KeySystemFormats,\n} from './utils/mediakeys-helper';\nexport type {\n  RationalTimestamp,\n  TimestampOffset,\n} from './utils/timescale-conversion';\n", "function _defineProperty$1(e, r, t) {\n  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: true,\n    configurable: true,\n    writable: true\n  }) : e[r] = t, e;\n}\nfunction _toPrimitive(t, r) {\n  if (\"object\" != typeof t || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r);\n    if (\"object\" != typeof i) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n  var i = _toPrimitive(t, \"string\");\n  return \"symbol\" == typeof i ? i : i + \"\";\n}\n\nfunction _classCallCheck(e, t) {\n  if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _defineProperties(e, t) {\n  for (var n = 0; n < t.length; n++) {\n    var r = t[n];\n    r.enumerable = r.enumerable || false, r.configurable = true, \"value\" in r && (r.writable = true), Object.defineProperty(e, r.key, r);\n  }\n}\nfunction _createClass(e, t, n) {\n  return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e;\n}\nfunction _defineProperty(e, t, n) {\n  return t in e ? Object.defineProperty(e, t, {\n    value: n,\n    enumerable: true,\n    configurable: true,\n    writable: true\n  }) : e[t] = n, e;\n}\nfunction ownKeys(e, t) {\n  var n = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var r = Object.getOwnPropertySymbols(e);\n    t && (r = r.filter(function (t) {\n      return Object.getOwnPropertyDescriptor(e, t).enumerable;\n    })), n.push.apply(n, r);\n  }\n  return n;\n}\nfunction _objectSpread2(e) {\n  for (var t = 1; t < arguments.length; t++) {\n    var n = null != arguments[t] ? arguments[t] : {};\n    t % 2 ? ownKeys(Object(n), true).forEach(function (t) {\n      _defineProperty(e, t, n[t]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys(Object(n)).forEach(function (t) {\n      Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n    });\n  }\n  return e;\n}\nvar defaults$1 = {\n  addCSS: true,\n  thumbWidth: 15,\n  watch: true\n};\nfunction matches$1(e, t) {\n  return function () {\n    return Array.from(document.querySelectorAll(t)).includes(this);\n  }.call(e, t);\n}\nfunction trigger(e, t) {\n  if (e && t) {\n    var n = new Event(t, {\n      bubbles: true\n    });\n    e.dispatchEvent(n);\n  }\n}\nvar getConstructor$1 = function (e) {\n    return null != e ? e.constructor : null;\n  },\n  instanceOf$1 = function (e, t) {\n    return !!(e && t && e instanceof t);\n  },\n  isNullOrUndefined$1 = function (e) {\n    return null == e;\n  },\n  isObject$1 = function (e) {\n    return getConstructor$1(e) === Object;\n  },\n  isNumber$1 = function (e) {\n    return getConstructor$1(e) === Number && !Number.isNaN(e);\n  },\n  isString$1 = function (e) {\n    return getConstructor$1(e) === String;\n  },\n  isBoolean$1 = function (e) {\n    return getConstructor$1(e) === Boolean;\n  },\n  isFunction$1 = function (e) {\n    return getConstructor$1(e) === Function;\n  },\n  isArray$1 = function (e) {\n    return Array.isArray(e);\n  },\n  isNodeList$1 = function (e) {\n    return instanceOf$1(e, NodeList);\n  },\n  isElement$1 = function (e) {\n    return instanceOf$1(e, Element);\n  },\n  isEvent$1 = function (e) {\n    return instanceOf$1(e, Event);\n  },\n  isEmpty$1 = function (e) {\n    return isNullOrUndefined$1(e) || (isString$1(e) || isArray$1(e) || isNodeList$1(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n  },\n  is$1 = {\n    nullOrUndefined: isNullOrUndefined$1,\n    object: isObject$1,\n    number: isNumber$1,\n    string: isString$1,\n    boolean: isBoolean$1,\n    function: isFunction$1,\n    array: isArray$1,\n    nodeList: isNodeList$1,\n    element: isElement$1,\n    event: isEvent$1,\n    empty: isEmpty$1\n  };\nfunction getDecimalPlaces(e) {\n  var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n  return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n}\nfunction round(e, t) {\n  if (1 > t) {\n    var n = getDecimalPlaces(t);\n    return parseFloat(e.toFixed(n));\n  }\n  return Math.round(e / t) * t;\n}\nvar RangeTouch = function () {\n  function e(t, n) {\n    _classCallCheck(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2({}, defaults$1, {}, n), this.init());\n  }\n  return _createClass(e, [{\n    key: \"init\",\n    value: function () {\n      e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(true), this.element.rangeTouch = this);\n    }\n  }, {\n    key: \"destroy\",\n    value: function () {\n      e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(false), this.element.rangeTouch = null);\n    }\n  }, {\n    key: \"listeners\",\n    value: function (e) {\n      var t = this,\n        n = e ? \"addEventListener\" : \"removeEventListener\";\n      [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n        t.element[n](e, function (e) {\n          return t.set(e);\n        }, false);\n      });\n    }\n  }, {\n    key: \"get\",\n    value: function (t) {\n      if (!e.enabled || !is$1.event(t)) return null;\n      var n,\n        r = t.target,\n        i = t.changedTouches[0],\n        o = parseFloat(r.getAttribute(\"min\")) || 0,\n        s = parseFloat(r.getAttribute(\"max\")) || 100,\n        u = parseFloat(r.getAttribute(\"step\")) || 1,\n        c = r.getBoundingClientRect(),\n        a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n      return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n    }\n  }, {\n    key: \"set\",\n    value: function (t) {\n      e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n    }\n  }], [{\n    key: \"setup\",\n    value: function (t) {\n      var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n        r = null;\n      if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n      var i = _objectSpread2({}, defaults$1, {}, n);\n      if (is$1.string(t) && i.watch) {\n        var o = new MutationObserver(function (n) {\n          Array.from(n).forEach(function (n) {\n            Array.from(n.addedNodes).forEach(function (n) {\n              is$1.element(n) && matches$1(n, t) && new e(n, i);\n            });\n          });\n        });\n        o.observe(document.body, {\n          childList: true,\n          subtree: true\n        });\n      }\n      return r.map(function (t) {\n        return new e(t, n);\n      });\n    }\n  }, {\n    key: \"enabled\",\n    get: function () {\n      return \"ontouchstart\" in document.documentElement;\n    }\n  }]), e;\n}();\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => input !== null && typeof input !== 'undefined' ? input.constructor : null;\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => typeof input === 'function';\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);\nconst isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\nfunction isElement(input) {\n  return input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\n}\nfunction isEmpty(input) {\n  return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n}\nfunction isUrl(input) {\n  // Accept a URL object\n  if (instanceOf(input, window.URL)) {\n    return true;\n  }\n\n  // Must be string from here\n  if (!isString(input)) {\n    return false;\n  }\n\n  // Add the protocol if required\n  let string = input;\n  if (!input.startsWith('http://') || !input.startsWith('https://')) {\n    string = `http://${input}`;\n  }\n  try {\n    return !isEmpty(new URL(string).hostname);\n  } catch {\n    return false;\n  }\n}\nvar is = {\n  nullOrUndefined: isNullOrUndefined,\n  object: isObject,\n  number: isNumber,\n  string: isString,\n  boolean: isBoolean,\n  function: isFunction,\n  array: isArray,\n  weakMap: isWeakMap,\n  nodeList: isNodeList,\n  element: isElement,\n  textNode: isTextNode,\n  event: isEvent,\n  keyboardEvent: isKeyboardEvent,\n  cue: isCue,\n  track: isTrack,\n  promise: isPromise,\n  url: isUrl,\n  empty: isEmpty\n};\n\n// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nconst transitionEndEvent = (() => {\n  const element = document.createElement('span');\n  const events = {\n    WebkitTransition: 'webkitTransitionEnd',\n    MozTransition: 'transitionend',\n    OTransition: 'oTransitionEnd otransitionend',\n    transition: 'transitionend'\n  };\n  const type = Object.keys(events).find(event => element.style[event] !== undefined);\n  return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nfunction repaint(element, delay) {\n  setTimeout(() => {\n    try {\n      element.hidden = true;\n      // eslint-disable-next-line no-unused-expressions\n      element.offsetHeight;\n      element.hidden = false;\n    } catch {}\n  }, delay);\n}\n\n// ==========================================================================\n// Object utils\n// ==========================================================================\n\n\n// Clone nested objects\nfunction cloneDeep(object) {\n  return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nfunction getDeep(object, path) {\n  return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nfunction extend(target = {}, ...sources) {\n  if (!sources.length) {\n    return target;\n  }\n  const source = sources.shift();\n  if (!is.object(source)) {\n    return target;\n  }\n  Object.keys(source).forEach(key => {\n    if (is.object(source[key])) {\n      if (!Object.keys(target).includes(key)) {\n        Object.assign(target, {\n          [key]: {}\n        });\n      }\n      extend(target[key], source[key]);\n    } else {\n      Object.assign(target, {\n        [key]: source[key]\n      });\n    }\n  });\n  return extend(target, ...sources);\n}\n\n// ==========================================================================\n// Element utils\n// ==========================================================================\n\n\n// Wrap an element\nfunction wrap(elements, wrapper) {\n  // Convert `elements` to an array, if necessary.\n  const targets = elements.length ? elements : [elements];\n\n  // Loops backwards to prevent having to clone the wrapper on the\n  // first element (see `child` below).\n  Array.from(targets).reverse().forEach((element, index) => {\n    const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n    // Cache the current parent and sibling.\n    const parent = element.parentNode;\n    const sibling = element.nextSibling;\n\n    // Wrap the element (is automatically removed from its current\n    // parent).\n    child.appendChild(element);\n\n    // If the element had a sibling, insert the wrapper before\n    // the sibling to maintain the HTML structure; otherwise, just\n    // append it to the parent.\n    if (sibling) {\n      parent.insertBefore(child, sibling);\n    } else {\n      parent.appendChild(child);\n    }\n  });\n}\n\n// Set attributes\nfunction setAttributes(element, attributes) {\n  if (!is.element(element) || is.empty(attributes)) return;\n\n  // Assume null and undefined attributes should be left out,\n  // Setting them would otherwise convert them to \"null\" and \"undefined\"\n  Object.entries(attributes).filter(([, value]) => !is.nullOrUndefined(value)).forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nfunction createElement(type, attributes, text) {\n  // Create a new <element>\n  const element = document.createElement(type);\n\n  // Set all passed attributes\n  if (is.object(attributes)) {\n    setAttributes(element, attributes);\n  }\n\n  // Add text node\n  if (is.string(text)) {\n    element.textContent = text;\n  }\n\n  // Return built element\n  return element;\n}\n\n// Insert an element after another\nfunction insertAfter(element, target) {\n  if (!is.element(element) || !is.element(target)) return;\n  target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nfunction insertElement(type, parent, attributes, text) {\n  if (!is.element(parent)) return;\n  parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nfunction removeElement(element) {\n  if (is.nodeList(element) || is.array(element)) {\n    Array.from(element).forEach(removeElement);\n    return;\n  }\n  if (!is.element(element) || !is.element(element.parentNode)) {\n    return;\n  }\n  element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nfunction emptyElement(element) {\n  if (!is.element(element)) return;\n  let {\n    length\n  } = element.childNodes;\n  while (length > 0) {\n    element.removeChild(element.lastChild);\n    length -= 1;\n  }\n}\n\n// Replace element\nfunction replaceElement(newChild, oldChild) {\n  if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) return null;\n  oldChild.parentNode.replaceChild(newChild, oldChild);\n  return newChild;\n}\n\n// Get an attribute object from a string selector\nfunction getAttributesFromSelector(sel, existingAttributes) {\n  // For example:\n  // '.test' to { class: 'test' }\n  // '#test' to { id: 'test' }\n  // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n  if (!is.string(sel) || is.empty(sel)) return {};\n  const attributes = {};\n  const existing = extend({}, existingAttributes);\n  sel.split(',').forEach(s => {\n    // Remove whitespace\n    const selector = s.trim();\n    const className = selector.replace('.', '');\n    const stripped = selector.replace(/[[\\]]/g, '');\n    // Get the parts and value\n    const parts = stripped.split('=');\n    const [key] = parts;\n    const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n    // Get the first character\n    const start = selector.charAt(0);\n    switch (start) {\n      case '.':\n        // Add to existing classname\n        if (is.string(existing.class)) {\n          attributes.class = `${existing.class} ${className}`;\n        } else {\n          attributes.class = className;\n        }\n        break;\n      case '#':\n        // ID selector\n        attributes.id = selector.replace('#', '');\n        break;\n      case '[':\n        // Attribute selector\n        attributes[key] = value;\n        break;\n    }\n  });\n  return extend(existing, attributes);\n}\n\n// Toggle hidden\nfunction toggleHidden(element, hidden) {\n  if (!is.element(element)) return;\n  let hide = hidden;\n  if (!is.boolean(hide)) {\n    hide = !element.hidden;\n  }\n  element.hidden = hide;\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nfunction toggleClass(element, className, force) {\n  if (is.nodeList(element)) {\n    return Array.from(element).map(e => toggleClass(e, className, force));\n  }\n  if (is.element(element)) {\n    let method = 'toggle';\n    if (typeof force !== 'undefined') {\n      method = force ? 'add' : 'remove';\n    }\n    element.classList[method](className);\n    return element.classList.contains(className);\n  }\n  return false;\n}\n\n// Has class name\nfunction hasClass(element, className) {\n  return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nfunction matches(element, selector) {\n  const {\n    prototype\n  } = Element;\n  function match() {\n    return Array.from(document.querySelectorAll(selector)).includes(this);\n  }\n  const method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n  return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nfunction closest$1(element, selector) {\n  const {\n    prototype\n  } = Element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n  function closestElement() {\n    let el = this;\n    do {\n      if (matches.matches(el, selector)) return el;\n      el = el.parentElement || el.parentNode;\n    } while (el !== null && el.nodeType === 1);\n    return null;\n  }\n  const method = prototype.closest || closestElement;\n  return method.call(element, selector);\n}\n\n// Find all elements\nfunction getElements(selector) {\n  return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nfunction getElement(selector) {\n  return this.elements.container.querySelector(selector);\n}\n\n// Set focus and tab focus class\nfunction setFocus(element = null, focusVisible = false) {\n  if (!is.element(element)) return;\n\n  // Set regular focus\n  element.focus({\n    preventScroll: true,\n    focusVisible\n  });\n}\n\n// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n  'audio/ogg': 'vorbis',\n  'audio/wav': '1',\n  'video/webm': 'vp8, vorbis',\n  'video/mp4': 'avc1.42E01E, mp4a.40.2',\n  'video/ogg': 'theora'\n};\n\n// Check for feature support\nconst support = {\n  // Basic support\n  audio: 'canPlayType' in document.createElement('audio'),\n  video: 'canPlayType' in document.createElement('video'),\n  // Check for support\n  // Basic functionality vs full UI\n  check(type, provider) {\n    const api = support[type] || provider !== 'html5';\n    const ui = api && support.rangeInput;\n    return {\n      api,\n      ui\n    };\n  },\n  // Picture-in-picture support\n  pip: (() => {\n    return document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture;\n  })(),\n  // Airplay support\n  // Safari only currently\n  airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n  // Inline playback support\n  // https://webkit.org/blog/6784/new-video-policies-for-ios/\n  playsinline: 'playsInline' in document.createElement('video'),\n  // Check for mime type support against a player instance\n  // Credits: http://diveintohtml5.info/everything.html\n  // Related: http://www.leanbackplayer.com/test/h5mt.html\n  mime(input) {\n    if (is.empty(input)) {\n      return false;\n    }\n    const [mediaType] = input.split('/');\n    let type = input;\n\n    // Verify we're using HTML5 and there's no media type mismatch\n    if (!this.isHTML5 || mediaType !== this.type) {\n      return false;\n    }\n\n    // Add codec if required\n    if (Object.keys(defaultCodecs).includes(type)) {\n      type += `; codecs=\"${defaultCodecs[input]}\"`;\n    }\n    try {\n      return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n    } catch {\n      return false;\n    }\n  },\n  // Check for textTracks support\n  textTracks: 'textTracks' in document.createElement('video'),\n  // <input type=\"range\"> Sliders\n  rangeInput: (() => {\n    const range = document.createElement('input');\n    range.type = 'range';\n    return range.type === 'range';\n  })(),\n  // Touch\n  // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n  touch: 'ontouchstart' in document.documentElement,\n  // Detect transitions support\n  transitions: transitionEndEvent !== false,\n  // Reduced motion iOS & MacOS setting\n  // https://webkit.org/blog/7551/responsive-design-for-motion/\n  reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n};\n\n// ==========================================================================\n// Event utils\n// ==========================================================================\n\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n  // Test via a getter in the options object to see if the passive property is accessed\n  let supported = false;\n  try {\n    const options = Object.defineProperty({}, 'passive', {\n      get() {\n        supported = true;\n        return null;\n      }\n    });\n    window.addEventListener('test', null, options);\n    window.removeEventListener('test', null, options);\n  } catch {}\n  return supported;\n})();\n\n// Toggle event listener\nfunction toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n  // Bail if no element, event, or callback\n  if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n    return;\n  }\n\n  // Allow multiple events\n  const events = event.split(' ');\n  // Build options\n  // Default to just the capture boolean for browsers with no passive listener support\n  let options = capture;\n\n  // If passive events listeners are supported\n  if (supportsPassiveListeners) {\n    options = {\n      // Whether the listener can be passive (i.e. default never prevented)\n      passive,\n      // Whether the listener is a capturing listener or not\n      capture\n    };\n  }\n\n  // If a single node is passed, bind the event listener\n  events.forEach(type => {\n    if (this && this.eventListeners && toggle) {\n      // Cache event listener\n      this.eventListeners.push({\n        element,\n        type,\n        callback,\n        options\n      });\n    }\n    element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n  });\n}\n\n// Bind event handler\nfunction on(element, events = '', callback, passive = true, capture = false) {\n  toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nfunction off(element, events = '', callback, passive = true, capture = false) {\n  toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nfunction once(element, events = '', callback, passive = true, capture = false) {\n  const onceCallback = (...args) => {\n    off(element, events, onceCallback, passive, capture);\n    callback.apply(this, args);\n  };\n  toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nfunction triggerEvent(element, type = '', bubbles = false, detail = {}) {\n  // Bail if no element\n  if (!is.element(element) || is.empty(type)) {\n    return;\n  }\n\n  // Create and dispatch the event\n  const event = new CustomEvent(type, {\n    bubbles,\n    detail: {\n      ...detail,\n      plyr: this\n    }\n  });\n\n  // Dispatch the event\n  element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nfunction unbindListeners() {\n  if (this && this.eventListeners) {\n    this.eventListeners.forEach(item => {\n      const {\n        element,\n        type,\n        callback,\n        options\n      } = item;\n      element.removeEventListener(type, callback, options);\n    });\n    this.eventListeners = [];\n  }\n}\n\n// Run method when / if player is ready\nfunction ready() {\n  return new Promise(resolve => this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)).then(() => {});\n}\n\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param  {object} value An object that may or may not be `Promise`-like.\n */\nfunction silencePromise(value) {\n  if (is.promise(value)) {\n    value.then(null, () => {});\n  }\n}\n\n// ==========================================================================\n// Array utils\n// ==========================================================================\n\n\n// Remove duplicates in an array\nfunction dedupe(array) {\n  if (!is.array(array)) {\n    return array;\n  }\n  return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nfunction closest(array, value) {\n  if (!is.array(array) || !array.length) {\n    return null;\n  }\n  return array.reduce((prev, curr) => Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev);\n}\n\n// ==========================================================================\n// Style utils\n// ==========================================================================\n\n\n// Check support for a CSS declaration\nfunction supportsCSS(declaration) {\n  if (!window || !window.CSS) {\n    return false;\n  }\n  return window.CSS.supports(declaration);\n}\n\n// Standard/common aspect ratios\nconst standardRatios = [[1, 1], [4, 3], [3, 4], [5, 4], [4, 5], [3, 2], [2, 3], [16, 10], [10, 16], [16, 9], [9, 16], [21, 9], [9, 21], [32, 9], [9, 32]].reduce((out, [x, y]) => ({\n  ...out,\n  [x / y]: [x, y]\n}), {});\n\n// Validate an aspect ratio\nfunction validateAspectRatio(input) {\n  if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n    return false;\n  }\n  const ratio = is.array(input) ? input : input.split(':');\n  return ratio.map(Number).every(is.number);\n}\n\n// Reduce an aspect ratio to it's lowest form\nfunction reduceAspectRatio(ratio) {\n  if (!is.array(ratio) || !ratio.every(is.number)) {\n    return null;\n  }\n  const [width, height] = ratio;\n  const getDivider = (w, h) => h === 0 ? w : getDivider(h, w % h);\n  const divider = getDivider(width, height);\n  return [width / divider, height / divider];\n}\n\n// Calculate an aspect ratio\nfunction getAspectRatio(input) {\n  const parse = ratio => validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null;\n  // Try provided ratio\n  let ratio = parse(input);\n\n  // Get from config\n  if (ratio === null) {\n    ratio = parse(this.config.ratio);\n  }\n\n  // Get from embed\n  if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n    ({\n      ratio\n    } = this.embed);\n  }\n\n  // Get from HTML5 video\n  if (ratio === null && this.isHTML5) {\n    const {\n      videoWidth,\n      videoHeight\n    } = this.media;\n    ratio = [videoWidth, videoHeight];\n  }\n  return reduceAspectRatio(ratio);\n}\n\n// Set aspect ratio for responsive container\nfunction setAspectRatio(input) {\n  if (!this.isVideo) {\n    return {};\n  }\n  const {\n    wrapper\n  } = this.elements;\n  const ratio = getAspectRatio.call(this, input);\n  if (!is.array(ratio)) {\n    return {};\n  }\n  const [x, y] = reduceAspectRatio(ratio);\n  const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n  const padding = 100 / x * y;\n  if (useNative) {\n    wrapper.style.aspectRatio = `${x}/${y}`;\n  } else {\n    wrapper.style.paddingBottom = `${padding}%`;\n  }\n\n  // For Vimeo we have an extra <div> to hide the standard controls and UI\n  if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n    const height = 100 / this.media.offsetWidth * Number.parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n    const offset = (height - padding) / (height / 50);\n    if (this.fullscreen.active) {\n      wrapper.style.paddingBottom = null;\n    } else {\n      this.media.style.transform = `translateY(-${offset}%)`;\n    }\n  } else if (this.isHTML5) {\n    wrapper.classList.add(this.config.classNames.videoFixedRatio);\n  }\n  return {\n    padding,\n    ratio\n  };\n}\n\n// Round an aspect ratio to closest standard ratio\nfunction roundAspectRatio(x, y, tolerance = 0.05) {\n  const ratio = x / y;\n  const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n  // Check match is within tolerance\n  if (Math.abs(closestRatio - ratio) <= tolerance) {\n    return standardRatios[closestRatio];\n  }\n\n  // No match\n  return [x, y];\n}\n\n// Get the size of the viewport\n// https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\nfunction getViewportSize() {\n  const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n  const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n  return [width, height];\n}\n\n// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nconst html5 = {\n  getSources() {\n    if (!this.isHTML5) {\n      return [];\n    }\n    const sources = Array.from(this.media.querySelectorAll('source'));\n\n    // Filter out unsupported sources (if type is specified)\n    return sources.filter(source => {\n      const type = source.getAttribute('type');\n      if (is.empty(type)) {\n        return true;\n      }\n      return support.mime.call(this, type);\n    });\n  },\n  // Get quality levels\n  getQualityOptions() {\n    // Whether we're forcing all options (e.g. for streaming)\n    if (this.config.quality.forced) {\n      return this.config.quality.options;\n    }\n\n    // Get sizes from <source> elements\n    return html5.getSources.call(this).map(source => Number(source.getAttribute('size'))).filter(Boolean);\n  },\n  setup() {\n    if (!this.isHTML5) {\n      return;\n    }\n    const player = this;\n\n    // Set speed options from config\n    player.options.speed = player.config.speed.options;\n\n    // Set aspect ratio if fixed\n    if (!is.empty(this.config.ratio)) {\n      setAspectRatio.call(player);\n    }\n\n    // Quality\n    Object.defineProperty(player.media, 'quality', {\n      get() {\n        // Get sources\n        const sources = html5.getSources.call(player);\n        const source = sources.find(s => s.getAttribute('src') === player.source);\n\n        // Return size, if match is found\n        return source && Number(source.getAttribute('size'));\n      },\n      set(input) {\n        if (player.quality === input) {\n          return;\n        }\n\n        // If we're using an external handler...\n        if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n          player.config.quality.onChange(input);\n        } else {\n          // Get sources\n          const sources = html5.getSources.call(player);\n          // Get first match for requested size\n          const source = sources.find(s => Number(s.getAttribute('size')) === input);\n\n          // No matching source found\n          if (!source) {\n            return;\n          }\n\n          // Get current state\n          const {\n            currentTime,\n            paused,\n            preload,\n            readyState,\n            playbackRate\n          } = player.media;\n\n          // Set new source\n          player.media.src = source.getAttribute('src');\n\n          // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n          if (preload !== 'none' || readyState) {\n            // Restore time\n            player.once('loadedmetadata', () => {\n              player.speed = playbackRate;\n              player.currentTime = currentTime;\n\n              // Resume playing\n              if (!paused) {\n                silencePromise(player.play());\n              }\n            });\n\n            // Load new source\n            player.media.load();\n          }\n        }\n\n        // Trigger change event\n        triggerEvent.call(player, player.media, 'qualitychange', false, {\n          quality: input\n        });\n      }\n    });\n  },\n  // Cancel current network requests\n  // See https://github.com/sampotts/plyr/issues/174\n  cancelRequests() {\n    if (!this.isHTML5) {\n      return;\n    }\n\n    // Remove child sources\n    removeElement(html5.getSources.call(this));\n\n    // Set blank video src attribute\n    // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n    // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n    this.media.setAttribute('src', this.config.blankVideo);\n\n    // Load the new empty source\n    // This will cancel existing requests\n    // See https://github.com/sampotts/plyr/issues/174\n    this.media.load();\n\n    // Debugging\n    this.debug.log('Cancelled network requests');\n  }\n};\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst isIE = Boolean(window.document.documentMode);\nconst isEdge = /Edge/.test(navigator.userAgent);\nconst isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent);\n// navigator.platform may be deprecated but this check is still required\nconst isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\nconst isIos = /iPad|iPhone|iPod/i.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\nvar browser = {\n  isIE,\n  isEdge,\n  isWebKit,\n  isIPadOS,\n  isIos\n};\n\n// ==========================================================================\n// String utils\n// ==========================================================================\n\n\n// Generate a random ID\nfunction generateId(prefix) {\n  return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nfunction format(input, ...args) {\n  if (is.empty(input)) return input;\n  return input.toString().replace(/\\{(\\d+)\\}/g, (_, i) => args[i].toString());\n}\n\n// Get percentage\nfunction getPercentage(current, max) {\n  if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n    return 0;\n  }\n  return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurrences of a string in a string\nfunction replaceAll(input = '', find = '', replace = '') {\n  return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nfunction toTitleCase(input = '') {\n  return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nfunction toPascalCase(input = '') {\n  let string = input.toString();\n\n  // Convert kebab case\n  string = replaceAll(string, '-', ' ');\n\n  // Convert snake case\n  string = replaceAll(string, '_', ' ');\n\n  // Convert to title case\n  string = toTitleCase(string);\n\n  // Convert to pascal case\n  return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nfunction toCamelCase(input = '') {\n  let string = input.toString();\n\n  // Convert to pascal case\n  string = toPascalCase(string);\n\n  // Convert first character to lowercase\n  return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nfunction stripHTML(source) {\n  const fragment = document.createDocumentFragment();\n  const element = document.createElement('div');\n  fragment.appendChild(element);\n  element.innerHTML = source;\n  return fragment.firstChild.textContent;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nfunction getHTML(element) {\n  const wrapper = document.createElement('div');\n  wrapper.appendChild(element);\n  return wrapper.innerHTML;\n}\n\n// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n  pip: 'PIP',\n  airplay: 'AirPlay',\n  html5: 'HTML5',\n  vimeo: 'Vimeo',\n  youtube: 'YouTube'\n};\nconst i18n = {\n  get(key = '', config = {}) {\n    if (is.empty(key) || is.empty(config)) {\n      return '';\n    }\n    let string = getDeep(config.i18n, key);\n    if (is.empty(string)) {\n      if (Object.keys(resources).includes(key)) {\n        return resources[key];\n      }\n      return '';\n    }\n    const replace = {\n      '{seektime}': config.seekTime,\n      '{title}': config.title\n    };\n    Object.entries(replace).forEach(([k, v]) => {\n      string = replaceAll(string, k, v);\n    });\n    return string;\n  }\n};\n\nclass Storage {\n  constructor(player) {\n    _defineProperty$1(this, \"get\", key => {\n      if (!Storage.supported || !this.enabled) {\n        return null;\n      }\n      const store = window.localStorage.getItem(this.key);\n      if (is.empty(store)) return null;\n      const json = JSON.parse(store);\n      return is.string(key) && key.length ? json[key] : json;\n    });\n    _defineProperty$1(this, \"set\", object => {\n      // Bail if we don't have localStorage support or it's disabled\n      if (!Storage.supported || !this.enabled) {\n        return;\n      }\n\n      // Can only store objects\n      if (!is.object(object)) {\n        return;\n      }\n\n      // Get current storage\n      let storage = this.get();\n\n      // Default to empty object\n      if (is.empty(storage)) {\n        storage = {};\n      }\n\n      // Update the working copy of the values\n      extend(storage, object);\n\n      // Update storage\n      try {\n        window.localStorage.setItem(this.key, JSON.stringify(storage));\n      } catch {}\n    });\n    this.enabled = player.config.storage.enabled;\n    this.key = player.config.storage.key;\n  }\n\n  // Check for actual support (see if we can use it)\n  static get supported() {\n    try {\n      if (!('localStorage' in window)) return false;\n      const test = '___test';\n      // Try to use it (it might be disabled, e.g. user is in private mode)\n      // see: https://github.com/sampotts/plyr/issues/131\n      window.localStorage.setItem(test, test);\n      window.localStorage.removeItem(test);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n}\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nfunction fetch(url, responseType = 'text', withCredentials = false) {\n  return new Promise((resolve, reject) => {\n    try {\n      const request = new XMLHttpRequest();\n\n      // Check for CORS support\n      if (!('withCredentials' in request)) return;\n\n      // Set to true if needed for CORS\n      if (withCredentials) {\n        request.withCredentials = true;\n      }\n      request.addEventListener('load', () => {\n        if (responseType === 'text') {\n          try {\n            resolve(JSON.parse(request.responseText));\n          } catch {\n            resolve(request.responseText);\n          }\n        } else {\n          resolve(request.response);\n        }\n      });\n      request.addEventListener('error', () => {\n        throw new Error(request.status);\n      });\n      request.open('GET', url, true);\n      request.responseType = responseType;\n      request.send();\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n\n// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\n\n// Load an external SVG sprite\nfunction loadSprite(url, id) {\n  if (!is.string(url)) {\n    return;\n  }\n  const prefix = 'cache';\n  const hasId = is.string(id);\n  let isCached = false;\n  const exists = () => document.getElementById(id) !== null;\n  const update = (container, data) => {\n    container.innerHTML = data;\n\n    // Check again incase of race condition\n    if (hasId && exists()) {\n      return;\n    }\n\n    // Inject the SVG to the body\n    document.body.insertAdjacentElement('afterbegin', container);\n  };\n\n  // Only load once if ID set\n  if (!hasId || !exists()) {\n    const useStorage = Storage.supported;\n    // Create container\n    const container = document.createElement('div');\n    container.setAttribute('hidden', '');\n    if (hasId) {\n      container.setAttribute('id', id);\n    }\n\n    // Check in cache\n    if (useStorage) {\n      const cached = window.localStorage.getItem(`${prefix}-${id}`);\n      isCached = cached !== null;\n      if (isCached) {\n        const data = JSON.parse(cached);\n        update(container, data.content);\n      }\n    }\n\n    // Get the sprite\n    fetch(url).then(result => {\n      if (is.empty(result)) {\n        return;\n      }\n      if (useStorage) {\n        try {\n          window.localStorage.setItem(`${prefix}-${id}`, JSON.stringify({\n            content: result\n          }));\n        } catch {}\n      }\n      update(container, result);\n    }).catch(() => {});\n  }\n}\n\n// ==========================================================================\n// Time utils\n// ==========================================================================\n\n\n// Time helpers\nconst getHours = value => Math.trunc(value / 60 / 60 % 60, 10);\nconst getMinutes = value => Math.trunc(value / 60 % 60, 10);\nconst getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nfunction formatTime(time = 0, displayHours = false, inverted = false) {\n  // Bail if the value isn't a number\n  if (!is.number(time)) {\n    return formatTime(undefined, displayHours, inverted);\n  }\n\n  // Format time component to add leading zero\n  const format = value => `0${value}`.slice(-2);\n  // Breakdown to hours, mins, secs\n  let hours = getHours(time);\n  const mins = getMinutes(time);\n  const secs = getSeconds(time);\n\n  // Do we need to display hours?\n  if (displayHours || hours > 0) {\n    hours = `${hours}:`;\n  } else {\n    hours = '';\n  }\n\n  // Render\n  return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n\n// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n  // Get icon URL\n  getIconUrl() {\n    const url = new URL(this.config.iconUrl, window.location);\n    const host = window.location.host ? window.location.host : window.top.location.host;\n    const cors = url.host !== host || browser.isIE && !window.svg4everybody;\n    return {\n      url: this.config.iconUrl,\n      cors\n    };\n  },\n  // Find the UI controls\n  findElements() {\n    try {\n      this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n      // Buttons\n      this.elements.buttons = {\n        play: getElements.call(this, this.config.selectors.buttons.play),\n        pause: getElement.call(this, this.config.selectors.buttons.pause),\n        restart: getElement.call(this, this.config.selectors.buttons.restart),\n        rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n        fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n        mute: getElement.call(this, this.config.selectors.buttons.mute),\n        pip: getElement.call(this, this.config.selectors.buttons.pip),\n        airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n        settings: getElement.call(this, this.config.selectors.buttons.settings),\n        captions: getElement.call(this, this.config.selectors.buttons.captions),\n        fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n      };\n\n      // Progress\n      this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n      // Inputs\n      this.elements.inputs = {\n        seek: getElement.call(this, this.config.selectors.inputs.seek),\n        volume: getElement.call(this, this.config.selectors.inputs.volume)\n      };\n\n      // Display\n      this.elements.display = {\n        buffer: getElement.call(this, this.config.selectors.display.buffer),\n        currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n        duration: getElement.call(this, this.config.selectors.display.duration)\n      };\n\n      // Seek tooltip\n      if (is.element(this.elements.progress)) {\n        this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n      }\n      return true;\n    } catch (error) {\n      // Log it\n      this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n      // Restore native video controls\n      this.toggleNativeControls(true);\n      return false;\n    }\n  },\n  // Create <svg> icon\n  createIcon(type, attributes) {\n    const namespace = 'http://www.w3.org/2000/svg';\n    const iconUrl = controls.getIconUrl.call(this);\n    const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n    // Create <svg>\n    const icon = document.createElementNS(namespace, 'svg');\n    setAttributes(icon, extend(attributes, {\n      'aria-hidden': 'true',\n      'focusable': 'false'\n    }));\n\n    // Create the <use> to reference sprite\n    const use = document.createElementNS(namespace, 'use');\n    const path = `${iconPath}-${type}`;\n\n    // Set `href` attributes\n    // https://github.com/sampotts/plyr/issues/460\n    // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n    if ('href' in use) {\n      use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n    }\n\n    // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n    use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n    // Add <use> to <svg>\n    icon.appendChild(use);\n    return icon;\n  },\n  // Create hidden text label\n  createLabel(key, attr = {}) {\n    const text = i18n.get(key, this.config);\n    const attributes = {\n      ...attr,\n      class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n    };\n    return createElement('span', attributes, text);\n  },\n  // Create a badge\n  createBadge(text) {\n    if (is.empty(text)) {\n      return null;\n    }\n    const badge = createElement('span', {\n      class: this.config.classNames.menu.value\n    });\n    badge.appendChild(createElement('span', {\n      class: this.config.classNames.menu.badge\n    }, text));\n    return badge;\n  },\n  // Create a <button>\n  createButton(buttonType, attr) {\n    const attributes = extend({}, attr);\n    let type = toCamelCase(buttonType);\n    const props = {\n      element: 'button',\n      toggle: false,\n      label: null,\n      icon: null,\n      labelPressed: null,\n      iconPressed: null\n    };\n    ['element', 'icon', 'label'].forEach(key => {\n      if (Object.keys(attributes).includes(key)) {\n        props[key] = attributes[key];\n        delete attributes[key];\n      }\n    });\n\n    // Default to 'button' type to prevent form submission\n    if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n      attributes.type = 'button';\n    }\n\n    // Set class name\n    if (Object.keys(attributes).includes('class')) {\n      if (!attributes.class.split(' ').includes(this.config.classNames.control)) {\n        extend(attributes, {\n          class: `${attributes.class} ${this.config.classNames.control}`\n        });\n      }\n    } else {\n      attributes.class = this.config.classNames.control;\n    }\n\n    // Large play button\n    switch (buttonType) {\n      case 'play':\n        props.toggle = true;\n        props.label = 'play';\n        props.labelPressed = 'pause';\n        props.icon = 'play';\n        props.iconPressed = 'pause';\n        break;\n      case 'mute':\n        props.toggle = true;\n        props.label = 'mute';\n        props.labelPressed = 'unmute';\n        props.icon = 'volume';\n        props.iconPressed = 'muted';\n        break;\n      case 'captions':\n        props.toggle = true;\n        props.label = 'enableCaptions';\n        props.labelPressed = 'disableCaptions';\n        props.icon = 'captions-off';\n        props.iconPressed = 'captions-on';\n        break;\n      case 'fullscreen':\n        props.toggle = true;\n        props.label = 'enterFullscreen';\n        props.labelPressed = 'exitFullscreen';\n        props.icon = 'enter-fullscreen';\n        props.iconPressed = 'exit-fullscreen';\n        break;\n      case 'play-large':\n        attributes.class += ` ${this.config.classNames.control}--overlaid`;\n        type = 'play';\n        props.label = 'play';\n        props.icon = 'play';\n        break;\n      default:\n        if (is.empty(props.label)) {\n          props.label = type;\n        }\n        if (is.empty(props.icon)) {\n          props.icon = buttonType;\n        }\n    }\n    const button = createElement(props.element);\n\n    // Setup toggle icon and labels\n    if (props.toggle) {\n      // Icon\n      button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n        class: 'icon--pressed'\n      }));\n      button.appendChild(controls.createIcon.call(this, props.icon, {\n        class: 'icon--not-pressed'\n      }));\n\n      // Label/Tooltip\n      button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n        class: 'label--pressed'\n      }));\n      button.appendChild(controls.createLabel.call(this, props.label, {\n        class: 'label--not-pressed'\n      }));\n    } else {\n      button.appendChild(controls.createIcon.call(this, props.icon));\n      button.appendChild(controls.createLabel.call(this, props.label));\n    }\n\n    // Merge and set attributes\n    extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n    setAttributes(button, attributes);\n\n    // We have multiple play buttons\n    if (type === 'play') {\n      if (!is.array(this.elements.buttons[type])) {\n        this.elements.buttons[type] = [];\n      }\n      this.elements.buttons[type].push(button);\n    } else {\n      this.elements.buttons[type] = button;\n    }\n    return button;\n  },\n  // Create an <input type='range'>\n  createRange(type, attributes) {\n    // Seek input\n    const input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n      'type': 'range',\n      'min': 0,\n      'max': 100,\n      'step': 0.01,\n      'value': 0,\n      'autocomplete': 'off',\n      // A11y fixes for https://github.com/sampotts/plyr/issues/905\n      'role': 'slider',\n      'aria-label': i18n.get(type, this.config),\n      'aria-valuemin': 0,\n      'aria-valuemax': 100,\n      'aria-valuenow': 0\n    }, attributes));\n    this.elements.inputs[type] = input;\n\n    // Set the fill for webkit now\n    controls.updateRangeFill.call(this, input);\n\n    // Improve support on touch devices\n    RangeTouch.setup(input);\n    return input;\n  },\n  // Create a <progress>\n  createProgress(type, attributes) {\n    const progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n      'min': 0,\n      'max': 100,\n      'value': 0,\n      'role': 'progressbar',\n      'aria-hidden': true\n    }, attributes));\n\n    // Create the label inside\n    if (type !== 'volume') {\n      progress.appendChild(createElement('span', null, '0'));\n      const suffixKey = {\n        played: 'played',\n        buffer: 'buffered'\n      }[type];\n      const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n      progress.textContent = `% ${suffix.toLowerCase()}`;\n    }\n    this.elements.display[type] = progress;\n    return progress;\n  },\n  // Create time display\n  createTime(type, attrs) {\n    const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n    const container = createElement('div', extend(attributes, {\n      'class': `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.trim(),\n      'aria-label': i18n.get(type, this.config),\n      'role': 'timer'\n    }), '00:00');\n\n    // Reference for updates\n    this.elements.display[type] = container;\n    return container;\n  },\n  // Bind keyboard shortcuts for a menu item\n  // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n  bindMenuItemShortcuts(menuItem, type) {\n    // Navigate through menus via arrow keys and space\n    on.call(this, menuItem, 'keydown keyup', event => {\n      // We only care about space and \u2B06\uFE0F \u2B07\uFE0F\uFE0F \u27A1\uFE0F\n      if (![' ', 'ArrowUp', 'ArrowDown', 'ArrowRight'].includes(event.key)) {\n        return;\n      }\n\n      // Prevent play / seek\n      event.preventDefault();\n      event.stopPropagation();\n\n      // We're just here to prevent the keydown bubbling\n      if (event.type === 'keydown') {\n        return;\n      }\n      const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n      // Show the respective menu\n      if (!isRadioButton && [' ', 'ArrowRight'].includes(event.key)) {\n        controls.showMenuPanel.call(this, type, true);\n      } else {\n        let target;\n        if (event.key !== ' ') {\n          if (event.key === 'ArrowDown' || isRadioButton && event.key === 'ArrowRight') {\n            target = menuItem.nextElementSibling;\n            if (!is.element(target)) {\n              target = menuItem.parentNode.firstElementChild;\n            }\n          } else {\n            target = menuItem.previousElementSibling;\n            if (!is.element(target)) {\n              target = menuItem.parentNode.lastElementChild;\n            }\n          }\n          setFocus.call(this, target, true);\n        }\n      }\n    }, false);\n\n    // Enter will fire a `click` event but we still need to manage focus\n    // So we bind to keyup which fires after and set focus here\n    on.call(this, menuItem, 'keyup', event => {\n      if (event.key !== 'Return') return;\n      controls.focusFirstMenuItem.call(this, null, true);\n    });\n  },\n  // Create a settings menu item\n  createMenuItem({\n    value,\n    list,\n    type,\n    title,\n    badge = null,\n    checked = false\n  }) {\n    const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n    const menuItem = createElement('button', extend(attributes, {\n      'type': 'button',\n      'role': 'menuitemradio',\n      'class': `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n      'aria-checked': checked,\n      value\n    }));\n    const flex = createElement('span');\n\n    // We have to set as HTML incase of special characters\n    flex.innerHTML = title;\n    if (is.element(badge)) {\n      flex.appendChild(badge);\n    }\n    menuItem.appendChild(flex);\n\n    // Replicate radio button behavior\n    Object.defineProperty(menuItem, 'checked', {\n      enumerable: true,\n      get() {\n        return menuItem.getAttribute('aria-checked') === 'true';\n      },\n      set(check) {\n        // Ensure exclusivity\n        if (check) {\n          Array.from(menuItem.parentNode.children).filter(node => matches(node, '[role=\"menuitemradio\"]')).forEach(node => node.setAttribute('aria-checked', 'false'));\n        }\n        menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n      }\n    });\n    this.listeners.bind(menuItem, 'click keyup', event => {\n      if (is.keyboardEvent(event) && event.key !== ' ') {\n        return;\n      }\n      event.preventDefault();\n      event.stopPropagation();\n      menuItem.checked = true;\n      switch (type) {\n        case 'language':\n          this.currentTrack = Number(value);\n          break;\n        case 'quality':\n          this.quality = value;\n          break;\n        case 'speed':\n          this.speed = Number.parseFloat(value);\n          break;\n      }\n      controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n    }, type, false);\n    controls.bindMenuItemShortcuts.call(this, menuItem, type);\n    list.appendChild(menuItem);\n  },\n  // Format a time for display\n  formatTime(time = 0, inverted = false) {\n    // Bail if the value isn't a number\n    if (!is.number(time)) {\n      return time;\n    }\n\n    // Always display hours if duration is over an hour\n    const forceHours = getHours(this.duration) > 0;\n    return formatTime(time, forceHours, inverted);\n  },\n  // Update the displayed time\n  updateTimeDisplay(target = null, time = 0, inverted = false) {\n    // Bail if there's no element to display or the value isn't a number\n    if (!is.element(target) || !is.number(time)) {\n      return;\n    }\n    target.textContent = controls.formatTime(time, inverted);\n  },\n  // Update volume UI and storage\n  updateVolume() {\n    if (!this.supported.ui) {\n      return;\n    }\n\n    // Update range\n    if (is.element(this.elements.inputs.volume)) {\n      controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n    }\n\n    // Update mute state\n    if (is.element(this.elements.buttons.mute)) {\n      this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n    }\n  },\n  // Update seek value and lower fill\n  setRange(target, value = 0) {\n    if (!is.element(target)) {\n      return;\n    }\n    target.value = value;\n\n    // Webkit range fill\n    controls.updateRangeFill.call(this, target);\n  },\n  // Update <progress> elements\n  updateProgress(event) {\n    if (!this.supported.ui || !is.event(event)) {\n      return;\n    }\n    let value = 0;\n    const setProgress = (target, input) => {\n      const val = is.number(input) ? input : 0;\n      const progress = is.element(target) ? target : this.elements.display.buffer;\n\n      // Update value and label\n      if (is.element(progress)) {\n        progress.value = val;\n\n        // Update text label inside\n        const label = progress.getElementsByTagName('span')[0];\n        if (is.element(label)) {\n          label.childNodes[0].nodeValue = val;\n        }\n      }\n    };\n    if (event) {\n      switch (event.type) {\n        // Video playing\n        case 'timeupdate':\n        case 'seeking':\n        case 'seeked':\n          value = getPercentage(this.currentTime, this.duration);\n\n          // Set seek range value only if it's a 'natural' time event\n          if (event.type === 'timeupdate') {\n            controls.setRange.call(this, this.elements.inputs.seek, value);\n          }\n          break;\n\n        // Check buffer status\n        case 'playing':\n        case 'progress':\n          setProgress(this.elements.display.buffer, this.buffered * 100);\n          break;\n      }\n    }\n  },\n  // Webkit polyfill for lower fill range\n  updateRangeFill(target) {\n    // Get range from event if event passed\n    const range = is.event(target) ? target.target : target;\n\n    // Needs to be a valid <input type='range'>\n    if (!is.element(range) || range.getAttribute('type') !== 'range') {\n      return;\n    }\n\n    // Set aria values for https://github.com/sampotts/plyr/issues/905\n    if (matches(range, this.config.selectors.inputs.seek)) {\n      range.setAttribute('aria-valuenow', this.currentTime);\n      const currentTime = controls.formatTime(this.currentTime);\n      const duration = controls.formatTime(this.duration);\n      const format = i18n.get('seekLabel', this.config);\n      range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n    } else if (matches(range, this.config.selectors.inputs.volume)) {\n      const percent = range.value * 100;\n      range.setAttribute('aria-valuenow', percent);\n      range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n    } else {\n      range.setAttribute('aria-valuenow', range.value);\n    }\n\n    // WebKit only\n    if (!browser.isWebKit && !browser.isIPadOS) {\n      return;\n    }\n\n    // Set CSS custom property\n    range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n  },\n  // Update hover tooltip for seeking\n  updateSeekTooltip(event) {\n    var _this$config$markers, _this$config$markers$;\n    // Bail if setting not true\n    if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n      return;\n    }\n    const tipElement = this.elements.display.seekTooltip;\n    const visible = `${this.config.classNames.tooltip}--visible`;\n    const toggle = show => toggleClass(tipElement, visible, show);\n\n    // Hide on touch\n    if (this.touch) {\n      toggle(false);\n      return;\n    }\n\n    // Determine percentage, if already visible\n    let percent = 0;\n    const clientRect = this.elements.progress.getBoundingClientRect();\n    if (is.event(event)) {\n      const scrollLeft = event.pageX - event.clientX;\n      percent = 100 / clientRect.width * (event.pageX - clientRect.left - scrollLeft);\n    } else if (hasClass(tipElement, visible)) {\n      percent = Number.parseFloat(tipElement.style.left, 10);\n    } else {\n      return;\n    }\n\n    // Set bounds\n    if (percent < 0) {\n      percent = 0;\n    } else if (percent > 100) {\n      percent = 100;\n    }\n    const time = this.duration / 100 * percent;\n\n    // Display the time a click would seek to\n    tipElement.textContent = controls.formatTime(time);\n\n    // Get marker point for time\n    const point = (_this$config$markers = this.config.markers) === null || _this$config$markers === void 0 ? void 0 : (_this$config$markers$ = _this$config$markers.points) === null || _this$config$markers$ === void 0 ? void 0 : _this$config$markers$.find(({\n      time: t\n    }) => t === Math.round(time));\n\n    // Append the point label to the tooltip\n    if (point) {\n      tipElement.insertAdjacentHTML('afterbegin', `${point.label}<br>`);\n    }\n\n    // Set position\n    tipElement.style.left = `${percent}%`;\n\n    // Show/hide the tooltip\n    // If the event is a moues in/out and percentage is inside bounds\n    if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n      toggle(event.type === 'mouseenter');\n    }\n  },\n  // Handle time change event\n  timeUpdate(event) {\n    // Only invert if only one time element is displayed and used for both duration and currentTime\n    const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n    // Duration\n    controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n    // Ignore updates while seeking\n    if (event && event.type === 'timeupdate' && this.media.seeking) {\n      return;\n    }\n\n    // Playing progress\n    controls.updateProgress.call(this, event);\n  },\n  // Show the duration on metadataloaded or durationchange events\n  durationUpdate() {\n    // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n    if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n      return;\n    }\n\n    // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n    // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n    // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n    // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n    if (this.duration >= 2 ** 32) {\n      toggleHidden(this.elements.display.currentTime, true);\n      toggleHidden(this.elements.progress, true);\n      return;\n    }\n\n    // Update ARIA values\n    if (is.element(this.elements.inputs.seek)) {\n      this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n    }\n\n    // If there's a spot to display duration\n    const hasDuration = is.element(this.elements.display.duration);\n\n    // If there's only one time display, display duration there\n    if (!hasDuration && this.config.displayDuration && this.paused) {\n      controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n    }\n\n    // If there's a duration element, update content\n    if (hasDuration) {\n      controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n    }\n    if (this.config.markers.enabled) {\n      controls.setMarkers.call(this);\n    }\n\n    // Update the tooltip (if visible)\n    controls.updateSeekTooltip.call(this);\n  },\n  // Hide/show a tab\n  toggleMenuButton(setting, toggle) {\n    toggleHidden(this.elements.settings.buttons[setting], !toggle);\n  },\n  // Update the selected setting\n  updateSetting(setting, container, input) {\n    const pane = this.elements.settings.panels[setting];\n    let value = null;\n    let list = container;\n    if (setting === 'captions') {\n      value = this.currentTrack;\n    } else {\n      value = !is.empty(input) ? input : this[setting];\n\n      // Get default\n      if (is.empty(value)) {\n        value = this.config[setting].default;\n      }\n\n      // Unsupported value\n      if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n        this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n        return;\n      }\n\n      // Disabled value\n      if (!this.config[setting].options.includes(value)) {\n        this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n        return;\n      }\n    }\n\n    // Get the list if we need to\n    if (!is.element(list)) {\n      list = pane && pane.querySelector('[role=\"menu\"]');\n    }\n\n    // If there's no list it means it's not been rendered...\n    if (!is.element(list)) {\n      return;\n    }\n\n    // Update the label\n    const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n    label.innerHTML = controls.getLabel.call(this, setting, value);\n\n    // Find the radio option and check it\n    const target = list && list.querySelector(`[value=\"${value}\"]`);\n    if (is.element(target)) {\n      target.checked = true;\n    }\n  },\n  // Translate a value into a nice label\n  getLabel(setting, value) {\n    switch (setting) {\n      case 'speed':\n        return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n      case 'quality':\n        if (is.number(value)) {\n          const label = i18n.get(`qualityLabel.${value}`, this.config);\n          if (!label.length) {\n            return `${value}p`;\n          }\n          return label;\n        }\n        return toTitleCase(value);\n      case 'captions':\n        return captions.getLabel.call(this);\n      default:\n        return null;\n    }\n  },\n  // Set the quality menu\n  setQualityMenu(options) {\n    // Menu required\n    if (!is.element(this.elements.settings.panels.quality)) {\n      return;\n    }\n    const type = 'quality';\n    const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n    // Set options if passed and filter based on uniqueness and config\n    if (is.array(options)) {\n      this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n    }\n\n    // Toggle the pane and tab\n    const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n    controls.toggleMenuButton.call(this, type, toggle);\n\n    // Empty the menu\n    emptyElement(list);\n\n    // Check if we need to toggle the parent\n    controls.checkMenu.call(this);\n\n    // If we're hiding, nothing more to do\n    if (!toggle) {\n      return;\n    }\n\n    // Get the badge HTML for HD, 4K etc\n    const getBadge = quality => {\n      const label = i18n.get(`qualityBadge.${quality}`, this.config);\n      if (!label.length) {\n        return null;\n      }\n      return controls.createBadge.call(this, label);\n    };\n\n    // Sort options by the config and then render options\n    this.options.quality.sort((a, b) => {\n      const sorting = this.config.quality.options;\n      return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n    }).forEach(quality => {\n      controls.createMenuItem.call(this, {\n        value: quality,\n        list,\n        type,\n        title: controls.getLabel.call(this, 'quality', quality),\n        badge: getBadge(quality)\n      });\n    });\n    controls.updateSetting.call(this, type, list);\n  },\n  // Set the looping options\n  /* setLoopMenu() {\n        // Menu required\n        if (!is.element(this.elements.settings.panels.loop)) {\n            return;\n        }\n         const options = ['start', 'end', 'all', 'reset'];\n        const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n         // Show the pane and tab\n        toggleHidden(this.elements.settings.buttons.loop, false);\n        toggleHidden(this.elements.settings.panels.loop, false);\n         // Toggle the pane and tab\n        const toggle = !is.empty(this.loop.options);\n        controls.toggleMenuButton.call(this, 'loop', toggle);\n         // Empty the menu\n        emptyElement(list);\n         options.forEach(option => {\n            const item = createElement('li');\n             const button = createElement(\n                'button',\n                extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n                    type: 'button',\n                    class: this.config.classNames.control,\n                    'data-plyr-loop-action': option,\n                }),\n                i18n.get(option, this.config)\n            );\n             if (['start', 'end'].includes(option)) {\n                const badge = controls.createBadge.call(this, '00:00');\n                button.appendChild(badge);\n            }\n             item.appendChild(button);\n            list.appendChild(item);\n        });\n    }, */\n\n  // Get current selected caption language\n  // TODO: rework this to user the getter in the API?\n\n  // Set a list of available captions languages\n  setCaptionsMenu() {\n    // Menu required\n    if (!is.element(this.elements.settings.panels.captions)) {\n      return;\n    }\n\n    // TODO: Captions or language? Currently it's mixed\n    const type = 'captions';\n    const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n    const tracks = captions.getTracks.call(this);\n    const toggle = Boolean(tracks.length);\n\n    // Toggle the pane and tab\n    controls.toggleMenuButton.call(this, type, toggle);\n\n    // Empty the menu\n    emptyElement(list);\n\n    // Check if we need to toggle the parent\n    controls.checkMenu.call(this);\n\n    // If there's no captions, bail\n    if (!toggle) {\n      return;\n    }\n\n    // Generate options data\n    const options = tracks.map((track, value) => ({\n      value,\n      checked: this.captions.toggled && this.currentTrack === value,\n      title: captions.getLabel.call(this, track),\n      badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n      list,\n      type: 'language'\n    }));\n\n    // Add the \"Disabled\" option to turn off captions\n    options.unshift({\n      value: -1,\n      checked: !this.captions.toggled,\n      title: i18n.get('disabled', this.config),\n      list,\n      type: 'language'\n    });\n\n    // Generate options\n    options.forEach(controls.createMenuItem.bind(this));\n    controls.updateSetting.call(this, type, list);\n  },\n  // Set a list of available captions languages\n  setSpeedMenu() {\n    // Menu required\n    if (!is.element(this.elements.settings.panels.speed)) {\n      return;\n    }\n    const type = 'speed';\n    const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n    // Filter out invalid speeds\n    this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n    // Toggle the pane and tab\n    const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n    controls.toggleMenuButton.call(this, type, toggle);\n\n    // Empty the menu\n    emptyElement(list);\n\n    // Check if we need to toggle the parent\n    controls.checkMenu.call(this);\n\n    // If we're hiding, nothing more to do\n    if (!toggle) {\n      return;\n    }\n\n    // Create items\n    this.options.speed.forEach(speed => {\n      controls.createMenuItem.call(this, {\n        value: speed,\n        list,\n        type,\n        title: controls.getLabel.call(this, 'speed', speed)\n      });\n    });\n    controls.updateSetting.call(this, type, list);\n  },\n  // Check if we need to hide/show the settings menu\n  checkMenu() {\n    const {\n      buttons\n    } = this.elements.settings;\n    const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n    toggleHidden(this.elements.settings.menu, !visible);\n  },\n  // Focus the first menu item in a given (or visible) menu\n  focusFirstMenuItem(pane, focusVisible = false) {\n    if (this.elements.settings.popup.hidden) {\n      return;\n    }\n    let target = pane;\n    if (!is.element(target)) {\n      target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n    }\n    const firstItem = target.querySelector('[role^=\"menuitem\"]');\n    setFocus.call(this, firstItem, focusVisible);\n  },\n  // Show/hide menu\n  toggleMenu(input) {\n    const {\n      popup\n    } = this.elements.settings;\n    const button = this.elements.buttons.settings;\n\n    // Menu and button are required\n    if (!is.element(popup) || !is.element(button)) {\n      return;\n    }\n\n    // True toggle by default\n    const {\n      hidden\n    } = popup;\n    let show = hidden;\n    if (is.boolean(input)) {\n      show = input;\n    } else if (is.keyboardEvent(input) && input.key === 'Escape') {\n      show = false;\n    } else if (is.event(input)) {\n      // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n      // Element in the shadowDOM. The path, if available, is complete.\n      const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n      const isMenuItem = popup.contains(target);\n\n      // If the click was inside the menu or if the click\n      // wasn't the button or menu item and we're trying to\n      // show the menu (a doc click shouldn't show the menu)\n      if (isMenuItem || !isMenuItem && input.target !== button && show) {\n        return;\n      }\n    }\n\n    // Set button attributes\n    button.setAttribute('aria-expanded', show);\n\n    // Show the actual popup\n    toggleHidden(popup, !show);\n\n    // Add class hook\n    toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n    // Focus the first item if key interaction\n    if (show && is.keyboardEvent(input)) {\n      controls.focusFirstMenuItem.call(this, null, true);\n    } else if (!show && !hidden) {\n      // If closing, re-focus the button\n      setFocus.call(this, button, is.keyboardEvent(input));\n    }\n  },\n  // Get the natural size of a menu panel\n  getMenuSize(tab) {\n    const clone = tab.cloneNode(true);\n    clone.style.position = 'absolute';\n    clone.style.opacity = 0;\n    clone.removeAttribute('hidden');\n\n    // Append to parent so we get the \"real\" size\n    tab.parentNode.appendChild(clone);\n\n    // Get the sizes before we remove\n    const width = clone.scrollWidth;\n    const height = clone.scrollHeight;\n\n    // Remove from the DOM\n    removeElement(clone);\n    return {\n      width,\n      height\n    };\n  },\n  // Show a panel in the menu\n  showMenuPanel(type = '', focusVisible = false) {\n    const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n    // Nothing to show, bail\n    if (!is.element(target)) {\n      return;\n    }\n\n    // Hide all other panels\n    const container = target.parentNode;\n    const current = Array.from(container.children).find(node => !node.hidden);\n\n    // If we can do fancy animations, we'll animate the height/width\n    if (support.transitions && !support.reducedMotion) {\n      // Set the current width as a base\n      container.style.width = `${current.scrollWidth}px`;\n      container.style.height = `${current.scrollHeight}px`;\n\n      // Get potential sizes\n      const size = controls.getMenuSize.call(this, target);\n\n      // Restore auto height/width\n      const restore = event => {\n        // We're only bothered about height and width on the container\n        if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n          return;\n        }\n\n        // Revert back to auto\n        container.style.width = '';\n        container.style.height = '';\n\n        // Only listen once\n        off.call(this, container, transitionEndEvent, restore);\n      };\n\n      // Listen for the transition finishing and restore auto height/width\n      on.call(this, container, transitionEndEvent, restore);\n\n      // Set dimensions to target\n      container.style.width = `${size.width}px`;\n      container.style.height = `${size.height}px`;\n    }\n\n    // Set attributes on current tab\n    toggleHidden(current, true);\n\n    // Set attributes on target\n    toggleHidden(target, false);\n\n    // Focus the first item\n    controls.focusFirstMenuItem.call(this, target, focusVisible);\n  },\n  // Set the download URL\n  setDownloadUrl() {\n    const button = this.elements.buttons.download;\n\n    // Bail if no button\n    if (!is.element(button)) {\n      return;\n    }\n\n    // Set attribute\n    button.setAttribute('href', this.download);\n  },\n  // Build the default HTML\n  create(data) {\n    const {\n      bindMenuItemShortcuts,\n      createButton,\n      createProgress,\n      createRange,\n      createTime,\n      setQualityMenu,\n      setSpeedMenu,\n      showMenuPanel\n    } = controls;\n    this.elements.controls = null;\n\n    // Larger overlaid play button\n    if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n      this.elements.container.appendChild(createButton.call(this, 'play-large'));\n    }\n\n    // Create the container\n    const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n    this.elements.controls = container;\n\n    // Default item attributes\n    const defaultAttributes = {\n      class: 'plyr__controls__item'\n    };\n\n    // Loop through controls in order\n    dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach(control => {\n      // Restart button\n      if (control === 'restart') {\n        container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n      }\n\n      // Rewind button\n      if (control === 'rewind') {\n        container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n      }\n\n      // Play/Pause button\n      if (control === 'play') {\n        container.appendChild(createButton.call(this, 'play', defaultAttributes));\n      }\n\n      // Fast forward button\n      if (control === 'fast-forward') {\n        container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n      }\n\n      // Progress\n      if (control === 'progress') {\n        const progressContainer = createElement('div', {\n          class: `${defaultAttributes.class} plyr__progress__container`\n        });\n        const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n        // Seek range slider\n        progress.appendChild(createRange.call(this, 'seek', {\n          id: `plyr-seek-${data.id}`\n        }));\n\n        // Buffer progress\n        progress.appendChild(createProgress.call(this, 'buffer'));\n\n        // TODO: Add loop display indicator\n\n        // Seek tooltip\n        if (this.config.tooltips.seek) {\n          const tooltip = createElement('span', {\n            class: this.config.classNames.tooltip\n          }, '00:00');\n          progress.appendChild(tooltip);\n          this.elements.display.seekTooltip = tooltip;\n        }\n        this.elements.progress = progress;\n        progressContainer.appendChild(this.elements.progress);\n        container.appendChild(progressContainer);\n      }\n\n      // Media current time display\n      if (control === 'current-time') {\n        container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n      }\n\n      // Media duration display\n      if (control === 'duration') {\n        container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n      }\n\n      // Volume controls\n      if (control === 'mute' || control === 'volume') {\n        let {\n          volume\n        } = this.elements;\n\n        // Create the volume container if needed\n        if (!is.element(volume) || !container.contains(volume)) {\n          volume = createElement('div', extend({}, defaultAttributes, {\n            class: `${defaultAttributes.class} plyr__volume`.trim()\n          }));\n          this.elements.volume = volume;\n          container.appendChild(volume);\n        }\n\n        // Toggle mute button\n        if (control === 'mute') {\n          volume.appendChild(createButton.call(this, 'mute'));\n        }\n\n        // Volume range control\n        // Ignored on iOS as it's handled globally\n        // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n        if (control === 'volume' && !browser.isIos && !browser.isIPadOS) {\n          // Set the attributes\n          const attributes = {\n            max: 1,\n            step: 0.05,\n            value: this.config.volume\n          };\n\n          // Create the volume range slider\n          volume.appendChild(createRange.call(this, 'volume', extend(attributes, {\n            id: `plyr-volume-${data.id}`\n          })));\n        }\n      }\n\n      // Toggle captions button\n      if (control === 'captions') {\n        container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n      }\n\n      // Settings button / menu\n      if (control === 'settings' && !is.empty(this.config.settings)) {\n        const wrapper = createElement('div', extend({}, defaultAttributes, {\n          class: `${defaultAttributes.class} plyr__menu`.trim(),\n          hidden: ''\n        }));\n        wrapper.appendChild(createButton.call(this, 'settings', {\n          'aria-haspopup': true,\n          'aria-controls': `plyr-settings-${data.id}`,\n          'aria-expanded': false\n        }));\n        const popup = createElement('div', {\n          class: 'plyr__menu__container',\n          id: `plyr-settings-${data.id}`,\n          hidden: ''\n        });\n        const inner = createElement('div');\n        const home = createElement('div', {\n          id: `plyr-settings-${data.id}-home`\n        });\n\n        // Create the menu\n        const menu = createElement('div', {\n          role: 'menu'\n        });\n        home.appendChild(menu);\n        inner.appendChild(home);\n        this.elements.settings.panels.home = home;\n\n        // Build the menu items\n        this.config.settings.forEach(type => {\n          // TODO: bundle this with the createMenuItem helper and bindings\n          const menuItem = createElement('button', extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n            'type': 'button',\n            'class': `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n            'role': 'menuitem',\n            'aria-haspopup': true,\n            'hidden': ''\n          }));\n\n          // Bind menu shortcuts for keyboard users\n          bindMenuItemShortcuts.call(this, menuItem, type);\n\n          // Show menu on click\n          on.call(this, menuItem, 'click', () => {\n            showMenuPanel.call(this, type, false);\n          });\n          const flex = createElement('span', null, i18n.get(type, this.config));\n          const value = createElement('span', {\n            class: this.config.classNames.menu.value\n          });\n\n          // Speed contains HTML entities\n          value.innerHTML = data[type];\n          flex.appendChild(value);\n          menuItem.appendChild(flex);\n          menu.appendChild(menuItem);\n\n          // Build the panes\n          const pane = createElement('div', {\n            id: `plyr-settings-${data.id}-${type}`,\n            hidden: ''\n          });\n\n          // Back button\n          const backButton = createElement('button', {\n            type: 'button',\n            class: `${this.config.classNames.control} ${this.config.classNames.control}--back`\n          });\n\n          // Visible label\n          backButton.appendChild(createElement('span', {\n            'aria-hidden': true\n          }, i18n.get(type, this.config)));\n\n          // Screen reader label\n          backButton.appendChild(createElement('span', {\n            class: this.config.classNames.hidden\n          }, i18n.get('menuBack', this.config)));\n\n          // Go back via keyboard\n          on.call(this, pane, 'keydown', event => {\n            if (event.key !== 'ArrowLeft') return;\n\n            // Prevent seek\n            event.preventDefault();\n            event.stopPropagation();\n\n            // Show the respective menu\n            showMenuPanel.call(this, 'home', true);\n          }, false);\n\n          // Go back via button click\n          on.call(this, backButton, 'click', () => {\n            showMenuPanel.call(this, 'home', false);\n          });\n\n          // Add to pane\n          pane.appendChild(backButton);\n\n          // Menu\n          pane.appendChild(createElement('div', {\n            role: 'menu'\n          }));\n          inner.appendChild(pane);\n          this.elements.settings.buttons[type] = menuItem;\n          this.elements.settings.panels[type] = pane;\n        });\n        popup.appendChild(inner);\n        wrapper.appendChild(popup);\n        container.appendChild(wrapper);\n        this.elements.settings.popup = popup;\n        this.elements.settings.menu = wrapper;\n      }\n\n      // Picture in picture button\n      if (control === 'pip' && support.pip) {\n        container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n      }\n\n      // Airplay button\n      if (control === 'airplay' && support.airplay) {\n        container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n      }\n\n      // Download button\n      if (control === 'download') {\n        const attributes = extend({}, defaultAttributes, {\n          element: 'a',\n          href: this.download,\n          target: '_blank'\n        });\n\n        // Set download attribute for HTML5 only\n        if (this.isHTML5) {\n          attributes.download = '';\n        }\n        const {\n          download\n        } = this.config.urls;\n        if (!is.url(download) && this.isEmbed) {\n          extend(attributes, {\n            icon: `logo-${this.provider}`,\n            label: this.provider\n          });\n        }\n        container.appendChild(createButton.call(this, 'download', attributes));\n      }\n\n      // Toggle fullscreen button\n      if (control === 'fullscreen') {\n        container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n      }\n    });\n\n    // Set available quality levels\n    if (this.isHTML5) {\n      setQualityMenu.call(this, html5.getQualityOptions.call(this));\n    }\n    setSpeedMenu.call(this);\n    return container;\n  },\n  // Insert controls\n  inject() {\n    // Sprite\n    if (this.config.loadSprite) {\n      const icon = controls.getIconUrl.call(this);\n\n      // Only load external sprite using AJAX\n      if (icon.cors) {\n        loadSprite(icon.url, 'sprite-plyr');\n      }\n    }\n\n    // Create a unique ID\n    this.id = Math.floor(Math.random() * 10000);\n\n    // Null by default\n    let container = null;\n    this.elements.controls = null;\n\n    // Set template properties\n    const props = {\n      id: this.id,\n      seektime: this.config.seekTime,\n      title: this.config.title\n    };\n    let update = true;\n\n    // If function, run it and use output\n    if (is.function(this.config.controls)) {\n      this.config.controls = this.config.controls.call(this, props);\n    }\n\n    // Convert falsy controls to empty array (primarily for empty strings)\n    if (!this.config.controls) {\n      this.config.controls = [];\n    }\n    if (is.element(this.config.controls) || is.string(this.config.controls)) {\n      // HTMLElement or Non-empty string passed as the option\n      container = this.config.controls;\n    } else {\n      // Create controls\n      container = controls.create.call(this, {\n        id: this.id,\n        seektime: this.config.seekTime,\n        speed: this.speed,\n        quality: this.quality,\n        captions: captions.getLabel.call(this)\n        // TODO: Looping\n        // loop: 'None',\n      });\n      update = false;\n    }\n\n    // Replace props with their value\n    const replace = input => {\n      let result = input;\n      Object.entries(props).forEach(([key, value]) => {\n        result = replaceAll(result, `{${key}}`, value);\n      });\n      return result;\n    };\n\n    // Update markup\n    if (update) {\n      if (is.string(this.config.controls)) {\n        container = replace(container);\n      }\n    }\n\n    // Controls container\n    let target;\n\n    // Inject to custom location\n    if (is.string(this.config.selectors.controls.container)) {\n      target = document.querySelector(this.config.selectors.controls.container);\n    }\n\n    // Inject into the container by default\n    if (!is.element(target)) {\n      target = this.elements.container;\n    }\n\n    // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n    const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n    target[insertMethod]('afterbegin', container);\n\n    // Find the elements if need be\n    if (!is.element(this.elements.controls)) {\n      controls.findElements.call(this);\n    }\n\n    // Add pressed property to buttons\n    if (!is.empty(this.elements.buttons)) {\n      const addProperty = button => {\n        const className = this.config.classNames.controlPressed;\n        button.setAttribute('aria-pressed', 'false');\n        Object.defineProperty(button, 'pressed', {\n          configurable: true,\n          enumerable: true,\n          get() {\n            return hasClass(button, className);\n          },\n          set(pressed = false) {\n            toggleClass(button, className, pressed);\n            button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n          }\n        });\n      };\n\n      // Toggle classname when pressed property is set\n      Object.values(this.elements.buttons).filter(Boolean).forEach(button => {\n        if (is.array(button) || is.nodeList(button)) {\n          Array.from(button).filter(Boolean).forEach(addProperty);\n        } else {\n          addProperty(button);\n        }\n      });\n    }\n\n    // Edge sometimes doesn't finish the paint so force a repaint\n    if (browser.isEdge) {\n      repaint(target);\n    }\n\n    // Setup tooltips\n    if (this.config.tooltips.controls) {\n      const {\n        classNames,\n        selectors\n      } = this.config;\n      const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n      const labels = getElements.call(this, selector);\n      Array.from(labels).forEach(label => {\n        toggleClass(label, this.config.classNames.hidden, false);\n        toggleClass(label, this.config.classNames.tooltip, true);\n      });\n    }\n  },\n  // Set media metadata\n  setMediaMetadata() {\n    try {\n      if ('mediaSession' in navigator) {\n        navigator.mediaSession.metadata = new window.MediaMetadata({\n          title: this.config.mediaMetadata.title,\n          artist: this.config.mediaMetadata.artist,\n          album: this.config.mediaMetadata.album,\n          artwork: this.config.mediaMetadata.artwork\n        });\n      }\n    } catch {\n      // Do nothing\n    }\n  },\n  // Add markers\n  setMarkers() {\n    var _this$config$markers2, _this$config$markers3;\n    if (!this.duration || this.elements.markers) return;\n\n    // Get valid points\n    const points = (_this$config$markers2 = this.config.markers) === null || _this$config$markers2 === void 0 ? void 0 : (_this$config$markers3 = _this$config$markers2.points) === null || _this$config$markers3 === void 0 ? void 0 : _this$config$markers3.filter(({\n      time\n    }) => time > 0 && time < this.duration);\n    if (!(points !== null && points !== void 0 && points.length)) return;\n    const containerFragment = document.createDocumentFragment();\n    const pointsFragment = document.createDocumentFragment();\n    let tipElement = null;\n    const tipVisible = `${this.config.classNames.tooltip}--visible`;\n    const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n    // Inject markers to progress container\n    points.forEach(point => {\n      const markerElement = createElement('span', {\n        class: this.config.classNames.marker\n      }, '');\n      const left = `${point.time / this.duration * 100}%`;\n      if (tipElement) {\n        // Show on hover\n        markerElement.addEventListener('mouseenter', () => {\n          if (point.label) return;\n          tipElement.style.left = left;\n          tipElement.innerHTML = point.label;\n          toggleTip(true);\n        });\n\n        // Hide on leave\n        markerElement.addEventListener('mouseleave', () => {\n          toggleTip(false);\n        });\n      }\n      markerElement.addEventListener('click', () => {\n        this.currentTime = point.time;\n      });\n      markerElement.style.left = left;\n      pointsFragment.appendChild(markerElement);\n    });\n    containerFragment.appendChild(pointsFragment);\n\n    // Inject a tooltip if needed\n    if (!this.config.tooltips.seek) {\n      tipElement = createElement('span', {\n        class: this.config.classNames.tooltip\n      }, '');\n      containerFragment.appendChild(tipElement);\n    }\n    this.elements.markers = {\n      points: pointsFragment,\n      tip: tipElement\n    };\n    this.elements.progress.appendChild(containerFragment);\n  }\n};\n\n// ==========================================================================\n// URL utils\n// ==========================================================================\n\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nfunction parseUrl(input, safe = true) {\n  let url = input;\n  if (safe) {\n    const parser = document.createElement('a');\n    parser.href = url;\n    url = parser.href;\n  }\n  try {\n    return new URL(url);\n  } catch {\n    return null;\n  }\n}\n\n// Convert object to URLSearchParams\nfunction buildUrlParams(input) {\n  const params = new URLSearchParams();\n  if (is.object(input)) {\n    Object.entries(input).forEach(([key, value]) => {\n      params.set(key, value);\n    });\n  }\n  return params;\n}\n\n// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nconst captions = {\n  // Setup captions\n  setup() {\n    // Requires UI support\n    if (!this.supported.ui) {\n      return;\n    }\n\n    // Only Vimeo and HTML5 video supported at this point\n    if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n      // Clear menu and hide\n      if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n        controls.setCaptionsMenu.call(this);\n      }\n      return;\n    }\n\n    // Inject the container\n    if (!is.element(this.elements.captions)) {\n      this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n      this.elements.captions.setAttribute('dir', 'auto');\n      insertAfter(this.elements.captions, this.elements.wrapper);\n    }\n\n    // Fix IE captions if CORS is used\n    // Fetch captions and inject as blobs instead (data URIs not supported!)\n    if (browser.isIE && window.URL) {\n      const elements = this.media.querySelectorAll('track');\n      Array.from(elements).forEach(track => {\n        const src = track.getAttribute('src');\n        const url = parseUrl(src);\n        if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n          fetch(src, 'blob').then(blob => {\n            track.setAttribute('src', window.URL.createObjectURL(blob));\n          }).catch(() => {\n            removeElement(track);\n          });\n        }\n      });\n    }\n\n    // Get and set initial data\n    // The \"preferred\" options are not realized unless / until the wanted language has a match\n    // * languages: Array of user's browser languages.\n    // * language:  The language preferred by user settings or config\n    // * active:    The state preferred by user settings or config\n    // * toggled:   The real captions state\n\n    const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n    const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n    let language = (this.storage.get('language') || this.captions.language || this.config.captions.language || 'auto').toLowerCase();\n\n    // Use first browser language when language is 'auto'\n    if (language === 'auto') {\n      [language] = languages;\n    }\n    let active = this.storage.get('captions') || this.captions.active;\n    if (!is.boolean(active)) {\n      ({\n        active\n      } = this.config.captions);\n    }\n    Object.assign(this.captions, {\n      toggled: false,\n      active,\n      language,\n      languages\n    });\n\n    // Watch changes to textTracks and update captions menu\n    if (this.isHTML5) {\n      const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n      on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n    }\n\n    // Update available languages in list next tick (the event must not be triggered before the listeners)\n    setTimeout(captions.update.bind(this), 0);\n  },\n  // Update available language options in settings based on tracks\n  update() {\n    const tracks = captions.getTracks.call(this, true);\n    // Get the wanted language\n    const {\n      active,\n      language,\n      meta,\n      currentTrackNode\n    } = this.captions;\n    const languageExists = Boolean(tracks.find(track => track.language === language));\n\n    // Handle tracks (add event listener and \"pseudo\"-default)\n    if (this.isHTML5 && this.isVideo) {\n      tracks.filter(track => !meta.get(track)).forEach(track => {\n        this.debug.log('Track added', track);\n\n        // Attempt to store if the original dom element was \"default\"\n        meta.set(track, {\n          default: track.mode === 'showing'\n        });\n\n        // Turn off native caption rendering to avoid double captions\n        // Note: mode='hidden' forces a track to download. To ensure every track\n        // isn't downloaded at once, only 'showing' tracks should be reassigned\n\n        if (track.mode === 'showing') {\n          track.mode = 'hidden';\n        }\n\n        // Add event listener for cue changes\n        on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n      });\n    }\n\n    // Update language first time it matches, or if the previous matching track was removed\n    if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n      captions.setLanguage.call(this, language);\n      captions.toggle.call(this, active && languageExists);\n    }\n\n    // Enable or disable captions based on track length\n    if (this.elements) {\n      toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n    }\n\n    // Update available languages in list\n    if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n      controls.setCaptionsMenu.call(this);\n    }\n  },\n  // Toggle captions display\n  // Used internally for the toggleCaptions method, with the passive option forced to false\n  toggle(input, passive = true) {\n    // If there's no full support\n    if (!this.supported.ui) {\n      return;\n    }\n    const {\n      toggled\n    } = this.captions; // Current state\n    const activeClass = this.config.classNames.captions.active;\n    // Get the next state\n    // If the method is called without parameter, toggle based on current value\n    const active = is.nullOrUndefined(input) ? !toggled : input;\n\n    // Update state and trigger event\n    if (active !== toggled) {\n      // When passive, don't override user preferences\n      if (!passive) {\n        this.captions.active = active;\n        this.storage.set({\n          captions: active\n        });\n      }\n\n      // Force language if the call isn't passive and there is no matching language to toggle to\n      if (!this.language && active && !passive) {\n        const tracks = captions.getTracks.call(this);\n        const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n        // Override user preferences to avoid switching languages if a matching track is added\n        this.captions.language = track.language;\n\n        // Set caption, but don't store in localStorage as user preference\n        captions.set.call(this, tracks.indexOf(track));\n        return;\n      }\n\n      // Toggle button if it's enabled\n      if (this.elements.buttons.captions) {\n        this.elements.buttons.captions.pressed = active;\n      }\n\n      // Add class hook\n      toggleClass(this.elements.container, activeClass, active);\n      this.captions.toggled = active;\n\n      // Update settings menu\n      controls.updateSetting.call(this, 'captions');\n\n      // Trigger event (not used internally)\n      triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n    }\n\n    // Wait for the call stack to clear before setting mode='hidden'\n    // on the active track - forcing the browser to download it\n    setTimeout(() => {\n      if (active && this.captions.toggled) {\n        this.captions.currentTrackNode.mode = 'hidden';\n      }\n    });\n  },\n  // Set captions by track index\n  // Used internally for the currentTrack setter with the passive option forced to false\n  set(index, passive = true) {\n    const tracks = captions.getTracks.call(this);\n\n    // Disable captions if setting to -1\n    if (index === -1) {\n      captions.toggle.call(this, false, passive);\n      return;\n    }\n    if (!is.number(index)) {\n      this.debug.warn('Invalid caption argument', index);\n      return;\n    }\n    if (!(index in tracks)) {\n      this.debug.warn('Track not found', index);\n      return;\n    }\n    if (this.captions.currentTrack !== index) {\n      this.captions.currentTrack = index;\n      const track = tracks[index];\n      const {\n        language\n      } = track || {};\n\n      // Store reference to node for invalidation on remove\n      this.captions.currentTrackNode = track;\n\n      // Update settings menu\n      controls.updateSetting.call(this, 'captions');\n\n      // When passive, don't override user preferences\n      if (!passive) {\n        this.captions.language = language;\n        this.storage.set({\n          language\n        });\n      }\n\n      // Handle Vimeo captions\n      if (this.isVimeo) {\n        // Enable text track but don't render captions within the player\n        // Since we handle that ourselves\n        this.embed.enableTextTrack(language, null, false);\n      }\n\n      // Trigger event\n      triggerEvent.call(this, this.media, 'languagechange');\n    }\n\n    // Show captions\n    captions.toggle.call(this, true, passive);\n    if (this.isHTML5 && this.isVideo) {\n      // If we change the active track while a cue is already displayed we need to update it\n      captions.updateCues.call(this);\n    }\n  },\n  // Set captions by language\n  // Used internally for the language setter with the passive option forced to false\n  setLanguage(input, passive = true) {\n    if (!is.string(input)) {\n      this.debug.warn('Invalid language argument', input);\n      return;\n    }\n    // Normalize\n    const language = input.toLowerCase();\n    this.captions.language = language;\n\n    // Set currentTrack\n    const tracks = captions.getTracks.call(this);\n    const track = captions.findTrack.call(this, [language]);\n    captions.set.call(this, tracks.indexOf(track), passive);\n  },\n  // Get current valid caption tracks\n  // If update is false it will also ignore tracks without metadata\n  // This is used to \"freeze\" the language options when captions.update is false\n  getTracks(update = false) {\n    // Handle media or textTracks missing or null\n    const tracks = Array.from((this.media || {}).textTracks || []);\n    // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n    // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n    return tracks.filter(track => !this.isHTML5 || update || this.captions.meta.has(track)).filter(track => ['captions', 'subtitles'].includes(track.kind));\n  },\n  // Match tracks based on languages and get the first\n  findTrack(languages, force = false) {\n    const tracks = captions.getTracks.call(this);\n    const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n    const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n    let track;\n    languages.every(language => {\n      track = sorted.find(t => t.language === language);\n      return !track; // Break iteration if there is a match\n    });\n\n    // If no match is found but is required, get first\n    return track || (force ? sorted[0] : undefined);\n  },\n  // Get the current track\n  getCurrentTrack() {\n    return captions.getTracks.call(this)[this.currentTrack];\n  },\n  // Get UI label for track\n  getLabel(track) {\n    let currentTrack = track;\n    if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n      currentTrack = captions.getCurrentTrack.call(this);\n    }\n    if (is.track(currentTrack)) {\n      if (!is.empty(currentTrack.label)) {\n        return currentTrack.label;\n      }\n      if (!is.empty(currentTrack.language)) {\n        return track.language.toUpperCase();\n      }\n      return i18n.get('enabled', this.config);\n    }\n    return i18n.get('disabled', this.config);\n  },\n  // Update captions using current track's active cues\n  // Also optional array argument in case there isn't any track (ex: vimeo)\n  updateCues(input) {\n    // Requires UI\n    if (!this.supported.ui) {\n      return;\n    }\n    if (!is.element(this.elements.captions)) {\n      this.debug.warn('No captions element to render to');\n      return;\n    }\n\n    // Only accept array or empty input\n    if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n      this.debug.warn('updateCues: Invalid input', input);\n      return;\n    }\n    let cues = input;\n\n    // Get cues from track\n    if (!cues) {\n      const track = captions.getCurrentTrack.call(this);\n      cues = Array.from((track || {}).activeCues || []).map(cue => cue.getCueAsHTML()).map(getHTML);\n    }\n\n    // Set new caption text\n    const content = cues.map(cueText => cueText.trim()).join('\\n');\n    const changed = content !== this.elements.captions.innerHTML;\n    if (changed) {\n      // Empty the container and create a new child element\n      emptyElement(this.elements.captions);\n      const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n      caption.innerHTML = content;\n      this.elements.captions.appendChild(caption);\n\n      // Trigger event\n      triggerEvent.call(this, this.media, 'cuechange');\n    }\n  }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n  // Disable\n  enabled: true,\n  // Custom media title\n  title: '',\n  // Logging to console\n  debug: false,\n  // Auto play (if supported)\n  autoplay: false,\n  // Only allow one media playing at once (vimeo only)\n  autopause: true,\n  // Allow inline playback on iOS\n  playsinline: true,\n  // Default time to skip when rewind/fast forward\n  seekTime: 10,\n  // Default volume\n  volume: 1,\n  muted: false,\n  // Pass a custom duration\n  duration: null,\n  // Display the media duration on load in the current time position\n  // If you have opted to display both duration and currentTime, this is ignored\n  displayDuration: true,\n  // Invert the current time to be a countdown\n  invertTime: true,\n  // Clicking the currentTime inverts it's value to show time left rather than elapsed\n  toggleInvert: true,\n  // Force an aspect ratio\n  // The format must be `'w:h'` (e.g. `'16:9'`)\n  ratio: null,\n  // Click video container to play/pause\n  clickToPlay: true,\n  // Auto hide the controls\n  hideControls: true,\n  // Reset to start when playback ended\n  resetOnEnd: false,\n  // Disable the standard context menu\n  disableContextMenu: true,\n  // Sprite (for icons)\n  loadSprite: true,\n  iconPrefix: 'plyr',\n  iconUrl: 'https://cdn.plyr.io/3.8.4/plyr.svg',\n  // Blank video (used to prevent errors on source change)\n  blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n  // Quality default\n  quality: {\n    default: 576,\n    // The options to display in the UI, if available for the source media\n    options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n    forced: false,\n    onChange: null\n  },\n  // Set loops\n  loop: {\n    active: false\n    // start: null,\n    // end: null,\n  },\n  // Speed default and options to display\n  speed: {\n    selected: 1,\n    // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n    options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n  },\n  // Keyboard shortcut settings\n  keyboard: {\n    focused: true,\n    global: false\n  },\n  // Display tooltips\n  tooltips: {\n    controls: false,\n    seek: true\n  },\n  // Captions settings\n  captions: {\n    active: false,\n    language: 'auto',\n    // Listen to new tracks added after Plyr is initialized.\n    // This is needed for streaming captions, but may result in unselectable options\n    update: false\n  },\n  // Fullscreen settings\n  fullscreen: {\n    enabled: true,\n    // Allow fullscreen?\n    fallback: true,\n    // Fallback using full viewport/window\n    iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n    // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n    // Non-ancestors of the player element will be ignored\n    // container: null, // defaults to the player element\n  },\n  // Local storage\n  storage: {\n    enabled: true,\n    key: 'plyr'\n  },\n  // Default controls\n  controls: ['play-large',\n  // 'restart',\n  // 'rewind',\n  'play',\n  // 'fast-forward',\n  'progress', 'current-time',\n  // 'duration',\n  'mute', 'volume', 'captions', 'settings', 'pip', 'airplay',\n  // 'download',\n  'fullscreen'],\n  settings: ['captions', 'quality', 'speed'],\n  // Localisation\n  i18n: {\n    restart: 'Restart',\n    rewind: 'Rewind {seektime}s',\n    play: 'Play',\n    pause: 'Pause',\n    fastForward: 'Forward {seektime}s',\n    seek: 'Seek',\n    seekLabel: '{currentTime} of {duration}',\n    played: 'Played',\n    buffered: 'Buffered',\n    currentTime: 'Current time',\n    duration: 'Duration',\n    volume: 'Volume',\n    mute: 'Mute',\n    unmute: 'Unmute',\n    enableCaptions: 'Enable captions',\n    disableCaptions: 'Disable captions',\n    download: 'Download',\n    enterFullscreen: 'Enter fullscreen',\n    exitFullscreen: 'Exit fullscreen',\n    frameTitle: 'Player for {title}',\n    captions: 'Captions',\n    settings: 'Settings',\n    pip: 'PIP',\n    menuBack: 'Go back to previous menu',\n    speed: 'Speed',\n    normal: 'Normal',\n    quality: 'Quality',\n    loop: 'Loop',\n    start: 'Start',\n    end: 'End',\n    all: 'All',\n    reset: 'Reset',\n    disabled: 'Disabled',\n    enabled: 'Enabled',\n    advertisement: 'Ad',\n    qualityBadge: {\n      2160: '4K',\n      1440: 'HD',\n      1080: 'HD',\n      720: 'HD',\n      576: 'SD',\n      480: 'SD'\n    }\n  },\n  // URLs\n  urls: {\n    download: null,\n    vimeo: {\n      sdk: 'https://player.vimeo.com/api/player.js',\n      iframe: 'https://player.vimeo.com/video/{0}?{1}',\n      api: 'https://vimeo.com/api/oembed.json?url={0}'\n    },\n    youtube: {\n      sdk: 'https://www.youtube.com/iframe_api',\n      api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n    },\n    googleIMA: {\n      sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n    }\n  },\n  // Custom control listeners\n  listeners: {\n    seek: null,\n    play: null,\n    pause: null,\n    restart: null,\n    rewind: null,\n    fastForward: null,\n    mute: null,\n    volume: null,\n    captions: null,\n    download: null,\n    fullscreen: null,\n    pip: null,\n    airplay: null,\n    speed: null,\n    quality: null,\n    loop: null,\n    language: null\n  },\n  // Events to watch and bubble\n  events: [\n  // Events to watch on HTML5 media elements and bubble\n  // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n  'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',\n  // Custom events\n  'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',\n  // YouTube\n  'statechange',\n  // Quality\n  'qualitychange',\n  // Ads\n  'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n  // Selectors\n  // Change these to match your template if using custom HTML\n  selectors: {\n    editable: 'input, textarea, select, [contenteditable]',\n    container: '.plyr',\n    controls: {\n      container: null,\n      wrapper: '.plyr__controls'\n    },\n    labels: '[data-plyr]',\n    buttons: {\n      play: '[data-plyr=\"play\"]',\n      pause: '[data-plyr=\"pause\"]',\n      restart: '[data-plyr=\"restart\"]',\n      rewind: '[data-plyr=\"rewind\"]',\n      fastForward: '[data-plyr=\"fast-forward\"]',\n      mute: '[data-plyr=\"mute\"]',\n      captions: '[data-plyr=\"captions\"]',\n      download: '[data-plyr=\"download\"]',\n      fullscreen: '[data-plyr=\"fullscreen\"]',\n      pip: '[data-plyr=\"pip\"]',\n      airplay: '[data-plyr=\"airplay\"]',\n      settings: '[data-plyr=\"settings\"]',\n      loop: '[data-plyr=\"loop\"]'\n    },\n    inputs: {\n      seek: '[data-plyr=\"seek\"]',\n      volume: '[data-plyr=\"volume\"]',\n      speed: '[data-plyr=\"speed\"]',\n      language: '[data-plyr=\"language\"]',\n      quality: '[data-plyr=\"quality\"]'\n    },\n    display: {\n      currentTime: '.plyr__time--current',\n      duration: '.plyr__time--duration',\n      buffer: '.plyr__progress__buffer',\n      loop: '.plyr__progress__loop',\n      // Used later\n      volume: '.plyr__volume--display'\n    },\n    progress: '.plyr__progress',\n    captions: '.plyr__captions',\n    caption: '.plyr__caption'\n  },\n  // Class hooks added to the player in different states\n  classNames: {\n    type: 'plyr--{0}',\n    provider: 'plyr--{0}',\n    video: 'plyr__video-wrapper',\n    embed: 'plyr__video-embed',\n    videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n    embedContainer: 'plyr__video-embed__container',\n    poster: 'plyr__poster',\n    posterEnabled: 'plyr__poster-enabled',\n    ads: 'plyr__ads',\n    control: 'plyr__control',\n    controlPressed: 'plyr__control--pressed',\n    playing: 'plyr--playing',\n    paused: 'plyr--paused',\n    stopped: 'plyr--stopped',\n    loading: 'plyr--loading',\n    hover: 'plyr--hover',\n    tooltip: 'plyr__tooltip',\n    cues: 'plyr__cues',\n    marker: 'plyr__progress__marker',\n    hidden: 'plyr__sr-only',\n    hideControls: 'plyr--hide-controls',\n    isTouch: 'plyr--is-touch',\n    uiSupported: 'plyr--full-ui',\n    noTransition: 'plyr--no-transition',\n    display: {\n      time: 'plyr__time'\n    },\n    menu: {\n      value: 'plyr__menu__value',\n      badge: 'plyr__badge',\n      open: 'plyr--menu-open'\n    },\n    captions: {\n      enabled: 'plyr--captions-enabled',\n      active: 'plyr--captions-active'\n    },\n    fullscreen: {\n      enabled: 'plyr--fullscreen-enabled',\n      fallback: 'plyr--fullscreen-fallback'\n    },\n    pip: {\n      supported: 'plyr--pip-supported',\n      active: 'plyr--pip-active'\n    },\n    airplay: {\n      supported: 'plyr--airplay-supported',\n      active: 'plyr--airplay-active'\n    },\n    previewThumbnails: {\n      // Tooltip thumbs\n      thumbContainer: 'plyr__preview-thumb',\n      thumbContainerShown: 'plyr__preview-thumb--is-shown',\n      imageContainer: 'plyr__preview-thumb__image-container',\n      timeContainer: 'plyr__preview-thumb__time-container',\n      // Scrubbing\n      scrubbingContainer: 'plyr__preview-scrubbing',\n      scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n    }\n  },\n  // Embed attributes\n  attributes: {\n    embed: {\n      provider: 'data-plyr-provider',\n      id: 'data-plyr-embed-id',\n      hash: 'data-plyr-embed-hash'\n    }\n  },\n  // Advertisements plugin\n  // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n  ads: {\n    enabled: false,\n    publisherId: '',\n    tagUrl: ''\n  },\n  // Preview Thumbnails plugin\n  previewThumbnails: {\n    enabled: false,\n    src: '',\n    withCredentials: false\n  },\n  // Vimeo plugin\n  vimeo: {\n    byline: false,\n    portrait: false,\n    title: false,\n    speed: true,\n    transparent: false,\n    // Custom settings from Plyr\n    customControls: true,\n    referrerPolicy: null,\n    // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n    // Whether the owner of the video has a Pro or Business account\n    // (which allows us to properly hide controls without CSS hacks, etc)\n    premium: false\n  },\n  // YouTube plugin\n  youtube: {\n    rel: 0,\n    // No related vids\n    showinfo: 0,\n    // Hide info\n    iv_load_policy: 3,\n    // Hide annotations\n    modestbranding: 1,\n    // Hide logos as much as possible (they still show one in the corner when paused)\n    // Custom settings from Plyr\n    customControls: true,\n    noCookie: false // Whether to use an alternative version of YouTube without cookies\n  },\n  // Media Metadata\n  mediaMetadata: {\n    title: '',\n    artist: '',\n    album: '',\n    artwork: []\n  },\n  // Markers\n  markers: {\n    enabled: false,\n    points: []\n  }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nconst pip = {\n  active: 'picture-in-picture',\n  inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nconst providers = {\n  html5: 'html5',\n  youtube: 'youtube',\n  vimeo: 'vimeo'\n};\nconst types = {\n  audio: 'audio',\n  video: 'video'\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nfunction getProviderByUrl(url) {\n  // YouTube\n  if (/^(?:https?:\\/\\/)?(?:www\\.)?(?:youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n    return providers.youtube;\n  }\n\n  // Vimeo\n  if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n    return providers.vimeo;\n  }\n  return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nfunction noop() {}\nclass Console {\n  constructor(enabled = false) {\n    this.enabled = window.console && enabled;\n    if (this.enabled) {\n      this.log('Debugging enabled');\n    }\n  }\n  get log() {\n    // eslint-disable-next-line no-console\n    return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n  }\n  get warn() {\n    return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n  }\n  get error() {\n    return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n  }\n}\n\nclass Fullscreen {\n  constructor(player) {\n    _defineProperty$1(this, \"onChange\", () => {\n      if (!this.supported) return;\n\n      // Update toggle button\n      const button = this.player.elements.buttons.fullscreen;\n      if (is.element(button)) {\n        button.pressed = this.active;\n      }\n\n      // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n      const target = this.target === this.player.media ? this.target : this.player.elements.container;\n      // Trigger an event\n      triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n    });\n    _defineProperty$1(this, \"toggleFallback\", (toggle = false) => {\n      // Store or restore scroll position\n      if (toggle) {\n        var _window$scrollX, _window$scrollY;\n        this.scrollPosition = {\n          x: (_window$scrollX = window.scrollX) !== null && _window$scrollX !== void 0 ? _window$scrollX : 0,\n          y: (_window$scrollY = window.scrollY) !== null && _window$scrollY !== void 0 ? _window$scrollY : 0\n        };\n      } else {\n        window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n      }\n\n      // Toggle scroll\n      document.body.style.overflow = toggle ? 'hidden' : '';\n\n      // Toggle class hook\n      toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n      // Force full viewport on iPhone X+\n      if (browser.isIos) {\n        let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n        const property = 'viewport-fit=cover';\n\n        // Inject the viewport meta if required\n        if (!viewport) {\n          viewport = document.createElement('meta');\n          viewport.setAttribute('name', 'viewport');\n        }\n\n        // Check if the property already exists\n        const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n        if (toggle) {\n          this.cleanupViewport = !hasProperty;\n          if (!hasProperty) viewport.content += `,${property}`;\n        } else if (this.cleanupViewport) {\n          viewport.content = viewport.content.split(',').filter(part => part.trim() !== property).join(',');\n        }\n      }\n\n      // Toggle button and fire events\n      this.onChange();\n    });\n    // Trap focus inside container\n    _defineProperty$1(this, \"trapFocus\", event => {\n      // Bail if iOS/iPadOS, not active, not the tab key\n      if (browser.isIos || browser.isIPadOS || !this.active || event.key !== 'Tab') return;\n\n      // Get the current focused element\n      const focused = document.activeElement;\n      const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n      const [first] = focusable;\n      const last = focusable[focusable.length - 1];\n      if (focused === last && !event.shiftKey) {\n        // Move focus to first element that can be tabbed if Shift isn't used\n        first.focus();\n        event.preventDefault();\n      } else if (focused === first && event.shiftKey) {\n        // Move focus to last element that can be tabbed if Shift is used\n        last.focus();\n        event.preventDefault();\n      }\n    });\n    // Update UI\n    _defineProperty$1(this, \"update\", () => {\n      if (this.supported) {\n        let mode;\n        if (this.forceFallback) mode = 'Fallback (forced)';else if (Fullscreen.nativeSupported) mode = 'Native';else mode = 'Fallback';\n        this.player.debug.log(`${mode} fullscreen enabled`);\n      } else {\n        this.player.debug.log('Fullscreen not supported and fallback disabled');\n      }\n\n      // Add styling hook to show button\n      toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);\n    });\n    // Make an element fullscreen\n    _defineProperty$1(this, \"enter\", () => {\n      if (!this.supported) return;\n\n      // iOS native fullscreen doesn't need the request step\n      if (browser.isIos && this.player.config.fullscreen.iosNative) {\n        if (this.player.isVimeo) {\n          this.player.embed.requestFullscreen();\n        } else {\n          this.target.webkitEnterFullscreen();\n        }\n      } else if (!Fullscreen.nativeSupported || this.forceFallback) {\n        this.toggleFallback(true);\n      } else if (!this.prefix) {\n        this.target.requestFullscreen({\n          navigationUI: 'hide'\n        });\n      } else if (!is.empty(this.prefix)) {\n        this.target[`${this.prefix}Request${this.property}`]();\n      }\n    });\n    // Bail from fullscreen\n    _defineProperty$1(this, \"exit\", () => {\n      if (!this.supported) return;\n\n      // iOS native fullscreen\n      if (browser.isIos && this.player.config.fullscreen.iosNative) {\n        if (this.player.isVimeo) {\n          this.player.embed.exitFullscreen();\n        } else {\n          this.target.webkitEnterFullscreen();\n        }\n        silencePromise(this.player.play());\n      } else if (!Fullscreen.nativeSupported || this.forceFallback) {\n        this.toggleFallback(false);\n      } else if (!this.prefix) {\n        (document.cancelFullScreen || document.exitFullscreen).call(document);\n      } else if (!is.empty(this.prefix)) {\n        const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n        document[`${this.prefix}${action}${this.property}`]();\n      }\n    });\n    // Toggle state\n    _defineProperty$1(this, \"toggle\", () => {\n      if (!this.active) this.enter();else this.exit();\n    });\n    // Keep reference to parent\n    this.player = player;\n\n    // Get prefix\n    this.prefix = Fullscreen.prefix;\n    this.property = Fullscreen.property;\n\n    // Scroll position\n    this.scrollPosition = {\n      x: 0,\n      y: 0\n    };\n\n    // Force the use of 'full window/browser' rather than fullscreen\n    this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n    // Get the fullscreen element\n    // Checks container is an ancestor, defaults to null\n    this.player.elements.fullscreen = player.config.fullscreen.container && closest$1(this.player.elements.container, player.config.fullscreen.container);\n\n    // Register event listeners\n    // Handle event (incase user presses escape etc)\n    on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n      // TODO: Filter for target??\n      this.onChange();\n    });\n\n    // Fullscreen toggle on double click\n    on.call(this.player, this.player.elements.container, 'dblclick', event => {\n      // Ignore double click in controls\n      if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n        return;\n      }\n      this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n    });\n\n    // Tap focus when in fullscreen\n    on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n    // Update the UI\n    this.update();\n  }\n\n  // Determine if native supported\n  static get nativeSupported() {\n    return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n  }\n\n  // If we're actually using native\n  get useNative() {\n    return Fullscreen.nativeSupported && !this.forceFallback;\n  }\n\n  // Get the prefix for handlers\n  static get prefix() {\n    // No prefix\n    if (is.function(document.exitFullscreen)) return '';\n\n    // Check for fullscreen support by vendor prefix\n    let value = '';\n    const prefixes = ['webkit', 'moz', 'ms'];\n    prefixes.some(pre => {\n      if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n        value = pre;\n        return true;\n      }\n      return false;\n    });\n    return value;\n  }\n  static get property() {\n    return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n  }\n\n  // Determine if fullscreen is supported\n  get supported() {\n    return [\n    // Fullscreen is enabled in config\n    this.player.config.fullscreen.enabled,\n    // Must be a video\n    this.player.isVideo,\n    // Either native is supported or fallback enabled\n    Fullscreen.nativeSupported || this.player.config.fullscreen.fallback,\n    // YouTube has no way to trigger fullscreen, so on devices with no native support, playsinline\n    // must be enabled and iosNative fullscreen must be disabled to offer the fullscreen fallback\n    !this.player.isYouTube || Fullscreen.nativeSupported || !browser.isIos || this.player.config.playsinline && !this.player.config.fullscreen.iosNative].every(Boolean);\n  }\n\n  // Get active state\n  get active() {\n    if (!this.supported) return false;\n\n    // Fallback using classname\n    if (!Fullscreen.nativeSupported || this.forceFallback) {\n      return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n    }\n    const element = !this.prefix ? this.target.getRootNode().fullscreenElement : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n    return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n  }\n\n  // Get target element\n  get target() {\n    var _this$player$elements;\n    return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : (_this$player$elements = this.player.elements.fullscreen) !== null && _this$player$elements !== void 0 ? _this$player$elements : this.player.elements.container;\n  }\n}\n\n// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nfunction loadImage(src, minWidth = 1) {\n  return new Promise((resolve, reject) => {\n    const image = new Image();\n    const handler = () => {\n      delete image.onload;\n      delete image.onerror;\n      (image.naturalWidth >= minWidth ? resolve : reject)(image);\n    };\n    Object.assign(image, {\n      onload: handler,\n      onerror: handler,\n      src\n    });\n  });\n}\n\n// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nconst ui = {\n  addStyleHook() {\n    toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n    toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n  },\n  // Toggle native HTML5 media controls\n  toggleNativeControls(toggle = false) {\n    if (toggle && this.isHTML5) {\n      this.media.setAttribute('controls', '');\n    } else {\n      this.media.removeAttribute('controls');\n    }\n  },\n  // Setup the UI\n  build() {\n    // Re-attach media element listeners\n    // TODO: Use event bubbling?\n    this.listeners.media();\n\n    // Don't setup interface if no support\n    if (!this.supported.ui) {\n      this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n      // Restore native controls\n      ui.toggleNativeControls.call(this, true);\n\n      // Bail\n      return;\n    }\n\n    // Inject custom controls if not present\n    if (!is.element(this.elements.controls)) {\n      // Inject custom controls\n      controls.inject.call(this);\n\n      // Re-attach control listeners\n      this.listeners.controls();\n    }\n\n    // Remove native controls\n    ui.toggleNativeControls.call(this);\n\n    // Setup captions for HTML5\n    if (this.isHTML5) {\n      captions.setup.call(this);\n    }\n\n    // Reset volume\n    this.volume = null;\n\n    // Reset mute state\n    this.muted = null;\n\n    // Reset loop state\n    this.loop = null;\n\n    // Reset quality setting\n    this.quality = null;\n\n    // Reset speed\n    this.speed = null;\n\n    // Reset volume display\n    controls.updateVolume.call(this);\n\n    // Reset time display\n    controls.timeUpdate.call(this);\n\n    // Reset duration display\n    controls.durationUpdate.call(this);\n\n    // Update the UI\n    ui.checkPlaying.call(this);\n\n    // Check for picture-in-picture support\n    toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n    // Check for airplay support\n    toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n    // Add touch class\n    toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n    // Ready for API calls\n    this.ready = true;\n\n    // Ready event at end of execution stack\n    setTimeout(() => {\n      triggerEvent.call(this, this.media, 'ready');\n    }, 0);\n\n    // Set the title\n    ui.setTitle.call(this);\n\n    // Assure the poster image is set, if the property was added before the element was created\n    if (this.poster) {\n      ui.setPoster.call(this, this.poster, false).catch(() => {});\n    }\n\n    // Manually set the duration if user has overridden it.\n    // The event listeners for it doesn't get called if preload is disabled (#701)\n    if (this.config.duration) {\n      controls.durationUpdate.call(this);\n    }\n\n    // Media metadata\n    if (this.config.mediaMetadata) {\n      controls.setMediaMetadata.call(this);\n    }\n  },\n  // Setup aria attribute for play and iframe title\n  setTitle() {\n    // Find the current text\n    let label = i18n.get('play', this.config);\n\n    // If there's a media title set, use that for the label\n    if (is.string(this.config.title) && !is.empty(this.config.title)) {\n      label += `, ${this.config.title}`;\n    }\n\n    // If there's a play button, set label\n    Array.from(this.elements.buttons.play || []).forEach(button => {\n      button.setAttribute('aria-label', label);\n    });\n\n    // Set iframe title\n    // https://github.com/sampotts/plyr/issues/124\n    if (this.isEmbed) {\n      const iframe = getElement.call(this, 'iframe');\n      if (!is.element(iframe)) {\n        return;\n      }\n\n      // Default to media type\n      const title = !is.empty(this.config.title) ? this.config.title : 'video';\n      const format = i18n.get('frameTitle', this.config);\n      iframe.setAttribute('title', format.replace('{title}', title));\n    }\n  },\n  // Toggle poster\n  togglePoster(enable) {\n    toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n  },\n  // Set the poster image (async)\n  // Used internally for the poster setter, with the passive option forced to false\n  setPoster(poster, passive = true) {\n    // Don't override if call is passive\n    if (passive && this.poster) {\n      return Promise.reject(new Error('Poster already set'));\n    }\n\n    // Set property synchronously to respect the call order\n    this.media.setAttribute('data-poster', poster);\n\n    // Show the poster\n    this.elements.poster.removeAttribute('hidden');\n\n    // Wait until ui is ready\n    return ready.call(this)\n    // Load image\n    .then(() => loadImage(poster)).catch(error => {\n      // Hide poster on error unless it's been set by another call\n      if (poster === this.poster) {\n        ui.togglePoster.call(this, false);\n      }\n      // Rethrow\n      throw error;\n    }).then(() => {\n      // Prevent race conditions\n      if (poster !== this.poster) {\n        throw new Error('setPoster cancelled by later call to setPoster');\n      }\n    }).then(() => {\n      Object.assign(this.elements.poster.style, {\n        backgroundImage: `url('${poster}')`,\n        // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n        backgroundSize: ''\n      });\n      ui.togglePoster.call(this, true);\n      return poster;\n    });\n  },\n  // Check playing state\n  checkPlaying(event) {\n    // Class hooks\n    toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n    toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n    toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n    // Set state\n    Array.from(this.elements.buttons.play || []).forEach(target => {\n      Object.assign(target, {\n        pressed: this.playing\n      });\n      target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n    });\n\n    // Only update controls on non timeupdate events\n    if (is.event(event) && event.type === 'timeupdate') {\n      return;\n    }\n\n    // Toggle controls\n    ui.toggleControls.call(this);\n  },\n  // Check if media is loading\n  checkLoading(event) {\n    this.loading = ['stalled', 'waiting'].includes(event.type);\n\n    // Clear timer\n    clearTimeout(this.timers.loading);\n\n    // Timer to prevent flicker when seeking\n    this.timers.loading = setTimeout(() => {\n      // Update progress bar loading class state\n      toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n      // Update controls visibility\n      ui.toggleControls.call(this);\n    }, this.loading ? 250 : 0);\n  },\n  // Toggle controls based on state and `force` argument\n  toggleControls(force) {\n    const {\n      controls: controlsElement\n    } = this.elements;\n    if (controlsElement && this.config.hideControls) {\n      // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n      const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n      // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n      this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n    }\n  },\n  // Migrate any custom properties from the media to the parent\n  migrateStyles() {\n    // Loop through values (as they are the keys when the object is spread \uD83E\uDD14)\n    Object.values({\n      ...this.media.style\n    })\n    // We're only fussed about Plyr specific properties\n    .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr')).forEach(key => {\n      // Set on the container\n      this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n      // Clean up from media element\n      this.media.style.removeProperty(key);\n    });\n\n    // Remove attribute if empty\n    if (is.empty(this.media.style)) {\n      this.media.removeAttribute('style');\n    }\n  }\n};\n\nclass Listeners {\n  constructor(_player) {\n    // Device is touch enabled\n    _defineProperty$1(this, \"firstTouch\", () => {\n      const {\n        player\n      } = this;\n      const {\n        elements\n      } = player;\n      player.touch = true;\n\n      // Add touch class\n      toggleClass(elements.container, player.config.classNames.isTouch, true);\n    });\n    // Global window & document listeners\n    _defineProperty$1(this, \"global\", (toggle = true) => {\n      const {\n        player\n      } = this;\n\n      // Keyboard shortcuts\n      if (player.config.keyboard.global) {\n        toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n      }\n\n      // Click anywhere closes menu\n      toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n      // Detect touch by events\n      once.call(player, document.body, 'touchstart', this.firstTouch);\n    });\n    // Container listeners\n    _defineProperty$1(this, \"container\", () => {\n      const {\n        player\n      } = this;\n      const {\n        config,\n        elements,\n        timers\n      } = player;\n\n      // Keyboard shortcuts\n      if (!config.keyboard.global && config.keyboard.focused) {\n        on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n      }\n\n      // Toggle controls on mouse events and entering fullscreen\n      on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n        const {\n          controls: controlsElement\n        } = elements;\n\n        // Remove button states for fullscreen\n        if (controlsElement && event.type === 'enterfullscreen') {\n          controlsElement.pressed = false;\n          controlsElement.hover = false;\n        }\n\n        // Show, then hide after a timeout unless another control event occurs\n        const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n        let delay = 0;\n        if (show) {\n          ui.toggleControls.call(player, true);\n          // Use longer timeout for touch devices\n          delay = player.touch ? 3000 : 2000;\n        }\n\n        // Clear timer\n        clearTimeout(timers.controls);\n\n        // Set new timer to prevent flicker when seeking\n        timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n      });\n\n      // Set a gutter for Vimeo\n      const setGutter = () => {\n        if (!player.isVimeo || player.config.vimeo.premium) {\n          return;\n        }\n        const target = elements.wrapper;\n        const {\n          active\n        } = player.fullscreen;\n        const [videoWidth, videoHeight] = getAspectRatio.call(player);\n        const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n        // If not active, remove styles\n        if (!active) {\n          if (useNativeAspectRatio) {\n            target.style.width = null;\n            target.style.height = null;\n          } else {\n            target.style.maxWidth = null;\n            target.style.margin = null;\n          }\n          return;\n        }\n\n        // Determine which dimension will overflow and constrain view\n        const [viewportWidth, viewportHeight] = getViewportSize();\n        const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n        if (useNativeAspectRatio) {\n          target.style.width = overflow ? 'auto' : '100%';\n          target.style.height = overflow ? '100%' : 'auto';\n        } else {\n          target.style.maxWidth = overflow ? `${viewportHeight / videoHeight * videoWidth}px` : null;\n          target.style.margin = overflow ? '0 auto' : null;\n        }\n      };\n\n      // Handle resizing\n      const resized = () => {\n        clearTimeout(timers.resized);\n        timers.resized = setTimeout(setGutter, 50);\n      };\n      on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n        const {\n          target\n        } = player.fullscreen;\n\n        // Ignore events not from target\n        if (target !== elements.container) {\n          return;\n        }\n\n        // If it's not an embed and no ratio specified\n        if (!player.isEmbed && is.empty(player.config.ratio)) {\n          return;\n        }\n\n        // Set Vimeo gutter\n        setGutter();\n\n        // Watch for resizes\n        const method = event.type === 'enterfullscreen' ? on : off;\n        method.call(player, window, 'resize', resized);\n      });\n    });\n    // Listen for media events\n    _defineProperty$1(this, \"media\", () => {\n      const {\n        player\n      } = this;\n      const {\n        elements\n      } = player;\n\n      // Time change on media\n      on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n      // Display duration\n      on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(player, event));\n\n      // Handle the media finishing\n      on.call(player, player.media, 'ended', () => {\n        // Show poster on end\n        if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n          // Restart\n          player.restart();\n\n          // Call pause otherwise IE11 will start playing the video again\n          player.pause();\n        }\n      });\n\n      // Check for buffer progress\n      on.call(player, player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(player, event));\n\n      // Handle volume changes\n      on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n      // Handle play/pause\n      on.call(player, player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(player, event));\n\n      // Loading state\n      on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n      // Click video\n      if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n        // Re-fetch the wrapper\n        const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n        // Bail if there's no wrapper (this should never happen)\n        if (!is.element(wrapper)) {\n          return;\n        }\n\n        // On click play, pause or restart\n        on.call(player, elements.container, 'click', event => {\n          const targets = [elements.container, wrapper];\n\n          // Ignore if click if not container or in video wrapper\n          if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n            return;\n          }\n\n          // Touch devices will just show controls (if hidden)\n          if (player.touch && player.config.hideControls) {\n            return;\n          }\n          if (player.ended) {\n            this.proxy(event, player.restart, 'restart');\n            this.proxy(event, () => {\n              silencePromise(player.play());\n            }, 'play');\n          } else {\n            this.proxy(event, () => {\n              silencePromise(player.togglePlay());\n            }, 'play');\n          }\n        });\n      }\n\n      // Disable right click\n      if (player.supported.ui && player.config.disableContextMenu) {\n        on.call(player, elements.wrapper, 'contextmenu', event => {\n          event.preventDefault();\n        }, false);\n      }\n\n      // Volume change\n      on.call(player, player.media, 'volumechange', () => {\n        // Save to storage\n        player.storage.set({\n          volume: player.volume,\n          muted: player.muted\n        });\n      });\n\n      // Speed change\n      on.call(player, player.media, 'ratechange', () => {\n        // Update UI\n        controls.updateSetting.call(player, 'speed');\n\n        // Save to storage\n        player.storage.set({\n          speed: player.speed\n        });\n      });\n\n      // Quality change\n      on.call(player, player.media, 'qualitychange', event => {\n        // Update UI\n        controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n      });\n\n      // Update download link when ready and if quality changes\n      on.call(player, player.media, 'ready qualitychange', () => {\n        controls.setDownloadUrl.call(player);\n      });\n\n      // Proxy events to container\n      // Bubble up key events for Edge\n      const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n      on.call(player, player.media, proxyEvents, event => {\n        let {\n          detail = {}\n        } = event;\n\n        // Get error details from media\n        if (event.type === 'error') {\n          detail = player.media.error;\n        }\n        triggerEvent.call(player, elements.container, event.type, true, detail);\n      });\n    });\n    // Run default and custom handlers\n    _defineProperty$1(this, \"proxy\", (event, defaultHandler, customHandlerKey) => {\n      const {\n        player\n      } = this;\n      const customHandler = player.config.listeners[customHandlerKey];\n      const hasCustomHandler = is.function(customHandler);\n      let returned = true;\n\n      // Execute custom handler\n      if (hasCustomHandler) {\n        returned = customHandler.call(player, event);\n      }\n\n      // Only call default handler if not prevented in custom handler\n      if (returned !== false && is.function(defaultHandler)) {\n        defaultHandler.call(player, event);\n      }\n    });\n    // Trigger custom and default handlers\n    _defineProperty$1(this, \"bind\", (element, type, defaultHandler, customHandlerKey, passive = true) => {\n      const {\n        player\n      } = this;\n      const customHandler = player.config.listeners[customHandlerKey];\n      const hasCustomHandler = is.function(customHandler);\n      on.call(player, element, type, event => this.proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n    });\n    // Listen for control events\n    _defineProperty$1(this, \"controls\", () => {\n      const {\n        player\n      } = this;\n      const {\n        elements\n      } = player;\n      // IE doesn't support input event, so we fallback to change\n      const inputEvent = browser.isIE ? 'change' : 'input';\n\n      // Play/pause toggle\n      if (elements.buttons.play) {\n        Array.from(elements.buttons.play).forEach(button => {\n          this.bind(button, 'click', () => {\n            silencePromise(player.togglePlay());\n          }, 'play');\n        });\n      }\n\n      // Pause\n      this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n      // Rewind\n      this.bind(elements.buttons.rewind, 'click', () => {\n        // Record seek time so we can prevent hiding controls for a few seconds after rewind\n        player.lastSeekTime = Date.now();\n        player.rewind();\n      }, 'rewind');\n\n      // Rewind\n      this.bind(elements.buttons.fastForward, 'click', () => {\n        // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n        player.lastSeekTime = Date.now();\n        player.forward();\n      }, 'fastForward');\n\n      // Mute toggle\n      this.bind(elements.buttons.mute, 'click', () => {\n        player.muted = !player.muted;\n      }, 'mute');\n\n      // Captions toggle\n      this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n      // Download\n      this.bind(elements.buttons.download, 'click', () => {\n        triggerEvent.call(player, player.media, 'download');\n      }, 'download');\n\n      // Fullscreen toggle\n      this.bind(elements.buttons.fullscreen, 'click', () => {\n        player.fullscreen.toggle();\n      }, 'fullscreen');\n\n      // Picture-in-Picture\n      this.bind(elements.buttons.pip, 'click', () => {\n        player.pip = 'toggle';\n      }, 'pip');\n\n      // Airplay\n      this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n      // Settings menu - click toggle\n      this.bind(elements.buttons.settings, 'click', event => {\n        // Prevent the document click listener closing the menu\n        event.stopPropagation();\n        event.preventDefault();\n        controls.toggleMenu.call(player, event);\n      }, null, false); // Can't be passive as we're preventing default\n\n      // Settings menu - keyboard toggle\n      // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n      this.bind(elements.buttons.settings, 'keyup', event => {\n        if (![' ', 'Enter'].includes(event.key)) {\n          return;\n        }\n\n        // Because return triggers a click anyway, all we need to do is set focus\n        if (event.key === 'Enter') {\n          controls.focusFirstMenuItem.call(player, null, true);\n          return;\n        }\n\n        // Prevent scroll\n        event.preventDefault();\n\n        // Prevent playing video (Firefox)\n        event.stopPropagation();\n\n        // Toggle menu\n        controls.toggleMenu.call(player, event);\n      }, null, false // Can't be passive as we're preventing default\n      );\n\n      // Escape closes menu\n      this.bind(elements.settings.menu, 'keydown', event => {\n        if (event.key === 'Escape') {\n          controls.toggleMenu.call(player, event);\n        }\n      });\n\n      // Set range input alternative \"value\", which matches the tooltip time (#954)\n      this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n        const rect = elements.progress.getBoundingClientRect();\n        const scrollLeft = event.pageX - event.clientX;\n        const percent = 100 / rect.width * (event.pageX - rect.left - scrollLeft);\n        event.currentTarget.setAttribute('seek-value', percent);\n      });\n\n      // Pause while seeking\n      this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n        const seek = event.currentTarget;\n        const attribute = 'play-on-seeked';\n        if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n          return;\n        }\n\n        // Record seek time so we can prevent hiding controls for a few seconds after seek\n        player.lastSeekTime = Date.now();\n\n        // Was playing before?\n        const play = seek.hasAttribute(attribute);\n        // Done seeking\n        const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n        // If we're done seeking and it was playing, resume playback\n        if (play && done) {\n          seek.removeAttribute(attribute);\n          silencePromise(player.play());\n        } else if (!done && player.playing) {\n          seek.setAttribute(attribute, '');\n          player.pause();\n        }\n      });\n\n      // Fix range inputs on iOS\n      // Super weird iOS bug where after you interact with an <input type=\"range\">,\n      // it takes over further interactions on the page. This is a hack\n      if (browser.isIos) {\n        const inputs = getElements.call(player, 'input[type=\"range\"]');\n        Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n      }\n\n      // Seek\n      this.bind(elements.inputs.seek, inputEvent, event => {\n        const seek = event.currentTarget;\n        // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n        let seekTo = seek.getAttribute('seek-value');\n        if (is.empty(seekTo)) {\n          seekTo = seek.value;\n        }\n        seek.removeAttribute('seek-value');\n        player.currentTime = seekTo / seek.max * player.duration;\n      }, 'seek');\n\n      // Seek tooltip\n      this.bind(elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(player, event));\n\n      // Preview thumbnails plugin\n      // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n      this.bind(elements.progress, 'mousemove touchmove', event => {\n        const {\n          previewThumbnails\n        } = player;\n        if (previewThumbnails && previewThumbnails.loaded) {\n          previewThumbnails.startMove(event);\n        }\n      });\n\n      // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n      this.bind(elements.progress, 'mouseleave touchend click', () => {\n        const {\n          previewThumbnails\n        } = player;\n        if (previewThumbnails && previewThumbnails.loaded) {\n          previewThumbnails.endMove(false, true);\n        }\n      });\n\n      // Show scrubbing preview\n      this.bind(elements.progress, 'mousedown touchstart', event => {\n        const {\n          previewThumbnails\n        } = player;\n        if (previewThumbnails && previewThumbnails.loaded) {\n          previewThumbnails.startScrubbing(event);\n        }\n      });\n      this.bind(elements.progress, 'mouseup touchend', event => {\n        const {\n          previewThumbnails\n        } = player;\n        if (previewThumbnails && previewThumbnails.loaded) {\n          previewThumbnails.endScrubbing(event);\n        }\n      });\n\n      // Polyfill for lower fill in <input type=\"range\"> for webkit\n      if (browser.isWebKit) {\n        Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n          this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n        });\n      }\n\n      // Current time invert\n      // Only if one time element is used for both currentTime and duration\n      if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n        this.bind(elements.display.currentTime, 'click', () => {\n          // Do nothing if we're at the start\n          if (player.currentTime === 0) {\n            return;\n          }\n          player.config.invertTime = !player.config.invertTime;\n          controls.timeUpdate.call(player);\n        });\n      }\n\n      // Volume\n      this.bind(elements.inputs.volume, inputEvent, event => {\n        player.volume = event.target.value;\n      }, 'volume');\n\n      // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n      this.bind(elements.controls, 'mouseenter mouseleave', event => {\n        elements.controls.hover = !player.touch && event.type === 'mouseenter';\n      });\n\n      // Also update controls.hover state for any non-player children of fullscreen element (as above)\n      if (elements.fullscreen) {\n        Array.from(elements.fullscreen.children).filter(c => !c.contains(elements.container)).forEach(child => {\n          this.bind(child, 'mouseenter mouseleave', event => {\n            if (elements.controls) {\n              elements.controls.hover = !player.touch && event.type === 'mouseenter';\n            }\n          });\n        });\n      }\n\n      // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n      this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n        elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n      });\n\n      // Show controls when they receive focus (e.g., when using keyboard tab key)\n      this.bind(elements.controls, 'focusin', () => {\n        const {\n          config,\n          timers\n        } = player;\n\n        // Skip transition to prevent focus from scrolling the parent element\n        toggleClass(elements.controls, config.classNames.noTransition, true);\n\n        // Toggle\n        ui.toggleControls.call(player, true);\n\n        // Restore transition\n        setTimeout(() => {\n          toggleClass(elements.controls, config.classNames.noTransition, false);\n        }, 0);\n\n        // Delay a little more for mouse users\n        const delay = this.touch ? 3000 : 4000;\n\n        // Clear timer\n        clearTimeout(timers.controls);\n\n        // Hide again after delay\n        timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n      });\n\n      // Mouse wheel for volume\n      this.bind(elements.inputs.volume, 'wheel', event => {\n        // Detect \"natural\" scroll - supported on OS X Safari only\n        // Other browsers on OS X will be inverted until support improves\n        const inverted = event.webkitDirectionInvertedFromDevice;\n        // Get delta from event. Invert if `inverted` is true\n        const [x, y] = [event.deltaX, -event.deltaY].map(value => inverted ? -value : value);\n        // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n        const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n        // Change the volume by 2%\n        player.increaseVolume(direction / 50);\n\n        // Don't break page scrolling at max and min\n        const {\n          volume\n        } = player.media;\n        if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n          event.preventDefault();\n        }\n      }, 'volume', false);\n    });\n    this.player = _player;\n    this.lastKey = null;\n    this.focusTimer = null;\n    this.lastKeyDown = null;\n    this.handleKey = this.handleKey.bind(this);\n    this.toggleMenu = this.toggleMenu.bind(this);\n    this.firstTouch = this.firstTouch.bind(this);\n  }\n\n  // Handle key presses\n  handleKey(event) {\n    const {\n      player\n    } = this;\n    const {\n      elements\n    } = player;\n    const {\n      key,\n      type,\n      altKey,\n      ctrlKey,\n      metaKey,\n      shiftKey\n    } = event;\n    const pressed = type === 'keydown';\n    const repeat = pressed && key === this.lastKey;\n\n    // Bail if a modifier key is set\n    if (altKey || ctrlKey || metaKey || shiftKey) {\n      return;\n    }\n\n    // If the event is bubbled from the media element\n    // Firefox doesn't get the key for whatever reason\n    if (!key) {\n      return;\n    }\n\n    // Seek by increment\n    const seekByIncrement = increment => {\n      // Divide the max duration into 10th's and times by the number value\n      player.currentTime = player.duration / 10 * increment;\n    };\n\n    // Handle the key on keydown\n    // Reset on keyup\n    if (pressed) {\n      // Check focused element\n      // and if the focused element is not editable (e.g. text input)\n      // and any that accept key input http://webaim.org/techniques/keyboard/\n      const focused = document.activeElement;\n      if (is.element(focused)) {\n        const {\n          editable\n        } = player.config.selectors;\n        const {\n          seek\n        } = elements.inputs;\n        if (focused !== seek && matches(focused, editable)) {\n          return;\n        }\n        if (event.key === ' ' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n          return;\n        }\n      }\n\n      // Which keys should we prevent default\n      const preventDefault = [' ', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];\n\n      // If the key is found prevent default (e.g. prevent scrolling for arrows)\n      if (preventDefault.includes(key)) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n      switch (key) {\n        case '0':\n        case '1':\n        case '2':\n        case '3':\n        case '4':\n        case '5':\n        case '6':\n        case '7':\n        case '8':\n        case '9':\n          if (!repeat) {\n            seekByIncrement(Number.parseInt(key, 10));\n          }\n          break;\n        case ' ':\n        case 'k':\n          if (!repeat) {\n            silencePromise(player.togglePlay());\n          }\n          break;\n        case 'ArrowUp':\n          player.increaseVolume(0.1);\n          break;\n        case 'ArrowDown':\n          player.decreaseVolume(0.1);\n          break;\n        case 'm':\n          if (!repeat) {\n            player.muted = !player.muted;\n          }\n          break;\n        case 'ArrowRight':\n          player.forward();\n          break;\n        case 'ArrowLeft':\n          player.rewind();\n          break;\n        case 'f':\n          player.fullscreen.toggle();\n          break;\n        case 'c':\n          if (!repeat) {\n            player.toggleCaptions();\n          }\n          break;\n        case 'l':\n          player.loop = !player.loop;\n          break;\n      }\n\n      // Escape is handle natively when in full screen\n      // So we only need to worry about non native\n      if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n        player.fullscreen.toggle();\n      }\n\n      // Store last key for next cycle\n      this.lastKey = key;\n    } else {\n      this.lastKey = null;\n    }\n  }\n\n  // Toggle menu\n  toggleMenu(event) {\n    controls.toggleMenu.call(this.player, event);\n  }\n}\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar loadjs_umd$1 = {exports: {}};\n\nvar loadjs_umd = loadjs_umd$1.exports;\nvar hasRequiredLoadjs_umd;\nfunction requireLoadjs_umd() {\n  if (hasRequiredLoadjs_umd) return loadjs_umd$1.exports;\n  hasRequiredLoadjs_umd = 1;\n  (function (module, exports) {\n    (function (root, factory) {\n      {\n        module.exports = factory();\n      }\n    })(loadjs_umd, function () {\n      /**\n       * Global dependencies.\n       * @global {Object} document - DOM\n       */\n\n      var devnull = function () {},\n        bundleIdCache = {},\n        bundleResultCache = {},\n        bundleCallbackQueue = {};\n\n      /**\n       * Subscribe to bundle load event.\n       * @param {string[]} bundleIds - Bundle ids\n       * @param {Function} callbackFn - The callback function\n       */\n      function subscribe(bundleIds, callbackFn) {\n        // listify\n        bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n        var depsNotFound = [],\n          i = bundleIds.length,\n          numWaiting = i,\n          fn,\n          bundleId,\n          r,\n          q;\n\n        // define callback function\n        fn = function (bundleId, pathsNotFound) {\n          if (pathsNotFound.length) depsNotFound.push(bundleId);\n          numWaiting--;\n          if (!numWaiting) callbackFn(depsNotFound);\n        };\n\n        // register callback\n        while (i--) {\n          bundleId = bundleIds[i];\n\n          // execute callback if in result cache\n          r = bundleResultCache[bundleId];\n          if (r) {\n            fn(bundleId, r);\n            continue;\n          }\n\n          // add to callback queue\n          q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n          q.push(fn);\n        }\n      }\n\n      /**\n       * Publish bundle load event.\n       * @param {string} bundleId - Bundle id\n       * @param {string[]} pathsNotFound - List of files not found\n       */\n      function publish(bundleId, pathsNotFound) {\n        // exit if id isn't defined\n        if (!bundleId) return;\n        var q = bundleCallbackQueue[bundleId];\n\n        // cache result\n        bundleResultCache[bundleId] = pathsNotFound;\n\n        // exit if queue is empty\n        if (!q) return;\n\n        // empty callback queue\n        while (q.length) {\n          q[0](bundleId, pathsNotFound);\n          q.splice(0, 1);\n        }\n      }\n\n      /**\n       * Execute callbacks.\n       * @param {Object or Function} args - The callback args\n       * @param {string[]} depsNotFound - List of dependencies not found\n       */\n      function executeCallbacks(args, depsNotFound) {\n        // accept function as argument\n        if (args.call) args = {\n          success: args\n        };\n\n        // success and error callbacks\n        if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n      }\n\n      /**\n       * Load individual file.\n       * @param {string} path - The file path\n       * @param {Function} callbackFn - The callback function\n       */\n      function loadFile(path, callbackFn, args, numTries) {\n        var doc = document,\n          async = args.async,\n          maxTries = (args.numRetries || 0) + 1,\n          beforeCallbackFn = args.before || devnull,\n          pathname = path.replace(/[\\?|#].*$/, ''),\n          pathStripped = path.replace(/^(css|img|module|nomodule)!/, ''),\n          isLegacyIECss,\n          hasModuleSupport,\n          e;\n        numTries = numTries || 0;\n        if (/(^css!|\\.css$)/.test(pathname)) {\n          // css\n          e = doc.createElement('link');\n          e.rel = 'stylesheet';\n          e.href = pathStripped;\n\n          // tag IE9+\n          isLegacyIECss = 'hideFocus' in e;\n\n          // use preload in IE Edge (to detect load errors)\n          if (isLegacyIECss && e.relList) {\n            isLegacyIECss = 0;\n            e.rel = 'preload';\n            e.as = 'style';\n          }\n        } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n          // image\n          e = doc.createElement('img');\n          e.src = pathStripped;\n        } else {\n          // javascript\n          e = doc.createElement('script');\n          e.src = pathStripped;\n          e.async = async === undefined ? true : async;\n\n          // handle es modules\n          // modern browsers:\n          //   module: add to dom with type=\"module\"\n          //   nomodule: call success() callback without adding to dom\n          // legacy browsers:\n          //   module: call success() callback without adding to dom\n          //   nomodule: add to dom with default type (\"text/javascript\")\n          hasModuleSupport = 'noModule' in e;\n          if (/^module!/.test(pathname)) {\n            if (!hasModuleSupport) return callbackFn(path, 'l');\n            e.type = \"module\";\n          } else if (/^nomodule!/.test(pathname) && hasModuleSupport) return callbackFn(path, 'l');\n        }\n        e.onload = e.onerror = e.onbeforeload = function (ev) {\n          var result = ev.type[0];\n\n          // treat empty stylesheets as failures to get around lack of onerror\n          // support in IE9-11\n          if (isLegacyIECss) {\n            try {\n              if (!e.sheet.cssText.length) result = 'e';\n            } catch (x) {\n              // sheets objects created from load errors don't allow access to\n              // `cssText` (unless error is Code:18 SecurityError)\n              if (x.code != 18) result = 'e';\n            }\n          }\n\n          // handle retries in case of load failure\n          if (result == 'e') {\n            // increment counter\n            numTries += 1;\n\n            // exit function and try again\n            if (numTries < maxTries) {\n              return loadFile(path, callbackFn, args, numTries);\n            }\n          } else if (e.rel == 'preload' && e.as == 'style') {\n            // activate preloaded stylesheets\n            return e.rel = 'stylesheet'; // jshint ignore:line\n          }\n\n          // execute callback\n          callbackFn(path, result, ev.defaultPrevented);\n        };\n\n        // add to document (unless callback returns `false`)\n        if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n      }\n\n      /**\n       * Load multiple files.\n       * @param {string[]} paths - The file paths\n       * @param {Function} callbackFn - The callback function\n       */\n      function loadFiles(paths, callbackFn, args) {\n        // listify paths\n        paths = paths.push ? paths : [paths];\n        var numWaiting = paths.length,\n          x = numWaiting,\n          pathsNotFound = [],\n          fn,\n          i;\n\n        // define callback function\n        fn = function (path, result, defaultPrevented) {\n          // handle error\n          if (result == 'e') pathsNotFound.push(path);\n\n          // handle beforeload event. If defaultPrevented then that means the load\n          // will be blocked (ex. Ghostery/ABP on Safari)\n          if (result == 'b') {\n            if (defaultPrevented) pathsNotFound.push(path);else return;\n          }\n          numWaiting--;\n          if (!numWaiting) callbackFn(pathsNotFound);\n        };\n\n        // load scripts\n        for (i = 0; i < x; i++) loadFile(paths[i], fn, args);\n      }\n\n      /**\n       * Initiate script load and register bundle.\n       * @param {(string|string[])} paths - The file paths\n       * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n       *   callback or (3) object literal with success/error arguments, numRetries,\n       *   etc.\n       * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n       *   literal with success/error arguments, numRetries, etc.\n       */\n      function loadjs(paths, arg1, arg2) {\n        var bundleId, args;\n\n        // bundleId (if string)\n        if (arg1 && arg1.trim) bundleId = arg1;\n\n        // args (default is {})\n        args = (bundleId ? arg2 : arg1) || {};\n\n        // throw error if bundle is already defined\n        if (bundleId) {\n          if (bundleId in bundleIdCache) {\n            throw \"LoadJS\";\n          } else {\n            bundleIdCache[bundleId] = true;\n          }\n        }\n        function loadFn(resolve, reject) {\n          loadFiles(paths, function (pathsNotFound) {\n            // execute callbacks\n            executeCallbacks(args, pathsNotFound);\n\n            // resolve Promise\n            if (resolve) {\n              executeCallbacks({\n                success: resolve,\n                error: reject\n              }, pathsNotFound);\n            }\n\n            // publish bundle load event\n            publish(bundleId, pathsNotFound);\n          }, args);\n        }\n        if (args.returnPromise) return new Promise(loadFn);else loadFn();\n      }\n\n      /**\n       * Execute callbacks when dependencies have been satisfied.\n       * @param {(string|string[])} deps - List of bundle ids\n       * @param {Object} args - success/error arguments\n       */\n      loadjs.ready = function ready(deps, args) {\n        // subscribe to bundle load event\n        subscribe(deps, function (depsNotFound) {\n          // execute callbacks\n          executeCallbacks(args, depsNotFound);\n        });\n        return loadjs;\n      };\n\n      /**\n       * Manually satisfy bundle dependencies.\n       * @param {string} bundleId - The bundle id\n       */\n      loadjs.done = function done(bundleId) {\n        publish(bundleId, []);\n      };\n\n      /**\n       * Reset loadjs dependencies statuses\n       */\n      loadjs.reset = function reset() {\n        bundleIdCache = {};\n        bundleResultCache = {};\n        bundleCallbackQueue = {};\n      };\n\n      /**\n       * Determine if bundle has already been defined\n       * @param String} bundleId - The bundle id\n       */\n      loadjs.isDefined = function isDefined(bundleId) {\n        return bundleId in bundleIdCache;\n      };\n\n      // export\n      return loadjs;\n    });\n  })(loadjs_umd$1);\n  return loadjs_umd$1.exports;\n}\n\nvar loadjs_umdExports = requireLoadjs_umd();\nvar loadjs = /*@__PURE__*/getDefaultExportFromCjs(loadjs_umdExports);\n\n// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nfunction loadScript(url) {\n  return new Promise((resolve, reject) => {\n    loadjs(url, {\n      success: resolve,\n      error: reject\n    });\n  });\n}\n\n// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\n\n// Parse Vimeo ID from URL\nfunction parseId$1(url) {\n  if (is.empty(url)) {\n    return null;\n  }\n  if (is.number(Number(url))) {\n    return url;\n  }\n\n  // eslint-disable-next-line regexp/optimal-quantifier-concatenation\n  const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n  const match = url.match(regex);\n  return match ? match[2] : url;\n}\n\n// Try to extract a hash for private videos from the URL\nfunction parseHash(url) {\n  /* This regex matches a hexadecimal hash if given in any of these forms:\n   *  - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n   *  - [https://player.]vimeo.com/video/{id}?h={hash}[&params]\n   *  - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n   *  - video/{id}/{hash}\n   * If matched, the hash is available in capture group 4\n   */\n  const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*h=|\\/)+([\\d,a-f]+)/;\n  const found = url.match(regex);\n  return found && found.length === 5 ? found[4] : null;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState$1(play) {\n  if (play && !this.embed.hasPlayed) {\n    this.embed.hasPlayed = true;\n  }\n  if (this.media.paused === play) {\n    this.media.paused = !play;\n    triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n  }\n}\nconst vimeo = {\n  setup() {\n    const player = this;\n\n    // Add embed class for responsive\n    toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n    // Set speed options from config\n    player.options.speed = player.config.speed.options;\n\n    // Set initial ratio\n    setAspectRatio.call(player);\n\n    // Load the SDK if not already\n    if (!is.object(window.Vimeo)) {\n      loadScript(player.config.urls.vimeo.sdk).then(() => {\n        vimeo.ready.call(player);\n      }).catch(error => {\n        player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n      });\n    } else {\n      vimeo.ready.call(player);\n    }\n  },\n  // API Ready\n  ready() {\n    const player = this;\n    const config = player.config.vimeo;\n    const {\n      premium,\n      referrerPolicy,\n      ...frameParams\n    } = config;\n    // Get the source URL or ID\n    let source = player.media.getAttribute('src');\n    let hash = '';\n    // Get from <div> if needed\n    if (is.empty(source)) {\n      source = player.media.getAttribute(player.config.attributes.embed.id);\n      // hash can also be set as attribute on the <div>\n      hash = player.media.getAttribute(player.config.attributes.embed.hash);\n    } else {\n      hash = parseHash(source);\n    }\n    const hashParam = hash ? {\n      h: hash\n    } : {};\n\n    // If the owner has a pro or premium account then we can hide controls etc\n    if (premium) {\n      Object.assign(frameParams, {\n        controls: false,\n        sidedock: false\n      });\n    }\n\n    // Get Vimeo params for the iframe\n    const params = buildUrlParams({\n      loop: player.config.loop.active,\n      autoplay: player.autoplay,\n      muted: player.muted,\n      gesture: 'media',\n      playsinline: player.config.playsinline,\n      // hash has to be added to iframe-URL\n      ...hashParam,\n      ...frameParams\n    });\n    const id = parseId$1(source);\n    // Build an iframe\n    const iframe = createElement('iframe');\n    const src = format(player.config.urls.vimeo.iframe, id, params);\n    iframe.setAttribute('src', src);\n    iframe.setAttribute('allowfullscreen', '');\n    iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '));\n\n    // Set the referrer policy if required\n    if (!is.empty(referrerPolicy)) {\n      iframe.setAttribute('referrerPolicy', referrerPolicy);\n    }\n\n    // Inject the package\n    if (premium || !config.customControls) {\n      iframe.setAttribute('data-poster', player.poster);\n      player.media = replaceElement(iframe, player.media);\n    } else {\n      const wrapper = createElement('div', {\n        'class': player.config.classNames.embedContainer,\n        'data-poster': player.poster\n      });\n      wrapper.appendChild(iframe);\n      player.media = replaceElement(wrapper, player.media);\n    }\n\n    // Get poster image\n    if (!config.customControls) {\n      fetch(format(player.config.urls.vimeo.api, src)).then(response => {\n        if (is.empty(response) || !response.thumbnail_url) {\n          return;\n        }\n\n        // Set and show poster\n        ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n      });\n    }\n\n    // Setup instance\n    // https://github.com/vimeo/player.js\n    player.embed = new window.Vimeo.Player(iframe, {\n      autopause: player.config.autopause,\n      muted: player.muted\n    });\n    player.media.paused = true;\n    player.media.currentTime = 0;\n\n    // Disable native text track rendering\n    if (player.supported.ui) {\n      player.embed.disableTextTrack();\n    }\n\n    // Create a faux HTML5 API using the Vimeo API\n    player.media.play = () => {\n      assurePlaybackState$1.call(player, true);\n      return player.embed.play();\n    };\n    player.media.pause = () => {\n      assurePlaybackState$1.call(player, false);\n      return player.embed.pause();\n    };\n    player.media.stop = () => {\n      player.pause();\n      player.currentTime = 0;\n    };\n\n    // Seeking\n    let {\n      currentTime\n    } = player.media;\n    Object.defineProperty(player.media, 'currentTime', {\n      get() {\n        return currentTime;\n      },\n      set(time) {\n        // Vimeo will automatically play on seek if the video hasn't been played before\n\n        // Get current paused state and volume etc\n        const {\n          embed,\n          media,\n          paused,\n          volume\n        } = player;\n        const restorePause = paused && !embed.hasPlayed;\n\n        // Set seeking state and trigger event\n        media.seeking = true;\n        triggerEvent.call(player, media, 'seeking');\n\n        // If paused, mute until seek is complete\n        Promise.resolve(restorePause && embed.setVolume(0))\n        // Seek\n        .then(() => embed.setCurrentTime(time))\n        // Restore paused\n        .then(() => restorePause && embed.pause())\n        // Restore volume\n        .then(() => restorePause && embed.setVolume(volume)).catch(() => {\n          // Do nothing\n        });\n      }\n    });\n\n    // Playback speed\n    let speed = player.config.speed.selected;\n    Object.defineProperty(player.media, 'playbackRate', {\n      get() {\n        return speed;\n      },\n      set(input) {\n        player.embed.setPlaybackRate(input).then(() => {\n          speed = input;\n          triggerEvent.call(player, player.media, 'ratechange');\n        }).catch(() => {\n          // Cannot set Playback Rate, Video is probably not on Pro account\n          player.options.speed = [1];\n        });\n      }\n    });\n\n    // Volume\n    let {\n      volume\n    } = player.config;\n    Object.defineProperty(player.media, 'volume', {\n      get() {\n        return volume;\n      },\n      set(input) {\n        player.embed.setVolume(input).then(() => {\n          volume = input;\n          triggerEvent.call(player, player.media, 'volumechange');\n        });\n      }\n    });\n\n    // Muted\n    let {\n      muted\n    } = player.config;\n    Object.defineProperty(player.media, 'muted', {\n      get() {\n        return muted;\n      },\n      set(input) {\n        const toggle = is.boolean(input) ? input : false;\n        player.embed.setMuted(toggle ? true : player.config.muted).then(() => {\n          muted = toggle;\n          triggerEvent.call(player, player.media, 'volumechange');\n        });\n      }\n    });\n\n    // Loop\n    let {\n      loop\n    } = player.config;\n    Object.defineProperty(player.media, 'loop', {\n      get() {\n        return loop;\n      },\n      set(input) {\n        const toggle = is.boolean(input) ? input : player.config.loop.active;\n        player.embed.setLoop(toggle).then(() => {\n          loop = toggle;\n        });\n      }\n    });\n\n    // Source\n    let currentSrc;\n    player.embed.getVideoUrl().then(value => {\n      currentSrc = value;\n      controls.setDownloadUrl.call(player);\n    }).catch(error => {\n      this.debug.warn(error);\n    });\n    Object.defineProperty(player.media, 'currentSrc', {\n      get() {\n        return currentSrc;\n      }\n    });\n\n    // Ended\n    Object.defineProperty(player.media, 'ended', {\n      get() {\n        return player.currentTime === player.duration;\n      }\n    });\n\n    // Set aspect ratio based on video size\n    Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n      const [width, height] = dimensions;\n      player.embed.ratio = roundAspectRatio(width, height);\n      setAspectRatio.call(this);\n    });\n\n    // Set autopause\n    player.embed.setAutopause(player.config.autopause).then(state => {\n      player.config.autopause = state;\n    });\n\n    // Get title\n    player.embed.getVideoTitle().then(title => {\n      player.config.title = title;\n      ui.setTitle.call(this);\n    });\n\n    // Get current time\n    player.embed.getCurrentTime().then(value => {\n      currentTime = value;\n      triggerEvent.call(player, player.media, 'timeupdate');\n    });\n\n    // Get duration\n    player.embed.getDuration().then(value => {\n      player.media.duration = value;\n      triggerEvent.call(player, player.media, 'durationchange');\n    });\n\n    // Get captions\n    player.embed.getTextTracks().then(tracks => {\n      player.media.textTracks = tracks;\n      captions.setup.call(player);\n    });\n    player.embed.on('cuechange', ({\n      cues = []\n    }) => {\n      const strippedCues = cues.map(cue => stripHTML(cue.text));\n      captions.updateCues.call(player, strippedCues);\n    });\n    player.embed.on('loaded', () => {\n      // Assure state and events are updated on autoplay\n      player.embed.getPaused().then(paused => {\n        assurePlaybackState$1.call(player, !paused);\n        if (!paused) {\n          triggerEvent.call(player, player.media, 'playing');\n        }\n      });\n      if (is.element(player.embed.element) && player.supported.ui) {\n        const frame = player.embed.element;\n\n        // Fix keyboard focus issues\n        // https://github.com/sampotts/plyr/issues/317\n        frame.setAttribute('tabindex', -1);\n      }\n    });\n    player.embed.on('bufferstart', () => {\n      triggerEvent.call(player, player.media, 'waiting');\n    });\n    player.embed.on('bufferend', () => {\n      triggerEvent.call(player, player.media, 'playing');\n    });\n    player.embed.on('play', () => {\n      assurePlaybackState$1.call(player, true);\n      triggerEvent.call(player, player.media, 'playing');\n    });\n    player.embed.on('pause', () => {\n      assurePlaybackState$1.call(player, false);\n    });\n    player.embed.on('timeupdate', data => {\n      player.media.seeking = false;\n      currentTime = data.seconds;\n      triggerEvent.call(player, player.media, 'timeupdate');\n    });\n    player.embed.on('progress', data => {\n      player.media.buffered = data.percent;\n      triggerEvent.call(player, player.media, 'progress');\n\n      // Check all loaded\n      if (Number.parseInt(data.percent, 10) === 1) {\n        triggerEvent.call(player, player.media, 'canplaythrough');\n      }\n\n      // Get duration as if we do it before load, it gives an incorrect value\n      // https://github.com/sampotts/plyr/issues/891\n      player.embed.getDuration().then(value => {\n        if (value !== player.media.duration) {\n          player.media.duration = value;\n          triggerEvent.call(player, player.media, 'durationchange');\n        }\n      });\n    });\n    player.embed.on('seeked', () => {\n      player.media.seeking = false;\n      triggerEvent.call(player, player.media, 'seeked');\n    });\n    player.embed.on('ended', () => {\n      player.media.paused = true;\n      triggerEvent.call(player, player.media, 'ended');\n    });\n    player.embed.on('error', detail => {\n      player.media.error = detail;\n      triggerEvent.call(player, player.media, 'error');\n    });\n\n    // Rebuild UI\n    if (config.customControls) {\n      setTimeout(() => ui.build.call(player), 0);\n    }\n  }\n};\n\n// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n  if (is.empty(url)) {\n    return null;\n  }\n  const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n  const match = url.match(regex);\n  return match && match[2] ? match[2] : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n  if (play && !this.embed.hasPlayed) {\n    this.embed.hasPlayed = true;\n  }\n  if (this.media.paused === play) {\n    this.media.paused = !play;\n    triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n  }\n}\nfunction getHost(config) {\n  if (config.noCookie) {\n    return 'https://www.youtube-nocookie.com';\n  }\n  if (window.location.protocol === 'http:') {\n    return 'http://www.youtube.com';\n  }\n\n  // Use YouTube's default\n  return undefined;\n}\nconst youtube = {\n  setup() {\n    // Add embed class for responsive\n    toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n    // Setup API\n    if (is.object(window.YT) && is.function(window.YT.Player)) {\n      youtube.ready.call(this);\n    } else {\n      // Reference current global callback\n      const callback = window.onYouTubeIframeAPIReady;\n\n      // Set callback to process queue\n      window.onYouTubeIframeAPIReady = () => {\n        // Call global callback if set\n        if (is.function(callback)) {\n          callback();\n        }\n        youtube.ready.call(this);\n      };\n\n      // Load the SDK\n      loadScript(this.config.urls.youtube.sdk).catch(error => {\n        this.debug.warn('YouTube API failed to load', error);\n      });\n    }\n  },\n  // Get the media title\n  getTitle(videoId) {\n    const url = format(this.config.urls.youtube.api, videoId);\n    fetch(url).then(data => {\n      if (is.object(data)) {\n        const {\n          title,\n          height,\n          width\n        } = data;\n\n        // Set title\n        this.config.title = title;\n        ui.setTitle.call(this);\n\n        // Set aspect ratio\n        this.embed.ratio = roundAspectRatio(width, height);\n      }\n      setAspectRatio.call(this);\n    }).catch(() => {\n      // Set aspect ratio\n      setAspectRatio.call(this);\n    });\n  },\n  // API ready\n  ready() {\n    const player = this;\n    const config = player.config.youtube;\n    // Ignore already setup (race condition)\n    const currentId = player.media && player.media.getAttribute('id');\n    if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n      return;\n    }\n\n    // Get the source URL or ID\n    let source = player.media.getAttribute('src');\n\n    // Get from <div> if needed\n    if (is.empty(source)) {\n      source = player.media.getAttribute(this.config.attributes.embed.id);\n    }\n\n    // Replace the <iframe> with a <div> due to YouTube API issues\n    const videoId = parseId(source);\n    const id = generateId(player.provider);\n    // Replace media element\n    const container = createElement('div', {\n      id,\n      'data-poster': config.customControls ? player.poster : undefined\n    });\n    player.media = replaceElement(container, player.media);\n\n    // Only load the poster when using custom controls\n    if (config.customControls) {\n      const posterSrc = s => `https://i.ytimg.com/vi/${videoId}/${s}default.jpg`;\n\n      // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n      loadImage(posterSrc('maxres'), 121) // Highest quality and un-padded\n      .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n      .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n      .then(image => ui.setPoster.call(player, image.src)).then(src => {\n        // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n        if (!src.includes('maxres')) {\n          player.elements.poster.style.backgroundSize = 'cover';\n        }\n      }).catch(() => {});\n    }\n\n    // Setup instance\n    // https://developers.google.com/youtube/iframe_api_reference\n    player.embed = new window.YT.Player(player.media, {\n      videoId,\n      host: getHost(config),\n      playerVars: extend({}, {\n        // Autoplay\n        autoplay: player.config.autoplay ? 1 : 0,\n        // iframe interface language\n        hl: player.config.hl,\n        // Only show controls if not fully supported or opted out\n        controls: player.supported.ui && config.customControls ? 0 : 1,\n        // Disable keyboard as we handle it\n        disablekb: 1,\n        // Allow iOS inline playback\n        playsinline: player.config.playsinline && !player.config.fullscreen.iosNative ? 1 : 0,\n        // Captions are flaky on YouTube\n        cc_load_policy: player.captions.active ? 1 : 0,\n        cc_lang_pref: player.config.captions.language,\n        // Tracking for stats\n        widget_referrer: window ? window.location.href : null\n      }, config),\n      events: {\n        onError(event) {\n          // YouTube may fire onError twice, so only handle it once\n          if (!player.media.error) {\n            const code = event.data;\n            // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n            const message = {\n              2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n              5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n              100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n              101: 'The owner of the requested video does not allow it to be played in embedded players.',\n              150: 'The owner of the requested video does not allow it to be played in embedded players.'\n            }[code] || 'An unknown error occurred';\n            player.media.error = {\n              code,\n              message\n            };\n            triggerEvent.call(player, player.media, 'error');\n          }\n        },\n        onPlaybackRateChange(event) {\n          // Get the instance\n          const instance = event.target;\n\n          // Get current speed\n          player.media.playbackRate = instance.getPlaybackRate();\n          triggerEvent.call(player, player.media, 'ratechange');\n        },\n        onReady(event) {\n          // Bail if onReady has already been called. See issue #1108\n          if (is.function(player.media.play)) {\n            return;\n          }\n          // Get the instance\n          const instance = event.target;\n\n          // Get the title\n          youtube.getTitle.call(player, videoId);\n\n          // Create a faux HTML5 API using the YouTube API\n          player.media.play = () => {\n            assurePlaybackState.call(player, true);\n            instance.playVideo();\n          };\n          player.media.pause = () => {\n            assurePlaybackState.call(player, false);\n            instance.pauseVideo();\n          };\n          player.media.stop = () => {\n            instance.stopVideo();\n          };\n          player.media.duration = instance.getDuration();\n          player.media.paused = true;\n\n          // Seeking\n          player.media.currentTime = 0;\n          Object.defineProperty(player.media, 'currentTime', {\n            get() {\n              return Number(instance.getCurrentTime());\n            },\n            set(time) {\n              // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n              if (player.paused && !player.embed.hasPlayed) {\n                player.embed.mute();\n              }\n\n              // Set seeking state and trigger event\n              player.media.seeking = true;\n              triggerEvent.call(player, player.media, 'seeking');\n\n              // Seek after events sent\n              instance.seekTo(time);\n            }\n          });\n\n          // Playback speed\n          Object.defineProperty(player.media, 'playbackRate', {\n            get() {\n              return instance.getPlaybackRate();\n            },\n            set(input) {\n              instance.setPlaybackRate(input);\n            }\n          });\n\n          // Volume\n          let {\n            volume\n          } = player.config;\n          Object.defineProperty(player.media, 'volume', {\n            get() {\n              return volume;\n            },\n            set(input) {\n              volume = input;\n              instance.setVolume(volume * 100);\n              triggerEvent.call(player, player.media, 'volumechange');\n            }\n          });\n\n          // Muted\n          let {\n            muted\n          } = player.config;\n          Object.defineProperty(player.media, 'muted', {\n            get() {\n              return muted;\n            },\n            set(input) {\n              const toggle = is.boolean(input) ? input : muted;\n              muted = toggle;\n              instance[toggle ? 'mute' : 'unMute']();\n              instance.setVolume(volume * 100);\n              triggerEvent.call(player, player.media, 'volumechange');\n            }\n          });\n\n          // Source\n          Object.defineProperty(player.media, 'currentSrc', {\n            get() {\n              return instance.getVideoUrl();\n            }\n          });\n\n          // Ended\n          Object.defineProperty(player.media, 'ended', {\n            get() {\n              return player.currentTime === player.duration;\n            }\n          });\n\n          // Get available speeds\n          const speeds = instance.getAvailablePlaybackRates();\n          // Filter based on config\n          player.options.speed = speeds.filter(s => player.config.speed.options.includes(s));\n\n          // Set the tabindex to avoid focus entering iframe\n          if (player.supported.ui && config.customControls) {\n            player.media.setAttribute('tabindex', -1);\n          }\n          triggerEvent.call(player, player.media, 'timeupdate');\n          triggerEvent.call(player, player.media, 'durationchange');\n\n          // Reset timer\n          clearInterval(player.timers.buffering);\n\n          // Setup buffering\n          player.timers.buffering = setInterval(() => {\n            // Get loaded % from YouTube\n            player.media.buffered = instance.getVideoLoadedFraction();\n\n            // Trigger progress only when we actually buffer something\n            if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n              triggerEvent.call(player, player.media, 'progress');\n            }\n\n            // Set last buffer point\n            player.media.lastBuffered = player.media.buffered;\n\n            // Bail if we're at 100%\n            if (player.media.buffered === 1) {\n              clearInterval(player.timers.buffering);\n\n              // Trigger event\n              triggerEvent.call(player, player.media, 'canplaythrough');\n            }\n          }, 200);\n\n          // Rebuild UI\n          if (config.customControls) {\n            setTimeout(() => ui.build.call(player), 50);\n          }\n        },\n        onStateChange(event) {\n          // Get the instance\n          const instance = event.target;\n\n          // Reset timer\n          clearInterval(player.timers.playing);\n          const seeked = player.media.seeking && [1, 2].includes(event.data);\n          if (seeked) {\n            // Unset seeking and fire seeked event\n            player.media.seeking = false;\n            triggerEvent.call(player, player.media, 'seeked');\n          }\n\n          // Handle events\n          // -1   Unstarted\n          // 0    Ended\n          // 1    Playing\n          // 2    Paused\n          // 3    Buffering\n          // 5    Video cued\n          switch (event.data) {\n            case -1:\n              // Update scrubber\n              triggerEvent.call(player, player.media, 'timeupdate');\n\n              // Get loaded % from YouTube\n              player.media.buffered = instance.getVideoLoadedFraction();\n              triggerEvent.call(player, player.media, 'progress');\n              break;\n            case 0:\n              assurePlaybackState.call(player, false);\n\n              // YouTube doesn't support loop for a single video, so mimick it.\n              if (player.media.loop) {\n                // YouTube needs a call to `stopVideo` before playing again\n                instance.stopVideo();\n                instance.playVideo();\n              } else {\n                triggerEvent.call(player, player.media, 'ended');\n              }\n              break;\n            case 1:\n              // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n              if (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n                player.media.pause();\n              } else {\n                assurePlaybackState.call(player, true);\n                triggerEvent.call(player, player.media, 'playing');\n\n                // Poll to get playback progress\n                player.timers.playing = setInterval(() => {\n                  triggerEvent.call(player, player.media, 'timeupdate');\n                }, 50);\n\n                // Check duration again due to YouTube bug\n                // https://github.com/sampotts/plyr/issues/374\n                // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n                if (player.media.duration !== instance.getDuration()) {\n                  player.media.duration = instance.getDuration();\n                  triggerEvent.call(player, player.media, 'durationchange');\n                }\n              }\n              break;\n            case 2:\n              // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n              if (!player.muted) {\n                player.embed.unMute();\n              }\n              assurePlaybackState.call(player, false);\n              break;\n            case 3:\n              // Trigger waiting event to add loading classes to container as the video buffers.\n              triggerEvent.call(player, player.media, 'waiting');\n              break;\n          }\n          triggerEvent.call(player, player.elements.container, 'statechange', false, {\n            code: event.data\n          });\n        }\n      }\n    });\n  }\n};\n\n// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nconst media = {\n  // Setup media\n  setup() {\n    // If there's no media, bail\n    if (!this.media) {\n      this.debug.warn('No media element found!');\n      return;\n    }\n\n    // Add type class\n    toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n    // Add provider class\n    toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n    // Add video class for embeds\n    // This will require changes if audio embeds are added\n    if (this.isEmbed) {\n      toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n    }\n\n    // Inject the player wrapper\n    if (this.isVideo) {\n      // Create the wrapper div\n      this.elements.wrapper = createElement('div', {\n        class: this.config.classNames.video\n      });\n\n      // Wrap the video in a container\n      wrap(this.media, this.elements.wrapper);\n\n      // Poster image container\n      this.elements.poster = createElement('div', {\n        class: this.config.classNames.poster\n      });\n      this.elements.wrapper.appendChild(this.elements.poster);\n    }\n    if (this.isHTML5) {\n      html5.setup.call(this);\n    } else if (this.isYouTube) {\n      youtube.setup.call(this);\n    } else if (this.isVimeo) {\n      vimeo.setup.call(this);\n    }\n  }\n};\n\nfunction destroy(instance) {\n  // Destroy our adsManager\n  if (instance.manager) {\n    instance.manager.destroy();\n  }\n\n  // Destroy our adsManager\n  if (instance.elements.displayContainer) {\n    instance.elements.displayContainer.destroy();\n  }\n  instance.elements.container.remove();\n}\nclass Ads {\n  /**\n   * Ads constructor.\n   * @param {object} player\n   * @return {Ads}\n   */\n  constructor(player) {\n    /**\n     * Load the IMA SDK\n     */\n    _defineProperty$1(this, \"load\", () => {\n      if (!this.enabled) {\n        return;\n      }\n\n      // Check if the Google IMA3 SDK is loaded or load it ourselves\n      if (!is.object(window.google) || !is.object(window.google.ima)) {\n        loadScript(this.player.config.urls.googleIMA.sdk).then(() => {\n          this.ready();\n        }).catch(() => {\n          // Script failed to load or is blocked\n          this.trigger('error', new Error('Google IMA SDK failed to load'));\n        });\n      } else {\n        this.ready();\n      }\n    });\n    /**\n     * Get the ads instance ready\n     */\n    _defineProperty$1(this, \"ready\", () => {\n      // Double check we're enabled\n      if (!this.enabled) {\n        destroy(this);\n      }\n\n      // Start ticking our safety timer. If the whole advertisement\n      // thing doesn't resolve within our set time; we bail\n      this.startSafetyTimer(12000, 'ready()');\n\n      // Clear the safety timer\n      this.managerPromise.then(() => {\n        this.clearSafetyTimer('onAdsManagerLoaded()');\n      });\n\n      // Set listeners on the Plyr instance\n      this.listeners();\n\n      // Setup the IMA SDK\n      this.setupIMA();\n    });\n    /**\n     * In order for the SDK to display ads for our video, we need to tell it where to put them,\n     * so here we define our ad container. This div is set up to render on top of the video player.\n     * Using the code below, we tell the SDK to render ads within that div. We also provide a\n     * handle to the content video player - the SDK will poll the current time of our player to\n     * properly place mid-rolls. After we create the ad display container, we initialize it. On\n     * mobile devices, this initialization is done as the result of a user action.\n     */\n    _defineProperty$1(this, \"setupIMA\", () => {\n      // Create the container for our advertisements\n      this.elements.container = createElement('div', {\n        class: this.player.config.classNames.ads\n      });\n      this.player.elements.container.appendChild(this.elements.container);\n\n      // So we can run VPAID2\n      google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n      // Set language\n      google.ima.settings.setLocale(this.player.config.ads.language);\n\n      // Set playback for iOS10+\n      google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n      // We assume the adContainer is the video container of the plyr element that will house the ads\n      this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\n      // Create ads loader\n      this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n      // Listen and respond to ads loaded and error events\n      this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n      this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n      // Request video ads to be pre-loaded\n      this.requestAds();\n    });\n    /**\n     * Request advertisements\n     */\n    _defineProperty$1(this, \"requestAds\", () => {\n      const {\n        container\n      } = this.player.elements;\n      try {\n        // Request video ads\n        const request = new google.ima.AdsRequest();\n        request.adTagUrl = this.tagUrl;\n\n        // Specify the linear and nonlinear slot sizes. This helps the SDK\n        // to select the correct creative if multiple are returned\n        request.linearAdSlotWidth = container.offsetWidth;\n        request.linearAdSlotHeight = container.offsetHeight;\n        request.nonLinearAdSlotWidth = container.offsetWidth;\n        request.nonLinearAdSlotHeight = container.offsetHeight;\n\n        // We only overlay ads as we only support video.\n        request.forceNonLinearFullSlot = false;\n\n        // Mute based on current state\n        request.setAdWillPlayMuted(!this.player.muted);\n        this.loader.requestAds(request);\n      } catch (error) {\n        this.onAdError(error);\n      }\n    });\n    /**\n     * Update the ad countdown\n     * @param {boolean} start\n     */\n    _defineProperty$1(this, \"pollCountdown\", (start = false) => {\n      if (!start) {\n        clearInterval(this.countdownTimer);\n        this.elements.container.removeAttribute('data-badge-text');\n        return;\n      }\n      const update = () => {\n        const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n        const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n        this.elements.container.setAttribute('data-badge-text', label);\n      };\n      this.countdownTimer = setInterval(update, 100);\n    });\n    /**\n     * This method is called whenever the ads are ready inside the AdDisplayContainer\n     * @param {Event} event - adsManagerLoadedEvent\n     */\n    _defineProperty$1(this, \"onAdsManagerLoaded\", event => {\n      // Load could occur after a source change (race condition)\n      if (!this.enabled) {\n        return;\n      }\n\n      // Get the ads manager\n      const settings = new google.ima.AdsRenderingSettings();\n\n      // Tell the SDK to save and restore content video state on our behalf\n      settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n      settings.enablePreloading = true;\n\n      // The SDK is polling currentTime on the contentPlayback. And needs a duration\n      // so it can determine when to start the mid- and post-roll\n      this.manager = event.getAdsManager(this.player, settings);\n\n      // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n      this.cuePoints = this.manager.getCuePoints();\n\n      // Add listeners to the required events\n      // Advertisement error events\n      this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n      // Advertisement regular events\n      Object.keys(google.ima.AdEvent.Type).forEach(type => {\n        this.manager.addEventListener(google.ima.AdEvent.Type[type], e => this.onAdEvent(e));\n      });\n\n      // Resolve our adsManager\n      this.trigger('loaded');\n    });\n    _defineProperty$1(this, \"addCuePoints\", () => {\n      // Add advertisement cue's within the time line if available\n      if (!is.empty(this.cuePoints)) {\n        this.cuePoints.forEach(cuePoint => {\n          if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n            const seekElement = this.player.elements.progress;\n            if (is.element(seekElement)) {\n              const cuePercentage = 100 / this.player.duration * cuePoint;\n              const cue = createElement('span', {\n                class: this.player.config.classNames.cues\n              });\n              cue.style.left = `${cuePercentage.toString()}%`;\n              seekElement.appendChild(cue);\n            }\n          }\n        });\n      }\n    });\n    /**\n     * This is where all the event handling takes place. Retrieve the ad from the event. Some\n     * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n     * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n     * @param {Event} event\n     */\n    _defineProperty$1(this, \"onAdEvent\", event => {\n      const {\n        container\n      } = this.player.elements;\n      // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n      // don't have ad object associated\n      const ad = event.getAd();\n      const adData = event.getAdData();\n\n      // Proxy event\n      const dispatchEvent = type => {\n        triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n      };\n\n      // Bubble the event\n      dispatchEvent(event.type);\n      switch (event.type) {\n        case google.ima.AdEvent.Type.LOADED:\n          // This is the first event sent for an ad - it is possible to determine whether the\n          // ad is a video ad or an overlay\n          this.trigger('loaded');\n\n          // Start countdown\n          this.pollCountdown(true);\n          if (!ad.isLinear()) {\n            // Position AdDisplayContainer correctly for overlay\n            ad.width = container.offsetWidth;\n            ad.height = container.offsetHeight;\n          }\n\n          // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n          // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n          break;\n        case google.ima.AdEvent.Type.STARTED:\n          // Set volume to match player\n          this.manager.setVolume(this.player.volume);\n          break;\n        case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n          // All ads for the current videos are done. We can now request new advertisements\n          // in case the video is re-played\n\n          // TODO: Example for what happens when a next video in a playlist would be loaded.\n          // So here we load a new video when all ads are done.\n          // Then we load new ads within a new adsManager. When the video\n          // Is started - after - the ads are loaded, then we get ads.\n          // You can also easily test cancelling and reloading by running\n          // player.ads.cancel() and player.ads.play from the console I guess.\n          // this.player.source = {\n          //     type: 'video',\n          //     title: 'View From A Blue Moon',\n          //     sources: [{\n          //         src:\n          // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n          // 'video/mp4', }], poster:\n          // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n          // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n          // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n          // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n          // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n          // };\n\n          // TODO: So there is still this thing where a video should only be allowed to start\n          // playing when the IMA SDK is ready or has failed\n\n          if (this.player.ended) {\n            this.loadAds();\n          } else {\n            // The SDK won't allow new ads to be called without receiving a contentComplete()\n            this.loader.contentComplete();\n          }\n          break;\n        case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n          // This event indicates the ad has started - the video player can adjust the UI,\n          // for example display a pause button and remaining time. Fired when content should\n          // be paused. This usually happens right before an ad is about to cover the content\n\n          this.pauseContent();\n          break;\n        case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n          // This event indicates the ad has finished - the video player can perform\n          // appropriate UI actions, such as removing the timer for remaining time detection.\n          // Fired when content should be resumed. This usually happens when an ad finishes\n          // or collapses\n\n          this.pollCountdown();\n          this.resumeContent();\n          break;\n        case google.ima.AdEvent.Type.LOG:\n          if (adData.adError) {\n            this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n          }\n          break;\n      }\n    });\n    /**\n     * Any ad error handling comes through here\n     * @param {Event} event\n     */\n    _defineProperty$1(this, \"onAdError\", event => {\n      this.cancel();\n      this.player.debug.warn('Ads error', event);\n    });\n    /**\n     * Setup hooks for Plyr and window events. This ensures\n     * the mid- and post-roll launch at the correct time. And\n     * resize the advertisement when the player resizes\n     */\n    _defineProperty$1(this, \"listeners\", () => {\n      const {\n        container\n      } = this.player.elements;\n      let time;\n      this.player.on('canplay', () => {\n        this.addCuePoints();\n      });\n      this.player.on('ended', () => {\n        this.loader.contentComplete();\n      });\n      this.player.on('timeupdate', () => {\n        time = this.player.currentTime;\n      });\n      this.player.on('seeked', () => {\n        const seekedTime = this.player.currentTime;\n        if (is.empty(this.cuePoints)) {\n          return;\n        }\n        this.cuePoints.forEach((cuePoint, index) => {\n          if (time < cuePoint && cuePoint < seekedTime) {\n            this.manager.discardAdBreak();\n            this.cuePoints.splice(index, 1);\n          }\n        });\n      });\n\n      // Listen to the resizing of the window. And resize ad accordingly\n      // TODO: eventually implement ResizeObserver\n      window.addEventListener('resize', () => {\n        if (this.manager) {\n          this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n        }\n      });\n    });\n    /**\n     * Initialize the adsManager and start playing advertisements\n     */\n    _defineProperty$1(this, \"play\", () => {\n      const {\n        container\n      } = this.player.elements;\n      if (!this.managerPromise) {\n        this.resumeContent();\n      }\n\n      // Play the requested advertisement whenever the adsManager is ready\n      this.managerPromise.then(() => {\n        // Set volume to match player\n        this.manager.setVolume(this.player.volume);\n\n        // Initialize the container. Must be done via a user action on mobile devices\n        this.elements.displayContainer.initialize();\n        try {\n          if (!this.initialized) {\n            // Initialize the ads manager. Ad rules playlist will start at this time\n            this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n            // Call play to start showing the ad. Single video and overlay ads will\n            // start at this time; the call will be ignored for ad rules\n            this.manager.start();\n          }\n          this.initialized = true;\n        } catch (adError) {\n          // An error may be thrown if there was a problem with the\n          // VAST response\n          this.onAdError(adError);\n        }\n      }).catch(() => {});\n    });\n    /**\n     * Resume our video\n     */\n    _defineProperty$1(this, \"resumeContent\", () => {\n      // Hide the advertisement container\n      this.elements.container.style.zIndex = '';\n\n      // Ad is stopped\n      this.playing = false;\n\n      // Play video\n      silencePromise(this.player.media.play());\n    });\n    /**\n     * Pause our video\n     */\n    _defineProperty$1(this, \"pauseContent\", () => {\n      // Show the advertisement container\n      this.elements.container.style.zIndex = 3;\n\n      // Ad is playing\n      this.playing = true;\n\n      // Pause our video.\n      this.player.media.pause();\n    });\n    /**\n     * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n     * allowed to call new ads based on google policies, as they interpret this as an accidental\n     * video requests. https://developers.google.com/interactive-\n     * media-ads/docs/sdks/android/faq#8\n     */\n    _defineProperty$1(this, \"cancel\", () => {\n      // Pause our video\n      if (this.initialized) {\n        this.resumeContent();\n      }\n\n      // Tell our instance that we're done for now\n      this.trigger('error');\n\n      // Re-create our adsManager\n      this.loadAds();\n    });\n    /**\n     * Re-create our adsManager\n     */\n    _defineProperty$1(this, \"loadAds\", () => {\n      // Tell our adsManager to go bye bye\n      this.managerPromise.then(() => {\n        // Destroy our adsManager\n        if (this.manager) {\n          this.manager.destroy();\n        }\n\n        // Re-set our adsManager promises\n        this.managerPromise = new Promise(resolve => {\n          this.on('loaded', resolve);\n          this.player.debug.log(this.manager);\n        });\n        // Now that the manager has been destroyed set it to also be un-initialized\n        this.initialized = false;\n\n        // Now request some new advertisements\n        this.requestAds();\n      }).catch(() => {});\n    });\n    /**\n     * Handles callbacks after an ad event was invoked\n     * @param {string} event - Event type\n     * @param args\n     */\n    _defineProperty$1(this, \"trigger\", (event, ...args) => {\n      const handlers = this.events[event];\n      if (is.array(handlers)) {\n        handlers.forEach(handler => {\n          if (is.function(handler)) {\n            handler.apply(this, args);\n          }\n        });\n      }\n    });\n    /**\n     * Add event listeners\n     * @param {string} event - Event type\n     * @param {Function} callback - Callback for when event occurs\n     * @return {Ads}\n     */\n    _defineProperty$1(this, \"on\", (event, callback) => {\n      if (!is.array(this.events[event])) {\n        this.events[event] = [];\n      }\n      this.events[event].push(callback);\n      return this;\n    });\n    /**\n     * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n     * The advertisement has 12 seconds to get its things together. We stop this timer when the\n     * advertisement is playing, or when a user action is required to start, then we clear the\n     * timer on ad ready\n     * @param {number} time\n     * @param {string} from\n     */\n    _defineProperty$1(this, \"startSafetyTimer\", (time, from) => {\n      this.player.debug.log(`Safety timer invoked from: ${from}`);\n      this.safetyTimer = setTimeout(() => {\n        this.cancel();\n        this.clearSafetyTimer('startSafetyTimer()');\n      }, time);\n    });\n    /**\n     * Clear our safety timer(s)\n     * @param {string} from\n     */\n    _defineProperty$1(this, \"clearSafetyTimer\", from => {\n      if (!is.nullOrUndefined(this.safetyTimer)) {\n        this.player.debug.log(`Safety timer cleared from: ${from}`);\n        clearTimeout(this.safetyTimer);\n        this.safetyTimer = null;\n      }\n    });\n    this.player = player;\n    this.config = player.config.ads;\n    this.playing = false;\n    this.initialized = false;\n    this.elements = {\n      container: null,\n      displayContainer: null\n    };\n    this.manager = null;\n    this.loader = null;\n    this.cuePoints = null;\n    this.events = {};\n    this.safetyTimer = null;\n    this.countdownTimer = null;\n\n    // Setup a promise to resolve when the IMA manager is ready\n    this.managerPromise = new Promise((resolve, reject) => {\n      // The ad is loaded and ready\n      this.on('loaded', resolve);\n\n      // Ads failed\n      this.on('error', reject);\n    });\n    this.load();\n  }\n  get enabled() {\n    const {\n      config\n    } = this;\n    return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is.empty(config.publisherId) || is.url(config.tagUrl));\n  }\n  // Build the tag URL\n  get tagUrl() {\n    const {\n      config\n    } = this;\n    if (is.url(config.tagUrl)) {\n      return config.tagUrl;\n    }\n    const params = {\n      AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n      AV_CHANNELID: '5a0458dc28a06145e4519d21',\n      AV_URL: window.location.hostname,\n      cb: Date.now(),\n      AV_WIDTH: 640,\n      AV_HEIGHT: 480,\n      AV_CDIM2: config.publisherId\n    };\n    const base = 'https://go.aniview.com/api/adserver6/vast/';\n    return `${base}?${buildUrlParams(params)}`;\n  }\n}\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {number} input\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns A number within the bounds of min and max\n * @type Number\n */\nfunction clamp(input = 0, min = 0, max = 255) {\n  return Math.min(Math.max(input, min), max);\n}\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nfunction parseVtt(vttDataString) {\n  const processedList = [];\n  const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n  frames.forEach(frame => {\n    const result = {};\n    const lines = frame.split(/\\r\\n|\\n|\\r/);\n    lines.forEach(line => {\n      if (!is.number(result.startTime)) {\n        // The line with start and end times on it is the first line of interest\n        const matchTimes = line.match(/(\\d{2})?:?(\\d{2}):(\\d{2}).(\\d{2,3})( ?--> ?)(\\d{2})?:?(\\d{2}):(\\d{2}).(\\d{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n        if (matchTimes) {\n          result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(`0.${matchTimes[4]}`);\n          result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(`0.${matchTimes[9]}`);\n        }\n      } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n        // If we already have the startTime, then we're definitely up to the text line(s)\n        const lineSplit = line.trim().split('#xywh=');\n        [result.text] = lineSplit;\n\n        // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n        if (lineSplit[1]) {\n          [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n        }\n      }\n    });\n    if (result.text) {\n      processedList.push(result);\n    }\n  });\n  return processedList;\n}\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nfunction fitRatio(ratio, outer) {\n  const targetRatio = outer.width / outer.height;\n  const result = {};\n  if (ratio > targetRatio) {\n    result.width = outer.width;\n    result.height = 1 / ratio * outer.width;\n  } else {\n    result.height = outer.height;\n    result.width = ratio * outer.height;\n  }\n  return result;\n}\nclass PreviewThumbnails {\n  /**\n   * PreviewThumbnails constructor.\n   * @param {Plyr} player\n   * @return {PreviewThumbnails}\n   */\n  constructor(player) {\n    _defineProperty$1(this, \"load\", () => {\n      // Toggle the regular seek tooltip\n      if (this.player.elements.display.seekTooltip) {\n        this.player.elements.display.seekTooltip.hidden = this.enabled;\n      }\n      if (!this.enabled) return;\n      this.getThumbnails().then(() => {\n        if (!this.enabled) {\n          return;\n        }\n\n        // Render DOM elements\n        this.render();\n\n        // Check to see if thumb container size was specified manually in CSS\n        this.determineContainerAutoSizing();\n\n        // Set up listeners\n        this.listeners();\n        this.loaded = true;\n      });\n    });\n    // Download VTT files and parse them\n    _defineProperty$1(this, \"getThumbnails\", () => {\n      return new Promise(resolve => {\n        const {\n          src\n        } = this.player.config.previewThumbnails;\n        if (is.empty(src)) {\n          throw new Error('Missing previewThumbnails.src config attribute');\n        }\n\n        // Resolve promise\n        const sortAndResolve = () => {\n          // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n          this.thumbnails.sort((x, y) => x.height - y.height);\n          this.player.debug.log('Preview thumbnails', this.thumbnails);\n          resolve();\n        };\n\n        // Via callback()\n        if (is.function(src)) {\n          src(thumbnails => {\n            this.thumbnails = thumbnails;\n            sortAndResolve();\n          });\n        }\n        // VTT urls\n        else {\n          // If string, convert into single-element list\n          const urls = is.string(src) ? [src] : src;\n          // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n          const promises = urls.map(u => this.getThumbnail(u));\n          // Resolve\n          Promise.all(promises).then(sortAndResolve);\n        }\n      });\n    });\n    // Process individual VTT file\n    _defineProperty$1(this, \"getThumbnail\", url => {\n      return new Promise(resolve => {\n        fetch(url, undefined, this.player.config.previewThumbnails.withCredentials).then(response => {\n          const thumbnail = {\n            frames: parseVtt(response),\n            height: null,\n            urlPrefix: ''\n          };\n\n          // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n          // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n          // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n          if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n            thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n          }\n\n          // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n          const tempImage = new Image();\n          tempImage.onload = () => {\n            thumbnail.height = tempImage.naturalHeight;\n            thumbnail.width = tempImage.naturalWidth;\n            this.thumbnails.push(thumbnail);\n            resolve();\n          };\n          tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n        });\n      });\n    });\n    _defineProperty$1(this, \"startMove\", event => {\n      if (!this.loaded) return;\n      if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) return;\n\n      // Wait until media has a duration\n      if (!this.player.media.duration) return;\n      if (event.type === 'touchmove') {\n        // Calculate seek hover position as approx video seconds\n        this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n      } else {\n        var _this$player$config$m, _this$player$config$m2;\n        // Calculate seek hover position as approx video seconds\n        const clientRect = this.player.elements.progress.getBoundingClientRect();\n        const percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n        this.seekTime = this.player.media.duration * (percentage / 100);\n        if (this.seekTime < 0) {\n          // The mousemove fires for 10+px out to the left\n          this.seekTime = 0;\n        }\n        if (this.seekTime > this.player.media.duration - 1) {\n          // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n          this.seekTime = this.player.media.duration - 1;\n        }\n        this.mousePosX = event.pageX;\n\n        // Set time text inside image container\n        this.elements.thumb.time.textContent = formatTime(this.seekTime);\n\n        // Get marker point for time\n        const point = (_this$player$config$m = this.player.config.markers) === null || _this$player$config$m === void 0 ? void 0 : (_this$player$config$m2 = _this$player$config$m.points) === null || _this$player$config$m2 === void 0 ? void 0 : _this$player$config$m2.find(({\n          time: t\n        }) => t === Math.round(this.seekTime));\n\n        // Append the point label to the tooltip\n        if (point) {\n          // this.elements.thumb.time.innerText.concat('\\n');\n          this.elements.thumb.time.insertAdjacentHTML('afterbegin', `${point.label}<br>`);\n        }\n      }\n\n      // Download and show image\n      this.showImageAtCurrentTime();\n    });\n    _defineProperty$1(this, \"endMove\", () => {\n      this.toggleThumbContainer(false, true);\n    });\n    _defineProperty$1(this, \"startScrubbing\", event => {\n      // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n      if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n        this.mouseDown = true;\n\n        // Wait until media has a duration\n        if (this.player.media.duration) {\n          this.toggleScrubbingContainer(true);\n          this.toggleThumbContainer(false, true);\n\n          // Download and show image\n          this.showImageAtCurrentTime();\n        }\n      }\n    });\n    _defineProperty$1(this, \"endScrubbing\", () => {\n      this.mouseDown = false;\n\n      // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n      if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n        // The video was already seeked/loaded at the chosen time - hide immediately\n        this.toggleScrubbingContainer(false);\n      } else {\n        // The video hasn't seeked yet. Wait for that\n        once.call(this.player, this.player.media, 'timeupdate', () => {\n          // Re-check mousedown - we might have already started scrubbing again\n          if (!this.mouseDown) {\n            this.toggleScrubbingContainer(false);\n          }\n        });\n      }\n    });\n    /**\n     * Setup hooks for Plyr and window events\n     */\n    _defineProperty$1(this, \"listeners\", () => {\n      // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n      this.player.on('play', () => {\n        this.toggleThumbContainer(false, true);\n      });\n      this.player.on('seeked', () => {\n        this.toggleThumbContainer(false);\n      });\n      this.player.on('timeupdate', () => {\n        this.lastTime = this.player.media.currentTime;\n      });\n    });\n    /**\n     * Create HTML elements for image containers\n     */\n    _defineProperty$1(this, \"render\", () => {\n      // Create HTML element: plyr__preview-thumbnail-container\n      this.elements.thumb.container = createElement('div', {\n        class: this.player.config.classNames.previewThumbnails.thumbContainer\n      });\n\n      // Wrapper for the image for styling\n      this.elements.thumb.imageContainer = createElement('div', {\n        class: this.player.config.classNames.previewThumbnails.imageContainer\n      });\n      this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n      // Create HTML element, parent+span: time text (e.g., 01:32:00)\n      const timeContainer = createElement('div', {\n        class: this.player.config.classNames.previewThumbnails.timeContainer\n      });\n      this.elements.thumb.time = createElement('span', {}, '00:00');\n      timeContainer.appendChild(this.elements.thumb.time);\n      this.elements.thumb.imageContainer.appendChild(timeContainer);\n\n      // Inject the whole thumb\n      if (is.element(this.player.elements.progress)) {\n        this.player.elements.progress.appendChild(this.elements.thumb.container);\n      }\n\n      // Create HTML element: plyr__preview-scrubbing-container\n      this.elements.scrubbing.container = createElement('div', {\n        class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n      });\n      this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n    });\n    _defineProperty$1(this, \"destroy\", () => {\n      if (this.elements.thumb.container) {\n        this.elements.thumb.container.remove();\n      }\n      if (this.elements.scrubbing.container) {\n        this.elements.scrubbing.container.remove();\n      }\n    });\n    _defineProperty$1(this, \"showImageAtCurrentTime\", () => {\n      if (this.mouseDown) {\n        this.setScrubbingContainerSize();\n      } else {\n        this.setThumbContainerSizeAndPos();\n      }\n\n      // Find the desired thumbnail index\n      // TODO: Handle a video longer than the thumbs where thumbNum is null\n      const thumbNum = this.thumbnails[0].frames.findIndex(frame => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime);\n      const hasThumb = thumbNum >= 0;\n      let qualityIndex = 0;\n\n      // Show the thumb container if we're not scrubbing\n      if (!this.mouseDown) {\n        this.toggleThumbContainer(hasThumb);\n      }\n\n      // No matching thumb found\n      if (!hasThumb) {\n        return;\n      }\n\n      // Check to see if we've already downloaded higher quality versions of this image\n      this.thumbnails.forEach((thumbnail, index) => {\n        if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n          qualityIndex = index;\n        }\n      });\n\n      // Only proceed if either thumb num or thumbfilename has changed\n      if (thumbNum !== this.showingThumb) {\n        this.showingThumb = thumbNum;\n        this.loadImage(qualityIndex);\n      }\n    });\n    // Show the image that's currently specified in this.showingThumb\n    _defineProperty$1(this, \"loadImage\", (qualityIndex = 0) => {\n      const thumbNum = this.showingThumb;\n      const thumbnail = this.thumbnails[qualityIndex];\n      const {\n        urlPrefix\n      } = thumbnail;\n      const frame = thumbnail.frames[thumbNum];\n      const thumbFilename = thumbnail.frames[thumbNum].text;\n      const thumbUrl = urlPrefix + thumbFilename;\n      if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n        // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n        // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n        if (this.loadingImage && this.usingSprites) {\n          this.loadingImage.onload = null;\n        }\n\n        // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n        // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n        // images causes a flicker. Putting a new image over the top does not\n        const previewImage = new Image();\n        previewImage.src = thumbUrl;\n        previewImage.dataset.index = thumbNum;\n        previewImage.dataset.filename = thumbFilename;\n        this.showingThumbFilename = thumbFilename;\n        this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n        // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n        previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n        this.loadingImage = previewImage;\n        this.removeOldImages(previewImage);\n      } else {\n        // Update the existing image\n        this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n        this.currentImageElement.dataset.index = thumbNum;\n        this.removeOldImages(this.currentImageElement);\n      }\n    });\n    _defineProperty$1(this, \"showImage\", (previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) => {\n      this.player.debug.log(`Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`);\n      this.setImageSizeAndOffset(previewImage, frame);\n      if (newImage) {\n        this.currentImageContainer.appendChild(previewImage);\n        this.currentImageElement = previewImage;\n        if (!this.loadedImages.includes(thumbFilename)) {\n          this.loadedImages.push(thumbFilename);\n        }\n      }\n\n      // Preload images before and after the current one\n      // Show higher quality of the same frame\n      // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n      this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n    });\n    // Remove all preview images that aren't the designated current image\n    _defineProperty$1(this, \"removeOldImages\", currentImage => {\n      // Get a list of all images, convert it from a DOM list to an array\n      Array.from(this.currentImageContainer.children).forEach(image => {\n        if (image.tagName.toLowerCase() !== 'img') {\n          return;\n        }\n        const removeDelay = this.usingSprites ? 500 : 1000;\n        if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n          // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n          // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n\n          image.dataset.deleting = true;\n\n          // This has to be set before the timeout - to prevent issues switching between hover and scrub\n          const {\n            currentImageContainer\n          } = this;\n          setTimeout(() => {\n            currentImageContainer.removeChild(image);\n            this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n          }, removeDelay);\n        }\n      });\n    });\n    // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n    // This will only preload the lowest quality\n    _defineProperty$1(this, \"preloadNearby\", (thumbNum, forward = true) => {\n      return new Promise(resolve => {\n        setTimeout(() => {\n          const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n          if (this.showingThumbFilename === oldThumbFilename) {\n            // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n            let thumbnailsClone;\n            if (forward) {\n              thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n            } else {\n              thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n            }\n            let foundOne = false;\n            thumbnailsClone.forEach(frame => {\n              const newThumbFilename = frame.text;\n              if (newThumbFilename !== oldThumbFilename) {\n                // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n                if (!this.loadedImages.includes(newThumbFilename)) {\n                  foundOne = true;\n                  this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n                  const {\n                    urlPrefix\n                  } = this.thumbnails[0];\n                  const thumbURL = urlPrefix + newThumbFilename;\n                  const previewImage = new Image();\n                  previewImage.src = thumbURL;\n                  previewImage.onload = () => {\n                    this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n                    if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n                    // We don't resolve until the thumb is loaded\n                    resolve();\n                  };\n                }\n              }\n            });\n\n            // If there are none to preload then we want to resolve immediately\n            if (!foundOne) {\n              resolve();\n            }\n          }\n        }, 300);\n      });\n    });\n    // If user has been hovering current image for half a second, look for a higher quality one\n    _defineProperty$1(this, \"getHigherQuality\", (currentQualityIndex, previewImage, frame, thumbFilename) => {\n      if (currentQualityIndex < this.thumbnails.length - 1) {\n        // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n        let previewImageHeight = previewImage.naturalHeight;\n        if (this.usingSprites) {\n          previewImageHeight = frame.h;\n        }\n        if (previewImageHeight < this.thumbContainerHeight) {\n          // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n          setTimeout(() => {\n            // Make sure the mouse hasn't already moved on and started hovering at another image\n            if (this.showingThumbFilename === thumbFilename) {\n              this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n              this.loadImage(currentQualityIndex + 1);\n            }\n          }, 300);\n        }\n      }\n    });\n    _defineProperty$1(this, \"toggleThumbContainer\", (toggle = false, clearShowing = false) => {\n      const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n      this.elements.thumb.container.classList.toggle(className, toggle);\n      if (!toggle && clearShowing) {\n        this.showingThumb = null;\n        this.showingThumbFilename = null;\n      }\n    });\n    _defineProperty$1(this, \"toggleScrubbingContainer\", (toggle = false) => {\n      const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n      this.elements.scrubbing.container.classList.toggle(className, toggle);\n      if (!toggle) {\n        this.showingThumb = null;\n        this.showingThumbFilename = null;\n      }\n    });\n    _defineProperty$1(this, \"determineContainerAutoSizing\", () => {\n      if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n        // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n        this.sizeSpecifiedInCSS = true;\n      }\n    });\n    // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n    _defineProperty$1(this, \"setThumbContainerSizeAndPos\", () => {\n      const {\n        imageContainer\n      } = this.elements.thumb;\n      if (!this.sizeSpecifiedInCSS) {\n        const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n        imageContainer.style.height = `${this.thumbContainerHeight}px`;\n        imageContainer.style.width = `${thumbWidth}px`;\n      } else if (imageContainer.clientHeight > 20 && imageContainer.clientWidth < 20) {\n        const thumbWidth = Math.floor(imageContainer.clientHeight * this.thumbAspectRatio);\n        imageContainer.style.width = `${thumbWidth}px`;\n      } else if (imageContainer.clientHeight < 20 && imageContainer.clientWidth > 20) {\n        const thumbHeight = Math.floor(imageContainer.clientWidth / this.thumbAspectRatio);\n        imageContainer.style.height = `${thumbHeight}px`;\n      }\n      this.setThumbContainerPos();\n    });\n    _defineProperty$1(this, \"setThumbContainerPos\", () => {\n      const scrubberRect = this.player.elements.progress.getBoundingClientRect();\n      const containerRect = this.player.elements.container.getBoundingClientRect();\n      const {\n        container\n      } = this.elements.thumb;\n      // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n      const min = containerRect.left - scrubberRect.left + 10;\n      const max = containerRect.right - scrubberRect.left - container.clientWidth - 10;\n      // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n      const position = this.mousePosX - scrubberRect.left - container.clientWidth / 2;\n      const clamped = clamp(position, min, max);\n\n      // Move the popover position\n      container.style.left = `${clamped}px`;\n\n      // The arrow can follow the cursor\n      container.style.setProperty('--preview-arrow-offset', `${position - clamped}px`);\n    });\n    // Can't use 100% width, in case the video is a different aspect ratio to the video container\n    _defineProperty$1(this, \"setScrubbingContainerSize\", () => {\n      const {\n        width,\n        height\n      } = fitRatio(this.thumbAspectRatio, {\n        width: this.player.media.clientWidth,\n        height: this.player.media.clientHeight\n      });\n      this.elements.scrubbing.container.style.width = `${width}px`;\n      this.elements.scrubbing.container.style.height = `${height}px`;\n    });\n    // Sprites need to be offset to the correct location\n    _defineProperty$1(this, \"setImageSizeAndOffset\", (previewImage, frame) => {\n      if (!this.usingSprites) return;\n\n      // Find difference between height and preview container height\n      const multiplier = this.thumbContainerHeight / frame.h;\n      previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n      previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n      previewImage.style.left = `-${frame.x * multiplier}px`;\n      previewImage.style.top = `-${frame.y * multiplier}px`;\n    });\n    this.player = player;\n    this.thumbnails = [];\n    this.loaded = false;\n    this.lastMouseMoveTime = Date.now();\n    this.mouseDown = false;\n    this.loadedImages = [];\n    this.elements = {\n      thumb: {},\n      scrubbing: {}\n    };\n    this.load();\n  }\n  get enabled() {\n    return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n  }\n  get currentImageContainer() {\n    return this.mouseDown ? this.elements.scrubbing.container : this.elements.thumb.imageContainer;\n  }\n  get usingSprites() {\n    return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n  }\n  get thumbAspectRatio() {\n    if (this.usingSprites) {\n      return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n    }\n    return this.thumbnails[0].width / this.thumbnails[0].height;\n  }\n  get thumbContainerHeight() {\n    if (this.mouseDown) {\n      const {\n        height\n      } = fitRatio(this.thumbAspectRatio, {\n        width: this.player.media.clientWidth,\n        height: this.player.media.clientHeight\n      });\n      return height;\n    }\n\n    // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n    if (this.sizeSpecifiedInCSS) {\n      return this.elements.thumb.imageContainer.clientHeight;\n    }\n    return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n  }\n  get currentImageElement() {\n    return this.mouseDown ? this.currentScrubbingImageElement : this.currentThumbnailImageElement;\n  }\n  set currentImageElement(element) {\n    if (this.mouseDown) {\n      this.currentScrubbingImageElement = element;\n    } else {\n      this.currentThumbnailImageElement = element;\n    }\n  }\n}\n\n// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nconst source = {\n  // Add elements to HTML5 media (source, tracks, etc)\n  insertElements(type, attributes) {\n    if (is.string(attributes)) {\n      insertElement(type, this.media, {\n        src: attributes\n      });\n    } else if (is.array(attributes)) {\n      attributes.forEach(attribute => {\n        insertElement(type, this.media, attribute);\n      });\n    }\n  },\n  // Update source\n  // Sources are not checked for support so be careful\n  change(input) {\n    if (!getDeep(input, 'sources.length')) {\n      this.debug.warn('Invalid source format');\n      return;\n    }\n\n    // Cancel current network requests\n    html5.cancelRequests.call(this);\n\n    // Destroy instance and re-setup\n    this.destroy(() => {\n      // Reset quality options\n      this.options.quality = [];\n\n      // Remove elements\n      removeElement(this.media);\n      this.media = null;\n\n      // Reset class name\n      if (is.element(this.elements.container)) {\n        this.elements.container.removeAttribute('class');\n      }\n\n      // Set the type and provider\n      const {\n        sources,\n        type\n      } = input;\n      const [{\n        provider = providers.html5,\n        src\n      }] = sources;\n      const tagName = provider === 'html5' ? type : 'div';\n      const attributes = provider === 'html5' ? {} : {\n        src\n      };\n      Object.assign(this, {\n        provider,\n        type,\n        // Check for support\n        supported: support.check(type, provider, this.config.playsinline),\n        // Create new element\n        media: createElement(tagName, attributes)\n      });\n\n      // Inject the new element\n      this.elements.container.appendChild(this.media);\n\n      // Autoplay the new source?\n      if (is.boolean(input.autoplay)) {\n        this.config.autoplay = input.autoplay;\n      }\n\n      // Set attributes for audio and video\n      if (this.isHTML5) {\n        if (this.config.crossorigin) {\n          this.media.setAttribute('crossorigin', '');\n        }\n        if (this.config.autoplay) {\n          this.media.setAttribute('autoplay', '');\n        }\n        if (!is.empty(input.poster)) {\n          this.poster = input.poster;\n        }\n        if (this.config.loop.active) {\n          this.media.setAttribute('loop', '');\n        }\n        if (this.config.muted) {\n          this.media.setAttribute('muted', '');\n        }\n        if (this.config.playsinline) {\n          this.media.setAttribute('playsinline', '');\n        }\n      }\n\n      // Restore class hook\n      ui.addStyleHook.call(this);\n\n      // Set new sources for html5\n      if (this.isHTML5) {\n        source.insertElements.call(this, 'source', sources);\n      }\n\n      // Set video title\n      this.config.title = input.title;\n\n      // Set up from scratch\n      media.setup.call(this);\n\n      // HTML5 stuff\n      if (this.isHTML5) {\n        // Setup captions\n        if (Object.keys(input).includes('tracks')) {\n          source.insertElements.call(this, 'track', input.tracks);\n        }\n      }\n\n      // If HTML5 or embed but not fully supported, setupInterface and call ready now\n      if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n        // Setup interface\n        ui.build.call(this);\n      }\n\n      // Load HTML5 sources\n      if (this.isHTML5) {\n        this.media.load();\n      }\n\n      // Update previewThumbnails config & reload plugin\n      if (!is.empty(input.previewThumbnails)) {\n        Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n        // Cleanup previewThumbnails plugin if it was loaded\n        if (this.previewThumbnails && this.previewThumbnails.loaded) {\n          this.previewThumbnails.destroy();\n          this.previewThumbnails = null;\n        }\n\n        // Create new instance if it is still enabled\n        if (this.config.previewThumbnails.enabled) {\n          this.previewThumbnails = new PreviewThumbnails(this);\n        }\n      }\n\n      // Update the fullscreen support\n      this.fullscreen.update();\n    }, true);\n  }\n};\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n  constructor(target, options) {\n    /**\n     * Play the media, or play the advertisement (if they are not blocked)\n     */\n    _defineProperty$1(this, \"play\", () => {\n      if (!is.function(this.media.play)) {\n        return null;\n      }\n\n      // Intecept play with ads\n      if (this.ads && this.ads.enabled) {\n        this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\n      }\n\n      // Return the promise (for HTML5)\n      return this.media.play();\n    });\n    /**\n     * Pause the media\n     */\n    _defineProperty$1(this, \"pause\", () => {\n      if (!this.playing || !is.function(this.media.pause)) {\n        return null;\n      }\n      return this.media.pause();\n    });\n    /**\n     * Toggle playback based on current status\n     * @param {boolean} input\n     */\n    _defineProperty$1(this, \"togglePlay\", input => {\n      // Toggle based on current state if nothing passed\n      const toggle = is.boolean(input) ? input : !this.playing;\n      if (toggle) {\n        return this.play();\n      }\n      return this.pause();\n    });\n    /**\n     * Stop playback\n     */\n    _defineProperty$1(this, \"stop\", () => {\n      if (this.isHTML5) {\n        this.pause();\n        this.restart();\n      } else if (is.function(this.media.stop)) {\n        this.media.stop();\n      }\n    });\n    /**\n     * Restart playback\n     */\n    _defineProperty$1(this, \"restart\", () => {\n      this.currentTime = 0;\n    });\n    /**\n     * Rewind\n     * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n     */\n    _defineProperty$1(this, \"rewind\", seekTime => {\n      this.currentTime -= is.number(seekTime) ? seekTime : this.config.seekTime;\n    });\n    /**\n     * Fast forward\n     * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n     */\n    _defineProperty$1(this, \"forward\", seekTime => {\n      this.currentTime += is.number(seekTime) ? seekTime : this.config.seekTime;\n    });\n    /**\n     * Increase volume\n     * @param {boolean} step - How much to decrease by (between 0 and 1)\n     */\n    _defineProperty$1(this, \"increaseVolume\", step => {\n      const volume = this.media.muted ? 0 : this.volume;\n      this.volume = volume + (is.number(step) ? step : 0);\n    });\n    /**\n     * Decrease volume\n     * @param {boolean} step - How much to decrease by (between 0 and 1)\n     */\n    _defineProperty$1(this, \"decreaseVolume\", step => {\n      this.increaseVolume(-step);\n    });\n    /**\n     * Trigger the airplay dialog\n     * TODO: update player with state, support, enabled\n     */\n    _defineProperty$1(this, \"airplay\", () => {\n      // Show dialog if supported\n      if (support.airplay) {\n        this.media.webkitShowPlaybackTargetPicker();\n      }\n    });\n    /**\n     * Toggle the player controls\n     * @param {boolean} [toggle] - Whether to show the controls\n     */\n    _defineProperty$1(this, \"toggleControls\", toggle => {\n      // Don't toggle if missing UI support or if it's audio\n      if (this.supported.ui && !this.isAudio) {\n        // Get state before change\n        const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n        // Negate the argument if not undefined since adding the class to hides the controls\n        const force = typeof toggle === 'undefined' ? undefined : !toggle;\n        // Apply and get updated state\n        const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n        // Close menu\n        if (hiding && is.array(this.config.controls) && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n          controls.toggleMenu.call(this, false);\n        }\n\n        // Trigger event on change\n        if (hiding !== isHidden) {\n          const eventName = hiding ? 'controlshidden' : 'controlsshown';\n          triggerEvent.call(this, this.media, eventName);\n        }\n        return !hiding;\n      }\n      return false;\n    });\n    /**\n     * Add event listeners\n     * @param {string} event - Event type\n     * @param {Function} callback - Callback for when event occurs\n     */\n    _defineProperty$1(this, \"on\", (event, callback) => {\n      on.call(this, this.elements.container, event, callback);\n    });\n    /**\n     * Add event listeners once\n     * @param {string} event - Event type\n     * @param {Function} callback - Callback for when event occurs\n     */\n    _defineProperty$1(this, \"once\", (event, callback) => {\n      once.call(this, this.elements.container, event, callback);\n    });\n    /**\n     * Remove event listeners\n     * @param {string} event - Event type\n     * @param {Function} callback - Callback for when event occurs\n     */\n    _defineProperty$1(this, \"off\", (event, callback) => {\n      off(this.elements.container, event, callback);\n    });\n    /**\n     * Destroy an instance\n     * Event listeners are removed when elements are removed\n     * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n     * @param {Function} callback - Callback for when destroy is complete\n     * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n     */\n    _defineProperty$1(this, \"destroy\", (callback, soft = false) => {\n      if (!this.ready) {\n        return;\n      }\n      const done = () => {\n        // Reset overflow (incase destroyed while in fullscreen)\n        document.body.style.overflow = '';\n\n        // GC for embed\n        this.embed = null;\n\n        // If it's a soft destroy, make minimal changes\n        if (soft) {\n          if (Object.keys(this.elements).length) {\n            // Remove elements\n            removeElement(this.elements.buttons.play);\n            removeElement(this.elements.captions);\n            removeElement(this.elements.controls);\n            removeElement(this.elements.wrapper);\n\n            // Clear for GC\n            this.elements.buttons.play = null;\n            this.elements.captions = null;\n            this.elements.controls = null;\n            this.elements.wrapper = null;\n          }\n\n          // Callback\n          if (is.function(callback)) {\n            callback();\n          }\n        } else {\n          // Unbind listeners\n          unbindListeners.call(this);\n\n          // Cancel current network requests\n          html5.cancelRequests.call(this);\n\n          // Replace the container with the original element provided\n          replaceElement(this.elements.original, this.elements.container);\n\n          // Event\n          triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n          // Callback\n          if (is.function(callback)) {\n            callback.call(this.elements.original);\n          }\n\n          // Reset state\n          this.ready = false;\n\n          // Clear for garbage collection\n          setTimeout(() => {\n            this.elements = null;\n            this.media = null;\n          }, 200);\n        }\n      };\n\n      // Stop playback\n      this.stop();\n\n      // Clear timeouts\n      clearTimeout(this.timers.loading);\n      clearTimeout(this.timers.controls);\n      clearTimeout(this.timers.resized);\n\n      // Provider specific stuff\n      if (this.isHTML5) {\n        // Restore native video controls\n        ui.toggleNativeControls.call(this, true);\n\n        // Clean up\n        done();\n      } else if (this.isYouTube) {\n        // Clear timers\n        clearInterval(this.timers.buffering);\n        clearInterval(this.timers.playing);\n\n        // Destroy YouTube API\n        if (this.embed !== null && is.function(this.embed.destroy)) {\n          this.embed.destroy();\n        }\n\n        // Clean up\n        done();\n      } else if (this.isVimeo) {\n        // Destroy Vimeo API\n        // then clean up (wait, to prevent postmessage errors)\n        if (this.embed !== null) {\n          this.embed.unload().then(done);\n        }\n\n        // Vimeo does not always return\n        setTimeout(done, 200);\n      }\n    });\n    /**\n     * Check for support for a mime type (HTML5 only)\n     * @param {string} type - Mime type\n     */\n    _defineProperty$1(this, \"supports\", type => support.mime.call(this, type));\n    this.timers = {};\n\n    // State\n    this.ready = false;\n    this.loading = false;\n    this.failed = false;\n\n    // Touch device\n    this.touch = support.touch;\n\n    // Set the media element\n    this.media = target;\n\n    // String selector passed\n    if (is.string(this.media)) {\n      this.media = document.querySelectorAll(this.media);\n    }\n\n    // jQuery, NodeList or Array passed, use first element\n    if (window.jQuery && this.media instanceof jQuery || is.nodeList(this.media) || is.array(this.media)) {\n      this.media = this.media[0];\n    }\n\n    // Set config\n    this.config = extend({}, defaults, Plyr.defaults, options || {}, (() => {\n      try {\n        return JSON.parse(this.media.getAttribute('data-plyr-config'));\n      } catch {\n        return {};\n      }\n    })());\n\n    // Elements cache\n    this.elements = {\n      container: null,\n      fullscreen: null,\n      captions: null,\n      buttons: {},\n      display: {},\n      progress: {},\n      inputs: {},\n      settings: {\n        popup: null,\n        menu: null,\n        panels: {},\n        buttons: {}\n      }\n    };\n\n    // Captions\n    this.captions = {\n      active: null,\n      currentTrack: -1,\n      meta: new WeakMap()\n    };\n\n    // Fullscreen\n    this.fullscreen = {\n      active: false\n    };\n\n    // Options\n    this.options = {\n      speed: [],\n      quality: []\n    };\n\n    // Debugging\n    // TODO: move to globals\n    this.debug = new Console(this.config.debug);\n\n    // Log config options and support\n    this.debug.log('Config', this.config);\n    this.debug.log('Support', support);\n\n    // We need an element to setup\n    if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n      this.debug.error('Setup failed: no suitable element passed');\n      return;\n    }\n\n    // Bail if the element is initialized\n    if (this.media.plyr) {\n      this.debug.warn('Target already setup');\n      return;\n    }\n\n    // Bail if not enabled\n    if (!this.config.enabled) {\n      this.debug.error('Setup failed: disabled by config');\n      return;\n    }\n\n    // Bail if disabled or no basic support\n    // You may want to disable certain UAs etc\n    if (!support.check().api) {\n      this.debug.error('Setup failed: no support');\n      return;\n    }\n\n    // Cache original element state for .destroy()\n    const clone = this.media.cloneNode(true);\n    clone.autoplay = false;\n    this.elements.original = clone;\n\n    // Set media type based on tag or data attribute\n    // Supported: video, audio, vimeo, youtube\n    const _type = this.media.tagName.toLowerCase();\n    // Embed properties\n    let iframe = null;\n    let url = null;\n\n    // Different setup based on type\n    switch (_type) {\n      case 'div':\n        // Find the frame\n        iframe = this.media.querySelector('iframe');\n\n        // <iframe> type\n        if (is.element(iframe)) {\n          // Detect provider\n          url = parseUrl(iframe.getAttribute('src'));\n          this.provider = getProviderByUrl(url.toString());\n\n          // Rework elements\n          this.elements.container = this.media;\n          this.media = iframe;\n\n          // Reset classname\n          this.elements.container.className = '';\n\n          // Get attributes from URL and set config\n          if (url.search.length) {\n            const truthy = ['1', 'true'];\n            if (truthy.includes(url.searchParams.get('autoplay'))) {\n              this.config.autoplay = true;\n            }\n            if (truthy.includes(url.searchParams.get('loop'))) {\n              this.config.loop.active = true;\n            }\n\n            // TODO: replace fullscreen.iosNative with this playsinline config option\n            // YouTube requires the playsinline in the URL\n            if (this.isYouTube) {\n              this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n              this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n            } else {\n              this.config.playsinline = true;\n            }\n          }\n        } else {\n          // <div> with attributes\n          this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n          // Remove attribute\n          this.media.removeAttribute(this.config.attributes.embed.provider);\n        }\n\n        // Unsupported or missing provider\n        if (is.empty(this.provider) || !Object.values(providers).includes(this.provider)) {\n          this.debug.error('Setup failed: Invalid provider');\n          return;\n        }\n\n        // Audio will come later for external providers\n        this.type = types.video;\n        break;\n      case 'video':\n      case 'audio':\n        this.type = _type;\n        this.provider = providers.html5;\n\n        // Get config from attributes\n        if (this.media.hasAttribute('crossorigin')) {\n          this.config.crossorigin = true;\n        }\n        if (this.media.hasAttribute('autoplay')) {\n          this.config.autoplay = true;\n        }\n        if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n          this.config.playsinline = true;\n        }\n        if (this.media.hasAttribute('muted')) {\n          this.config.muted = true;\n        }\n        if (this.media.hasAttribute('loop')) {\n          this.config.loop.active = true;\n        }\n        break;\n      default:\n        this.debug.error('Setup failed: unsupported type');\n        return;\n    }\n\n    // Check for support again but with type\n    this.supported = support.check(this.type, this.provider);\n\n    // If no support for even API, bail\n    if (!this.supported.api) {\n      this.debug.error('Setup failed: no support');\n      return;\n    }\n    this.eventListeners = [];\n\n    // Create listeners\n    this.listeners = new Listeners(this);\n\n    // Setup local storage for user settings\n    this.storage = new Storage(this);\n\n    // Store reference\n    this.media.plyr = this;\n\n    // Wrap media\n    if (!is.element(this.elements.container)) {\n      this.elements.container = createElement('div');\n      wrap(this.media, this.elements.container);\n    }\n\n    // Migrate custom properties from media to container (so they work \uD83D\uDE09)\n    ui.migrateStyles.call(this);\n\n    // Add style hook\n    ui.addStyleHook.call(this);\n\n    // Setup media\n    media.setup.call(this);\n\n    // Listen for events if debugging\n    if (this.config.debug) {\n      on.call(this, this.elements.container, this.config.events.join(' '), event => {\n        this.debug.log(`event: ${event.type}`);\n      });\n    }\n\n    // Setup fullscreen\n    this.fullscreen = new Fullscreen(this);\n\n    // Setup interface\n    // If embed but not fully supported, build interface now to avoid flash of controls\n    if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n      ui.build.call(this);\n    }\n\n    // Container listeners\n    this.listeners.container();\n\n    // Global listeners\n    this.listeners.global();\n\n    // Setup ads if provided\n    if (this.config.ads.enabled) {\n      this.ads = new Ads(this);\n    }\n\n    // Autoplay if required\n    if (this.isHTML5 && this.config.autoplay) {\n      this.once('canplay', () => silencePromise(this.play()));\n    }\n\n    // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n    this.lastSeekTime = 0;\n\n    // Setup preview thumbnails if enabled\n    if (this.config.previewThumbnails.enabled) {\n      this.previewThumbnails = new PreviewThumbnails(this);\n    }\n  }\n\n  // ---------------------------------------\n  // API\n  // ---------------------------------------\n\n  /**\n   * Types and provider helpers\n   */\n  get isHTML5() {\n    return this.provider === providers.html5;\n  }\n  get isEmbed() {\n    return this.isYouTube || this.isVimeo;\n  }\n  get isYouTube() {\n    return this.provider === providers.youtube;\n  }\n  get isVimeo() {\n    return this.provider === providers.vimeo;\n  }\n  get isVideo() {\n    return this.type === types.video;\n  }\n  get isAudio() {\n    return this.type === types.audio;\n  }\n  /**\n   * Get playing state\n   */\n  get playing() {\n    return Boolean(this.ready && !this.paused && !this.ended);\n  }\n\n  /**\n   * Get paused state\n   */\n  get paused() {\n    return Boolean(this.media.paused);\n  }\n\n  /**\n   * Get stopped state\n   */\n  get stopped() {\n    return Boolean(this.paused && this.currentTime === 0);\n  }\n\n  /**\n   * Get ended state\n   */\n  get ended() {\n    return Boolean(this.media.ended);\n  }\n  /**\n   * Seek to a time\n   * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n   */\n  set currentTime(input) {\n    // Bail if media duration isn't available yet\n    if (!this.duration) {\n      return;\n    }\n\n    // Validate input\n    const inputIsValid = is.number(input) && input > 0;\n\n    // Set\n    this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n    // Logging\n    this.debug.log(`Seeking to ${this.currentTime} seconds`);\n  }\n\n  /**\n   * Get current time\n   */\n  get currentTime() {\n    return Number(this.media.currentTime);\n  }\n\n  /**\n   * Get buffered\n   */\n  get buffered() {\n    const {\n      buffered\n    } = this.media;\n\n    // YouTube / Vimeo return a float between 0-1\n    if (is.number(buffered)) {\n      return buffered;\n    }\n\n    // HTML5\n    // TODO: Handle buffered chunks of the media\n    // (i.e. seek to another section buffers only that section)\n    if (buffered && buffered.length && this.duration > 0) {\n      return buffered.end(0) / this.duration;\n    }\n    return 0;\n  }\n\n  /**\n   * Get seeking status\n   */\n  get seeking() {\n    return Boolean(this.media.seeking);\n  }\n\n  /**\n   * Get the duration of the current media\n   */\n  get duration() {\n    // Faux duration set via config\n    const fauxDuration = Number.parseFloat(this.config.duration);\n    // Media duration can be NaN or Infinity before the media has loaded\n    const realDuration = (this.media || {}).duration;\n    const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n    // If config duration is funky, use regular duration\n    return fauxDuration || duration;\n  }\n\n  /**\n   * Set the player volume\n   * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n   */\n  set volume(value) {\n    let volume = value;\n    const max = 1;\n    const min = 0;\n    if (is.string(volume)) {\n      volume = Number(volume);\n    }\n\n    // Load volume from storage if no value specified\n    if (!is.number(volume)) {\n      volume = this.storage.get('volume');\n    }\n\n    // Use config if all else fails\n    if (!is.number(volume)) {\n      ({\n        volume\n      } = this.config);\n    }\n\n    // Maximum is volumeMax\n    if (volume > max) {\n      volume = max;\n    }\n    // Minimum is volumeMin\n    if (volume < min) {\n      volume = min;\n    }\n\n    // Update config\n    this.config.volume = volume;\n\n    // Set the player volume\n    this.media.volume = volume;\n\n    // If muted, and we're increasing volume manually, reset muted state\n    if (!is.empty(value) && this.muted && volume > 0) {\n      this.muted = false;\n    }\n  }\n\n  /**\n   * Get the current player volume\n   */\n  get volume() {\n    return Number(this.media.volume);\n  }\n  /**\n   * Set muted state\n   * @param {boolean} mute\n   */\n  set muted(mute) {\n    let toggle = mute;\n\n    // Load muted state from storage\n    if (!is.boolean(toggle)) {\n      toggle = this.storage.get('muted');\n    }\n\n    // Use config if all else fails\n    if (!is.boolean(toggle)) {\n      toggle = this.config.muted;\n    }\n\n    // Update config\n    this.config.muted = toggle;\n\n    // Set mute on the player\n    this.media.muted = toggle;\n  }\n\n  /**\n   * Get current muted state\n   */\n  get muted() {\n    return Boolean(this.media.muted);\n  }\n\n  /**\n   * Check if the media has audio\n   */\n  get hasAudio() {\n    // Assume yes for all non HTML5 (as we can't tell...)\n    if (!this.isHTML5) {\n      return true;\n    }\n    if (this.isAudio) {\n      return true;\n    }\n\n    // Get audio tracks\n    return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n  }\n\n  /**\n   * Set playback speed\n   * @param {number} input - the speed of playback (0.5-2.0)\n   */\n  set speed(input) {\n    let speed = null;\n    if (is.number(input)) {\n      speed = input;\n    }\n    if (!is.number(speed)) {\n      speed = this.storage.get('speed');\n    }\n    if (!is.number(speed)) {\n      speed = this.config.speed.selected;\n    }\n\n    // Clamp to min/max\n    const {\n      minimumSpeed: min,\n      maximumSpeed: max\n    } = this;\n    speed = clamp(speed, min, max);\n\n    // Update config\n    this.config.speed.selected = speed;\n\n    // Set media speed\n    setTimeout(() => {\n      if (this.media) {\n        this.media.playbackRate = speed;\n      }\n    }, 0);\n  }\n\n  /**\n   * Get current playback speed\n   */\n  get speed() {\n    return Number(this.media.playbackRate);\n  }\n\n  /**\n   * Get the minimum allowed speed\n   */\n  get minimumSpeed() {\n    if (this.isYouTube) {\n      // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n      return Math.min(...this.options.speed);\n    }\n    if (this.isVimeo) {\n      // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n      return 0.5;\n    }\n\n    // https://stackoverflow.com/a/32320020/1191319\n    return 0.0625;\n  }\n\n  /**\n   * Get the maximum allowed speed\n   */\n  get maximumSpeed() {\n    if (this.isYouTube) {\n      // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n      return Math.max(...this.options.speed);\n    }\n    if (this.isVimeo) {\n      // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n      return 2;\n    }\n\n    // https://stackoverflow.com/a/32320020/1191319\n    return 16;\n  }\n\n  /**\n   * Set playback quality\n   * Currently HTML5 & YouTube only\n   * @param {number} input - Quality level\n   */\n  set quality(input) {\n    const config = this.config.quality;\n    const options = this.options.quality;\n    if (!options.length) {\n      return;\n    }\n    let quality = [!is.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is.number);\n    let updateStorage = true;\n    if (!options.includes(quality)) {\n      const value = closest(options, quality);\n      this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n      quality = value;\n\n      // Don't update storage if quality is not supported\n      updateStorage = false;\n    }\n\n    // Update config\n    config.selected = quality;\n\n    // Set quality\n    this.media.quality = quality;\n\n    // Save to storage\n    if (updateStorage) {\n      this.storage.set({\n        quality\n      });\n    }\n  }\n\n  /**\n   * Get current quality level\n   */\n  get quality() {\n    return this.media.quality;\n  }\n\n  /**\n   * Toggle loop\n   * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n   * @param {boolean} input - Whether to loop or not\n   */\n  set loop(input) {\n    const toggle = is.boolean(input) ? input : this.config.loop.active;\n    this.config.loop.active = toggle;\n    this.media.loop = toggle;\n\n    // Set default to be a true toggle\n    /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n         switch (type) {\n            case 'start':\n                if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n                    this.config.loop.end = null;\n                }\n                this.config.loop.start = this.currentTime;\n                // this.config.loop.indicator.start = this.elements.display.played.value;\n                break;\n             case 'end':\n                if (this.config.loop.start >= this.currentTime) {\n                    return this;\n                }\n                this.config.loop.end = this.currentTime;\n                // this.config.loop.indicator.end = this.elements.display.played.value;\n                break;\n             case 'all':\n                this.config.loop.start = 0;\n                this.config.loop.end = this.duration - 2;\n                this.config.loop.indicator.start = 0;\n                this.config.loop.indicator.end = 100;\n                break;\n             case 'toggle':\n                if (this.config.loop.active) {\n                    this.config.loop.start = 0;\n                    this.config.loop.end = null;\n                } else {\n                    this.config.loop.start = 0;\n                    this.config.loop.end = this.duration - 2;\n                }\n                break;\n             default:\n                this.config.loop.start = 0;\n                this.config.loop.end = null;\n                break;\n        } */\n  }\n\n  /**\n   * Get current loop state\n   */\n  get loop() {\n    return Boolean(this.media.loop);\n  }\n\n  /**\n   * Set new media source\n   * @param {object} input - The new source object (see docs)\n   */\n  set source(input) {\n    source.change.call(this, input);\n  }\n\n  /**\n   * Get current source\n   */\n  get source() {\n    return this.media.currentSrc;\n  }\n\n  /**\n   * Get a download URL (either source or custom)\n   */\n  get download() {\n    const {\n      download\n    } = this.config.urls;\n    return is.url(download) ? download : this.source;\n  }\n\n  /**\n   * Set the download URL\n   */\n  set download(input) {\n    if (!is.url(input)) {\n      return;\n    }\n    this.config.urls.download = input;\n    controls.setDownloadUrl.call(this);\n  }\n\n  /**\n   * Set the poster image for a video\n   * @param {string} input - the URL for the new poster image\n   */\n  set poster(input) {\n    if (!this.isVideo) {\n      this.debug.warn('Poster can only be set for video');\n      return;\n    }\n    ui.setPoster.call(this, input, false).catch(() => {});\n  }\n\n  /**\n   * Get the current poster image\n   */\n  get poster() {\n    if (!this.isVideo) {\n      return null;\n    }\n    return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n  }\n\n  /**\n   * Get the current aspect ratio in use\n   */\n  get ratio() {\n    if (!this.isVideo) {\n      return null;\n    }\n    const ratio = reduceAspectRatio(getAspectRatio.call(this));\n    return is.array(ratio) ? ratio.join(':') : ratio;\n  }\n\n  /**\n   * Set video aspect ratio\n   */\n  set ratio(input) {\n    if (!this.isVideo) {\n      this.debug.warn('Aspect ratio can only be set for video');\n      return;\n    }\n    if (!is.string(input) || !validateAspectRatio(input)) {\n      this.debug.error(`Invalid aspect ratio specified (${input})`);\n      return;\n    }\n    this.config.ratio = reduceAspectRatio(input);\n    setAspectRatio.call(this);\n  }\n\n  /**\n   * Set the autoplay state\n   * @param {boolean} input - Whether to autoplay or not\n   */\n  set autoplay(input) {\n    this.config.autoplay = is.boolean(input) ? input : this.config.autoplay;\n  }\n\n  /**\n   * Get the current autoplay state\n   */\n  get autoplay() {\n    return Boolean(this.config.autoplay);\n  }\n\n  /**\n   * Toggle captions\n   * @param {boolean} input - Whether to enable captions\n   */\n  toggleCaptions(input) {\n    captions.toggle.call(this, input, false);\n  }\n\n  /**\n   * Set the caption track by index\n   * @param {number} input - Caption index\n   */\n  set currentTrack(input) {\n    captions.set.call(this, input, false);\n    captions.setup.call(this);\n  }\n\n  /**\n   * Get the current caption track index (-1 if disabled)\n   */\n  get currentTrack() {\n    const {\n      toggled,\n      currentTrack\n    } = this.captions;\n    return toggled ? currentTrack : -1;\n  }\n\n  /**\n   * Set the wanted language for captions\n   * Since tracks can be added later it won't update the actual caption track until there is a matching track\n   * @param {string} input - Two character ISO language code (e.g. EN, FR, PT, etc)\n   */\n  set language(input) {\n    captions.setLanguage.call(this, input, false);\n  }\n\n  /**\n   * Get the current track's language\n   */\n  get language() {\n    return (captions.getCurrentTrack.call(this) || {}).language;\n  }\n\n  /**\n   * Toggle picture-in-picture playback on WebKit/MacOS\n   * TODO: update player with state, support, enabled\n   * TODO: detect outside changes\n   */\n  set pip(input) {\n    // Bail if no support\n    if (!support.pip) {\n      return;\n    }\n\n    // Toggle based on current state if not passed\n    const toggle = is.boolean(input) ? input : !this.pip;\n\n    // Toggle based on current state\n    // Safari\n    if (is.function(this.media.webkitSetPresentationMode)) {\n      this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n    }\n\n    // Chrome\n    if (is.function(this.media.requestPictureInPicture)) {\n      if (!this.pip && toggle) {\n        this.media.requestPictureInPicture();\n      } else if (this.pip && !toggle) {\n        document.exitPictureInPicture();\n      }\n    }\n  }\n\n  /**\n   * Get the current picture-in-picture state\n   */\n  get pip() {\n    if (!support.pip) {\n      return null;\n    }\n\n    // Safari\n    if (!is.empty(this.media.webkitPresentationMode)) {\n      return this.media.webkitPresentationMode === pip.active;\n    }\n\n    // Chrome\n    return this.media === document.pictureInPictureElement;\n  }\n\n  /**\n   * Sets the preview thumbnails for the current source\n   */\n  setPreviewThumbnails(thumbnailSource) {\n    if (this.previewThumbnails && this.previewThumbnails.loaded) {\n      this.previewThumbnails.destroy();\n      this.previewThumbnails = null;\n    }\n    Object.assign(this.config.previewThumbnails, thumbnailSource);\n\n    // Create new instance if it is still enabled\n    if (this.config.previewThumbnails.enabled) {\n      this.previewThumbnails = new PreviewThumbnails(this);\n    }\n  }\n  /**\n   * Check for support\n   * @param {string} type - Player type (audio/video)\n   * @param {string} provider - Provider (html5/youtube/vimeo)\n   */\n  static supported(type, provider) {\n    return support.check(type, provider);\n  }\n\n  /**\n   * Load an SVG sprite into the page\n   * @param {string} url - URL for the SVG sprite\n   * @param {string} [id] - Unique ID\n   */\n  static loadSprite(url, id) {\n    return loadSprite(url, id);\n  }\n\n  /**\n   * Setup multiple instances\n   * @param {*} selector\n   * @param {object} options\n   */\n  static setup(selector, options = {}) {\n    let targets = null;\n    if (is.string(selector)) {\n      targets = Array.from(document.querySelectorAll(selector));\n    } else if (is.nodeList(selector)) {\n      targets = Array.from(selector);\n    } else if (is.array(selector)) {\n      targets = selector.filter(is.element);\n    }\n    if (is.empty(targets)) {\n      return null;\n    }\n    return targets.map(t => new Plyr(t, options));\n  }\n}\nPlyr.defaults = cloneDeep(defaults);\n\nexport { Plyr as default };\n//# sourceMappingURL=plyr.js.map\n", "import { Controller } from '@hotwired/stimulus';\nimport Hls from 'hls.js';\nimport Plyr from 'plyr';\n\nexport default class extends Controller {\n  static values = { url: String, useBackgroundPlayer: Boolean };\n  static targets = ['video'];\n\n  connect() {\n    const video = this.videoTarget;\n    const source = this.urlValue;\n\n    if (this.useBackgroundPlayerValue) {\n      // do nothing, no player UI needed\n    } else {\n      const player = new Plyr(video, { fullscreen: { enabled: true, iosNative: true } });\n    }\n\n    if (Hls.isSupported()) {\n      const hls = new Hls();\n      hls.loadSource(source);\n      hls.attachMedia(video);\n      this.hls = hls;\n    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {\n      video.src = source;\n    }\n  }\n\n  disconnect() {\n    if (this.hls) {\n      this.hls.destroy();\n    }\n  }\n}\n", "import c0 from './auto_submit_period_select_controller';\nimport c1 from './availability_search/floating_bar_controller';\nimport c2 from './availability_search/location_filter_controller';\nimport c3 from './availability_search/location_filter_menu_item_controller';\nimport c4 from './availability_search/primary_filters_controller';\nimport c5 from './carousel_controller';\nimport c6 from './consent/consent_management_controller';\nimport c7 from './increment_controller';\nimport c8 from './initialize_controller';\nimport c9 from './openable_controller';\nimport c10 from './overlappable_controller';\nimport c11 from './period_select_controller';\nimport c12 from './pop_up_controller';\nimport c13 from './recaptcha_controller';\nimport c14 from './slideshow_controller';\nimport c15 from './sticky_controller';\nimport c16 from './turbo_opt_in_controller';\nimport c17 from './turbo_request_controller';\nimport c18 from './video_player_controller';\nexport const definitions = [\n\t{identifier: 'auto-submit-period-select', controllerConstructor: c0},\n\t{identifier: 'availability-search--floating-bar', controllerConstructor: c1},\n\t{identifier: 'availability-search--location-filter', controllerConstructor: c2},\n\t{identifier: 'availability-search--location-filter-menu-item', controllerConstructor: c3},\n\t{identifier: 'availability-search--primary-filters', controllerConstructor: c4},\n\t{identifier: 'carousel', controllerConstructor: c5},\n\t{identifier: 'consent--consent-management', controllerConstructor: c6},\n\t{identifier: 'increment', controllerConstructor: c7},\n\t{identifier: 'initialize', controllerConstructor: c8},\n\t{identifier: 'openable', controllerConstructor: c9},\n\t{identifier: 'overlappable', controllerConstructor: c10},\n\t{identifier: 'period-select', controllerConstructor: c11},\n\t{identifier: 'pop-up', controllerConstructor: c12},\n\t{identifier: 'recaptcha', controllerConstructor: c13},\n\t{identifier: 'slideshow', controllerConstructor: c14},\n\t{identifier: 'sticky', controllerConstructor: c15},\n\t{identifier: 'turbo-opt-in', controllerConstructor: c16},\n\t{identifier: 'turbo-request', controllerConstructor: c17},\n\t{identifier: 'video-player', controllerConstructor: c18},\n];\n", "import { Controller } from '@hotwired/stimulus';\n\n/**\n * Manages stacking contexts within an application.\n * See https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n */\nexport default class extends Controller {\n  static targets = ['portal'];\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    if (navigator.maxTouchPoints === 0) {\n      this.element.focus();\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport debounce from 'lodash.debounce';\n\n/**\n * Auto submits a form when the #submit action is triggered\n *\n * @example\n * %form(data-controller=\"autosubmit\")\n *   %input(type=\"checkbox\" data-action=\"change->autosubmit#submit\")\n */\nexport default class extends Controller {\n  submit() {\n    if ('Turbo' in window && Turbo.navigator.delegate.elementIsNavigatable(this.element)) {\n      this.turboSubmit();\n    } else {\n      $(this.element).trigger('submit');\n    }\n  }\n\n  turboSubmit() {\n    this.element.dispatchEvent(new CustomEvent('submit', { bubbles: true, cancelable: true }));\n  }\n\n  // Debounced version of the update function which prevent multiple requests from being sent in quick succession.\n  // Usage: data-action=\"change->autosubmit#debouncedSubmit\"\n  debouncedSubmit = debounce(this.submit, 250);\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport default class extends Controller {\n  static targets = ['input', 'component'];\n\n  initialize() {\n    this.component = import(`../react_components/date_calendar.jsx`);\n    this.mounted = false;\n  }\n\n  connect() {\n    $(document).on('tabsPanel.toggleActive', this.handleTabsPanelToggleActive);\n\n    this.mountComponentIfVisible();\n  }\n\n  disconnect() {\n    $(document).off('tabsPanel.toggleActive', this.handleTabsPanelToggleActive);\n\n    this.unmountComponent();\n  }\n\n  handleTabsPanelToggleActive = (e, tabsPanel, isActive) => {\n    if (tabsPanel.contains(this.element) && isActive && !this.mounted) {\n      this.mountComponentIfVisible();\n    }\n  };\n\n  handleChange = (date) => {\n    if (date !== null) {\n      this.inputTarget.value = date.format('YYYY-MM-DD');\n    }\n    this.inputTarget.dispatchEvent(new CustomEvent('datecalendar.change', { bubbles: true, detail: { value: date } }));\n  };\n\n  mountComponentIfVisible = () => {\n    if ($(this.element).is(':visible')) {\n      this.mountComponent();\n    }\n  };\n\n  mountComponent = async () => {\n    const DateCalendar = await this.component;\n\n    ReactDOM.render(\n      <DateCalendar.default\n        initialDate={this.inputTarget.value}\n        minDate={this.data.get('min')}\n        maxDate={this.data.get('max')}\n        onChange={this.handleChange}\n      />,\n      this.componentTarget\n    );\n\n    this.mounted = true;\n  };\n\n  unmountComponent = () => {\n    ReactDOM.unmountComponentAtNode(this.componentTarget);\n    this.mounted = false;\n  };\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst DATE_FORMAT = 'YYYY-MM-DD';\n\nexport default class extends Controller {\n  static targets = ['startDateInput', 'endDateInput', 'component'];\n\n  initialize() {\n    this.component = import(`../react_components/date_range_calendar.jsx`);\n    this.componentRef = React.createRef();\n    this.mounted = false;\n  }\n\n  connect() {\n    $(document).on('tabsPanel.toggleActive', this.handleTabsPanelToggleActive);\n    this.startDateInputTarget.addEventListener('change', this.handleInputChange);\n    this.endDateInputTarget.addEventListener('change', this.handleInputChange);\n    this.element.addEventListener('turbo:before-morph-element', this.handleBeforeMorph);\n    this.element.addEventListener('turbo:morph-element', this.handleAfterMorph);\n    this.resizeObserver = new ResizeObserver(() => {\n      this.componentRef.current?.setState({ daySize: this.daySize });\n      this.componentTarget.style.setProperty('min-height', `${this.minHeight}px`);\n    });\n    this.resizeObserver.observe(this.element);\n    this.mountComponentIfVisible();\n  }\n\n  disconnect() {\n    $(document).off('tabsPanel.toggleActive', this.handleTabsPanelToggleActive);\n    this.startDateInputTarget.removeEventListener('change', this.handleInputChange);\n    this.endDateInputTarget.removeEventListener('change', this.handleInputChange);\n    this.element.removeEventListener('turbo:before-morph-element', this.handleBeforeMorph);\n    this.element.removeEventListener('turbo:morph-element', this.handleAfterMorph);\n    this.resizeObserver.disconnect();\n    this.unmountComponent();\n  }\n\n  mountComponentIfVisible = () => {\n    if ($(this.element).is(':visible')) {\n      this.mountComponent();\n    }\n  };\n\n  mountComponent = async () => {\n    const DateRangeCalendar = await this.component;\n\n    ReactDOM.render(\n      <DateRangeCalendar.default\n        ref={this.componentRef}\n        daySize={this.daySize}\n        mode={this.data.get('mode')}\n        initialStartDate={this.startDateInputTarget.value}\n        initialEndDate={this.endDateInputTarget.value}\n        minDate={this.data.get('min')}\n        maxDate={this.data.get('max')}\n        minNights={parseInt(this.data.get('min-nights'), 10) || undefined}\n        maxDays={parseInt(this.data.get('max-days'), 10) || undefined}\n        numberOfMonths={this.numberOfMonths}\n        blockedDatesUrl={this.data.get('blocked-dates-url')}\n        onChange={this.handleCalendarChange}\n        onEndDateChange={this.handleCalendarEndDateChange}\n      />,\n      this.componentTarget\n    );\n\n    this.mounted = true;\n  };\n\n  unmountComponent = () => {\n    ReactDOM.unmountComponentAtNode(this.componentTarget);\n    this.mounted = false;\n  };\n\n  handleTabsPanelToggleActive = (e, tabsPanel, isActive) => {\n    if (tabsPanel.contains(this.element) && isActive && !this.mounted) {\n      this.mountComponentIfVisible();\n    }\n  };\n\n  handleBeforeMorph = () => {\n    if (this.mounted) this.unmountComponent();\n  };\n\n  handleAfterMorph = () => {\n    this.mountComponentIfVisible();\n  };\n\n  handleInputChange = () => {\n    const startDateValue = this.startDateInputTarget.value;\n    const endDateValue = this.endDateInputTarget.value;\n\n    const startDate = isValidDate(startDateValue) ? moment(startDateValue, DATE_FORMAT) : null;\n    const endDate = isValidDate(endDateValue) ? moment(endDateValue, DATE_FORMAT) : null;\n\n    this.rerenderCalendar();\n    this.dispatch('change', { detail: { startDate, endDate } });\n  };\n\n  handleCalendarChange = (startDate, endDate) => {\n    this.startDateInputTarget.value = startDate ? startDate.format(DATE_FORMAT) : '';\n    this.dispatch('change', { detail: { startDate, endDate } });\n  };\n\n  handleCalendarEndDateChange = (endDate) => {\n    this.endDateInputTarget.value = endDate ? endDate.format(DATE_FORMAT) : '';\n    this.dispatch('endDateChange', { detail: { endDate } });\n  };\n\n  setDates(startDate, endDate) {\n    this.startDateInputTarget.value = startDate ? startDate.format(DATE_FORMAT) : '';\n    this.endDateInputTarget.value = endDate ? endDate.format(DATE_FORMAT) : '';\n    this.rerenderCalendar();\n  }\n\n  rerenderCalendar() {\n    this.unmountComponent();\n    this.mountComponent();\n  }\n\n  get numberOfMonths() {\n    return parseInt(this.data.get('number-of-months'), 10) || 2;\n  }\n\n  get daySize() {\n    return { normal: 40, large: 44, fill: this.fillDaySize }[this.data.get('size') || 'normal'];\n  }\n\n  get fillDaySize() {\n    return Math.floor(($(this.element).width() - this.fillPadding) / (7 * this.numberOfMonths));\n  }\n\n  get fillPadding() {\n    return { 1: 44, 2: 72 }[this.numberOfMonths];\n  }\n\n  get minHeight() {\n    return this.daySize * 5 + 44 + 18 + 36;\n  }\n}\n\nfunction isValidDate(date) {\n  return moment(date, DATE_FORMAT, true).isValid();\n}\n", "import { Controller } from '@hotwired/stimulus';\n\n/**\n * Expands or collapses an area with an animation via a trigger (such as a button)\n *\n * @example\n * %div(data-controller=\"expandable\")\n *   %div(data-expandable-target=\"area\" style=\"display: none\")\n *     Content goes here...\n *   %button(type=\"button\" data-expandable-target=\"expand\") Expand\n *   %button(type=\"button\" data-expandable-target=\"collapse\" style=\"display: none\") Collapse\n */\nexport default class extends Controller {\n  static targets = ['area', 'expand', 'collapse'];\n\n  connect() {\n    $(this.expandTarget).on('click', this.handleExpandClick);\n    $(this.collapseTarget).on('click', this.handleCollapseClick);\n  }\n\n  disconnect() {\n    $(this.expandTarget).off('click', this.handleExpandClick);\n    $(this.collapseTarget).off('click', this.handleCollapseClick);\n  }\n\n  handleExpandClick = () => {\n    $(this.areaTarget).slideDown('fast');\n    $(this.expandTarget).hide();\n    $(this.collapseTarget).show();\n  };\n\n  handleCollapseClick = () => {\n    $(this.areaTarget).slideUp('fast');\n    $(this.expandTarget).show();\n    $(this.collapseTarget).hide();\n  };\n}\n", "export class LiveObserver extends MutationObserver {\n  constructor(element, callback) {\n    super(callback);\n    this.element = element;\n  }\n\n  connect() {\n    this.observe(this.element, { attributes: true, childList: true, subtree: true });\n  }\n\n  paused(callback) {\n    try {\n      this.disconnect();\n      callback();\n    } finally {\n      this.connect();\n    }\n  }\n}\n", "export function toTitleCase(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n}\n", "import { toTitleCase } from './live_utils';\n\n/**\n * Represents a reactive property that binds form inputs to state.\n *\n * Live properties enable two-way data binding between form elements and reactive state,\n * automatically syncing values when either the input or state changes.\n *\n * @example\n * <input type=\"text\" data-live-state=\"username\" value=\"john\" />\n */\nexport class LiveState {\n  constructor(element) {\n    this.element = element;\n    this.name = element.dataset.liveState;\n  }\n\n  get processFunctionName() {\n    return `processLive${toTitleCase(this.element.tagName)}State`;\n  }\n\n  toString() {\n    return `LiveState(${this.element.tagName}, ${this.name})`;\n  }\n}\n", "/**\n * @implements {IHooks}\n */\nclass Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n\n//     JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '1.4.0';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn  (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t  ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND:        'Compound',\n\tSEQUENCE_EXP:    'SequenceExpression',\n\tIDENTIFIER:      'Identifier',\n\tMEMBER_EXP:      'MemberExpression',\n\tLITERAL:         'Literal',\n\tTHIS_EXP:        'ThisExpression',\n\tCALL_EXP:        'CallExpression',\n\tUNARY_EXP:       'UnaryExpression',\n\tBINARY_EXP:      'BinaryExpression',\n\tARRAY_EXP:       'ArrayExpression',\n\n\tTAB_CODE:    9,\n\tLF_CODE:     10,\n\tCR_CODE:     13,\n\tSPACE_CODE:  32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE:  44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE:  58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\n\nvar ternary = {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nexport { Jsep, jsep as default };\n", "import { ArrowExpression } from '@jsep-plugin/arrow';\nimport { AssignmentExpression, UpdateExpression } from '@jsep-plugin/assignment';\nimport { AwaitExpression } from '@jsep-plugin/async-await';\nimport { NewExpression } from '@jsep-plugin/new';\nimport { ObjectExpression, Property } from '@jsep-plugin/object';\nimport { SpreadElement } from '@jsep-plugin/spread';\nimport { TaggedTemplateExpression, TemplateLiteral } from '@jsep-plugin/template';\nimport jsep from 'jsep';\n\n/**\n * Evaluation code from JSEP project, under MIT License.\n * Copyright (c) 2013 Stephen Oney, http://jsep.from.so/\n */\n\nexport declare type Context = Record<string, unknown>;\nexport declare type operand = any;\nexport declare type unaryCallback = (a: operand) => operand;\nexport declare type binaryCallback = (a: operand, b: operand) => operand;\nexport declare type assignCallback = (obj: Record<string, operand>, key: string, val: operand) => operand;\nexport declare type evaluatorCallback<T extends AnyExpression> = (this: ExpressionEval, node: T, context?: Context) => unknown;\n\nexport type AnyExpression = jsep.Expression;\n\nexport type JseEvalPlugin = Partial<jsep.IPlugin> & {\n  initEval?: (this: typeof ExpressionEval, jseEval: typeof ExpressionEval) => void;\n}\n\nexport default class ExpressionEval {\n  static jsep = jsep;\n  static parse = jsep;\n  static evaluate = ExpressionEval.eval;\n\n  static evaluators: Record<string, evaluatorCallback<AnyExpression>> = {\n    'ArrayExpression': ExpressionEval.prototype.evalArrayExpression,\n    'LogicalExpression': ExpressionEval.prototype.evalBinaryExpression,\n    'BinaryExpression': ExpressionEval.prototype.evalBinaryExpression,\n    'CallExpression': ExpressionEval.prototype.evalCallExpression,\n    'Compound': ExpressionEval.prototype.evalCompoundExpression,\n    'ConditionalExpression': ExpressionEval.prototype.evalConditionalExpression,\n    'Identifier': ExpressionEval.prototype.evalIdentifier,\n    'Literal': ExpressionEval.evalLiteral,\n    'OptionalMemberExpression': ExpressionEval.prototype.evalMemberExpression, // acorn uses this\n    'MemberExpression': ExpressionEval.prototype.evalMemberExpression,\n    'ThisExpression': ExpressionEval.prototype.evalThisExpression,\n    'UnaryExpression': ExpressionEval.prototype.evalUnaryExpression,\n    'ArrowFunctionExpression': ExpressionEval.prototype.evalArrowFunctionExpression,\n    'AssignmentExpression': ExpressionEval.prototype.evalAssignmentExpression,\n    'UpdateExpression': ExpressionEval.prototype.evalUpdateExpression,\n    'AwaitExpression': ExpressionEval.prototype.evalAwaitExpression,\n    'NewExpression': ExpressionEval.prototype.evalNewExpression,\n    'ObjectExpression': ExpressionEval.prototype.evalObjectExpression,\n    'SpreadElement': ExpressionEval.prototype.evalSpreadElement,\n    'TaggedTemplateExpression': ExpressionEval.prototype.evalTaggedTemplateExpression,\n    'TemplateLiteral': ExpressionEval.prototype.evalTemplateLiteral,\n  };\n\n  // Default operator precedence from https://github.com/EricSmekens/jsep/blob/master/src/jsep.js#L55\n  static DEFAULT_PRECEDENCE: Record<string, number> = {\n    '||': 1,\n    '&&': 2,\n    '|': 3,\n    '^': 4,\n    '&': 5,\n    '==': 6,\n    '!=': 6,\n    '===': 6,\n    '!==': 6,\n    '<': 7,\n    '>': 7,\n    '<=': 7,\n    '>=': 7,\n    '<<': 8,\n    '>>': 8,\n    '>>>': 8,\n    '+': 9,\n    '-': 9,\n    '*': 10,\n    '/': 10,\n    '%': 10\n  };\n\n  static binops: Record<string, binaryCallback> = {\n    '||': function (a, b) { return a || b; },\n    '&&': function (a, b) { return a && b; },\n    '|': function (a, b) { return a | b; },\n    '^': function (a, b) { return a ^ b; },\n    '&': function (a, b) { return a & b; },\n    '==': function (a, b) { return a == b; }, // jshint ignore:line\n    '!=': function (a, b) { return a != b; }, // jshint ignore:line\n    '===': function (a, b) { return a === b; },\n    '!==': function (a, b) { return a !== b; },\n    '<': function (a, b) { return a < b; },\n    '>': function (a, b) { return a > b; },\n    '<=': function (a, b) { return a <= b; },\n    '>=': function (a, b) { return a >= b; },\n    '<<': function (a, b) { return a << b; },\n    '>>': function (a, b) { return a >> b; },\n    '>>>': function (a, b) { return a >>> b; },\n    '+': function (a, b) { return a + b; },\n    '-': function (a, b) { return a - b; },\n    '*': function (a, b) { return a * b; },\n    '/': function (a, b) { return a / b; },\n    '%': function (a, b) { return a % b; }\n  };\n\n  static unops: Record<string, unaryCallback> = {\n    '-': function (a) { return -a; },\n    '+': function (a) { return +a; },\n    '~': function (a) { return ~a; },\n    '!': function (a) { return !a; },\n  };\n\n  static assignOps: Record<string, assignCallback> = {\n    '=': function(obj, key, val) { return obj[key] = val; },\n    '*=': function(obj, key, val) { return obj[key] *= val; },\n    '**=': function(obj, key, val) { return obj[key] **= val; },\n    '/=': function(obj, key, val) { return obj[key] /= val; },\n    '%=': function(obj, key, val) { return obj[key] %= val; },\n    '+=': function(obj, key, val) { return obj[key] += val; },\n    '-=': function(obj, key, val) { return obj[key] -= val; },\n    '<<=': function(obj, key, val) { return obj[key] <<= val; },\n    '>>=': function(obj, key, val) { return obj[key] >>= val; },\n    '>>>=': function(obj, key, val) { return obj[key] >>>= val; },\n    '&=': function(obj, key, val) { return obj[key] &= val; },\n    '^=': function(obj, key, val) { return obj[key] ^= val; },\n    '|=': function(obj, key, val) { return obj[key] |= val; },\n  };\n\n  // inject Custom Unary Operators (and override existing ones)\n  static addUnaryOp(operator: string, _function: unaryCallback): void {\n    jsep.addUnaryOp(operator);\n    ExpressionEval.unops[operator] = _function;\n  }\n\n  // inject Custom Binary Operators (and override existing ones)\n  static addBinaryOp(\n    operator: string,\n    precedence_or_fn: number | binaryCallback,\n    _ra_or_callback?: boolean | binaryCallback,\n    _function?: binaryCallback)\n    : void {\n    let precedence, ra, cb;\n    if (typeof precedence_or_fn === 'function') {\n      cb = precedence_or_fn;\n    } else {\n      precedence = precedence_or_fn;\n      if (typeof _ra_or_callback === 'function') {\n        cb = _ra_or_callback;\n      } else {\n        ra = _ra_or_callback;\n        cb = _function;\n      }\n    }\n\n    jsep.addBinaryOp(operator, precedence || 1, ra);\n    ExpressionEval.binops[operator] = cb;\n  }\n\n  // inject custom node evaluators (and override existing ones)\n  static addEvaluator<T extends AnyExpression>(nodeType: string, evaluator: evaluatorCallback<T>): void {\n    ExpressionEval.evaluators[nodeType] = evaluator;\n  }\n\n  static registerPlugin(...plugins: Array<JseEvalPlugin>) {\n    plugins.forEach((p) => {\n      if (p.init) {\n        ExpressionEval.parse.plugins.register(p as jsep.IPlugin);\n      }\n      if (p.initEval) {\n        p.initEval.call(ExpressionEval, ExpressionEval);\n      }\n    });\n  }\n\n  // main evaluator method\n  static eval(ast: jsep.Expression, context?: Context): unknown {\n    return (new ExpressionEval(context)).eval(ast);\n  }\n  static async evalAsync(ast: jsep.Expression, context?: Context): Promise<unknown> {\n    return (new ExpressionEval(context, true)).eval(ast);\n  }\n\n  // compile an expression and return an evaluator\n  static compile(expression: string): (context?: Context) => unknown {\n    return ExpressionEval.eval.bind(null, ExpressionEval.jsep(expression));\n  }\n  static compileAsync(expression: string): (context?: Context) => Promise<unknown> {\n    return ExpressionEval.evalAsync.bind(null, ExpressionEval.jsep(expression));\n  }\n\n  // compile and evaluate\n  static evalExpr(expression: string, context?: Context): unknown {\n    return ExpressionEval.compile(expression)(context);\n  }\n  static evalExprAsync(expression: string, context?: Context): unknown {\n    return ExpressionEval.compileAsync(expression)(context);\n  }\n\n\n  context?: Context;\n  isAsync?: boolean;\n\n  constructor(context?: Context, isAsync?: boolean) {\n    this.context = context;\n    this.isAsync = isAsync;\n  }\n\n  public eval(node: unknown, cb = v => v): unknown {\n    const evaluator = ExpressionEval.evaluators[(node as jsep.Expression).type]\n      || ExpressionEval.evaluators.default;\n    if (!evaluator) {\n      throw new Error(`unknown node type: ${JSON.stringify(node, null, 2)}`);\n    }\n    return this.evalSyncAsync(evaluator.bind(this)(node, this.context), (v) => {\n      (node as any)._value = v;\n      return cb(v);\n    });\n  }\n\n  /*\n   * `evalSyncAsync` is a helper to wrap sync/async calls into one so that\n   * we don't have to duplicate all of our node type parsers.\n   * It's basically like old node callback (hell?), but it works because:\n   * for sync:\n   *   an expression like `[1].map(v => v + 1)` returns the result\n   *   after running the callback\n   * for async:\n   *   an expression like `const a = (await x) + 1` is equivalent to\n   *   `Promise.resolve(x).then(res => res + 1)`\n   *\n   * Note: For optimization, there are a few places where it makes sense\n   * to directly check `this.isAsync` to use Promise.all(),\n   * `promisesOrResults = expressions.map(v => this.eval(v))`\n   *   could result in an array of results (sync) or promises (async)\n   */\n  evalSyncAsync(val: unknown, cb: (unknown) => unknown): Promise<unknown> | unknown {\n    if (this.isAsync) {\n      return Promise.resolve(val).then(cb);\n    }\n    return cb(val);\n  }\n\n  private evalArrayExpression(node: jsep.ArrayExpression) {\n    return this.evalArray(node.elements);\n  }\n\n  protected evalArray(list: jsep.Expression[]): unknown[] {\n    const mapped = list.map(v => this.eval(v));\n    const toFullArray = (res) => res\n      .reduce((arr, v, i) => {\n        if ((list[i] as AnyExpression).type === 'SpreadElement') {\n          return [...arr, ...v];\n        }\n        arr.push(v);\n        return arr;\n      }, []);\n    return this.isAsync\n      ? Promise.all(mapped).then(toFullArray)\n      : toFullArray(mapped);\n  }\n\n  private evalBinaryExpression(node: jsep.BinaryExpression) {\n    if (node.operator === '||') {\n      return this.eval(node.left, left => left || this.eval(node.right));\n    } else if (node.operator === '&&') {\n      return this.eval(node.left, left => left && this.eval(node.right));\n    }\n    const leftRight = [\n      this.eval(node.left),\n      this.eval(node.right)\n    ];\n    const op = ([left, right]) => ExpressionEval\n      .binops[node.operator](left, right);\n    return this.isAsync\n      ? Promise.all(leftRight).then(op)\n      : op(leftRight as [operand, operand]);\n  }\n\n  private evalCompoundExpression(node: jsep.Compound) {\n    return this.isAsync\n      ? node.body.reduce((p: Promise<any>, node) => p.then(() => this.eval(node)), Promise.resolve())\n      : node.body.map(v => this.eval(v))[node.body.length - 1]\n  }\n\n  private evalCallExpression(node: jsep.CallExpression) {\n    return this.evalSyncAsync(this.evalCall(node.callee), ([fn, caller]) => this\n      .evalSyncAsync(this.evalArray(node.arguments), args => fn\n        .apply(caller === node.callee ? this.context : caller, args)));\n  }\n\n  protected evalCall(callee: jsep.Expression): unknown {\n    if (callee.type === 'MemberExpression') {\n      return this.evalSyncAsync(\n        this.evaluateMember(callee as jsep.MemberExpression),\n        ([caller, fn]) => ExpressionEval.validateFnAndCall(fn, caller, callee as AnyExpression)\n      );\n    }\n    return this.eval(callee, fn => ExpressionEval.validateFnAndCall(fn, callee as AnyExpression));\n  }\n\n  private evalConditionalExpression(node: jsep.ConditionalExpression) {\n    return this.eval(node.test, v => v\n      ? this.eval(node.consequent)\n      : this.eval(node.alternate));\n  }\n\n  private evalIdentifier(node: jsep.Identifier) {\n    return this.context[node.name];\n  }\n\n  private static evalLiteral(node: jsep.Literal) {\n    return node.value;\n  }\n\n  private evalMemberExpression(node: jsep.MemberExpression) {\n    return this.evalSyncAsync(this.evaluateMember(node), ([, val]) => val);\n  }\n\n  private evaluateMember(node: jsep.MemberExpression) {\n    return this.eval(node.object, (object) => this\n      .evalSyncAsync(\n        node.computed\n          ? this.eval(node.property)\n          : (node.property as jsep.Identifier).name,\n        (key: string) => {\n          if (/^__proto__|prototype|constructor$/.test(key)) {\n            throw Error(`Access to member \"${key}\" disallowed.`);\n          }\n          return [object, (node.optional ? (object || {}) : object)[key], key];\n        })\n    );\n  }\n\n  private evalThisExpression() {\n    return this.context;\n  }\n\n  private evalUnaryExpression(node: jsep.UnaryExpression) {\n    return this.eval(node.argument, arg => ExpressionEval\n      .unops[node.operator](arg));\n  }\n\n  private evalArrowFunctionExpression(node: ArrowExpression) {\n    if (this.isAsync !== node.async) {\n      return ExpressionEval[node.async ? 'evalAsync' : 'eval'](node as any, this.context);\n    }\n    return (...arrowArgs) => {\n      const arrowContext = this.evalArrowContext(node, arrowArgs);\n      return ExpressionEval[node.async ? 'evalAsync' : 'eval'](node.body, arrowContext);\n    };\n  }\n\n  private evalArrowContext(node: ArrowExpression, arrowArgs): Context {\n    const arrowContext = { ...this.context };\n\n    ((node.params as AnyExpression[]) || []).forEach((param, i) => {\n      // default value:\n      if (param.type === 'AssignmentExpression') {\n        if (arrowArgs[i] === undefined) {\n          arrowArgs[i] = this.eval(param.right);\n        }\n        param = param.left as AnyExpression;\n      }\n\n      if (param.type === 'Identifier') {\n        arrowContext[(param as jsep.Identifier).name] = arrowArgs[i];\n      } else if (param.type === 'ArrayExpression') {\n        // array destructuring\n        (param.elements as AnyExpression[]).forEach((el, j) => {\n          let val = arrowArgs[i][j];\n          if (el.type === 'AssignmentExpression') {\n            if (val === undefined) {\n              // default value\n              val = this.eval(el.right);\n            }\n            el = el.left as AnyExpression;\n          }\n\n          if (el.type === 'Identifier') {\n            arrowContext[(el as jsep.Identifier).name] = val;\n          } else {\n            throw new Error('Unexpected arrow function argument');\n          }\n        });\n      } else if (param.type === 'ObjectExpression') {\n        // object destructuring\n        const keys = [];\n        (param.properties as AnyExpression[]).forEach((prop) => {\n          let p = prop;\n          if (p.type === 'AssignmentExpression') {\n            p = p.left as AnyExpression;\n          }\n\n          let key;\n          if (p.type === 'Property') {\n            key = (<jsep.Expression>p.key).type === 'Identifier'\n              ? (p.key as jsep.Identifier).name\n              : this.eval(p.key).toString();\n          } else if (p.type === 'Identifier') {\n            key = p.name;\n          } else if (p.type === 'SpreadElement' && (<jsep.Expression>p.argument).type === 'Identifier') {\n            key = (p.argument as jsep.Identifier).name;\n          } else {\n            throw new Error('Unexpected arrow function argument');\n          }\n\n          let val = arrowArgs[i][key];\n          if (p.type === 'SpreadElement') {\n            // all remaining object properties. Copy arg obj, then delete from our copy\n            val = { ...arrowArgs[i] };\n            keys.forEach((k) => {\n              delete val[k];\n            });\n          } else if (val === undefined && prop.type === 'AssignmentExpression') {\n            // default value\n            val = this.eval(prop.right);\n          }\n\n          arrowContext[key] = val;\n          keys.push(key);\n        });\n      } else if (param.type === 'SpreadElement' && (<jsep.Expression>param.argument).type === 'Identifier') {\n        const key = (param.argument as jsep.Identifier).name;\n        arrowContext[key] = arrowArgs.slice(i);\n      } else {\n        throw new Error('Unexpected arrow function argument');\n      }\n    });\n    return arrowContext;\n  }\n\n  private evalAssignmentExpression(node: AssignmentExpression) {\n    return this.evalSyncAsync(\n      this.getContextAndKey(node.left as AnyExpression),\n      ([destObj, destKey]) => this.eval(node.right, right => ExpressionEval\n        .assignOps[node.operator](destObj, destKey, right))\n    );\n  }\n\n  private evalUpdateExpression(node: UpdateExpression) {\n    return this.evalSyncAsync(\n      this.getContextAndKey(node.argument as AnyExpression),\n      ([destObj, destKey]) => ExpressionEval\n        .evalUpdateOperation(node, destObj, destKey)\n    );\n  }\n\n  private evalAwaitExpression(node: AwaitExpression) {\n    return ExpressionEval.evalAsync(node.argument, this.context);\n  }\n\n  private static evalUpdateOperation(node: UpdateExpression, destObj, destKey) {\n    if (node.prefix) {\n      return node.operator === '++'\n        ? ++destObj[destKey]\n        : --destObj[destKey];\n    }\n    return node.operator === '++'\n      ? destObj[destKey]++\n      : destObj[destKey]--;\n  }\n\n  private getContextAndKey(node: AnyExpression) {\n    if (node.type === 'MemberExpression') {\n      return this.evalSyncAsync(\n        this.evaluateMember(<jsep.MemberExpression>node),\n        ([obj, , key]) => [obj, key]\n      );\n    } else if (node.type === 'Identifier') {\n      return [this.context, node.name];\n    } else if (node.type === 'ConditionalExpression') {\n      return this.eval(node.test, test => this\n        .getContextAndKey((test\n          ? node.consequent\n          : node.alternate) as AnyExpression));\n    } else {\n      throw new Error('Invalid Member Key');\n    }\n  }\n\n  private evalNewExpression(node: NewExpression) {\n    return this.evalSyncAsync(\n      this.evalCall(node.callee),\n      ([ctor]) => this.evalSyncAsync(\n        this.evalArray(node.arguments),\n        args => ExpressionEval.construct(ctor, args, node)));\n  }\n\n  private evalObjectExpression(node: ObjectExpression) {\n    const obj = {};\n    const arr = node.properties.map((prop: Property | SpreadElement) => {\n      if (prop.type === 'SpreadElement') {\n        // always synchronous in this case\n        Object.assign(obj, ExpressionEval.eval(prop.argument, this.context));\n      } else if (prop.type === 'Property') {\n        return this.evalSyncAsync(\n          prop.key.type === 'Identifier'\n            ? (<jsep.Identifier>prop.key).name\n            : this.eval(prop.key),\n          key => this.eval(\n            prop.shorthand ? prop.key : prop.value,\n            val => { obj[key] = val; }\n          )\n        );\n      }\n    });\n    return this.isAsync\n      ? Promise.all(arr).then(() => obj)\n      : obj;\n  }\n\n  private evalSpreadElement(node: SpreadElement) {\n    return this.eval(node.argument);\n  }\n\n  private evalTaggedTemplateExpression(node: TaggedTemplateExpression) {\n    const fnAndArgs = [\n      this.evalCall(node.tag),\n      this.evalSyncAsync(\n        this.evalArray(node.quasi.expressions),\n        exprs => [\n          node.quasi.quasis.map(q => q.value.cooked),\n          ...exprs,\n        ]\n      ),\n    ];\n    const apply = ([[fn, caller], args]) => fn.apply(caller, args);\n    return this.isAsync\n      ? Promise.all(fnAndArgs).then(apply)\n      : apply(fnAndArgs as [[() => unknown, AnyExpression], unknown]);\n  }\n\n  private evalTemplateLiteral(node: TemplateLiteral) {\n    return this.evalSyncAsync(\n      this.evalArray(node.expressions),\n      expressions => node.quasis.reduce((str, q, i) => {\n        str += q.value.cooked;\n        if (!q.tail) {\n          str += expressions[i];\n        }\n        return str;\n      }, '')\n    );\n  }\n\n  protected static construct(\n    ctor: () => unknown,\n    args: unknown[],\n    node: jsep.CallExpression | jsep.Expression\n  ): unknown {\n    try {\n      return new (Function.prototype.bind.apply(ctor, [null].concat(args)))();\n    } catch (e) {\n      throw new Error(`${ExpressionEval.nodeFunctionName(node.callee as AnyExpression)} is not a constructor`);\n    }\n  }\n\n  protected static validateFnAndCall(\n    fn: () => unknown,\n    callee?: AnyExpression,\n    caller?: AnyExpression,\n  ): [() => unknown, AnyExpression] {\n    if (typeof fn !== 'function') {\n      if (!fn && caller && caller.optional) {\n        return [() => undefined, callee];\n      }\n      const name = ExpressionEval.nodeFunctionName(caller || callee);\n      throw new Error(`'${name}' is not a function`);\n    }\n    return [fn, callee];\n  }\n\n  protected static nodeFunctionName(callee: AnyExpression): string {\n    return callee\n      && ((callee as jsep.Identifier).name\n        || ((callee as jsep.MemberExpression).property\n          && ((callee as jsep.MemberExpression).property as jsep.Identifier).name));\n  }\n}\n\n/** NOTE: exporting named + default.\n * For CJS, these match the static members of the default export, so they still work.\n */\nexport { default as jsep, default as parse } from 'jsep';\nexport const DEFAULT_PRECEDENCE = ExpressionEval.DEFAULT_PRECEDENCE;\nexport const evaluators = ExpressionEval.evaluators;\nexport const binops = ExpressionEval.binops;\nexport const unops = ExpressionEval.unops;\nexport const assignOps = ExpressionEval.assignOps;\nexport const addUnaryOp = ExpressionEval.addUnaryOp;\nexport const addBinaryOp = ExpressionEval.addBinaryOp;\nexport const addEvaluator = ExpressionEval.addEvaluator;\nexport const registerPlugin = ExpressionEval.registerPlugin;\nexport const evaluate = ExpressionEval.eval;\nexport const evalAsync = ExpressionEval.evalAsync;\nexport const compile = ExpressionEval.compile;\nexport const compileAsync = ExpressionEval.compileAsync;\nexport const evalExpr = ExpressionEval.evalExpr;\nexport const evalExprAsync = ExpressionEval.evalExprAsync;\n", "import { parse, evaluate, registerPlugin } from 'jse-eval';\n\nregisterPlugin(\n  require('@jsep-plugin/arrow'),\n  require('@jsep-plugin/assignment'),\n  require('@jsep-plugin/async-await'),\n  require('@jsep-plugin/new'),\n  require('@jsep-plugin/object'),\n  require('@jsep-plugin/regex'),\n  require('@jsep-plugin/spread'),\n  require('@jsep-plugin/template'),\n  require('@jsep-plugin/ternary')\n);\n\n/**\n * Evaluates JavaScript expressions safely within the context of reactive state.\n *\n * Parses and executes expressions used in live directives, providing access to\n * the current state, computed values, and any additional context variables.\n *\n * @example\n * const evaluator = new LiveEvaluator({ count: 5 }, { doubled: 10 });\n * evaluator.evaluateExpression('state.count > 0'); // true\n * evaluator.evaluateExpression('computed.doubled'); // 10\n * evaluator.evaluateExpression('html`<div>${state.count}</div>`'); // '<div>5</div>'\n *\n * @see https://www.npmjs.com/package/jse-eval\n */\nexport class LiveEvaluator {\n  constructor(state, computed) {\n    this.state = state;\n    this.computed = computed;\n  }\n\n  evaluateExpression(expression, context) {\n    try {\n      return this.evaluateParsedExpression(parseExpression(expression), context);\n    } catch (error) {\n      throw new Error(`Error evaluating expression \"${expression}\" (${context}): ${error.message}`);\n    }\n  }\n\n  helpers = {\n    formatNumber: (locales, options, value) => {\n      return new Intl.NumberFormat(locales, options).format(value);\n    },\n    inspect: (value) => {\n      return JSON.stringify(value, null, 2);\n    },\n  };\n\n  evaluateParsedExpression(ast, context) {\n    try {\n      return evaluate(ast, { state: this.state, computed: this.computed, html, helpers: this.helpers, ...context });\n    } catch (error) {\n      throw new Error(`Error evaluating AST (${context}): ${error.message}`);\n    }\n  }\n}\n\nexport function parseExpression(expression) {\n  try {\n    return parse(expression);\n  } catch (error) {\n    throw new Error(`Error parsing expression \"${expression}\": ${error.message}`);\n  }\n}\n\nfunction escapeHtml(text) {\n  const div = document.createElement('div');\n  div.textContent = text;\n  return div.innerHTML;\n}\n\nfunction html(strings, ...values) {\n  return strings.reduce((result, string, index) => {\n    const value = index < values.length ? escapeHtml(String(values[index])) : '';\n    return result + string + value;\n  }, '');\n}\n", "import { parseExpression } from './live_evaluator';\nimport { toTitleCase } from './live_utils';\n\n/**\n * Represents a live attribute that binds reactive state to DOM elements.\n *\n * Live attributes use special `live:*` names to automatically update DOM elements\n * when the underlying state changes, enabling declarative reactive UI patterns.\n *\n * @example\n * <h1 live:text=\"state.title\">Default Title</h1>\n */\nexport class LiveAttribute {\n  constructor(attributeNode) {\n    this.element = attributeNode.ownerElement;\n    this.name = attributeNode.name;\n    this.expression = attributeNode.value;\n    this.parsedExpression = parseExpression(this.expression);\n  }\n\n  get processFunctionName() {\n    return `processLive${toTitleCase(this.name.replace('live:', ''))}Attribute`;\n  }\n\n  toString() {\n    return `LiveAttribute(${this.name}, ${this.expression})`;\n  }\n}\n", "import { toTitleCase } from './live_utils';\n\n/**\n * Represents a computed property that evaluates JavaScript expressions.\n *\n * Live computed properties enable reactive computed values from script tags,\n * automatically re-evaluating when dependencies change and making results\n * available in expressions via `computed.<name>`.\n *\n * @example\n * <script type=\"text/javascript\" data-live-computed=\"fullName\">\n *   state.firstName + ' ' + state.lastName\n * </script>\n */\nexport class LiveComputed {\n  constructor(element) {\n    this.element = element;\n    this.name = element.dataset.liveComputed;\n  }\n\n  get processFunctionName() {\n    return `processLive${toTitleCase(this.element.tagName)}Computed`;\n  }\n\n  toString() {\n    return `LiveComputed(${this.element.tagName}, ${this.name})`;\n  }\n}\n", "const {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!freeze) {\n  freeze = function <T>(x: T): T {\n    return x;\n  };\n}\n\nif (!seal) {\n  seal = function <T>(x: T): T {\n    return x;\n  };\n}\n\nif (!apply) {\n  apply = function <T>(\n    func: (thisArg: any, ...args: any[]) => T,\n    thisArg: any,\n    ...args: any[]\n  ): T {\n    return func.apply(thisArg, args);\n  };\n}\n\nif (!construct) {\n  construct = function <T>(Func: new (...args: any[]) => T, ...args: any[]): T {\n    return new Func(...args);\n  };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString =\n  typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString =\n  typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\n\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply<T>(\n  func: (thisArg: any, ...args: any[]) => T\n): (thisArg: any, ...args: any[]) => T {\n  return (thisArg: any, ...args: any[]): T => {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n\n    return apply(func, thisArg, args);\n  };\n}\n\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct<T>(\n  Func: new (...args: any[]) => T\n): (...args: any[]) => T {\n  return (...args: any[]): T => construct(Func, args);\n}\n\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(\n  set: Record<string, boolean>,\n  array: readonly unknown[],\n  transformCaseFunc: ReturnType<typeof unapply<string>> = stringToLowerCase\n): Record<string, boolean> {\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          (array as unknown[])[l] = lcElement;\n        }\n\n        element = lcElement;\n      }\n    }\n\n    set[element as string] = true;\n  }\n\n  return set;\n}\n\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray<T>(array: T[]): Array<T | null> {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n\n  return array;\n}\n\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone<T extends Record<string, any>>(object: T): T {\n  const newObject = create(null);\n\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (\n        value &&\n        typeof value === 'object' &&\n        value.constructor === Object\n      ) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n\n  return newObject;\n}\n\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value: unknown): string {\n  switch (typeof value) {\n    case 'string': {\n      return value;\n    }\n\n    case 'number': {\n      return numberToString(value);\n    }\n\n    case 'boolean': {\n      return booleanToString(value);\n    }\n\n    case 'bigint': {\n      return bigintToString ? bigintToString(value) : '0';\n    }\n\n    case 'symbol': {\n      return symbolToString ? symbolToString(value) : 'Symbol()';\n    }\n\n    case 'undefined': {\n      return objectToString(value);\n    }\n\n    case 'function':\n    case 'object': {\n      if (value === null) {\n        return objectToString(value);\n      }\n\n      const valueAsRecord = value as Record<string, any>;\n      const valueToString = lookupGetter(valueAsRecord, 'toString');\n\n      if (typeof valueToString === 'function') {\n        const stringified = valueToString(valueAsRecord);\n\n        return typeof stringified === 'string'\n          ? stringified\n          : objectToString(stringified);\n      }\n\n      return objectToString(value);\n    }\n\n    default: {\n      return objectToString(value);\n    }\n  }\n}\n\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter<T extends Record<string, any>>(\n  object: T,\n  prop: string\n): ReturnType<typeof unapply<any>> | (() => null) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n\n    object = getPrototypeOf(object);\n  }\n\n  function fallbackValue(): null {\n    return null;\n  }\n\n  return fallbackValue;\n}\n\nfunction isRegex(value: unknown): value is RegExp {\n  try {\n    regExpTest(value as RegExp, '');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport {\n  // Array\n  arrayForEach,\n  arrayIndexOf,\n  arrayIsArray,\n  arrayLastIndexOf,\n  arrayPop,\n  arrayPush,\n  arraySlice,\n  arraySplice,\n  // Object\n  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\n  isFrozen,\n  setPrototypeOf,\n  seal,\n  clone,\n  create,\n  objectHasOwnProperty,\n  objectToString,\n  // RegExp\n  regExpTest,\n  isRegex,\n  // String\n  stringIndexOf,\n  stringMatch,\n  stringReplace,\n  stringToLowerCase,\n  stringToString,\n  stringTrim,\n  // Other conversion\n  stringifyValue,\n  // Errors\n  typeErrorCreate,\n  // Other\n  lookupGetter,\n  addToSet,\n  // Reflect\n  unapply,\n  unconstruct,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n  'a',\n  'abbr',\n  'acronym',\n  'address',\n  'area',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'bdi',\n  'bdo',\n  'big',\n  'blink',\n  'blockquote',\n  'body',\n  'br',\n  'button',\n  'canvas',\n  'caption',\n  'center',\n  'cite',\n  'code',\n  'col',\n  'colgroup',\n  'content',\n  'data',\n  'datalist',\n  'dd',\n  'decorator',\n  'del',\n  'details',\n  'dfn',\n  'dialog',\n  'dir',\n  'div',\n  'dl',\n  'dt',\n  'element',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'font',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'head',\n  'header',\n  'hgroup',\n  'hr',\n  'html',\n  'i',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'map',\n  'mark',\n  'marquee',\n  'menu',\n  'menuitem',\n  'meter',\n  'nav',\n  'nobr',\n  'ol',\n  'optgroup',\n  'option',\n  'output',\n  'p',\n  'picture',\n  'pre',\n  'progress',\n  'q',\n  'rp',\n  'rt',\n  'ruby',\n  's',\n  'samp',\n  'search',\n  'section',\n  'select',\n  'shadow',\n  'slot',\n  'small',\n  'source',\n  'spacer',\n  'span',\n  'strike',\n  'strong',\n  'style',\n  'sub',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'template',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'track',\n  'tt',\n  'u',\n  'ul',\n  'var',\n  'video',\n  'wbr',\n] as const);\n\nexport const svg = freeze([\n  'svg',\n  'a',\n  'altglyph',\n  'altglyphdef',\n  'altglyphitem',\n  'animatecolor',\n  'animatemotion',\n  'animatetransform',\n  'circle',\n  'clippath',\n  'defs',\n  'desc',\n  'ellipse',\n  'enterkeyhint',\n  'exportparts',\n  'filter',\n  'font',\n  'g',\n  'glyph',\n  'glyphref',\n  'hkern',\n  'image',\n  'inputmode',\n  'line',\n  'lineargradient',\n  'marker',\n  'mask',\n  'metadata',\n  'mpath',\n  'part',\n  'path',\n  'pattern',\n  'polygon',\n  'polyline',\n  'radialgradient',\n  'rect',\n  'stop',\n  'style',\n  'switch',\n  'symbol',\n  'text',\n  'textpath',\n  'title',\n  'tref',\n  'tspan',\n  'view',\n  'vkern',\n] as const);\n\nexport const svgFilters = freeze([\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feDistantLight',\n  'feDropShadow',\n  'feFlood',\n  'feFuncA',\n  'feFuncB',\n  'feFuncG',\n  'feFuncR',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMergeNode',\n  'feMorphology',\n  'feOffset',\n  'fePointLight',\n  'feSpecularLighting',\n  'feSpotLight',\n  'feTile',\n  'feTurbulence',\n] as const);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n  'animate',\n  'color-profile',\n  'cursor',\n  'discard',\n  'font-face',\n  'font-face-format',\n  'font-face-name',\n  'font-face-src',\n  'font-face-uri',\n  'foreignobject',\n  'hatch',\n  'hatchpath',\n  'mesh',\n  'meshgradient',\n  'meshpatch',\n  'meshrow',\n  'missing-glyph',\n  'script',\n  'set',\n  'solidcolor',\n  'unknown',\n  'use',\n] as const);\n\nexport const mathMl = freeze([\n  'math',\n  'menclose',\n  'merror',\n  'mfenced',\n  'mfrac',\n  'mglyph',\n  'mi',\n  'mlabeledtr',\n  'mmultiscripts',\n  'mn',\n  'mo',\n  'mover',\n  'mpadded',\n  'mphantom',\n  'mroot',\n  'mrow',\n  'ms',\n  'mspace',\n  'msqrt',\n  'mstyle',\n  'msub',\n  'msup',\n  'msubsup',\n  'mtable',\n  'mtd',\n  'mtext',\n  'mtr',\n  'munder',\n  'munderover',\n  'mprescripts',\n] as const);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n  'maction',\n  'maligngroup',\n  'malignmark',\n  'mlongdiv',\n  'mscarries',\n  'mscarry',\n  'msgroup',\n  'mstack',\n  'msline',\n  'msrow',\n  'semantics',\n  'annotation',\n  'annotation-xml',\n  'mprescripts',\n  'none',\n] as const);\n\nexport const text = freeze(['#text'] as const);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n  'accept',\n  'action',\n  'align',\n  'alt',\n  'autocapitalize',\n  'autocomplete',\n  'autopictureinpicture',\n  'autoplay',\n  'background',\n  'bgcolor',\n  'border',\n  'capture',\n  'cellpadding',\n  'cellspacing',\n  'checked',\n  'cite',\n  'class',\n  'clear',\n  'color',\n  'cols',\n  'colspan',\n  'command',\n  'commandfor',\n  'controls',\n  'controlslist',\n  'coords',\n  'crossorigin',\n  'datetime',\n  'decoding',\n  'default',\n  'dir',\n  'disabled',\n  'disablepictureinpicture',\n  'disableremoteplayback',\n  'download',\n  'draggable',\n  'enctype',\n  'enterkeyhint',\n  'exportparts',\n  'face',\n  'for',\n  'headers',\n  'height',\n  'hidden',\n  'high',\n  'href',\n  'hreflang',\n  'id',\n  'inert',\n  'inputmode',\n  'integrity',\n  'ismap',\n  'kind',\n  'label',\n  'lang',\n  'list',\n  'loading',\n  'loop',\n  'low',\n  'max',\n  'maxlength',\n  'media',\n  'method',\n  'min',\n  'minlength',\n  'multiple',\n  'muted',\n  'name',\n  'nonce',\n  'noshade',\n  'novalidate',\n  'nowrap',\n  'open',\n  'optimum',\n  'part',\n  'pattern',\n  'placeholder',\n  'playsinline',\n  'popover',\n  'popovertarget',\n  'popovertargetaction',\n  'poster',\n  'preload',\n  'pubdate',\n  'radiogroup',\n  'readonly',\n  'rel',\n  'required',\n  'rev',\n  'reversed',\n  'role',\n  'rows',\n  'rowspan',\n  'spellcheck',\n  'scope',\n  'selected',\n  'shape',\n  'size',\n  'sizes',\n  'slot',\n  'span',\n  'srclang',\n  'start',\n  'src',\n  'srcset',\n  'step',\n  'style',\n  'summary',\n  'tabindex',\n  'title',\n  'translate',\n  'type',\n  'usemap',\n  'valign',\n  'value',\n  'width',\n  'wrap',\n  'xmlns',\n] as const);\n\nexport const svg = freeze([\n  'accent-height',\n  'accumulate',\n  'additive',\n  'alignment-baseline',\n  'amplitude',\n  'ascent',\n  'attributename',\n  'attributetype',\n  'azimuth',\n  'basefrequency',\n  'baseline-shift',\n  'begin',\n  'bias',\n  'by',\n  'class',\n  'clip',\n  'clippathunits',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'cx',\n  'cy',\n  'd',\n  'dx',\n  'dy',\n  'diffuseconstant',\n  'direction',\n  'display',\n  'divisor',\n  'dominant-baseline',\n  'dur',\n  'edgemode',\n  'elevation',\n  'end',\n  'exponent',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'filterunits',\n  'flood-color',\n  'flood-opacity',\n  'font-family',\n  'font-size',\n  'font-size-adjust',\n  'font-stretch',\n  'font-style',\n  'font-variant',\n  'font-weight',\n  'fx',\n  'fy',\n  'g1',\n  'g2',\n  'glyph-name',\n  'glyphref',\n  'gradientunits',\n  'gradienttransform',\n  'height',\n  'href',\n  'id',\n  'image-rendering',\n  'in',\n  'in2',\n  'intercept',\n  'k',\n  'k1',\n  'k2',\n  'k3',\n  'k4',\n  'kerning',\n  'keypoints',\n  'keysplines',\n  'keytimes',\n  'lang',\n  'lengthadjust',\n  'letter-spacing',\n  'kernelmatrix',\n  'kernelunitlength',\n  'lighting-color',\n  'local',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'markerheight',\n  'markerunits',\n  'markerwidth',\n  'maskcontentunits',\n  'maskunits',\n  'max',\n  'mask',\n  'mask-type',\n  'media',\n  'method',\n  'mode',\n  'min',\n  'name',\n  'numoctaves',\n  'offset',\n  'operator',\n  'opacity',\n  'order',\n  'orient',\n  'orientation',\n  'origin',\n  'overflow',\n  'paint-order',\n  'path',\n  'pathlength',\n  'patterncontentunits',\n  'patterntransform',\n  'patternunits',\n  'pointer-events',\n  'points',\n  'preservealpha',\n  'preserveaspectratio',\n  'primitiveunits',\n  'r',\n  'rx',\n  'ry',\n  'radius',\n  'refx',\n  'refy',\n  'repeatcount',\n  'repeatdur',\n  'restart',\n  'result',\n  'rotate',\n  'scale',\n  'seed',\n  'shape-rendering',\n  'slope',\n  'specularconstant',\n  'specularexponent',\n  'spreadmethod',\n  'startoffset',\n  'stddeviation',\n  'stitchtiles',\n  'stop-color',\n  'stop-opacity',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke',\n  'stroke-width',\n  'style',\n  'surfacescale',\n  'systemlanguage',\n  'tabindex',\n  'tablevalues',\n  'targetx',\n  'targety',\n  'transform',\n  'transform-origin',\n  'text-anchor',\n  'text-decoration',\n  'text-orientation',\n  'text-rendering',\n  'textlength',\n  'type',\n  'u1',\n  'u2',\n  'unicode',\n  'values',\n  'vector-effect',\n  'viewbox',\n  'visibility',\n  'version',\n  'vert-adv-y',\n  'vert-origin-x',\n  'vert-origin-y',\n  'width',\n  'word-spacing',\n  'wrap',\n  'writing-mode',\n  'xchannelselector',\n  'ychannelselector',\n  'x',\n  'x1',\n  'x2',\n  'xmlns',\n  'y',\n  'y1',\n  'y2',\n  'z',\n  'zoomandpan',\n] as const);\n\nexport const mathMl = freeze([\n  'accent',\n  'accentunder',\n  'align',\n  'bevelled',\n  'close',\n  'columnalign',\n  'columnlines',\n  'columnspacing',\n  'columnspan',\n  'denomalign',\n  'depth',\n  'dir',\n  'display',\n  'displaystyle',\n  'encoding',\n  'fence',\n  'frame',\n  'height',\n  'href',\n  'id',\n  'largeop',\n  'length',\n  'linethickness',\n  'lquote',\n  'lspace',\n  'mathbackground',\n  'mathcolor',\n  'mathsize',\n  'mathvariant',\n  'maxsize',\n  'minsize',\n  'movablelimits',\n  'notation',\n  'numalign',\n  'open',\n  'rowalign',\n  'rowlines',\n  'rowspacing',\n  'rowspan',\n  'rspace',\n  'rquote',\n  'scriptlevel',\n  'scriptminsize',\n  'scriptsizemultiplier',\n  'selection',\n  'separator',\n  'separators',\n  'stretchy',\n  'subscriptshift',\n  'supscriptshift',\n  'symmetric',\n  'voffset',\n  'width',\n  'xmlns',\n]);\n\nexport const xml = freeze([\n  'xlink:href',\n  'xml:id',\n  'xlink:title',\n  'xml:space',\n  'xmlns:xlink',\n] as const);\n", "import { seal } from './utils.js';\n\nexport const MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n  /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n  /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\nexport const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nexport const ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nexport const COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nexport const FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nexport const SELF_CLOSING_TAG = seal(/\\/>/i);\n", "import type { Config, UseProfilesConfig } from './config';\nimport type { DOMPurify, HooksMap, HookFunction, WindowLike } from './types';\nimport * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n  addToSet,\n  clone,\n  entries,\n  freeze,\n  seal,\n  arrayForEach,\n  arrayIsArray,\n  arrayLastIndexOf,\n  arrayPop,\n  arrayPush,\n  arraySplice,\n  stringMatch,\n  stringReplace,\n  stringToLowerCase,\n  stringToString,\n  stringIndexOf,\n  stringTrim,\n  regExpTest,\n  isRegex,\n  typeErrorCreate,\n  lookupGetter,\n  create,\n  objectHasOwnProperty,\n  stringifyValue,\n} from './utils.js';\n\nexport type { Config } from './config';\n\nexport type {\n  DOMPurify,\n  RemovedElement,\n  RemovedAttribute,\n  HookName,\n  NodeHook,\n  ElementHook,\n  DocumentFragmentHook,\n  UponSanitizeElementHook,\n  UponSanitizeAttributeHook,\n  UponSanitizeElementHookEvent,\n  UponSanitizeAttributeHookEvent,\n  WindowLike,\n} from './types';\n\ndeclare const VERSION: string;\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5, // Deprecated\n  entityNode: 6, // Deprecated\n  processingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12, // Deprecated\n};\n\n/* HTML-namespace elements whose child text nodes are serialized *literally*\n   (unescaped) by the HTML fragment-serialization algorithm. Two reparse-mXSS\n   shapes ride on that literal serialization:\n     (a) an element child - a tree the HTML parser can never build, but the DOM\n         API and an XML/XHTML parse can - after which a `</tag>`-bearing text\n         sibling breaks the element open on reparse; and\n     (b) text-only content that already carries the element's OWN end tag, e.g.\n         `<style>...</style><img onerror=x>` built as a node, which the literal\n         serializer emits verbatim for the HTML parser to re-open.\n   Shape (a) is handled by the firstElementChild branch in _isUnsafeNode; shape\n   (b) by the LITERAL_TEXT_CLOSE probe. Both read textContent (the raw-serialized\n   form for these elements) rather than innerHTML, because an XML/XHTML working\n   document serializes innerHTML with `<` escaped, which silently blinds the\n   innerHTML-based probes (rule 1's second probe and FALLBACK_TAG_CLOSE) there.\n   `script` is never allow-listed, but is kept here so the guard matches the\n   serializer's own literal-text list exactly. */\nconst LITERAL_TEXT_ELEMENT_NAMES = [\n  'style',\n  'script',\n  'xmp',\n  'iframe',\n  'noembed',\n  'noframes',\n  'plaintext',\n  'noscript',\n];\nconst LITERAL_TEXT_ELEMENTS = freeze(addToSet({}, LITERAL_TEXT_ELEMENT_NAMES));\n\n/* Per-element end-tag matcher. On an HTML reparse the ONLY token that\n   terminates a literal-text element's raw content is its own end tag; a foreign\n   literal-text close (e.g. `</xmp>` sitting inside `<style>`) does not break\n   out, so matching is per-element, not a shared alternation. The lookahead\n   requires an HTML tag-name terminator (whitespace, `/` or `>`) so a longer\n   name such as `</styles` is not mistaken for `</style`. */\nconst LITERAL_TEXT_CLOSE = (function (): Record<string, RegExp> {\n  const map: Record<string, RegExp> = {};\n  arrayForEach(LITERAL_TEXT_ELEMENT_NAMES, (name) => {\n    map[name] = seal(new RegExp('</' + name + '(?=[\\\\t\\\\n\\\\f\\\\r />])', 'i'));\n  });\n  return freeze(map);\n})();\n\nconst getGlobal = function (): WindowLike {\n  return typeof window === 'undefined' ? null : window;\n};\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function (\n  trustedTypes: TrustedTypePolicyFactory,\n  purifyHostElement: HTMLScriptElement\n) {\n  if (\n    typeof trustedTypes !== 'object' ||\n    typeof trustedTypes.createPolicy !== 'function'\n  ) {\n    return null;\n  }\n\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      },\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn(\n      'TrustedTypes policy ' + policyName + ' could not be created.'\n    );\n    return null;\n  }\n};\n\nconst _createHooksMap = function (): HooksMap {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: [],\n  };\n};\n\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function (\n  cfg: Config,\n  key: keyof Config,\n  fallback: Record<string, boolean>,\n  options: {\n    transform: Parameters<typeof addToSet>[2];\n    base?: Record<string, boolean>;\n  }\n): Record<string, boolean> {\n  return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key])\n    ? addToSet(\n        options.base ? clone(options.base) : {},\n        cfg[key] as readonly unknown[],\n        options.transform\n      )\n    : fallback;\n};\n\n/**\n * Resolve an object-valued configuration option: a prototype-free clone\n * of cfg[key] when it is an own, truthy object property, else a fresh\n * fallback built by makeFallback (fresh on every parse, so a previous\n * parse can never leak state into the next one).\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param makeFallback builds the fallback value when the option is absent\n * @returns the resolved object\n */\nconst _resolveObjectOption = function <T extends Record<string, any>>(\n  cfg: Config,\n  key: keyof Config,\n  makeFallback: () => T\n): T {\n  const value = objectHasOwnProperty(cfg, key) ? cfg[key] : undefined;\n  return value && typeof value === 'object'\n    ? clone(value as T)\n    : makeFallback();\n};\n\nfunction createDOMPurify(window: WindowLike = getGlobal()): DOMPurify {\n  const DOMPurify: DOMPurify = (root: WindowLike) => createDOMPurify(root);\n\n  DOMPurify.version = VERSION;\n\n  DOMPurify.removed = [];\n\n  if (\n    !window ||\n    !window.document ||\n    window.document.nodeType !== NODE_TYPE.document ||\n    !window.Element\n  ) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n\n    return DOMPurify;\n  }\n\n  let { document } = window;\n\n  const originalDocument = document;\n  const currentScript: HTMLScriptElement =\n    originalDocument.currentScript as HTMLScriptElement;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || (window as any).MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes,\n  } = window;\n\n  const ElementPrototype = Element.prototype;\n\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n  const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n  const getNodeType =\n    Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n  const getNodeName =\n    Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n  const getOwnerDocument =\n    Node && Node.prototype\n      ? lookupGetter(Node.prototype, 'ownerDocument')\n      : null;\n\n  /* Clobber-safe nodeType / nodeName reads through the cached Node.prototype\n     getters, with a direct-property fallback for environments that lack\n     Node.prototype. Sites that need a different fallback (e.g. _isClobbered\n     returns early on a null name) intentionally keep their own reads. */\n  const _readNodeType = function (node: Node): number {\n    return getNodeType ? getNodeType(node) : (node as any).nodeType;\n  };\n\n  const _readNodeName = function (node: Node): string {\n    return getNodeName ? getNodeName(node) : (node as any).nodeName;\n  };\n\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n\n  // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n  // `TRUSTED_TYPES_POLICY`, this is created at most once \u2014 Trusted Types throws\n  // on duplicate policy names \u2014 and is the only policy allowed to persist\n  // across configurations and survive `clearConfig()`.\n  let defaultTrustedTypesPolicy;\n  let defaultTrustedTypesPolicyResolved = false;\n\n  // Tracks whether we are already inside a call to the configured Trusted Types\n  // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n  // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n  // re-enter the policy and recurse until the stack overflows. We detect that\n  // re-entry and throw a clear, actionable error instead. The guard is shared\n  // across both callbacks, because either one re-entering `sanitize` triggers\n  // the same unbounded recursion.\n  let IN_TRUSTED_TYPES_POLICY = 0;\n  const _assertNotInTrustedTypesPolicy = function (): void {\n    if (IN_TRUSTED_TYPES_POLICY > 0) {\n      throw typeErrorCreate(\n        'A configured TRUSTED_TYPES_POLICY callback (createHTML or ' +\n          'createScriptURL) must not call DOMPurify.sanitize, as that causes ' +\n          'infinite recursion. Do not pass a policy whose callbacks wrap ' +\n          'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' +\n          'Types\" section of the README.'\n      );\n    }\n  };\n\n  const _createTrustedHTML = function (html: string): string {\n    _assertNotInTrustedTypesPolicy();\n\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createHTML(html);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n\n  const _createTrustedScriptURL = function (scriptUrl: string): string {\n    _assertNotInTrustedTypesPolicy();\n\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createScriptURL(scriptUrl);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n\n  // Lazily resolve (and cache) the instance's internal default policy.\n  // Resolution is attempted at most once: a successful `createPolicy` cannot be\n  // repeated (Trusted Types throws on duplicate names), and a failed or\n  // unsupported attempt must not be retried on every parse.\n  const _getDefaultTrustedTypesPolicy = function () {\n    if (!defaultTrustedTypesPolicyResolved) {\n      defaultTrustedTypesPolicy = _createTrustedTypesPolicy(\n        trustedTypes,\n        currentScript\n      );\n      defaultTrustedTypesPolicyResolved = true;\n    }\n\n    return defaultTrustedTypesPolicy;\n  };\n\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName,\n  } = document;\n  const { importNode } = originalDocument;\n\n  let hooks = _createHooksMap();\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    implementation.createHTMLDocument !== undefined;\n\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT,\n  } = EXPRESSIONS;\n\n  let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n    ...TAGS.html,\n    ...TAGS.svg,\n    ...TAGS.svgFilters,\n    ...TAGS.mathMl,\n    ...TAGS.text,\n  ]);\n\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n    ...ATTRS.html,\n    ...ATTRS.svg,\n    ...ATTRS.mathMl,\n    ...ATTRS.xml,\n  ]);\n\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(\n    create(null, {\n      tagNameCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null,\n      },\n      attributeNameCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null,\n      },\n      allowCustomizedBuiltInElements: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: false,\n      },\n    })\n  );\n\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(\n    create(null, {\n      tagCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null,\n      },\n      attributeCheck: {\n        writable: true,\n        configurable: false,\n        enumerable: true,\n        value: null,\n      },\n    })\n  );\n\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n\n  /* Pristine allowlist bindings captured at setConfig() time. On the\n   * persistent-config path sanitize() restores the sets from these before\n   * the per-walk hook clone-guard, so a hook's in-call widening cannot\n   * carry across calls. Null until setConfig() is called; reset by\n   * clearConfig(). */\n  let SET_CONFIG_ALLOWED_TAGS = null;\n  let SET_CONFIG_ALLOWED_ATTR = null;\n\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (\u00A77.3.3)\n   *   - DOM Tree Accessors (\u00A73.1.5)\n   *   - Form Element Parent-Child Relations (\u00A74.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n   *   - HTMLCollection (\u00A74.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES: UseProfilesConfig | false = {};\n\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n    'annotation-xml',\n    'audio',\n    'colgroup',\n    'desc',\n    'foreignobject',\n    'head',\n    'iframe',\n    'math',\n    'mi',\n    'mn',\n    'mo',\n    'ms',\n    'mtext',\n    'noembed',\n    'noframes',\n    'noscript',\n    'plaintext',\n    'script',\n    // <selectedcontent> mirrors the selected <option>'s subtree, cloned by\n    // the UA (customizable <select>) \u2014 including any on* handlers \u2014 and the\n    // engine re-mirrors synchronously whenever a removal changes which\n    // option/selectedcontent is current, even inside DOMPurify's inert\n    // DOMParser document. Hoisting its children on removal re-inserts a fresh\n    // mirror target ahead of the walk, which the engine refills, looping\n    // forever (DoS) and amplifying output. Dropping its content on removal\n    // (rather than hoisting) breaks that cascade; the content is a duplicate\n    // of the option, which is sanitized on its own. See campaign-3 F1/F6.\n    'selectedcontent',\n    'style',\n    'svg',\n    'template',\n    'thead',\n    'title',\n    'video',\n    'xmp',\n  ]);\n\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n    'audio',\n    'video',\n    'img',\n    'source',\n    'image',\n    'track',\n  ]);\n\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n    'alt',\n    'class',\n    'for',\n    'id',\n    'label',\n    'name',\n    'pattern',\n    'placeholder',\n    'role',\n    'summary',\n    'title',\n    'value',\n    'style',\n    'xmlns',\n  ]);\n\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet(\n    {},\n    [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE],\n    stringToString\n  );\n\n  const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze([\n    'mi',\n    'mo',\n    'mn',\n    'ms',\n    'mtext',\n  ]);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet(\n    {},\n    DEFAULT_MATHML_TEXT_INTEGRATION_POINTS\n  );\n\n  const DEFAULT_HTML_INTEGRATION_POINTS = freeze(['annotation-xml']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n    'title',\n    'style',\n    'font',\n    'a',\n    'script',\n  ]);\n\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE: null | DOMParserSupportedType = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc: null | Parameters<typeof addToSet>[2] = null;\n\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG: Config | null = null;\n\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n\n  const formElement = document.createElement('form');\n\n  const isRegexOrFunction = function (\n    testValue: unknown\n  ): testValue is Function | RegExp {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function (cfg: Config = {}): void {\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n\n    PARSER_MEDIA_TYPE =\n      // eslint-disable-next-line unicorn/prefer-includes\n      SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1\n        ? DEFAULT_PARSER_MEDIA_TYPE\n        : cfg.PARSER_MEDIA_TYPE;\n\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc =\n      PARSER_MEDIA_TYPE === 'application/xhtml+xml'\n        ? stringToString\n        : stringToLowerCase;\n\n    /* Set configuration parameters */\n    ALLOWED_TAGS = _resolveSetOption(\n      cfg,\n      'ALLOWED_TAGS',\n      DEFAULT_ALLOWED_TAGS,\n      { transform: transformCaseFunc }\n    );\n    ALLOWED_ATTR = _resolveSetOption(\n      cfg,\n      'ALLOWED_ATTR',\n      DEFAULT_ALLOWED_ATTR,\n      { transform: transformCaseFunc }\n    );\n    ALLOWED_NAMESPACES = _resolveSetOption(\n      cfg,\n      'ALLOWED_NAMESPACES',\n      DEFAULT_ALLOWED_NAMESPACES,\n      { transform: stringToString }\n    );\n    URI_SAFE_ATTRIBUTES = _resolveSetOption(\n      cfg,\n      'ADD_URI_SAFE_ATTR',\n      DEFAULT_URI_SAFE_ATTRIBUTES,\n      { transform: transformCaseFunc, base: DEFAULT_URI_SAFE_ATTRIBUTES }\n    );\n    DATA_URI_TAGS = _resolveSetOption(\n      cfg,\n      'ADD_DATA_URI_TAGS',\n      DEFAULT_DATA_URI_TAGS,\n      { transform: transformCaseFunc, base: DEFAULT_DATA_URI_TAGS }\n    );\n    FORBID_CONTENTS = _resolveSetOption(\n      cfg,\n      'FORBID_CONTENTS',\n      DEFAULT_FORBID_CONTENTS,\n      { transform: transformCaseFunc }\n    );\n    FORBID_TAGS = _resolveSetOption(cfg, 'FORBID_TAGS', clone({}), {\n      transform: transformCaseFunc,\n    });\n    FORBID_ATTR = _resolveSetOption(cfg, 'FORBID_ATTR', clone({}), {\n      transform: transformCaseFunc,\n    });\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES')\n      ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object'\n        ? clone(cfg.USE_PROFILES)\n        : cfg.USE_PROFILES\n      : false;\n\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI = isRegex(cfg.ALLOWED_URI_REGEXP)\n      ? cfg.ALLOWED_URI_REGEXP\n      : EXPRESSIONS.IS_ALLOWED_URI; // Default regexp\n\n    NAMESPACE =\n      typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n\n    MATHML_TEXT_INTEGRATION_POINTS = _resolveObjectOption(\n      cfg,\n      'MATHML_TEXT_INTEGRATION_POINTS',\n      () => addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS) // Default built-in map\n    );\n\n    HTML_INTEGRATION_POINTS = _resolveObjectOption(\n      cfg,\n      'HTML_INTEGRATION_POINTS',\n      () => addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS) // Default built-in map\n    );\n\n    const customElementHandling = _resolveObjectOption(\n      cfg,\n      'CUSTOM_ELEMENT_HANDLING',\n      () => create(null)\n    );\n\n    CUSTOM_ELEMENT_HANDLING = create(null);\n\n    if (\n      objectHasOwnProperty(customElementHandling, 'tagNameCheck') &&\n      isRegexOrFunction(customElementHandling.tagNameCheck)\n    ) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n\n    if (\n      objectHasOwnProperty(customElementHandling, 'attributeNameCheck') &&\n      isRegexOrFunction(customElementHandling.attributeNameCheck)\n    ) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck =\n        customElementHandling.attributeNameCheck; // Default undefined\n    }\n\n    if (\n      objectHasOwnProperty(\n        customElementHandling,\n        'allowCustomizedBuiltInElements'\n      ) &&\n      typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean'\n    ) {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements =\n        customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n\n    seal(CUSTOM_ELEMENT_HANDLING);\n\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, TAGS.text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, TAGS.html);\n        addToSet(ALLOWED_ATTR, ATTRS.html);\n      }\n\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, TAGS.svg);\n        addToSet(ALLOWED_ATTR, ATTRS.svg);\n        addToSet(ALLOWED_ATTR, ATTRS.xml);\n      }\n\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, TAGS.svgFilters);\n        addToSet(ALLOWED_ATTR, ATTRS.svg);\n        addToSet(ALLOWED_ATTR, ATTRS.xml);\n      }\n\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, TAGS.mathMl);\n        addToSet(ALLOWED_ATTR, ATTRS.mathMl);\n        addToSet(ALLOWED_ATTR, ATTRS.xml);\n      }\n    }\n\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n\n    if (\n      objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') &&\n      arrayIsArray(cfg.ADD_FORBID_CONTENTS)\n    ) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n\n    // Re-derive the active Trusted Types policy from this configuration on\n    // every parse. The active policy must never be sticky closure state that\n    // outlives the config that set it: a caller-supplied policy left in place\n    // after `clearConfig()` \u2014 or after a later call that supplied none, or\n    // `TRUSTED_TYPES_POLICY: null` \u2014 could sign a subsequent \"default\"\n    // `RETURN_TRUSTED_TYPE` result with a foreign, possibly unsafe policy.\n    // See GHSA-vxr8-fq34-vvx9.\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate(\n          'TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.'\n        );\n      }\n\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate(\n          'TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.'\n        );\n      }\n\n      // A caller-supplied policy applies to this configuration only.\n      const previousTrustedTypesPolicy = trustedTypesPolicy;\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n\n      // Sign local variables required by `sanitize`. If the supplied policy's\n      // `createHTML` is circular (i.e. it calls `DOMPurify.sanitize`), this\n      // throws via the re-entrancy guard. Restore the previous policy first so\n      // the instance is not left in a poisoned state. See #1422.\n      try {\n        emptyHTML = _createTrustedHTML('');\n      } catch (error) {\n        trustedTypesPolicy = previousTrustedTypesPolicy;\n        throw error;\n      }\n    } else if (cfg.TRUSTED_TYPES_POLICY === null) {\n      // Explicit opt-out for this call: perform no Trusted Types signing and\n      // create nothing (so a strict `trusted-types` CSP that disallows a\n      // `dompurify` policy can still call `sanitize` from inside its own\n      // policy \u2014 see #1422). Resetting to `undefined` rather than a sticky\n      // `null` also drops any previously retained caller policy, so it cannot\n      // resurface on a later call, while still allowing the next config-less\n      // call to restore the internal default policy. See GHSA-vxr8-fq34-vvx9.\n      trustedTypesPolicy = undefined;\n      emptyHTML = '';\n    } else {\n      // No policy supplied: keep the currently active policy if one is set \u2014 a\n      // previously supplied policy is intentionally sticky across config-less\n      // calls \u2014 otherwise fall back to the instance's own internal policy,\n      // created at most once. (A policy supplied for a *single* call still\n      // lingers by design; what must not linger is a policy whose configuration\n      // has been torn down via `clearConfig()`, which restores the default.)\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n      }\n\n      // Sign internal variables only when a policy is active. A falsy policy\n      // (Trusted Types unsupported, creation failed, or an explicit opt-out)\n      // leaves `emptyHTML` as a plain string, so we never call `.createHTML` on\n      // a non-policy and throw. See #1422.\n      if (trustedTypesPolicy && typeof emptyHTML === 'string') {\n        emptyHTML = _createTrustedHTML('');\n      }\n    }\n\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n\n    CONFIG = cfg;\n  };\n\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [\n    ...TAGS.svg,\n    ...TAGS.svgFilters,\n    ...TAGS.svgDisallowed,\n  ]);\n  const ALL_MATHML_TAGS = addToSet({}, [\n    ...TAGS.mathMl,\n    ...TAGS.mathMlDisallowed,\n  ]);\n\n  /**\n   * Namespace rules for an element in the SVG namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkSvgNamespace = function (\n    tagName: string,\n    parent: { namespaceURI?: string },\n    parentTagName: string\n  ): boolean {\n    // The only way to switch from HTML namespace to SVG\n    // is via <svg>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'svg';\n    }\n\n    // The only way to switch from MathML to SVG is via <svg>\n    // if the parent is either <annotation-xml> or a MathML\n    // text integration point.\n    if (parent.namespaceURI === MATHML_NAMESPACE) {\n      return (\n        tagName === 'svg' &&\n        (parentTagName === 'annotation-xml' ||\n          MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n      );\n    }\n\n    // We only allow elements that are defined in SVG\n    // spec. All others are disallowed in SVG namespace.\n    return Boolean(ALL_SVG_TAGS[tagName]);\n  };\n\n  /**\n   * Namespace rules for an element in the MathML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkMathMlNamespace = function (\n    tagName: string,\n    parent: { namespaceURI?: string },\n    parentTagName: string\n  ): boolean {\n    // The only way to switch from HTML namespace to MathML\n    // is via <math>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'math';\n    }\n\n    // The only way to switch from SVG to MathML is via\n    // <math> and HTML integration points\n    if (parent.namespaceURI === SVG_NAMESPACE) {\n      return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n    }\n\n    // We only allow elements that are defined in MathML\n    // spec. All others are disallowed in MathML namespace.\n    return Boolean(ALL_MATHML_TAGS[tagName]);\n  };\n\n  /**\n   * Namespace rules for an element in the HTML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkHtmlNamespace = function (\n    tagName: string,\n    parent: { namespaceURI?: string },\n    parentTagName: string\n  ): boolean {\n    // The only way to switch from SVG to HTML is via\n    // HTML integration points, and from MathML to HTML\n    // is via MathML text integration points\n    if (\n      parent.namespaceURI === SVG_NAMESPACE &&\n      !HTML_INTEGRATION_POINTS[parentTagName]\n    ) {\n      return false;\n    }\n\n    if (\n      parent.namespaceURI === MATHML_NAMESPACE &&\n      !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n    ) {\n      return false;\n    }\n\n    // We disallow tags that are specific for MathML\n    // or SVG and should never appear in HTML namespace\n    return (\n      !ALL_MATHML_TAGS[tagName] &&\n      (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName])\n    );\n  };\n\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function (element: Element): boolean {\n    let parent = getParentNode(element);\n\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template',\n      };\n    }\n\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      return _checkSvgNamespace(tagName, parent, parentTagName);\n    }\n\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      return _checkMathMlNamespace(tagName, parent, parentTagName);\n    }\n\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      return _checkHtmlNamespace(tagName, parent, parentTagName);\n    }\n\n    // For XHTML and XML documents that support custom namespaces\n    if (\n      PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n      ALLOWED_NAMESPACES[element.namespaceURI]\n    ) {\n      return true;\n    }\n\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function (node: Node): void {\n    arrayPush(DOMPurify.removed, { element: node });\n\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      /* The normal detach failed \u2014 this is reached for a parentless node\n         (getParentNode() is null, so .removeChild throws). Element.prototype\n         .remove() is itself a spec no-op on a parentless node, so a recorded\n         \"removal\" would otherwise hand the caller back an intact,\n         payload-bearing node (e.g. a detached IN_PLACE root the mXSS canary or\n         the style-with-element-child rule decided to kill). Fail closed by\n         throwing \u2014 exactly as a clobbered root does at the IN_PLACE entry \u2014\n         rather than trying to \"neutralize\" the node via its own methods.\n         Neutralizing would mean calling getAttributeNames()/removeAttribute()\n         on the node, both of which a <form> root can clobber via a named child\n         (and _isClobbered does not even probe getAttributeNames), so the\n         neutralize step could itself be silently defeated, leaving the payload\n         intact. A throw touches only the cached, clobber-safe remove() and\n         getParentNode(). Generalizes GHSA-r47g-fvhr-h676 (clobbered-form root)\n         to every root-kill reason. REPORT-3.\n\n         This lives inside the catch, so it never fires for a normally-removed\n         in-tree node: those have a parent, removeChild() succeeds, and the\n         catch is not entered. Only a kept (parentless) root reaches here. */\n      remove(node);\n\n      if (!getParentNode(node)) {\n        throw typeErrorCreate(\n          'a node selected for removal could not be detached from its tree ' +\n            'and cannot be safely returned; refusing to sanitize in place'\n        );\n      }\n    }\n  };\n\n  /**\n   * _stripAttributeNode\n   *\n   * Remove a single Attr node case/namespace-exactly on an attribute-teardown\n   * path. Name-based removeAttribute() ASCII-lowercases its lookup key for an\n   * HTML element in an HTML document and so silently misses a case-preserved\n   * handler (e.g. `ONERROR` off an XML/XHTML import) - the same defect\n   * _removeAttribute() was fixed for, which a name-based call would reintroduce\n   * on these IN_PLACE teardown paths. Unlike _removeAttribute this does not\n   * record into DOMPurify.removed: the neutralize passes intentionally do not\n   * book-keep. A clobbered/detached node falls back to best-effort name-based\n   * removal.\n   *\n   * @param element the element to strip the attribute from\n   * @param attribute the Attr node to remove\n   * @param name the attribute's name, for the fallback path\n   */\n  const _stripAttributeNode = function (\n    element: Element,\n    attribute: Attr,\n    name: string\n  ): void {\n    try {\n      element.removeAttributeNode(attribute);\n    } catch (_) {\n      try {\n        element.removeAttribute(name);\n      } catch (_) {}\n    }\n  };\n\n  /**\n   * _neutralizeRoot\n   *\n   * Fail-closed teardown of an in-place root after the sanitize walk aborts\n   * (campaign-3 F2). An internal throw mid-walk \u2014 e.g. a page-registered\n   * custom element's reaction detaches a node so `_forceRemove`'s deliberate\n   * parentless guard throws, or any other re-entrant engine mutation \u2014 would\n   * otherwise leave the caller's *live* tree half-sanitized, with everything\n   * after the abort point still carrying its handlers. There is no safe way\n   * to resume the walk (the tree mutated under us), so we strip the root bare:\n   * remove every child and every attribute, then let the caller's catch see\n   * the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n   * getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n   *\n   * @param root the in-place root to empty\n   */\n  const _neutralizeRoot = function (root: Node): void {\n    /* Strip every disallowed attribute (on* handlers included) off the whole\n       subtree BEFORE detaching anything. Detaching first would hand back\n       handler-bearing originals (e.g. an already-loading `<img onerror>`)\n       whose queued resource event still fires in page scope after we throw.\n       Clobber-safe reads; a doomed clobbered node's own attributes are\n       irrelevant while its non-clobbered descendants are reached and scrubbed. */\n    _neutralizeSubtree(root);\n\n    const childNodes = getChildNodes(root);\n    if (childNodes) {\n      const snapshot: Node[] = [];\n      arrayForEach(childNodes, (child) => {\n        arrayPush(snapshot, child);\n      });\n      arrayForEach(snapshot, (child) => {\n        try {\n          remove(child);\n        } catch (_) {\n          /* Best-effort teardown; a still-attached child is handled below */\n        }\n      });\n    }\n\n    const attributes = getAttributes(root);\n    if (attributes) {\n      for (let i = attributes.length - 1; i >= 0; --i) {\n        const attribute = attributes[i];\n        const name = attribute && attribute.name;\n        if (typeof name === 'string') {\n          _stripAttributeNode(root as Element, attribute, name);\n        }\n      }\n    }\n  };\n\n  /**\n   * _removeAttribute\n   *\n   * Name-based getAttributeNode()/removeAttribute() ASCII-lowercase their\n   * lookup key for HTML elements in an HTML document, so they silently miss an\n   * attribute whose stored qualified name still contains uppercase ASCII\n   * letters. That happens when the node came from a case-preserving source\n   * (an XML/XHTML document imported via importNode(), or createAttributeNS()),\n   * where e.g. `ONERROR` survives the walk: the policy check lowercases to\n   * `onerror` and rejects it, but `removeAttribute('ONERROR')` looks up\n   * `onerror` and finds nothing. Remove the exact Attr node instead, which is\n   * case- and namespace-exact, and fall back to name-based removal only when\n   * the caller could not supply the node.\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   * @param attr the exact Attr node to remove, when the caller has it\n   */\n  const _removeAttribute = function (\n    name: string,\n    element: Element,\n    attr?: Attr | null\n  ): void {\n    if (!attr) {\n      try {\n        attr = element.getAttributeNode(name);\n      } catch (_) {\n        attr = null;\n      }\n    }\n\n    arrayPush(DOMPurify.removed, {\n      attribute: attr || null,\n      from: element,\n    });\n\n    try {\n      if (attr) {\n        element.removeAttributeNode(attr);\n      } else {\n        element.removeAttribute(name);\n      }\n    } catch (_) {\n      /* Clobbered or already-detached node - best-effort fall back to a\n         name-based removal so the \"is\" handling below still runs. */\n      try {\n        element.removeAttribute(name);\n      } catch (_) {}\n    }\n\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n\n  /**\n   * _stripDisallowedAttributes\n   *\n   * Removes every attribute the active configuration does not allow from a\n   * single element, using the same allowlist as the main attribute pass (so\n   * `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n   * neutralise nodes that are being discarded from an in-place tree.\n   *\n   * @param element the element to strip\n   */\n  const _stripDisallowedAttributes = function (element: Element): void {\n    const attributes = getAttributes(element);\n    if (!attributes) {\n      return;\n    }\n\n    for (let i = attributes.length - 1; i >= 0; --i) {\n      const attribute = attributes[i];\n      const name = attribute && attribute.name;\n      if (typeof name !== 'string' || ALLOWED_ATTR[transformCaseFunc(name)]) {\n        continue;\n      }\n\n      _stripAttributeNode(element, attribute, name);\n    }\n  };\n\n  /**\n   * _neutralizeSubtree\n   *\n   * Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n   * move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n   * namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n   * all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n   * those dropped nodes are detached from the caller's LIVE tree but a\n   * handler-bearing original among them (an `<img onerror>`/`<video>` that was\n   * loading) keeps its queued resource event, which fires in page scope after\n   * sanitize returns. This walks a removed subtree and strips every attribute\n   * the active configuration does not allow \u2014 so `on*` handlers are cancelled\n   * through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n   * blocklist. Run synchronously before sanitize returns, i.e. before any\n   * queued event can fire. Hook-free by design: these nodes leave the output,\n   * so firing attribute hooks for them would be surprising. Clobber-safe reads;\n   * a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n   * irrelevant \u2014 it is discarded \u2014 while its non-clobbered descendants, e.g.\n   * the `<img>`, are reached and scrubbed).\n   *\n   * @param root the root of a removed subtree to neutralise\n   */\n  const _neutralizeSubtree = function (root: Node): void {\n    const stack: Node[] = [root];\n\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = _readNodeType(node);\n\n      if (nodeType === NODE_TYPE.element) {\n        _stripDisallowedAttributes(node as Element);\n      }\n\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n\n  /**\n   * _neutralizePatchLinkage\n   *\n   * IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n   * hardening, https://github.com/WICG/declarative-partial-updates).\n   *\n   * The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n   * markers (PIs / markup comments) node-by-node, in document order, AS it\n   * reaches each node. On a live in-place root that leaves a window: from the\n   * moment the root is connected until the walk arrives at a given node, that\n   * node's linkage is live. A patch applied on connection/stream can fire as\n   * a microtask during the walk and inject or teleport an unsanitized DOM\n   * range into a region the iterator has already passed and will not revisit,\n   * so the post-return \"tree is sanitized\" contract is violated. Sweep the\n   * whole tree once up front and sever every linkage before the walk begins,\n   * closing that window.\n   *\n   * This CANNOT undo a patch that already fired before sanitize ran \u2014 that is\n   * the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat \u2014\n   * but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n   * to group with the rest of the declarative-partial-updates handling and\n   * stay overridable, consistent with the codebase.\n   *\n   * Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n   * clobbered root cannot defeat the sweep of its non-clobbered descendants.\n   *\n   * NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n   * .html Q1): this mirrors the existing policy of keeping `for` on\n   * <label>/<output>. If the shipping feature can drive a patch through a\n   * surviving `for`-on-label/output + `id` pair, this pre-pass and the\n   * attribute check at _isBasicCustomElement's caller must additionally drop\n   * that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n   *\n   * @param root the in-place root to sweep\n   */\n  /**\n   * Central policy for declarative-partial-updates patch-linkage attributes,\n   * shared by the _neutralizePatchLinkage pre-pass and _isValidAttribute so\n   * the two sites cannot drift: `patchsrc` always links, `for` links\n   * everywhere except on <label>/<output>, and the whole policy is gated on\n   * SAFE_FOR_XML (see the rationale block in _isValidAttribute).\n   *\n   * @param lcName the transformCaseFunc'd attribute name\n   * @param lcTag the transformCaseFunc'd tag name of the carrying element\n   * @return true if the attribute is patch linkage and must be dropped\n   */\n  const _isPatchLinkageAttribute = function (\n    lcName: string,\n    lcTag: string\n  ): boolean {\n    if (!SAFE_FOR_XML) {\n      return false;\n    }\n\n    if (lcName === 'patchsrc') {\n      return true;\n    }\n\n    return lcName === 'for' && lcTag !== 'label' && lcTag !== 'output';\n  };\n\n  const _neutralizePatchLinkage = function (root: Node): void {\n    if (!SAFE_FOR_XML) {\n      return;\n    }\n\n    const stack: Node[] = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = _readNodeType(node);\n\n      /* Remove range markers (the target side of a patch linkage): every\n         processing instruction, and any markup-bearing comment. */\n      if (\n        nodeType === NODE_TYPE.processingInstruction ||\n        (nodeType === NODE_TYPE.comment &&\n          regExpTest(EXPRESSIONS.COMMENT_MARKUP_PROBE, (node as any).data))\n      ) {\n        try {\n          remove(node);\n        } catch (_) {\n          /* Best-effort */\n        }\n\n        continue;\n      }\n\n      /* Strip patch-source attributes (the source side) off elements. */\n      if (nodeType === NODE_TYPE.element) {\n        const element = node as Element;\n        const lcTag = transformCaseFunc(_readNodeName(node));\n        try {\n          if (element.hasAttribute && element.hasAttribute('patchsrc')) {\n            element.removeAttribute('patchsrc');\n          }\n\n          if (\n            element.hasAttribute &&\n            element.hasAttribute('for') &&\n            _isPatchLinkageAttribute('for', lcTag)\n          ) {\n            element.removeAttribute('for');\n          }\n        } catch (_) {\n          /* Clobbered removeAttribute/hasAttribute on a doomed node \u2014 ignore */\n        }\n      }\n\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function (dirty: string): Document {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n\n    if (\n      PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n      NAMESPACE === HTML_NAMESPACE\n    ) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty =\n        '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' +\n        dirty +\n        '</body></html>';\n    }\n\n    const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT\n          ? emptyHTML\n          : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n\n    const body = doc.body || doc.documentElement;\n\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(\n        document.createTextNode(leadingWhitespace),\n        body.childNodes[0] || null\n      );\n    }\n\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(\n        doc,\n        WHOLE_DOCUMENT ? 'html' : 'body'\n      )[0];\n    }\n\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function (root: Node): NodeIterator {\n    /* Read ownerDocument through the cached Node.prototype getter, never the\n       direct property. HTMLFormElement has [LegacyOverrideBuiltIns], so a\n       clobbering child (<input name=\"ownerDocument\"> or a form-associated\n       external input) shadows the prototype getter and makes a direct read\n       return that <input>. createNodeIterator.call(<input>, ...) then throws\n       \"Illegal invocation\", and on the IN_PLACE path that throw lands before\n       the walk's fail-closed barrier - leaving the caller's live tree, with\n       any already-armed handler in it, un-neutralized. The cached getter\n       returns the real Document regardless of the clobber. */\n    const doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;\n    return createNodeIterator.call(\n      doc || root,\n      root,\n      // eslint-disable-next-line no-bitwise\n      NodeFilter.SHOW_ELEMENT |\n        NodeFilter.SHOW_COMMENT |\n        NodeFilter.SHOW_TEXT |\n        NodeFilter.SHOW_PROCESSING_INSTRUCTION |\n        NodeFilter.SHOW_CDATA_SECTION,\n      null\n    );\n  };\n\n  /**\n   * Replace template expression syntax (mustache, ERB, template\n   * literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n   * sites. Order matters: mustache, then ERB, then template literal.\n   *\n   * @param value the string to scrub\n   * @returns the scrubbed string\n   */\n  const _stripTemplateExpressions = function (value: string): string {\n    value = stringReplace(value, MUSTACHE_EXPR, ' ');\n    value = stringReplace(value, ERB_EXPR, ' ');\n    value = stringReplace(value, TMPLIT_EXPR, ' ');\n    return value;\n  };\n\n  /**\n   * Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n   * character data of an element subtree. Used as the final safety net for\n   * SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n   * which only form after text-node normalization (e.g. fragments split across\n   * stripped elements) cannot survive into a template-evaluating framework.\n   *\n   * Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n   * in place rather than round-tripping through innerHTML. This preserves\n   * descendant node references (important for IN_PLACE callers), avoids a\n   * serialize/reparse cycle, and reads literal character data \u2014 which means\n   * `<%...%>` in text content matches the ERB regex against its real bytes\n   * instead of the HTML-entity-escaped form innerHTML would produce.\n   *\n   * Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n   * attributes is performed during the per-node `_sanitizeAttributes` pass.\n   *\n   * @param node The root element whose character data should be scrubbed.\n   */\n  const _scrubTemplateExpressions = function (node: Element): void {\n    node.normalize();\n    /* Clobber-safe ownerDocument read, same reasoning as _createNodeIterator:\n       under SAFE_FOR_TEMPLATES this runs on the live IN_PLACE root, which may\n       carry a form-named-getter override of ownerDocument. */\n    const doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;\n    const walker = createNodeIterator.call(\n      doc || node,\n      node,\n      // eslint-disable-next-line no-bitwise\n      NodeFilter.SHOW_TEXT |\n        NodeFilter.SHOW_COMMENT |\n        NodeFilter.SHOW_CDATA_SECTION |\n        NodeFilter.SHOW_PROCESSING_INSTRUCTION,\n      null\n    );\n\n    let currentNode = walker.nextNode() as CharacterData | null;\n    while (currentNode) {\n      currentNode.data = _stripTemplateExpressions(currentNode.data);\n      currentNode = walker.nextNode() as CharacterData | null;\n    }\n\n    // NodeIterator does not descend into <template>.content per the DOM spec,\n    // so we must explicitly recurse into each template's content fragment,\n    // mirroring the approach used by _sanitizeShadowDOM.\n    const templates = node.querySelectorAll?.('template');\n    if (templates) {\n      arrayForEach(templates, (tmpl: HTMLTemplateElement) => {\n        if (_isDocumentFragment(tmpl.content)) {\n          _scrubTemplateExpressions(tmpl.content as unknown as Element);\n        }\n      });\n    }\n  };\n\n  /**\n   * _isClobbered\n   *\n   * Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n   * interface with [LegacyOverrideBuiltIns]; a descendant element with a\n   * `name` attribute matching a prototype property shadows that property\n   * on direct reads. We use this check at the IN_PLACE entry-point and\n   * during attribute sanitization to refuse clobbered forms.\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function (element: Element): boolean {\n    // Realm-independent tag-name probe. If we can't determine the tag\n    // name at all, we can't reason about clobbering \u2014 return false\n    // (the caller's other defences still apply).\n    const realTagName = getNodeName ? getNodeName(element) : null;\n    if (typeof realTagName !== 'string') {\n      return false;\n    }\n\n    if (transformCaseFunc(realTagName) !== 'form') {\n      return false;\n    }\n\n    return (\n      typeof element.nodeName !== 'string' ||\n      typeof element.textContent !== 'string' ||\n      typeof element.removeChild !== 'function' ||\n      // Realm-safe NamedNodeMap detection: equality against the cached\n      // prototype getter. Clobbered .attributes (e.g. <input name=\"attributes\">)\n      // makes the direct read diverge from the cached read; a clean form\n      // (same-realm OR foreign-realm) has both reads pointing at the same\n      // canonical NamedNodeMap.\n      element.attributes !== getAttributes(element) ||\n      typeof element.removeAttribute !== 'function' ||\n      typeof element.setAttribute !== 'function' ||\n      typeof element.namespaceURI !== 'string' ||\n      typeof element.insertBefore !== 'function' ||\n      typeof element.hasChildNodes !== 'function' ||\n      // NodeType clobbering probe. Cached Node.prototype.nodeType getter\n      // returns the integer 1 for any Element regardless of realm; direct\n      // read on a clobbered form (e.g. <input name=\"nodeType\">) returns\n      // the named child element. Cheap addition \u2014 nodeType is read from\n      // an internal slot, no serialization cost \u2014 and removes a residual\n      // clobbering surface used by several mXSS / PI / comment branches\n      // in _sanitizeElements that compare currentNode.nodeType directly.\n      element.nodeType !== getNodeType(element) ||\n      // HTMLFormElement has [LegacyOverrideBuiltIns]: a descendant named\n      // \"childNodes\" shadows the prototype getter. Direct reads of\n      // form.childNodes from a clobbered form return the named child\n      // instead of the real NodeList, so any walk that reads it directly\n      // skips the form's real children. Compare the direct read to the\n      // cached Node.prototype getter \u2014 when the form's named-property\n      // getter intercepts the read, the two values differ and we flag\n      // the form. This catches every clobbering child type (input,\n      // select, etc.) regardless of whether the named child happens to\n      // carry a numeric .length, which a typeof-based probe would miss\n      // (e.g. HTMLSelectElement.length is a defined unsigned-long).\n      element.childNodes !== getChildNodes(element)\n    );\n  };\n\n  /**\n   * Checks whether the given value is a DocumentFragment from any realm.\n   *\n   * The realm-independent replacement reads `nodeType` through the cached\n   * Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n   * constant (11). nodeType is a numeric value resolved from the node's\n   * internal slot, identical across realms for the same kind of node.\n   *\n   * @param value object to check\n   * @return true if value is a DocumentFragment-shaped node from any realm\n   */\n  const _isDocumentFragment = function (value: unknown): boolean {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n\n    try {\n      return getNodeType(value as Node) === NODE_TYPE.documentFragment;\n    } catch (_) {\n      return false;\n    }\n  };\n\n  /**\n   * Checks whether the given object is a DOM node, including nodes that\n   * originate from a different window/realm (e.g. an iframe's\n   * contentDocument). The previous `value instanceof Node` check was\n   * realm-bound: nodes from a different window failed it, causing\n   * sanitize() to silently stringify them and reset IN_PLACE to false,\n   * returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true if value is a DOM node from any realm\n   */\n  const _isNode = function (value: unknown): value is Node {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n\n    try {\n      return typeof getNodeType(value) === 'number';\n    } catch (_) {\n      return false;\n    }\n  };\n\n  function _executeHooks<T extends HookFunction>(\n    hooks: HookFunction[],\n    currentNode: Parameters<T>[0],\n    data: Parameters<T>[1]\n  ): void {\n    if (hooks.length === 0) {\n      return;\n    }\n\n    arrayForEach(hooks, (hook: T) => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n\n  /**\n   * Structural-threat checks that condemn a node regardless of the\n   * allowlists: mXSS via namespace confusion, risky CSS construction,\n   * processing instructions, markup-bearing comments. Pure predicate;\n   * the caller removes. Check order is load-bearing.\n   *\n   * @param currentNode the node to inspect\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node must be removed\n   */\n  const _isUnsafeNode = function (currentNode: any, tagName: string): boolean {\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (\n      SAFE_FOR_XML &&\n      currentNode.hasChildNodes() &&\n      !_isNode(currentNode.firstElementChild) &&\n      regExpTest(EXPRESSIONS.ELEMENT_MARKUP_PROBE, currentNode.textContent) &&\n      regExpTest(EXPRESSIONS.ELEMENT_MARKUP_PROBE, currentNode.innerHTML)\n    ) {\n      return true;\n    }\n\n    /* Remove rawtext/literal-text elements whose literal serialization\n       re-opens markup on an HTML reparse - shapes (a) and (b) documented at\n       LITERAL_TEXT_ELEMENTS. Both are invisible to rule 1 above (which\n       self-disables once there is an element child, and whose second probe\n       reads the innerHTML an XML/XHTML document serializes escaped), which\n       is why both probes here read textContent instead. Previously only\n       `style`-with-element-child was covered; every element in\n       LITERAL_TEXT_ELEMENTS shares this literal serialization and is\n       equally affected. */\n    if (\n      SAFE_FOR_XML &&\n      currentNode.namespaceURI === HTML_NAMESPACE &&\n      LITERAL_TEXT_ELEMENTS[tagName] &&\n      (_isNode(currentNode.firstElementChild) ||\n        (typeof currentNode.textContent === 'string' &&\n          regExpTest(LITERAL_TEXT_CLOSE[tagName], currentNode.textContent)))\n    ) {\n      return true;\n    }\n\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.processingInstruction) {\n      return true;\n    }\n\n    /* Remove any kind of possibly harmful comments */\n    if (\n      SAFE_FOR_XML &&\n      currentNode.nodeType === NODE_TYPE.comment &&\n      regExpTest(EXPRESSIONS.COMMENT_MARKUP_PROBE, currentNode.data)\n    ) {\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n   * Evaluate a CUSTOM_ELEMENT_HANDLING check (a RegExp or a predicate\n   * function, per the validation in _parseConfig) against a name.\n   * Additional arguments are forwarded to predicate functions - the\n   * attributeNameCheck predicate receives the tag name as its second\n   * argument. A null/absent check never matches.\n   *\n   * @param check the configured tagNameCheck / attributeNameCheck value\n   * @param name the name to test\n   * @param args extra arguments forwarded to a predicate function\n   * @return true if the check matches the name\n   */\n  const _matchesNameCheck = function (\n    check: unknown,\n    name: string,\n    ...args: unknown[]\n  ): boolean {\n    if (check instanceof RegExp) {\n      return regExpTest(check, name);\n    }\n\n    if (check instanceof Function) {\n      return Boolean(check(name, ...args));\n    }\n\n    return false;\n  };\n\n  /**\n   * Handle a node whose tag is forbidden or not allowlisted: keep\n   * allowed custom elements (false return exits _sanitizeElements\n   * early - the namespace and fallback-tag removal checks are\n   * intentionally skipped for kept custom elements), else hoist\n   * content per KEEP_CONTENT and remove.\n   *\n   * A kept custom element is the ONLY case in which this function\n   * returns false, so the caller uses that return value to run the\n   * afterSanitizeElements hook on the kept element and keep the\n   * element-hook lifecycle consistent with normal allowlisted\n   * elements (GHSA-c2j3-45gr-mqc4).\n   *\n   * @param currentNode the disallowed node\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node was removed, false if kept\n   */\n  const _sanitizeDisallowedNode = function (\n    currentNode: any,\n    tagName: string,\n    root: Node\n  ): boolean {\n    /* Check if we have a custom element to handle */\n    if (\n      !FORBID_TAGS[tagName] &&\n      _isBasicCustomElement(tagName) &&\n      _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)\n    ) {\n      return false;\n    }\n\n    /* Keep content except for bad-listed elements.\n         Use the cached prototype getters exclusively \u2014 the previous code\n         had `|| currentNode.parentNode` / `|| currentNode.childNodes`\n         fallbacks, but the cached getters always return the canonical\n         value (or null for a real parent-less node), so the fallback\n         path was dead in safe cases and a clobbering surface in unsafe\n         ones. Falsy cached results stay falsy; the `if (childNodes &&\n         parentNode)` check already gates correctly. */\n    if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n      const parentNode = getParentNode(currentNode);\n      const childNodes = getChildNodes(currentNode);\n\n      if (childNodes && parentNode) {\n        const childCount = childNodes.length;\n\n        /* Hoist by moving each child up one level rather than deep-cloning\n             it. Moving transfers every descendant exactly once, so a chain of\n             nested disallowed elements costs O(n) instead of the O(n^2) that\n             re-cloning the shrinking subtree at each level produced; it also\n             empties the removed original, so `DOMPurify.removed` no longer\n             pins whole subtrees. Moving preserves the in-place guarantee too:\n             an original carrying already-queued resource events (`<img\n             onerror>`, `<video>`/`<audio>` error, lazy/`onload`, \u2026) is\n             relocated and sanitised rather than left detached but still armed.\n\n             The sole case that must clone is removing the walk root itself.\n             The result is serialised from the root's subtree, so a restrictive\n             ALLOWED_TAGS that strips the root (`body` on the string path) must\n             leave the content inside it, which only cloning does. In IN_PLACE\n             the root is pre-validated as an allowed tag and so is never removed\n             here, so that path always takes the move branch.\n\n             `childNodes` is live; a tail-to-head walk keeps `childNodes[i]`\n             valid whether we move (drops the trailing entry) or clone (leaves\n             the list intact). */\n        for (let i = childCount - 1; i >= 0; --i) {\n          const hoisted =\n            currentNode === root\n              ? cloneNode(childNodes[i], true)\n              : childNodes[i];\n          parentNode.insertBefore(hoisted, getNextSibling(currentNode));\n        }\n      }\n    }\n\n    _forceRemove(currentNode);\n    return true;\n  };\n\n  /**\n   * Fork a hook-mutable allowlist off its shared binding the first time a\n   * (possibly lazily-installed) uponSanitize* hook is about to see it, so the\n   * hook cannot widen the per-instance default or the setConfig binding by\n   * reference and leak past the call. Returns the set unchanged once it is\n   * already call-local, so repeated calls across elements are idempotent.\n   *\n   * @param hookList the uponSanitize* hook array for this event\n   * @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding\n   * @param defaultSet the per-instance DEFAULT_ALLOWED_* constant\n   * @param setConfigSet the captured setConfig() binding, or null\n   * @return a call-local clone if a hook is present and set is still shared,\n   *   else set unchanged\n   */\n  const _forkSharedAllowlist = function <T extends Record<string, any>>(\n    hookList: unknown[],\n    set: T,\n    defaultSet: T,\n    setConfigSet: T | null\n  ): T {\n    if (hookList.length === 0) {\n      return set;\n    }\n\n    return set === defaultSet || set === setConfigSet ? clone(set) : set;\n  };\n\n  /**\n   * Shared guard for a node that a hook has detached from the walk tree,\n   * used after each element-hook site in _sanitizeElements. Detaching is a\n   * long-standing user pattern (issue #469; draw.io-style foreignObject\n   * filtering). Per the cached, unclobberable parentNode getter the node is\n   * genuinely out of the tree, so it can reach neither the serialized\n   * output nor an IN_PLACE live tree; treat it as removed and stop\n   * processing it. Without this guard, the unsafe-node / namespace checks\n   * would call _forceRemove on a parentless node and hit the REPORT-3\n   * fail-closed throw \u2014 which exists for nodes DOMPurify wants gone but\n   * *cannot* detach (clobbered / parentless roots), the opposite of a node\n   * that is already safely gone. The walk root is exempt: a detached\n   * IN_PLACE root is legitimate input and must still be fully sanitized,\n   * and a kill-decision on it must keep hitting the REPORT-3 throw.\n   *\n   * Nodes detached by hooks stay the hook's responsibility for placement:\n   * they are not recorded in DOMPurify.removed, so the post-walk IN_PLACE\n   * pass (which iterates DOMPurify.removed) does not reach them. But a\n   * hook-detached subtree can still hold a queued resource-event handler -\n   * e.g. an <img onload> that began loading when the caller built the live\n   * tree - which fires in page scope after sanitize returns even though the\n   * handler never reached the returned tree. That is the audit-5 F1 hazard,\n   * and the documented node.remove() hook pattern walks straight into it.\n   * So on the IN_PLACE path we neutralize the detached subtree inline,\n   * stripping its non-allow-listed attributes before returning, exactly as\n   * the post-walk pass does for _forceRemove'd subtrees.\n   *\n   * @param currentNode the node a hook may have detached\n   * @param root the current walk root\n   * @return true if the node is detached and now handled, false otherwise\n   */\n  const _handleHookDetachedNode = function (\n    currentNode: Node,\n    root: Node\n  ): boolean {\n    if (currentNode === root || getParentNode(currentNode) !== null) {\n      return false;\n    }\n\n    if (IN_PLACE) {\n      _neutralizeSubtree(currentNode);\n    }\n\n    return true;\n  };\n\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function (currentNode: any, root: Node): boolean {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n\n    /* A hook may have detached the node - treat it as removed (see\n       _handleHookDetachedNode for the full rationale). */\n    if (_handleHookDetachedNode(currentNode, root)) {\n      return true;\n    }\n\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(_readNodeName(currentNode));\n\n    /* Close the pre-walk clone-guard's timing gap: an uponSanitizeElement\n       hook may have been installed after that guard sampled the hook arrays\n       (e.g. lazily from beforeSanitizeElements), leaving ALLOWED_TAGS still\n       aliasing a shared binding that a widening hook would mutate by\n       reference. Fork it before exposing it to the hook. */\n    ALLOWED_TAGS = _forkSharedAllowlist(\n      hooks.uponSanitizeElement,\n      ALLOWED_TAGS,\n      DEFAULT_ALLOWED_TAGS,\n      SET_CONFIG_ALLOWED_TAGS\n    );\n\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS,\n    });\n\n    /* The uponSanitizeElement hook may have detached the node, exactly as\n       above (see _handleHookDetachedNode for the full rationale). */\n    if (_handleHookDetachedNode(currentNode, root)) {\n      return true;\n    }\n\n    /* Remove mXSS vectors, processing instructions and risky comments */\n    if (_isUnsafeNode(currentNode, tagName)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n\n    /* Remove element if anything forbids its presence */\n    if (\n      FORBID_TAGS[tagName] ||\n      (!(\n        EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function &&\n        EXTRA_ELEMENT_HANDLING.tagCheck(tagName)\n      ) &&\n        !ALLOWED_TAGS[tagName])\n    ) {\n      const removed = _sanitizeDisallowedNode(currentNode, tagName, root);\n\n      /* A false return means the node is a custom element kept via\n         CUSTOM_ELEMENT_HANDLING - the only keep path through\n         _sanitizeDisallowedNode. Run afterSanitizeElements on it so the\n         element-hook lifecycle matches normal allowlisted elements: a\n         security policy applied in this hook (e.g. stripping an attribute\n         from every surviving element) must not silently skip kept custom\n         elements (GHSA-c2j3-45gr-mqc4). This mirrors the normal-element\n         tail below - the hook runs, then the walker's subsequent\n         _sanitizeAttributes pass sanitizes the element's attributes. The\n         deliberately skipped namespace and fallback-tag removal checks stay\n         skipped; they are removal decisions, not the hook contract. */\n      if (removed === false) {\n        _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n      }\n\n      return removed;\n    }\n\n    /* Check whether element has a valid namespace.\n       Realm-safe check (GHSA-hpcv-96wg-7vj8): use the cached Node.prototype\n       nodeType getter rather than `instanceof Element`, which is realm-\n       bound and short-circuits to false for any node minted in a different\n       realm \u2014 letting a foreign-realm element with a forbidden namespace\n       slip past the namespace check entirely. */\n    const nt = _readNodeType(currentNode);\n    if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if (\n      (tagName === 'noscript' ||\n        tagName === 'noembed' ||\n        tagName === 'noframes') &&\n      regExpTest(EXPRESSIONS.FALLBACK_TAG_CLOSE, currentNode.innerHTML)\n    ) {\n      _forceRemove(currentNode);\n      return true;\n    }\n\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      const content = _stripTemplateExpressions(currentNode.textContent);\n\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n        currentNode.textContent = content;\n      }\n    }\n\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n\n    return false;\n  };\n\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function (\n    lcTag: string,\n    lcName: string,\n    value: string\n  ): boolean {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n\n    /* Reject declarative-partial-updates patch-linkage attributes\n       (https://github.com/WICG/declarative-partial-updates).\n\n       Empirical note (Chrome 150, verified \u2014 see\n       test/declarative-patch-probe-v3.html): expansion is NOT applied after\n       sanitization. For the string path it fires during sanitize()'s own\n       parse, so the walk sees and sanitizes the fully materialized expanded\n       tree \u2014 teleports into MathML/SVG integration points included; a\n       weaponized `<template for>`->`<img onerror>` comes back with the handler\n       stripped. For the IN_PLACE path it fires on connection, before the walk.\n       Either way DOMPurify is NOT blind to the patch.\n\n       This removal is therefore defense-in-depth rather than the sole barrier:\n       it prevents live linkage from surviving into the OUTPUT and re-expanding\n       in the caller's context, and keeps behaviour deterministic if a future\n       engine defers expansion. `for` is legitimate only on <label>/<output>;\n       anywhere else (notably <template for>) it links the element to a patch\n       target and teleports or removes an arbitrary DOM range by id/marker name.\n       `patchsrc` fetches remote markup and is treated as a script-loading\n       mechanism (CSP). Gated on SAFE_FOR_XML so the removal groups with the\n       other structural-threat checks and stays overridable, consistent with\n       the rest of the codebase. PI range markers are already removed by\n       _isUnsafeNode. */\n    if (_isPatchLinkageAttribute(lcName, lcTag)) {\n      return false;\n    }\n\n    /* Make sure attribute cannot clobber */\n    if (\n      SANITIZE_DOM &&\n      (lcName === 'id' || lcName === 'name') &&\n      (value in document || value in formElement)\n    ) {\n      return false;\n    }\n\n    const nameIsPermitted =\n      ALLOWED_ATTR[lcName] ||\n      (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function &&\n        EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag));\n\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR, lcName)) {\n      return true;\n    }\n\n    /* Allow valid aria-* attributes, the value is always URI safe */\n    if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) {\n      return true;\n    }\n\n    /* A name outside the allowlist is acceptable on custom-element terms\n       only. The value checks below are intentionally skipped in that case:\n       if the user supplied a tagNameCheck we also allow derived custom\n       elements using the same test, and attributes passing the configured\n       attributeNameCheck are allowed as custom elements define these at\n       their own discretion. */\n    if (!nameIsPermitted) {\n      return (\n        // Condition a) covers a basically valid custom element tag name whose\n        // tag passes the configured tagNameCheck and whose attribute name\n        // passes the configured attributeNameCheck ...\n        (_isBasicCustomElement(lcTag) &&\n          _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) &&\n          _matchesNameCheck(\n            CUSTOM_ELEMENT_HANDLING.attributeNameCheck,\n            lcName,\n            lcTag\n          )) ||\n        // Condition b) covers an `is` attribute whose value passes the\n        // configured tagNameCheck while customized built-in elements are\n        // allowed.\n        (lcName === 'is' &&\n          CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements &&\n          _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value))\n      );\n    }\n\n    /* Check value is safe. First, is attr inert? If so, is safe */\n    if (URI_SAFE_ATTRIBUTES[lcName]) {\n      return true;\n    }\n\n    /* Check no script, data or unknown possibly unsafe URI\n        unless we know URI values are safe for that attribute */\n    if (regExpTest(IS_ALLOWED_URI, stringReplace(value, ATTR_WHITESPACE, ''))) {\n      return true;\n    }\n\n    /* Keep image data URIs alive if src/xlink:href is allowed */\n    /* Further prevent gadget XSS for dynamically built script tags */\n    if (\n      (lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') &&\n      lcTag !== 'script' &&\n      stringIndexOf(value, 'data:') === 0 &&\n      DATA_URI_TAGS[lcTag]\n    ) {\n      return true;\n    }\n\n    /* Allow unknown protocols: This provides support for links that\n        are handled by protocol handlers which may be unknown ahead of\n        time, e.g. fb:, spotify: */\n    if (\n      ALLOW_UNKNOWN_PROTOCOLS &&\n      !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))\n    ) {\n      return true;\n    }\n\n    /* Only an empty (binary) value remains safe at this point;\n       anything else is presumed unsafe, do not add it back */\n    return !value;\n  };\n\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, [\n    'annotation-xml',\n    'color-profile',\n    'font-face',\n    'font-face-format',\n    'font-face-name',\n    'font-face-src',\n    'font-face-uri',\n    'missing-glyph',\n  ]);\n\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function (tagName: string): boolean {\n    return (\n      !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] &&\n      regExpTest(CUSTOM_ELEMENT, tagName)\n    );\n  };\n\n  /**\n   * Wrap an attribute value in the matching Trusted Types object when\n   * the active policy requires it. Namespaced attributes pass through\n   * unchanged (no TT support yet, see\n   * https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n   *\n   * @param lcTag lowercase tag name of the containing element\n   * @param lcName lowercase attribute name\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the attribute value to wrap\n   * @return the value, wrapped when Trusted Types demand it\n   */\n  const _applyTrustedTypesToAttribute = function (\n    lcTag: string,\n    lcName: string,\n    namespaceURI: string | null,\n    value: string\n  ): string {\n    if (\n      trustedTypesPolicy &&\n      typeof trustedTypes === 'object' &&\n      typeof trustedTypes.getAttributeType === 'function' &&\n      !namespaceURI\n    ) {\n      switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n        case 'TrustedHTML': {\n          return _createTrustedHTML(value);\n        }\n\n        case 'TrustedScriptURL': {\n          return _createTrustedScriptURL(value);\n        }\n\n        default: {\n          break;\n        }\n      }\n    }\n\n    return value;\n  };\n\n  /**\n   * Write a modified attribute value back onto the element. On\n   * success, re-probe for clobbering introduced by the new value and\n   * remove the element when found; otherwise pop the removal entry\n   * recorded by the earlier _removeAttribute (long-standing pairing\n   * with the SANITIZE_NAMED_PROPS path - do not \"fix\" casually). On\n   * failure, remove the attribute instead.\n   *\n   * @param currentNode the element carrying the attribute\n   * @param name the attribute name as present on the element\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the new attribute value\n   */\n  const _setAttributeValue = function (\n    currentNode: Element,\n    name: string,\n    namespaceURI: string | null,\n    value: string\n  ): void {\n    try {\n      if (namespaceURI) {\n        currentNode.setAttributeNS(namespaceURI, name, value);\n      } else {\n        /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n        currentNode.setAttribute(name, value);\n      }\n\n      if (_isClobbered(currentNode)) {\n        _forceRemove(currentNode);\n      } else {\n        arrayPop(DOMPurify.removed);\n      }\n    } catch (_) {\n      _removeAttribute(name, currentNode);\n    }\n  };\n\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function (currentNode: Element): void {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n\n    const { attributes } = currentNode;\n\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n\n    /* Same lazy-install guard as uponSanitizeElement (see there): fork the\n       attribute allowlist off its shared binding before a hook can see it. */\n    ALLOWED_ATTR = _forkSharedAllowlist(\n      hooks.uponSanitizeAttribute,\n      ALLOWED_ATTR,\n      DEFAULT_ALLOWED_ATTR,\n      SET_CONFIG_ALLOWED_ATTR\n    );\n\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined,\n    };\n    let l = attributes.length;\n    const lcTag = transformCaseFunc(currentNode.nodeName);\n\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const { name, namespaceURI, value: attrValue } = attr;\n      const lcName = transformCaseFunc(name);\n\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (\n        SANITIZE_NAMED_PROPS &&\n        (lcName === 'id' || lcName === 'name') &&\n        stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0\n      ) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode, attr);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone \u2014 the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n\n      /* Work around a security issue with comments inside attributes */\n      if (\n        SAFE_FOR_XML &&\n        regExpTest(\n          /((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,\n          value\n        )\n      ) {\n        _removeAttribute(name, currentNode, attr);\n        continue;\n      }\n\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode, attr);\n        continue;\n      }\n\n      /* Did the hooks force-keep the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode, attr);\n        continue;\n      }\n\n      /* Work around a security issue in jQuery 3.0 */\n      if (\n        !ALLOW_SELF_CLOSE_IN_ATTR &&\n        regExpTest(EXPRESSIONS.SELF_CLOSING_TAG, value)\n      ) {\n        _removeAttribute(name, currentNode, attr);\n        continue;\n      }\n\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        value = _stripTemplateExpressions(value);\n      }\n\n      /* Is `value` valid for this attribute? */\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode, attr);\n        continue;\n      }\n\n      /* Handle attributes that require Trusted Types */\n      value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        _setAttributeValue(currentNode, name, namespaceURI, value);\n      }\n    }\n\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM = function (fragment: DocumentFragment): void {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n\n    while ((shadowNode = shadowIterator.nextNode())) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode, fragment);\n\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n\n      /* Deep shadow DOM detected.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): use nodeType against the\n         DOCUMENT_FRAGMENT_NODE constant rather than instanceof, so we\n         recurse into <template>.content from foreign realms too. */\n      if (_isDocumentFragment(shadowNode.content)) {\n        _sanitizeShadowDOM(shadowNode.content);\n      }\n\n      /* An element iterated here may itself host an attached\n         shadow root. The default NodeIterator does not enter shadow\n         trees, so a shadow root nested inside template.content was\n         previously reached by no walk at all (the pre-pass at\n         _sanitizeAttachedShadowRoots descends via childNodes, which\n         doesn't enter template.content; the template-content recursion\n         above iterates the content but never inspected shadowRoot).\n         Walk it explicitly. The nodeType guard avoids reading\n         shadowRoot off text / comment / CDATA / PI nodes that the\n         iterator also surfaces. */\n      if (_readNodeType(shadowNode) === NODE_TYPE.element) {\n        const innerSr = getShadowRoot(shadowNode);\n        if (_isDocumentFragment(innerSr)) {\n          _sanitizeAttachedShadowRoots(innerSr);\n          _sanitizeShadowDOM(innerSr);\n        }\n      }\n    }\n\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n\n  /**\n   * _sanitizeAttachedShadowRoots\n   *\n   * Walks `root` and feeds every attached shadow root we encounter into\n   * the existing _sanitizeShadowDOM pipeline. The default node iterator\n   * does not descend into shadow trees, so nodes inside an attached\n   * shadow root would otherwise be skipped entirely.\n   *\n   * Two real input paths put attached shadow roots in front of us:\n   *   1. IN_PLACE on a DOM node that already has shadow roots attached.\n   *   2. DOM-node input where importNode(dirty, true) deep-clones the\n   *      shadow root because it was created with `clonable: true`.\n   *\n   * This pass runs once, up front, so the main iteration loop (and the\n   * existing _sanitizeShadowDOM template-content recursion) stay\n   * untouched \u2014 string-input paths are not affected.\n   *\n   * @param root the subtree root to walk for attached shadow roots\n   */\n  const _sanitizeAttachedShadowRoots = function (root: Node): void {\n    /* Iterative (explicit stack) rather than per-child recursion. DOM APIs\n       impose no depth cap, so an attacker-shaped tree (JSON/CRDT/editor data\n       built straight into the DOM \u2014 the IN_PLACE surface) deeper than the JS\n       call-stack budget would otherwise overflow native recursion here and\n       throw at the IN_PLACE entry pre-pass, before a single node is\n       sanitized, leaving the caller's live tree untouched (fail-open). See\n       campaign-3 F4. A heap stack keeps depth off the call stack.\n\n       Each work item is either a node to descend into, or a deferred\n       `_sanitizeShadowDOM` for an already-walked shadow root. The deferred\n       form preserves the original post-order discipline: a shadow root's\n       nested shadow roots are discovered before the outer shadow is\n       sanitized (which may remove hosts). Pushes are in reverse of the\n       desired processing order (LIFO): template content, then children, then\n       the shadow-sanitize, then the shadow walk \u2014 so the order matches the\n       previous recursion exactly. */\n    const stack: Array<{ node: Node | null; shadow: DocumentFragment | null }> =\n      [{ node: root, shadow: null }];\n\n    while (stack.length > 0) {\n      const item = stack.pop();\n\n      /* Deferred shadow-DOM sanitisation: runs after its subtree was walked. */\n      if (item.shadow) {\n        _sanitizeShadowDOM(item.shadow);\n        continue;\n      }\n\n      const node = item.node;\n      const nodeType = _readNodeType(node);\n      const isElement = nodeType === NODE_TYPE.element;\n\n      /* (pushed last \u2192 processed first) Children, snapshotted in reverse so\n         the first child is processed first. Snapshotting matters because a\n         hook may detach siblings mid-walk. */\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push({ node: childNodes[i], shadow: null });\n        }\n      }\n\n      /* (pushed before children \u2192 processed after them, matching the old\n         \"template content last\" order) When the node is a <template>,\n         descend into its content. */\n      if (isElement) {\n        const rootName = getNodeName ? getNodeName(node) : null;\n        if (\n          typeof rootName === 'string' &&\n          transformCaseFunc(rootName) === 'template'\n        ) {\n          const content = (node as HTMLTemplateElement).content;\n          if (_isDocumentFragment(content)) {\n            stack.push({ node: content, shadow: null });\n          }\n        }\n      }\n\n      /* Shadow root (processed first): walk its subtree, then sanitise it.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n         rather than `instanceof DocumentFragment`, which is realm-bound and\n         silently skipped foreign-realm shadow roots (e.g.\n         iframe.contentDocument attachShadow). */\n      if (isElement) {\n        const sr = getShadowRoot(node);\n        if (_isDocumentFragment(sr)) {\n          /* Push the deferred sanitise first so it pops after the shadow\n             walk we push next, i.e. nested shadow roots are discovered\n             before this one is sanitised. */\n          stack.push({ node: null, shadow: sr }, { node: sr, shadow: null });\n        }\n      }\n    }\n  };\n\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty, cfg = {}) {\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n\n    /* Assign config vars */\n    if (SET_CONFIG) {\n      /* Persistent setConfig() path: _parseConfig is skipped, so the sets are\n       * not re-derived per call. Restore them from the pristine bindings\n       * captured at setConfig() time so a previous call's hook clone (mutated\n       * below) does not carry over. */\n      ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n      ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n    } else {\n      _parseConfig(cfg);\n    }\n\n    /* Clone the hook-mutable allowlists before the walk whenever an\n     * uponSanitize* hook is registered. The hook event exposes ALLOWED_TAGS\n     * and ALLOWED_ATTR by reference (as allowedTags / allowedAttributes), so\n     * a hook that widens them would otherwise mutate the shared set\n     * permanently: across later calls and across every element. Cloning per\n     * walk keeps documented in-call widening working while scoping it to the\n     * call. A single guard for both config paths - the per-call path rebinds\n     * the sets in _parseConfig each call, the persistent path restores them\n     * from the captured bindings just above - so the two cannot diverge. */\n    if (\n      hooks.uponSanitizeElement.length > 0 ||\n      hooks.uponSanitizeAttribute.length > 0\n    ) {\n      ALLOWED_TAGS = clone(ALLOWED_TAGS);\n    }\n\n    if (hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_ATTR = clone(ALLOWED_ATTR);\n    }\n\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n\n    /* Resolve IN_PLACE for this call without mutating persistent config.\n       Writing the IN_PLACE closure variable here leaks under setConfig(),\n       where _parseConfig is skipped on later calls: a single string call would\n       disable in-place mode for every subsequent node call, returning a\n       sanitized copy while leaving the caller's node \u2014 which in-place callers\n       keep using and whose return value they ignore \u2014 unsanitized. REPORT-2. */\n    const inPlace = IN_PLACE && typeof dirty !== 'string' && _isNode(dirty);\n\n    if (inPlace) {\n      /* Declarative-partial-updates / streaming pre-pass: sever every patch\n         linkage across the live tree BEFORE the walk, so no patch can fire\n         mid-walk and inject into an already-processed region. Runs first, so\n         it also covers the forbidden/clobbered roots that throw below. */\n      _neutralizePatchLinkage(dirty as Node);\n\n      /* Do some early pre-sanitization to avoid unsafe root nodes.\n         Read nodeName through the cached prototype getter \u2014 a clobbering\n         child named \"nodeName\" on the form root would otherwise shadow\n         the property and let this check skip the root-allowlist\n         validation entirely. */\n      const nn = _readNodeName(dirty as Node);\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          /* Fail closed on a live root: neutralize handlers/children before\n             throwing, exactly as the mid-walk abort path does. */\n          _neutralizeRoot(dirty as Node);\n\n          throw typeErrorCreate(\n            'root node is forbidden and cannot be sanitized in-place'\n          );\n        }\n      }\n\n      /* Pre-flight the root through _isClobbered. The iterator-driven\n         removal path can not detach a parent-less root: _forceRemove\n         falls through to Element.prototype.remove(), which per spec\n         is a no-op on a node with no parent. A clobbered root would\n         then survive the main loop with its attributes uninspected,\n         because _sanitizeAttributes early-returns on _isClobbered. The\n         result would be an attacker-controlled form, complete with any\n         event-handler attributes the caller passed in, handed back to\n         the application unsanitized. Refuse to sanitize such a root\n         the same way we refuse a forbidden tag. GHSA-r47g-fvhr-h676. */\n      if (_isClobbered(dirty as Element)) {\n        /* Fail closed on a live clobbered root before throwing.\n           _neutralizeRoot's reads are clobber-safe (cached getters); the\n           form's non-clobbered descendants, e.g. an armed <img>, are scrubbed. */\n        _neutralizeRoot(dirty as Node);\n\n        throw typeErrorCreate(\n          'root node is clobbered and cannot be sanitized in-place'\n        );\n      }\n\n      /* Sanitize attached shadow roots before the main iterator runs.\n         The iterator does not descend into shadow trees. Same fail-closed\n         barrier as the main walk (campaign-3 F2): a custom-element reaction\n         inside a shadow root could abort this pre-pass before the walk runs,\n         which would otherwise leave the entire live tree unsanitized. */\n      try {\n        _sanitizeAttachedShadowRoots(dirty as Node);\n      } catch (error) {\n        _neutralizeRoot(dirty as Node);\n\n        throw error;\n      }\n    } else if (_isNode(dirty)) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (\n        importedNode.nodeType === NODE_TYPE.element &&\n        importedNode.nodeName === 'BODY'\n      ) {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n\n      /* Clonable shadow roots are deep-cloned by importNode(); sanitize\n         them before the main iterator runs, since the iterator does not\n         descend into shadow trees. The walk routes every read through a\n         cached prototype getter so clobbering descendants on a form root\n         cannot hide a shadow host from this pass. */\n      _sanitizeAttachedShadowRoots(importedNode);\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (\n        !RETURN_DOM &&\n        !SAFE_FOR_TEMPLATES &&\n        !WHOLE_DOCUMENT &&\n        // eslint-disable-next-line unicorn/prefer-includes\n        dirty.indexOf('<') === -1\n      ) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n          ? _createTrustedHTML(dirty)\n          : dirty;\n      }\n\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n\n    /* Get node iterator */\n    const walkRoot: Node = inPlace ? (dirty as Node) : body;\n\n    /* Now start iterating over the created document.\n       The walk runs inside an exception barrier (campaign-3 F2): a re-entrant\n       engine/custom-element mutation can detach a node mid-walk so\n       `_forceRemove`'s parentless guard throws, aborting the loop. Without the\n       barrier the caller's in-place tree would be left half-sanitized with the\n       unvisited tail still armed. _createNodeIterator itself is inside the\n       barrier too: constructing the iterator dereferences the root's document,\n       and any failure there (e.g. an exotic/clobbered root) must still fail\n       closed rather than skip the neutralize. On any throw we fail closed -\n       strip the in-place root bare - then rethrow so the existing throw\n       contract is preserved. (String/DOM-copy paths never return the partial\n       body, so the propagating throw is already fail-closed there.) */\n    try {\n      const nodeIterator = _createNodeIterator(walkRoot);\n      while ((currentNode = nodeIterator.nextNode())) {\n        /* Sanitize tags and elements */\n        _sanitizeElements(currentNode, walkRoot);\n\n        /* Check attributes next */\n        _sanitizeAttributes(currentNode);\n\n        /* Shadow DOM detected, sanitize it.\n           Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n           instead of instanceof, so foreign-realm <template>.content is\n           walked correctly. */\n        if (_isDocumentFragment(currentNode.content)) {\n          _sanitizeShadowDOM(currentNode.content);\n        }\n      }\n    } catch (error) {\n      if (inPlace) {\n        _neutralizeRoot(dirty as Node);\n        /* Nodes _forceRemove'd earlier in the aborted walk are already\n           detached from the root, so _neutralizeRoot's subtree pass does not\n           reach them. Defuse them too, mirroring the success-path loop below. */\n        arrayForEach(DOMPurify.removed, (entry) => {\n          if (entry.element) {\n            _neutralizeSubtree(entry.element as Node);\n          }\n        });\n      }\n\n      throw error;\n    }\n\n    /* If we sanitized `dirty` in-place, return it. */\n    if (inPlace) {\n      /* Fail-closed completion of the audit-5 F1 fix: every node removed from\n         the caller's live tree is detached but may still hold a queued\n         resource-event handler that fires in page scope after we return. The\n         move-hoist covers only disallowed-tag KEEP_CONTENT removals; strip the\n         non-allow-listed attributes off every other removed subtree (clobber,\n         mXSS, namespace, comments, KEEP_CONTENT:false, \u2026) so those handlers are\n         cancelled before any event can fire. Runs synchronously, pre-return. */\n      arrayForEach(DOMPurify.removed, (entry) => {\n        if (entry.element) {\n          _neutralizeSubtree(entry.element as Node);\n        }\n      });\n\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions(dirty as Element);\n      }\n\n      return dirty;\n    }\n\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions(body);\n      }\n\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n\n      return returnNode;\n    }\n\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n    /* Serialize doctype if allowed */\n    if (\n      WHOLE_DOCUMENT &&\n      ALLOWED_TAGS['!doctype'] &&\n      body.ownerDocument &&\n      body.ownerDocument.doctype &&\n      body.ownerDocument.doctype.name &&\n      regExpTest(EXPRESSIONS.DOCTYPE_NAME, body.ownerDocument.doctype.name)\n    ) {\n      serializedHTML =\n        '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      serializedHTML = _stripTemplateExpressions(serializedHTML);\n    }\n\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n      ? _createTrustedHTML(serializedHTML)\n      : serializedHTML;\n  };\n\n  DOMPurify.setConfig = function (cfg = {}) {\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n    SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n    SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n  };\n\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n    SET_CONFIG_ALLOWED_TAGS = null;\n    SET_CONFIG_ALLOWED_ATTR = null;\n\n    // Drop any caller-supplied Trusted Types policy so it cannot poison later\n    // `RETURN_TRUSTED_TYPE` output. The internal default policy (cached, and\n    // never recreated \u2014 Trusted Types throws on duplicate names) is restored by\n    // the next `_parseConfig`. See GHSA-vxr8-fq34-vvx9.\n    trustedTypesPolicy = defaultTrustedTypesPolicy;\n    emptyHTML = '';\n  };\n\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n\n  DOMPurify.addHook = function (\n    entryPoint: keyof HooksMap,\n    hookFunction: HookFunction\n  ) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n\n    /* Reject unknown entry points. Without this, a non-hook key (e.g.\n     * '__proto__') indexes off the prototype chain rather than a real\n     * hook array, and arrayPush then writes to Object.prototype. Guard\n     * with an own-property check against the known hook names. */\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n\n  DOMPurify.removeHook = function (\n    entryPoint: keyof HooksMap,\n    hookFunction: HookFunction\n  ) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return undefined;\n    }\n\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n\n      return index === -1\n        ? undefined\n        : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n\n    return arrayPop(hooks[entryPoint]);\n  };\n\n  DOMPurify.removeHooks = function (entryPoint: keyof HooksMap) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n\n    hooks[entryPoint] = [];\n  };\n\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n\n  return DOMPurify;\n}\n\nexport default createDOMPurify();\n", "import { Controller } from '@hotwired/stimulus';\nimport { LiveObserver } from './live_observer';\nimport { LiveState } from './live_state';\nimport { LiveAttribute } from './live_attribute';\nimport { LiveComputed } from './live_computed';\nimport { LiveEvaluator } from './live_evaluator';\nimport DOMPurify from 'dompurify';\n\nexport default class LiveController extends Controller {\n  connect() {\n    this.state = {};\n    this.computed = {};\n    this.evaluator = new LiveEvaluator(this.state, this.computed);\n\n    this.observer = new LiveObserver(this.element, (mutationRecords) => {\n      const mutationRoots = this.getMutationRoots(mutationRecords);\n\n      this.processMutatedLiveComputeds(mutationRoots);\n      this.processMutatedLiveAttributes(mutationRoots);\n    });\n\n    this.collectLiveStates();\n    this.processLiveStates();\n\n    this.collectLiveComputeds();\n    this.processLiveComputeds();\n\n    this.collectLiveAttributes();\n    this.processLiveAttributes();\n\n    this.observer.connect();\n    this.element.addEventListener('turbo:morph-element', this.handleTurboMorphElement);\n  }\n\n  update(event) {\n    if (event.params.update) this.evaluator.evaluateExpression(event.params.update, { event });\n    this.processLiveComputeds();\n    this.processLiveAttributes();\n  }\n\n  disconnect() {\n    this.observer.disconnect();\n    this.element.removeEventListener('turbo:morph-element', this.handleTurboMorphElement);\n  }\n\n  handleTurboMorphElement = () => {\n    if (this.morphReprocessScheduled) return;\n\n    this.morphReprocessScheduled = true;\n\n    queueMicrotask(() => {\n      this.morphReprocessScheduled = false;\n      this.collectLiveComputeds();\n      this.processLiveComputeds();\n\n      this.collectLiveAttributes();\n      this.processLiveAttributes();\n    });\n  };\n\n  get liveAttributeAttributeNames() {\n    return ['live:text', 'live:html', 'live:class', 'live:style', 'live:show', 'live:disabled', 'live:attributes', 'live:value'];\n  }\n\n  collectLiveStates() {\n    this.liveStates = this.queryElementsByAttribute('data-live-state').map((element) => new LiveState(element));\n  }\n\n  collectLiveComputeds() {\n    this.liveComputed = this.queryElementsByAttribute('data-live-computed').map((element) => new LiveComputed(element));\n  }\n\n  collectLiveAttributes() {\n    this.liveAttributes = this.liveAttributeAttributeNames.flatMap((attributeName) => {\n      return this.queryElementsByAttributeIncludingTemplates(attributeName).map((element) => {\n        const attributeNode = element.getAttributeNode(attributeName);\n        return new LiveAttribute(attributeNode);\n      });\n    });\n  }\n\n  collectLiveComputedsForRoots(roots) {\n    return roots\n      .flatMap((root) => this.queryElementsByAttributeInRoots('data-live-computed', [root]))\n      .map((element) => new LiveComputed(element));\n  }\n\n  collectLiveAttributesForRoots(roots) {\n    return this.liveAttributeAttributeNames.flatMap((attributeName) => {\n      return this.queryElementsByAttributeInRoots(attributeName, roots).map((element) => {\n        const attributeNode = element.getAttributeNode(attributeName);\n        return new LiveAttribute(attributeNode);\n      });\n    });\n  }\n\n  processLiveStates() {\n    this.liveStates.forEach(this.processLiveState.bind(this));\n  }\n\n  processLiveState(liveState) {\n    const functionName = liveState.processFunctionName;\n\n    if (typeof this[functionName] !== 'function') {\n      console.warn(`${liveState} is not supported yet, please implement ${functionName}`);\n      return;\n    }\n\n    this[functionName](liveState);\n  }\n\n  processLiveInputState({ element, name }) {\n    this.defineLiveState(name, { get: () => this.getInputValue(element), set: (value) => (element.value = value) });\n  }\n\n  processLiveTextareaState({ element, name }) {\n    this.defineLiveState(name, { get: () => element.value, set: (value) => (element.value = value) });\n  }\n\n  processLiveSelectState({ element, name }) {\n    this.defineLiveState(name, { get: () => this.getValue(element), set: (value) => (element.value = value) });\n  }\n\n  processLiveComputeds() {\n    this.liveComputed.forEach(this.processLiveComputed.bind(this));\n  }\n\n  processMutatedLiveComputeds(roots) {\n    this.collectLiveComputedsForRoots(roots).forEach(this.processLiveComputed.bind(this));\n  }\n\n  processLiveComputed(liveComputed) {\n    const functionName = liveComputed.processFunctionName;\n\n    if (typeof this[functionName] !== 'function') {\n      console.warn(`${liveComputed} is not supported yet, please implement ${functionName}`);\n      return;\n    }\n\n    this[functionName](liveComputed);\n  }\n\n  processLiveScriptComputed({ element, name }) {\n    const expression = element.textContent.trim();\n    const isHtmlExpression = expression.startsWith('<');\n    const finalExpression = isHtmlExpression ? `html\\`${expression}\\`` : expression;\n\n    this.defineLiveComputed(name, { get: () => this.evaluator.evaluateExpression(finalExpression) });\n  }\n\n  processLiveAttributes() {\n    this.liveAttributes.forEach(this.processLiveAttribute.bind(this));\n  }\n\n  processMutatedLiveAttributes(roots) {\n    this.collectLiveAttributesForRoots(roots).forEach(this.processLiveAttribute.bind(this));\n  }\n\n  processLiveAttribute(liveAttribute) {\n    const functionName = liveAttribute.processFunctionName;\n\n    if (typeof this[functionName] !== 'function') {\n      console.warn(`${liveAttribute} is not supported yet, please implement ${functionName}`);\n      return;\n    }\n\n    this[functionName](liveAttribute, this.evaluator.evaluateParsedExpression(liveAttribute.parsedExpression));\n  }\n\n  processLiveTextAttribute({ element }, result) {\n    this.observer.paused(() => (element.textContent = result));\n  }\n\n  processLiveHtmlAttribute({ element }, result) {\n    this.observer.paused(() => (element.innerHTML = DOMPurify.sanitize(result)));\n  }\n\n  processLiveClassAttribute({ element }, result) {\n    Object.keys(result).forEach((classNames) => this.toggleClasses(element, classNames, result[classNames]));\n  }\n\n  processLiveStyleAttribute({ element }, result) {\n    Object.keys(result).forEach((property) => {\n      this.observer.paused(() => element.style.setProperty(property, result[property]));\n    });\n  }\n\n  processLiveShowAttribute({ element }, result) {\n    this.observer.paused(() => (element.style.display = result ? '' : 'none'));\n  }\n\n  processLiveDisabledAttribute({ element }, result) {\n    this.observer.paused(() => (element.disabled = result));\n  }\n\n  processLiveAttributesAttribute({ element }, result) {\n    Object.keys(result).forEach((attrName) => {\n      const value = result[attrName];\n      this.observer.paused(() => {\n        if (value === null || value === undefined || value === false) {\n          element.removeAttribute(attrName);\n        } else if (value === true) {\n          element.setAttribute(attrName, '');\n        } else {\n          element.setAttribute(attrName, value);\n        }\n      });\n    });\n  }\n\n  processLiveValueAttribute({ element }, result) {\n    if (!('value' in element)) {\n      throw new Error(`live:value is not supported on <${element.tagName.toLowerCase()}> elements`);\n    }\n\n    this.observer.paused(() => {\n      element.value = result;\n    });\n  }\n\n  getMutationRoots(mutationRecords) {\n    const roots = new Set();\n\n    for (const { target, addedNodes, removedNodes } of mutationRecords) {\n      roots.add(target instanceof Element ? target : target.parentElement);\n\n      addedNodes.forEach((node) => node instanceof Element && roots.add(node));\n      removedNodes.forEach((node) => node instanceof Element && roots.add(node));\n    }\n\n    const uniqueRoots = Array.from(roots).filter((root) => {\n      if (!root) return false;\n      return !Array.from(roots).some((other) => other !== root && other.contains(root));\n    });\n\n    return uniqueRoots;\n  }\n\n  queryElementsByAttribute(attributeName) {\n    return Array.from(this.element.querySelectorAll(`[${attributeName.replace(':', '\\\\:')}]`));\n  }\n\n  queryElementsByAttributeInRoots(attributeName, roots) {\n    const elements = new Set();\n\n    roots.forEach((root) => {\n      this.queryElementsByAttributeIncludingTemplates(attributeName, root).forEach((element) => elements.add(element));\n    });\n\n    return Array.from(elements);\n  }\n\n  queryElementsByAttributeIncludingTemplates(attributeName, root = this.element) {\n    if (!this.isQueryableRoot(root)) return [];\n\n    const selector = `[${attributeName.replace(/:/g, '\\\\:')}]`;\n    const results = [];\n\n    if (root instanceof Element && root.matches(selector)) {\n      results.push(root);\n    }\n\n    results.push(...root.querySelectorAll(selector));\n\n    const templates = root.querySelectorAll('template');\n\n    for (const template of templates) {\n      results.push(...this.queryElementsByAttributeIncludingTemplates(attributeName, template.content));\n    }\n\n    return results;\n  }\n\n  isQueryableRoot(root) {\n    return root instanceof Element || root instanceof DocumentFragment;\n  }\n\n  defineLiveState(name, descriptor) {\n    Object.defineProperty(this.state, name, { configurable: true, enumerable: true, ...descriptor });\n  }\n\n  defineLiveComputed(name, descriptor) {\n    Object.defineProperty(this.computed, name, { configurable: true, enumerable: true, ...descriptor });\n  }\n\n  toggleClasses(element, classNames, isToggled) {\n    classNames.split(/\\s+/).forEach((className) => this.observer.paused(() => element.classList.toggle(className.trim(), isToggled)));\n  }\n\n  getInputValue(element) {\n    if (element.type === 'checkbox') {\n      return element.checked;\n    } else if (element.type === 'radio') {\n      return document.querySelector(`input[name=\"${element.name}\"]:checked`)?.value;\n    } else if (element.type === 'number' || element.type === 'range') {\n      return Number(element.value);\n    } else if (element.type === 'date' || element.type === 'datetime-local' || element.type === 'time') {\n      return element.valueAsDate || element.value;\n    }\n\n    return this.getValue(element);\n  }\n\n  getValue(element) {\n    try {\n      return JSON.parse(element.value);\n    } catch (_error) {\n      return element.value;\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport { addScrollableTarget, disablePageScroll, enablePageScroll, removeScrollableTarget } from 'scroll-lock';\n\nconst ESCAPE_KEY = 27;\n\nexport default class extends Controller {\n  static targets = ['overlay', 'content', 'interaction'];\n\n  connect() {\n    this.element.addEventListener('mousedown', this.handleMouseDown);\n    this.element.addEventListener('mouseup', this.handleMouseUp);\n    this.contentTarget.addEventListener('dialog.close', this.handleDialogClose);\n    this.element.addEventListener('modal.remove', this.handleModalRemove);\n    // Use keyup because keydown will conflict with Safari confirms\n    // Directly closing the confirm after opening it on ESC key\n    document.addEventListener('keyup', this.handleKeyPress);\n    this.overlayTarget.style.animationName = this.data.get('animation');\n    this.contentTarget.style.animationName = this.data.get('animation');\n\n    addScrollableTarget(this.element);\n    disablePageScroll();\n  }\n\n  disconnect() {\n    this.element.removeEventListener('mousedown', this.handleMouseDown);\n    this.element.removeEventListener('mouseup', this.handleMouseUp);\n    this.contentTarget.removeEventListener('dialog.close', this.handleDialogClose);\n    this.element.removeEventListener('modal.remove', this.handleModalRemove);\n    document.removeEventListener('keyup', this.handleKeyPress);\n\n    removeScrollableTarget(this.element);\n    enablePageScroll();\n  }\n\n  handleMouseDown = (e) => {\n    this.mouseDownTarget = e.target;\n  };\n\n  handleMouseUp = (e) => {\n    // Only close modal if mouse down event originates from inside the modal\n    // but outside any interactive elements (like a modal dialog or slideshow\n    // thumbnail). This prevents mouse down in the dialog element and then\n    // releasing the mouse button on the overlay from closing the modal.\n    const insideElement = this.element.contains(this.mouseDownTarget);\n    const insideInteraction = this.interactionTargets.some((element) => element.contains(this.mouseDownTarget));\n\n    if (e.button === 0 && insideElement && !insideInteraction) {\n      this.closeModal();\n    }\n  };\n\n  handleDialogClose = (e) => {\n    this.closeModal();\n    e.stopPropagation();\n  };\n\n  handleModalRemove = () => {\n    removeModal(this);\n    removeModalIdFromUrlIfNeeded();\n  };\n\n  closeModal = () => {\n    if (!this.data.has('confirmDiscardChanges') || !this.hasUnsavedChanges || $.rails.confirm(this.data.get('confirmDiscardChanges'))) {\n      removeModal(this);\n      removeModalIdFromUrlIfNeeded();\n    }\n  };\n\n  handleKeyPress = (e) => {\n    if (e.keyCode === ESCAPE_KEY) {\n      this.closeModal();\n      e.stopPropagation();\n    }\n  };\n\n  get hasUnsavedChanges() {\n    return this.application.getControllerForElementAndIdentifier(this.contentTarget, 'modal-dialog')?.hasUnsavedChanges;\n  }\n}\n\nfunction removeModalIdFromUrlIfNeeded() {\n  // Don't update URL if modal is opened from a srcdoc iframe.\n  if (window.location.href === 'about:srcdoc') return;\n\n  const url = new URL(window.location.href);\n  if (url.searchParams.has('modal_id')) {\n    url.searchParams.delete('modal_id');\n    history.replaceState({}, '', url);\n  }\n}\n\nexport function removeModal(modal) {\n  modal.overlayTarget.addEventListener('animationend', () => {\n    modal.element.remove();\n    removeModalIdFromUrlIfNeeded();\n  });\n\n  reverseAnimation(modal.overlayTarget, modal.data.get('animation'));\n  reverseAnimation(modal.contentTarget, modal.contentTarget.dataset.modalDialogAnimation);\n}\n\nfunction reverseAnimation(element, animationName) {\n  element.style.animationFillMode = 'forwards';\n  element.style.animationDirection = 'reverse';\n  element.style.animationName = 'none';\n  // See https://stackoverflow.com/a/60686560\n  void element.offsetWidth;\n  element.style.animationName = animationName;\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['close', 'form'];\n\n  connect() {\n    this.closeTargets.forEach((target) => target.addEventListener('click', this.handleCloseClick));\n    $(this.formTargets).on('ajax:complete', this.handleFormAjaxSuccess);\n    this.element.addEventListener('turbo:submit-end', this.handleTurboSubmitEnd);\n    this.element.style.animationName = this.data.get('animation');\n  }\n\n  disconnect() {\n    this.closeTargets.forEach((target) => target.removeEventListener('click', this.handleCloseClick));\n    $(this.formTargets).off('ajax:complete', this.handleFormAjaxSuccess);\n    this.element.removeEventListener('turbo:submit-end', this.handleTurboSubmitEnd);\n  }\n\n  close() {\n    this.element.dispatchEvent(new CustomEvent('dialog.close'));\n  }\n\n  handleCloseClick = (event) => {\n    event.stopPropagation();\n    this.close();\n  };\n\n  handleFormAjaxSuccess = (e, xhr) => {\n    if (xhr.status === 201) {\n      // Keep form elements disabled while redirecting\n      setTimeout($.rails.disableFormElements, 1, $(this.formTargets));\n    }\n\n    if (xhr.status === 202) {\n      this.close();\n    }\n  };\n\n  handleTurboSubmitEnd = () => {\n    $.rails.enableFormElements($(this.element));\n  };\n\n  get hasUnsavedChanges() {\n    if (!this.hasFormTarget) {\n      return false;\n    }\n\n    return this.application.getControllerForElementAndIdentifier(this.formTarget, 'changeset')?.hasUnsavedChanges;\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport EmblaCarousel from 'embla-carousel';\n\nexport default class extends Controller {\n  static targets = ['slides', 'thumbnails', 'previousButton', 'nextButton'];\n  static classes = ['selectedThumbnail'];\n  static values = { index: Number, default: 0 };\n\n  connect() {\n    this.slidesCarousel = EmblaCarousel(this.slidesTarget, {});\n    this.slidesCarousel.on('select', this.update);\n\n    this.thumbnailsCarousel = EmblaCarousel(this.thumbnailsTarget, { containScroll: false });\n    this.thumbnailsCarousel.on('init', this.update);\n\n    this.slidesCarousel.scrollTo(this.indexValue, true);\n    this.thumbnailsCarousel.scrollTo(this.indexValue, true);\n\n    this.previousButtonTarget.addEventListener('mousedown', this.stopPropagation);\n    this.previousButtonTarget.addEventListener('touchstart', this.stopPropagation);\n    this.nextButtonTarget.addEventListener('mousedown', this.stopPropagation);\n    this.nextButtonTarget.addEventListener('touchstart', this.stopPropagation);\n    document.addEventListener('keydown', this.handleKeydown);\n  }\n\n  disconnect() {\n    this.slidesCarousel.destroy();\n    this.thumbnailsCarousel.destroy();\n\n    this.previousButtonTarget.removeEventListener('mousedown', this.stopPropagation);\n    this.previousButtonTarget.removeEventListener('touchstart', this.stopPropagation);\n    this.nextButtonTarget.removeEventListener('mousedown', this.stopPropagation);\n    this.nextButtonTarget.removeEventListener('touchstart', this.stopPropagation);\n    document.removeEventListener('keydown', this.handleKeydown);\n  }\n\n  indexValueChanged() {\n    this.slidesCarousel?.scrollTo(this.indexValue);\n  }\n\n  update = () => {\n    this.thumbnailsCarousel.scrollTo(this.slidesCarousel.selectedScrollSnap());\n\n    const previous = this.slidesCarousel.previousScrollSnap();\n    const selected = this.slidesCarousel.selectedScrollSnap();\n\n    const thumbnails = this.thumbnailsCarousel.slideNodes();\n\n    thumbnails[previous].classList.remove(this.selectedThumbnailClass);\n    thumbnails[selected].classList.add(this.selectedThumbnailClass);\n\n    thumbnails[previous].ariaSelected = 'false';\n    thumbnails[selected].ariaSelected = 'true';\n\n    this.previousButtonTarget.disabled = !this.slidesCarousel.canScrollPrev();\n    this.nextButtonTarget.disabled = !this.slidesCarousel.canScrollNext();\n  };\n\n  previous() {\n    this.slidesCarousel.scrollPrev();\n  }\n\n  next() {\n    this.slidesCarousel.scrollNext();\n  }\n\n  go(event) {\n    const index = event.params.index;\n    this.slidesCarousel.scrollTo(index);\n  }\n\n  stopPropagation = (event) => {\n    event.stopPropagation();\n  };\n\n  handleKeydown = (event) => {\n    const handlers = { ArrowLeft: this.previous.bind(this), ArrowRight: this.next.bind(this) };\n\n    if (handlers[event.key]) {\n      event.preventDefault();\n      handlers[event.key]();\n    }\n  };\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['button', 'template'];\n  static values = {\n    open: { type: Boolean, default: false },\n    serializeForm: { type: Boolean, default: true },\n  };\n\n  get isRemote() {\n    return this.data.has('url');\n  }\n\n  get portal() {\n    return document.getElementById('portal');\n  }\n\n  connect() {\n    if (this.openValue) {\n      this.openModal();\n    }\n\n    this.buttonTargets.forEach((b) => b.addEventListener('click', this.handleButtonClick));\n  }\n\n  disconnect() {\n    this.buttonTargets.forEach((b) => b.removeEventListener('click', this.handleButtonClick));\n  }\n\n  handleButtonClick = () => {\n    this.openModal();\n  };\n\n  openModal() {\n    this[this.isRemote ? 'openRemoteModal' : 'openInlineModal']();\n  }\n\n  openInlineModal() {\n    const modal = this.templateTarget.content.cloneNode(true);\n    this.addModal(modal);\n    this.updateUrl();\n  }\n\n  formData() {\n    if (!this.serializeFormValue || !this.buttonTarget?.form) {\n      return new FormData();\n    }\n\n    const formData = new FormData(this.buttonTarget.form);\n    formData.append(this.buttonTarget.name, this.buttonTarget.value);\n\n    return formData;\n  }\n\n  openRemoteModal() {\n    // The inert attribute completely disables interaction with the link element.\n    $(this.element).prop('inert', true);\n    $.rails.disableFormElement($(this.buttonTarget));\n\n    const handleAlways = () => {\n      $(this.element).prop('inert', false);\n\n      $.rails.enableFormElement($(this.buttonTarget));\n    };\n\n    const method = this.data.get('method')?.toUpperCase() || 'PUT';\n    let url = new URL(this.data.get('url'), document.location);\n    let body = this.formData();\n\n    // Remove the inherited \"_method\" field to prevent it from overwriting the request method with the method of a potential parent form\n    body.delete('_method');\n\n    if (method == 'GET') {\n      for (var pair of body.entries()) {\n        url.searchParams.append(pair[0], pair[1]);\n      }\n\n      body = null;\n    }\n\n    fetch(url, {\n      body: body,\n      credentials: 'same-origin',\n      headers: {\n        Accept: 'text/html',\n        'X-Requested-With': 'XMLHttpRequest',\n        'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute('content'),\n      },\n      method: method,\n    })\n      .then((response) => response.text())\n      .then((response) => {\n        // Remove filename annotations added in development mode.\n        response = response.replace(/\\x3C!-- BEGIN .+ -->\\n/g, '');\n        response = response.replace(/\\x3C!-- END .+ -->\\n/g, '');\n        this.addModal(response);\n        this.updateUrl();\n      })\n      .then(handleAlways, handleAlways);\n  }\n\n  addModal(modal) {\n    $(modal).appendTo(this.portal);\n    const $portalModal = $(this.portal).children().last();\n\n    // Takes away focus from the page and then tries to autofocus the first\n    // element with the autofocus attribute within the modal.\n    document.activeElement?.blur();\n    $portalModal.find('[autofocus]').trigger('focus');\n  }\n\n  updateUrl() {\n    const id = this.element.id;\n\n    if (!id) return;\n\n    const url = new URL(window.location.href);\n    url.searchParams.set('modal_id', id);\n    history.replaceState({}, '', url);\n  }\n}\n", "const ESCAPE_KEY_CODE = 27;\n\nexport const hideOnEsc = {\n  name: 'hideOnEsc',\n  defaultValue: true,\n  fn({ hide }) {\n    function onKeyDown(event) {\n      if (event.keyCode === ESCAPE_KEY_CODE) hide();\n    }\n\n    return {\n      onShow() {\n        document.addEventListener('keydown', onKeyDown);\n      },\n      onHide() {\n        document.removeEventListener('keydown', onKeyDown);\n      },\n    };\n  },\n};\n", "import { Controller } from '@hotwired/stimulus';\nimport tippy from 'tippy.js';\nimport { hideOnEsc } from '../modules/tippy';\n\nconst DEFAULT_POPPER_OPTIONS = {\n  allowHTML: true,\n  maxWidth: 'none',\n  duration: 0,\n  offset: [0, 8],\n  zIndex: 0,\n  plugins: [hideOnEsc],\n};\n\nexport default class extends Controller {\n  static targets = ['pane', 'trigger'];\n\n  static values = {\n    placement: { type: String, default: 'bottom-start' },\n    theme: { type: String, default: 'popover' },\n    arrow: { type: Boolean, default: false },\n    showOnCreate: { type: Boolean },\n  };\n\n  connect() {\n    this.tippyInstance = tippy(this.triggerTarget, {\n      ...DEFAULT_POPPER_OPTIONS,\n      trigger: this.isInputTrigger ? 'focusin' : 'click',\n      interactive: !this.isInputTrigger,\n      hideOnClick: true,\n      role: this.isInputTrigger ? 'note' : undefined,\n      content: () => this.paneTarget.content.cloneNode(true),\n      appendTo: this.portal,\n      onShown: this.handleShown,\n      onShow: this.handleShow,\n      onHide: this.handleHide,\n      placement: this.placementValue,\n      theme: this.themeValue,\n      arrow: this.arrowValue,\n      popperOptions: this.popperOptions,\n      showOnCreate: this.showOnCreateValue,\n    });\n  }\n\n  get isInputTrigger() {\n    return ['INPUT', 'TEXTAREA'].includes(this.triggerTarget.tagName);\n  }\n\n  showOnCreateValueChanged() {\n    if (this.showOnCreateValue) {\n      this.tippyInstance?.show();\n    } else {\n      this.tippyInstance?.hide();\n    }\n  }\n\n  paneTargetConnected() {\n    this.paneObserver = new MutationObserver(() => this.tippyInstance.setProps({ content: this.paneTarget.content.cloneNode(true) }));\n    this.paneObserver.observe(this.paneTarget.content, { childList: true, subtree: true, attributes: true, characterData: true });\n  }\n\n  paneTargetDisconnected() {\n    if (!this.paneObserver) return;\n    this.paneObserver.disconnect();\n    this.paneObserver = null;\n  }\n\n  disconnect() {\n    this.tippyInstance.destroy();\n    this.tippyInstance = null;\n  }\n\n  handleShown = ({ popper }) => {\n    if (this.isInputTrigger) return;\n\n    $(popper).find('[autofocus], [data-autofocus]').trigger('focus');\n  };\n\n  handleShow = () => {\n    $(this.triggerTarget).addClass(this.activeClass);\n    this.triggerTarget.toggleAttribute('data-active', true);\n  };\n\n  handleHide = ({ reference }) => {\n    if (this.isInputTrigger && document.activeElement === reference) return false;\n\n    $(this.triggerTarget).removeClass(this.activeClass);\n    this.triggerTarget.toggleAttribute('data-active', false);\n  };\n\n  getOppositeVariationPlacement = (placement) => {\n    const oppositeVariationPlacement = {\n      top: 'bottom',\n      bottom: 'top',\n      left: 'right',\n      right: 'left',\n    };\n\n    return placement.replace(/top|bottom|right|left/g, (matched) => oppositeVariationPlacement[matched]);\n  };\n\n  getFallbackPlacements = () => {\n    return [this.getOppositeVariationPlacement(this.placementValue), 'auto'];\n  };\n\n  get popperOptions() {\n    return { modifiers: [{ name: 'flip', options: { fallbackPlacements: this.getFallbackPlacements() } }] };\n  }\n\n  get activeClass() {\n    return $(this.triggerTarget).data('activeClass') || 'active';\n  }\n\n  get portal() {\n    return document.getElementById('portal');\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport debounce from 'lodash.debounce';\n\nexport default class extends Controller {\n  static targets = ['minInput', 'maxInput', 'minThumb', 'maxThumb', 'range', 'track'];\n  static classes = ['activeThumb'];\n  static values = { min: Number, max: Number };\n\n  connect() {\n    this.element.addEventListener('turbo:morph-element', this.handleMorphElement);\n    this.initializeValues();\n    this.resizeObserver = new ResizeObserver(this.handleResize);\n    this.resizeObserver.observe(this.trackTarget);\n  }\n\n  disconnect() {\n    this.element.removeEventListener('turbo:morph-element', this.handleMorphElement);\n    this.resizeObserver.disconnect();\n    this.resizeObserver = null;\n  }\n\n  handleMorphElement = () => {\n    this.initializeValues();\n  };\n\n  handleResize = () => {\n    const min = this.effectiveMinValue();\n    const max = this.effectiveMaxValue();\n    this.updateSlider(min, max);\n  };\n\n  initializeValues() {\n    const { min, max } = this.normalizeValues(this.effectiveMinValue(), this.effectiveMaxValue());\n    this.updateSlider(min, max);\n  }\n\n  debouncedHandleNumberInput = debounce((event) => this.handleNumberInput(event), 100);\n  debouncedHandleNumberChange = debounce((event) => this.handleNumberChange(event), 250);\n\n  calculateValueFromX = (clientX) => {\n    const trackRect = this.trackTarget.getBoundingClientRect();\n    const thumbWidth = this.maxThumbTarget.offsetWidth;\n    const adjustedTrackWidth = trackRect.width - thumbWidth;\n\n    let x = clientX - trackRect.left - thumbWidth / 2;\n    x = Math.max(0, Math.min(x, adjustedTrackWidth));\n\n    const percent = x / adjustedTrackWidth;\n    return Math.round(this.minValue + (this.maxValue - this.minValue) * percent);\n  };\n\n  calculateThumbOffset(event, isThumb) {\n    let offsetX = 0;\n\n    if (isThumb) {\n      const thumbRect = event.target.getBoundingClientRect();\n      const pointerX = event.clientX;\n      offsetX = Math.round(pointerX - (thumbRect.left + thumbRect.width / 2));\n    }\n\n    return offsetX;\n  }\n\n  minInputValue() {\n    return parseInt(this.minInputTarget.value, 10);\n  }\n\n  maxInputValue() {\n    return parseInt(this.maxInputTarget.value, 10);\n  }\n\n  effectiveMinValue() {\n    return this.minInputTarget.value === '' ? this.minValue : this.minInputValue();\n  }\n\n  effectiveMaxValue() {\n    return this.maxInputTarget.value === '' ? this.maxValue : this.maxInputValue();\n  }\n\n  initiateDrag(event) {\n    const isMinThumb = event.target === this.minThumbTarget;\n    const isMaxThumb = event.target === this.maxThumbTarget;\n    const isThumb = isMinThumb || isMaxThumb;\n\n    const offsetX = this.calculateThumbOffset(event, isThumb);\n\n    let min = this.effectiveMinValue();\n    let max = this.effectiveMaxValue();\n\n    const moveX = event.clientX;\n    let clickValue = this.calculateValueFromX(moveX);\n\n    let isMinThumbActive = isMinThumb;\n\n    if (event.target === this.trackTarget) {\n      const minDistance = Math.abs(clickValue - min);\n      const maxDistance = Math.abs(clickValue - max);\n\n      isMinThumbActive = minDistance < maxDistance;\n\n      if (isMinThumbActive) min = clickValue;\n      else max = clickValue;\n    }\n\n    ({ min, max } = this.enforceConstraints(min, max, isMinThumbActive));\n    this.updateUI(min, max);\n\n    const activeThumb = isMinThumbActive ? this.minThumbTarget : this.maxThumbTarget;\n\n    activeThumb.classList.add(this.activeThumbClass);\n\n    this.dragContext = {\n      offsetX,\n      isMinThumbActive,\n      min,\n      max,\n    };\n\n    const onPointerUp = () => {\n      this.minThumbTarget.classList.remove(this.activeThumbClass);\n      this.maxThumbTarget.classList.remove(this.activeThumbClass);\n\n      document.removeEventListener('pointermove', this.onPointerMove);\n      document.removeEventListener('pointerup', onPointerUp);\n\n      this.notifyChanged(min, max);\n    };\n\n    document.addEventListener('pointermove', this.onPointerMove);\n    document.addEventListener('pointerup', onPointerUp);\n  }\n\n  onPointerMove = (moveEvent) => {\n    moveEvent.preventDefault();\n    let { offsetX, isMinThumbActive, min, max } = this.dragContext;\n\n    const moveX = moveEvent.clientX;\n    const moveValue = this.calculateValueFromX(moveX - offsetX);\n\n    if (isMinThumbActive && moveValue >= max) {\n      min = max;\n      max = moveValue;\n      isMinThumbActive = false;\n    } else if (!isMinThumbActive && moveValue <= min) {\n      max = min;\n      min = moveValue;\n      isMinThumbActive = true;\n    } else {\n      if (isMinThumbActive) min = moveValue;\n      else max = moveValue;\n    }\n\n    this.dragContext.min = min;\n    this.dragContext.max = max;\n    this.dragContext.isMinThumbActive = isMinThumbActive;\n\n    ({ min, max } = this.enforceConstraints(min, max, isMinThumbActive));\n    this.updateUI(min, max);\n\n    this.minThumbTarget.classList.toggle(this.activeThumbClass, isMinThumbActive);\n    this.maxThumbTarget.classList.toggle(this.activeThumbClass, !isMinThumbActive);\n  };\n\n  handleInputValueChange(event, { skipNotify = false, skipUpdateInputs = false } = {}) {\n    const isMinInput = event.target === this.minInputTarget;\n\n    let min = this.effectiveMinValue();\n    let max = this.effectiveMaxValue();\n\n    ({ min, max } = this.normalizeValues(min, max));\n    ({ min, max } = this.enforceConstraints(min, max, isMinInput));\n\n    if (!skipUpdateInputs && event.target.value !== '') this.updateUI(min, max);\n    this.updateSlider(min, max);\n\n    if (!skipNotify) this.notifyChanged(min, max);\n  }\n\n  handleNumberInput = (event) => {\n    this.handleInputValueChange(event, { skipNotify: true, skipUpdateInputs: true });\n  };\n\n  handleNumberChange = (event) => {\n    this.handleInputValueChange(event);\n  };\n\n  normalizeValues(min, max) {\n    if (isNaN(min)) {\n      min = this.minValue;\n    }\n\n    if (isNaN(max)) {\n      max = this.maxValue;\n    }\n\n    return { min, max };\n  }\n\n  enforceConstraints(min, max, isMinHandleMoving) {\n    min = Math.max(this.minValue, min);\n    max = Math.min(this.maxValue, max);\n\n    if (isMinHandleMoving && min >= max) {\n      min = max;\n    }\n\n    if (!isMinHandleMoving && max <= min) {\n      max = min;\n    }\n\n    return { min, max };\n  }\n\n  updateUI(min, max) {\n    this.minInputTarget.value = min;\n    this.maxInputTarget.value = max;\n    this.updateSlider(min, max);\n  }\n\n  updateSlider(min, max) {\n    this.updateThumbPositions(min, max);\n    this.updateTrackPosition(min, max);\n    this.minThumbTarget.setAttribute('aria-valuenow', min);\n    this.maxThumbTarget.setAttribute('aria-valuenow', max);\n  }\n\n  updateThumbPositions(min, max) {\n    const range = this.maxValue - this.minValue;\n    const thumbWidth = this.maxThumbTarget.offsetWidth;\n    const trackWidth = this.trackTarget.offsetWidth;\n\n    const thumbWidthPercent = (thumbWidth / trackWidth) * 100;\n\n    // Reducing the thumb size percentage from the track total percentage (100%),\n    // so both thumbs always stay 100% inside the track\n    const adjustedTrackPercent = 100 - thumbWidthPercent;\n\n    const leftPercent = ((min - this.minValue) / range) * adjustedTrackPercent;\n    const maxPercent = ((max - this.minValue) / range) * adjustedTrackPercent;\n\n    this.minThumbTarget.style.left = `${leftPercent}%`;\n    this.maxThumbTarget.style.left = `${maxPercent}%`;\n  }\n\n  updateTrackPosition(min, max) {\n    const range = this.maxValue - this.minValue;\n    const leftPercent = ((min - this.minValue) / range) * 100;\n    const rightPercent = 100 - ((max - this.minValue) / range) * 100;\n\n    this.rangeTarget.style.left = leftPercent + '%';\n    this.rangeTarget.style.right = rightPercent + '%';\n  }\n\n  notifyChanged(min, max) {\n    this.dispatch('change', { bubbles: true, detail: { min, max } });\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport class SearchListController extends Controller {\n  static targets = ['query', 'item', 'empty', 'count'];\n\n  connect() {\n    this.matchingItems = [];\n    this.queryTarget.addEventListener('search', this.handleSearch);\n    this.queryTarget.addEventListener('keydown', this.handleQueryKeydown);\n    this.queryTarget.addEventListener('focus', this.handleQueryFocus);\n    this.queryTarget.addEventListener('blur', this.handleQueryBlur);\n  }\n\n  disconnect() {\n    this.queryTarget.removeEventListener('search', this.handleSearch);\n    this.queryTarget.removeEventListener('keydown', this.handleQueryKeydown);\n    this.queryTarget.removeEventListener('focus', this.handleQueryFocus);\n    this.queryTarget.removeEventListener('blur', this.handleQueryBlur);\n  }\n\n  handleQueryFocus = () => {\n    const [firstInteractiveItem] = this.interactiveItems();\n    if (firstInteractiveItem) this.setHighlightedItem(firstInteractiveItem);\n  };\n\n  handleQueryBlur = () => {\n    this.setHighlightedItem(null);\n  };\n\n  handleQueryKeydown = (event) => {\n    const interactiveItems = this.interactiveItems();\n    if (!interactiveItems.length) return;\n\n    const handlers = { ArrowDown: () => this.moveHighlightedItem(1), ArrowUp: () => this.moveHighlightedItem(-1) };\n\n    if (handlers[event.key]) {\n      event.preventDefault();\n      handlers[event.key]();\n      this.highlightedItem?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n    } else if (event.key === 'Enter') {\n      event.preventDefault();\n      this.highlightedItem.click();\n      this.highlightedItem.focus();\n    }\n  };\n\n  itemTargetDisconnected(target) {\n    this.matchingItems = this.matchingItems.filter((item) => item !== target);\n    if (target === this.highlightedItem) this.setHighlightedItem(null);\n  }\n\n  setMatchingItems(items) {\n    this.matchingItems = items;\n    if (!items.includes(this.highlightedItem)) this.setHighlightedItem(null);\n\n    if (this.queryTarget.matches(':focus') && !this.highlightedItem) {\n      this.setHighlightedItem(this.interactiveItems()[0]);\n    } else if (!this.queryTarget.matches(':focus')) {\n      this.setHighlightedItem(null);\n    }\n\n    $(this.hasEmptyTarget && this.emptyTarget).toggle(items.length === 0);\n    if (this.hasCountTarget) this.countTarget.textContent = items.length;\n  }\n\n  moveHighlightedItem(offset) {\n    const interactiveItems = this.interactiveItems();\n    const currentIndex = interactiveItems.indexOf(this.highlightedItem);\n\n    const nextIndex = (currentIndex + offset + interactiveItems.length) % interactiveItems.length;\n    const nextItem = interactiveItems[nextIndex];\n\n    this.setHighlightedItem(nextItem);\n  }\n\n  interactiveItems() {\n    return this.matchingItems?.filter((item) => this.isInteractive(item)) || [];\n  }\n\n  setHighlightedItem(item) {\n    this.itemTargets.forEach((item) => item.toggleAttribute('data-highlighted', false));\n    this.highlightedItem = item;\n    this.highlightedItem?.toggleAttribute('data-highlighted', true);\n  }\n\n  isInteractive(item) {\n    return item?.matches('a[href], button') && !item.matches(':disabled');\n  }\n}\n\nexport default class LocalSearchListController extends SearchListController {\n  get hideClass() {\n    return this.data.has('hideClass') ? this.data.get('hideClass') : 'hidden';\n  }\n\n  get hideAttribute() {\n    return this.data.get('hideAttribute');\n  }\n\n  connect() {\n    super.connect();\n    this.tokenizeItems();\n    this.applyQuery();\n  }\n\n  handleSearch = () => {\n    this.applyQuery();\n  };\n\n  tokenizeItems() {\n    this.tokenizedItems = this.itemTargets.map((item) => this.#tokenizeItem(item));\n  }\n\n  #tokenizeItem(item) {\n    const token = normalizeText(extractTextContent(item));\n    return { element: item, token };\n  }\n\n  itemTargetConnected(target) {\n    this.tokenizedItems || (this.tokenizedItems = []);\n    this.tokenizedItems.push(this.#tokenizeItem(target));\n  }\n\n  itemTargetDisconnected(target) {\n    super.itemTargetDisconnected(target);\n    this.tokenizedItems = this.tokenizedItems.filter(({ element }) => element !== target);\n  }\n\n  applyQuery() {\n    const queryTokens = normalizeText(this.queryTarget.value).split(/\\s+/);\n\n    if (queryTokens.length === 0) return;\n\n    const matchingItems = [];\n    const nonMatchingItems = [];\n\n    this.tokenizedItems.forEach(({ element, token }) => {\n      if (queryTokens.every((queryToken) => token.includes(queryToken))) {\n        matchingItems.push(element);\n      } else {\n        nonMatchingItems.push(element);\n      }\n    });\n\n    this.setMatchingItems(matchingItems);\n\n    $(matchingItems).removeClass(this.hideClass);\n    $(nonMatchingItems).addClass(this.hideClass);\n    $(matchingItems).removeAttr(this.hideAttribute);\n    $(nonMatchingItems).attr(this.hideAttribute, true);\n  }\n}\n\nfunction normalizeText(text) {\n  return text\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .toLowerCase()\n    .trim();\n}\n\nfunction extractTextContent(node) {\n  if (node.nodeType === Node.TEXT_NODE) return node.nodeValue;\n  if (node.nodeType === Node.ELEMENT_NODE && node.hasAttribute('data-search-list-ignore')) return '';\n\n  let textContent = '';\n\n  node.childNodes.forEach((child) => (textContent += extractTextContent(child)));\n\n  return textContent;\n}\n", "import { Controller } from '@hotwired/stimulus';\n\n/**\n * Abstract controller to toggle behavior depending on the state of a checkbox or radio input.\n * See show_by_controller.js and enable_by_controller.js for usage examples.\n */\nexport default class extends Controller {\n  static outlets = ['suggest'];\n\n  get event() {\n    return this.data.get('event') || 'change';\n  }\n\n  initialize() {\n    this.value = this.data.get('value');\n    this.values = this.parseValues(this.data.get('values'));\n    this.regularExpression = this.data.get('regular-expression')\n      ? new RegExp(this.data.get('regular-expression'), this.data.get('regular-expression-flags') || undefined)\n      : null;\n  }\n\n  parseValues(valuesData) {\n    if (!valuesData) return [];\n    try {\n      const parsed = JSON.parse(valuesData);\n      if (Array.isArray(parsed)) return parsed;\n    } catch (e) {\n      // Not valid JSON, fall back to comma-separated split\n    }\n    return valuesData.split(',').map((v) => v.trim());\n  }\n\n  connect() {\n    this.$checkboxTarget = $(this.data.get('checkbox'));\n    this.$radioTarget = $(this.data.get('radio'));\n    this.$selectTarget = $(this.data.get('select'));\n    this.$inputTarget = $(this.data.get('input'));\n\n    this.$checkboxTarget.on(`${this.event} checkboxChange.selectAll`, this.handleCheckboxChange);\n    this.$radioTarget.on(this.event, this.handleRadioChange);\n    this.$selectTarget.on(this.event, this.handleSelectChange);\n    this.$inputTarget.on(this.event, this.handleInputChange);\n\n    // Call event handlers once per target to set the correct initial state\n    this.$checkboxTarget.length && this.handleCheckboxChange();\n    this.$radioTarget.length && this.handleRadioChange();\n    this.$selectTarget.length && this.handleSelectChange();\n    this.$inputTarget.length && this.handleInputChange();\n  }\n\n  disconnect() {\n    this.$checkboxTarget.off(`${this.event} checkboxChange.selectAll`, this.handleCheckboxChange);\n    this.$radioTarget.off(this.event, this.handleRadioChange);\n    this.$selectTarget.off(this.event, this.handleSelectChange);\n    this.$inputTarget.off(this.event, this.handleInputChange);\n  }\n\n  handleCheckboxChange = () => {\n    const any = this.data.has('any');\n    const isToggled = this.$checkboxTarget.toArray()[any ? 'some' : 'every']((elem) => elem.checked);\n\n    this.toggle(isToggled);\n  };\n\n  handleRadioChange = () => {\n    // Retrieve value of the radio button that is checked\n    this.toggle(this.matchesValue(this.$radioTarget.filter(':checked').val()));\n  };\n\n  handleSelectChange = () => {\n    this.toggle(this.matchesValue(this.$selectTarget.val().toString()));\n  };\n\n  handleInputChange = () => {\n    this.toggle(this.matchesValue(this.$inputTarget.val()));\n  };\n\n  handleDatepickerChange = () => {\n    this.toggle(this.matchesValue(this.datepickerTarget.value));\n  };\n\n  suggestOutletConnected(suggestController) {\n    this.handleSuggestValueChange(suggestController.defaultValue.map((v) => ({ value: v })));\n    suggestController.element.addEventListener('change', this.handleSuggestChange);\n  }\n\n  suggestOutletDisconnected(suggestController) {\n    suggestController.element.removeEventListener('change', this.handleSuggestChange);\n  }\n\n  handleSuggestChange = (event) => {\n    this.handleSuggestValueChange(event.detail.value);\n  };\n\n  handleSuggestValueChange(value) {\n    // Use `some` instead of `every` so that by default it works as expected for multi selects\n    // If no values are selected it will only toggle if data-<x>-by_empty is present\n    this.toggle(value.length ? value.some((choice) => this.matchesValue(choice.value)) : this.data.has('empty'));\n  }\n\n  matchesValue = (targetValue) => {\n    return this.value === targetValue || this.values.includes(targetValue) || !!this.regularExpression?.test(targetValue);\n  };\n\n  toggle = (isToggled) => {\n    // Placeholder implementation, can be overriden in subclass (see show_by_controller.js and enable_by_controller.js)\n  };\n}\n", "import ToggleByController from './toggle_by_controller';\n\n/**\n * Shows an element based on the state of a checkbox, radio, or select input.\n * @example\n * %input(value=\"value1\" type=\"radio\" name=\"my-radio-input\") Radio 1\n * %input(value=\"value2\" type=\"radio\" name=\"my-radio-input\") Radio 2\n * %input(value=\"value3\" type=\"radio\" name=\"my-radio-input\") Radio 3\n *\n * %div(data-controller=\"show-by\" data-show-by-radio=\"[name=my-radio-input]\" data-show-by-value=\"value1\") Shown when `Value 1` is checked\n * %div(data-controller=\"show-by\" data-show-by-radio=\"[name=my-radio-input]\" data-show-by-values=\"value1,value2\") Shown when `Value 1` or `Value 2` is checked\n *\n * @example\n * %input(type=\"checkbox\" name=\"my-checkbox-input\") Checkbox\n * %div(data-controller=\"show-by\" data-show-by-checkbox=\"[name=my-checkbox-input]\") Shown when checkbox is checked\n *\n * @example\n * %select(id=\"my_select\")\n *   %option(value=\"value1\") Value 1\n *   %option(value=\"value2\") Value 2\n *\n * %div(data-controller=\"show-by\" data-show-by-select=\"#my_select\" data-show-by-value=\"value1\") Shown when `Value 1` is selected\n */\nexport default class extends ToggleByController {\n  toggle = (isToggled) => {\n    $(this.element).toggle(isToggled);\n  };\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static values = {\n    min: Number,\n    max: Number,\n    step: Number,\n  };\n\n  static targets = ['numberInput', 'decreaseButton', 'increaseButton'];\n\n  connect() {\n    this.input = this.numberInputTarget;\n    this.initiateValue();\n    this.updateButtonState();\n\n    this.attachButtonEventListeners(this.decreaseButtonTarget);\n    this.attachButtonEventListeners(this.increaseButtonTarget);\n\n    this.input.addEventListener('change', this.handleChange);\n\n    this.dispatch('connect', { bubbles: true });\n  }\n\n  disconnect() {\n    this.removeButtonEventListeners(this.decreaseButtonTarget);\n    this.removeButtonEventListeners(this.increaseButtonTarget);\n\n    this.input.removeEventListener('change', this.handleChange);\n  }\n\n  maxValueChanged() {\n    if (this.input === undefined) return;\n\n    this.validateValue(this.input.value);\n  }\n\n  minValueChanged() {\n    if (this.input === undefined) return;\n\n    this.validateValue(this.input.value);\n  }\n\n  initiateValue() {\n    if (this.input.value.trim() === '') {\n      this.value = null;\n      return;\n    }\n\n    this.value = parseInt(this.input.value);\n\n    if (isNaN(this.value)) {\n      this.input.value = this.minValue;\n      this.value = this.minValue;\n    }\n  }\n\n  handleChange = (e) => {\n    if (e.target.value.trim() === '') {\n      this.value = null;\n      this.updateButtonState();\n      this.dispatchChange();\n      return;\n    }\n\n    this.validateValue(e.target.value);\n    this.dispatchChange();\n  };\n\n  attachButtonEventListeners(button) {\n    button.addEventListener('pointerup', this.cleanup);\n    button.addEventListener('pointerleave', this.cleanup);\n    button.addEventListener('pointercancel', this.cleanup);\n  }\n\n  removeButtonEventListeners(button) {\n    button.removeEventListener('pointerup', this.cleanup);\n    button.removeEventListener('pointerleave', this.cleanup);\n    button.removeEventListener('pointercancel', this.cleanup);\n  }\n\n  cleanup = (event) => {\n    const button = event.currentTarget;\n    if (this.timerId) {\n      this.clearTimer();\n      this.timerId = null;\n      this.dispatchChange();\n    }\n\n    button.blur();\n  };\n\n  clearTimer() {\n    clearTimeout(this.timerId);\n  }\n\n  validateValue = (value) => {\n    this.value = parseInt(value);\n\n    if (isNaN(this.value)) {\n      this.value = this.minValue;\n    }\n\n    if (this.hasMaxValue) {\n      this.value = Math.min(this.value, this.maxValue);\n    }\n\n    this.value = Math.max(this.value, this.minValue);\n\n    this.updateButtonState();\n    this.input.value = this.value;\n\n    if (this.isAtLimit(this.value)) {\n      this.clearTimer();\n    }\n  };\n\n  handleValueChange(event) {\n    if (event.currentTarget.disabled) return;\n    let interval = 500;\n    const minInterval = 50;\n    const multiplier = event.params.multiplier;\n\n    const updateValue = () => {\n      // Start from 0 if input is empty, otherwise use current value\n      const currentValue = this.value ?? 0;\n      this.value = currentValue + this.stepValue * multiplier;\n      this.validateValue(this.value);\n\n      if (this.isAtLimit(this.value)) {\n        this.clearTimer();\n        this.dispatchChange();\n        return;\n      }\n\n      interval = Math.max(interval / 1.5, minInterval);\n      this.timerId = setTimeout(updateValue, interval);\n    };\n\n    updateValue();\n  }\n\n  updateButtonState = () => {\n    const currentValue = this.value ?? 0;\n    this.decreaseButtonTarget.disabled = currentValue <= this.minValue;\n    this.increaseButtonTarget.disabled = this.hasMaxValue && currentValue >= this.maxValue;\n  };\n\n  isAtLimit(value) {\n    const isMax = this.hasMaxValue && value >= this.maxValue;\n    const isMin = value <= this.minValue;\n    return isMax || isMin;\n  }\n\n  dispatchChange() {\n    this.dispatch('change', { detail: { value: this.value }, bubbles: true });\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['item', 'panel'];\n\n  connect() {\n    $(this.itemTargets).on('click', this.handleItemClick);\n  }\n\n  disconnect() {\n    $(this.itemTargets).off('click', this.handleItemClick);\n  }\n\n  handleItemClick = (event) => {\n    const activeTabsItemController = this.application.getControllerForElementAndIdentifier(event.currentTarget, 'tabs-item');\n    this.setActive(activeTabsItemController.key);\n  };\n\n  setActive(key) {\n    for (const itemTarget of this.itemTargets) {\n      const tabsItemController = this.application.getControllerForElementAndIdentifier(itemTarget, 'tabs-item');\n      tabsItemController.toggleActive(tabsItemController.key === key);\n    }\n\n    for (const panelTarget of this.panelTargets) {\n      const tabsPanelController = this.application.getControllerForElementAndIdentifier(panelTarget, 'tabs-panel');\n      tabsPanelController.toggleActive(tabsPanelController.key === key);\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  get key() {\n    return this.data.get('key');\n  }\n\n  toggleActive(isActive) {\n    $(this.element).toggleClass(this.data.get('active-class'), isActive);\n    $(this.element).attr('aria-selected', isActive.toString());\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  get key() {\n    return this.data.get('key');\n  }\n\n  toggleActive(isActive) {\n    $(this.element).attr('hidden', !isActive);\n    $(document).trigger('tabsPanel.toggleActive', [this.element, isActive]);\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport tippy, { roundArrow } from 'tippy.js';\nimport { hideOnEsc } from '../modules/tippy';\n\nconst DEFAULT_TIPPY_PROPS = {\n  theme: 'tooltip', // Theme styles are defined in vendor/tippy.css\n  arrow: roundArrow,\n  role: 'tooltip',\n  plugins: [hideOnEsc],\n};\n\n/**\n * Stimulus controller that shows tooltip on hover.\n * @example\n * %span(data-controller=\"tooltip\" data-tooltip-content=\"Hello\") Hover me\n *\n * @example\n * %input(data-controller=\"tooltip\" data-tooltip-content=\"Type and press enter\" data-tooltip-trigger=\"focus\" data-tooltip-hide-on-click=\"toggle\")\n *\n * @example\n * %span(data-controller=\"tooltip\" data-tooltip-content=\"Hello <strong>world</strong>!\" data-tooltip-allow-html) HTML tooltip\n */\nexport default class extends Controller {\n  get portal() {\n    return document.getElementById('portal') || document.body;\n  }\n\n  // Collects tippy.js props from data attributes (turns data-tooltip-content=\"Hello\" into { content: 'Hello' })\n  // See documentation for all props: https://atomiks.github.io/tippyjs/v6/all-props/\n  get tippyProps() {\n    let props = {};\n\n    for (const key of Object.keys(tippy.defaultProps)) {\n      if (this.data.has(key)) {\n        props[key] = this.data.get(key);\n      }\n    }\n\n    props.allowHTML = this.data.has('allowHtml');\n\n    return props;\n  }\n\n  connect() {\n    this.tippyInstance = tippy(this.element, { ...DEFAULT_TIPPY_PROPS, appendTo: this.portal, ...this.tippyProps });\n    this.noHoverMediaQuery = window.matchMedia('(hover: none)');\n    // Optional chaining handles old Safari versions where addEventListener is undefined\n    this.noHoverMediaQuery.addEventListener?.('change', this.handleNoHoverMediaQueryChange);\n    this.handleNoHoverMediaQueryChange(this.noHoverMediaQuery);\n    this.observer = new MutationObserver(this.handleMutations);\n    this.observer.observe(this.element, { attributes: true });\n  }\n\n  disconnect() {\n    this.observer.disconnect();\n    this.observer = null;\n    this.tippyInstance.destroy();\n    this.tippyInstance = null;\n    this.noHoverMediaQuery.removeEventListener?.('change', this.handleNoHoverMediaQueryChange);\n  }\n\n  enable() {\n    this.tippyInstance.enable();\n  }\n\n  disable() {\n    this.tippyInstance.disable();\n  }\n\n  handleNoHoverMediaQueryChange = () => {\n    this.noHoverMediaQuery.matches && this.element.closest('a, button') ? this.disable() : this.enable();\n  };\n\n  handleMutations = (mutations) => {\n    for (const mutation of mutations) {\n      if (mutation.attributeName.startsWith('data-tooltip-')) this.refresh();\n    }\n  };\n\n  refresh() {\n    this.tippyInstance?.setProps(this.tippyProps);\n  }\n}\n", "document.addEventListener('turbo:frame-missing', function (event) {\n  const frameId = event.target.id;\n  const response = event.detail.response;\n  const message = `Turbo frame ${frameId} missing from response ${response.url} (${response.status} ${response.statusText}). Add data: { turbo: false } to the link or add the missing frame to the response.`;\n  const error = new Error(message);\n\n  if (typeof Honeybadger !== 'undefined' && response.status == 200) {\n    Honeybadger.notify(error);\n  }\n\n  console.error(error);\n\n  event.preventDefault();\n});\n", "document.addEventListener('turbo:before-stream-render', function (e) {\n  const turboStream = e.target;\n\n  if (turboStream.action == 'close_modal') {\n    e.preventDefault();\n\n    const modalId = turboStream.getAttribute('target');\n    document.getElementById(modalId).dispatchEvent(new CustomEvent('modal.remove'));\n  }\n\n  if (turboStream.action == 'close_popover') {\n    e.preventDefault();\n\n    const buttonId = turboStream.getAttribute('target');\n    const button = document.getElementById(buttonId);\n\n    button._tippy.hide();\n  }\n\n  if (turboStream.action === 'highlight_replace' || turboStream.action === 'highlight_update') {\n    turboStream.setAttribute('action', turboStream.action.replace('highlight_', ''));\n    const children = turboStream.templateElement.content.children;\n    [...children].forEach((node) => addStimulusController(node, 'highlight'));\n  }\n\n  if (turboStream.action == 'redirect_to') {\n    e.preventDefault();\n\n    const redirectPath = turboStream.getAttribute('location');\n    const redirectLocation = new URL(redirectPath, window.location);\n\n    if (window.location.toString() === redirectLocation.toString()) {\n      window.location.reload();\n    } else if (urlWithoutAnchor(window.location) === urlWithoutAnchor(redirectLocation)) {\n      // If only the anchor differs, we need to add a timestamp to the URL to force a reload.\n      window.location.href = urlWithTimestamp(redirectPath);\n    } else {\n      window.location.href = redirectPath;\n    }\n  }\n\n  if (turboStream.action == 'fill_in') {\n    e.preventDefault();\n\n    const input_value = turboStream.getAttribute('input_value');\n    const fieldId = turboStream.getAttribute('field_id');\n\n    const inputField = document.getElementById(fieldId);\n\n    if (inputField.dataset.controller && inputField.dataset.controller.includes('ckeditor')) {\n      const editor = inputField.ckeditorInstance;\n      editor.setData(input_value);\n    } else {\n      inputField.value = input_value;\n    }\n  }\n\n  if (turboStream.action === 'replace_url') {\n    e.preventDefault();\n    const url = turboStream.getAttribute('url');\n    window.history.replaceState({}, '', url);\n  }\n\n  if (turboStream.action === 'push_params' || turboStream.action === 'replace_params') {\n    e.preventDefault();\n\n    const query = turboStream.getAttribute('query');\n    const url = new URL(window.location);\n\n    const historyFns = {\n      push_params: window.history.pushState.bind(window.history),\n      replace_params: window.history.replaceState.bind(window.history),\n    };\n\n    if (url.search.slice(1) !== query) {\n      url.search = `?${query}`;\n      historyFns[turboStream.action]({ query }, '', url.toString());\n    }\n  }\n\n  if (turboStream.action === 'scroll_into_view') {\n    e.preventDefault();\n\n    const targetId = turboStream.getAttribute('target');\n    const targetElement = document.getElementById(targetId);\n\n    targetElement.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' });\n  }\n\n  if (turboStream.action === 'scroll_to_bottom') {\n    e.preventDefault();\n\n    const targetId = turboStream.getAttribute('target');\n    const scrollElement = document.getElementById(targetId);\n    requestAnimationFrame(() => {\n      scrollElement.scrollTo({\n        top: scrollElement.scrollHeight,\n        behavior: 'smooth',\n      });\n    });\n  }\n});\n\nfunction addStimulusController(node, controllerName) {\n  const stimulusControllers = [controllerName];\n\n  if (node.getAttribute('data-controller')) {\n    stimulusControllers.push(...node.getAttribute('data-controller').split(' '));\n  }\n\n  node.setAttribute('data-controller', stimulusControllers.join(' '));\n}\n\nfunction urlWithTimestamp(redirectPath) {\n  const location = new URL(redirectPath, window.location);\n  const searchParams = new URLSearchParams(location.search);\n\n  searchParams.set('t', Date.now());\n  location.search = searchParams.toString();\n\n  return location.toString();\n}\n\nfunction urlWithoutAnchor(location) {\n  const url = new URL(location);\n  url.hash = '';\n  return url.toString();\n}\n", "document.addEventListener('turbo:before-stream-render', function (e) {\n  const turboStream = e.target;\n\n  if (turboStream.action === 'push_data_layer') {\n    e.preventDefault();\n\n    const dataLayerEvent = JSON.parse(turboStream.getAttribute('payload'));\n    pushDataLayer(dataLayerEvent);\n  }\n});\n\ndocument.addEventListener('turbo:load', function (e) {\n  const gtmDataLayer = document.getElementById('data-layer');\n  if (gtmDataLayer) {\n    const dataLayerEvents = JSON.parse(gtmDataLayer.textContent);\n    dataLayerEvents.forEach(pushDataLayer);\n  }\n});\n\nfunction pushDataLayer(dataLayerEvent) {\n  const dataLayer = window.dataLayer || [];\n  dataLayer.push({ ecommerce: null });\n  dataLayer.push(dataLayerEvent);\n}\n", "import '@hotwired/turbo-rails';\nimport { Application } from '@hotwired/stimulus';\nimport { definitions } from 'stimulus:./controllers';\n\nimport ApplicationLayoutController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/application_layout_controller';\nimport AutofocusController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/autofocus_controller';\nimport AutosubmitController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/autosubmit_controller';\nimport DateCalendarController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/date_calendar_controller';\nimport DateRangeCalendarController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/date_range_calendar_controller';\nimport ExpandableController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/expandable_controller';\nimport LiveController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/live_controller';\nimport ModalController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/modal_controller';\nimport ModalDialogController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/modal_dialog_controller';\nimport ModalSlideshowController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/modal_slideshow_controller';\nimport ModalTriggerController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/modal_trigger_controller';\nimport PopoverController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/popover_controller';\nimport RangeSliderController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/range_slider_controller';\nimport SearchListController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/search_list_controller';\nimport ShowByController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/show_by_controller';\nimport StepperController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/stepper_controller';\nimport TabsController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/tabs_controller';\nimport TabsItemController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/tabs_item_controller';\nimport TabsPanelController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/tabs_panel_controller';\nimport TooltipController from '@bookingexperts/design-system/app/javascript/design_system/stimulus_controllers/tooltip_controller';\nimport '@bookingexperts/design-system/app/javascript/design_system/modules/turbo_frame';\nimport '@bookingexperts/design-system/app/javascript/design_system/modules/turbo_stream';\n\nimport './modules/turbo';\n\nexport const application = Application.start();\nwindow.Stimulus = application;\n\napplication.load(definitions);\napplication.register('application-layout', ApplicationLayoutController);\napplication.register('autofocus', AutofocusController);\napplication.register('autosubmit', AutosubmitController);\napplication.register('date-calendar', DateCalendarController);\napplication.register('date-range-calendar', DateRangeCalendarController);\napplication.register('expandable', ExpandableController);\napplication.register('live', LiveController);\napplication.register('modal-dialog', ModalDialogController);\napplication.register('modal-slideshow', ModalSlideshowController);\napplication.register('modal-trigger', ModalTriggerController);\napplication.register('modal', ModalController);\napplication.register('popover', PopoverController);\napplication.register('range-slider', RangeSliderController);\napplication.register('search-list', SearchListController);\napplication.register('show-by', ShowByController);\napplication.register('stepper', StepperController);\napplication.register('tabs-item', TabsItemController);\napplication.register('tabs-panel', TabsPanelController);\napplication.register('tabs', TabsController);\napplication.register('tooltip', TooltipController);\n\nwindow.Turbo.session.drive = false;\n"],
  "mappings": "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A,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,CAAM,CACP,EAEDy5E,EAAI4B,WAAa,CACf3yE,MAAOyyE,EACP1yE,MAAO2yE,GAGT,IAAMrB,EAAO,IAAI/5E,WAAW,CAC1B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,GACA,EACA,EACA,EACA,CAAM,CACP,EAEK66E,EAAO,IAAI76E,WAAW,CAC1B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAAM,CACP,EAEDy5E,EAAI6B,KAAO7B,EAAI8B,KAAO9B,EAAI+B,KAAOX,EAEjCpB,EAAIgC,KAAO,IAAIz7E,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAAM,CACP,EACDy5E,EAAIiC,KAAO,IAAI17E,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAAM,CACP,EACDy5E,EAAIkC,KAAO,IAAI37E,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAAM,CACP,EAEDy5E,EAAImC,KAAO,IAAI57E,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAAI,CACL,EAED,IAAM67E,EAAa,IAAI77E,WAAW,CAAC,IAAK,IAAK,IAAK,GAAG,CAAC,EAChD87E,EAAY,IAAI97E,WAAW,CAAC,GAAI,IAAK,GAAI,EAAE,CAAC,EAC5C+7E,EAAe,IAAI/7E,WAAW,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAEhDy5E,EAAIuC,KAAOvC,EAAIwC,IACbxC,EAAIC,MAAMO,KACV4B,EACAE,EACAF,EACAC,CACF,EACArC,EAAIyC,KAAOzC,EAAIwC,IAAIxC,EAAIC,MAAMI,KAAML,EAAIwC,IAAI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OwiD,CAAK,EACZxiD,OAAO2/C,EAAIe,KAAK1pE,CAAM,CAAC,CAC5B,CACF,CAEA,OAAO0pE,KAAK1pE,EAA0B,CACpC,IAAItR,EAAIsR,EAAOzS,OACTi+E,EAAsB,CAAA,EAE5B,KAAO98E,KACL88E,EAAM98E,CAAC,EAAIi6E,EAAIltE,KAAKuE,EAAOtR,CAAC,CAAC,EAG/B,OAAOi6E,EAAIwC,IAAIryE,MAAM,KAAM,CAAC6vE,EAAIC,MAAMc,KAAM,GAAG8B,CAAK,CAAC,CACvD,CAEA,OAAO7B,KAAKzvE,EAAmBvG,EAAkB,CAC/CA,GAAYuG,EACZ,IAAMmxE,EAAoBnkF,KAAK8iD,MAAMr2C,GAAY6E,GAAa,EAAE,EAC1D8yE,EAAoBpkF,KAAK8iD,MAAMr2C,GAAY6E,GAAa,EAAE,EAC1DoG,EAAQ,IAAI1P,WAAW,CAC3B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACCgL,GAAa,GAAM,IACnBA,GAAa,GAAM,IACnBA,GAAa,EAAK,IACnBA,EAAY,IACZmxE,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IAC3BA,EAAoB,IACpBC,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IAC3BA,EAAoB,IACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,GAAM,CACP,EACD,OAAO3C,EAAIwC,IAAIxC,EAAIC,MAAMe,KAAM/qE,CAAK,CACtC,CAEA,OAAOirE,KAAKnuE,EAAyB,CACnC,IAAMyH,EAAUzH,EAAMyH,SAAW,CAAA,EAC3BvE,EAAQ,IAAI1P,WAAW,EAAIiU,EAAQ5V,MAAM,EAC3CmB,EACAkN,EAGJ,IAAKlN,EAAI,EAAGA,EAAIyU,EAAQ5V,OAAQmB,IAC9BkN,EAAQuH,EAAQzU,CAAC,EAAEkN,MACnBgD,EAAMlQ,EAAI,CAAC,EACRkN,EAAM6vE,WAAa,EACnB7vE,EAAM8vE,cAAgB,EACvB9vE,EAAM+vE,cAGV,OAAOhD,EAAIwC,IAAIxC,EAAIC,MAAMiB,KAAMjrE,CAAK,CACtC,CAEA,OAAOkrE,KAAKpuE,EAAuB,CACjC,OAAOitE,EAAIwC,IACTxC,EAAIC,MAAMkB,KACVnB,EAAIrtE,KAAKI,CAAK,EACditE,EAAIwC,IAAIxC,EAAIC,MAAMsB,KAAMvB,EAAI6B,IAAI,EAChC7B,EAAIwC,IAAIxC,EAAIC,MAAMoB,KAAMrB,EAAI8B,IAAI,EAChC9B,EAAIwC,IAAIxC,EAAIC,MAAMqB,KAAMtB,EAAIgC,IAAI,EAChChC,EAAIwC,IAAIxC,EAAIC,MAAMmB,KAAMpB,EAAI+B,IAAI,CAClC,CACF,CAEA,OAAOlgE,KAAK9O,EAAoB,CAC9B,IAAI4hE,EAAgB,CAAA,EAChBK,EAAgB,CAAA,EAChBjvE,EACA+F,EACApG,EAGJ,IAAKK,EAAI,EAAGA,EAAIgN,EAAM4hE,IAAI/vE,OAAQmB,IAChC+F,EAAOiH,EAAM4hE,IAAI5uE,CAAC,EAClBL,EAAMoG,EAAKO,WACXsoE,EAAI7kE,KAAMpK,IAAQ,EAAK,GAAI,EAC3BivE,EAAI7kE,KAAKpK,EAAM,GAAI,EAGnBivE,EAAMA,EAAIt0C,OAAOxB,MAAMvvB,UAAU4B,MAAM2sC,KAAK/xC,CAAI,CAAC,EAInD,IAAK/F,EAAI,EAAGA,EAAIgN,EAAMiiE,IAAIpwE,OAAQmB,IAChC+F,EAAOiH,EAAMiiE,IAAIjvE,CAAC,EAClBL,EAAMoG,EAAKO,WACX2oE,EAAIllE,KAAMpK,IAAQ,EAAK,GAAI,EAC3BsvE,EAAIllE,KAAKpK,EAAM,GAAI,EAEnBsvE,EAAMA,EAAI30C,OAAOxB,MAAMvvB,UAAU4B,MAAM2sC,KAAK/xC,CAAI,CAAC,EAGnD,IAAMm3E,EAAOjD,EAAIwC,IACfxC,EAAIC,MAAMC,KACV,IAAI35E,WACF,CACE,EACAouE,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACL,IACA,IAAO5hE,EAAM4hE,IAAI/vE,MAAQ,EAExBy7B,OAAOs0C,CAAG,EACVt0C,OAAO,CACNttB,EAAMiiE,IAAIpwE,OACX,EACAy7B,OAAO20C,CAAG,CACf,CACF,EACM7sD,EAAQpV,EAAMoV,MACdC,EAASrV,EAAMqV,OACf86D,EAAWnwE,EAAM8hE,WAAW,CAAC,EAC7BsO,EAAWpwE,EAAM8hE,WAAW,CAAC,EAEnC,OAAOmL,EAAIwC,IACTxC,EAAIC,MAAMp+D,KACV,IAAItb,WAAW,CACb,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACC4hB,GAAS,EAAK,IACfA,EAAQ,IACPC,GAAU,EAAK,IAChBA,EAAS,IACT,EACA,GACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAAI,CACL,EACD66D,EACAjD,EAAIwC,IACFxC,EAAIC,MAAMG,KACV,IAAI75E,WAAW,CACb,EACA,GACA,IACA,IACA,EACA,GACA,IACA,IACA,EACA,GACA,IACA,GAAI,CACL,CACH,EACAy5E,EAAIwC,IACFxC,EAAIC,MAAMgB,KACV,IAAI16E,WAAW,CACb28E,GAAY,GACXA,GAAY,GAAM,IAClBA,GAAY,EAAK,IAClBA,EAAW,IAC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A,EACAy/E,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IAC3BA,EAAoB,IACpBC,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IAC3BA,EAAoB,IACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACCx6D,GAAS,EAAK,IACfA,EAAQ,IACR,EACA,EACCC,GAAU,EAAK,IAChBA,EAAS,IACT,EACA,CAAM,CACP,CACH,CACF,CAEA,OAAO7Q,KAAKxE,EAAyB6vE,EAA6B,CAChE,IAAMS,EAAwBrD,EAAIkB,KAAKnuE,CAAK,EACtC9P,EAAK8P,EAAM9P,GACXqgF,EAA+B/kF,KAAK8iD,MACxCuhC,GAAuB/yE,GAAa,EACtC,EACM0zE,EAA+BhlF,KAAK8iD,MACxCuhC,GAAuB/yE,GAAa,EACtC,EACA,OAAOmwE,EAAIwC,IACTxC,EAAIC,MAAM1oE,KACVyoE,EAAIwC,IACFxC,EAAIC,MAAMzoE,KACV,IAAIjR,WAAW,CACb,EACA,EACA,EACA,EACAtD,GAAM,GACLA,GAAM,GAAM,IACZA,GAAM,EAAK,IACZA,EAAK,GAAM,CACZ,CACH,EACA+8E,EAAIwC,IACFxC,EAAIC,MAAMroE,KACV,IAAIrR,WAAW,CACb,EACA,EACA,EACA,EACA+8E,GAAgC,GAC/BA,GAAgC,GAAM,IACtCA,GAAgC,EAAK,IACtCA,EAA+B,IAC/BC,GAAgC,GAC/BA,GAAgC,GAAM,IACtCA,GAAgC,EAAK,IACtCA,EAA+B,GAAI,CACpC,CACH,EACAvD,EAAI1nE,KACFvF,EACAswE,EAAsBz+E,OACpB,GACA,GACA,EACA,GACA,EACA,CACJ,EACAy+E,CACF,CACF,CAMA,OAAOnxE,KAAKa,EAAuB,CACjCA,OAAAA,EAAM/H,SAAW+H,EAAM/H,UAAY,WAC5Bg1E,EAAIwC,IAAIxC,EAAIC,MAAM/tE,KAAM8tE,EAAI7tE,KAAKY,CAAK,EAAGitE,EAAIU,KAAK3tE,CAAK,CAAC,CACjE,CAEA,OAAOD,KAAKC,EAAuB,CACjC,IAAM9P,EAAK8P,EAAM9P,GACjB,OAAO+8E,EAAIwC,IACTxC,EAAIC,MAAMntE,KACV,IAAIvM,WAAW,CACb,EACA,EACA,EACA,EACAtD,GAAM,GACLA,GAAM,GAAM,IACZA,GAAM,EAAK,IACZA,EAAK,IACL,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAAM,CACP,CACH,CACF,CAEA,OAAOqV,KAAKvF,EAAuB1C,EAAgB,CACjD,IAAMmK,EAAUzH,EAAMyH,SAAW,CAAA,EAC3B9U,EAAM8U,EAAQ5V,OACd4+E,EAAW,GAAK,GAAK99E,EACrBR,EAAQ,IAAIqB,WAAWi9E,CAAQ,EACjCz9E,EACA/F,EACAgL,EACA4F,EACAqC,EACAwwE,EAmBJ,IAlBApzE,GAAU,EAAImzE,EACdt+E,EAAM0R,IACJ,CACE7D,EAAM/P,OAAS,QAAU,EAAO,EAChC,EACA,GACA,EACC0C,IAAQ,GAAM,IACdA,IAAQ,GAAM,IACdA,IAAQ,EAAK,IACdA,EAAM,IACL2K,IAAW,GAAM,IACjBA,IAAW,GAAM,IACjBA,IAAW,EAAK,IACjBA,EAAS,KAEX,CACF,EACKtK,EAAI,EAAGA,EAAIL,EAAKK,IACnB/F,EAASwa,EAAQzU,CAAC,EAClBiF,EAAWhL,EAAOgL,SAClB4F,EAAO5Q,EAAO4Q,KACdqC,EAAQjT,EAAOiT,MACfwwE,EAAMzjF,EAAOyjF,IACbv+E,EAAM0R,IACJ,CACG5L,IAAa,GAAM,IACnBA,IAAa,GAAM,IACnBA,IAAa,EAAK,IACnBA,EAAW,IACV4F,IAAS,GAAM,IACfA,IAAS,GAAM,IACfA,IAAS,EAAK,IACfA,EAAO,IACNqC,EAAMywE,WAAa,EAAKzwE,EAAM6vE,UAC9B7vE,EAAM8vE,cAAgB,EACpB9vE,EAAM+vE,eAAiB,EACvB/vE,EAAM0wE,cAAgB,EACvB1wE,EAAM2wE,UACR3wE,EAAM4wE,WAAc,MACpB5wE,EAAM4wE,WAAa,GAClBJ,IAAQ,GAAM,IACdA,IAAQ,GAAM,IACdA,IAAQ,EAAK,IACdA,EAAM,GAAM,EAEd,GAAK,GAAK19E,CACZ,EAEF,OAAOi6E,EAAIwC,IAAIxC,EAAIC,MAAM3nE,KAAMpT,CAAK,CACtC,CAEA,OAAO+G,YAAYoL,EAA0B,CACtC2oE,EAAIC,OACPD,EAAIvzB,KAAI,EAGV,IAAMq3B,EAAQ9D,EAAIa,KAAKxpE,CAAM,EAE7B,OADe2C,GAAiBgmE,EAAIuC,KAAMuB,CAAK,CAEjD,CAEA,OAAOnhE,KAAK5P,EAAoB,CAI9B,IAAMgxE,EAAKhxE,EAAMtJ,OACX6nE,EAAwB,CAACv+D,EAAMsjE,IAAKtjE,EAAM4hE,IAAK5hE,EAAMiiE,GAAG,EACxDgP,EAAiB,EACjBh5D,EAAS,IAAIzkB,WAAW,CAC5B,EACCw9E,EAAG3M,uBAAyB,GAC1B2M,EAAG1M,kBAAoB,GAAK,GAC7B0M,EAAGzM,oBACLyM,EAAG5I,oCAAoC,CAAC,EACxC4I,EAAG5I,oCAAoC,CAAC,EACxC4I,EAAG5I,oCAAoC,CAAC,EACxC4I,EAAG5I,oCAAoC,CAAC,EACxC4I,EAAG3I,mCAAmC,CAAC,EACvC2I,EAAG3I,mCAAmC,CAAC,EACvC2I,EAAG3I,mCAAmC,CAAC,EACvC2I,EAAG3I,mCAAmC,CAAC,EACvC2I,EAAG3I,mCAAmC,CAAC,EACvC2I,EAAG3I,mCAAmC,CAAC,EACvC2I,EAAG9L,kBACH,IAAO8L,EAAGnK,8BAAgC,EAC1C,IAAMmK,EAAGnK,6BACT,IAAMmK,EAAGpI,gBACT,IAAMoI,EAAG3L,kBACT,IAAM2L,EAAGnL,sBACT,IAAMmL,EAAGlL,wBACT,EACAlvE,SAASo6E,EAAGzI,WAAWE,GAAG,EACzBwI,EAAiB,EACfD,EAAGE,oBAAsB,EACzBF,EAAGG,qBAAuB,GAC1BH,EAAGzI,WAAWC,MAAQ,GAAK,GAC9BjK,EAAM1sE,MAAM,CACb,EAGGA,EAASomB,EAAOpmB,OACpB,QAASmB,EAAI,EAAGA,EAAIurE,EAAM1sE,OAAQmB,GAAK,EAAG,CACxCnB,GAAU,EACV,QAASyT,EAAI,EAAGA,EAAIi5D,EAAMvrE,CAAC,EAAEnB,OAAQyT,GAAK,EACxCzT,GAAU,EAAI0sE,EAAMvrE,CAAC,EAAEsS,CAAC,EAAEzT,MAE9B,CAEA,IAAMu7E,EAAO,IAAI55E,WAAW3B,CAAM,EAClCu7E,EAAKvpE,IAAIoU,EAAQ,CAAC,EAClBpmB,EAASomB,EAAOpmB,OAEhB,IAAMu/E,EAAO7S,EAAM1sE,OAAS,EAC5B,QAASmB,EAAI,EAAGA,EAAIurE,EAAM1sE,OAAQmB,GAAK,EAAG,CACxCo6E,EAAKvpE,IACH,IAAIrQ,WAAW,CACZ,GAAKR,GAAMA,IAAMo+E,EAAO,IAAM,GAC/B,EACA7S,EAAMvrE,CAAC,EAAEnB,MAAM,CAChB,EACDA,CACF,EACAA,GAAU,EACV,QAASyT,EAAI,EAAGA,EAAIi5D,EAAMvrE,CAAC,EAAEnB,OAAQyT,GAAK,EACxC8nE,EAAKvpE,IACH,IAAIrQ,WAAW,CAAC+qE,EAAMvrE,CAAC,EAAEsS,CAAC,EAAEzT,QAAU,EAAG0sE,EAAMvrE,CAAC,EAAEsS,CAAC,EAAEzT,OAAS,GAAG,CAAC,EAClEA,CACF,EACAA,GAAU,EACVu7E,EAAKvpE,IAAI06D,EAAMvrE,CAAC,EAAEsS,CAAC,EAAGzT,CAAM,EAC5BA,GAAU0sE,EAAMvrE,CAAC,EAAEsS,CAAC,EAAEzT,MAE1B,CACA,IAAMw/E,EAAOpE,EAAIwC,IAAIxC,EAAIC,MAAME,KAAMA,CAAI,EACnCh4D,EAAQpV,EAAMoV,MACdC,EAASrV,EAAMqV,OACf86D,EAAWnwE,EAAM8hE,WAAW,CAAC,EAC7BsO,EAAWpwE,EAAM8hE,WAAW,CAAC,EAEnC,OAAOmL,EAAIwC,IACTxC,EAAIC,MAAMt9D,KACV,IAAIpc,WAAW,CACb,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACC4hB,GAAS,EAAK,IACfA,EAAQ,IACPC,GAAU,EAAK,IAChBA,EAAS,IACT,EACA,GACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAAI,CACL,EACDg8D,EACApE,EAAIwC,IACFxC,EAAIC,MAAMG,KACV,IAAI75E,WAAW,CACb,EACA,GACA,IACA,IACA,EACA,GACA,IACA,IACA,EACA,GACA,IACA,GAAI,CACL,CACH,EACAy5E,EAAIwC,IACFxC,EAAIC,MAAMgB,KACV,IAAI16E,WAAW,CACb28E,GAAY,GACXA,GAAY,GAAM,IAClBA,GAAY,EAAK,IAClBA,EAAW,IACXC,GAAY,GACXA,GAAY,GAAM,IAClBA,GAAY,EAAK,IAClBA,EAAW,GAAI,CAChB,CACH,CACF,CACF,CACF,EAr0CMnD,GACUC,MAAK,OADfD,GAEW4B,WAAU,OAFrB5B,GAGW6B,KAAI,OAHf7B,GAIW8B,KAAI,OAJf9B,GAKW+B,KAAI,OALf/B,GAMWgC,KAAI,OANfhC,GAOWiC,KAAI,OAPfjC,GAQWkC,KAAI,OARflC,GASWmC,KAAI,OATfnC,GAUWuC,KAAI,OAVfvC,GAWWyC,KAAI,OCvCrB,IAAM4B,GAAwB,IASvB,SAASC,GACdzsE,EACA0sE,EACAC,EAAkB,EAClB7tD,EAAiB,GACT,CACR,IAAMjmB,EAASmH,EAAW0sE,EAAYC,EACtC,OAAO7tD,EAAQp4B,KAAKo4B,MAAMjmB,CAAM,EAAIA,CACtC,CAEO,SAAS+zE,IACd5sE,EACA0sE,EACAG,EAAmB,EACnB/tD,EAAiB,GACT,CACR,OAAO2tD,GAAoBzsE,EAAU0sE,EAAW,EAAIG,EAAU/tD,CAAK,CACrE,CAEO,SAASguD,GACd9sE,EACA8e,EAAiB,GACT,CACR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AKC,IACP,OAAOzE,GAAQwE,EAAKC,GAAG,EAGzB,GAAI,OAAOD,EAAKR,OAAU,WACxB,OAAOhE,GAAQwE,EAAKR,KAAK,CAE7B,CAEAN,EAAShF,IAAegF,CAAM,CAChC,CAEA,SAASgB,GAAa,CACpB,OAAO,IACT,CAEA,OAAOA,CACT,CAEA,SAASC,IAAQX,EAAc,CAC7B,GAAI,CACF3B,OAAAA,GAAW2B,EAAiB,EAAE,EACvB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CCnSO,IAAMY,GAAOhG,GAAO,CACzB,IACA,OACA,UACA,UACA,OACA,UACA,QACA,QACA,IACA,MACA,MACA,MACA,QACA,aACA,OACA,KACA,SACA,SACA,UACA,SACA,OACA,OACA,MACA,WACA,UACA,OACA,WACA,KACA,YACA,MACA,UACA,MACA,SACA,MACA,MACA,KACA,KACA,UACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,UACA,OACA,WACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,SACA,UACA,SACA,SACA,OACA,QACA,SACA,SACA,OACA,SACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,KAAK,CACG,EAEGiG,GAAMjG,GAAO,CACxB,MACA,IACA,WACA,cACA,eACA,eACA,gBACA,mBACA,SACA,WACA,OACA,OACA,UACA,eACA,cACA,SACA,OACA,IACA,QACA,WACA,QACA,QACA,YACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,OACA,UACA,UACA,WACA,iBACA,OACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,OACA,QACA,OACA,OAAO,CACC,EAEGkG,GAAalG,GAAO,CAC/B,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,cAAc,CACN,EAMGmG,IAAgBnG,GAAO,CAClC,UACA,gBACA,SACA,UACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,KAAK,CACG,EAEGoG,GAASpG,GAAO,CAC3B,OACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,SACA,QACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,aACA,aAAa,CACL,EAIGqG,IAAmBrG,GAAO,CACrC,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,MAAM,CACE,EAEGsG,GAAOtG,GAAO,CAAC,OAAO,CAAU,EC1RhCgG,GAAOhG,GAAO,CACzB,SACA,SACA,QACA,MACA,iBACA,eACA,uBACA,WACA,aACA,UACA,SACA,UACA,cACA,cACA,UACA,OACA,QACA,QACA,QACA,OACA,UACA,UACA,aACA,WACA,eACA,SACA,cACA,WACA,WACA,UACA,MACA,WACA,0BACA,wBACA,WACA,YACA,UACA,eACA,cACA,OACA,MACA,UACA,SACA,SACA,OACA,OACA,WACA,KACA,QACA,YACA,YACA,QACA,OACA,QACA,OACA,OACA,UACA,OACA,MACA,MACA,YACA,QACA,SACA,MACA,YACA,WACA,QACA,OACA,QACA,UACA,aACA,SACA,OACA,UACA,OACA,UACA,cACA,cACA,UACA,gBACA,sBACA,SACA,UACA,UACA,aACA,WACA,MACA,WACA,MACA,WACA,OACA,OACA,UACA,aACA,QACA,WACA,QACA,OACA,QACA,OACA,OACA,UACA,QACA,MACA,SACA,OACA,QACA,UACA,WACA,QACA,YACA,OACA,SACA,SACA,QACA,QACA,OACA,OAAO,CACC,EAEGiG,GAAMjG,GAAO,CACxB,gBACA,aACA,WACA,qBACA,YACA,SACA,gBACA,gBACA,UACA,gBACA,iBACA,QACA,OACA,KACA,QACA,OACA,gBACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,KACA,KACA,IACA,KACA,KACA,kBACA,YACA,UACA,UACA,oBACA,MACA,WACA,YACA,MACA,WACA,OACA,eACA,YACA,SACA,cACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,KACA,KACA,KACA,KACA,aACA,WACA,gBACA,oBACA,SACA,OACA,KACA,kBACA,KACA,MACA,YACA,IACA,KACA,KACA,KACA,KACA,UACA,YACA,aACA,WACA,OACA,eACA,iBACA,eACA,mBACA,iBACA,QACA,aACA,aACA,eACA,eACA,cACA,cACA,mBACA,YACA,MACA,OACA,YACA,QACA,SACA,OACA,MACA,OACA,aACA,SACA,WACA,UACA,QACA,SACA,cACA,SACA,WACA,cACA,OACA,aACA,sBACA,mBACA,eACA,iBACA,SACA,gBACA,sBACA,iBACA,IACA,KACA,KACA,SACA,OACA,OACA,cACA,YACA,UACA,SACA,SACA,QACA,OACA,kBACA,QACA,mBACA,mBACA,eACA,cACA,eACA,cACA,aACA,eACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,SACA,eACA,QACA,eACA,iBACA,WACA,cACA,UACA,UACA,YACA,mBACA,cACA,kBACA,mBACA,iBACA,aACA,OACA,KACA,KACA,UACA,SACA,gBACA,UACA,aACA,UACA,aACA,gBACA,gBACA,QACA,eACA,OACA,eACA,mBACA,mBACA,IACA,KACA,KACA,QACA,IACA,KACA,KACA,IACA,YAAY,CACJ,EAEGoG,GAASpG,GAAO,CAC3B,SACA,cACA,QACA,WACA,QACA,cACA,cACA,gBACA,aACA,aACA,QACA,MACA,UACA,eACA,WACA,QACA,QACA,SACA,OACA,KAC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",
  "names": ["adapters_default", "init_adapters", "__esmMin", "logger_default", "init_logger", "__esmMin", "init_adapters", "messages", "adapters_default", "now", "secondsSince", "ConnectionMonitor", "connection_monitor_default", "init_connection_monitor", "__esmMin", "init_logger", "time", "connection", "logger_default", "staleThreshold", "reconnectionBackoffRate", "backoff", "jitter", "internal_default", "init_internal", "__esmMin", "message_types", "protocols", "supportedProtocols", "indexOf", "Connection", "connection_default", "init_connection", "__esmMin", "init_adapters", "init_connection_monitor", "init_internal", "init_logger", "internal_default", "consumer", "connection_monitor_default", "data", "logger_default", "socketProtocols", "adapters_default", "allowReconnect", "error", "states", "state", "eventName", "handler", "event", "identifier", "message", "reason", "reconnect", "type", "extend", "Subscription", "init_subscription", "__esmMin", "object", "properties", "key", "value", "consumer", "params", "mixin", "action", "data", "SubscriptionGuarantor", "subscription_guarantor_default", "init_subscription_guarantor", "__esmMin", "init_logger", "subscriptions", "subscription", "logger_default", "s", "Subscriptions", "init_subscriptions", "__esmMin", "init_subscription", "init_subscription_guarantor", "init_logger", "consumer", "subscription_guarantor_default", "channelName", "mixin", "channel", "params", "subscription", "Subscription", "identifier", "s", "callbackName", "args", "subscriptions", "logger_default", "command", "createWebSocketURL", "url", "a", "Consumer", "init_consumer", "__esmMin", "init_connection", "init_subscriptions", "Subscriptions", "connection_default", "data", "subprotocol", "src_exports", "__export", "connection_default", "connection_monitor_default", "Consumer", "internal_default", "Subscription", "subscription_guarantor_default", "Subscriptions", "adapters_default", "createConsumer", "createWebSocketURL", "getConfig", "logger_default", "url", "name", "element", "init_src", "__esmMin", "init_connection", "init_connection_monitor", "init_consumer", "init_internal", "init_subscription", "init_subscriptions", "init_subscription_guarantor", "init_adapters", "init_logger", "require_object_assign", "__commonJSMin", "exports", "module", "getOwnPropertySymbols", "hasOwnProperty", "propIsEnumerable", "toObject", "val", "shouldUseNative", "test1", "test2", "i", "order2", "n", "test3", "letter", "target", "source", "from", "to", "symbols", "key", "require_react_production_min", "__commonJSMin", "exports", "l", "n", "p", "q", "r", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "a", "b", "c", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "e", "d", "g", "k", "f", "h", "m", "N", "O", "escape", "P", "Q", "R", "S", "T", "U", "V", "W", "aa", "X", "Y", "Z", "ba", "require_react", "__commonJSMin", "exports", "module", "require_scheduler_production_min", "__commonJSMin", "exports", "f", "g", "h", "k", "l", "p", "q", "t", "a", "b", "u", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "c", "d", "e", "K", "L", "M", "m", "n", "v", "r", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "require_scheduler", "__commonJSMin", "exports", "module", "require_react_dom_production_min", "__commonJSMin", "exports", "aa", "n", "r", "u", "a", "b", "c", "ba", "d", "e", "f", "g", "h", "k", "l", "m", "da", "ea", "fa", "ha", "ia", "ja", "ka", "la", "ma", "na", "oa", "pa", "qa", "ra", "sa", "ta", "ua", "va", "wa", "xa", "ya", "za", "Aa", "Ba", "Ca", "Da", "Ea", "Fa", "Ga", "Ha", "Ia", "Ja", "Ka", "La", "Ma", "Na", "Oa", "Pa", "Qa", "Ra", "Sa", "Ta", "v", "C", "Ua", "Va", "Wa", "Xa", "Ya", "E", "Za", "$a", "ab", "bb", "cb", "db", "eb", "fb", "gb", "hb", "ib", "jb", "kb", "lb", "mb", "nb", "ob", "pb", "qb", "rb", "sb", "tb", "xb", "yb", "zb", "Ab", "Bb", "Cb", "Db", "Eb", "Fb", "Gb", "Hb", "Ib", "Jb", "Kb", "Lb", "Mb", "Nb", "Ob", "Pb", "Qb", "Rb", "Sb", "Tb", "Ub", "Vb", "Wb", "Xb", "Yb", "Zb", "$b", "ac", "bc", "cc", "dc", "ec", "fc", "gc", "hc", "ic", "jc", "kc", "lc", "mc", "nc", "oc", "pc", "qc", "rc", "sc", "tc", "uc", "vc", "F", "wc", "xc", "yc", "zc", "Ac", "Bc", "Cc", "Dc", "Ec", "Fc", "Gc", "Hc", "Ic", "Jc", "Kc", "Lc", "Mc", "Nc", "Oc", "Pc", "Qc", "Rc", "Sc", "Tc", "Uc", "Vc", "Wc", "Yc", "Zc", "$c", "ad", "bd", "cd", "dd", "ed", "fd", "gd", "hd", "id", "jd", "kd", "ld", "md", "nd", "od", "pd", "qd", "rd", "sd", "td", "ud", "vd", "wd", "xd", "yd", "zd", "Ad", "Bd", "Cd", "Dd", "Ed", "Fd", "Gd", "Hd", "Id", "Jd", "Kd", "Ld", "Md", "Nd", "Od", "Pd", "Qd", "Rd", "Sd", "Td", "Ud", "Vd", "Wd", "Xd", "Yd", "Zd", "$d", "ae", "be", "ce", "G", "de", "ee", "fe", "ge", "he", "ie", "je", "ke", "le", "me", "ne", "oe", "pe", "qe", "re", "se", "te", "ue", "ve", "we", "xe", "ye", "ze", "Ae", "Be", "Ce", "De", "Ee", "Fe", "Ge", "He", "Ie", "Je", "Ke", "Le", "Me", "Ne", "Oe", "Pe", "Qe", "Re", "Se", "Te", "Ue", "Ve", "We", "Xe", "Ye", "p", "Ze", "$e", "af", "bf", "cf", "df", "ef", "ff", "gf", "hf", "jf", "kf", "lf", "mf", "nf", "of", "pf", "qf", "rf", "sf", "tf", "uf", "vf", "wf", "xf", "yf", "zf", "H", "I", "Af", "J", "K", "Bf", "Cf", "L", "Df", "Ef", "Ff", "Gf", "Hf", "If", "Jf", "Kf", "Lf", "Mf", "Nf", "Of", "Pf", "Qf", "Rf", "Sf", "Tf", "Uf", "Vf", "Wf", "Xf", "Yf", "Zf", "$f", "ag", "bg", "cg", "dg", "eg", "fg", "gg", "hg", "ig", "jg", "kg", "lg", "mg", "ng", "og", "pg", "qg", "rg", "sg", "tg", "ug", "vg", "wg", "xg", "yg", "zg", "x", "z", "ca", "Ag", "D", "t", "Bg", "Cg", "Dg", "Eg", "Fg", "Jg", "Gg", "Hg", "Ig", "Kg", "Lg", "Mg", "Ng", "Og", "Pg", "Qg", "Rg", "Sg", "Tg", "Ug", "Vg", "Wg", "y", "A", "q", "Xg", "Yg", "Zg", "$g", "ah", "bh", "ch", "dh", "eh", "fh", "gh", "M", "hh", "ih", "jh", "kh", "lh", "N", "O", "P", "mh", "Q", "nh", "oh", "ph", "qh", "rh", "sh", "th", "uh", "vh", "wh", "xh", "yh", "zh", "Ah", "Bh", "Ch", "Dh", "Eh", "Fh", "Gh", "Hh", "Ih", "Jh", "Kh", "Lh", "Mh", "Nh", "Oh", "Ph", "Qh", "Rh", "Sh", "Th", "Uh", "Vh", "Wh", "Xh", "Yh", "R", "Zh", "$h", "ai", "bi", "ci", "di", "ei", "fi", "gi", "hi", "ii", "ji", "ki", "li", "mi", "ni", "oi", "pi", "qi", "ri", "si", "S", "ti", "ui", "vi", "wi", "T", "xi", "U", "yi", "zi", "Ai", "Bi", "Ci", "Di", "Ei", "Fi", "Gi", "Hi", "Ii", "Ji", "Ki", "Li", "Mi", "Ni", "Oi", "Pi", "Qi", "Ri", "Si", "Ti", "Ui", "Vi", "Wi", "Xi", "Yi", "Zi", "$i", "aj", "bj", "cj", "dj", "V", "ej", "fj", "gj", "hj", "ij", "jj", "W", "X", "kj", "lj", "mj", "nj", "oj", "pj", "Y", "qj", "rj", "sj", "tj", "uj", "vj", "wj", "xj", "yj", "Z", "zj", "Aj", "Bj", "Cj", "Dj", "Ej", "Fj", "Gj", "Hj", "Ij", "Jj", "Kj", "Lj", "Mj", "Nj", "Oj", "B", "w", "ub", "vb", "Pj", "Xc", "Qj", "Rj", "Sj", "Tj", "wb", "Uj", "Vj", "Wj", "Xj", "Yj", "Zj", "ak", "bk", "ck", "dk", "ek", "fk", "gk", "hk", "ik", "jk", "kk", "lk", "require_react_dom", "__commonJSMin", "exports", "module", "checkDCE", "err", "FetchResponse", "init_fetch_response", "__esmMin", "response", "script", "metaTag", "nonce", "RequestInterceptor", "init_request_interceptor", "__esmMin", "interceptor", "getCookie", "name", "cookies", "prefix", "cookie", "value", "compact", "object", "result", "key", "metaContent", "element", "stringEntriesFromFormData", "formData", "entries", "mergeEntries", "searchParams", "init_utils", "__esmMin", "FetchRequest", "init_fetch_request", "__esmMin", "init_fetch_response", "init_request_interceptor", "init_utils", "method", "url", "options", "requestInterceptor", "RequestInterceptor", "error", "fetch", "response", "FetchResponse", "key", "value", "headers", "baseHeaders", "compact", "getCookie", "metaContent", "originalQuery", "params", "requestQuery", "stringEntriesFromFormData", "mergeEntries", "query", "bodyIsAString", "get", "url", "options", "FetchRequest", "init_verbs", "__esmMin", "init_fetch_request", "init_src", "__esmMin", "init_fetch_request", "init_fetch_response", "init_request_interceptor", "init_verbs", "require_lodash", "__commonJSMin", "exports", "module", "FUNC_ERROR_TEXT", "NAN", "symbolTag", "reTrim", "reIsBadHex", "reIsBinary", "reIsOctal", "freeParseInt", "freeGlobal", "freeSelf", "root", "objectProto", "objectToString", "nativeMax", "nativeMin", "now", "debounce", "func", "wait", "options", "lastArgs", "lastThis", "maxWait", "result", "timerId", "lastCallTime", "lastInvokeTime", "leading", "maxing", "trailing", "toNumber", "isObject", "invokeFunc", "time", "args", "thisArg", "leadingEdge", "timerExpired", "remainingWait", "timeSinceLastCall", "timeSinceLastInvoke", "shouldInvoke", "trailingEdge", "cancel", "flush", "debounced", "isInvoking", "value", "type", "isObjectLike", "isSymbol", "other", "isBinary", "require_interopRequireDefault", "__commonJSMin", "exports", "module", "_interopRequireDefault", "e", "require_isArguments", "__commonJSMin", "exports", "module", "toStr", "value", "str", "isArgs", "require_implementation", "__commonJSMin", "exports", "module", "keysShim", "has", "toStr", "isArgs", "isEnumerable", "hasDontEnumBug", "hasProtoEnumBug", "dontEnums", "equalsConstructorPrototype", "o", "ctor", "excludedKeys", "hasAutomationEqualityBug", "k", "equalsConstructorPrototypeIfNotBuggy", "object", "isObject", "isFunction", "isArguments", "isString", "theKeys", "skipProto", "i", "j", "name", "skipConstructor", "require_object_keys", "__commonJSMin", "exports", "module", "slice", "isArgs", "origKeys", "keysShim", "o", "originalKeys", "keysWorksWithArguments", "args", "object", "require_define_properties", "__commonJSMin", "exports", "module", "keys", "hasSymbols", "toStr", "concat", "origDefineProperty", "isFunction", "fn", "arePropertyDescriptorsSupported", "obj", "_", "supportsDescriptors", "defineProperty", "object", "name", "value", "predicate", "defineProperties", "map", "predicates", "props", "require_implementation", "__commonJSMin", "exports", "module", "ERROR_MESSAGE", "slice", "toStr", "funcType", "that", "target", "args", "bound", "binder", "result", "boundLength", "boundArgs", "i", "Empty", "require_function_bind", "__commonJSMin", "exports", "module", "implementation", "require_shams", "__commonJSMin", "exports", "module", "obj", "sym", "symObj", "symVal", "syms", "descriptor", "require_has_symbols", "__commonJSMin", "exports", "module", "origSymbol", "hasSymbolSham", "require_src", "__commonJSMin", "exports", "module", "bind", "require_get_intrinsic", "__commonJSMin", "exports", "module", "undefined", "$SyntaxError", "$Function", "$TypeError", "getEvalledConstructor", "expressionSyntax", "$gOPD", "throwTypeError", "ThrowTypeError", "hasSymbols", "getProto", "x", "needsEval", "TypedArray", "INTRINSICS", "doEval", "name", "value", "fn", "gen", "LEGACY_ALIASES", "bind", "hasOwn", "$concat", "$spliceApply", "$replace", "$strSlice", "rePropName", "reEscapeChar", "stringToPath", "string", "first", "last", "result", "match", "number", "quote", "subString", "getBaseIntrinsic", "allowMissing", "intrinsicName", "alias", "parts", "intrinsicBaseName", "intrinsic", "intrinsicRealName", "skipFurtherCaching", "i", "isOwn", "part", "desc", "require_call_bind", "__commonJSMin", "exports", "module", "bind", "GetIntrinsic", "$apply", "$call", "$reflectApply", "$gOPD", "$defineProperty", "$max", "originalFunction", "func", "desc", "applyBind", "require_GetIntrinsic", "__commonJSMin", "exports", "module", "undefined", "$SyntaxError", "$Function", "$TypeError", "getEvalledConstructor", "expressionSyntax", "$gOPD", "throwTypeError", "ThrowTypeError", "hasSymbols", "getProto", "x", "asyncGenFunction", "asyncGenFunctionPrototype", "asyncGenPrototype", "TypedArray", "INTRINSICS", "LEGACY_ALIASES", "bind", "hasOwn", "$concat", "$spliceApply", "$replace", "rePropName", "reEscapeChar", "stringToPath", "string", "result", "match", "number", "quote", "subString", "getBaseIntrinsic", "name", "allowMissing", "intrinsicName", "alias", "value", "parts", "intrinsicBaseName", "intrinsic", "intrinsicRealName", "skipFurtherCaching", "i", "isOwn", "part", "desc", "require_object_inspect", "__commonJSMin", "exports", "module", "hasMap", "mapSizeDescriptor", "mapSize", "mapForEach", "hasSet", "setSizeDescriptor", "setSize", "setForEach", "hasWeakMap", "weakMapHas", "hasWeakSet", "weakSetHas", "hasWeakRef", "weakRefDeref", "booleanValueOf", "objectToString", "functionToString", "match", "bigIntValueOf", "gOPS", "symToString", "hasShammedSymbols", "isEnumerable", "gPO", "O", "inspectCustom", "inspectSymbol", "isSymbol", "toStringTag", "inspect_", "obj", "options", "depth", "seen", "opts", "has", "customInspect", "inspectString", "maxDepth", "isArray", "indent", "getIndent", "indexOf", "inspect", "value", "from", "noIndent", "newOpts", "name", "nameOf", "keys", "arrObjKeys", "symString", "markBoxed", "isElement", "s", "attrs", "i", "wrapQuotes", "quote", "xs", "singleLineValues", "indentedJoin", "isError", "parts", "isMap", "mapParts", "key", "collectionOf", "isSet", "setParts", "isWeakMap", "weakCollectionOf", "isWeakSet", "isWeakRef", "isNumber", "isBigInt", "isBoolean", "isString", "isDate", "isRegExp", "ys", "isPlainObject", "protoTag", "stringTag", "toStr", "constructorTag", "tag", "defaultStyle", "quoteChar", "hasOwn", "f", "m", "x", "l", "str", "remaining", "trailer", "lowbyte", "c", "n", "type", "size", "entries", "joinedEntries", "baseIndent", "lineJoiner", "isArr", "syms", "symMap", "k", "j", "require_IsPropertyKey", "__commonJSMin", "exports", "module", "argument", "require_Type", "__commonJSMin", "exports", "module", "x", "require_Type", "__commonJSMin", "exports", "module", "ES5Type", "x", "require_Get", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "inspect", "IsPropertyKey", "Type", "O", "P", "require_callBind", "__commonJSMin", "exports", "module", "bind", "GetIntrinsic", "$apply", "$call", "$reflectApply", "$defineProperty", "applyBind", "require_callBound", "__commonJSMin", "exports", "module", "GetIntrinsic", "callBind", "$indexOf", "name", "allowMissing", "intrinsic", "require_IsArray", "__commonJSMin", "exports", "module", "GetIntrinsic", "$Array", "toStr", "argument", "require_isPropertyDescriptor", "__commonJSMin", "exports", "module", "GetIntrinsic", "has", "$TypeError", "ES", "Desc", "allowed", "key", "require_DefineOwnProperty", "__commonJSMin", "exports", "module", "GetIntrinsic", "$defineProperty", "callBound", "$isEnumerable", "IsDataDescriptor", "SameValue", "FromPropertyDescriptor", "O", "P", "desc", "V", "require_assertRecord", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "$SyntaxError", "has", "predicates", "Type", "Desc", "allowed", "key", "isData", "IsAccessor", "recordType", "argumentName", "value", "predicate", "require_FromPropertyDescriptor", "__commonJSMin", "exports", "module", "assertRecord", "Type", "Desc", "obj", "require_IsAccessorDescriptor", "__commonJSMin", "exports", "module", "has", "assertRecord", "Type", "Desc", "require_IsDataDescriptor", "__commonJSMin", "exports", "module", "has", "assertRecord", "Type", "Desc", "require_isNaN", "__commonJSMin", "exports", "module", "a", "require_SameValue", "__commonJSMin", "exports", "module", "$isNaN", "x", "y", "require_ToBoolean", "__commonJSMin", "exports", "module", "value", "require_is_callable", "__commonJSMin", "exports", "module", "fnToStr", "reflectApply", "badArrayLike", "isCallableMarker", "_", "constructorRegex", "isES6ClassFn", "value", "fnStr", "tryFunctionObject", "toStr", "fnClass", "genClass", "hasToStringTag", "e", "strClass", "require_IsCallable", "__commonJSMin", "exports", "module", "require_ToPropertyDescriptor", "__commonJSMin", "exports", "module", "has", "GetIntrinsic", "$TypeError", "Type", "ToBoolean", "IsCallable", "Obj", "desc", "getter", "setter", "require_DefinePropertyOrThrow", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "isPropertyDescriptor", "DefineOwnProperty", "FromPropertyDescriptor", "IsAccessorDescriptor", "IsDataDescriptor", "IsPropertyKey", "SameValue", "ToPropertyDescriptor", "Type", "O", "P", "desc", "Desc", "require_IsConstructor", "__commonJSMin", "exports", "module", "GetIntrinsic", "$construct", "DefinePropertyOrThrow", "isConstructorMarker", "badArrayLike", "argument", "err", "require_abs", "__commonJSMin", "exports", "module", "GetIntrinsic", "$abs", "x", "require_floor", "__commonJSMin", "exports", "module", "$floor", "x", "require_isFinite", "__commonJSMin", "exports", "module", "$isNaN", "a", "x", "require_IsInteger", "__commonJSMin", "exports", "module", "abs", "floor", "$isNaN", "$isFinite", "argument", "absValue", "require_ArraySpeciesCreate", "__commonJSMin", "exports", "module", "GetIntrinsic", "$Array", "$species", "$TypeError", "Get", "IsArray", "IsConstructor", "IsInteger", "Type", "originalArray", "length", "len", "C", "isArray", "require_maxSafeInteger", "__commonJSMin", "exports", "module", "GetIntrinsic", "$Math", "$Number", "require_Call", "__commonJSMin", "exports", "module", "GetIntrinsic", "callBound", "$apply", "F", "V", "args", "require_getOwnPropertyDescriptor", "__commonJSMin", "exports", "module", "GetIntrinsic", "$gOPD", "require_callBound", "__commonJSMin", "exports", "module", "GetIntrinsic", "callBind", "$indexOf", "name", "allowMissing", "intrinsic", "require_is_regex", "__commonJSMin", "exports", "module", "callBound", "hasSymbols", "hasToStringTag", "has", "$exec", "isRegexMarker", "badStringifier", "throwRegexMarker", "$toString", "gOPD", "regexClass", "value", "descriptor", "hasLastIndexDataProperty", "e", "require_IsRegExp", "__commonJSMin", "exports", "module", "GetIntrinsic", "$match", "hasRegExpMatcher", "ToBoolean", "argument", "isRegExp", "require_OrdinaryGetOwnProperty", "__commonJSMin", "exports", "module", "GetIntrinsic", "$gOPD", "$TypeError", "callBound", "$isEnumerable", "has", "IsArray", "IsPropertyKey", "IsRegExp", "ToPropertyDescriptor", "Type", "O", "P", "arrayLength", "regexLastIndex", "require_isPrimitive", "__commonJSMin", "exports", "module", "value", "require_IsExtensible", "__commonJSMin", "exports", "module", "GetIntrinsic", "$Object", "isPrimitive", "$preventExtensions", "$isExtensible", "obj", "require_CreateDataProperty", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "DefineOwnProperty", "FromPropertyDescriptor", "OrdinaryGetOwnProperty", "IsDataDescriptor", "IsExtensible", "IsPropertyKey", "SameValue", "Type", "O", "P", "V", "oldDesc", "extensible", "immutable", "require_CreateDataPropertyOrThrow", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "CreateDataProperty", "IsPropertyKey", "Type", "O", "P", "V", "success", "require_HasProperty", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "IsPropertyKey", "Type", "O", "P", "require_abs", "__commonJSMin", "exports", "module", "GetIntrinsic", "$abs", "x", "require_floor", "__commonJSMin", "exports", "module", "$floor", "x", "require_ToNumber", "__commonJSMin", "exports", "module", "value", "require_sign", "__commonJSMin", "exports", "module", "number", "require_ToInteger", "__commonJSMin", "exports", "module", "abs", "floor", "ToNumber", "$isNaN", "$isFinite", "$sign", "value", "number", "require_regexTester", "__commonJSMin", "exports", "module", "GetIntrinsic", "$test", "callBind", "regex", "require_isPrimitive", "__commonJSMin", "exports", "module", "value", "require_is_callable", "__commonJSMin", "exports", "module", "fnToStr", "reflectApply", "badArrayLike", "isCallableMarker", "constructorRegex", "isES6ClassFn", "value", "fnStr", "tryFunctionObject", "toStr", "fnClass", "genClass", "hasToStringTag", "e", "strClass", "require_is_date_object", "__commonJSMin", "exports", "module", "getDay", "tryDateObject", "value", "toStr", "dateClass", "hasToStringTag", "require_is_symbol", "__commonJSMin", "exports", "module", "toStr", "hasSymbols", "symToStr", "symStringRegex", "isSymbolObject", "value", "require_es2015", "__commonJSMin", "exports", "module", "hasSymbols", "isPrimitive", "isCallable", "isDate", "isSymbol", "ordinaryToPrimitive", "O", "hint", "methodNames", "method", "result", "i", "GetMethod", "P", "func", "input", "exoticToPrim", "require_ToPrimitive", "__commonJSMin", "exports", "module", "toPrimitive", "input", "require_ToNumber", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "$Number", "$RegExp", "$parseInteger", "callBound", "regexTester", "isPrimitive", "$strSlice", "isBinary", "isOctal", "isInvalidHexLiteral", "nonWS", "nonWSregex", "hasNonWS", "ws", "trimRegex", "$replace", "$trim", "value", "ToPrimitive", "ToNumber", "argument", "trimmed", "require_ToInteger", "__commonJSMin", "exports", "module", "ES5ToInteger", "ToNumber", "value", "number", "require_ToLength", "__commonJSMin", "exports", "module", "MAX_SAFE_INTEGER", "ToInteger", "argument", "len", "require_LengthOfArrayLike", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "Get", "ToLength", "Type", "obj", "require_ToString", "__commonJSMin", "exports", "module", "GetIntrinsic", "$String", "$TypeError", "argument", "require_FlattenIntoArray", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "MAX_SAFE_INTEGER", "Call", "CreateDataPropertyOrThrow", "Get", "HasProperty", "IsArray", "LengthOfArrayLike", "ToString", "FlattenIntoArray", "target", "source", "sourceLen", "start", "depth", "mapperFunction", "targetIndex", "sourceIndex", "P", "exists", "element", "shouldFlatten", "elementLen", "require_CheckObjectCoercible", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "value", "optMessage", "require_RequireObjectCoercible", "__commonJSMin", "exports", "module", "require_ToObject", "__commonJSMin", "exports", "module", "GetIntrinsic", "$Object", "RequireObjectCoercible", "value", "require_implementation", "__commonJSMin", "exports", "module", "ArraySpeciesCreate", "FlattenIntoArray", "Get", "ToInteger", "ToLength", "ToObject", "O", "sourceLen", "depthNum", "A", "require_polyfill", "__commonJSMin", "exports", "module", "implementation", "require_shim", "__commonJSMin", "exports", "module", "define", "getPolyfill", "polyfill", "require_array_prototype", "__commonJSMin", "exports", "module", "define", "callBind", "implementation", "getPolyfill", "polyfill", "shim", "boundFlat", "require_global_cache", "__commonJSMin", "exports", "module", "define", "isSymbol", "globalKey", "trueThunk", "ensureCache", "properties", "predicates", "cache", "isPrimitive", "val", "getPrimitiveKey", "requirePrimitiveKey", "globalCache", "key", "value", "primitiveKey", "props", "valueThunk", "item", "require_constants", "__commonJSMin", "exports", "GLOBAL_CACHE_KEY", "MAX_SPECIFICITY", "require_getClassName", "__commonJSMin", "exports", "getClassName", "namespace", "styleName", "namespaceSegment", "require_separateStyles", "__commonJSMin", "exports", "separateStyles", "stylesArray", "classNames", "hasInlineStyles", "inlineStyles", "style", "_default", "require_dist", "__commonJSMin", "exports", "_interopRequireDefault", "_arrayPrototype", "_globalCache", "_constants", "_getClassName", "_separateStyles2", "create", "stylesObject", "stylesToClasses", "styleNames", "sharedState", "_sharedState$namespac", "namespace", "styleName", "className", "resolve", "stylesArray", "flattenedStyles", "_separateStyles", "classNames", "hasInlineStyles", "inlineStyles", "specificClassNames", "name", "index", "result", "_default", "require_react_with_styles_interface_css", "__commonJSMin", "exports", "module", "require_ThemedStyleSheet", "__commonJSMin", "exports", "_getInterface", "get", "styleInterface", "styleTheme", "registerTheme", "theme", "registerInterface", "interfaceToRegister", "create", "makeFromTheme", "createWithDirection", "styles", "createLTR", "createRTL", "resolve", "_len", "_key", "result", "resolveLTR", "_len2", "_key2", "resolveRTL", "_len3", "_key3", "flush", "_default", "require_DefaultTheme", "__commonJSMin", "exports", "core", "_default", "require_registerInterfaceWithDefaultTheme", "__commonJSMin", "exports", "_interopRequireDefault", "registerInterfaceWithDefaultTheme", "_ThemedStyleSheet", "_DefaultTheme", "reactWithStylesInterface", "require_registerCSSInterfaceWithDefaultTheme", "__commonJSMin", "exports", "_interopRequireDefault", "registerCSSInterfaceWithDefaultTheme", "_reactWithStylesInterfaceCss", "_registerInterfaceWithDefaultTheme", "require_initialize", "__commonJSMin", "_interopRequireDefault", "_registerCSSInterfaceWithDefaultTheme", "init_initialize", "__esmMin", "require_implementation", "__commonJSMin", "exports", "module", "numberIsNaN", "value", "a", "b", "require_polyfill", "__commonJSMin", "exports", "module", "implementation", "require_shim", "__commonJSMin", "exports", "module", "getPolyfill", "define", "polyfill", "require_object_is", "__commonJSMin", "exports", "module", "define", "callBind", "implementation", "getPolyfill", "shim", "polyfill", "_objectIs", "_interopRequireDefault", "_has", "shallowEqual", "objA", "objB", "_typeof", "keysA", "Object", "keys", "keysB", "length", "sort", "i", "require_extends", "__commonJSMin", "exports", "module", "_extends", "n", "r", "require_assertThisInitialized", "__commonJSMin", "exports", "module", "_assertThisInitialized", "e", "require_setPrototypeOf", "__commonJSMin", "exports", "module", "_setPrototypeOf", "t", "e", "require_inheritsLoose", "__commonJSMin", "exports", "module", "setPrototypeOf", "_inheritsLoose", "t", "o", "require_typeof", "__commonJSMin", "exports", "module", "_typeof", "o", "require_toPrimitive", "__commonJSMin", "exports", "module", "_typeof", "toPrimitive", "t", "r", "e", "i", "require_toPropertyKey", "__commonJSMin", "exports", "module", "_typeof", "toPrimitive", "toPropertyKey", "t", "i", "require_defineProperty", "__commonJSMin", "exports", "module", "toPropertyKey", "_defineProperty", "e", "r", "require_ReactPropTypesSecret", "__commonJSMin", "exports", "module", "ReactPropTypesSecret", "require_factoryWithThrowingShims", "__commonJSMin", "exports", "module", "ReactPropTypesSecret", "emptyFunction", "emptyFunctionWithReset", "shim", "props", "propName", "componentName", "location", "propFullName", "secret", "err", "getShim", "ReactPropTypes", "require_prop_types", "__commonJSMin", "exports", "module", "ReactIs", "throwOnDirectAccess", "require_moment", "__commonJSMin", "exports", "module", "global", "factory", "hookCallback", "hooks", "setHookCallback", "callback", "isArray", "input", "isObject", "hasOwnProp", "a", "b", "isObjectEmpty", "obj", "k", "isUndefined", "isNumber", "isDate", "map", "arr", "fn", "res", "i", "arrLen", "extend", "createUTC", "format", "locale", "strict", "createLocalOrUTC", "defaultParsingFlags", "getParsingFlags", "m", "some", "fun", "t", "len", "isValid", "flags", "parsedParts", "isNowValid", "createInvalid", "momentProperties", "updateInProgress", "copyConfig", "to", "from", "prop", "val", "momentPropertiesLen", "Moment", "config", "isMoment", "warn", "msg", "deprecate", "firstTime", "args", "arg", "key", "argLen", "deprecations", "deprecateSimple", "name", "isFunction", "set", "mergeConfigs", "parentConfig", "childConfig", "Locale", "keys", "defaultCalendar", "calendar", "mom", "now", "output", "zeroFill", "number", "targetLength", "forceSign", "absNumber", "zerosToFill", "sign", "formattingTokens", "localFormattingTokens", "formatFunctions", "formatTokenFunctions", "addFormatToken", "token", "padded", "ordinal", "func", "removeFormattingTokens", "makeFormatFunction", "array", "length", "formatMoment", "expandFormat", "replaceLongDateFormatTokens", "defaultLongDateFormat", "longDateFormat", "formatUpper", "tok", "defaultInvalidDate", "invalidDate", "defaultOrdinal", "defaultDayOfMonthOrdinalParse", "defaultRelativeTime", "relativeTime", "withoutSuffix", "string", "isFuture", "pastFuture", "diff", "aliases", "normalizeUnits", "units", "normalizeObjectUnits", "inputObject", "normalizedInput", "normalizedProp", "priorities", "getPrioritizedUnits", "unitsObj", "u", "match1", "match2", "match3", "match4", "match6", "match1to2", "match3to4", "match5to6", "match1to3", "match1to4", "match1to6", "matchUnsigned", "matchSigned", "matchOffset", "matchShortOffset", "matchTimestamp", "matchWord", "match1to2NoLeadingZero", "match1to2HasZero", "regexes", "addRegexToken", "regex", "strictRegex", "isStrict", "localeData", "getParseRegexForToken", "unescapeFormat", "s", "regexEscape", "matched", "p1", "p2", "p3", "p4", "absFloor", "toInt", "argumentForCoercion", "coercedNumber", "value", "tokens", "addParseToken", "tokenLen", "addWeekParseToken", "addTimeToArrayFromToken", "isLeapYear", "year", "YEAR", "MONTH", "DATE", "HOUR", "MINUTE", "SECOND", "MILLISECOND", "WEEK", "WEEKDAY", "y", "daysInYear", "getSetYear", "makeGetSet", "getIsLeapYear", "unit", "keepTime", "set$1", "get", "d", "isUTC", "month", "date", "stringGet", "stringSet", "prioritized", "prioritizedLen", "mod", "n", "x", "indexOf", "o", "daysInMonth", "modMonth", "defaultLocaleMonths", "defaultLocaleMonthsShort", "MONTHS_IN_FORMAT", "defaultMonthsShortRegex", "defaultMonthsRegex", "localeMonths", "localeMonthsShort", "handleStrictParse", "monthName", "ii", "llc", "localeMonthsParse", "setMonth", "getSetMonth", "getDaysInMonth", "monthsShortRegex", "computeMonthsParse", "monthsRegex", "cmpLenRev", "shortPieces", "longPieces", "mixedPieces", "shortP", "longP", "createDate", "h", "M", "ms", "createUTCDate", "firstWeekOffset", "dow", "doy", "fwd", "fwdlw", "dayOfYearFromWeeks", "week", "weekday", "localWeekday", "weekOffset", "dayOfYear", "resYear", "resDayOfYear", "weekOfYear", "resWeek", "weeksInYear", "weekOffsetNext", "localeWeek", "defaultLocaleWeek", "localeFirstDayOfWeek", "localeFirstDayOfYear", "getSetWeek", "getSetISOWeek", "parseWeekday", "parseIsoWeekday", "shiftWeekdays", "ws", "defaultLocaleWeekdays", "defaultLocaleWeekdaysShort", "defaultLocaleWeekdaysMin", "defaultWeekdaysRegex", "defaultWeekdaysShortRegex", "defaultWeekdaysMinRegex", "localeWeekdays", "weekdays", "localeWeekdaysShort", "localeWeekdaysMin", "handleStrictParse$1", "weekdayName", "localeWeekdaysParse", "getSetDayOfWeek", "day", "getSetLocaleDayOfWeek", "getSetISODayOfWeek", "weekdaysRegex", "computeWeekdaysParse", "weekdaysShortRegex", "weekdaysMinRegex", "minPieces", "minp", "shortp", "longp", "hFormat", "kFormat", "meridiem", "lowercase", "matchMeridiem", "kInput", "pos", "pos1", "pos2", "localeIsPM", "defaultLocaleMeridiemParse", "getSetHour", "localeMeridiem", "hours", "minutes", "isLower", "baseConfig", "locales", "localeFamilies", "globalLocale", "commonPrefix", "arr1", "arr2", "minl", "normalizeLocale", "chooseLocale", "names", "j", "next", "split", "loadLocale", "isLocaleNameSane", "oldLocale", "aliasedRequire", "__require", "getSetGlobalLocale", "values", "data", "getLocale", "defineLocale", "updateLocale", "tmpLocale", "listLocales", "checkOverflow", "overflow", "extendedIsoRegex", "basicIsoRegex", "tzRegex", "isoDates", "isoTimes", "aspNetJsonRegex", "rfc2822", "obsOffsets", "configFromISO", "l", "match", "allowTime", "dateFormat", "timeFormat", "tzFormat", "isoDatesLen", "isoTimesLen", "configFromStringAndFormat", "extractFromRFC2822Strings", "yearStr", "monthStr", "dayStr", "hourStr", "minuteStr", "secondStr", "result", "untruncateYear", "preprocessRFC2822", "checkWeekday", "weekdayStr", "parsedInput", "weekdayProvided", "weekdayActual", "calculateOffset", "obsOffset", "militaryOffset", "numOffset", "hm", "configFromRFC2822", "parsedArray", "configFromString", "defaults", "c", "currentDateArray", "nowValue", "configFromArray", "currentDate", "expectedWeekday", "yearToUse", "dayOfYearFromWeekInfo", "w", "weekYear", "temp", "weekdayOverflow", "curWeek", "createLocal", "skipped", "stringLength", "totalParsedInputLength", "era", "meridiemFixWrap", "hour", "isPm", "configFromStringAndArray", "tempConfig", "bestMoment", "scoreToBeat", "currentScore", "validFormatFound", "bestFormatIsValid", "configfLen", "configFromObject", "dayOrDate", "createFromConfig", "prepareConfig", "configFromInput", "prototypeMin", "other", "prototypeMax", "pickBy", "moments", "min", "max", "ordering", "isDurationValid", "unitHasDecimal", "orderLen", "isValid$1", "createInvalid$1", "createDuration", "Duration", "duration", "years", "quarters", "months", "weeks", "days", "seconds", "milliseconds", "isDuration", "absRound", "compareArrays", "array1", "array2", "dontConvert", "lengthDiff", "diffs", "offset", "separator", "offsetFromString", "chunkOffset", "matcher", "matches", "chunk", "parts", "cloneWithOffset", "model", "getDateOffset", "getSetOffset", "keepLocalTime", "keepMinutes", "localAdjust", "addSubtract", "getSetZone", "setOffsetToUTC", "setOffsetToLocal", "setOffsetToParsedOffset", "tZone", "hasAlignedHourOffset", "isDaylightSavingTime", "isDaylightSavingTimeShifted", "isLocal", "isUtcOffset", "isUtc", "aspNetRegex", "isoRegex", "ret", "diffRes", "parseIso", "momentsDifference", "inp", "positiveMomentsDifference", "base", "createAdder", "direction", "period", "dur", "tmp", "isAdding", "updateOffset", "add", "subtract", "isString", "isMomentInput", "isNumberOrStringArray", "isMomentInputObject", "objectTest", "propertyTest", "properties", "property", "propertyLen", "arrayTest", "dataTypeTest", "item", "isCalendarSpec", "getCalendarFormat", "myMoment", "calendar$1", "time", "formats", "sod", "clone", "isAfter", "localInput", "isBefore", "isBetween", "inclusivity", "localFrom", "localTo", "isSame", "inputMs", "isSameOrAfter", "isSameOrBefore", "asFloat", "that", "zoneDelta", "monthDiff", "wholeMonthDiff", "anchor", "anchor2", "adjust", "toString", "toISOString", "keepOffset", "utc", "inspect", "zone", "prefix", "datetime", "suffix", "inputString", "fromNow", "toNow", "newLocaleData", "lang", "MS_PER_SECOND", "MS_PER_MINUTE", "MS_PER_HOUR", "MS_PER_400_YEARS", "mod$1", "dividend", "divisor", "localStartOfDate", "utcStartOfDate", "startOf", "startOfDate", "endOf", "valueOf", "unix", "toDate", "toArray", "toObject", "toJSON", "isValid$2", "parsingFlags", "invalidAt", "creationData", "matchEraAbbr", "matchEraName", "matchEraNarrow", "matchEraYearOrdinal", "localeEras", "eras", "localeErasParse", "eraName", "abbr", "narrow", "localeErasConvertYear", "dir", "getEraName", "getEraNarrow", "getEraAbbr", "getEraYear", "erasNameRegex", "computeErasParse", "erasAbbrRegex", "erasNarrowRegex", "abbrPieces", "namePieces", "narrowPieces", "erasName", "erasAbbr", "erasNarrow", "addWeekYearFormatToken", "getter", "getSetWeekYear", "getSetWeekYearHelper", "getSetISOWeekYear", "getISOWeeksInYear", "getISOWeeksInISOWeekYear", "getWeeksInYear", "weekInfo", "getWeeksInWeekYear", "weeksTarget", "setWeekAll", "dayOfYearData", "getSetQuarter", "getSetDayOfMonth", "getSetDayOfYear", "getSetMinute", "getSetSecond", "getSetMillisecond", "parseMs", "getZoneAbbr", "getZoneName", "proto", "createUnix", "createInZone", "preParsePostFormat", "proto$1", "get$1", "index", "field", "setter", "listMonthsImpl", "out", "listWeekdaysImpl", "localeSorted", "shift", "listMonths", "listMonthsShort", "listWeekdays", "listWeekdaysShort", "listWeekdaysMin", "mathAbs", "abs", "addSubtract$1", "add$1", "subtract$1", "absCeil", "bubble", "monthsFromDays", "monthsToDays", "daysToMonths", "as", "makeAs", "alias", "asMilliseconds", "asSeconds", "asMinutes", "asHours", "asDays", "asWeeks", "asMonths", "asQuarters", "asYears", "valueOf$1", "clone$1", "get$2", "makeGetter", "round", "thresholds", "substituteTimeAgo", "relativeTime$1", "posNegDuration", "getSetRelativeTimeRounding", "roundingFunction", "getSetRelativeTimeThreshold", "threshold", "limit", "humanize", "argWithSuffix", "argThresholds", "withSuffix", "th", "abs$1", "toISOString$1", "total", "totalSign", "ymSign", "daysSign", "hmsSign", "proto$2", "require_moment_validation_wrapper", "__commonJSMin", "exports", "module", "moment", "isValidMoment", "testMoment", "require_core", "__commonJSMin", "exports", "module", "messages", "constructPropValidatorVariations", "propValidator", "requiredPropValidator", "predicate", "basePropValidator", "createInvalidRequiredErrorMessage", "propName", "componentName", "value", "independentGuardianValue", "preValidationRequireCheck", "isRequired", "propFullName", "propValue", "isPropValueUndefined", "isPropValueNull", "createMomentChecker", "type", "typeValidator", "validator", "momentType", "props", "location", "propType", "preValidationRequireCheckValue", "predicateName", "require_src", "__commonJSMin", "exports", "module", "moment", "momentValidationWrapper", "core", "obj", "value", "str", "noop", "isRequired", "noopThunk", "module", "exports", "and", "between", "booleanSome", "childrenHavePropXorChildren", "childrenOf", "childrenOfType", "childrenSequenceOf", "componentWithName", "disallowedIf", "elementType", "empty", "explicitNull", "forbidExtraProps", "Object", "integer", "keysOf", "mutuallyExclusiveProps", "mutuallyExclusiveTrueProps", "nChildren", "nonNegativeInteger", "nonNegativeNumber", "numericString", "object", "or", "predicate", "range", "ref", "requiredBy", "restrictedProp", "sequenceOf", "shape", "stringEndsWith", "stringStartsWith", "uniqueArray", "uniqueArrayOf", "valuesOf", "withShape", "require_airbnb_prop_types", "__commonJSMin", "exports", "module", "require_interopRequireWildcard", "__commonJSMin", "exports", "module", "_typeof", "_interopRequireWildcard", "e", "t", "r", "o", "i", "f", "_t", "require_react_is_production_min", "__commonJSMin", "exports", "b", "c", "d", "e", "f", "g", "h", "k", "l", "m", "n", "p", "q", "r", "t", "v", "w", "x", "y", "z", "a", "u", "A", "require_react_is", "__commonJSMin", "exports", "module", "require_hoist_non_react_statics_cjs", "__commonJSMin", "exports", "module", "reactIs", "REACT_STATICS", "KNOWN_STATICS", "FORWARD_REF_STATICS", "MEMO_STATICS", "TYPE_STATICS", "getStatics", "component", "defineProperty", "getOwnPropertyNames", "getOwnPropertySymbols", "getOwnPropertyDescriptor", "getPrototypeOf", "objectPrototype", "hoistNonReactStatics", "targetComponent", "sourceComponent", "blacklist", "inheritedComponent", "keys", "targetStatics", "sourceStatics", "i", "key", "descriptor", "require_is_callable", "__commonJSMin", "exports", "module", "fnToStr", "reflectApply", "badArrayLike", "isCallableMarker", "_", "constructorRegex", "isES6ClassFn", "value", "fnStr", "tryFunctionObject", "toStr", "fnClass", "genClass", "hasToStringTag", "documentDotAll", "e", "strClass", "require_IsCallable", "__commonJSMin", "exports", "module", "require_functions_have_names", "__commonJSMin", "exports", "module", "functionsHaveNames", "gOPD", "$bind", "require_implementation", "__commonJSMin", "exports", "module", "IsCallable", "functionsHaveNames", "callBound", "$functionToString", "$stringMatch", "classRegex", "isClass", "fn", "match", "regex", "functionProto", "str", "name", "require_polyfill", "__commonJSMin", "exports", "module", "implementation", "require_shim", "__commonJSMin", "exports", "module", "supportsDescriptors", "functionsHaveNames", "getPolyfill", "defineProperty", "TypeErr", "polyfill", "functionProto", "name", "require_function_prototype", "__commonJSMin", "exports", "module", "define", "callBind", "implementation", "getPolyfill", "shim", "bound", "_functionPrototype", "_interopRequireDefault", "_reactIs", "getComponentName", "Component", "displayName", "type", "$$typeof", "Element", "require_emptyStylesFn", "__commonJSMin", "exports", "EMPTY_STYLES", "EMPTY_STYLES_FN", "_default", "require_perf", "__commonJSMin", "exports", "perfStart", "perfEnd", "withPerf", "startMark", "endMark", "measureName", "methodName", "fn", "result", "require_cjs", "__commonJSMin", "exports", "module", "isMergeableObject", "value", "isNonNullObject", "isSpecial", "stringValue", "isReactElement", "canUseSymbol", "REACT_ELEMENT_TYPE", "emptyTarget", "val", "cloneIfNecessary", "optionsArgument", "clone", "deepmerge", "defaultArrayMerge", "target", "source", "destination", "e", "i", "mergeObject", "key", "sourceIsArray", "targetIsArray", "options", "sourceAndTargetTypesMatch", "arrayMerge", "array", "prev", "next", "deepmerge_1", "require_constants", "__commonJSMin", "exports", "CHANNEL", "DIRECTIONS", "require_brcast", "__commonJSMin", "exports", "_propTypes", "_propTypes2", "_interopRequireDefault", "obj", "require_CheckObjectCoercible", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "value", "optMessage", "require_RequireObjectCoercible", "__commonJSMin", "exports", "module", "require_implementation", "__commonJSMin", "exports", "module", "has", "RequireObjectCoercible", "callBound", "$isEnumerable", "O", "obj", "vals", "key", "require_polyfill", "__commonJSMin", "exports", "module", "implementation", "require_shim", "__commonJSMin", "exports", "module", "getPolyfill", "define", "polyfill", "require_object", "__commonJSMin", "exports", "module", "define", "callBind", "implementation", "getPolyfill", "shim", "polyfill", "require_direction", "__commonJSMin", "exports", "_object", "_object2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_constants", "obj", "require_withDirection", "__commonJSMin", "exports", "_extends", "target", "i", "source", "key", "_createClass", "defineProperties", "props", "descriptor", "Constructor", "protoProps", "staticProps", "withDirection", "_react", "_react2", "_interopRequireDefault", "_hoistNonReactStatics", "_hoistNonReactStatics2", "_deepmerge", "_deepmerge2", "_getComponentName", "_getComponentName2", "_constants", "_brcast", "_brcast2", "_direction", "_direction2", "obj", "_classCallCheck", "instance", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "_defineProperty", "value", "contextTypes", "defaultDirection", "withDirectionPropTypes", "WrappedComponent", "WithDirection", "_React$Component", "context", "_this", "componentDidMount", "_this2", "direction", "componentWillUnmount", "render", "wrappedComponentName", "require_WithStylesContext", "__commonJSMin", "exports", "_interopRequireDefault", "_reactWithDirection", "_react", "_propTypes", "detectAndCreateContext", "defaultValue", "WithStylesContext", "_default", "require_withStylesPropTypes", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "withStylesPropTypes", "_default", "require_withStyles", "__commonJSMin", "exports", "_interopRequireWildcard", "_interopRequireDefault", "withStyles", "_withStylesPropTypes", "_extends2", "_defineProperty2", "_inheritsLoose2", "_react", "_hoistNonReactStatics", "_getComponentName", "_emptyStylesFn", "_perf", "_WithStylesContext", "_ThemedStyleSheet", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "stylesFn", "_ref", "_ref$stylesPropName", "stylesPropName", "_ref$themePropName", "themePropName", "_ref$cssPropName", "cssPropName", "_ref$flushBefore", "flushBefore", "_ref$pureComponent", "pureComponent", "BaseClass", "stylesFnResultCacheMap", "getOrCreateStylesFnResultCache", "theme", "cachedResultForTheme", "stylesFnResult", "withStylesCache", "getComponentCache", "component", "direction", "themeCache", "componentCache", "updateComponentCache", "results", "makeCreateFn", "stylesInterface", "directionSelector", "create", "makeResolveFn", "resolve", "WrappedComponent", "wrappedComponentName", "WithStyles", "_BaseClass", "_proto", "interfaceChanged", "themeChanged", "css", "_len", "args", "_key", "styles", "props", "_ref2", "_this$getProps", "_default", "getNanoSeconds", "hrtime", "loadTime", "moduleLoadTime", "nodeLoadTime", "upTime", "module", "hr", "require_raf", "__commonJSMin", "exports", "module", "now", "root", "vendors", "suffix", "raf", "caf", "i", "last", "id", "queue", "frameDuration", "callback", "_now", "next", "cp", "e", "handle", "fn", "object", "require_defaultPhrases", "__commonJSMin", "exports", "calendarLabel", "roleDescription", "closeDatePicker", "focusStartDate", "clearDate", "clearDates", "jumpToPrevMonth", "jumpToNextMonth", "keyboardShortcuts", "showKeyboardShortcutsPanel", "hideKeyboardShortcutsPanel", "openThisPanel", "enterKey", "leftArrowRightArrow", "upArrowDownArrow", "pageUpPageDown", "homeEnd", "escape", "questionMark", "selectFocusedDate", "moveFocusByOneDay", "moveFocusByOneWeek", "moveFocusByOneMonth", "moveFocustoStartAndEndOfWeek", "returnFocusToInput", "keyboardForwardNavigationInstructions", "keyboardBackwardNavigationInstructions", "chooseAvailableStartDate", "_ref", "date", "chooseAvailableEndDate", "_ref2", "chooseAvailableDate", "_ref3", "dateIsUnavailable", "_ref4", "dateIsSelected", "_ref5", "dateIsSelectedAsStartDate", "_ref6", "dateIsSelectedAsEndDate", "_ref7", "_default", "DateRangePickerPhrases", "DateRangePickerInputPhrases", "SingleDatePickerPhrases", "SingleDatePickerInputPhrases", "DayPickerPhrases", "DayPickerKeyboardShortcutsPhrases", "DayPickerNavigationPhrases", "CalendarDayPhrases", "require_getPhrasePropTypes", "__commonJSMin", "exports", "_interopRequireDefault", "getPhrasePropTypes", "_defineProperty2", "_propTypes", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "defaultPhrases", "phrases", "require_getPhrase", "__commonJSMin", "exports", "getPhrase", "phrase", "args", "require_constants", "__commonJSMin", "exports", "DISPLAY_FORMAT", "ISO_FORMAT", "ISO_MONTH_FORMAT", "START_DATE", "END_DATE", "HORIZONTAL_ORIENTATION", "VERTICAL_ORIENTATION", "VERTICAL_SCROLLABLE", "NAV_POSITION_BOTTOM", "NAV_POSITION_TOP", "ICON_BEFORE_POSITION", "ICON_AFTER_POSITION", "INFO_POSITION_TOP", "INFO_POSITION_BOTTOM", "INFO_POSITION_BEFORE", "INFO_POSITION_AFTER", "ANCHOR_LEFT", "ANCHOR_RIGHT", "OPEN_DOWN", "OPEN_UP", "DAY_SIZE", "BLOCKED_MODIFIER", "WEEKDAYS", "FANG_WIDTH_PX", "FANG_HEIGHT_PX", "DEFAULT_VERTICAL_SPACING", "MODIFIER_KEY_NAMES", "require_getCalendarDaySettings", "__commonJSMin", "exports", "_interopRequireDefault", "getCalendarDaySettings", "_getPhrase", "_constants", "isSelected", "modifiers", "shouldUseDefaultCursor", "isHoveredSpan", "getAriaLabel", "phrases", "day", "ariaLabelFormat", "chooseAvailableDate", "dateIsUnavailable", "dateIsSelected", "dateIsSelectedAsStartDate", "dateIsSelectedAsEndDate", "formattedDate", "daySize", "require_arrayLikeToArray", "__commonJSMin", "exports", "module", "_arrayLikeToArray", "a", "e", "require_arrayWithoutHoles", "__commonJSMin", "exports", "module", "arrayLikeToArray", "_arrayWithoutHoles", "require_iterableToArray", "__commonJSMin", "exports", "module", "_iterableToArray", "require_unsupportedIterableToArray", "__commonJSMin", "exports", "module", "arrayLikeToArray", "_unsupportedIterableToArray", "a", "require_nonIterableSpread", "__commonJSMin", "exports", "module", "_nonIterableSpread", "require_toConsumableArray", "__commonJSMin", "exports", "module", "arrayWithoutHoles", "iterableToArray", "unsupportedIterableToArray", "nonIterableSpread", "_toConsumableArray", "require_ModifiersShape", "__commonJSMin", "exports", "_interopRequireDefault", "_defineProperty2", "_toConsumableArray2", "_propTypes", "_airbnbPropTypes", "_default", "props", "propName", "_len", "rest", "_key", "propValue", "firstError", "v", "i", "_PropTypes$string", "fakePropName", "require_CalendarDay", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_reactWithStyles", "_moment", "_raf", "_defaultPhrases", "_getPhrasePropTypes", "_getCalendarDaySettings", "_ModifiersShape", "_constants", "defaultProps", "CalendarDay", "_ref", "_proto", "nextProps", "nextState", "_this", "_len", "args", "_key", "prevProps", "_this2", "_this$props", "isFocused", "tabIndex", "day", "e", "onDayClick", "onDayMouseEnter", "onDayMouseLeave", "key", "ref", "_this3", "_this$props2", "ariaLabelFormat", "daySize", "isOutsideDay", "modifiers", "renderDayContents", "styles", "phrases", "_getCalendarDaySettin", "daySizeStyles", "useDefaultCursor", "selected", "hoveredSpan", "isOutsideRange", "ariaLabel", "_default", "_ref2", "_ref2$reactDates", "color", "font", "require_CalendarWeek", "__commonJSMin", "exports", "_interopRequireDefault", "CalendarWeek", "_react", "_propTypes", "_airbnbPropTypes", "_ref", "children", "require_calculateDimension", "__commonJSMin", "exports", "calculateDimension", "el", "axis", "borderBox", "withMargin", "axisStart", "axisEnd", "style", "offsetWidth", "offsetHeight", "size", "require_getCalendarMonthWeeks", "__commonJSMin", "exports", "_interopRequireDefault", "getCalendarMonthWeeks", "_moment", "_constants", "month", "enableOutsideDays", "firstDayOfWeek", "firstOfMonth", "lastOfMonth", "prevDays", "nextDays", "firstDay", "lastDay", "totalDays", "currentDay", "weeksInMonth", "i", "day", "require_isSameDay", "__commonJSMin", "exports", "_interopRequireDefault", "isSameDay", "_moment", "a", "b", "require_toMomentObject", "__commonJSMin", "exports", "_interopRequireDefault", "toMomentObject", "_moment", "_constants", "dateString", "customFormat", "dateFormats", "date", "require_toISODateString", "__commonJSMin", "exports", "_interopRequireDefault", "toISODateString", "_moment", "_toMomentObject", "date", "currentFormat", "dateObj", "require_ScrollableOrientationShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_DayOfWeekShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_CalendarMonth", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_reactWithStyles", "_moment", "_defaultPhrases", "_getPhrasePropTypes", "_CalendarWeek", "_CalendarDay", "_calculateDimension", "_getCalendarMonthWeeks", "_isSameDay", "_toISODateString", "_ModifiersShape", "_ScrollableOrientationShape", "_DayOfWeekShape", "_constants", "defaultProps", "props", "CalendarMonth", "_ref", "_proto", "nextProps", "nextState", "_this", "month", "enableOutsideDays", "firstDayOfWeek", "_this$props", "prevMonth", "prevEnableOutsideDays", "prevFirstDayOfWeek", "setMonthTitleHeight", "captionHeight", "ref", "_this$props2", "dayAriaLabelFormat", "daySize", "focusedDate", "horizontalMonthPadding", "isFocused", "isVisible", "modifiers", "monthFormat", "onDayClick", "onDayMouseEnter", "onDayMouseLeave", "onMonthSelect", "onYearSelect", "orientation", "phrases", "renderCalendarDay", "renderDayContents", "renderMonthElement", "renderMonthText", "styles", "verticalBorderSpacing", "weeks", "monthTitle", "verticalScrollable", "week", "i", "day", "dayOfWeek", "_default", "_ref2", "_ref2$reactDates", "color", "font", "spacing", "require_lib", "__commonJSMin", "exports", "CAN_USE_DOM", "testPassiveEventListeners", "supportsPassiveOption", "opts", "get", "noop", "memoized", "canUsePassiveEventListeners", "normalizeEventOptions", "eventOptions", "eventOptionsKey", "normalizedEventOptions", "capture", "passive", "once", "ensureCanMutateNextEventHandlers", "eventHandlers", "TargetEventHandlers", "target", "getEventHandlers", "eventName", "options", "key", "handleEvent", "event", "handler", "add", "listener", "_this", "isSubscribed", "unsubscribe", "index", "EVENT_HANDLERS_KEY", "addEventListener", "require_noflip", "__commonJSMin", "exports", "noflip", "NOFLIP", "value", "require_isTransitionEndSupported", "__commonJSMin", "exports", "isTransitionEndSupported", "require_getTransformStyles", "__commonJSMin", "exports", "getTransformStyles", "transformValue", "require_getCalendarMonthWidth", "__commonJSMin", "exports", "getCalendarMonthWidth", "daySize", "calendarMonthPadding", "require_toISOMonthString", "__commonJSMin", "exports", "_interopRequireDefault", "toISOMonthString", "_moment", "_toMomentObject", "date", "currentFormat", "dateObj", "require_isSameMonth", "__commonJSMin", "exports", "_interopRequireDefault", "isSameMonth", "_moment", "a", "b", "require_isPrevMonth", "__commonJSMin", "exports", "_interopRequireDefault", "isPrevMonth", "_moment", "_isSameMonth", "a", "b", "require_isNextMonth", "__commonJSMin", "exports", "_interopRequireDefault", "isNextMonth", "_moment", "_isSameMonth", "a", "b", "require_CalendarMonthGrid", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_reactWithStyles", "_moment", "_consolidatedEvents", "_defaultPhrases", "_getPhrasePropTypes", "_noflip", "_CalendarMonth", "_isTransitionEndSupported", "_getTransformStyles", "_getCalendarMonthWidth", "_toISOMonthString", "_isPrevMonth", "_isNextMonth", "_ModifiersShape", "_ScrollableOrientationShape", "_DayOfWeekShape", "_constants", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "defaultProps", "getMonths", "initialMonth", "numberOfMonths", "withoutTransitionMonths", "month", "months", "CalendarMonthGrid", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "_this2", "orientation", "_this$props", "prevInitialMonth", "prevNumberOfMonths", "hasMonthChanged", "hasNumberOfMonthsChanged", "newMonths", "_withoutTransitionMonths", "momentLocale", "m", "_this$props2", "isAnimating", "transitionDuration", "onMonthTransitionEnd", "currentMonth", "newMonthVal", "newMonth", "_this$props3", "onMonthChange", "initialMonthSubtraction", "newYearVal", "_this$props4", "onYearChange", "ref", "_this3", "_this$props5", "enableOutsideDays", "firstVisibleMonthIndex", "horizontalMonthPadding", "modifiers", "monthFormat", "translationValue", "daySize", "onDayMouseEnter", "onDayMouseLeave", "onDayClick", "renderMonthText", "renderCalendarDay", "renderDayContents", "renderMonthElement", "firstDayOfWeek", "focusedDate", "isFocused", "isRTL", "styles", "phrases", "dayAriaLabelFormat", "verticalBorderSpacing", "setMonthTitleHeight", "isVertical", "isVerticalScrollable", "isHorizontal", "calendarMonthWidth", "width", "transformType", "transformValue", "isVisible", "hideForAnimation", "showForAnimation", "monthString", "_default", "_ref2", "_ref2$reactDates", "color", "spacing", "zIndex", "require_utils", "__commonJSMin", "exports", "canUseDOM", "require_Portal", "__commonJSMin", "exports", "_createClass", "defineProperties", "target", "props", "i", "descriptor", "Constructor", "protoProps", "staticProps", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_reactDom", "_reactDom2", "_utils", "obj", "_classCallCheck", "instance", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "Portal", "_React$Component", "require_LegacyPortal", "__commonJSMin", "exports", "_createClass", "defineProperties", "target", "props", "i", "descriptor", "Constructor", "protoProps", "staticProps", "_react", "_react2", "_interopRequireDefault", "_reactDom", "_reactDom2", "_propTypes", "_propTypes2", "obj", "_classCallCheck", "instance", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "Portal", "_React$Component", "children", "require_PortalCompat", "__commonJSMin", "exports", "_reactDom", "_reactDom2", "_interopRequireDefault", "_Portal", "_Portal2", "_LegacyPortal", "_LegacyPortal2", "obj", "Portal", "require_PortalWithState", "__commonJSMin", "exports", "_createClass", "defineProperties", "target", "props", "i", "descriptor", "Constructor", "protoProps", "staticProps", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_PortalCompat", "_PortalCompat2", "obj", "_classCallCheck", "instance", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "KEYCODES", "PortalWithState", "_React$Component", "_this", "e", "children", "_this2", "portalNode", "root", "require_lib", "__commonJSMin", "exports", "_PortalCompat", "_PortalCompat2", "_interopRequireDefault", "_PortalWithState", "_PortalWithState2", "obj", "require_build", "__commonJSMin", "exports", "module", "isTouchDevice", "require_GetIntrinsic", "__commonJSMin", "exports", "module", "undefined", "$TypeError", "$gOPD", "throwTypeError", "ThrowTypeError", "hasSymbols", "getProto", "x", "generator", "generatorFunction", "asyncFn", "asyncFunction", "asyncGen", "asyncGenFunction", "asyncGenIterator", "TypedArray", "INTRINSICS", "bind", "$replace", "rePropName", "reEscapeChar", "stringToPath", "string", "result", "match", "number", "quote", "subString", "getBaseIntrinsic", "name", "allowMissing", "parts", "value", "i", "desc", "require_CheckObjectCoercible", "__commonJSMin", "exports", "module", "GetIntrinsic", "$TypeError", "value", "optMessage", "require_RequireObjectCoercible", "__commonJSMin", "exports", "module", "require_callBind", "__commonJSMin", "exports", "module", "bind", "GetIntrinsic", "$apply", "$call", "$reflectApply", "require_callBound", "__commonJSMin", "exports", "module", "GetIntrinsic", "callBind", "$indexOf", "name", "allowMissing", "intrinsic", "require_implementation", "__commonJSMin", "exports", "module", "has", "RequireObjectCoercible", "callBound", "$isEnumerable", "O", "obj", "vals", "key", "require_polyfill", "__commonJSMin", "exports", "module", "implementation", "require_shim", "__commonJSMin", "exports", "module", "getPolyfill", "define", "polyfill", "require_object", "__commonJSMin", "exports", "module", "define", "implementation", "getPolyfill", "shim", "polyfill", "require_implementation", "__commonJSMin", "exports", "module", "other", "node", "require_polyfill", "__commonJSMin", "exports", "module", "implementation", "require_shim", "__commonJSMin", "exports", "module", "define", "getPolyfill", "polyfill", "require_document", "__commonJSMin", "exports", "module", "define", "implementation", "getPolyfill", "polyfill", "shim", "boundContains", "node", "other", "require_OutsideClickHandler", "__commonJSMin", "exports", "_createClass", "defineProperties", "target", "props", "i", "descriptor", "Constructor", "protoProps", "staticProps", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_airbnbPropTypes", "_consolidatedEvents", "_object", "_object2", "_document", "_document2", "obj", "_classCallCheck", "instance", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "DISPLAY", "propTypes", "defaultProps", "OutsideClickHandler", "_React$Component", "_ref", "_len", "args", "_key", "_this", "componentDidMount", "_props", "disabled", "useCapture", "componentDidUpdate", "_ref2", "prevDisabled", "_props2", "componentWillUnmount", "onMouseDown", "e", "isDescendantOfRoot", "onMouseUp", "onOutsideClick", "setChildNodeRef", "ref", "addMouseDownEventListener", "removeEventListeners", "render", "_props3", "children", "display", "require_react_outside_click_handler", "__commonJSMin", "exports", "module", "require_FocusedInputShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_IconPositionShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_OrientationShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_DisabledShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_AnchorDirectionShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_OpenDirectionShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_CalendarInfoPositionShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_NavPositionShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_constants", "_default", "require_DateRangePickerShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_defaultPhrases", "_getPhrasePropTypes", "_FocusedInputShape", "_IconPositionShape", "_OrientationShape", "_DisabledShape", "_AnchorDirectionShape", "_OpenDirectionShape", "_DayOfWeekShape", "_CalendarInfoPositionShape", "_NavPositionShape", "_default", "require_getResponsiveContainerStyles", "__commonJSMin", "exports", "_interopRequireDefault", "getResponsiveContainerStyles", "_defineProperty2", "_constants", "anchorDirection", "currentOffset", "containerEdge", "margin", "windowWidth", "calculatedOffset", "calculatedMargin", "require_getDetachedContainerStyles", "__commonJSMin", "exports", "getDetachedContainerStyles", "_constants", "openDirection", "anchorDirection", "referenceEl", "referenceRect", "offsetX", "offsetY", "require_getInputHeight", "__commonJSMin", "exports", "getInputHeight", "getPadding", "vertical", "top", "bottom", "isTopDefined", "isBottomDefined", "isVerticalDefined", "_ref", "small", "_ref$font$input", "lineHeight", "lineHeight_small", "_ref$spacing", "inputPadding", "displayTextPaddingVertical", "displayTextPaddingTop", "displayTextPaddingBottom", "displayTextPaddingVertical_small", "displayTextPaddingTop_small", "displayTextPaddingBottom_small", "calcLineHeight", "padding", "require_isBeforeDay", "__commonJSMin", "exports", "_interopRequireDefault", "isBeforeDay", "_moment", "a", "b", "aYear", "aMonth", "bYear", "bMonth", "isSameYear", "isSameMonth", "require_isInclusivelyAfterDay", "__commonJSMin", "exports", "_interopRequireDefault", "isInclusivelyAfterDay", "_moment", "_isBeforeDay", "a", "b", "require_disableScroll", "__commonJSMin", "exports", "getScrollParent", "getScrollAncestorsOverflowY", "disableScroll", "getScrollingRoot", "node", "parent", "_window$getComputedSt", "overflowY", "canScroll", "acc", "scrollingRoot", "scrollParent", "scrollAncestorsOverflowY", "toggle", "on", "ancestor", "require_isObject", "__commonJSMin", "exports", "module", "isObject", "value", "type", "require_freeGlobal", "__commonJSMin", "exports", "module", "freeGlobal", "require_root", "__commonJSMin", "exports", "module", "freeGlobal", "freeSelf", "root", "require_now", "__commonJSMin", "exports", "module", "root", "now", "require_trimmedEndIndex", "__commonJSMin", "exports", "module", "reWhitespace", "trimmedEndIndex", "string", "index", "require_baseTrim", "__commonJSMin", "exports", "module", "trimmedEndIndex", "reTrimStart", "baseTrim", "string", "require_Symbol", "__commonJSMin", "exports", "module", "root", "Symbol", "require_getRawTag", "__commonJSMin", "exports", "module", "Symbol", "objectProto", "hasOwnProperty", "nativeObjectToString", "symToStringTag", "getRawTag", "value", "isOwn", "tag", "unmasked", "result", "require_objectToString", "__commonJSMin", "exports", "module", "objectProto", "nativeObjectToString", "objectToString", "value", "require_baseGetTag", "__commonJSMin", "exports", "module", "Symbol", "getRawTag", "objectToString", "nullTag", "undefinedTag", "symToStringTag", "baseGetTag", "value", "require_isObjectLike", "__commonJSMin", "exports", "module", "isObjectLike", "value", "require_isSymbol", "__commonJSMin", "exports", "module", "baseGetTag", "isObjectLike", "symbolTag", "isSymbol", "value", "require_toNumber", "__commonJSMin", "exports", "module", "baseTrim", "isObject", "isSymbol", "NAN", "reIsBadHex", "reIsBinary", "reIsOctal", "freeParseInt", "toNumber", "value", "other", "isBinary", "require_debounce", "__commonJSMin", "exports", "module", "isObject", "now", "toNumber", "FUNC_ERROR_TEXT", "nativeMax", "nativeMin", "debounce", "func", "wait", "options", "lastArgs", "lastThis", "maxWait", "result", "timerId", "lastCallTime", "lastInvokeTime", "leading", "maxing", "trailing", "invokeFunc", "time", "args", "thisArg", "leadingEdge", "timerExpired", "remainingWait", "timeSinceLastCall", "timeSinceLastInvoke", "timeWaiting", "shouldInvoke", "trailingEdge", "cancel", "flush", "debounced", "isInvoking", "require_throttle", "__commonJSMin", "exports", "module", "debounce", "isObject", "FUNC_ERROR_TEXT", "throttle", "func", "wait", "options", "leading", "trailing", "require_DateInput", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "_throttle", "_isTouchDevice", "_noflip", "_getInputHeight", "_OpenDirectionShape", "_constants", "FANG_PATH_TOP", "FANG_STROKE_TOP", "FANG_PATH_BOTTOM", "FANG_STROKE_BOTTOM", "defaultProps", "DateInput", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "dateString", "prevProps", "_this$props", "focused", "isFocused", "e", "_this$props2", "onChange", "onKeyDownQuestionMark", "_this$props3", "onKeyDownShiftTab", "onKeyDownTab", "onKeyDownArrowDown", "key", "ref", "_this$state", "isTouch", "_this$props4", "id", "placeholder", "ariaLabel", "displayValue", "screenReaderMessage", "showCaret", "onFocus", "disabled", "required", "readOnly", "openDirection", "verticalSpacing", "small", "regular", "block", "styles", "reactDates", "value", "screenReaderMessageId", "withFang", "inputHeight", "_default", "_ref2", "_ref2$reactDates", "border", "color", "sizing", "spacing", "font", "zIndex", "require_RightArrow", "__commonJSMin", "exports", "_interopRequireDefault", "_react", "RightArrow", "props", "_default", "require_LeftArrow", "__commonJSMin", "exports", "_interopRequireDefault", "_react", "LeftArrow", "props", "_default", "require_CloseButton", "__commonJSMin", "exports", "_interopRequireDefault", "_react", "CloseButton", "props", "_default", "require_CalendarIcon", "__commonJSMin", "exports", "_interopRequireDefault", "_react", "CalendarIcon", "props", "_default", "require_DateRangePickerInput", "__commonJSMin", "exports", "_interopRequireDefault", "_extends2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "_defaultPhrases", "_getPhrasePropTypes", "_noflip", "_OpenDirectionShape", "_DateInput", "_IconPositionShape", "_DisabledShape", "_RightArrow", "_LeftArrow", "_CloseButton", "_CalendarIcon", "_constants", "defaultProps", "DateRangePickerInput", "_ref", "children", "startDate", "startDateId", "startDatePlaceholderText", "screenReaderMessage", "isStartDateFocused", "onStartDateChange", "onStartDateFocus", "onStartDateShiftTab", "startDateAriaLabel", "endDate", "endDateId", "endDatePlaceholderText", "isEndDateFocused", "onEndDateChange", "onEndDateFocus", "onEndDateTab", "endDateAriaLabel", "onKeyDownArrowDown", "onKeyDownQuestionMark", "onClearDates", "showClearDates", "disabled", "required", "readOnly", "showCaret", "openDirection", "showDefaultInputIcon", "inputIconPosition", "customInputIcon", "customArrowIcon", "customCloseIcon", "isFocused", "phrases", "isRTL", "noBorder", "block", "verticalSpacing", "small", "regular", "styles", "calendarIcon", "arrowIcon", "closeIcon", "screenReaderStartDateText", "screenReaderEndDateText", "inputIcon", "startDateDisabled", "endDateDisabled", "_default", "_ref2", "_ref2$reactDates", "border", "color", "sizing", "require_toLocalizedDateString", "__commonJSMin", "exports", "_interopRequireDefault", "toLocalizedDateString", "_moment", "_toMomentObject", "_constants", "date", "currentFormat", "dateObj", "require_DateRangePickerInputController", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_assertThisInitialized2", "_inheritsLoose2", "_react", "_propTypes", "_moment", "_reactMomentProptypes", "_airbnbPropTypes", "_OpenDirectionShape", "_defaultPhrases", "_getPhrasePropTypes", "_DateRangePickerInput", "_IconPositionShape", "_DisabledShape", "_toMomentObject", "_toLocalizedDateString", "_isInclusivelyAfterDay", "_isBeforeDay", "_constants", "defaultProps", "day", "DateRangePickerInputController", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "_this$props", "onFocusChange", "onClose", "startDate", "endDate", "endDateString", "_this$props2", "isOutsideRange", "minimumNights", "keepOpenOnDateSelect", "onDatesChange", "isEndDateValid", "_this$props3", "withFullScreenPortal", "disabled", "startDateString", "_this$props4", "isEndDateBeforeStartDate", "isStartDateValid", "_this$props5", "displayFormat", "date", "_this$props6", "reopenPickerOnClearDates", "_this$props7", "children", "startDateId", "startDatePlaceholderText", "isStartDateFocused", "startDateAriaLabel", "endDateId", "endDatePlaceholderText", "endDateAriaLabel", "isEndDateFocused", "screenReaderMessage", "showClearDates", "showCaret", "showDefaultInputIcon", "inputIconPosition", "customInputIcon", "customArrowIcon", "customCloseIcon", "required", "readOnly", "openDirection", "isFocused", "phrases", "onKeyDownArrowDown", "onKeyDownQuestionMark", "isRTL", "noBorder", "block", "small", "regular", "verticalSpacing", "require_arrayWithHoles", "__commonJSMin", "exports", "module", "_arrayWithHoles", "require_iterableToArrayLimit", "__commonJSMin", "exports", "module", "_iterableToArrayLimit", "l", "e", "n", "i", "u", "f", "o", "r", "require_nonIterableRest", "__commonJSMin", "exports", "module", "_nonIterableRest", "require_slicedToArray", "__commonJSMin", "exports", "module", "arrayWithHoles", "iterableToArrayLimit", "unsupportedIterableToArray", "nonIterableRest", "_slicedToArray", "require_isNextDay", "__commonJSMin", "exports", "_interopRequireDefault", "isNextDay", "_moment", "_isSameDay", "a", "b", "nextDay", "require_isAfterDay", "__commonJSMin", "exports", "_interopRequireDefault", "isAfterDay", "_moment", "_isBeforeDay", "_isSameDay", "a", "b", "require_isPreviousDay", "__commonJSMin", "exports", "_interopRequireDefault", "isPreviousDay", "_moment", "_isSameDay", "a", "b", "dayBefore", "require_getVisibleDays", "__commonJSMin", "exports", "_interopRequireDefault", "getVisibleDays", "_moment", "_toISOMonthString", "month", "numberOfMonths", "enableOutsideDays", "withoutTransitionMonths", "visibleDaysByMonth", "currentMonth", "i", "visibleDays", "baseDate", "firstOfMonth", "lastOfMonth", "currentDay", "j", "prevDay", "k", "count", "nextDay", "require_isDayVisible", "__commonJSMin", "exports", "_interopRequireDefault", "isDayVisible", "_moment", "_isBeforeDay", "_isAfterDay", "_toISOMonthString", "startCacheOutsideDays", "endCacheOutsideDays", "startCacheInsideDays", "endCacheInsideDays", "day", "month", "numberOfMonths", "enableOutsideDays", "startKey", "endKey", "require_getSelectedDateOffset", "__commonJSMin", "exports", "getSelectedDateOffset", "defaultModifier", "day", "fn", "modifier", "require_getPreviousMonthMemoLast", "__commonJSMin", "exports", "getPreviousMonthMemoLast", "getPreviousMonthMemoKey", "getPreviousMonthMemoValue", "month", "require_modifiers", "__commonJSMin", "exports", "_interopRequireDefault", "addModifier", "deleteModifier", "_defineProperty2", "_isDayVisible", "_toISODateString", "_toISOMonthString", "_getPreviousMonthMemoLast", "_constants", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "updatedDays", "day", "modifier", "props", "state", "numberOfVisibleMonths", "enableOutsideDays", "orientation", "firstVisibleMonth", "visibleDays", "currentMonth", "numberOfMonths", "iso", "updatedDaysAfterAddition", "monthsToUpdate", "monthKey", "acc", "monthIso", "month", "modifiers", "updatedDaysAfterDeletion", "require_ChevronUp", "__commonJSMin", "exports", "_interopRequireDefault", "_react", "ChevronUp", "props", "_default", "require_ChevronDown", "__commonJSMin", "exports", "_interopRequireDefault", "_react", "ChevronDown", "props", "_default", "require_DayPickerNavigation", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_toConsumableArray2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "_defaultPhrases", "_getPhrasePropTypes", "_noflip", "_LeftArrow", "_RightArrow", "_ChevronUp", "_ChevronDown", "_NavPositionShape", "_ScrollableOrientationShape", "_constants", "defaultProps", "DayPickerNavigation", "_ref", "_proto", "nextProps", "nextState", "_this$props", "inlineStyles", "isRTL", "disablePrev", "disableNext", "navPosition", "navPrev", "navNext", "onPrevMonthClick", "onNextMonthClick", "orientation", "phrases", "renderNavPrevButton", "renderNavNextButton", "showNavPrevButton", "showNavNextButton", "styles", "isHorizontal", "isVertical", "isVerticalScrollable", "isBottomNavPosition", "hasInlineStyles", "navPrevIcon", "navNextIcon", "isDefaultNavPrev", "isDefaultNavNext", "navPrevTabIndex", "navNextTabIndex", "Icon", "_Icon", "isDefaultNav", "e", "key", "_default", "_ref2", "_ref2$reactDates", "color", "zIndex", "require_KeyboardShortcutRow", "__commonJSMin", "exports", "_interopRequireDefault", "_extends2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "defaultProps", "KeyboardShortcutRow", "_ref", "unicode", "label", "action", "block", "styles", "_default", "_ref2", "color", "require_DayPickerKeyboardShortcuts", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "_defaultPhrases", "_getPhrasePropTypes", "_KeyboardShortcutRow", "_CloseButton", "TOP_LEFT", "TOP_RIGHT", "BOTTOM_RIGHT", "defaultProps", "getKeyboardShortcuts", "phrases", "DayPickerKeyboardShortcuts", "_ref", "_proto", "nextProps", "nextState", "_this", "_len", "args", "_key", "e", "closeKeyboardShortcutsPanel", "_this2", "openKeyboardShortcutsPanel", "ref", "_this$props", "block", "buttonLocation", "showKeyboardShortcutsPanel", "styles", "renderKeyboardShortcutsButton", "renderKeyboardShortcutsPanel", "toggleButtonText", "bottomRight", "topRight", "topLeft", "_ref2", "unicode", "label", "action", "_default", "_ref3", "_ref3$reactDates", "color", "font", "zIndex", "require_getNumberOfCalendarMonthWeeks", "__commonJSMin", "exports", "_interopRequireDefault", "getNumberOfCalendarMonthWeeks", "_moment", "getBlankDaysBeforeFirstDay", "firstDayOfMonth", "firstDayOfWeek", "weekDayDiff", "month", "numBlankDays", "require_getActiveElement", "__commonJSMin", "exports", "getActiveElement", "require_DayPicker", "__commonJSMin", "exports", "_interopRequireWildcard", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_toConsumableArray2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "_moment", "_throttle", "_isTouchDevice", "_reactOutsideClickHandler", "_defaultPhrases", "_getPhrasePropTypes", "_noflip", "_CalendarMonthGrid", "_DayPickerNavigation", "_DayPickerKeyboardShortcuts", "_getNumberOfCalendarMonthWeeks", "_getCalendarMonthWidth", "_calculateDimension", "_getActiveElement", "_isDayVisible", "_isSameMonth", "_ModifiersShape", "_NavPositionShape", "_ScrollableOrientationShape", "_DayOfWeekShape", "_CalendarInfoPositionShape", "_constants", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "MONTH_PADDING", "PREV_TRANSITION", "NEXT_TRANSITION", "MONTH_SELECTION_TRANSITION", "YEAR_SELECTION_TRANSITION", "PREV_NAV", "NEXT_NAV", "defaultProps", "DayPicker", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "currentMonth", "focusedDate", "horizontalMonthPadding", "translationValue", "orientation", "calendarInfoWidth", "currentMonthScrollTop", "hidden", "isFocused", "showKeyboardShortcuts", "onBlur", "renderMonthText", "nextCurrentMonth", "_this$props", "daySize", "prevIsFocused", "prevRenderMonthText", "onKeyboardShortcutsPanelClose", "_this2", "transitionDuration", "calendarInfoPanelWidth", "prevProps", "prevState", "_this$props2", "numberOfMonths", "_this$state", "monthTitleHeight", "visibleCalendarWeeks", "calendarMonthWeeksHeight", "newMonthHeight", "e", "_this$props3", "onTab", "onShiftTab", "isRTL", "_this$state2", "newFocusedDate", "didTransitionMonth", "activeElement", "nextFocusedDate", "_this$props4", "_this$state3", "calendarMonthWidth", "_calendarMonthWeeksHeight", "_this$props5", "_this$state4", "firstVisibleMonthWeeks", "_calendarMonthWeeksHeight2", "firstDayOfWeek", "weekDayFormat", "weekHeaders", "monthTransition", "firstVisibleMonthIndex", "newMonth", "_this$props6", "getFirstFocusableDay", "_this3", "month", "numberOfWeeks", "ref", "onGetNextScrollableMonths", "_ref2", "scrollableMonthMultiple", "_this$props7", "onGetPrevScrollableMonths", "_ref3", "_this$state5", "newFocusedDateMonth", "focusedDateMonth", "isNewFocusedDateVisible", "_this$state6", "_this4", "_this$props8", "onPrevMonthClick", "onNextMonthClick", "onMonthChange", "onYearChange", "_this$state7", "withMouseInteractions", "newInvisibleMonth", "_newInvisibleMonth", "_numberOfWeeks", "_this5", "monthHeight", "_this$props9", "onCloseCallBack", "navDirection", "_this$props10", "dayPickerNavigationInlineStyles", "disablePrev", "disableNext", "navPosition", "navPrev", "navNext", "noNavButtons", "noNavNextButton", "noNavPrevButton", "phrases", "renderNavPrevButton", "renderNavNextButton", "index", "_this$props11", "renderWeekHeaderElement", "styles", "verticalScrollable", "horizontalStyle", "verticalStyle", "weekHeaderStyle", "header", "day", "_this6", "_this$state8", "isTouch", "hasSetHeight", "_this$props12", "enableOutsideDays", "modifiers", "withPortal", "onDayClick", "onDayMouseEnter", "onDayMouseLeave", "renderCalendarDay", "renderDayContents", "renderCalendarInfo", "renderMonthElement", "renderKeyboardShortcutsButton", "renderKeyboardShortcutsPanel", "calendarInfoPosition", "hideKeyboardShortcutsPanel", "onOutsideClick", "monthFormat", "theme", "verticalHeight", "dayAriaLabelFormat", "noBorder", "verticalBorderSpacing", "dayPickerHorizontalPadding", "isHorizontal", "numOfWeekHeaders", "height", "isCalendarMonthGridAnimating", "shouldFocusDate", "keyboardShortcutButtonLocation", "shouldAnimateHeight", "calendarInfoPositionTop", "calendarInfoPositionBottom", "calendarInfoPositionBefore", "calendarInfoPositionAfter", "calendarInfoIsInline", "calendarInfo", "wrapperHorizontalWidth", "fullHorizontalWidth", "transitionContainerStyle", "dayPickerWrapperStyle", "dayPickerStyle", "_default", "_ref4", "_ref4$reactDates", "color", "font", "noScrollBarOnVerticalScrollable", "spacing", "zIndex", "require_getPooledMoment", "__commonJSMin", "exports", "_interopRequireDefault", "getPooledMoment", "_moment", "momentPool", "dayString", "require_DayPickerRangeController", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_slicedToArray2", "_defineProperty2", "_assertThisInitialized2", "_inheritsLoose2", "_react", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_moment", "_object", "_isTouchDevice", "_defaultPhrases", "_getPhrasePropTypes", "_isInclusivelyAfterDay", "_isNextDay", "_isSameDay", "_isAfterDay", "_isBeforeDay", "_isPreviousDay", "_getVisibleDays", "_isDayVisible", "_getSelectedDateOffset", "_toISODateString", "_modifiers", "_DisabledShape", "_FocusedInputShape", "_ScrollableOrientationShape", "_DayOfWeekShape", "_CalendarInfoPositionShape", "_NavPositionShape", "_constants", "_DayPicker", "_getPooledMoment", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "defaultProps", "getChooseAvailableDatePhrase", "phrases", "focusedInput", "DayPickerRangeController", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "day", "hoverDate", "_this$getStateForNewM", "currentMonth", "visibleDays", "chooseAvailableDate", "_this2", "startDate", "endDate", "getMinNightsForHoverDate", "minimumNights", "isOutsideRange", "isDayBlocked", "isDayHighlighted", "initialVisibleMonth", "numberOfMonths", "enableOutsideDays", "_this$props", "prevStartDate", "prevEndDate", "prevFocusedInput", "prevMinimumNights", "prevIsOutsideRange", "prevIsDayBlocked", "prevIsDayHighlighted", "prevPhrases", "prevInitialVisibleMonth", "prevNumberOfMonths", "prevEnableOutsideDays", "recomputeOutsideRange", "recomputeDayBlocked", "recomputeDayHighlighted", "recomputePropModifiers", "didStartDateChange", "didEndDateChange", "didFocusChange", "newMonthState", "modifiers", "startSpan", "endSpan", "days", "momentObj", "_startSpan", "_endSpan", "_startSpan2", "_endSpan2", "_startSpan3", "isBlocked", "minNightsForHoverDate", "today", "e", "_this$props2", "keepOpenOnDateSelect", "onBlur", "onFocusChange", "onClose", "onDatesChange", "startDateOffset", "endDateOffset", "disabled", "daysViolatingMinNightsCanBeClicked", "_this$props3", "lastAllowedStartDate", "isStartDateAfterEndDate", "isEndDateDisabled", "firstAllowedEndDate", "_this$props4", "_this$state", "dateOffset", "nextDateOffset", "hasOffset", "start", "end", "rangeDay", "_endSpan3", "_endSpan4", "newStartSpan", "newEndSpan", "_startSpan4", "_newStartSpan", "minNightsForPrevHoverDate", "_this$props5", "_this$state2", "_endSpan5", "_startSpan5", "_this$props6", "maxDate", "minDate", "onPrevMonthClick", "_this$state3", "newVisibleDays", "month", "prevMonth", "prevMonthVisibleDays", "newCurrentMonth", "_this$props7", "onNextMonthClick", "_this$state4", "nextMonth", "nextMonthVisibleDays", "newMonth", "_this$props8", "orientation", "withoutTransitionMonths", "_this$props9", "_this$props10", "_this$state5", "numberOfVisibleMonths", "_this$props11", "_this$state6", "firstPreviousMonth", "_this3", "_this$props12", "focusedDate", "lastVisibleDay", "currentDay", "viableDays", "_viableDays", "_this4", "_this5", "modifier", "_this6", "initialVisibleMonthThunk", "date", "visibleMonth", "_this$props13", "updatedDays", "spanStart", "_this$props14", "dayDiff", "_this$props15", "minNights", "_this$props16", "_ref2", "_ref3", "_this$props17", "_ref4", "isForwardRange", "isBackwardRange", "isValidDayHovered", "_this$props18", "blockDaysViolatingMinNights", "_this$props19", "firstDayOfWeek", "_this$props20", "firstAvailableEndDate", "_this$props21", "_ref5", "_this$props22", "monthFormat", "renderMonthText", "renderWeekHeaderElement", "dayPickerNavigationInlineStyles", "navPosition", "navPrev", "navNext", "renderNavPrevButton", "renderNavNextButton", "noNavButtons", "noNavNextButton", "noNavPrevButton", "onOutsideClick", "withPortal", "renderKeyboardShortcutsButton", "renderKeyboardShortcutsPanel", "hideKeyboardShortcutsPanel", "daySize", "renderCalendarDay", "renderDayContents", "renderCalendarInfo", "renderMonthElement", "calendarInfoPosition", "onShiftTab", "onTab", "isFocused", "showKeyboardShortcuts", "isRTL", "weekDayFormat", "dayAriaLabelFormat", "verticalHeight", "noBorder", "transitionDuration", "verticalBorderSpacing", "horizontalMonthPadding", "_this$state7", "disablePrev", "disableNext", "require_DateRangePicker", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_moment", "_reactWithStyles", "_reactPortal", "_airbnbPropTypes", "_consolidatedEvents", "_isTouchDevice", "_reactOutsideClickHandler", "_DateRangePickerShape", "_defaultPhrases", "_getResponsiveContainerStyles", "_getDetachedContainerStyles", "_getInputHeight", "_isInclusivelyAfterDay", "_disableScroll2", "_noflip", "_DateRangePickerInputController", "_DayPickerRangeController", "_CloseButton", "_constants", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "defaultProps", "day", "DateRangePicker", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "focusedInput", "prevProps", "event", "_this$props", "onFocusChange", "onClose", "startDate", "endDate", "appendToBody", "_this$props2", "readOnly", "withPortal", "withFullScreenPortal", "keepFocusOnInput", "withAnyPortal", "moveFocusToDayPicker", "_this$props3", "relatedTarget", "ref", "_this$props4", "propDisableScroll", "dayPickerContainerStyles", "_this$props5", "openDirection", "anchorDirection", "horizontalMargin", "isAnchoredLeft", "containerRect", "currentOffset", "containerEdge", "_this$props6", "_this$props7", "isDayBlocked", "isDayHighlighted", "isOutsideRange", "numberOfMonths", "orientation", "monthFormat", "renderMonthText", "renderWeekHeaderElement", "dayPickerNavigationInlineStyles", "navPosition", "navPrev", "navNext", "renderNavPrevButton", "renderNavNextButton", "onPrevMonthClick", "onNextMonthClick", "onDatesChange", "daySize", "enableOutsideDays", "startDateOffset", "endDateOffset", "minDate", "maxDate", "minimumNights", "keepOpenOnDateSelect", "renderCalendarDay", "renderDayContents", "renderCalendarInfo", "renderMonthElement", "calendarInfoPosition", "firstDayOfWeek", "initialVisibleMonth", "hideKeyboardShortcutsPanel", "customCloseIcon", "phrases", "dayAriaLabelFormat", "isRTL", "weekDayFormat", "styles", "verticalHeight", "transitionDuration", "verticalSpacing", "horizontalMonthPadding", "small", "disabled", "reactDates", "_this$state", "isDayPickerFocused", "showKeyboardShortcuts", "onOutsideClick", "initialVisibleMonthThunk", "closeIcon", "inputHeight", "_this$props8", "startDateId", "startDatePlaceholderText", "startDateAriaLabel", "endDateId", "endDatePlaceholderText", "endDateAriaLabel", "screenReaderInputMessage", "showClearDates", "showDefaultInputIcon", "inputIconPosition", "customInputIcon", "customArrowIcon", "required", "displayFormat", "reopenPickerOnClearDates", "noBorder", "block", "regular", "isDateRangePickerInputFocused", "enableOutsideClick", "hideFang", "input", "_default", "_ref2", "_ref2$reactDates", "color", "zIndex", "require_DayPickerSingleDateController", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_slicedToArray2", "_defineProperty2", "_assertThisInitialized2", "_inheritsLoose2", "_react", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_moment", "_object", "_isTouchDevice", "_defaultPhrases", "_getPhrasePropTypes", "_isSameDay", "_isAfterDay", "_getVisibleDays", "_toISODateString", "_modifiers", "_ScrollableOrientationShape", "_DayOfWeekShape", "_CalendarInfoPositionShape", "_NavPositionShape", "_constants", "_DayPicker", "_getPooledMoment", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "defaultProps", "DayPickerSingleDateController", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "day", "_this$getStateForNewM", "currentMonth", "visibleDays", "_this2", "date", "focused", "isOutsideRange", "isDayBlocked", "isDayHighlighted", "initialVisibleMonth", "numberOfMonths", "enableOutsideDays", "_this$props", "prevIsOutsideRange", "prevIsDayBlocked", "prevIsDayHighlighted", "prevNumberOfMonths", "prevEnableOutsideDays", "prevInitialVisibleMonth", "prevFocused", "prevDate", "recomputeOutsideRange", "recomputeDayBlocked", "recomputeDayHighlighted", "recomputePropModifiers", "newMonthState", "didDateChange", "didFocusChange", "modifiers", "days", "momentObj", "today", "e", "_this$props2", "onDateChange", "keepOpenOnDateSelect", "onFocusChange", "onClose", "_this$state", "hoverDate", "_this$state2", "_this$props3", "onPrevMonthClick", "_this$state3", "newVisibleDays", "month", "prevMonth", "prevMonthVisibleDays", "_this$props4", "onNextMonthClick", "_this$state4", "nextMonth", "nextMonthVisibleDays", "newCurrentMonth", "newMonth", "_this$props5", "orientation", "withoutTransitionMonths", "_this$props6", "_this$props7", "_this$state5", "numberOfVisibleMonths", "_this$props8", "_this$state6", "firstPreviousMonth", "_this3", "_this$props9", "focusedDate", "lastVisibleDay", "currentDay", "viableDays", "_viableDays", "_this4", "_this5", "modifier", "_this6", "initialVisibleMonthThunk", "updatedDays", "_this$props10", "_ref2", "firstDayOfWeek", "_this$props11", "monthFormat", "renderMonthText", "renderWeekHeaderElement", "dayPickerNavigationInlineStyles", "navPosition", "navPrev", "navNext", "renderNavPrevButton", "renderNavNextButton", "noNavButtons", "noNavPrevButton", "noNavNextButton", "onOutsideClick", "onShiftTab", "onTab", "withPortal", "hideKeyboardShortcutsPanel", "daySize", "renderCalendarDay", "renderDayContents", "renderCalendarInfo", "renderMonthElement", "calendarInfoPosition", "isFocused", "isRTL", "phrases", "dayAriaLabelFormat", "onBlur", "showKeyboardShortcuts", "weekDayFormat", "verticalHeight", "noBorder", "transitionDuration", "verticalBorderSpacing", "horizontalMonthPadding", "_this$state7", "require_SingleDatePickerShape", "__commonJSMin", "exports", "_interopRequireDefault", "_propTypes", "_reactMomentProptypes", "_airbnbPropTypes", "_defaultPhrases", "_getPhrasePropTypes", "_IconPositionShape", "_OrientationShape", "_AnchorDirectionShape", "_OpenDirectionShape", "_DayOfWeekShape", "_CalendarInfoPositionShape", "_NavPositionShape", "_default", "require_SingleDatePickerInput", "__commonJSMin", "exports", "_interopRequireDefault", "_extends2", "_defineProperty2", "_react", "_propTypes", "_airbnbPropTypes", "_reactWithStyles", "_defaultPhrases", "_getPhrasePropTypes", "_noflip", "_DateInput", "_IconPositionShape", "_CloseButton", "_CalendarIcon", "_OpenDirectionShape", "_constants", "defaultProps", "SingleDatePickerInput", "_ref", "id", "children", "placeholder", "ariaLabel", "displayValue", "focused", "isFocused", "disabled", "required", "readOnly", "showCaret", "showClearDate", "showDefaultInputIcon", "inputIconPosition", "phrases", "onClearDate", "onChange", "onFocus", "onKeyDownShiftTab", "onKeyDownTab", "onKeyDownArrowDown", "onKeyDownQuestionMark", "screenReaderMessage", "customCloseIcon", "customInputIcon", "openDirection", "isRTL", "noBorder", "block", "small", "regular", "verticalSpacing", "styles", "calendarIcon", "closeIcon", "screenReaderText", "inputIcon", "_default", "_ref2", "_ref2$reactDates", "border", "color", "require_SingleDatePickerInputController", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_assertThisInitialized2", "_inheritsLoose2", "_react", "_propTypes", "_moment", "_reactMomentProptypes", "_airbnbPropTypes", "_OpenDirectionShape", "_defaultPhrases", "_getPhrasePropTypes", "_SingleDatePickerInput", "_IconPositionShape", "_DisabledShape", "_toMomentObject", "_toLocalizedDateString", "_isInclusivelyAfterDay", "_constants", "defaultProps", "day", "SingleDatePickerInputController", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "dateString", "_this$props", "isOutsideRange", "keepOpenOnDateSelect", "onDateChange", "onFocusChange", "onClose", "newDate", "isValid", "_this$props2", "disabled", "_this$props3", "focused", "date", "displayFormat", "_this$props4", "reopenPickerOnClearDate", "_this$props5", "children", "id", "placeholder", "ariaLabel", "isFocused", "required", "readOnly", "openDirection", "showClearDate", "showCaret", "showDefaultInputIcon", "inputIconPosition", "customCloseIcon", "customInputIcon", "phrases", "onKeyDownArrowDown", "onKeyDownQuestionMark", "screenReaderMessage", "isRTL", "noBorder", "block", "small", "regular", "verticalSpacing", "displayValue", "require_SingleDatePicker", "__commonJSMin", "exports", "_interopRequireDefault", "_enzymeShallowEqual", "_extends2", "_assertThisInitialized2", "_inheritsLoose2", "_defineProperty2", "_react", "_moment", "_reactWithStyles", "_reactPortal", "_airbnbPropTypes", "_consolidatedEvents", "_isTouchDevice", "_reactOutsideClickHandler", "_SingleDatePickerShape", "_defaultPhrases", "_getResponsiveContainerStyles", "_getDetachedContainerStyles", "_getInputHeight", "_isInclusivelyAfterDay", "_disableScroll2", "_noflip", "_SingleDatePickerInputController", "_DayPickerSingleDateController", "_CloseButton", "_constants", "ownKeys", "object", "enumerableOnly", "keys", "symbols", "sym", "_objectSpread", "target", "i", "source", "key", "defaultProps", "day", "SingleDatePicker", "_ref", "_proto", "nextProps", "nextState", "props", "_this", "focused", "prevProps", "event", "_this$props", "onFocusChange", "onClose", "date", "appendToBody", "_ref2", "_this$props2", "readOnly", "withPortal", "withFullScreenPortal", "keepFocusOnInput", "withAnyPortal", "moveFocusToDayPicker", "e", "relatedTarget", "ref", "_this$props3", "propDisableScroll", "_this$props4", "openDirection", "anchorDirection", "horizontalMargin", "dayPickerContainerStyles", "isAnchoredLeft", "containerRect", "currentOffset", "containerEdge", "_this$props5", "_this$props6", "onDateChange", "enableOutsideDays", "numberOfMonths", "orientation", "monthFormat", "dayPickerNavigationInlineStyles", "navPosition", "navPrev", "navNext", "renderNavPrevButton", "renderNavNextButton", "onPrevMonthClick", "onNextMonthClick", "keepOpenOnDateSelect", "initialVisibleMonth", "renderMonthText", "renderWeekHeaderElement", "renderCalendarDay", "renderDayContents", "renderCalendarInfo", "renderMonthElement", "calendarInfoPosition", "hideKeyboardShortcutsPanel", "firstDayOfWeek", "customCloseIcon", "phrases", "dayAriaLabelFormat", "daySize", "isRTL", "isOutsideRange", "isDayBlocked", "isDayHighlighted", "weekDayFormat", "styles", "verticalHeight", "transitionDuration", "verticalSpacing", "horizontalMonthPadding", "small", "reactDates", "_this$state", "isDayPickerFocused", "showKeyboardShortcuts", "onOutsideClick", "closeIcon", "inputHeight", "_this$props7", "id", "placeholder", "ariaLabel", "disabled", "required", "showClearDate", "showDefaultInputIcon", "inputIconPosition", "customInputIcon", "displayFormat", "screenReaderInputMessage", "noBorder", "block", "regular", "reopenPickerOnClearDate", "isInputFocused", "enableOutsideClick", "hideFang", "input", "_default", "_ref3", "_ref3$reactDates", "color", "zIndex", "require_isInclusivelyBeforeDay", "__commonJSMin", "exports", "_interopRequireDefault", "isInclusivelyBeforeDay", "_moment", "_isAfterDay", "a", "b", "require_lib", "__commonJSMin", "exports", "_interopRequireDefault", "_CalendarDay", "_CalendarMonth", "_CalendarMonthGrid", "_DateRangePicker", "_DateRangePickerInput", "_DateRangePickerInputController", "_DateRangePickerShape", "_DayPicker", "_DayPickerRangeController", "_DayPickerSingleDateController", "_SingleDatePicker", "_SingleDatePickerInput", "_SingleDatePickerShape", "_isInclusivelyAfterDay", "_isInclusivelyBeforeDay", "_isNextDay", "_isSameDay", "_toISODateString", "_toLocalizedDateString", "_toMomentObject", "require_react_dates", "__commonJSMin", "exports", "module", "require_nl", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "monthsShortWithDots", "monthsShortWithoutDots", "monthsParse", "monthsRegex", "nl", "m", "format", "number", "require_en_gb", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "enGb", "number", "b", "output", "require_de", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "processRelativeTime", "number", "withoutSuffix", "key", "isFuture", "format", "de", "require_fr", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "monthsStrictRegex", "monthsShortStrictRegex", "monthsRegex", "monthsParse", "fr", "number", "period", "require_cs", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "months", "monthsShort", "monthsParse", "monthsRegex", "plural", "n", "translate", "number", "withoutSuffix", "key", "isFuture", "result", "cs", "require_da", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "da", "require_es", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "monthsShortDot", "monthsShort", "monthsParse", "monthsRegex", "es", "m", "format", "require_it", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "it", "require_nb", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "nb", "require_pl", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "monthsNominative", "monthsSubjective", "monthsParse", "plural", "n", "translate", "number", "withoutSuffix", "key", "result", "pl", "momentToFormat", "format", "require_pt", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "pt", "require_tr", "__commonJSMin", "exports", "module", "global", "factory", "__require", "moment", "suffixes", "tr", "hours", "minutes", "isLower", "input", "number", "period", "a", "b", "c", "import_moment", "import_nl", "import_en_gb", "import_de", "import_fr", "import_cs", "import_da", "import_es", "import_it", "import_nb", "import_pl", "import_pt", "import_tr", "moment_default", "init_moment", "__esmMin", "moment", "renderMonthElement", "month", "onMonthSelect", "onYearSelect", "years", "_", "index", "React", "e", "moment_default", "label", "value", "year", "import_react", "init_react_dates", "__esmMin", "init_moment", "date_calendar_exports", "__export", "date_calendar_default", "DateCalendar", "initialDate", "minDate", "maxDate", "onChange", "date", "setDate", "moment_default", "React", "day", "renderMonthElement", "import_react", "import_react_dates", "init_date_calendar", "__esmMin", "init_initialize", "init_react_dates", "init_moment", "date_range_calendar_exports", "__export", "DateRangeCalendarWrapper", "DateRangeCalendar", "daySize", "mode", "initialStartDate", "initialEndDate", "minDate", "maxDate", "minNights", "maxDays", "numberOfMonths", "blockedDatesUrl", "onChange", "onEndDateChange", "startDate", "setStartDate", "moment_default", "endDate", "setEndDate", "initialVisibleMonth", "focusedInput", "setFocusedInput", "currentMonth", "setCurrentMonth", "blockedDates", "setBlockedDates", "fetchTimeoutRef", "enableOutsideDays", "outsideDaysEnabled", "handleDatesChange", "isOutsideRange", "day", "visibleRange", "getVisibleRange", "dateRangeKey", "isDayBlocked", "datesForRange", "formatDate", "params", "buildBlockedDatesParams", "controller", "scheduleDebounce", "dates", "get", "dateSet", "toDateSet", "prev", "pruneBlockedDates", "e", "cancelDebounce", "React", "renderMonthElement", "month", "date", "start", "end", "rangeStart", "rangeEnd", "cache", "keepKey", "limit", "keys", "next", "k", "timeoutRef", "fn", "delay", "import_react", "import_react_dates", "init_date_range_calendar", "__esmMin", "init_initialize", "init_react_dates", "init_moment", "init_src", "props", "ARROW_EXP", "index", "jsep", "env", "backupIndex", "biop", "body", "updateBinariesToArrows", "node", "val", "plugin", "jsep", "updateNodeTypes", "op", "env", "code", "c", "updateBinariesToAssignments", "node", "val", "ARROW_EXP", "index", "jsep", "env", "sub", "argument", "index", "jsep", "env", "node", "callNode", "OBJECT_EXP", "PROPERTY", "index", "jsep", "gobbleObjectExpression", "env", "properties", "key", "value", "computed", "index", "jsep", "env", "patternIndex", "inCharSet", "pattern", "flags", "code", "value", "e", "index", "jsep", "env", "i", "TAGGED_TEMPLATE_EXPRESSION", "TEMPLATE_LITERAL", "TEMPLATE_ELEMENT", "index", "jsep", "gobbleTemplateLiteral", "env", "gobbleMember", "node", "cooked", "raw", "closed", "length", "pushQuasi", "ch", "CONDITIONAL_EXP", "index", "jsep", "env", "test", "consequent", "alternate", "newTest", "require_scroll_lock", "__commonJSMin", "exports", "module", "root", "factory", "modules", "installedModules", "__webpack_require__", "moduleId", "name", "getter", "value", "mode", "ns", "key", "object", "property", "__webpack_exports__", "argumentAsArray", "argument", "isElement", "target", "isElementList", "nodeList", "eachNode", "callback", "i", "throwError", "message", "arrayAsSelector", "array", "selector", "nodeListAsArray", "nodes", "node", "findParentBySelector", "$el", "self", "$root", "elementHasSelector", "has", "elementHasOverflowHidden", "computedStyle", "overflowIsHidden", "elementScrollTopOnStart", "scrollTop", "elementScrollTopOnEnd", "scrollHeight", "scrollTopWithHeight", "elementScrollLeftOnStart", "scrollLeft", "elementScrollLeftOnEnd", "scrollWidth", "scrollLeftWithWidth", "elementIsScrollableField", "elementIsInputRange", "disablePageScroll", "enablePageScroll", "getScrollState", "clearQueueScrollLocks", "scroll_lock_getTargetScrollBarWidth", "scroll_lock_getCurrentTargetScrollBarWidth", "getPageScrollBarWidth", "getCurrentPageScrollBarWidth", "scroll_lock_addScrollableTarget", "scroll_lock_removeScrollableTarget", "scroll_lock_addScrollableSelector", "scroll_lock_removeScrollableSelector", "scroll_lock_addLockableTarget", "scroll_lock_addLockableSelector", "scroll_lock_setFillGapMethod", "scroll_lock_addFillGapTarget", "scroll_lock_removeFillGapTarget", "scroll_lock_addFillGapSelector", "scroll_lock_removeFillGapSelector", "refillGaps", "_objectSpread", "source", "ownKeys", "sym", "_defineProperty", "obj", "FILL_GAP_AVAILABLE_METHODS", "TOUCH_DIRECTION_DETECT_OFFSET", "state", "scroll_lock_hideLockableOverflow", "fillGaps", "scroll_lock_showLockableOverflow", "unfillGaps", "$target", "onlyExists", "currentOverflowYProperty", "width", "documentWidth", "windowWidth", "currentWidth", "borderLeftWidthCurrentProperty", "borderRightWidthCurrentProperty", "_currentWidth", "targets", "$targets", "selectors", "sSelector", "method", "methods", "scroll_lock_fillGapTarget", "scroll_lock_unfillGapTarget", "scroll_lock_fillGapSelector", "fSelector", "scroll_lock_unfillGapSelector", "scroll_lock_hideLockableOverflowSelector", "scroll_lock_showLockableOverflowSelector", "scroll_lock_hideLockableOverflowTarget", "scroll_lock_showLockableOverflowTarget", "isLockable", "scrollBarWidth", "$lockableParent", "currentMargin", "currentPadding", "currentFillGapMethod", "onResize", "e", "onTouchStart", "scroll_lock_onTouchMove", "startTouchY", "startTouchX", "currentClientY", "currentClientX", "direction", "directionWithOffset", "handle", "skip", "parentScrollableEl", "prevent", "onTouchEnd", "deprecatedMethods", "scrollLock", "scroll_lock", "turbo_es2017_esm_exports", "__export", "FetchEnctype", "FetchMethod", "FetchRequest", "FetchResponse", "FrameElement", "FrameLoadingStyle", "FrameRenderer", "PageRenderer", "PageSnapshot", "StreamActions", "StreamElement", "StreamSourceElement", "cache", "config", "connectStreamSource", "disconnectStreamSource", "fetchWithTurboHeaders", "fetchEnctypeFromString", "fetchMethodFromString", "isSafe", "morphBodyElements", "morphChildren", "morphElements", "morphTurboFrameElements", "navigator", "registerAdapter", "renderStreamMessage", "session", "setConfirmMethod", "setFormMode", "setProgressBarDelay", "start", "visit", "FrameLoadingStyle", "_FrameElement", "__publicField", "name", "value", "frameLoadingStyleFromString", "_a", "_b", "FrameElement", "style", "drive", "activateScriptElement", "element", "createdScriptElement", "cspNonce", "getCspNonce", "copyElementAttributes", "destinationElement", "sourceElement", "createDocumentFragment", "html", "template", "dispatch", "eventName", "target", "cancelable", "detail", "event", "cancelEvent", "nextRepaint", "nextEventLoopTick", "nextAnimationFrame", "resolve", "parseHTMLDocument", "unindent", "strings", "values", "lines", "interpolate", "match", "indent", "line", "result", "string", "uuid", "_", "i", "getAttribute", "attributeName", "elements", "hasAttribute", "markAsBusy", "clearBusyState", "waitForLoad", "timeoutInMilliseconds", "onComplete", "getHistoryMethodForAction", "action", "isAction", "getVisitAction", "getMetaElement", "getMetaContent", "nonce", "content", "setMetaContent", "findClosestRecursively", "selector", "elementIsFocusable", "queryAutofocusableElement", "elementOrDocumentFragment", "around", "callback", "reader", "before", "after", "doesNotTargetIFrame", "findLinkFromClickTarget", "link", "linkTarget", "debounce", "fn", "delay", "timeoutId", "args", "submitter", "_submitter", "Config", "config", "__privateAdd", "__privateGet", "__privateSet", "forms", "expandURL", "locatable", "getAnchor", "url", "anchorMatch", "getAction$1", "form", "getExtension", "getLastPathComponent", "isPrefixedBy", "baseURL", "prefix", "addTrailingSlash", "locationIsVisitable", "location", "rootLocation", "getLocationForLink", "getRequestURL", "anchor", "toCacheKey", "urlsAreEqual", "left", "right", "getPathComponents", "FetchResponse", "response", "LimitedSet", "maxSize", "oldestValue", "recentRequests", "fetchWithTurboHeaders", "options", "modifiedHeaders", "requestUID", "fetchMethodFromString", "method", "FetchMethod", "fetchEnctypeFromString", "encoding", "FetchEnctype", "_resolveRequestPromise", "_FetchRequest_instances", "allowRequestToBeIntercepted_fn", "willDelegateErrorHandling_fn", "FetchRequest", "delegate", "requestBody", "enctype", "_value", "body", "buildResourceAndBody", "fetchBody", "fetchMethod", "fetchOptions", "__privateMethod", "error", "fetchResponse", "isSafe", "mimeType", "requestInterception", "resource", "searchParams", "entriesExcludingFiles", "mergeIntoURLSearchParams", "entries", "AppearanceObserver", "lastEntry", "StreamMessage", "message", "fragment", "importStreamElements", "streamElement", "inertScriptElement", "identity", "key", "_toCacheKey", "LRUCache", "size", "entry", "index", "PREFETCH_DELAY", "_prefetchTimeout", "_maxAges", "PrefetchCache", "prefetchDelay", "request", "ttl", "cacheTtl", "maxAge", "prefetchCache", "FormSubmissionState", "FormSubmission", "_FormSubmission", "formElement", "mustRedirect", "getMethod", "getAction", "getFormAction", "buildFormData", "getEnctype", "initialized", "requesting", "confirmationMessage", "stopping", "stopped", "token", "getCookieValue", "_request", "responseSucceededWithoutRedirect", "input", "formData", "cookieName", "cookie", "formElementAction", "formAction", "Snapshot", "queryPermanentElementsAll", "id", "getPermanentElementById", "snapshot", "permanentElementMap", "currentPermanentElement", "newPermanentElement", "node", "FormSubmitObserver", "eventTarget", "submissionDoesNotDismissDialog", "submissionDoesNotTargetIFrame", "_resolveRenderPromise", "_resolveInterceptionPromise", "View", "x", "y", "renderer", "isPreview", "shouldRender", "willRender", "shouldInvalidate", "renderInterception", "reason", "direction", "FrameView", "LinkInterceptor", "_event", "LinkClickObserver", "FormLinkClickObserver", "originalEvent", "type", "turboFrame", "turboAction", "turboConfirm", "Bardo", "bardo", "permanentElement", "placeholder", "createPlaceholderForPermanentElement", "clone", "_activeElement", "Renderer", "currentSnapshot", "newSnapshot", "reject", "currentElement", "newElement", "FrameRenderer", "destinationRange", "frameElement", "sourceRange", "renderElement", "block", "readScrollLogicalPosition", "behavior", "readScrollBehavior", "activatedScriptElement", "defaultValue", "Idiomorph", "noOp", "defaults", "elt", "morph", "oldNode", "newContent", "normalizeElement", "newNode", "normalizeParent", "ctx", "createMorphContext", "morphedNodes", "saveAndRestoreFocus", "withHeadBlocking", "morphChildren", "morphOuterHTML", "oldParent", "activeElement", "activeElementId", "selectionStart", "selectionEnd", "results", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "removeNodesBetween", "morphNode", "newChildId", "movedChild", "moveBeforeById", "insertedNode", "createNode", "tempNode", "removeNode", "newEmptyChild", "newClonedChild", "startPoint", "softMatch", "nextSibling", "siblingSoftMatchCount", "cursor", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "_c", "oldElt", "newElt", "moveBefore", "startInclusive", "endExclusive", "parentNode", "removeElementFromAncestorsIdMaps", "idSet", "handleHeadElement", "morphAttributes", "ignoreValueOfActiveElement", "oldAttributes", "newAttributes", "newAttribute", "ignoreAttribute", "oldAttribute", "syncInputValue", "oldElement", "newValue", "oldValue", "syncBooleanAttribute", "newLiveValue", "oldLiveValue", "ignoreUpdate", "attr", "updateType", "possibleActiveElement", "oldHead", "newHead", "promises", "newCtx", "added", "removed", "preserved", "nodesToAppend", "srcToNewHeadNodes", "newHeadChild", "currentHeadElt", "inNewContent", "isReAppended", "isPreserved", "promise", "_resolve", "removedElement", "persistentIds", "idMap", "createIdMaps", "mergedConfig", "mergeDefaults", "morphStyle", "createPantry", "createActiveElementAndParents", "finalConfig", "pantry", "activeElementAndParents", "findIdElements", "root", "populateIdMapWithTree", "current", "oldContent", "oldIdElements", "newIdElements", "createPersistentIds", "newRoot", "duplicateIds", "oldIdTagNameMap", "tagName", "generatedByIdiomorph", "parseContent", "SlicedParentNode", "dummyParent", "nodes", "nodeList", "referenceNode", "parser", "contentWithSvgsRemoved", "htmlElement", "morphElements", "callbacks", "DefaultIdiomorphCallbacks", "shouldRefreshFrameWithMorphing", "currentFrame", "newFrame", "areFramesCompatibleForRefreshing", "closestFrameReloadableWithMorphing", "_beforeNodeMorphed", "beforeNodeMorphed", "mutationType", "MorphingFrameRenderer", "_ProgressBar", "__template", "ProgressBar", "HeadSnapshot", "elementIsNoscript", "elementWithoutNonce", "outerHTML", "details", "elementType", "elementIsTracked", "matchedType", "tracked", "elementIsMetaElementWithName", "elementIsScript", "elementIsStylesheet", "PageSnapshot", "_PageSnapshot", "documentElement", "head", "headSnapshot", "clonedElement", "selectElements", "clonedSelectElements", "source", "option", "clonedPasswordInput", "clonedNoscriptElement", "_viewTransitionStarted", "_lastOperation", "ViewTransitioner", "useViewTransition", "render", "defaultOptions", "TimingMetric", "VisitState", "SystemStatusCode", "Direction", "Visit", "restorationIdentifier", "historyChanged", "referrer", "snapshotHTML", "visitCachedSnapshot", "updateHistory", "shouldCacheSnapshot", "acceptsStreamResponse", "refresh", "actionForHistory", "statusCode", "isSuccessful", "responseHTML", "_response", "redirected", "_error", "scrollPosition", "metric", "BrowserAdapter", "session", "visit", "_visit", "_formSubmission", "CacheObserver", "_FrameRedirector_instances", "shouldSubmit_fn", "shouldRedirect_fn", "findFrameElement_fn", "FrameRedirector", "_location", "frame", "meta", "History", "turbo", "restorationIndex", "state", "additionalData", "restorationData", "_prefetchedLink", "_enable", "_tryToPrefetchRequest", "_cancelRequestIfObsolete", "_cancelPrefetchRequest", "_tryToUsePrefetchedRequest", "_LinkPrefetchObserver_instances", "cacheTtl_get", "isPrefetchable_fn", "LinkPrefetchObserver", "fetchRequest", "cached", "turboFrameTarget", "unfetchableLink", "linkToTheSamePage", "linkOptsOut", "nonSafeLink", "eventPrevented", "turboPrefetchParent", "turboMethod", "isUJS", "_Navigator_instances", "getActionForFormSubmission_fn", "getDefaultAction_fn", "Navigator", "formSubmission", "visitOptions", "PageStage", "PageObserver", "readyState", "ScrollObserver", "position", "StreamMessageRenderer", "getPermanentElementMapForFragment", "withAutofocusFromFragment", "withPreservedFocus", "permanentElementsInDocument", "permanentElementInDocument", "elementInStream", "generatedID", "turboStreams", "elementWithAutofocus", "firstAutofocusableElementInStreams", "willAutofocusId", "elementToAutofocus", "activeElementBeforeRender", "activeElementAfterRender", "restoreFocusTo", "elementToFocus", "nodeListOfStreamElements", "_started", "StreamObserver", "fetchResponseFromEvent", "fetchResponseIsStream", "ErrorRenderer", "replaceableElement", "_PageRenderer_instances", "setLanguage_fn", "PageRenderer", "mergedHeadElements", "newStylesheetElements", "loadingElements", "newHeadElements", "elementList", "noscriptElement", "dir", "lang", "MorphingPageRenderer", "SnapshotCache", "PageView", "rendererClass", "cachedSnapshot", "_preloadAll", "Preloader", "snapshotCache", "_Cache_instances", "setCacheControl_fn", "Cache", "_pageRefreshDebouncePeriod", "Session", "adapter", "requestId", "scroll", "isRecentRequest", "isCurrentUrl", "isUnsafe", "isStream", "frameTarget", "extendURLWithDeprecatedProperties", "defaultPrevented", "_snapshot", "_isPreview", "renderMethod", "ev", "newBody", "timing", "submitterIsNavigatable", "container", "withinFrame", "deprecatedLocationPropertyDescriptors", "cache", "navigator", "start", "registerAdapter", "connectStreamSource", "disconnectStreamSource", "renderStreamMessage", "setProgressBarDelay", "setConfirmMethod", "confirmMethod", "setFormMode", "mode", "morphBodyElements", "currentBody", "morphTurboFrameElements", "Turbo", "TurboFrameMissingError", "_currentFetchRequest", "_resolveVisitPromise", "_connected", "_hasBeenLoaded", "_ignoredAttributes", "_shouldMorphFrame", "_FrameController_instances", "loadSourceURL_fn", "loadFrameResponse_fn", "visit_fn", "navigateFrame_fn", "handleUnvisitableFrameResponse_fn", "willHandleFrameMissingFromResponse_fn", "handleFrameMissingFromResponse_fn", "throwFrameMissingError_fn", "visitResponse_fn", "formActionIsVisitable_fn", "shouldInterceptNavigation_fn", "isIgnoringChangesTo_fn", "ignoringChangesToAttribute_fn", "withCurrentNavigationElement_fn", "getFrameElementById_fn", "FrameController", "_fetchResponse", "src", "document", "_renderMethod", "_newElement", "pageSnapshot", "activateElement", "sourceURL", "newFrameElement", "wrapped", "currentURL", "StreamActions", "e", "targetElement", "_StreamElement_instances", "raise_fn", "_StreamElement", "c", "existingChildren", "newChildrenIds", "actionFunction", "StreamElement", "StreamSourceElement", "scriptElement", "consumer", "getConsumer", "setConsumer", "createConsumer", "newConsumer", "subscribeTo", "channel", "mixin", "subscriptions", "walk", "obj", "acc", "key", "camel", "m", "x", "TurboCableStreamSourceElement", "connectStreamSource", "subscribeTo", "disconnectStreamSource", "data", "event", "channel", "signed_stream_name", "walk", "__publicField", "encodeMethodIntoRequestBody", "event", "form", "fetchOptions", "submitter", "body", "isBodyInit", "method", "determineFetchMethod", "formMethod", "determineFormMethod", "overrideMethod", "turbo_es2017_esm_exports", "encodeMethodIntoRequestBody", "EventListener", "eventTarget", "eventName", "eventOptions", "binding", "event", "extendedEvent", "extendEvent", "left", "right", "leftIndex", "rightIndex", "stopImmediatePropagation", "Dispatcher", "application", "eventListener", "listeners", "map", "clearEventListeners", "error", "message", "detail", "eventListenerMap", "cacheKey", "parts", "key", "defaultActionDescriptorFilters", "value", "element", "descriptorPattern", "parseActionDescriptorString", "descriptorString", "matches", "keyFilter", "parseEventTarget", "parseEventOptions", "eventTargetName", "options", "token", "stringifyEventTarget", "camelize", "_", "char", "namespaceCamelize", "capitalize", "dasherize", "tokenize", "isSomething", "object", "hasProperty", "property", "allModifiers", "Action", "index", "descriptor", "schema", "getDefaultEventNameForElement", "eventFilter", "filters", "standardFilter", "params", "pattern", "name", "match", "typecast", "meta", "ctrl", "alt", "shift", "modifier", "defaultEventNames", "e", "tagName", "Binding", "context", "action", "actionEvent", "method", "actionDescriptorFilters", "controller", "passes", "filter", "target", "currentTarget", "identifier", "ElementObserver", "delegate", "mutations", "callback", "mutation", "attributeName", "nodes", "node", "tree", "processor", "AttributeObserver", "add", "fetch", "del", "prune", "values", "Multimap", "set", "size", "_key", "_values", "SelectorObserver", "element", "selector", "delegate", "details", "ElementObserver", "Multimap", "callback", "matches", "tree", "match", "selectors", "_attributeName", "matchedBefore", "StringMapObserver", "mutations", "attributeName", "mutation", "oldValue", "key", "value", "attribute", "TokenListObserver", "AttributeObserver", "unmatchedTokens", "matchedTokens", "tokens", "token", "previousTokens", "currentTokens", "firstDifferingIndex", "zip", "previousToken", "currentToken", "tokensAreEqual", "tokenString", "parseTokenString", "content", "index", "left", "right", "length", "_", "ValueListObserver", "parseResult", "valuesByToken", "error", "BindingObserver", "context", "action", "binding", "Binding", "Action", "ValueObserver", "receiver", "descriptor", "name", "defaultValue", "writer", "rawValue", "rawOldValue", "changedMethodName", "changedMethod", "valueDescriptorMap", "descriptors", "hasMethodName", "capitalize", "TargetObserver", "_a", "readInheritableStaticArrayValues", "constructor", "propertyName", "ancestors", "getAncestorsForConstructor", "values", "getOwnStaticArrayValues", "readInheritableStaticObjectPairs", "pairs", "getOwnStaticObjectPairs", "definition", "OutletObserver", "outletName", "observer", "_selector", "outlet", "hasOutlet", "hasOutletController", "_element", "selectorObserver", "attributeObserver", "dependencies", "module", "identifiers", "Context", "scope", "functionName", "detail", "identifier", "controller", "message", "namespaceCamelize", "methodName", "args", "bless", "shadow", "getBlessedProperties", "properties", "shadowConstructor", "extend", "shadowProperties", "getShadowProperties", "blessedProperties", "blessing", "prototype", "getOwnKeys", "getShadowedDescriptor", "shadowingDescriptor", "object", "extendWithReflect", "extended", "testReflectExtension", "b", "blessDefinition", "Module", "application", "ClassMap", "tokenize", "DataMap", "dasherize", "Guide", "logger", "warnedKeys", "attributeValueContainsToken", "TargetSet", "targetName", "targetNames", "target", "targets", "targetDescriptor", "revisedAttributeName", "OutletSet", "controllerElement", "outletNames", "outlets", "controllerAttribute", "Scope", "_Scope", "schema", "ScopeObserver", "scopesByIdentifier", "referenceCount", "Router", "contexts", "afterLoad", "defaultSchema", "objectFromEntries", "c", "n", "array", "memo", "k", "v", "Application", "Dispatcher", "defaultActionDescriptorFilters", "domReady", "controllerConstructor", "filter", "head", "rest", "resolve", "ClassPropertiesBlessing", "classDefinition", "propertiesForClassDefinition", "classes", "OutletPropertiesBlessing", "outletDefinition", "propertiesForOutletDefinition", "getOutletController", "getControllerAndEnsureConnectedScope", "outletController", "camelizedName", "outletElement", "TargetPropertiesBlessing", "targetDefinition", "propertiesForTargetDefinition", "ValuePropertiesBlessing", "valueDefinitionPairs", "propertyDescriptorMap", "result", "valueDefinitionPair", "valueDescriptor", "parseValueDefinitionPair", "propertiesForValueDefinitionPair", "read", "write", "typeDefinition", "valueDescriptorForTokenAndTypeDefinition", "parseValueTypeConstant", "constant", "parseValueTypeDefault", "parseValueTypeObject", "payload", "typeObject", "hasType", "isSomething", "hasDefault", "fullObject", "onlyType", "onlyDefault", "typeFromObject", "typeFromDefaultValue", "propertyPath", "parseValueTypeDefinition", "typeFromConstant", "type", "defaultValueForDefinition", "defaultValuesByType", "hasProperty", "constantFromType", "camelize", "readers", "writers", "writeString", "writeJSON", "Controller", "_identifier", "_application", "eventName", "prefix", "bubbles", "cancelable", "event", "auto_submit_period_select_controller_default", "Controller", "__publicField", "floating_bar_controller_default", "Controller", "__publicField", "entry", "options", "entries", "camelize", "str", "firstCharUppercase", "replace", "word", "index", "toUpperCase", "toLowerCase", "useStore", "controller", "stores", "constructor", "unsubscribeFunctions", "Error", "Array", "isArray", "length", "forEach", "store", "storeNameAsString", "name", "toString", "slice", "camelizedName", "onStoreUpdateMethodName", "onStoreUpdateMethod", "subscription", "getSubscription", "updateMethod", "value", "call", "methodName", "push", "subscribe", "setStoreValueMethodName", "set", "resetStoreMethodName", "resetValue", "storeGetterMethodName", "Object", "defineProperty", "get", "enumerable", "configurable", "isWarned", "storeProxy", "Proxy", "target", "prop", "receiver", "Reflect", "originalDisconnect", "disconnect", "bind", "unsubscribe", "typeMap", "String", "Number", "Boolean", "Store", "type", "this", "subscribers", "Set", "newValue", "options", "filter", "Promise", "resolvePromise", "finalValue", "getPrototypeOf", "setInitialValue", "setValue", "notifySubscribers", "initialValue", "callback", "add", "delete", "from", "resolvedValue", "error", "createStore", "symbolName", "Symbol", "catch", "message", "initialValue", "locationFilterStore", "o", "location_filter_controller_default", "Controller", "__publicField", "event", "t", "newValue", "initialValue", "locationFilterStore", "location_filter_menu_item_controller_default", "Controller", "t", "newValue", "initialValue", "isActive", "__publicField", "locationFilterStore", "top", "bottom", "right", "left", "auto", "basePlacements", "start", "end", "clippingParents", "viewport", "popper", "reference", "variationPlacements", "acc", "placement", "placements", "beforeRead", "read", "afterRead", "beforeMain", "main", "afterMain", "beforeWrite", "write", "afterWrite", "modifierPhases", "getNodeName", "element", "getWindow", "node", "ownerDocument", "isElement", "node", "OwnElement", "getWindow", "isHTMLElement", "isShadowRoot", "applyStyles", "_ref", "state", "name", "style", "attributes", "element", "isHTMLElement", "getNodeName", "value", "effect", "_ref2", "initialStyles", "styleProperties", "property", "attribute", "applyStyles_default", "getBasePlacement", "placement", "max", "min", "round", "getUAString", "uaData", "item", "isLayoutViewport", "getUAString", "getBoundingClientRect", "element", "includeScale", "isFixedStrategy", "clientRect", "scaleX", "scaleY", "isHTMLElement", "round", "_ref", "isElement", "getWindow", "visualViewport", "addVisualOffsets", "isLayoutViewport", "x", "y", "width", "height", "getLayoutRect", "element", "clientRect", "getBoundingClientRect", "width", "height", "contains", "parent", "child", "rootNode", "isShadowRoot", "next", "getComputedStyle", "element", "getWindow", "isTableElement", "element", "getNodeName", "getDocumentElement", "element", "isElement", "getParentNode", "element", "getNodeName", "isShadowRoot", "getDocumentElement", "getTrueOffsetParent", "element", "isHTMLElement", "getComputedStyle", "getContainingBlock", "isFirefox", "getUAString", "isIE", "elementCss", "currentNode", "getParentNode", "isShadowRoot", "getNodeName", "css", "getOffsetParent", "window", "getWindow", "offsetParent", "isTableElement", "getMainAxisFromPlacement", "placement", "within", "min", "value", "max", "withinMaxClamp", "v", "getFreshSideObject", "mergePaddingObject", "paddingObject", "getFreshSideObject", "expandToHashMap", "value", "keys", "hashMap", "key", "toPaddingObject", "padding", "state", "mergePaddingObject", "expandToHashMap", "basePlacements", "arrow", "_ref", "_state$modifiersData$", "name", "options", "arrowElement", "popperOffsets", "basePlacement", "getBasePlacement", "axis", "getMainAxisFromPlacement", "isVertical", "left", "right", "len", "paddingObject", "arrowRect", "getLayoutRect", "minProp", "top", "maxProp", "bottom", "endDiff", "startDiff", "arrowOffsetParent", "getOffsetParent", "clientSize", "centerToReference", "min", "max", "center", "offset", "within", "axisProp", "effect", "_ref2", "_options$element", "contains", "arrow_default", "getVariation", "placement", "unsetSides", "roundOffsetsByDPR", "_ref", "win", "x", "y", "dpr", "round", "mapToStyles", "_ref2", "_Object$assign2", "popper", "popperRect", "placement", "variation", "offsets", "position", "gpuAcceleration", "adaptive", "roundOffsets", "isFixed", "_offsets$x", "_offsets$y", "_ref3", "hasX", "hasY", "sideX", "left", "sideY", "top", "offsetParent", "getOffsetParent", "heightProp", "widthProp", "getWindow", "getDocumentElement", "getComputedStyle", "right", "end", "bottom", "offsetY", "offsetX", "commonStyles", "_ref4", "_Object$assign", "computeStyles", "_ref5", "state", "options", "_options$gpuAccelerat", "_options$adaptive", "_options$roundOffsets", "getBasePlacement", "getVariation", "computeStyles_default", "passive", "effect", "_ref", "state", "instance", "options", "_options$scroll", "scroll", "_options$resize", "resize", "window", "getWindow", "scrollParents", "scrollParent", "eventListeners_default", "hash", "getOppositePlacement", "placement", "matched", "hash", "getOppositeVariationPlacement", "placement", "matched", "getWindowScroll", "node", "win", "getWindow", "scrollLeft", "scrollTop", "getWindowScrollBarX", "element", "getBoundingClientRect", "getDocumentElement", "getWindowScroll", "getViewportRect", "element", "strategy", "win", "getWindow", "html", "getDocumentElement", "visualViewport", "width", "height", "x", "y", "layoutViewport", "isLayoutViewport", "getWindowScrollBarX", "getDocumentRect", "element", "_element$ownerDocumen", "html", "getDocumentElement", "winScroll", "getWindowScroll", "body", "width", "max", "height", "x", "getWindowScrollBarX", "y", "getComputedStyle", "isScrollParent", "element", "_getComputedStyle", "getComputedStyle", "overflow", "overflowX", "overflowY", "getScrollParent", "node", "getNodeName", "isHTMLElement", "isScrollParent", "getParentNode", "listScrollParents", "element", "list", "_element$ownerDocumen", "scrollParent", "getScrollParent", "isBody", "win", "getWindow", "target", "isScrollParent", "updatedList", "getParentNode", "rectToClientRect", "rect", "getInnerBoundingClientRect", "element", "strategy", "rect", "getBoundingClientRect", "getClientRectFromMixedType", "clippingParent", "viewport", "rectToClientRect", "getViewportRect", "isElement", "getDocumentRect", "getDocumentElement", "getClippingParents", "clippingParents", "listScrollParents", "getParentNode", "canEscapeClipping", "getComputedStyle", "clipperElement", "isHTMLElement", "getOffsetParent", "contains", "getNodeName", "getClippingRect", "boundary", "rootBoundary", "mainClippingParents", "firstClippingParent", "clippingRect", "accRect", "max", "min", "computeOffsets", "_ref", "reference", "element", "placement", "basePlacement", "getBasePlacement", "variation", "getVariation", "commonX", "commonY", "offsets", "top", "bottom", "right", "left", "mainAxis", "getMainAxisFromPlacement", "len", "start", "end", "detectOverflow", "state", "options", "_options", "_options$placement", "placement", "_options$strategy", "strategy", "_options$boundary", "boundary", "clippingParents", "_options$rootBoundary", "rootBoundary", "viewport", "_options$elementConte", "elementContext", "popper", "_options$altBoundary", "altBoundary", "_options$padding", "padding", "paddingObject", "mergePaddingObject", "expandToHashMap", "basePlacements", "altContext", "reference", "popperRect", "element", "clippingClientRect", "getClippingRect", "isElement", "getDocumentElement", "referenceClientRect", "getBoundingClientRect", "popperOffsets", "computeOffsets", "popperClientRect", "rectToClientRect", "elementClientRect", "overflowOffsets", "offsetData", "offset", "key", "multiply", "right", "bottom", "axis", "top", "computeAutoPlacement", "state", "options", "_options", "placement", "boundary", "rootBoundary", "padding", "flipVariations", "_options$allowedAutoP", "allowedAutoPlacements", "placements", "variation", "getVariation", "variationPlacements", "basePlacements", "allowedPlacements", "overflows", "acc", "detectOverflow", "getBasePlacement", "a", "b", "getExpandedFallbackPlacements", "placement", "getBasePlacement", "auto", "oppositePlacement", "getOppositePlacement", "getOppositeVariationPlacement", "flip", "_ref", "state", "options", "name", "_options$mainAxis", "checkMainAxis", "_options$altAxis", "checkAltAxis", "specifiedFallbackPlacements", "padding", "boundary", "rootBoundary", "altBoundary", "_options$flipVariatio", "flipVariations", "allowedAutoPlacements", "preferredPlacement", "basePlacement", "isBasePlacement", "fallbackPlacements", "placements", "acc", "computeAutoPlacement", "referenceRect", "popperRect", "checksMap", "makeFallbackChecks", "firstFittingPlacement", "i", "_basePlacement", "isStartVariation", "getVariation", "start", "isVertical", "top", "bottom", "len", "overflow", "detectOverflow", "mainVariationSide", "right", "left", "altVariationSide", "checks", "check", "numberOfChecks", "_loop", "_i", "fittingPlacement", "_ret", "flip_default", "getSideOffsets", "overflow", "rect", "preventedOffsets", "isAnySideFullyClipped", "top", "right", "bottom", "left", "side", "hide", "_ref", "state", "name", "referenceRect", "popperRect", "referenceOverflow", "detectOverflow", "popperAltOverflow", "referenceClippingOffsets", "popperEscapeOffsets", "isReferenceHidden", "hasPopperEscaped", "hide_default", "distanceAndSkiddingToXY", "placement", "rects", "offset", "basePlacement", "getBasePlacement", "invertDistance", "left", "top", "_ref", "skidding", "distance", "right", "_ref2", "state", "options", "name", "_options$offset", "data", "placements", "acc", "_data$state$placement", "x", "y", "offset_default", "popperOffsets", "_ref", "state", "name", "computeOffsets", "popperOffsets_default", "getAltAxis", "axis", "preventOverflow", "_ref", "state", "options", "name", "_options$mainAxis", "checkMainAxis", "_options$altAxis", "checkAltAxis", "boundary", "rootBoundary", "altBoundary", "padding", "_options$tether", "tether", "_options$tetherOffset", "tetherOffset", "overflow", "detectOverflow", "basePlacement", "getBasePlacement", "variation", "getVariation", "isBasePlacement", "mainAxis", "getMainAxisFromPlacement", "altAxis", "getAltAxis", "popperOffsets", "referenceRect", "popperRect", "tetherOffsetValue", "normalizedTetherOffsetValue", "offsetModifierState", "data", "_offsetModifierState$", "mainSide", "top", "left", "altSide", "bottom", "right", "len", "offset", "min", "max", "additive", "minLen", "start", "maxLen", "arrowElement", "arrowRect", "getLayoutRect", "arrowPaddingObject", "getFreshSideObject", "arrowPaddingMin", "arrowPaddingMax", "arrowLen", "within", "minOffset", "maxOffset", "arrowOffsetParent", "getOffsetParent", "clientOffset", "offsetModifierValue", "tetherMin", "tetherMax", "preventedOffset", "_offsetModifierState$2", "_mainSide", "_altSide", "_offset", "_len", "_min", "_max", "isOriginSide", "_offsetModifierValue", "_tetherMin", "_tetherMax", "_preventedOffset", "withinMaxClamp", "preventOverflow_default", "getHTMLElementScroll", "element", "getNodeScroll", "node", "getWindow", "isHTMLElement", "getWindowScroll", "getHTMLElementScroll", "isElementScaled", "element", "rect", "scaleX", "round", "scaleY", "getCompositeRect", "elementOrVirtualElement", "offsetParent", "isFixed", "isOffsetParentAnElement", "isHTMLElement", "offsetParentIsScaled", "documentElement", "getDocumentElement", "getBoundingClientRect", "scroll", "offsets", "getNodeName", "isScrollParent", "getNodeScroll", "getWindowScrollBarX", "order", "modifiers", "map", "visited", "result", "modifier", "sort", "requires", "dep", "depModifier", "orderModifiers", "orderedModifiers", "modifierPhases", "acc", "phase", "debounce", "fn", "pending", "resolve", "mergeByName", "modifiers", "merged", "current", "existing", "key", "DEFAULT_OPTIONS", "areValidElements", "_len", "args", "_key", "element", "popperGenerator", "generatorOptions", "_generatorOptions", "_generatorOptions$def", "defaultModifiers", "_generatorOptions$def2", "defaultOptions", "reference", "popper", "options", "state", "effectCleanupFns", "isDestroyed", "instance", "setOptionsAction", "cleanupModifierEffects", "isElement", "listScrollParents", "orderedModifiers", "orderModifiers", "mergeByName", "m", "runModifierEffects", "_state$elements", "getCompositeRect", "getOffsetParent", "getLayoutRect", "modifier", "index", "_state$orderedModifie", "fn", "_state$orderedModifie2", "_options", "name", "debounce", "resolve", "_ref", "_ref$options", "effect", "cleanupFn", "noopFn", "defaultModifiers", "eventListeners_default", "popperOffsets_default", "computeStyles_default", "applyStyles_default", "offset_default", "flip_default", "preventOverflow_default", "arrow_default", "hide_default", "createPopper", "popperGenerator", "ROUND_ARROW", "BOX_CLASS", "CONTENT_CLASS", "BACKDROP_CLASS", "ARROW_CLASS", "SVG_ARROW_CLASS", "TOUCH_OPTIONS", "passive", "capture", "TIPPY_DEFAULT_APPEND_TO", "document", "body", "getValueAtIndexOrReturn", "value", "index", "defaultValue", "Array", "isArray", "v", "isType", "type", "str", "toString", "call", "indexOf", "invokeWithArgsOrReturn", "args", "debounce", "fn", "ms", "timeout", "arg", "clearTimeout", "setTimeout", "removeProperties", "obj", "keys", "clone", "forEach", "key", "splitBySpaces", "split", "filter", "Boolean", "normalizeToArray", "concat", "pushIfUnique", "arr", "push", "unique", "item", "getBasePlacement", "placement", "arrayFrom", "slice", "removeUndefinedProps", "Object", "reduce", "acc", "undefined", "div", "document", "createElement", "isElement", "some", "isNodeList", "isMouseEvent", "isReferenceElement", "_tippy", "reference", "getArrayOfElements", "querySelectorAll", "setTransitionDuration", "els", "el", "style", "transitionDuration", "setVisibilityState", "state", "setAttribute", "getOwnerDocument", "elementOrElements", "_element$ownerDocumen", "_normalizeToArray", "element", "ownerDocument", "body", "isCursorOutsideInteractiveBorder", "popperTreeData", "event", "clientX", "clientY", "every", "_ref", "popperRect", "popperState", "props", "interactiveBorder", "basePlacement", "offsetData", "modifiersData", "offset", "topDistance", "top", "y", "bottomDistance", "bottom", "leftDistance", "left", "x", "rightDistance", "right", "exceedsTop", "exceedsBottom", "exceedsLeft", "exceedsRight", "updateTransitionEndListener", "box", "action", "listener", "method", "actualContains", "parent", "child", "target", "_target$getRootNode", "contains", "getRootNode", "host", "currentInput", "isTouch", "lastMouseMoveTime", "onDocumentTouchStart", "window", "performance", "addEventListener", "onDocumentMouseMove", "now", "removeEventListener", "onWindowBlur", "activeElement", "instance", "blur", "isVisible", "bindGlobalEventListeners", "TOUCH_OPTIONS", "isBrowser", "isIE11", "msCrypto", "pluginProps", "animateFill", "followCursor", "inlinePositioning", "sticky", "renderProps", "allowHTML", "animation", "arrow", "content", "inertia", "maxWidth", "role", "theme", "zIndex", "defaultProps", "appendTo", "TIPPY_DEFAULT_APPEND_TO", "aria", "expanded", "delay", "duration", "getReferenceClientRect", "hideOnClick", "ignoreAttributes", "interactive", "interactiveBorder", "interactiveDebounce", "moveTransition", "offset", "onAfterUpdate", "onBeforeUpdate", "onCreate", "onDestroy", "onHidden", "onHide", "onMount", "onShow", "onShown", "onTrigger", "onUntrigger", "onClickOutside", "placement", "plugins", "popperOptions", "render", "showOnCreate", "touch", "trigger", "triggerTarget", "defaultKeys", "Object", "keys", "setDefaultProps", "partialProps", "forEach", "key", "getExtendedPassedProps", "passedProps", "reduce", "acc", "plugin", "name", "defaultValue", "_name", "undefined", "getDataAttributeProps", "reference", "propKeys", "props", "valueAsString", "getAttribute", "trim", "JSON", "parse", "evaluateProps", "out", "invokeWithArgsOrReturn", "innerHTML", "dangerouslySetInnerHTML", "element", "html", "createArrowElement", "value", "arrow", "div", "className", "ARROW_CLASS", "SVG_ARROW_CLASS", "isElement", "appendChild", "setContent", "content", "props", "allowHTML", "textContent", "getChildren", "popper", "box", "firstElementChild", "boxChildren", "arrayFrom", "children", "find", "node", "classList", "contains", "CONTENT_CLASS", "backdrop", "BACKDROP_CLASS", "render", "instance", "BOX_CLASS", "setAttribute", "onUpdate", "prevProps", "nextProps", "_getChildren", "theme", "removeAttribute", "animation", "inertia", "style", "maxWidth", "role", "removeChild", "$$tippy", "idCounter", "mouseMoveListeners", "mountedInstances", "createTippy", "reference", "passedProps", "evaluateProps", "defaultProps", "getExtendedPassedProps", "removeUndefinedProps", "showTimeout", "hideTimeout", "scheduleHideAnimationFrame", "isVisibleFromClick", "didHideDueToDocumentMouseDown", "didTouchMove", "ignoreOnFirstUpdate", "lastTriggerEvent", "currentTransitionEndListener", "onFirstUpdate", "listeners", "debouncedOnMouseMove", "debounce", "onMouseMove", "interactiveDebounce", "currentTarget", "id", "popperInstance", "plugins", "unique", "state", "isEnabled", "isVisible", "isDestroyed", "isMounted", "isShown", "clearDelayTimeouts", "setProps", "show", "hide", "hideWithInteractivity", "enable", "disable", "unmount", "destroy", "_props$render", "_tippy", "pluginsHooks", "map", "plugin", "fn", "hasAriaExpanded", "hasAttribute", "addListeners", "handleAriaExpandedAttribute", "handleStyles", "invokeHook", "showOnCreate", "scheduleShow", "addEventListener", "interactive", "trigger", "indexOf", "getDocument", "getNormalizedTouchSettings", "touch", "Array", "isArray", "getIsCustomTouchBehavior", "getIsDefaultRenderFn", "_instance$props$rende", "getCurrentTarget", "parent", "parentNode", "getOwnerDocument", "document", "getDefaultTemplateChildren", "getDelay", "isShow", "currentInput", "isTouch", "type", "getValueAtIndexOrReturn", "delay", "fromHide", "pointerEvents", "zIndex", "hook", "args", "shouldInvokePropsHook", "forEach", "pluginHooks", "_instance$props", "handleAriaContentAttribute", "aria", "attr", "nodes", "normalizeToArray", "triggerTarget", "currentValue", "getAttribute", "nextValue", "replace", "trim", "expanded", "cleanupInteractiveMouseListeners", "removeEventListener", "filter", "listener", "onDocumentPress", "event", "actualTarget", "composedPath", "target", "actualContains", "some", "el", "hideOnClick", "setTimeout", "removeDocumentPress", "onTouchMove", "onTouchStart", "addDocumentPress", "doc", "TOUCH_OPTIONS", "onTransitionedOut", "duration", "callback", "onTransitionEnd", "onTransitionedIn", "updateTransitionEndListener", "on", "eventType", "handler", "options", "push", "onTrigger", "passive", "onMouseLeave", "splitBySpaces", "isIE11", "onBlurOrFocusOut", "removeListeners", "_ref", "_lastTriggerEvent", "shouldScheduleClickHide", "isEventListenerStopped", "wasFocused", "isMouseEvent", "scheduleHide", "isCursorOverReferenceOrPopper", "popperTreeData", "getNestedPopperTree", "concat", "_instance$popperInsta", "popperRect", "getBoundingClientRect", "popperState", "Boolean", "isCursorOutsideInteractiveBorder", "shouldBail", "relatedTarget", "createPopperInstance", "destroyPopperInstance", "_instance$props2", "popperOptions", "placement", "offset", "getReferenceClientRect", "moveTransition", "computedReference", "contextElement", "tippyModifier", "name", "enabled", "phase", "requires", "_ref2", "_getDefaultTemplateCh", "attributes", "modifiers", "padding", "top", "bottom", "left", "right", "adaptive", "createPopper", "mount", "appendTo", "TIPPY_DEFAULT_APPEND_TO", "invokeWithArgsOrReturn", "querySelectorAll", "_getNormalizedTouchSe", "touchValue", "touchDelay", "requestAnimationFrame", "clearTimeout", "cancelAnimationFrame", "partialProps", "ignoreAttributes", "nestedPopper", "forceUpdate", "isAlreadyVisible", "isDisabled", "isTouchAndTouchDisabled", "onShow", "visibility", "transition", "_getDefaultTemplateCh2", "setTransitionDuration", "_instance$popperInsta2", "offsetHeight", "_getDefaultTemplateCh3", "setVisibilityState", "pushIfUnique", "isAlreadyHidden", "onHide", "_getDefaultTemplateCh4", "i", "tippy", "targets", "optionalProps", "bindGlobalEventListeners", "elements", "getArrayOfElements", "isSingleContentElement", "isMoreThanOneReferenceElement", "instances", "reduce", "acc", "setDefaultProps", "applyStylesModifier", "applyStyles", "effect", "_ref", "state", "initialStyles", "popper", "position", "options", "strategy", "left", "top", "margin", "arrow", "reference", "Object", "assign", "elements", "style", "styles", "createSingleton", "tippyInstances", "optionalProps", "_optionalProps$popper", "individualInstances", "references", "triggerTargets", "currentTarget", "overrides", "interceptSetPropsCleanups", "shownOnCreate", "setTriggerTargets", "map", "instance", "normalizeToArray", "props", "triggerTarget", "reduce", "acc", "item", "concat", "setReferences", "enableInstances", "isEnabled", "forEach", "enable", "disable", "interceptSetProps", "singleton", "originalSetProps", "setProps", "prepareInstance", "target", "index", "indexOf", "overrideProps", "prop", "getReferenceClientRect", "_references$index", "getBoundingClientRect", "plugin", "fn", "onDestroy", "onHidden", "onClickOutside", "showOnCreate", "onShow", "onTrigger", "event", "tippy", "div", "removeProperties", "plugins", "popperOptions", "modifiers", "originalShow", "show", "ref", "showNext", "first", "showPrevious", "last", "length", "setInstances", "nextInstances", "tippy", "setDefaultProps", "render", "POPOVER_BREAKPOINT", "primary_filters_controller_default", "Controller", "__publicField", "createSingleton", "tippy_esm_default", "event", "activePopoverButton", "activeGroup", "group", "buttons", "activeButton", "button", "elements", "key", "element", "isNumber", "subject", "isString", "isBoolean", "isObject", "Object", "prototype", "toString", "call", "mathAbs", "n", "Math", "abs", "mathSign", "sign", "deltaAbs", "valueB", "valueA", "factorAbs", "diff", "roundToTwoDecimals", "num", "round", "arrayKeys", "array", "objectKeys", "map", "Number", "arrayLast", "arrayLastIndex", "max", "length", "arrayIsLastIndex", "index", "arrayFromNumber", "startAt", "Array", "from", "_", "i", "object", "keys", "objectsMergeDeep", "objectA", "objectB", "reduce", "mergedObjects", "currentObject", "forEach", "key", "areObjects", "isMouseEvent", "evt", "ownerWindow", "MouseEvent", "Alignment", "align", "viewSize", "predefined", "start", "center", "end", "measure", "EventStore", "listeners", "add", "node", "type", "handler", "options", "passive", "removeListener", "addEventListener", "removeEventListener", "legacyMediaQueryList", "addListener", "push", "self", "clear", "filter", "remove", "Animations", "ownerDocument", "update", "render", "documentVisibleHandler", "fixedTimeStep", "lastTimeStamp", "accumulatedTime", "animationId", "init", "hidden", "reset", "destroy", "stop", "animate", "timeStamp", "timeElapsed", "alpha", "requestAnimationFrame", "cancelAnimationFrame", "Axis", "axis", "contentDirection", "isRightToLeft", "isVertical", "scroll", "cross", "startEdge", "getStartEdge", "endEdge", "getEndEdge", "measureSize", "nodeRect", "height", "width", "direction", "Limit", "min", "reachedMin", "reachedMax", "reachedAny", "constrain", "removeOffset", "ceil", "Counter", "loop", "loopEnd", "counter", "withinLimit", "get", "set", "clone", "DragHandler", "rootNode", "target", "dragTracker", "location", "animation", "scrollTo", "scrollBody", "scrollTarget", "eventHandler", "percentOfView", "dragFree", "dragThreshold", "skipSnaps", "baseFriction", "watchDrag", "crossAxis", "focusNodes", "nonPassiveEvent", "initEvents", "dragEvents", "goToNextThreshold", "snapForceBoost", "mouse", "touch", "freeForceBoost", "baseSpeed", "isMoving", "startScroll", "startCross", "pointerIsDown", "preventScroll", "preventClick", "isMouse", "emblaApi", "downIfAllowed", "down", "preventDefault", "up", "click", "addDragEvents", "move", "isFocusNode", "nodeName", "includes", "forceBoost", "allowedForce", "force", "targetChanged", "next", "baseForce", "byDistance", "distance", "byIndex", "isMouseEvt", "buttons", "button", "pointerDown", "useFriction", "useDuration", "readPoint", "emit", "touches", "lastScroll", "lastCross", "diffScroll", "diffCross", "cancelable", "pointerMove", "rawForce", "pointerUp", "forceFactor", "speed", "friction", "stopPropagation", "DragTracker", "startEvent", "lastEvent", "readTime", "evtAxis", "property", "coord", "expired", "logInterval", "diffDrag", "diffTime", "NodeRects", "offsetTop", "offsetLeft", "offsetWidth", "offsetHeight", "top", "right", "bottom", "left", "PercentOfView", "ResizeHandler", "container", "slides", "watchResize", "nodeRects", "observeNodes", "concat", "resizeObserver", "containerSize", "slideSizes", "destroyed", "readSize", "defaultCallback", "entries", "entry", "isContainer", "slideIndex", "indexOf", "lastSize", "newSize", "reInit", "ResizeObserver", "observe", "disconnect", "ScrollBody", "offsetLocation", "previousLocation", "baseDuration", "scrollVelocity", "scrollDirection", "scrollDuration", "scrollFriction", "rawLocation", "rawLocationPrevious", "seek", "displacement", "isInstant", "scrollDistance", "settled", "duration", "velocity", "useBaseDuration", "useBaseFriction", "ScrollBounds", "limit", "pullBackThreshold", "edgeOffsetTolerance", "frictionLimit", "disabled", "shouldConstrain", "edge", "diffToEdge", "diffToTarget", "subtract", "toggleActive", "active", "ScrollContain", "contentSize", "snapsAligned", "containScroll", "pixelTolerance", "scrollBounds", "snapsBounded", "measureBounded", "scrollContainLimit", "findScrollContainLimit", "snapsContained", "measureContained", "usePixelTolerance", "bound", "snap", "startSnap", "endSnap", "lastIndexOf", "snapAligned", "isFirst", "isLast", "scrollBound", "parseFloat", "toFixed", "slice", "ScrollLimit", "scrollSnaps", "ScrollLooper", "vectors", "jointSafety", "shouldLoop", "loopDistance", "v", "ScrollProgress", "currentLocation", "ScrollSnaps", "alignment", "containerRect", "slideRects", "slidesToScroll", "groupSlides", "alignments", "measureSizes", "snaps", "measureUnaligned", "measureAligned", "rects", "rect", "g", "SlideRegistry", "containSnaps", "slideIndexes", "slideRegistry", "createSlideRegistry", "groupedSlideIndexes", "doNotContain", "group", "groups", "range", "ScrollTarget", "targetVector", "minDistance", "distances", "sort", "a", "b", "findTargetSnap", "ascDiffsToSnaps", "shortcut", "d1", "d2", "targets", "matchingTargets", "t", "diffToSnap", "targetSnapDistance", "reachedBound", "snapDistance", "ScrollTo", "indexCurrent", "indexPrevious", "distanceDiff", "indexDiff", "targetIndex", "SlideFocus", "root", "eventStore", "watchFocus", "focusListenerOptions", "capture", "lastTabPressTime", "Date", "getTime", "scrollLeft", "findIndex", "document", "registerTabPress", "slide", "event", "code", "Vector1D", "initialValue", "value", "normalizeInput", "Translate", "translate", "x", "y", "containerStyle", "style", "previousTarget", "to", "newTarget", "transform", "getAttribute", "removeAttribute", "SlideLooper", "slideSizesWithGaps", "ascItems", "descItems", "reverse", "loopPoints", "startPoints", "endPoints", "removeSlideSizes", "indexes", "slidesInGap", "gap", "findSlideBounds", "offset", "roundingSafety", "findLoopPoints", "isEndEdge", "slideBounds", "initial", "altered", "boundEdge", "loopPoint", "slideLocation", "canLoop", "every", "otherIndexes", "shiftLocation", "SlidesHandler", "watchSlides", "mutationObserver", "mutations", "mutation", "MutationObserver", "childList", "SlidesInView", "threshold", "intersectionEntryMap", "inViewCache", "notInViewCache", "intersectionObserver", "IntersectionObserver", "parentElement", "createInViewList", "inView", "list", "parseInt", "isIntersecting", "SlideSizes", "readEdgeGap", "withEdgeGap", "startGap", "measureStartGap", "endGap", "measureEndGap", "measureWithGaps", "slideRect", "getComputedStyle", "getPropertyValue", "SlidesToScroll", "groupByNumber", "byNumber", "groupSize", "bySize", "rectB", "rectA", "edgeA", "edgeB", "gapA", "gapB", "chunkSize", "currentSize", "previousSize", "Engine", "scrollAxis", "startIndex", "inViewThreshold", "dragHandler", "scrollLooper", "slideLooper", "shouldSettle", "withinBounds", "hasSettled", "hasSettledAndIdle", "interpolatedLocation", "engine", "startLocation", "scrollProgress", "slidesInView", "slideFocus", "resizeHandler", "scrollSnapList", "slidesHandler", "EventHandler", "api", "getListeners", "e", "on", "cb", "off", "defaultOptions", "breakpoints", "OptionsHandler", "mergeOptions", "optionsA", "optionsB", "optionsAtMedia", "matchedMediaOptions", "media", "matchMedia", "matches", "mediaOption", "optionsMediaQueries", "optionsList", "acc", "mediaQueries", "PluginsHandler", "optionsHandler", "activePlugins", "plugins", "plugin", "assign", "name", "EmblaCarousel", "userOptions", "userPlugins", "defaultView", "pluginsHandler", "mediaHandlers", "reActivate", "optionsBase", "globalOptions", "pluginList", "pluginApis", "storeElements", "userContainer", "userSlides", "querySelector", "children", "customSlides", "querySelectorAll", "createEngine", "optionsWithoutLoop", "activate", "withOptions", "withPlugins", "query", "offsetParent", "selectedScrollSnap", "deActivate", "jump", "scrollNext", "scrollPrev", "prev", "canScrollNext", "canScrollPrev", "previousScrollSnap", "slidesNotInView", "internalEngine", "containerNode", "slideNodes", "setTimeout", "undefined", "carousel_controller_default", "Controller", "EmblaCarousel", "canScrollPrev", "canScrollNext", "selectedSnap", "snapCount", "__publicField", "PRIVACY_PATHS", "consent_management_controller_default", "Controller", "__publicField", "dataRedactionMode", "preferences", "statistics", "marketing", "enabled", "type", "currentPath", "consentValues", "consent", "action", "method", "error", "isDisplayed", "consentString", "oldConsentsIdentifiers", "consentMapping", "cookieExpiryDays", "currentDate", "expires", "identifier", "identifier_type", "old_cookie_name", "old_cookie_value", "name", "ca", "c", "oldCookie", "cookieName", "consentType", "cookieValue", "regex", "matches", "dialog", "increment_controller_default", "Controller", "input", "inputTarget", "__publicField", "initialize_controller_default", "Controller", "openable_controller_default", "Controller", "__publicField", "element", "event", "scrollY", "overlappable_controller_default", "Controller", "subject", "index", "otherSubject", "rect", "otherRect", "__publicField", "import_react", "import_react_dom", "import_react", "import_react", "PeriodSelectorDay", "startDate", "endDate", "hoverDate", "mode", "holidays", "day", "monthDate", "minDate", "maxDate", "maxDuration", "onSelectStartDate", "onSelectEndDate", "onHoverDate", "sameMonth", "isAfterStart", "isAfterMinDate", "isBeforeMaxDate", "handleMouseEnter", "handleClick", "React", "dayClass", "maybeRenderHolidayBar", "holiday", "HolidayBar", "stateClass", "DAY_FORMAT", "DISPLAY_FORMAT", "PeriodSelector", "initialStartDate", "initialEndDate", "minDateProp", "maxDateProp", "maxDuration", "canReset", "startDateDefaultText", "endDateDefaultText", "holidays", "wrapperClass", "onUpdateDropdownPosition", "onSelect", "onReset", "mode", "setMode", "startDate", "setStartDate", "endDate", "setEndDate", "hoverDate", "setHoverDate", "activeMonthDate", "setActiveMonthDate", "movingNext", "setMovingNext", "movingPrev", "setMovingPrev", "minDate", "maxDate", "mouseDownRef", "timerRef", "debouncedUpdateDropdownPosition", "handleWindowMouseDown", "handleMouseDown", "handleMouseUp", "makeActive", "event", "onResetButtonClick", "handleNextMonthClick", "withDelay", "handleNextMonthDone", "handlePrevMonthClick", "handlePrevMonthDone", "callback", "moveDone", "newMonth", "handleSelectStartDate", "day", "handleSelectEndDate", "startDateClasses", "endDateClasses", "activeClass", "movingClass", "startDateText", "React", "endDateText", "ResetButton", "Months", "onClick", "onSelectStartDate", "onSelectEndDate", "onHoverDate", "offset", "Month", "generateDayLabels", "now", "i", "monthDate", "dayLabels", "Weeks", "PlaceholderRows", "weekDates", "currentDate", "week", "PeriodSelectorDay", "rowsCount", "_", "PlaceholderRow", "period_select_controller_default", "Controller", "__publicField", "startDate", "endDate", "$dropdown", "$select", "spaceToWindowTop", "spaceToDocumentTop", "$offset", "selectHeight", "ReactDOM", "React", "PeriodSelector", "pop_up_controller_default", "Controller", "seenPopUps", "__publicField", "recaptcha_controller_default", "Controller", "event", "token", "__publicField", "slideshow_controller_default", "Controller", "event", "index", "slide", "fadeInStart", "fadeInStep", "__publicField", "sticky_controller_default", "Controller", "stuck", "className", "__publicField", "turbo_opt_in_controller_default", "Controller", "element", "init_src", "Idiomorph", "noOp", "defaults", "elt", "morph", "oldNode", "newContent", "config", "normalizeElement", "newNode", "normalizeParent", "ctx", "createMorphContext", "morphedNodes", "saveAndRestoreFocus", "withHeadBlocking", "morphChildren", "morphOuterHTML", "oldParent", "fn", "_a", "activeElement", "activeElementId", "selectionStart", "selectionEnd", "results", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "removeNodesBetween", "morphNode", "movedChild", "moveBeforeById", "insertedNode", "createNode", "tempNode", "removeNode", "newEmptyChild", "newClonedChild", "node", "startPoint", "softMatch", "nextSibling", "siblingSoftMatchCount", "cursor", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "id", "oldElt", "newElt", "moveBefore", "startInclusive", "endExclusive", "parentNode", "after", "target", "removeElementFromAncestorsIdMaps", "element", "idSet", "handleHeadElement", "morphAttributes", "ignoreValueOfActiveElement", "type", "oldAttributes", "newAttributes", "newAttribute", "ignoreAttribute", "i", "oldAttribute", "syncInputValue", "oldElement", "newElement", "newValue", "oldValue", "syncBooleanAttribute", "attributeName", "newLiveValue", "oldLiveValue", "ignoreUpdate", "attr", "updateType", "possibleActiveElement", "callback", "oldHead", "newHead", "promises", "newCtx", "added", "removed", "preserved", "nodesToAppend", "srcToNewHeadNodes", "newHeadChild", "currentHeadElt", "inNewContent", "isReAppended", "isPreserved", "resolve", "promise", "_resolve", "removedElement", "persistentIds", "idMap", "createIdMaps", "mergedConfig", "mergeDefaults", "morphStyle", "createPantry", "finalConfig", "pantry", "findIdElements", "root", "elements", "populateIdMapWithTree", "current", "oldContent", "oldIdElements", "newIdElements", "createPersistentIds", "newRoot", "duplicateIds", "oldIdTagNameMap", "tagName", "generatedByIdiomorph", "content", "parseContent", "SlicedParentNode", "dummyParent", "nodes", "selector", "nodeList", "referenceNode", "parser", "contentWithSvgsRemoved", "htmlElement", "TurboRequestCache", "element", "Idiomorph", "import_lodash", "turbo_request_controller_default", "Controller", "__publicField", "debounce", "TurboRequestCache", "_a", "params", "get", "isFiniteNumber", "Number", "isFinite", "value", "isSafeInteger", "Math", "abs", "MAX_SAFE_INTEGER", "ErrorTypes", "ErrorDetails", "Events", "PlaylistContextType", "MANIFEST", "LEVEL", "AUDIO_TRACK", "SUBTITLE_TRACK", "PlaylistLevelType", "MAIN", "AUDIO", "SUBTITLE", "EWMA", "constructor", "halfLife", "estimate", "weight", "alpha_", "estimate_", "totalWeight_", "exp", "log", "sample", "adjAlpha", "pow", "getTotalWeight", "getEstimate", "zeroFactor", "EwmaBandWidthEstimator", "slow", "fast", "defaultEstimate", "defaultTTFB", "defaultEstimate_", "minWeight_", "minDelayMs_", "slow_", "fast_", "defaultTTFB_", "ttfb_", "update", "durationMs", "numBytes", "max", "numBits", "durationS", "bandwidthInBps", "sampleTTFB", "ttfb", "seconds", "sqrt", "canEstimate", "min", "getEstimateTTFB", "destroy", "Logger", "label", "logger", "trace", "debug", "warn", "info", "error", "lb", "noop", "bind", "fakeLogger", "createLogger", "_extends", "consolePrintFn", "type", "id", "func", "self", "console", "getLoggerFn", "key", "debugConfig", "exportedLogger", "enableLogs", "context", "newLogger", "keys", "forEach", "getMediaSource", "preferManagedMediaSource", "MediaSource", "ManagedMediaSource", "WebKitMediaSource", "isManagedMediaSource", "source", "isCompatibleTrackChange", "currentTracks", "requiredTracks", "trackNames", "Object", "requiredTrackNames", "trackCount", "length", "requiredTrackCount", "some", "name", "indexOf", "utf8ArrayToStr", "array", "exitOnNull", "TextDecoder", "decoded", "decode", "idx", "substring", "replace", "len", "c", "char2", "char3", "out", "i", "String", "fromCharCode", "arrayToHex", "str", "h", "toString", "hexToArrayBuffer", "Uint8Array", "from", "split", "buffer", "root", "URL_REGEX", "FIRST_SEGMENT_REGEX", "SLASH_DOT_REGEX", "SLASH_DOT_DOT_REGEX", "URLToolkit", "baseURL", "relativeURL", "opts", "basePartsForNormalise", "relativeParts", "baseParts", "pathParts", "builtParts", "baseURLPath", "newPath", "url", "parts", "path", "module", "LoadStats", "aborted", "loaded", "retry", "total", "chunkCount", "bwEstimate", "loading", "start", "first", "end", "parsing", "buffering", "ElementaryStreamTypes", "VIDEO", "AUDIOVIDEO", "BaseSegment", "base", "_byteRange", "_url", "_stats", "_streams", "relurl", "makeEnumerable", "setByteRange", "previous", "params", "byteRangeEndOffset", "parseInt", "baseurl", "byteRange", "byteRangeStartOffset", "elementaryStreams", "hasStats", "hasStreams", "stats", "buildAbsoluteURL", "alwaysNormalize", "clearElementaryStreamInfo", "isMediaFragment", "frag", "sn", "Fragment", "_decryptdata", "_programDateTime", "_ref", "_bitrate", "rawProgramDateTime", "tagList", "duration", "levelkeys", "loader", "keyLoader", "level", "cc", "startPTS", "endPTS", "startDTS", "endDTS", "playlistOffset", "deltaPTS", "maxStartPTS", "minEndPTS", "data", "bitrateTest", "title", "initSegment", "endList", "gap", "urlId", "byteLength", "_isFiniteNumber", "_isFiniteNumber2", "bitrate", "decryptdata", "_this$_decryptdata", "NONE", "identity", "getDecryptData", "keyId", "keyFormats", "levelKey", "endProgramDateTime", "programDateTime", "_isFiniteNumber3", "encrypted", "_this$_decryptdata2", "_this$levelkeys$keyFo", "Date", "parse", "_isFiniteNumber4", "ref", "addStart", "setStart", "setDuration", "setKeyFormat", "keyFormat", "_this$_decryptdata3", "abortRequests", "_this$loader", "_this$keyLoader", "abort", "setElementaryStreamInfo", "partial", "Part", "partAttrs", "index", "fragOffset", "independent", "fragment", "decimalFloatingPoint", "bool", "enumeratedString", "audio", "video", "audiovideo", "getOwnPropertyDescriptorFromPrototypeChain", "object", "property", "prototype", "getPrototypeOf", "propertyDescriptor", "getOwnPropertyDescriptor", "d", "enumerable", "defineProperty", "UINT32_MAX", "push", "RemuxerTrackIdConfig", "id3", "text", "bin2str", "apply", "readUint16", "offset", "val", "readUint32", "readSint32", "readUint64", "result", "hasMoofData", "size", "findBox", "results", "subarray", "endbox", "subresults", "slice", "parseSegmentIndex", "sidx", "references", "version", "timescale", "earliestPresentationTime", "firstOffset", "startByte", "referencesCount", "referenceIndex", "referenceInfo", "referenceSize", "subsegmentDuration", "parseInitSegment", "traks", "trak", "tkhd", "trackId", "mdhd", "hdlr", "hdlrType", "soun", "vide", "stsdBox", "stsd", "parseStsd", "_objectSpread", "trex", "track", "default", "flags", "sampleEntries", "sampleEntriesEnd", "fourCC", "codec", "supplemental", "encBoxChildren", "sinf", "schm", "scheme", "frma", "codecFourCC", "avcCBox", "toHex", "parseSupplementalDoViCodec", "codecBox", "esdsBox", "skipBERInteger", "objectType", "firstByte", "audioObjectType", "hvcCBox", "profileByte", "profileSpace", "generalProfileIdc", "profileCompat", "tierFlag", "levelIDC", "constraintIndicator", "reverse32BitInt", "toUpperCase", "constraintString", "byte", "vpcCBox", "profile", "bitDepth", "addLeadingZero", "av1CBox", "highBitDepth", "twelveBit", "monochrome", "chromaSubsamplingX", "chromaSubsamplingY", "chromaSamplePosition", "dvvCResult", "dvXCBox", "doViProfile", "doViLevel", "bytes", "limit", "x", "num", "patchEncyptionData", "isCommonEncryption", "applyToTencBoxes", "tenc", "isAudio", "tencKeyId", "b", "set", "parseKeyIdsFromTenc", "keyIds", "predicate", "encBoxes", "enc", "parseSinf", "getSampleData", "initData", "tracks", "trafs", "traf", "tfhd", "NaN", "sampleCount", "trackTimes", "tfdt", "baseTime", "trackDefault", "tfhdFlags", "defaultSampleDuration", "truns", "sampleDTS", "rawDuration", "sampleDuration", "j", "trun", "sampleIndex", "dataOffsetPresent", "firstSampleFlagsPresent", "sampleDurationPresent", "sampleSizePresent", "sampleFlagsPresent", "sampleCompositionTimeOffsetPresent", "remaining", "keyFrameIndex", "undefined", "keyFrameStart", "sidxMinStart", "Infinity", "sidxMaxEnd", "sidxs", "subSegmentDuration", "reduce", "dur", "segmentValidRange", "segmentedRange", "valid", "remainder", "moofs", "last", "byteOffset", "appendUint8Array", "data1", "data2", "temp", "parseSamples", "timeOffset", "seiSamples", "videoData", "samples", "isHEVCFlavor", "map", "moof", "moofOffset", "baseDataOffsetPresent", "sampleDescriptionIndexPresent", "defaultSampleDurationPresent", "defaultSampleSizePresent", "defaultSampleSize", "defaultSampleFlagsPresent", "tfhdOffset", "isHEVC", "dataOffset", "sampleSize", "sampleCompositionOffsetsPresent", "compositionOffset", "trunOffset", "sampleOffset", "ix", "naluTotalSize", "naluSize", "isSEIMessage", "parseSEIMessageFromNALu", "baseCodec", "naluHeader", "naluType", "unescapedData", "headerSize", "pts", "discardEPB", "seiPtr", "payloadType", "payloadSize", "leftOver", "payPtr", "providerCode", "userStructure", "userDataType", "totalCCs", "enabled", "totalBytes", "byteArray", "uuidStrArray", "userDataBytes", "uuid", "join", "userData", "EPBPositions", "newLength", "newData", "sourceIndex", "shift", "parseEmsg", "schemeIdUri", "timeScale", "presentationTimeDelta", "presentationTime", "eventDuration", "leftPresentationTime", "rightPresentationTime", "_isSafeInteger", "payload", "mp4Box", "mp4pssh", "systemId", "keyids", "RangeError", "kids", "kidCount", "DataView", "setUint32", "dataSize", "parseMultiPssh", "ArrayBuffer", "view", "pssh", "parsePssh", "getUint32", "dataSizeOffset", "kidCounts", "dataSizeOrKidCount", "userAgentHevcSupportIsInaccurate", "test", "navigator", "userAgent", "sampleEntryCodesISO", "a3ds", "alac", "alaw", "dra1", "dtsc", "dtse", "dtsh", "enca", "fLaC", "flac", "FLAC", "g719", "g726", "m4ae", "mha1", "mha2", "mhm1", "mhm2", "mlpa", "mp4a", "Opus", "opus", "samr", "sawb", "sawp", "sevc", "sqcp", "ssmv", "twos", "ulaw", "avc1", "avc2", "avc3", "avc4", "avcp", "av01", "dav1", "drac", "dva1", "dvav", "dvh1", "dvhe", "encv", "hev1", "hvc1", "mjp2", "mp4v", "mvc1", "mvc2", "mvc3", "mvc4", "resv", "rv60", "s263", "svc1", "svc2", "vp08", "vp09", "stpp", "wvtt", "isCodecType", "typeCodes", "areCodecsMediaSourceSupported", "codecs", "isCodecMediaSourceSupported", "_MediaSource$isTypeSu", "isTypeSupported", "mimeTypeForCodec", "videoCodecPreferenceValue", "videoCodec", "codecsSetSelectionPreferenceValue", "codecSet", "limitedHevcSupport", "preferenceValue", "CODEC_COMPATIBLE_NAMES", "getCodecCompatibleNameLower", "lowerCaseCodec", "codecsToCheck", "_getMediaSource", "AUDIO_CODEC_REGEXP", "getCodecCompatibleName", "m", "toLowerCase", "replaceVideoCodec", "originalCodecs", "newVideoCodec", "allCodecs", "pickMostCompleteCodecName", "parsedCodec", "levelCodec", "isCodecSupportedAsType", "levelCodecs", "convertAVC1ToAVCOTI", "videoCodecs", "avcdata", "fillInMissingAV01Params", "startsWith", "av1params", "placeholders", "getM2TSSupportedAudioTypes", "mpeg", "mp3", "ac3", "getCodecsForMimeType", "mimeType", "supportedResult", "supported", "powerEfficient", "smooth", "unsupportedResult", "SUPPORTED_INFO_DEFAULT", "configurations", "decodingInfoResults", "getUnsupportedResult", "requiresMediaCapabilitiesDecodingInfo", "audioTracksByGroup", "currentVideoRange", "currentFrameRate", "currentBw", "audioPreference", "audioGroups", "audioCodec", "audioCodecPreference", "channelsPreference", "channels", "maxChannels", "audioChannels", "groups", "acc", "groupId", "audioTrackGroup", "Error", "width", "height", "frameRate", "videoRange", "getMediaDecodingInfoPromise", "mediaCapabilities", "cache", "Promise", "resolve", "videoDecodeList", "makeVideoConfigurations", "videoCount", "audioDecodeList", "makeAudioConfigurations", "audioCount", "configuration", "audioBitrate", "ua", "all", "decodingInfoKey", "getMediaDecodingInfoKey", "decodingInfo", "then", "catch", "_level$videoCodec", "getVariantDecodingBitrate", "framerate", "videoConfiguration", "contentType", "transferFunction", "hasVideo", "_level$audioCodec", "audioCodecs", "combinedBitrate", "audioGroupId", "_audioTracksByGroup$g", "configs", "audioTrack", "channelsNumber", "parseFloat", "audioConfiguration", "estimatedAudioBitrate", "levelBitrate", "ceil", "averageBitrate", "config", "HdcpLevels", "isHdcpLevel", "VideoRangeValues", "isVideoRange", "HlsSkip", "No", "Yes", "v2", "getSkipValue", "details", "canSkipUntil", "canSkipDateRanges", "age", "playlistRecentEnough", "HlsUrlParameters", "msn", "part", "skip", "addDirectives", "uri", "URL", "searchParams", "href", "Level", "_attrs", "fragmentError", "loadError", "realBitrate", "supportedPromise", "_avgBitrate", "_audioGroups", "_subtitleGroups", "_urlId", "attrs", "optionalFloat", "decimalInteger", "filter", "s", "_data$supplemental", "supplementalVideo", "addGroupId", "SUBTITLES", "maxBitrate", "CODECS", "pathwayId", "score", "hasAudioGroup", "hasGroup", "hasSubtitleGroup", "subtitleGroups", "audioGroupIds", "textGroupIds", "textGroupId", "_this$audioGroups", "_this$subtitleGroups", "addFallback", "isHdrSupported", "matchMedia", "mediaQueryList", "badQuery", "media", "matches", "getVideoSelectionOptions", "videoPreference", "preferHDR", "allowedVideoRanges", "allowAutoPreferHDR", "omitCircularRefsReplacer", "replacer", "known", "WeakSet", "_", "has", "add", "stringify", "JSON", "getStartCodecTier", "codecTiers", "codecSets", "videoCodecPreference", "preferStereo", "hasStereo", "hasCurrentVideoRange", "minHeight", "minFramerate", "minBitrate", "minIndex", "selectedScore", "videoRanges", "tier", "range", "maxHeight", "maxFramerate", "hasMultipleSets", "selected", "candidate", "candidateTier", "logStartCodecCandidateIgnored", "hasDefaultAudio", "maxScore", "codeSet", "reason", "getAudioTracksByGroup", "allAudioTracks", "trackGroup", "hasDefault", "hasAutoSelect", "channelsKey", "autoselect", "hasAutoSelectAudio", "getCodecTiers", "levels", "minAutoLevel", "maxAutoLevel", "tiers", "SDR", "lesserWidthOrHeight", "audioGroup", "getBasicSelectionOption", "option", "lang", "assocLang", "characteristics", "findMatchingOption", "matchPredicate", "matchesOption", "isDefault", "forced", "languagesMatch", "characteristicsMatch", "languageA", "languageB", "characteristicsA", "characteristicsB", "arrA", "arrB", "el", "audioMatchPredicate", "findClosestLevelWithAudioGroup", "searchIndex", "currentLevel", "renditions", "variantMap", "currentVideoCodec", "matchingVideo", "searchDownAndUpList", "arr", "useAlternateAudio", "audioTrackUrl", "hls", "_hls$loadLevelObj", "loadLevelObj", "AbrController", "lastLevelLoadSec", "lastLoadedFragLevel", "firstSelection", "_nextAutoLevel", "nextAutoLevelKey", "timer", "fragCurrent", "partCurrent", "bitrateTestDelay", "rebufferNotice", "supportedCache", "bwEstimator", "_abandonRulesCheck", "levelLoaded", "autoLevelEnabled", "now", "performance", "timeLoading", "loadingFragForLevel", "currentAutoLevel", "clearTimer", "fragBlockingSwitch", "levelChange", "paused", "playbackRate", "readyState", "bufferInfo", "mainForwardBufferInfo", "ttfbEstimate", "bufferStarvationDelay", "loadedFirstByte", "getBwEstimate", "expectedLen", "round", "timeStreaming", "loadRate", "ttfbSeconds", "fragLoadedDelay", "bwe", "live", "latestLevelDetails", "abrBandWidthUpFactor", "fragLevelNextLoadedDelay", "POSITIVE_INFINITY", "nextLoadLevel", "levelNextBitrate", "requiresLevelLoad", "getTimeToLoadFrag", "nextLoadLevelBitrate", "resetEstimator", "bestSwitchLevel", "findBestLevel", "toFixed", "nextAutoLevel", "abortAndSwitch", "loadLevel", "getStarvationDelay", "lowestSwitchLevel", "setInterval", "trigger", "FRAG_LOAD_EMERGENCY_ABORTED", "initEstimator", "registerListeners", "abrEwmaDefaultEstimate", "abrEwmaSlowVoD", "abrEwmaFastVoD", "on", "MANIFEST_LOADING", "onManifestLoading", "FRAG_LOADING", "onFragLoading", "FRAG_LOADED", "onFragLoaded", "FRAG_BUFFERED", "onFragBuffered", "LEVEL_SWITCHING", "onLevelSwitching", "LEVEL_LOADED", "onLevelLoaded", "LEVELS_UPDATED", "onLevelsUpdated", "MAX_AUTO_LEVEL_UPDATED", "onMaxAutoLevelUpdated", "ERROR", "onError", "unregisterListeners", "off", "event", "ignoreFragment", "_data$part", "fatal", "BUFFER_ADD_CODEC_ERROR", "BUFFER_APPEND_ERROR", "FRAG_LOAD_TIMEOUT", "timeToFirstByteSec", "bandwidth", "fragSizeBits", "isSwitch", "fragLoadSec", "playlistLoadSec", "timeLoadingMs", "abrEwmaSlowLive", "abrEwmaFastLive", "levelInfo", "abrMaxWithRealBitrate", "loadedBytes", "loadedDuration", "fragBufferedData", "processingMs", "clearInterval", "firstAutoLevel", "maxStartDelay", "maxStarvationDelay", "abrAutoLevel", "firstLevel", "clamped", "forcedAutoLevel", "useEstimate", "loadedFirstFrag", "getAutoLevelKey", "nextABRAutoLevel", "getNextABRAutoLevel", "currentFragDuration", "avgbw", "bwFactor", "abrBandWidthFactor", "bwUpFactor", "bestLevel", "maxLoadingDelay", "minLevel", "autoLevel", "_this$hls$latestLevel", "maxFetchDuration", "selectionBaseLevel", "currentCodecSet", "minStartIndex", "startTier", "ttfbEstimateSec", "levelsSkipped", "_levelInfo$supportedR", "upSwitch", "useMediaCapabilities", "removeLevel", "levelDetails", "avgDuration", "partTarget", "averagetargetduration", "adjustedbw", "fetchDuration", "nextLevel", "deriveNextAutoLevel", "BinarySearch", "search", "list", "comparisonFn", "maxIndex", "currentIndex", "currentElement", "comparisonResult", "findFragmentByPDT", "fragments", "PDTValue", "maxFragLookUpTolerance", "Array", "isArray", "startPDT", "endPDT", "seg", "pdtWithinToleranceTest", "findFragmentByPTS", "fragPrevious", "bufferEnd", "nextFragLookupTolerance", "fragNext", "bufferEdgeError", "fragmentWithinToleranceTest", "fragmentWithinFastStartSwitch", "foundFragment", "firstDuration", "tag", "candidateLookupTolerance", "pdtBufferEnd", "findNearestWithCC", "pos", "startCC", "endCC", "fragmentHint", "concat", "closest", "isTimeoutError", "KEY_LOAD_TIMEOUT", "LEVEL_LOAD_TIMEOUT", "MANIFEST_LOAD_TIMEOUT", "isKeyError", "isUnusableKeyError", "getRetryConfig", "loadPolicy", "isTimeout", "getRetryDelay", "retryConfig", "retryCount", "backoffFactor", "backoff", "retryDelayMs", "maxRetryDelayMs", "getLoaderConfigWithoutReties", "loderConfig", "errorRetry", "timeoutRetry", "shouldRetry", "loaderResponse", "httpStatus", "code", "maxNumRetry", "retryForHttpStatus", "offlineHttpStatus", "onLine", "NetworkErrorAction", "DoNothing", "SendEndCallback", "SendAlternateToPenaltyBox", "RemoveAlternatePermanently", "InsertDiscontinuity", "RetryRequest", "ErrorActionFlags", "None", "MoveAllAlternatesMatchingHost", "MoveAllAlternatesMatchingHDCP", "MoveAllAlternatesMatchingKey", "SwitchToSDR", "ErrorController", "playlistError", "LEVEL_UPDATED", "onLevelUpdated", "onErrorOut", "startLoad", "startPosition", "stopLoad", "getVariantLevelIndex", "getVariantIndex", "variantHasKey", "keyInError", "_level$details", "hasKey", "audioGroupsIds", "_track$details", "_data$frag", "FRAG_LOAD_ERROR", "KEY_LOAD_ERROR", "errorAction", "getFragRetryOrSwitchAction", "FRAG_PARSING_ERROR", "createDoNothingErrorAction", "FRAG_GAP", "FRAG_DECRYPT_ERROR", "action", "LEVEL_EMPTY_ERROR", "LEVEL_PARSING_ERROR", "_data$context", "levelIndex", "parent", "getPlaylistRetryOrSwitchAction", "levelRetry", "getLevelSwitchAction", "LEVEL_LOAD_ERROR", "AUDIO_TRACK_LOAD_ERROR", "AUDIO_TRACK_LOAD_TIMEOUT", "SUBTITLE_LOAD_ERROR", "SUBTITLE_TRACK_LOAD_TIMEOUT", "KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED", "KEY_SYSTEM_SESSION_UPDATE_FAILED", "KEY_SYSTEM_STATUS_INTERNAL_ERROR", "KEY_SYSTEM_NO_SESSION", "REMUX_ALLOC_ERROR", "_data$level", "INTERNAL_EXCEPTION", "BUFFER_APPENDING_ERROR", "BUFFER_FULL_ERROR", "LEVEL_SWITCH_ERROR", "BUFFER_STALLED_ERROR", "BUFFER_SEEK_OVER_HOLE", "BUFFER_NUDGE_ON_STALL", "KEY_SYSTEM_ERROR", "playlistLoadPolicy", "response", "variantLevelIndex", "fragLoadPolicy", "keyLoadPolicy", "fragmentErrors", "_data$frag2", "_data$context2", "errorDetails", "preserveManualLevelOnError", "fragErrorType", "findAudioCodecAlternate", "sourceBufferName", "findVideoCodecAlternate", "playlistErrorType", "playlistErrorGroupId", "_level$audioGroups", "_level$subtitleGroups", "levelCandidate", "fragCandidate", "_data$errorAction", "sendAlternateToPenaltyBox", "resolved", "message", "recoverMediaError", "switchLevel", "restrictedHdcpLevel", "hdcpLevel", "maxHdcpLevel", "levelCountWithError", "_levels$i$audioGroups", "_data$frag3", "fragLevelKey", "FragmentState", "NOT_LOADED", "APPENDING", "PARTIAL", "OK", "FragmentTracker", "activePartLists", "create", "endListFragments", "timeRanges", "bufferPadding", "hasGaps", "_registerListeners", "BUFFER_APPENDED", "onBufferAppended", "_unregisterListeners", "getAppendedFrag", "position", "levelType", "activeParts", "activePart", "getBufferedFrag", "getFragAtPos", "buffered", "fragmentEntity", "body", "detectEvictedFragments", "elementaryStream", "timeRange", "playlistType", "appendedPart", "removeAppending", "appendedPartSn", "removeFragment", "esData", "time", "isNotBuffered", "isTimeBuffered", "detectPartialFragments", "fragKey", "getFragmentKey", "isFragHint", "streamInfo", "getBufferedTimes", "bufferedEnd", "isPartial", "removeParts", "snToKeep", "filterParts", "fragBuffered", "force", "appendedPTS", "startTime", "endTime", "getPartialFragment", "bestFragment", "timePadding", "bestOverlap", "isEndListAppended", "lastFragmentEntity", "getState", "removeAllFragments", "hasFragment", "hasFragments", "hasParts", "_this$activePartLists", "removeFragmentsInRange", "withGapOnly", "unbufferedOnly", "snToRemove", "_this$hls", "partlist", "partList", "_fragmentEntity$range", "_fragmentEntity$range2", "_fragmentEntity$range3", "keep", "DecrypterAesMode", "cbc", "ctr", "AESCrypto", "subtle", "iv", "aesMode", "aesIV", "decrypt", "counter", "removePadding", "outputBytes", "paddingBytes", "getUint8", "AESDecryptor", "rcon", "subMix", "Uint32Array", "invSubMix", "sBox", "invSBox", "ksRows", "keySize", "keySchedule", "invKeySchedule", "initTable", "uint8ArrayToUint32Array_", "arrayBuffer", "newArray", "subMix0", "subMix1", "subMix2", "subMix3", "invSubMix0", "invSubMix1", "invSubMix2", "invSubMix3", "xi", "sx", "x2", "x4", "x8", "t", "expandKey", "keyBuffer", "sameKey", "ksRow", "invKsRow", "sbox", "prev", "networkToHostOrderSwap", "word", "inputArrayBuffer", "nRounds", "invSBOX", "initVector", "initVector0", "initVector1", "initVector2", "initVector3", "inputInt32", "Int32Array", "outputInt32", "t0", "t1", "t2", "t3", "s0", "s1", "s2", "s3", "inputWords0", "inputWords1", "inputWords2", "inputWords3", "swapWord", "FastAESKey", "subtleAlgoName", "getSubtleAlgoName", "importKey", "CHUNK_SIZE", "Decrypter", "removePKCS7Padding", "logEnabled", "softwareDecrypter", "fastAesKey", "remainderData", "currentIV", "currentResult", "useSoftware", "enableSoftwareAES", "browserCrypto", "crypto", "webkitSubtle", "isSync", "flush", "reset", "reject", "dataView", "isView", "softwareDecrypt", "decryptResult", "webCryptoDecrypt", "logOnce", "currentChunk", "getValidChunk", "onWebCryptoError", "aesKey", "err", "splitPoint", "msg", "MIN_CHUNK_SIZE", "FragmentLoader", "partLoadTimeout", "load", "onProgress", "LoadError", "NETWORK_ERROR", "networkDetails", "FragmentILoader", "fLoader", "DefaultILoader", "tags", "createGapLoadError", "loaderContext", "createLoaderContext", "loaderConfig", "timeout", "maxLoadTimeMs", "maxRetry", "retryDelay", "maxRetryDelay", "highWaterMark", "callbacks", "onSuccess", "resetLoader", "resetIV", "onAbort", "INTERNAL_ABORTED", "onTimeout", "loadPart", "updateStatsFromPart", "partLoadedData", "fragStats", "partStats", "partTotal", "estTotalParts", "estLoadedParts", "estRemainingBytes", "fragLoading", "partLoading", "clearTimeout", "segment", "responseType", "headers", "rangeStart", "rangeEnd", "_frag$decryptdata", "byteRangeStart", "byteRangeEnd", "isMethodFullSegmentAesCbc", "method", "fragmentLen", "errorData", "MEDIA_ERROR", "TaskLoop", "_boundTick", "_tickTimer", "_tickInterval", "_tickCallCount", "tick", "onHandlerDestroying", "onHandlerDestroyed", "clearNextTick", "hasInterval", "hasNextTick", "millis", "doTick", "tickImmediate", "setTimeout", "ChunkMetadata", "transmuxing", "getNewPerformanceTiming", "executeStart", "executeEnd", "noopBuffered", "BufferHelper", "isBuffered", "getBuffered", "bufferedRanges", "timeRangesToArray", "maxHoleDuration", "bufferedInfo", "bufferedIndex", "sort", "a", "buffered2", "buf2len", "buf2end", "bufferLen", "nextStart", "bufferStart", "e", "VARIABLE_REPLACEMENT_REGEX", "hasVariableReferences", "substituteVariables", "parsed", "variableList", "hasVariableRefs", "variableReference", "variableName", "variableValue", "playlistParsingError", "addVariableDefinition", "attr", "parentUrl", "NAME", "VALUE", "QUERYPARAM", "get", "importVariableDefinition", "sourceVariableList", "IMPORT", "DECIMAL_RESOLUTION_REGEX", "ATTR_LIST_REGEX", "AttrList", "parseAttrList", "clientAttrs", "attrName", "intValue", "hexadecimalInteger", "stringValue", "hexadecimalIntegerAsNumber", "defaultValue", "enumeratedStringList", "dict", "attrValue", "identifier", "decimalResolution", "res", "exec", "input", "match", "quote", "lastIndex", "trim", "quotedString", "lastIndexOf", "hexadecimalSequence", "CLASS_INTERSTITIAL", "isDateRangeCueAttribute", "isSCTE35Attribute", "DateRange", "dateRangeAttr", "dateRangeWithSameId", "tagCount", "_dateRangeWithSameId$", "tagAnchor", "tagOrder", "_startDate", "_endDate", "_dateAtEnd", "_cue", "_badValueForSameId", "previousAttr", "hasOwnProperty", "call", "ID", "endDate", "getTime", "class", "CLASS", "cue", "CUE", "pre", "post", "once", "startDate", "dateAtEnd", "plannedDuration", "endOnNext", "isInterstitial", "isValid", "DEFAULT_TARGET_DURATION", "LevelDetails", "baseUrl", "PTSKnown", "alignedSliding", "endSN", "dateRanges", "dateRangeTagCount", "requestScheduled", "ageHeader", "advancedDateTime", "updated", "advanced", "misses", "startSN", "startTimeOffset", "targetduration", "totalduration", "m3u8", "canBlockReload", "skippedSegments", "recentlyRemovedDateranges", "partHoldBack", "holdBack", "preloadHint", "renditionReports", "tuneInGoal", "deltaUpdateFailed", "driftStartTime", "driftEndTime", "driftStart", "driftEnd", "encryptedFragments", "appliedTimelineOffset", "reloaded", "partSnDiff", "lastPartSn", "partIndexDiff", "lastPartIndex", "floor", "hasProgramDateTime", "levelTargetDuration", "drift", "runTime", "edge", "partEnd", "fragmentEnd", "_this$partList", "fragmentStart", "_this$partList2", "maxPartIndex", "_this$partList3", "expired", "playlistWindowDuration", "arrayValuesMatch", "optionalArrayValuesMatch", "isFullSegmentEncryption", "getAesModeFromFullSegmentMethod", "base64Decode", "base64encodedStr", "atob", "charCodeAt", "strToUtf8array", "unescape", "encodeURIComponent", "getKeyIdBytes", "keyIdbytes", "paddedkeyIdbytes", "changeEndianness", "swap", "to", "cur", "convertDataUriToArrayBytes", "colonsplit", "keydata", "semicolonsplit", "commasplit", "isbase64", "splice", "optionalSelf", "KeySystems", "CLEARKEY", "FAIRPLAY", "PLAYREADY", "WIDEVINE", "KeySystemFormats", "keySystemFormatToKeySystemDomain", "format", "keySystemDomainToKeySystemFormat", "keySystem", "getKeySystemsForConfig", "drmSystems", "widevineLicenseUrl", "keySystemsToAttempt", "requestMediaKeySystemAccess", "_optionalSelf$navigat", "getSupportedMediaKeySystemConfigurations", "drmSystemOptions", "initDataTypes", "createMediaKeySystemConfigurations", "persistentState", "distinctiveIdentifier", "sessionTypes", "sessionType", "audioCapabilities", "robustness", "audioRobustness", "encryptionScheme", "audioEncryptionScheme", "videoCapabilities", "videoRobustness", "videoEncryptionScheme", "isPersistentSessionType", "_drmSystemOptions$ses", "parsePlayReadyWRM", "keyBytes", "keyBytesUtf16", "Uint16Array", "keyByteStr", "xmlKeyBytes", "keyData", "DOMParser", "parseFromString", "getElementsByTagName", "childNodes", "nodeValue", "getAttribute", "keyIdArray", "keyUriToKeyIdMap", "LevelKey", "clearKeyUriToKeyIdMap", "setKeyIdForUri", "addKeyIdForUri", "dv", "formatversions", "keyFormatVersions", "isSupported", "levelKeys", "createInitializationVector", "assignedKeyId", "_psshData$kids", "psshData", "getKeyIdFromPlayReadyKey", "PlayReadyKeySystemUUID", "padded", "getKeyIdFromWidevineKey", "widevineKey", "playReadyKey", "playReadyKeyBytes", "segmentNumber", "uint8View", "MASTER_PLAYLIST_REGEX", "MASTER_PLAYLIST_MEDIA_REGEX", "IS_MEDIA_PLAYLIST", "LEVEL_PLAYLIST_REGEX_FAST", "RegExp", "LEVEL_PLAYLIST_REGEX_SLOW", "M3U8Parser", "findGroup", "mediaGroupId", "group", "isMediaPlaylist", "parseMasterPlaylist", "string", "contentSteering", "sessionData", "sessionKeys", "levelsWithKnownCodecs", "_level$unknownCodecs", "resolution", "setCodecs", "supplementalCodecs", "unknownCodecs", "attributes", "sessionAttrs", "dataId", "sessionKey", "parseKey", "variableAttributes", "contentSteeringAttributes", "parseStartTimeOffset", "stripUnknownCodecLevels", "parseMasterPlaylistMedia", "groupsByType", "textCodec", "TYPE", "medias", "LANGUAGE", "CHANNELS", "CHARACTERISTICS", "instreamId", "URI", "groupCodec", "assignCodec", "parseLevelPlaylist", "levelUrlId", "multivariantVariableList", "_LEVEL_PLAYLIST_REGEX", "programDateTimes", "currentInitSegment", "currentSN", "currentPart", "discontinuityCounter", "currentBitrate", "prevFrag", "firstPdtIndex", "createNextFrag", "nextByteRange", "serverControlAttrs", "setFragLevelKeys", "assignProgramDateTime", "value1", "value2", "assignMultipleMediaPlaylistTagOccuranceError", "assignMustAppearBeforeSegmentsError", "skipAttrs", "dateRange", "currentKey", "mapAttrs", "init", "setInitSegment", "partInfAttrs", "previousFragmentPart", "preloadHintAttrs", "renditionReportAttrs", "pop", "fragmentLength", "firstFragment", "lastFragment", "lastSn", "backfillProgramDateTimes", "unshift", "mapDateRanges", "programDateTimeCount", "lastProgramDateTime", "playlistEnd", "dateRangeIds", "startDateTime", "_programDateTimes$j", "fragIndex", "findFragmentWithStartDate", "pdtFragment", "pdtStart", "_programDateTimes", "durationBetweenPdt", "startIndex", "endIndex", "fragStartDateTime", "keyTagAttributes", "_keyAttrs$METHOD", "_keyAttrs$KEYFORMAT", "keyAttrs", "decryptmethod", "METHOD", "decrypturi", "decryptiv", "decryptkeyformatversions", "KEYFORMATVERSIONS", "decryptkeyformat", "KEYFORMAT", "IV", "resolvedUri", "KEYID", "startAttributes", "codecsAttributeValue", "filtered", "groupItem", "codecProperty", "codecValue", "fragPrev", "BYTERANGE", "updateFromToPTS", "fragFrom", "fragTo", "fragToPTS", "updateFragPTSDTS", "fragStartPts", "fragEndPts", "fragIdx", "mergeDetails", "oldDetails", "newDetails", "oldFragments", "oldInit", "PTSFrag", "mapFragmentIntersection", "oldFrag", "newFrag", "newFragIndex", "newFragments", "ccOffset", "_isFiniteNumber5", "fragmentsToCheck", "_currentInitSegment", "mergeDateRanges", "_fragPriorToNewStart$", "fragPriorToNewStart", "getFragmentWithSN", "mapPartIntersection", "oldPart", "newPart", "adjustSliding", "oldDateRanges", "deltaDateRanges", "mergeCount", "mergedDateRange", "oldParts", "newParts", "intersectionFn", "delta", "newFrags", "oldFrags", "uriBefore", "uriAfter", "notEqualAfterStrippingQueries", "getSequenceError", "matchingStableVariantOrRendition", "advancedOrStable", "sliding", "addSliding", "computeReloadInterval", "distanceToLiveEdgeMs", "reloadInterval", "lastSegmentDuration", "getPartWith", "partIndex", "findPart", "reassignFragmentLevelIndexes", "stripQuery", "findFirstFragWithCC", "_fragments$i", "shouldAlignOnDiscontinuities", "refDetails", "adjustFragmentStart", "adjustSlidingStart", "alignStream", "switchDetails", "alignDiscontinuities", "alignMediaPlaylistByPDT", "targetCC", "refFrag", "refFragments", "refPDT", "targetPDT", "addEventListener", "listener", "removeEventListener", "TimeRanges", "r", "State", "STOPPED", "IDLE", "KEY_LOADING", "FRAG_LOADING_WAITING_RETRY", "WAITING_TRACK", "PARSING", "PARSED", "ENDED", "WAITING_INIT_PTS", "WAITING_LEVEL", "BaseStreamController", "fragmentTracker", "logPrefix", "transmuxer", "_state", "mediaBuffer", "lastCurrentTime", "nextLoadPosition", "retryDate", "fragmentLoader", "levelLastLoaded", "startFragRequested", "decrypter", "initPTS", "loadingParts", "loopSn", "onMediaSeeking", "state", "currentTime", "maxBufferHole", "noFowardBuffer", "resetLoadingState", "tolerance", "fragStartOffset", "fragEndOffset", "pastFragment", "shouldLoadParts", "getLevelDetails", "hasEnoughToStart", "onMediaEnded", "MEDIA_ATTACHED", "onMediaAttached", "MEDIA_DETACHING", "onMediaDetaching", "MANIFEST_LOADED", "onManifestLoaded", "onTickEnd", "resetTransmuxer", "startPositionValue", "bufferingEnabled", "pauseBuffering", "resumeBuffering", "inFlightFrag", "_streamEnded", "timelineStart", "timelineOffset", "lastPart", "configuredTimelineOffset", "_this$getLevelDetails", "autoStartLoad", "transferringMedia", "transferMedia", "ended", "detach", "loadFragment", "targetBufferTime", "_loadFragForPlayback", "progressCallback", "fragContextChanged", "fragInfo", "_handleFragmentLoadProgress", "_doFragLoad", "playlistLabel", "_handleFragmentLoadComplete", "resetFragmentLoading", "clearTrackerIfNeeded", "_this$mediaBuffer", "getFwdBufferInfo", "minForwardBufferLength", "maxBufferLength", "backtrackFragment", "reduceMaxBufferLength", "checkLiveUpdate", "waitForLive", "flushMainBuffer", "startOffset", "endOffset", "flushScope", "BUFFER_FLUSHING", "_loadInitSegment", "decryptData", "decryptedData", "FRAG_DECRYPTED", "tstart", "tdecrypt", "completeInitSegmentLoad", "unhandledEncryptionError", "_tracks$audio", "_tracks$video", "emeEnabled", "emeController", "mediaKeys", "KEY_SYSTEM_NO_KEYS", "fragBufferedComplete", "_this$levels", "fragLoadedEndData", "partsLoaded", "complete", "fragLoaded", "chunkMeta", "keyLoadingPromise", "keyLoadedData", "KEY_LOADED", "loadClear", "getNextPart", "doFragPartsLoad", "handleFragLoadError", "loadedEndOfParts", "_details$partList", "p", "dataOnProgress", "progressive", "fragLoadedData", "fromPart", "initialPartList", "loadedPart", "nextPart", "handleFragLoadAborted", "resetStartWhenNotLoaded", "OTHER_ERROR", "_handleTransmuxerFlush", "getCurrentContext", "updateLevelTiming", "lowLatencyMode", "_details$fragmentHint", "firstPart", "safePartStart", "_this$media", "getLoadPosition", "bufferFragmentData", "noBacktracking", "offsetTimestamp", "BUFFER_APPENDING", "dropped", "flushBufferGap", "fragDuration", "segmentFraction", "bufferable", "_this$media2", "getFwdBufferInfoAtPos", "bufferedFragAtPos", "gapDuration", "getMaxBufferLength", "maxBufLen", "maxBufferSize", "maxMaxBufferLength", "exceedsMaxBuffer", "fullBufferLength", "threshold", "minLength", "reducedLength", "fragOrPart", "getNextFragment", "fragLen", "playlistStart", "canLoadParts", "initialLiveManifestSize", "_frag", "getInitialLiveFragment", "configValue", "mainStart", "liveSyncPosition", "fragStart", "getFragmentAtPosition", "programFrag", "filterReplacedPrimary", "curSNIdx", "mapToInitFragWhenRequired", "isLoopLoading", "trackerState", "getNextFragmentLoopLoading", "nextFragment", "nextbufferInfo", "primaryPrefetch", "interstitialsEnabled", "_this$hls$interstitia", "interstitialsManager", "playingItem", "interstitials", "bufferingItem", "bufferingInterstitial", "appendInPlace", "nextEvent", "playerQueue", "interstitial", "resumeTime", "contiguous", "independentAttrOmitted", "targetSN", "liveStart", "_this$media3", "lookupTolerance", "fragState", "nextFrag", "alignPlaylists", "previousDetails", "slidingStart", "firstLevelLoad", "aligned", "alignedSlidingStart", "waitForCdnTuneIn", "advancePartLimit", "setStartPosition", "offsetInMultivariantPlaylist", "onFragmentOrKeyLoadError", "filterType", "_this$fragCurrent", "gapTagEncountered", "couldRetry", "noAlternate", "resetFragmentErrors", "treatAsGap", "_data$response", "offlineStatus", "delay", "checkRetryDate", "waitingForConnection", "reduceLengthAndFlushBuffer", "flushBuffer", "afterBufferFlushed", "bufferType", "bufferedTimeRanges", "resetWhenMissingContext", "removeUnbufferedFrags", "parsedDuration", "LEVEL_PTS_UPDATED", "_this$transmuxer", "mediaNotFound", "FRAG_PARSED", "_ref2", "_this$transmuxer2", "recoverWorkerError", "nextState", "previousState", "interstitialsController", "enableInterstitialPlayback", "ChunkCache", "chunks", "dataLength", "chunk", "concatUint8Arrays", "prefix", "EE", "fn", "addListener", "emitter", "evt", "clearEvent", "EventEmitter", "names", "events", "handlers", "l", "ee", "listeners", "a1", "a2", "a3", "a4", "a5", "args", "workerStore", "hasUMDWorker", "__HLS_WORKER_BUNDLE__", "injectWorker", "workerContext", "clientCount", "blob", "Blob", "objectURL", "createObjectURL", "worker", "Worker", "loadWorker", "scriptURL", "location", "removeWorkerFromStore", "revokeObjectURL", "terminate", "isId3Footer", "isId3Header", "readId3Size", "getId3Data", "front", "getAudioConfig", "observer", "manifestCodec", "adtsSamplingRates", "byte2", "adtsSamplingIndex", "emit", "adtsObjectType", "channelCount", "samplerate", "aacSampleIndex", "isHeaderPattern", "getHeaderLength", "getFullFrameLength", "canGetFrameLength", "isHeader", "canParse", "probe", "headerLength", "frameLength", "newOffset", "initTrackConfig", "getFrameDuration", "parseFrameHeader", "appendFrame", "frameIndex", "frameDuration", "stamp", "header", "unit", "missing", "canParseId3", "toArrayBuffer", "toUint8", "Type", "unsafeGetArrayBuffer", "bytesPerElement", "BYTES_PER_ELEMENT", "isArrayBufferView", "dataEnd", "rawStart", "obj", "decodeId3ImageFrame", "frame", "metadataFrame", "description", "pictureType", "utf8Encoding", "mimeTypeEndIndex", "descriptionEndIndex", "decodeId3PrivFrame", "owner", "privateData", "decodeId3TextFrame", "decodeId3UrlFrame", "decodeId3Frame", "getId3FrameData", "HEADER_FOOTER_SIZE", "FRAME_SIZE", "getId3Frames", "id3Data", "frames", "frameData", "isId3TimestampFrame", "readId3Timestamp", "timeStampFrame", "pts33Bit", "timestamp", "getId3Timestamp", "MetadataSchema", "dummyTrack", "inputTimeScale", "pid", "sequenceNumber", "BaseAudioDemuxer", "_audioTrack", "_id3Track", "cachedData", "basePTS", "lastPTS", "resetInitSegment", "trackDuration", "resetTimeStamp", "deaultTimestamp", "resetContiguity", "demux", "lastDataIndex", "id3Track", "initPTSFn", "dts", "audioId3", "partialData", "videoTrack", "textTrack", "demuxSampleAes", "init90kHz", "chromeVersion", "BitratesMap", "SamplingRateMap", "SamplesCoefficients", "BytesInSlot", "parseHeader", "samplesPerFrame", "sampleRate", "mpegVersion", "mpegLayer", "bitRateIndex", "sampleRateIndex", "paddingBit", "channelMode", "columnInBitrates", "bitRate", "sampleCoefficient", "bytesInSlot", "AACDemuxer", "container", "segmentCodec", "MpegAudio", "ADTS", "getAudioBSID", "bsid", "mask", "bits", "AC3Demuxer", "samplingRateCode", "frameSizeCode", "skipCount", "lfeon", "bsmod", "MP3Demuxer", "emsgSchemePattern", "MP4Demuxer", "txtTrack", "captionTrack", "videoSamples", "segmentedData", "extractID3Track", "emsgs", "emsgInfo", "getEmsgStartTime", "emsg", "enableEmsgKLVMetadata", "misbklv", "SampleAesDecrypter", "decryptBuffer", "encryptedData", "decryptAacSample", "callback", "curUnit", "encryptedBuffer", "decryptedBuffer", "decryptAacSamples", "getAvcEncryptedData", "decodedData", "encryptedDataLen", "Int8Array", "outputPos", "inputPos", "getAvcDecryptedUnit", "uint8DecryptedData", "decryptAvcSample", "unitIndex", "decryptAvcSamples", "curUnits", "units", "BaseVideoParser", "VideoSample", "createVideoSample", "getLastNalUnit", "_VideoSample", "lastUnit", "pushAccessUnit", "nbSamples", "lastSample", "parseNALu", "endOfSegment", "naluState", "lastState", "overflow", "unitType", "lastUnitStart", "lastUnitType", "getNALuType", "ExpGolomb", "bytesAvailable", "bitsAvailable", "loadWord", "workingBytes", "availableBytes", "skipBits", "count", "skipBytes", "readBits", "valu", "skipLZ", "leadingZeroCount", "skipUEG", "skipEG", "readUEG", "clz", "readEG", "readBoolean", "readUByte", "readUShort", "readUInt", "AvcVideoParser", "parsePES", "pes", "spsfound", "audFound", "_VideoSample2", "_VideoSample3", "iskey", "sliceType", "readSliceType", "_track$pixelRatio", "_track$pixelRatio2", "sps", "readSPS", "pixelRatio", "codecarray", "codecstring", "pps", "eg", "skipScalingList", "reader", "lastScale", "nextScale", "deltaScale", "frameCropLeftOffset", "frameCropRightOffset", "frameCropTopOffset", "frameCropBottomOffset", "numRefFramesInPicOrderCntCycle", "scalingListCount", "profileIdc", "chromaFormatIdc", "picOrderCntType", "picWidthInMbsMinus1", "picHeightInMapUnitsMinus1", "frameMbsOnlyFlag", "HevcVideoParser", "initVPS", "vps", "readVPS", "matchSPS", "codecString", "prop", "pushParameterSet", "readPPS", "parameterSets", "ebsp2rbsp", "dst", "dstIdx", "max_sub_layers_minus1", "temporal_id_nesting_flag", "numTemporalLayers", "temporalIdNested", "general_profile_space", "general_tier_flag", "general_profile_idc", "general_profile_compatibility_flags_1", "general_profile_compatibility_flags_2", "general_profile_compatibility_flags_3", "general_profile_compatibility_flags_4", "general_constraint_indicator_flags_1", "general_constraint_indicator_flags_2", "general_constraint_indicator_flags_3", "general_constraint_indicator_flags_4", "general_constraint_indicator_flags_5", "general_constraint_indicator_flags_6", "general_level_idc", "sub_layer_profile_present_flags", "sub_layer_level_present_flags", "chroma_format_idc", "pic_width_in_luma_samples", "pic_height_in_luma_samples", "conformance_window_flag", "pic_left_offset", "pic_right_offset", "pic_top_offset", "pic_bottom_offset", "bit_depth_luma_minus8", "bit_depth_chroma_minus8", "log2_max_pic_order_cnt_lsb_minus4", "sub_layer_ordering_info_present_flag", "sizeId", "matrixId", "coefNum", "num_short_term_ref_pic_sets", "num_delta_pocs", "inter_ref_pic_set_prediction_flag", "next_num_delta_pocs", "used_by_curr_pic_flag", "use_delta_flag", "num_negative_pics", "num_positive_pics", "num_long_term_ref_pics_sps", "min_spatial_segmentation_idc", "sar_width", "sar_height", "fps_fixed", "fps_den", "fps_num", "default_display_window_flag", "aspect_ratio_idc", "sar_width_table", "sar_height_table", "nal_hrd_parameters_present_flag", "vcl_hrd_parameters_present_flag", "sub_pic_hrd_params_present_flag", "fixed_pic_rate_within_cvs_flag", "low_delay_hrd_flag", "cpb_cnt", "chroma_scale_w", "chroma_scale_h", "profile_space_string", "profile_compatibility_buf", "profile_compatibility_rev", "profile_compatibility_flags_string", "tier_flag_string", "general_profile_compatibility_flags", "general_constraint_indicator_flags", "bit_depth", "frame_rate", "fixed", "fps", "tiles_enabled_flag", "entropy_coding_sync_enabled_flag", "parallelismType", "sps1", "sps2", "substr", "PACKET_LENGTH", "TSDemuxer", "typeSupported", "sampleAes", "pmtParsed", "_pmtId", "_videoTrack", "_txtTrack", "aacOverFlow", "videoParser", "syncOffset", "scanwindow", "foundPat", "packetStart", "tsPackets", "parsePID", "createTrack", "pesData", "isSampleAes", "videoPid", "audioPid", "id3Pid", "audioData", "unknownPID", "pmtId", "tsPacketErrors", "stt", "atf", "readyVideoParser", "parseAACPES", "parseMPEGPES", "parseAC3PES", "parseID3PES", "parsePAT", "parsedPIDs", "parsePMT", "segmentVideoCodec", "segmentAudioCodec", "emitParsingError", "demuxResult", "extractRemainingSamples", "removeAllListeners", "frameMissingBytes", "sampleLength", "frameOverflowBytes", "recoverable", "AC3", "id3Sample", "sectionLength", "tableEnd", "programInfoLength", "esInfoLength", "logEncryptedSamplesFoundInUnencryptedStream", "parsePos", "descriptorLen", "stream", "pesLen", "pesHdrLen", "pesPts", "pesDts", "pesFlags", "payloadStartOffset", "dataLen", "AAC", "getSilentFrame", "MP4", "types", "avcC", "hvcC", "btrt", "dinf", "dref", "esds", "ftyp", "mdat", "mdia", "mfhd", "minf", "moov", "dac3", "mvex", "mvhd", "pasp", "sdtp", "stbl", "stco", "stsc", "stsz", "stts", "vmhd", "smhd", "videoHdlr", "audioHdlr", "HDLR_TYPES", "STTS", "STSC", "STCO", "STSZ", "VMHD", "SMHD", "STSD", "majorBrand", "avc1Brand", "minorVersion", "FTYP", "box", "DINF", "upperWordDuration", "lowerWordDuration", "baseMediaDecodeTime", "boxes", "dependsOn", "isDependedOn", "hasRedundancy", "avcc", "hSpacing", "vSpacing", "audioStsd", "sampleDependencyTable", "upperWordBaseMediaDecodeTime", "lowerWordBaseMediaDecodeTime", "arraylen", "cts", "isLeading", "paddingValue", "isNonSync", "degradPrio", "movie", "ps", "NALuLengthSize", "temporal_id_nested", "num_temporal_layers", "iMax", "hvcc", "MPEG_TS_CLOCK_FREQ_HZ", "toTimescaleFromBase", "destScale", "srcBase", "toTimescaleFromScale", "srcScale", "toMsFromMpegTsClock", "toMpegTsClockFromTimescale", "timestampToString", "MAX_SILENT_FRAME_DURATION", "AAC_SAMPLES_PER_FRAME", "MPEG_AUDIO_SAMPLE_PER_FRAME", "AC3_SAMPLES_PER_FRAME", "safariWebkitVersion", "createMp4Sample", "isKeyframe", "MP4Remuxer", "ISGenerated", "_initPTS", "_initDTS", "nextVideoTs", "nextAudioTs", "videoSampleDuration", "isAudioContiguous", "isVideoContiguous", "videoTrackConfig", "defaultTimeStamp", "resetNextTimestamp", "getVideoStartPts", "rolloverDetected", "firstPts", "minPTS", "normalizePts", "remux", "accurateTimeOffset", "audioTimeOffset", "videoTimeOffset", "hasAudio", "enoughAudioSamples", "enoughVideoSamples", "_videoTrack$pixelRati", "_config$pixelRatio", "_videoTrack$pixelRati2", "_config$pixelRatio2", "generateIS", "firstKeyFrameIndex", "firstKeyFramePTS", "findKeyframeIndex", "forceKeyFrameOnDiscontinuity", "audiovideoTimestampDelta", "remuxAudio", "audioTrackLength", "remuxVideo", "firstKeyFrame", "flushTextTrackMetadataCueSamples", "flushTextTrackUserdataCueSamples", "computeInitPts", "basetime", "audioSamples", "computePTSDTS", "initDTS", "metadata", "baseDTS", "videoInitDTS", "videoInitPTS", "inputSamples", "outputSamples", "initTime", "mp4SampleDuration", "firstDTS", "lastDTS", "maxPTS", "NEGATIVE_INFINITY", "sortSamples", "nextVideoPts", "deltadts", "deltapts", "inputDuration", "averageSampleDuration", "foundHole", "foundOverlap", "firstPTS", "isPTSOrderRetained", "prevPTS", "nextSamplePTS", "currentSamplePTS", "currentOrder", "prevOrder", "nbNalu", "naluLen", "dtsStep", "nbUnits", "sampleLen", "mdatSize", "MUX_ERROR", "stretchedLastFrame", "minDtsDelta", "minPtsDelta", "maxDtsDelta", "maxPtsDelta", "VideoSampleUnits", "mp4SampleLength", "unitData", "unitDataLen", "ptsDelta", "lastFrameDuration", "stretchShortVideoTrack", "gapTolerance", "deltaToFrameEnd", "compositionTimeOffset", "nextDts", "nextPts", "nb", "getSamplesPerFrame", "mp4timeScale", "scaleFactor", "inputSampleDuration", "rawMPEG", "alignedWithVideo", "timeOffsetMpegTS", "maxAudioFramesDrift", "fillFrame", "audioSample", "prevSample", "unitLen", "reference", "PassThroughRemuxer", "emitInitSegment", "initTracks", "lastEndTime", "defaultInitPTS", "generateInitSegment", "eitherTrack", "getParsedTrackCodec", "_initData", "_initData2", "trackSampleData", "audioSampleTimestamps", "videoSampleTimestamps", "videoStartTime", "toStartEndOrDefault", "audioStartTime", "videoEndTime", "audioEndTime", "decodeTime", "syncOnAudio", "baseOffsetSamples", "isInvalidInitPts", "videoSampleCount", "minDuration", "muxConfig", "Transmuxer", "vendor", "asyncResult", "demuxer", "remuxer", "decryptionPromise", "transmuxConfig", "currentTransmuxState", "configure", "uintData", "discontinuity", "trackSwitch", "initSegmentChange", "defaultInitPts", "initSegmentData", "getEncryptionType", "getDecrypter", "emptyResult", "resetMuxers", "needsProbing", "configureTransmuxer", "resetInitialTimestamp", "transmux", "isPromise", "currentState", "transmuxResults", "emptyResults", "demuxResultOrPromise", "flushRemux", "remuxResult", "transmuxSampleAes", "transmuxUnencrypted", "mux", "_muxConfig$i$demux", "Remuxer", "Demuxer", "encryptionType", "Function", "TransmuxConfig", "TransmuxState", "transmuxerInstanceCount", "TransmuxerInterface", "onTransmuxComplete", "onFlush", "instanceNo", "useWorker", "onWorkerMessage", "_this$workerContext", "handleTransmuxComplete", "logType", "onWorkerError", "filename", "lineno", "enableWorker", "forwardMessage", "ev", "m2tsTypeSupported", "workerPath", "postMessage", "cmd", "terminateWorker", "resetNo", "removeWorkerClient", "_frag$initSegment", "_lastFrag$initSegment", "lastFrag", "snDiff", "partDiff", "transmuxResult", "transmuxerError", "handleFlushResult", "TICK_INTERVAL", "AudioStreamController", "mainAnchor", "mainFragLoading", "audioOnly", "bufferedTrack", "switchingTrack", "waitingData", "mainDetails", "flushing", "bufferFlushed", "cachedTrackLoadedData", "resetItem", "AUDIO_TRACKS_UPDATED", "onAudioTracksUpdated", "AUDIO_TRACK_SWITCHING", "onAudioTrackSwitching", "AUDIO_TRACK_LOADED", "onAudioTrackLoaded", "BUFFER_RESET", "onBufferReset", "BUFFER_CREATED", "onBufferCreated", "onBufferFlushing", "BUFFER_FLUSHED", "onBufferFlushed", "INIT_PTS_FOUND", "onInitPtsFound", "syncWithAnchor", "waitingToAppend", "_this$mainFragLoading", "targetDiscontinuity", "trackDetails", "syncFrag", "doTickIdle", "skipSeekToStartPosition", "currenTrack", "_this$mainFragLoading2", "startFragPrefetch", "BUFFER_EOS", "loadPosition", "mainFragAtPos", "audioTracks", "mediaPlaylist", "altAudio", "flushAudioIfNeeded", "_trackLevel$details", "trackLevel", "_this$levelLastLoaded", "AUDIO_TRACK_UPDATED", "defaultAudioCodec", "_handleTransmuxComplete", "AUDIO_TRACK_SWITCHED", "_id3$samples", "completeAudioSwitch", "mapFragment", "_bufferInitSegment", "FRAG_PARSING_INIT_SEGMENT", "emittedID3", "FRAG_PARSING_METADATA", "emittedText", "FRAG_PARSING_USERDATA", "variantAudioCodecs", "BUFFER_CODECS", "BasePlaylistController", "canLoad", "loadPlaylist", "switchParams", "playlistUri", "current", "foundIndex", "currentGoal", "hlsUrlParameters", "loadingPlaylist", "playlist", "shouldLoadPlaylist", "getUrlWithDirectives", "playlistLoaded", "elapsed", "levelOrTrack", "ignorePlaylistParsingErrors", "_details$fragments$", "deliveryDirectives", "endSn", "atLastPartOfSegment", "lastAdvanced", "cdnAge", "segments", "getDeliveryDirectives", "scheduleLoading", "updatedDetails", "estimatedTimeUntilUpdate", "previousDeliveryDirectives", "checkRetry", "errorEvent", "_errorEvent$context", "subtitleOptionsIdentical", "trackList1", "trackList2", "mediaAttributesIdentical", "attrs1", "attrs2", "customAttributes", "stableRenditionId", "subtitleAttribute", "subtitleTrackMatchesTextTrack", "subtitleTrack", "language", "AudioTrackController", "groupIds", "tracksInGroup", "currentTrack", "selectDefaultTrack", "MANIFEST_PARSED", "onManifestParsed", "LEVEL_LOADING", "onLevelLoading", "trackInActiveGroup", "curDetails", "currentGroups", "groupIndex", "allIndex", "findTrackId", "audioTracksUpdated", "selectedTrackId", "setAudioTrack", "_this$groupIds", "newId", "setAudioOption", "audioOption", "switchIndex", "withoutCodecAndChannelsMatch", "lastTrack", "trackLoaded", "AUDIO_TRACK_LOADING", "BufferOperationQueue", "sourceBufferReference", "queues", "append", "operation", "pending", "queue", "executeNext", "appendBlocker", "execute", "onStart", "onComplete", "prependBlocker", "removeBlockers", "_queue$", "unblockAudio", "op", "shiftAndExecuteNext", "_this$tracks$type", "sb", "updating", "_this$queues", "_this$queues2", "_this$tracks", "listSbInfo", "listOps", "_this$tracks2", "ending", "_this$queues3", "VIDEO_CODEC_PROFILE_REPLACE", "TRACK_REMOVED_ERROR_NAME", "HlsJsTrackRemovedError", "BufferController", "_objectUrl", "operationQueue", "bufferCodecEventsTotal", "mediaSource", "lastMpegAudioChunk", "blockedAudioAppend", "lastVideoAppendEnd", "appendSource", "transferData", "overrides", "appendErrors", "sourceBuffers", "_onEndStreaming", "_this$mediaSource", "_onStartStreaming", "_onMediaSourceOpen", "_onMediaEmptied", "updateDuration", "checkPendingTracks", "_onMediaSourceClose", "_onMediaSourceEnded", "mediaSrc", "hasSourceTypes", "MEDIA_ATTACHING", "onMediaAttaching", "onBufferAppending", "onBufferCodecs", "onBufferEos", "onFragParsed", "FRAG_CHANGED", "onFragChanged", "isUpdating", "queued", "isQueued", "sourceBufferCount", "tuple", "removeBuffer", "resetQueue", "resetAppendErrors", "_this$transferData", "codecEvents", "bufferCreated", "ms", "assignMediaSource", "src", "attachTransferred", "objectUrl", "removeAttribute", "MMS", "disableRemotePlayback", "removeSourceChildren", "addSource", "_this$transferData2", "_ms$constructor", "transferredTracks", "mediaSourceOpenCallback", "mediaSourceOpenOrEnded", "tracksReady", "trackName", "sbIndex", "sourceBufferNameToIndex", "sbTuple", "trackSourceBuffer", "_this$mediaSource2", "open", "removeSourceBuffer", "endOfStream", "MEDIA_DETACHED", "resetBuffer", "_this$mediaSource3", "removeBufferListeners", "_data$audio", "unmuxedToMuxed", "muxedToUnmuxed", "sbName", "_this$transferData3", "_trackCodec", "parsedTrack", "transferredTrack", "sbTrack", "sbCodec", "pendingCodec", "trackLevelCodec", "currentCodecFull", "currentCodec", "trackCodec", "nextCodec", "appendChangeType", "sourceBufferTracks", "baseTracks", "changeType", "isPending", "blockAudio", "partOrFrag", "_this$fragmentTracker", "pStart", "pTime", "_this$fragmentTracker2", "eventData", "chunkStats", "bufferAppendingStart", "fragBuffering", "partBuffering", "checkTimestampOffset", "videoSb", "vbuffered", "vappending", "currentOp", "videoAppendEnd", "audioStart", "_this$tracks$type2", "updateTimestampOffset", "appendExecutor", "mediaError", "DOMException", "QUOTA_EXCEEDED_ERR", "INVALID_STATE_ERR", "appendErrorCount", "appendErrorMaxRetry", "getFlushOp", "removeExecutor", "buffersAppendedTo", "onUnblocked", "blockBuffers", "stepOperationQueue", "sourceBufferTypes", "trimBuffers", "bufferedToEnd", "_this$overrides", "allowEndOfStream", "_this$tracks$type3", "blockUntilOpen", "tracksEnded", "BUFFERED_TO_END", "durationAndRange", "getDurationAndRange", "updateMediaSource", "targetDuration", "backBufferLength", "liveBackBufferLength", "maxBackBufferLength", "targetBackBufferPosition", "flushBackBuffer", "frontBufferFlushThreshold", "frontBufferLength", "maxFrontBufferLength", "targetFrontBufferPosition", "flushFrontBuffer", "_this$details", "BACK_BUFFER_REACHED", "LIVE_BACK_BUFFER_REACHED", "numBufferedRanges", "_this$overrides2", "liveDurationInfinity", "setLiveSeekableRange", "overrideDuration", "mediaDuration", "msDuration", "_isFiniteNumber6", "_isFiniteNumber7", "_isFiniteNumber8", "pendingTrackCount", "_this$transferData4", "createSourceBuffers", "BUFFER_INCOMPATIBLE_CODECS_ERROR", "getTrackCodec", "addSourceBuffer", "_this$operationQueue", "supplementalCodec", "addBufferListener", "onSBUpdateStart", "onSBUpdateEnd", "onSBUpdateError", "removedRanges", "_this$media2$querySel", "querySelector", "_this$mediaSource4", "_this$mediaSource5", "timestampOffset", "_isFiniteNumber9", "_isFiniteNumber0", "removeStart", "removeEnd", "remove", "appendBuffer", "bufferNames", "blockingOperations", "_this$tracks$type4", "node", "sourceChildren", "querySelectorAll", "removeChild", "document", "createElement", "appendChild", "CapLevelController", "autoLevelCapping", "restrictedLevels", "clientRect", "streamController", "setStreamController", "unregisterListener", "stopCapping", "FPS_DROP_LEVEL_CAPPING", "onFpsDropLevelCapping", "droppedLevel", "isLevelAllowed", "HTMLVideoElement", "detectPlayerSize", "capLevelToPlayerSize", "startCapping", "mediaHeight", "mediaWidth", "maxLevel", "getMaxLevel", "nextLevelSwitch", "capLevelIndex", "validLevels", "getMaxLevelByMediaSize", "getDimensions", "boundsRect", "getBoundingClientRect", "right", "left", "bottom", "top", "contentScaleFactor", "ignoreDevicePixelRatio", "devicePixelRatio", "maxDevicePixelRatio", "restrictedLevel", "atGreatestBandwidth", "curLevel", "maxLevelIndex", "squareSize", "CmObjectType", "MUXED", "INIT", "CAPTION", "TIMED_TEXT", "KEY", "OTHER", "CmcdObjectType", "CmStreamingFormat", "HLS", "CmcdStreamingFormat", "SfItem", "v", "DICT", "Map", "Set", "throwError", "cause", "serializeError", "SfToken", "BARE_ITEM", "BOOLEAN", "serializeBoolean", "encodeBase64", "binary", "btoa", "BYTES", "serializeByteSequence", "INTEGER", "isInvalidInt", "serializeInteger", "serializeDate", "roundToEven", "precision", "decimalShift", "EPSILON", "flooredValue", "DECIMAL", "serializeDecimal", "roundedValue", "includes", "STRING", "STRING_REGEX", "serializeString", "symbolToStr", "symbol", "TOKEN", "serializeToken", "token", "serializeBareItem", "isInteger", "serializeKey", "serializeParams", "entries", "serializeItem", "serializeInnerList", "serializeDict", "options", "whitespace", "optionalWhiteSpace", "item", "output", "encodeSfDict", "CMCD_OBJECT", "CMCD_REQUEST", "CMCD_SESSION", "CMCD_STATUS", "CMCD_HEADER_MAP", "br", "ab", "ot", "tb", "tpb", "tab", "lab", "pb", "bl", "tbl", "dl", "ltc", "mtp", "nor", "nrr", "rc", "sta", "su", "ttfbb", "ttlb", "cmsdd", "cmsds", "smrt", "df", "cs", "ts", "cid", "pr", "sf", "sid", "st", "msd", "bs", "bsd", "cdn", "rtp", "bg", "pt", "ec", "CmcdHeaderField", "REQUEST", "createHeaderMap", "headerMap", "field", "_a", "groupCmcdHeaders", "cmcd", "customHeaderMap", "custom", "isTokenField", "CMCD_EVENT_MODE", "urlToRelativePath", "origin", "toPath", "pathname", "fromPath", "hash", "toRounded", "toUrlSafe", "toHundred", "norValue", "CMCD_FORMATTER_MAP", "CMCD_REQUEST_MODE", "CMCD_RESPONSE_MODE", "CMCD_COMMON_KEYS", "CMCD_EVENT_KEYS", "CUSTOM_KEY_REGEX", "isCmcdCustomKey", "isCmcdEventKey", "CMCD_REQUEST_KEYS", "isCmcdRequestKey", "CMCD_RESPONSE_KEYS", "isCmcdResponseKey", "CMCD_V1_KEYS", "isCmcdV1Key", "filterMap", "prepareCmcdData", "reportingMode", "keyFilter", "needsTimestamp", "formatters", "formatterOptions", "formatter", "toCmcdHeaders", "shards", "shard", "appendCmcdHeaders", "CMCD_PARAM", "encodeCmcd", "toCmcdUrl", "toCmcdQuery", "REGEX", "appendCmcdQuery", "query", "separator", "CMCDController", "useHeaders", "includeKeys", "initialized", "starved", "audioBuffer", "videoBuffer", "onWaiting", "onPlaying", "applyPlaylistData", "applyFragmentData", "getObjectType", "getTopBandwidth", "getBufferLength", "next", "getNextFrag", "pLoader", "createPlaylistLoader", "createFragmentLoader", "sessionId", "contentId", "onMediaDetached", "_data$tracks$audio", "_data$tracks$video", "createData", "bandwidthEstimate", "isVideo", "_this$hls$levels$frag", "_this$hls$levels$frag2", "Ctor", "PATHWAY_PENALTY_DURATION_MS", "ContentSteeringController", "_pathwayPriority", "timeToLoad", "reloadTimer", "started", "subtitleTracks", "penalizedPathways", "pathways", "pathwayPriority", "updatePathwayPriority", "ttl", "scheduleRefresh", "loadSteeringManifest", "levelToRemove", "errorPathway", "getPathwayForGroupId", "filterParsedLevels", "pathwayLevels", "getLevelsForPathway", "selectedIndex", "selectedLevel", "levelAfterChange", "defaultPathway", "clonePathways", "pathwayClones", "audioGroupCloneMap", "subtitleGroupCloneMap", "pathwayClone", "cloneId", "baseId", "uriReplacement", "clonedVariants", "baseLevel", "clonedAudioGroupId", "clonedSubtitleGroupId", "performUriReplacement", "clonedLevel", "cloneRenditionGroups", "Loader", "protocol", "throughput", "steeringManifestLoadPolicy", "legacyRetryCompatibility", "steeringData", "VERSION", "TTL", "reloadUri", "loadedSteeringData", "steeringManifest", "STEERING_MANIFEST_LOADED", "getResponseHeader", "retryAfter", "ttlMs", "groupCloneMap", "clonedTracks", "clonedTrack", "stableId", "perOptionKey", "HOST", "host", "PARAMS", "perOptionUris", "perVariantUri", "EMEController", "mediaResolved", "keyFormatPromise", "keySystemAccessPromises", "_requestLicenseFailureCount", "mediaKeySessions", "keyIdToKeySessionPromise", "setMediaKeysQueue", "CDMCleanupPromise", "bannedKeyIds", "onMediaEncrypted", "initDataType", "logMessage", "keySystems", "k", "getKeyFormatPromise", "keySystemFormat", "json", "keyIdHex", "keySessionContextPromise", "keyContext", "oldKeyIdHex", "generateRequestWithPreferredKeySession", "handleError", "onWaitingForKey", "onDestroying", "requestMediaKeySystemAccessFunc", "licenseXhrSetup", "licenseResponseCallback", "DESTROYING", "getLicenseServerUrl", "keySystemConfiguration", "licenseUrl", "getLicenseServerUrlOrThrow", "getServerCertificateUrl", "serverCertificateUrl", "attemptKeySystemAccess", "uniqueCodec", "attempt", "getMediaKeysPromise", "EMEKeyError", "KEY_SYSTEM_NO_ACCESS", "supportedConfigurations", "errMessage", "_keySystemAccessPromi", "mediaKeySystemConfigs", "keySystemAccess", "keySystemAccessPromisesNew", "mediaKeySystemAccess", "certificateRequest", "fetchServerCertificate", "createMediaKeys", "hasMediaKeys", "certificate", "setMediaKeysServerCertificate", "createMediaKeySessionContext", "mediaKeysSession", "createSession", "mediaKeySessionContext", "keyStatus", "renewKeySession", "keySessionContext", "getKeyIdString", "removeSession", "updateKeySession", "keySession", "getSelectedKeySystemFormats", "getKeySystemAccess", "getKeySystemSelectionPromise", "attemptSetMediaKeys", "selectKeySystem", "selectKeySystemFormat", "keySystemsInConfig", "getKeyStatus", "status", "loadKey", "keyInfo", "badStatus", "getKeyStatusError", "keyDetails", "keyContextPromise", "getKeySystemForKeyPromise", "throwIfDestroyed", "clonedError", "KEY_SYSTEM_NO_CONFIGURED_LICENSE", "setMediaKeysPromise", "setMediaKeys", "_this$config$drmSyste", "generateRequestFilter", "generateRequest", "mappedInitData", "keyUri", "licenseStatus", "onmessage", "_onmessage", "messageType", "renewLicense", "eventNames", "handleKeyStatus", "keyError", "onkeystatuseschange", "_onkeystatuseschange", "keyStatuses", "getKeyStatuses", "_context$keyStatusTim", "keyStatusTimeouts", "sessionKeyStatus", "keyUsablePromise", "originKeyIdWithStatusChange", "keyIdWithStatusChange", "certLoader", "certLoadPolicy", "loaderCallbacks", "contex", "KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED", "cert", "setServerCertificate", "success", "KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED", "keyMessage", "requestLicense", "unpackPlayReadyKeyMessage", "xhr", "licenseChallenge", "xmlString", "setRequestHeader", "keyMessageXml", "_header$querySelector", "_header$querySelector2", "textContent", "challengeElement", "challengeText", "setupLicenseXHR", "keysListItem", "licenseXhrSetupResult", "XMLHttpRequest", "onreadystatechange", "KEY_SYSTEM_LICENSE_REQUEST_FAILED", "statusText", "attemptsLeft", "licenseXhr", "DONE", "send", "_clear", "_media$setMediaKeys", "mediaKeysList", "keySessionCount", "KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR", "KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR", "formats", "KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR", "close", "outputRestricted", "FPSController", "isVideoPlaybackQualityAvailable", "lastTime", "lastDroppedFrames", "lastDecodedFrames", "capLevelOnFPSDrop", "getVideoPlaybackQuality", "checkFPSInterval", "fpsDroppedMonitoringPeriod", "checkFPS", "decodedFrames", "droppedFrames", "currentPeriod", "currentDropped", "currentDecoded", "droppedFPS", "FPS_DROP", "totalDroppedFrames", "fpsDroppedMonitoringThreshold", "videoPlaybackQuality", "totalVideoFrames", "droppedVideoFrames", "webkitDecodedFrameCount", "webkitDroppedFrameCount", "sendAddTrackEvent", "videoEl", "Event", "createEvent", "initEvent", "dispatchEvent", "addCueToTrack", "mode", "cues", "getCueById", "addCue", "textTrackCue", "TextTrackCue", "err2", "clearCurrentCues", "enterHandler", "removeCue", "removeCuesInRange", "getCuesInRange", "getFirstCueIndexFromTime", "mid", "cuesFound", "firstCueInRange", "filterSubtitleTracks", "textTrackList", "kind", "SubtitleTrackController", "queuedDefaultTrack", "useTextTrackPolling", "subtitlePollingInterval", "_subtitleDisplay", "asyncPollTrackChange", "pollTrackChange", "onTextTracksChanged", "renderTextTracksNatively", "textTracks", "findTrackForTextTrack", "setSubtitleTrack", "subtitleDisplay", "toggleTrackModes", "SUBTITLE_TRACK_LOADED", "onSubtitleTrackLoaded", "subtitlePreference", "subtitleTracksUpdated", "SUBTITLE_TRACKS_UPDATED", "selectDefault", "allSubtitleTracks", "setSubtitleOption", "subtitleOption", "SUBTITLE_TRACK_LOADING", "nextTrack", "SUBTITLE_TRACK_SWITCH", "randomUUID", "dt", "random", "ALIGNED_END_THRESHOLD_SECONDS", "TimelineOccupancy", "generateAssetIdentifier", "assetListIndex", "InterstitialEvent", "_duration", "_timelineStart", "appendInPlaceDisabled", "appendInPlaceStarted", "hasPlayed", "cumulativeDuration", "resumeOffset", "playoutLimit", "restrictions", "jump", "snapOptions", "in", "assetList", "assetListLoader", "assetListResponse", "resumeAnchor", "resetOnResume", "setDateRange", "_this$assetListLoader", "supplementsPrimary", "isAssetPastPlayoutLimit", "assetIndex", "_this$assetList$asset", "isNaN", "findAssetIndex", "asset", "getSnapToFragmentTime", "startIsAligned", "snappedStart", "resumptionOffset", "timelineOccupancy", "Range", "Point", "contentMayVary", "assetUrl", "assetListUrl", "assetListLoaded", "eventToString", "getInterstitialUrl", "getNextAssetIndex", "_interstitial$assetLi", "eventAssetToString", "HlsAssetPlayer", "HlsPlayerClass", "userConfig", "assetItem", "hasDetails", "mediaAttached", "_currentTime", "_bufferedEosTime", "checkPlayout", "reachedPlayout", "PLAYOUT_LIMIT_REACHED", "detailsLoaded", "removeMediaListeners", "loadSource", "primarySessionId", "bufferedInPlaceToEnd", "getAssetTime", "destroyed", "_this$hls2", "assetId", "interstitialId", "parentIdentifier", "_this$hls3", "assetPlayout", "_this$hls4", "diff", "bufferSnapShot", "_this$hls5", "attachMedia", "_this$hls6", "detachMedia", "_this$hls7", "_this$hls8", "_this$hls9", "_this$hls0", "resetDetails", "deleteDetails", "_this$hls1", "_this$hls10", "_this$hls11", "_this$hls12", "ABUTTING_THRESHOLD_SECONDS", "InterstitialsSchedule", "onScheduleUpdate", "eventMap", "items", "durations", "primary", "playout", "integrated", "setDurations", "resetErrorsInRange", "getEvent", "hasEvent", "findItemIndex", "findEventIndex", "previousEvent", "findItemIndexAtTime", "_items$index", "timelinePos", "timelineType", "findJumpRestrictedIndex", "_items$i$event", "assetIdAtEnd", "_this$items", "interstitialAtEnd", "assetAtEnd", "parseInterstitialDateRanges", "mediaSelection", "enableAppendInPlace", "main", "previousInterstitialEvents", "interstitialEvents", "parseDateRanges", "ids", "removedInterstitials", "aPre", "aPost", "bPre", "bPost", "startA", "startB", "removeEvent", "updateSchedule", "forceUpdate", "currentItems", "updatedItems", "parseSchedule", "baseData", "schedule", "primaryDuration", "playoutDuration", "resolveOffsets", "primaryPosition", "integratedTime", "preroll", "postroll", "eventStart", "interstitialDuration", "timelineDuration", "inSameStartTimeSequence", "integratedStart", "playoutStart", "segmentDuration", "primarySegment", "_schedule", "lastScheduledStart", "updateAssetDurations", "primaryCanResumeInPlaceAt", "resumesInPlaceAt", "startFragment", "allowance", "sumDuration", "hasUnknownDuration", "hasErrors", "segmentToString", "AssetListLoader", "loadAssetList", "hlsStartOffset", "assignAssetListError", "ASSET_LIST_LOAD_ERROR", "interstitialAssetListLoadPolicy", "assets", "ASSETS", "ASSET_LIST_PARSING_ERROR", "ASSET_LIST_LOADED", "ASSET_LIST_LOAD_TIMEOUT", "ASSET_LIST_LOADING", "playWithCatch", "_media$play", "play", "timelineMessage", "InterstitialsController", "altSelection", "detachedData", "manager", "bufferedPos", "waitingItem", "endedItem", "playingAsset", "endedAsset", "bufferingAsset", "shouldPlay", "onPlay", "onPause", "onSeeking", "playbackDisabled", "backwardSeek", "effectivePlayingItem", "checkStart", "checkBuffer", "playingIndex", "scheduleIndex", "jumpIndex", "setSchedulePosition", "playingLastItem", "restartAsset", "setScheduleToAssetAtTime", "_playingItem$event", "clearAssetPlayers", "onTimeupdate", "previousItems", "scheduleItems", "removedIds", "interstitialsUpdated", "updatedPlayingItem", "updatedBufferingItem", "updateItem", "itemsMatch", "clearInterstitial", "clearAssetPlayer", "player", "INTERSTITIALS_UPDATED", "primaryFallback", "trimInPlace", "onAudioTrackUpdated", "onSubtitleTrackSwitch", "SUBTITLE_TRACK_UPDATED", "onSubtitleTrackUpdated", "EVENT_CUE_ENTER", "onInterstitialCueEnter", "onAssetListLoaded", "onBufferedToEnd", "MEDIA_ENDED", "_this$getBufferingPla", "getBufferingPlayer", "_this$getBufferingPla2", "emptyPlayerQueue", "clearScheduleState", "primaryMedia", "detachedMedia", "effectiveBufferingItem", "getAssetPlayer", "getMappedTime", "controllerField", "assetPlayerField", "assetPlayer", "getBufferedEnd", "findMappedTime", "primaryTime", "_c$schedule", "_c$schedule$items", "MAX_VALUE", "getMappedDuration", "_c$primaryDetails", "_c$schedule2", "primaryDetails", "seekTo", "_item$event", "_c$schedule$items2", "targetIndex", "targetItem", "bufferingPlayer", "seekInItem", "seekToTime", "primarySegmentStart", "targetIsPrimary", "eventTime", "getActiveInterstitial", "interstitialPlayer", "interstitialItem", "_c$bufferingAsset", "effectivePlayingAsset", "assetPlayers", "_getActiveInterstitia", "_getActiveInterstitia2", "scheduleItem", "_c$schedule3", "_c$schedule4", "bufferingIndex", "seekableStart", "_c$primaryDetails2", "_c$primaryDetails3", "advanceAfterAssetEnded", "_this$schedule", "playbackStarted", "_this$bufferingItem", "_media", "queuedForPlayback", "_this$detachedData", "retreiveMediaSource", "toSegment", "transferMediaFromPlayer", "playerMedia", "attachMediaSourceData", "transferMediaTo", "_this$detachedData2", "_attachMediaSourceDat", "primaryPlayer", "isAssetPlayer", "detachedMediaSource", "logFromSource", "queuedPlayer", "transferring", "dataToAttach", "isAssetAtEndOfSchedule", "cueRemoval", "primaryLive", "advanceAssetBuffering", "nextAssetIndex", "bufferedToEvent", "_this$schedule$items", "nextItem", "bufferedToItem", "nextIndex", "scheduleLength", "resumptionTime", "advanceInPlace", "itemIndex", "_this$schedule2", "scheduledItem", "currentItem", "eventItemsMatch", "_this$detachedData3", "playingAssetListIndex", "INTERSTITIAL_ASSET_ENDED", "INTERSTITIAL_ENDED", "_this$schedule3", "updatedScheduleItems", "updatedIndex", "advanceSchedule", "playedLastItem", "queuedIndex", "assetIndexCandidate", "assetsBuffered", "setBufferingItem", "preloadAssets", "INTERSTITIAL_STARTED", "assetListLength", "createAssetPlayer", "isAssetBuffered", "startAssetPlayer", "resumePrimary", "attachPrimary", "_this$mediaSelection", "_this$primaryDetails", "fromItem", "_this$detachedData4", "_this$schedule4", "getPrimaryResumption", "INTERSTITIALS_PRIMARY_RESUMED", "itemStart", "startLoadingPrimaryAt", "_hls$mainForwardBuffe", "loadingEnabled", "_this$schedule5", "currentSelection", "interstitialAppendInPlace", "previousSelection", "subtitles", "_this$schedule$items2", "previousItem", "_this$schedule6", "updatedItem", "itemBeforeUpdate", "flushStart", "_b$event", "_this$schedule7", "_this$schedule8", "updateBufferedPos", "bufferIsEmpty", "bufferEndIndex", "_nextItemToBuffer$eve", "nextToBufferIndex", "nextItemToBuffer", "interstitialLiveLookAhead", "bufferingLast", "timeRemaining", "bufferIndex", "INTERSTITIALS_BUFFERED_TO_BOUNDARY", "preloadPrimary", "neverLoaded", "playOnce", "bufferAssetPlayer", "_playingItem$nextEven", "liveStartPosition", "createAsset", "playerIndex", "getAssetPlayerQueueIndex", "selectedAudio", "selectedSubtitle", "timePastStart", "playerConfig", "assetPlayerId", "testBandwidth", "initialDuration", "updateAssetPlayerDetails", "_this$schedule9", "INTERSTITIAL_ASSET_ITEM_ERROR", "handleAssetItemError", "currentAssetDuration", "inQueuPlayer", "_this$schedule$items3", "endedWithAssetIndex", "handleInPlaceStall", "INTERSTITIAL_ASSET_PLAYER_CREATED", "resetAssetPlayer", "INTERSTITIAL_ASSET_STARTED", "_this$schedule$items4", "_this$detachedData5", "appendInPlaceNext", "activeTracks", "foundAssetIndex", "stallingAsset", "assetCurrentTime", "distanceFromEnd", "errorMessage", "interstitialAssetError", "INTERSTITIAL_ASSET_ERROR", "newPlayingItem", "_this$schedule0", "_this$bufferingItem2", "previousDuration", "DURATION", "waitingForItem", "bufferingEvent", "_this$schedule$items5", "stallingItem", "SubtitleStreamController", "currentTrackId", "tracksBuffered", "onSubtitleTracksUpdated", "SUBTITLE_FRAG_PROCESSED", "onSubtitleFragProcessed", "fragEnd", "endOffsetSubtitles", "mediaBufferTimeRanges", "mainSlidingStartFragment", "foundFrag", "fragToLoad", "BufferableInstance", "timeranges", "getRange", "specialCea608CharsCodes", "getCharForByte", "NR_ROWS", "NR_COLS", "rowsLowCh1", "rowsHighCh1", "rowsLowCh2", "rowsHighCh2", "backgroundColors", "CaptionsLogger", "verboseLevel", "severity", "numArrayToHexArray", "numArray", "hexArray", "PenState", "foreground", "underline", "italics", "background", "flash", "setStyles", "styles", "attribs", "style", "equals", "other", "copy", "newPenState", "StyledUnicodeChar", "uchar", "penState", "setChar", "setPenState", "newChar", "isEmpty", "Row", "chars", "currPenState", "cueStartTime", "empty", "setCursor", "absPos", "moveCursor", "relPos", "newPos", "backSpace", "insertChar", "char", "clearFromPos", "startPos", "clear", "clearToEndOfRow", "getTextString", "setPenStyles", "CaptionScreen", "rows", "currRow", "nrRollUpRows", "lastOutputScreen", "equal", "setPen", "setPAC", "pacData", "newRow", "row", "topRowIndex", "prevLineTime", "indent", "prevPos", "color", "setBkgData", "bkgData", "setRollUpRows", "nrRows", "rollUp", "getDisplayText", "topRow", "asOneRow", "displayText", "rowNr", "rowText", "getTextAndFormat", "Cea608Channel", "channelNumber", "outputFilter", "chNr", "verbose", "displayedMemory", "nonDisplayedMemory", "currRollUpRow", "writeScreen", "getHandler", "setHandler", "newHandler", "setMode", "newMode", "insertChars", "screen", "outputDataUpdate", "ccRCL", "ccBS", "ccAOF", "ccAON", "ccDER", "ccRU", "ccFON", "ccRDC", "ccTR", "ccRTD", "ccEDM", "ccCR", "ccENM", "ccEOC", "tmp", "ccTO", "nrCols", "ccMIDROW", "secondByte", "colorIndex", "colors", "dispatch", "newCue", "dispatchCue", "cueSplitAtTime", "Cea608Parser", "out1", "out2", "currentChannel", "cmdHistory", "createCmdHistory", "channel", "addData", "byteList", "cmdFound", "charsFound", "hasCmdRepeated", "setLastCmd", "parseCmd", "parseMidrow", "parsePAC", "parseBackgroundAttributes", "parseChars", "currChNr", "cond1", "cond2", "case1", "case2", "interpretPAC", "pacIndex", "channelNr", "charCodes", "charCode1", "oneCode", "VTTCue", "AllowedDirections", "AllowedAlignments", "isAllowedValue", "allowed", "lcValue", "findDirectionSetting", "findAlignSetting", "extend", "rest", "arguments", "cobj", "baseObj", "hasBeenReset", "_id", "_pauseOnExit", "_startTime", "_endTime", "_text", "_region", "_vertical", "_snapToLines", "_line", "_lineAlign", "_position", "_positionAlign", "_size", "_align", "TypeError", "setting", "SyntaxError", "displayState", "getCueAsHTML", "WebVTT", "convertCueToDOMTree", "StringDecoder", "decodeURIComponent", "parseTimeStamp", "computeSeconds", "f", "Settings", "values", "dflt", "defaultKey", "alt", "n", "integer", "percent", "parseOptions", "keyValueDelim", "groupDelim", "kv", "defaults", "center", "align", "parseCue", "regionList", "oInput", "consumeTimeStamp", "consumeCueSettings", "settings", "vals", "region", "vertical", "line", "lineAlign", "snapToLines", "skipWhitespace", "fixLineBreaks", "VTTParser", "decoder", "oncue", "onparsingerror", "onflush", "_this", "collectNextLine", "alreadyCollectedLine", "hasSubstring", "LINEBREAKS", "inputString", "searchString", "cueString2millis", "timeString", "secs", "mins", "hours", "generateCueId", "calculateOffset", "vttCCs", "currCC", "prevCC", "new", "presentationOffset", "_prevCC", "parseWebVTT", "vttByteArray", "callBack", "errorCallBack", "parser", "vttLines", "cueTime", "timestampMapMPEGTS", "timestampMapLOCAL", "parsingError", "inHeader", "cueOffset", "webVttMpegTsMapOffset", "IMSC1_CODEC", "HMSF_REGEX", "TIME_UNIT_REGEX", "textAlignToLineAlign", "parseIMSC1", "ttmlList", "syncTime", "ttml", "parseTTML", "tt", "defaultRateInfo", "subFrameRate", "frameRateMultiplier", "tickRate", "rateInfo", "styleElements", "collectionToDictionary", "getElementCollection", "regionElements", "cueElements", "cueElement", "cueText", "getTextContent", "hasAttribute", "parseTtmlTime", "timestampParsingError", "getTtmlStyles", "textAlign", "fromElement", "parentName", "childName", "elementsWithId", "element", "_node$childNodes", "nodeName", "ttsNs", "regionStyle", "styleAttributes", "regionStyleName", "getAttributeNS", "ns", "hasAttributeNS", "timeAttributeValue", "parseHoursMinutesSecondsFrames", "parseTimeUnits", "OutputFilter", "timelineController", "cueRanges", "addCues", "createCaptionsTrack", "TimelineController", "Cues", "unparsedVttFrags", "captionsTracks", "nonNativeCaptionsTracks", "cea608Parser1", "cea608Parser2", "lastCc", "newVTTCCs", "captionsProperties", "cueHandler", "textTrack1", "captionsTextTrack1Label", "languageCode", "captionsTextTrack1LanguageCode", "textTrack2", "captionsTextTrack2Label", "captionsTextTrack2LanguageCode", "textTrack3", "captionsTextTrack3Label", "captionsTextTrack3LanguageCode", "textTrack4", "captionsTextTrack4Label", "captionsTextTrack4LanguageCode", "onFragParsingUserdata", "onFragDecrypted", "SUBTITLE_TRACKS_CLEARED", "onSubtitleTracksCleared", "initCea608Parsers", "channel1", "channel2", "channel3", "channel4", "merged", "cueRange", "overlap", "intersection", "CUES_PARSED", "getExistingTrack", "canReuseVttTextTrack", "createNativeTrack", "createNonNativeTrack", "existingTrack", "createTextTrack", "trackProperties", "closedCaptions", "NON_NATIVE_TEXT_TRACKS_FOUND", "addTextTrack", "_cleanTracks", "hasIMSC1", "enableWebVTT", "enableIMSC1", "inUseTracks", "inUseTrack", "textTrackKind", "captionsOrSubtitlesFromCharacteristics", "unusedTextTracks", "tracksList", "enableCEA708Captions", "captions", "captionsTrack", "instreamIdMatch", "closedCaptionsForLevel", "_data$part$index", "decrypted", "trackPlaylistMedia", "_parseIMSC1", "_parseVTTs", "_appendCues", "maxAvCC", "payloadWebVTT", "missingInitPTS", "_fallbackToIMSC1", "fragLevel", "ccBytes", "ccdatas", "extractCea608Data", "actualCCBytes", "tmpByte", "ccbyte1", "ccbyte2", "ccType", "manifestTrack", "x1", "y1", "y2", "WHITESPACE_CHAR", "captionScreen", "indenting", "Cue", "_track$cues", "cueA", "cueB", "fetchSupported", "fetch", "AbortController", "ReadableStream", "Request", "FetchLoader", "fetchSetup", "requestTimeout", "request", "controller", "getRequest", "abortInternal", "_this$callbacks", "initParams", "getRequestParameters", "signal", "isArrayBuffer", "LENGTH", "maxTimeToFirstByteMs", "_this$callbacks2", "ok", "FetchError", "getContentLength", "loadProgressively", "responseData", "_this$callbacks3", "_this$callbacks4", "_this$callbacks5", "getCacheAge", "chunkCache", "getReader", "pump", "read", "done", "credentials", "Headers", "getByteRangeLength", "byteRangeHeader", "contentRange", "byteRangeLength", "contentLength", "AGE_HEADER_LINE_REGEX", "XhrLoader", "xhrSetup", "retryTimeout", "onprogress", "loadInternal", "openAndSendXhr", "readystatechange", "loadprogress", "loadtimeout", "useResponseText", "responseText", "responseURL", "_this$context", "lengthComputable", "getAllResponseHeaders", "defaultLoadPolicy", "hlsDefaultConfig", "startOnSegmentBoundary", "detectStallWithCurrentTimeMs", "highBufferWatchdogPeriod", "nudgeOffset", "nudgeMaxRetry", "nudgeOnVideoHole", "liveSyncMode", "liveSyncDurationCount", "liveSyncOnStallIncrease", "liveMaxLatencyDurationCount", "liveSyncDuration", "liveMaxLatencyDuration", "maxLiveSyncPlaybackRate", "startLevel", "abrController", "bufferController", "capLevelController", "errorController", "fpsController", "abrEwmaDefaultEstimateMax", "minAutoBitrate", "requireKeySystemAccessOnStart", "enableDateRangeMetadataCues", "enableEmsgMetadataCues", "enableID3MetadataCues", "manifestLoadPolicy", "manifestLoadingTimeOut", "manifestLoadingMaxRetry", "manifestLoadingRetryDelay", "manifestLoadingMaxRetryTimeout", "levelLoadingTimeOut", "levelLoadingMaxRetry", "levelLoadingRetryDelay", "levelLoadingMaxRetryTimeout", "fragLoadingTimeOut", "fragLoadingMaxRetry", "fragLoadingRetryDelay", "fragLoadingMaxRetryTimeout", "timelineConfig", "subtitleStreamController", "subtitleTrackController", "audioStreamController", "audioTrackController", "cmcdController", "contentSteeringController", "mergeConfig", "defaultConfig", "defaultsCopy", "deepCpy", "deprecatedSettingTypes", "deprecatedSettings", "policyName", "policyNotSet", "report", "deprecatedSetting", "enableStreamingMode", "currentLoader", "MAX_START_GAP_JUMP", "SKIP_BUFFER_HOLE_STEP_SECONDS", "SKIP_BUFFER_RANGE_START", "GapController", "nudgeRetry", "stallReported", "stalled", "moved", "seeking", "waiting", "onMediaPlaying", "onMediaWaiting", "hasBuffered", "poll", "seeked", "beginSeek", "pausedEndedOrHalted", "stallResolved", "inFlightDependency", "getInFlightDependency", "inFlightFragments", "hasEnoughBuffer", "noBufferHole", "startJump", "maxStartGapJump", "appended", "appendedFragAtPosition", "_trySkipBufferHole", "tnow", "tWaiting", "stalledDuration", "_reportStall", "bufferedWithHoles", "_tryFixBufferStall", "STALL_RESOLVED", "_this$buffered$audio", "videoSourceBuffered", "audioBufferInfo", "videoTimes", "lastBufferedIndex", "holeStart", "holeEnd", "stalledDurationMs", "adjacentTraversal", "_tryNudgeBuffer", "bufferStarved", "gapLength", "startGap", "startFrag", "_this$hls$loadLevelOb", "moreToLoad", "provisioned", "targetTime", "inFlight", "inFlightData", "MIN_CUE_DURATION", "getCueClass", "createCueWithDataFields", "MAX_CUE_ENDTIME", "ID3TrackController", "dateRangeCuesAppended", "removeCues", "assetCue", "onEventCueEnter", "onFragParsingMetadata", "onLevelPtsUpdated", "_data$overrides", "updateDateRangeCues", "getID3Track", "updateId3CueEnds", "_this$id3Track", "removeOldCues", "_id3Track$cues", "idsToRemove", "_dateRangeCuesAppende", "appendedDateRangeCues", "durationKnown", "nextDateRangeWithSameClass", "candidateDateRange", "otherDateRange", "LatencyController", "stallCount", "_latency", "_targetLatencyUpdated", "latency", "computeLatency", "targetLatency", "distanceFromTarget", "liveMinLatencyDuration", "maxLatency", "forwardBufferLength", "rate", "edgeStalled", "changeMediaPlaybackRate", "maxLiveSyncOnStallIncrease", "liveEdge", "estimateLiveEdge", "syncPosition", "maxLevelUpdateAge", "_this$levelDetails", "_this$targetLatency", "LevelController", "_levels", "_firstLevel", "_maxAutoLevel", "_startLevel", "currentLevelIndex", "manualLevelIndex", "steering", "onParsedComplete", "resetLevels", "redundantSet", "generatePathwaySet", "resolutionFound", "videoCodecFound", "audioCodecFound", "levelParsed", "unknownUnsupportedCodecCount", "isAudioSupported", "isVideoSupported", "FRAMERATE", "HDCP", "PATHWAY", "RESOLUTION", "VIDEO_RANGE", "contentSteeringPrefix", "pathwayCount", "createLevel", "filterAndSortMediaOptions", "filteredLevels", "_data$stats", "statsParsing", "MANIFEST_INCOMPATIBLE_CODECS_ERROR", "assignTrackIdsByGroup", "unsortedLevels", "valueA", "valueB", "firstLevelInPlaylist", "_this$hls$userConfig", "firstLevelBitrate", "startingBwEstimate", "altAudioEnabled", "edata", "newLevel", "lastLevelIndex", "lastLevel", "lastPathwayId", "levelSwitchingData", "manualLevel", "configStartLevel", "pathwaysList", "filteredPathwayPriority", "_data$deliveryDirecti2", "_data$deliveryDirecti", "withoutMultiVariant", "_this$currentLevel", "checkMaxAutoUpdated", "getSourceBuffer", "SourceBuffer", "WebKitSourceBuffer", "isMSESupported", "sourceBuffer", "codecsForVideoContainer", "codecForAudioContainer", "changeTypeSupported", "_sourceBuffer$prototy", "StreamController", "audioCodecSwap", "_forceStartLoad", "_hasEnoughToStart", "fragPlaying", "fragLastKbps", "couldBacktrack", "audioCodecSwitch", "onMediaSeeked", "onFragLoadEmergencyAborted", "onAudioTrackSwitched", "checkFragmentChanged", "getMainFwdBufferInfo", "lastDetails", "_this$backtrackFragme", "backtrackFrag", "_loadBitrateTestFrag", "followingBufferedFrag", "immediateLevelSwitch", "abortCurrentFrag", "fetchdelay", "fragPlayingCurrent", "nextLevelId", "bufferedFrag", "nextBufferedFrag", "maxStart", "startPts", "aac", "heaac", "_curLevel$details", "newLevelId", "synchronizeToLiveEdge", "withinSlidingWindow", "_bufferInfo$buffered", "_getAudioCodec", "fromAltAudio", "mediaTrack", "alternate", "bufferedMainFragment", "seekToStartPos", "swapAudioCodec", "skipTolerance", "logMuxedErr", "isFirstFragment", "isFirstInDiscontinuity", "backtrack", "audioMetadata", "parsedVideoCodec", "trackTypes", "bufferOutput", "fragCurrentLevel", "LEVEL_SWITCHED", "currentFrag", "currentProgramDateTime", "epocMs", "forceStartLoad", "KeyLoader", "keyIdToKeyInfo", "_loader$context", "createKeyLoadError", "loadingFrag", "_keyInfo", "_keyInfo2", "getKeyId", "keyLoadPromise", "loadKeyHTTP", "loadKeyEME", "mapContextToLevelType", "getResponseUrl", "PlaylistLoader", "loaders", "checkAutostartLoad", "destroyInternalLoaders", "onAudioTrackLoading", "onSubtitleTrackLoading", "createInternalLoader", "PLoader", "InternalLoader", "getInternalLoader", "resetInternalLoader", "contextType", "lvl", "_context$deliveryDire", "maxLowLatencyPlaylistRefresh", "handleTrackOrLevelPlaylist", "handleMasterPlaylist", "handleNetworkError", "parsedResult", "handleManifestParsingError", "unknownCodec", "levelId", "singleLevel", "handlePlaylistLoaded", "MANIFEST_PARSING_ERROR", "UNKNOWN", "MANIFEST_LOAD_ERROR", "Hls", "DefaultConfig", "coreComponents", "networkControllers", "_emitter", "_autoLevelCapping", "_maxHdcpLevel", "latencyController", "levelController", "subtititleStreamController", "gapController", "_sessionId", "triggeringException", "_AbrController", "_BufferController", "_CapLevelController", "_ErrorController", "_FpsController", "_InterstitialsController", "playListLoader", "_ContentSteeringController", "id3TrackController", "createController", "AudioStreamControllerClass", "SubtitleStreamControllerClass", "ControllerClass", "components", "controllerInstance", "eventObject", "listenerCount", "component", "ATTACH_MEDIA_ERROR", "attachMediaSource", "attachingData", "loadedSource", "loadingSource", "shouldStartCapping", "newCapLevelToPlayerSize", "playingDate", "_this$audioTrackContr", "_this$subtitleTrackCo", "audioTrackId", "subtitleTrackId", "_this$bufferControlle", "_this$interstitialsCo", "getMediaDecodingInfo", "_defineProperty$1", "e", "r", "_toPropertyKey", "_toPrimitive", "t", "i", "_classCallCheck", "_defineProperties", "n", "_createClass", "_defineProperty", "ownKeys", "_objectSpread2", "defaults$1", "matches$1", "trigger", "getConstructor$1", "instanceOf$1", "isNullOrUndefined$1", "isObject$1", "isNumber$1", "isString$1", "isBoolean$1", "isFunction$1", "isArray$1", "isNodeList$1", "isElement$1", "isEvent$1", "isEmpty$1", "is$1", "getDecimalPlaces", "round", "RangeTouch", "o", "s", "u", "c", "a", "getConstructor", "input", "instanceOf", "constructor", "isNullOrUndefined", "isObject", "isNumber", "isString", "isBoolean", "isFunction", "isArray", "isWeakMap", "isNodeList", "isTextNode", "isEvent", "isKeyboardEvent", "isCue", "isTrack", "isPromise", "isElement", "isEmpty", "isUrl", "string", "is", "transitionEndEvent", "element", "events", "type", "event", "repaint", "delay", "cloneDeep", "object", "getDeep", "path", "obj", "key", "extend", "target", "sources", "source", "wrap", "elements", "wrapper", "targets", "index", "child", "parent", "sibling", "setAttributes", "attributes", "value", "createElement", "text", "insertAfter", "insertElement", "removeElement", "emptyElement", "length", "replaceElement", "newChild", "oldChild", "getAttributesFromSelector", "sel", "existingAttributes", "existing", "selector", "className", "parts", "toggleHidden", "hidden", "hide", "toggleClass", "force", "method", "hasClass", "matches", "prototype", "match", "closest$1", "closestElement", "el", "getElements", "getElement", "setFocus", "focusVisible", "defaultCodecs", "support", "provider", "api", "ui", "mediaType", "range", "supportsPassiveListeners", "supported", "options", "toggleListener", "callback", "toggle", "passive", "capture", "on", "off", "once", "onceCallback", "args", "triggerEvent", "bubbles", "detail", "unbindListeners", "item", "ready", "resolve", "silencePromise", "dedupe", "array", "closest", "prev", "curr", "supportsCSS", "declaration", "standardRatios", "out", "x", "y", "validateAspectRatio", "reduceAspectRatio", "ratio", "width", "height", "getDivider", "w", "h", "divider", "getAspectRatio", "parse", "videoWidth", "videoHeight", "setAspectRatio", "useNative", "padding", "offset", "roundAspectRatio", "tolerance", "closestRatio", "getViewportSize", "html5", "player", "currentTime", "paused", "preload", "readyState", "playbackRate", "isIE", "isEdge", "isWebKit", "isIPadOS", "isIos", "browser", "generateId", "prefix", "format", "_", "getPercentage", "current", "max", "replaceAll", "find", "replace", "toTitleCase", "toPascalCase", "toCamelCase", "stripHTML", "fragment", "getHTML", "resources", "i18n", "config", "k", "v", "Storage", "_Storage", "store", "json", "storage", "test", "fetch", "url", "responseType", "withCredentials", "reject", "request", "error", "loadSprite", "id", "hasId", "isCached", "exists", "update", "container", "data", "useStorage", "cached", "result", "getHours", "getMinutes", "getSeconds", "formatTime", "time", "displayHours", "inverted", "hours", "mins", "secs", "controls", "host", "cors", "namespace", "iconUrl", "iconPath", "icon", "use", "attr", "badge", "buttonType", "props", "button", "progress", "suffixKey", "suffix", "attrs", "menuItem", "isRadioButton", "list", "title", "checked", "flex", "check", "node", "forceHours", "setProgress", "val", "label", "duration", "percent", "_this$config$markers", "_this$config$markers$", "tipElement", "visible", "show", "clientRect", "scrollLeft", "point", "invert", "hasDuration", "setting", "pane", "captions", "quality", "getBadge", "b", "sorting", "tracks", "track", "speed", "buttons", "p", "firstItem", "popup", "isMenuItem", "tab", "clone", "size", "restore", "bindMenuItemShortcuts", "createButton", "createProgress", "createRange", "createTime", "setQualityMenu", "setSpeedMenu", "showMenuPanel", "defaultAttributes", "control", "progressContainer", "tooltip", "volume", "inner", "home", "menu", "backButton", "download", "insertMethod", "addProperty", "pressed", "classNames", "selectors", "labels", "_this$config$markers2", "_this$config$markers3", "points", "containerFragment", "pointsFragment", "tipVisible", "toggleTip", "markerElement", "left", "parseUrl", "safe", "parser", "buildUrlParams", "params", "src", "blob", "browserLanguages", "languages", "language", "active", "trackEvents", "meta", "currentTrackNode", "languageExists", "toggled", "activeClass", "sortIsDefault", "sorted", "currentTrack", "cues", "cue", "content", "cueText", "caption", "defaults", "pip", "providers", "types", "getProviderByUrl", "noop", "Console", "enabled", "Fullscreen", "_Fullscreen", "_window$scrollX", "_window$scrollY", "viewport", "property", "hasProperty", "part", "focused", "focusable", "first", "last", "mode", "action", "pre", "_this$player$elements", "loadImage", "minWidth", "image", "handler", "iframe", "enable", "poster", "controlsElement", "recentTouchSeek", "Listeners", "_player", "timers", "setGutter", "useNativeAspectRatio", "viewportWidth", "viewportHeight", "overflow", "resized", "proxyEvents", "defaultHandler", "customHandlerKey", "customHandler", "hasCustomHandler", "returned", "inputEvent", "rect", "seek", "attribute", "play", "done", "inputs", "seekTo", "previewThumbnails", "direction", "altKey", "ctrlKey", "metaKey", "shiftKey", "repeat", "seekByIncrement", "increment", "editable", "getDefaultExportFromCjs", "loadjs_umd$1", "loadjs_umd", "hasRequiredLoadjs_umd", "requireLoadjs_umd", "module", "exports", "root", "factory", "devnull", "bundleIdCache", "bundleResultCache", "bundleCallbackQueue", "subscribe", "bundleIds", "callbackFn", "depsNotFound", "numWaiting", "fn", "bundleId", "q", "pathsNotFound", "publish", "executeCallbacks", "loadFile", "numTries", "doc", "async", "maxTries", "beforeCallbackFn", "pathname", "pathStripped", "isLegacyIECss", "hasModuleSupport", "ev", "loadFiles", "paths", "defaultPrevented", "loadjs", "arg1", "arg2", "loadFn", "deps", "loadjs_umdExports", "loadScript", "parseId$1", "regex", "parseHash", "found", "assurePlaybackState$1", "vimeo", "premium", "referrerPolicy", "frameParams", "hash", "hashParam", "response", "embed", "media", "restorePause", "muted", "loop", "currentSrc", "dimensions", "state", "strippedCues", "parseId", "assurePlaybackState", "getHost", "youtube", "videoId", "currentId", "posterSrc", "code", "message", "instance", "speeds", "destroy", "Ads", "start", "settings", "cuePoint", "seekElement", "cuePercentage", "ad", "adData", "seekedTime", "adError", "handlers", "from", "clamp", "min", "parseVtt", "vttDataString", "processedList", "frame", "line", "lineSplit", "matchTimes", "fitRatio", "outer", "targetRatio", "PreviewThumbnails", "sortAndResolve", "thumbnails", "promises", "thumbnail", "tempImage", "_this$player$config$m", "_this$player$config$m2", "percentage", "timeContainer", "thumbNum", "hasThumb", "qualityIndex", "urlPrefix", "thumbFilename", "thumbUrl", "previewImage", "newImage", "currentImage", "removeDelay", "currentImageContainer", "forward", "oldThumbFilename", "thumbnailsClone", "foundOne", "newThumbFilename", "thumbURL", "currentQualityIndex", "previewImageHeight", "clearShowing", "imageContainer", "thumbWidth", "thumbHeight", "scrubberRect", "containerRect", "position", "clamped", "multiplier", "tagName", "Plyr", "_Plyr", "seekTime", "step", "isHidden", "hiding", "eventName", "soft", "_type", "truthy", "inputIsValid", "buffered", "fauxDuration", "realDuration", "mute", "updateStorage", "thumbnailSource", "video_player_controller_default", "Controller", "video", "source", "player", "Plyr", "Hls", "hls", "__publicField", "definitions", "auto_submit_period_select_controller_default", "floating_bar_controller_default", "location_filter_controller_default", "location_filter_menu_item_controller_default", "primary_filters_controller_default", "carousel_controller_default", "consent_management_controller_default", "increment_controller_default", "initialize_controller_default", "openable_controller_default", "overlappable_controller_default", "period_select_controller_default", "pop_up_controller_default", "recaptcha_controller_default", "slideshow_controller_default", "sticky_controller_default", "turbo_opt_in_controller_default", "turbo_request_controller_default", "video_player_controller_default", "application_layout_controller_default", "Controller", "__publicField", "autofocus_controller_default", "Controller", "import_lodash", "autosubmit_controller_default", "Controller", "__publicField", "debounce", "import_react", "import_react_dom", "date_calendar_controller_default", "Controller", "__publicField", "tabsPanel", "isActive", "date", "DateCalendar", "ReactDOM", "React", "import_react", "import_react_dom", "DATE_FORMAT", "date_range_calendar_controller_default", "Controller", "__publicField", "DateRangeCalendar", "ReactDOM", "React", "tabsPanel", "isActive", "startDateValue", "endDateValue", "startDate", "isValidDate", "endDate", "_a", "date", "expandable_controller_default", "Controller", "__publicField", "LiveObserver", "element", "callback", "toTitleCase", "string", "LiveState", "element", "toTitleCase", "Hooks", "name", "callback", "first", "env", "Plugins", "jsep", "plugins", "plugin", "Jsep", "_Jsep", "op_name", "precedence", "isRightAssociative", "char", "literal_name", "literal_value", "expr", "obj", "k", "ch", "op_val", "message", "error", "node", "nodes", "untilICode", "ch_i", "to_check", "tc_len", "biop", "prec", "stack", "biop_info", "left", "right", "i", "cur_biop", "comparePrev", "prev", "argument", "optional", "number", "chCode", "str", "startIndex", "quote", "closed", "start", "termination", "args", "separator_count", "arg", "hooks", "stdClassProps", "prop", "m", "CONDITIONAL_EXP", "ternary", "test", "consequent", "alternate", "newTest", "ExpressionEval", "static", "operator", "_function", "jsep", "addUnaryOp", "unops", "precedence_or_fn", "_ra_or_callback", "precedence", "ra", "cb", "r", "addBinaryOp", "binops", "nodeType", "evaluator", "evaluators", "plugins", "forEach", "p", "init", "parse", "register", "initEval", "call", "ast", "context", "eval", "expression", "bind", "evalAsync", "compile", "compileAsync", "constructor", "isAsync", "this", "node", "v", "type", "default", "JSON", "stringify", "evalSyncAsync", "_value", "val", "Promise", "resolve", "then", "evalArrayExpression", "evalArray", "elements", "list", "mapped", "map", "toFullArray", "res", "reduce", "arr", "i", "push", "all", "evalBinaryExpression", "left", "right", "leftRight", "op", "evalCompoundExpression", "body", "length", "evalCallExpression", "evalCall", "callee", "fn", "caller", "arguments", "args", "apply", "evaluateMember", "validateFnAndCall", "evalConditionalExpression", "test", "consequent", "alternate", "evalIdentifier", "name", "value", "evalMemberExpression", "object", "computed", "property", "key", "optional", "evalThisExpression", "evalUnaryExpression", "argument", "arg", "evalArrowFunctionExpression", "async", "arrowArgs", "evalArrowContext", "arrowContext", "params", "param", "el", "j", "Error", "properties", "prop", "toString", "keys", "k", "slice", "evalAssignmentExpression", "getContextAndKey", "destObj", "destKey", "assignOps", "evalUpdateExpression", "evalUpdateOperation", "evalAwaitExpression", "_n", "prefix", "obj", "evalNewExpression", "ctor", "construct", "evalObjectExpression", "Object", "assign", "shorthand", "evalSpreadElement", "evalTaggedTemplateExpression", "fnAndArgs", "tag", "quasi", "expressions", "exprs", "quasis", "q", "cooked", "evalTemplateLiteral", "str", "tail", "Function", "prototype", "concat", "e", "nodeFunctionName", "evaluate", "ArrayExpression", "LogicalExpression", "BinaryExpression", "CallExpression", "Compound", "ConditionalExpression", "Identifier", "Literal", "evalLiteral", "OptionalMemberExpression", "MemberExpression", "ThisExpression", "UnaryExpression", "ArrowFunctionExpression", "AssignmentExpression", "UpdateExpression", "AwaitExpression", "NewExpression", "ObjectExpression", "SpreadElement", "TaggedTemplateExpression", "TemplateLiteral", "DEFAULT_PRECEDENCE", "a", "b", "addEvaluator", "registerPlugin", "evalExpr", "evalExprAsync", "c", "LiveEvaluator", "state", "computed", "__publicField", "locales", "options", "value", "expression", "context", "parseExpression", "error", "ast", "y", "html", "jsep", "escapeHtml", "text", "div", "strings", "values", "result", "string", "index", "LiveAttribute", "attributeNode", "parseExpression", "toTitleCase", "LiveComputed", "element", "toTitleCase", "entries", "Object", "setPrototypeOf", "isFrozen", "getPrototypeOf", "getOwnPropertyDescriptor", "freeze", "seal", "create", "_ref", "Reflect", "apply", "construct", "x", "func", "thisArg", "_len", "arguments", "length", "args", "Array", "_key", "Func", "_len2", "_key2", "arrayForEach", "unapply", "prototype", "forEach", "arrayLastIndexOf", "lastIndexOf", "arrayPop", "pop", "arrayPush", "push", "arraySplice", "splice", "arrayIsArray", "isArray", "stringToLowerCase", "String", "toLowerCase", "stringToString", "toString", "stringMatch", "match", "stringReplace", "replace", "stringIndexOf", "indexOf", "stringTrim", "trim", "numberToString", "Number", "booleanToString", "Boolean", "bigintToString", "BigInt", "symbolToString", "Symbol", "objectHasOwnProperty", "hasOwnProperty", "objectToString", "regExpTest", "RegExp", "test", "typeErrorCreate", "unconstruct", "TypeError", "lastIndex", "_len3", "_key3", "_len4", "_key4", "addToSet", "set", "array", "transformCaseFunc", "l", "element", "lcElement", "cleanArray", "index", "clone", "object", "newObject", "_ref2", "_ref3", "_slicedToArray", "property", "value", "constructor", "stringifyValue", "valueAsRecord", "valueToString", "lookupGetter", "stringified", "prop", "desc", "get", "fallbackValue", "isRegex", "html", "svg", "svgFilters", "svgDisallowed", "mathMl", "mathMlDisallowed", "text", "xml", "MUSTACHE_EXPR", "ERB_EXPR", "TMPLIT_EXPR", "DATA_ATTR", "ARIA_ATTR", "IS_ALLOWED_URI", "IS_SCRIPT_OR_DATA", "ATTR_WHITESPACE", "DOCTYPE_NAME", "CUSTOM_ELEMENT", "ELEMENT_MARKUP_PROBE", "COMMENT_MARKUP_PROBE", "FALLBACK_TAG_CLOSE", "SELF_CLOSING_TAG", "NODE_TYPE", "attribute", "cdataSection", "entityReference", "entityNode", "processingInstruction", "comment", "document", "documentType", "documentFragment", "notation", "LITERAL_TEXT_ELEMENT_NAMES", "LITERAL_TEXT_ELEMENTS", "LITERAL_TEXT_CLOSE", "map", "name", "getGlobal", "window", "_createTrustedTypesPolicy", "trustedTypes", "purifyHostElement", "createPolicy", "suffix", "ATTR_NAME", "hasAttribute", "getAttribute", "policyName", "createHTML", "createScriptURL", "scriptUrl", "console", "warn", "_createHooksMap", "afterSanitizeAttributes", "afterSanitizeElements", "afterSanitizeShadowDOM", "beforeSanitizeAttributes", "beforeSanitizeElements", "beforeSanitizeShadowDOM", "uponSanitizeAttribute", "uponSanitizeElement", "uponSanitizeShadowNode", "_resolveSetOption", "cfg", "key", "fallback", "options", "base", "transform", "_resolveObjectOption", "makeFallback", "undefined", "createDOMPurify", "DOMPurify", "root", "version", "VERSION", "removed", "nodeType", "Element", "isSupported", "originalDocument", "currentScript", "DocumentFragment", "HTMLTemplateElement", "Node", "NodeFilter", "_window$NamedNodeMap", "NamedNodeMap", "MozNamedAttrMap", "HTMLFormElement", "DOMParser", "ElementPrototype", "cloneNode", "remove", "getNextSibling", "getChildNodes", "getParentNode", "getShadowRoot", "getAttributes", "getNodeType", "getNodeName", "getOwnerDocument", "_readNodeType", "node", "_readNodeName", "nodeName", "template", "createElement", "content", "ownerDocument", "trustedTypesPolicy", "emptyHTML", "defaultTrustedTypesPolicy", "defaultTrustedTypesPolicyResolved", "IN_TRUSTED_TYPES_POLICY", "_assertNotInTrustedTypesPolicy", "_createTrustedHTML", "_createTrustedScriptURL", "_getDefaultTrustedTypesPolicy", "_document", "implementation", "createNodeIterator", "createDocumentFragment", "getElementsByTagName", "importNode", "hooks", "createHTMLDocument", "EXPRESSIONS", "ALLOWED_TAGS", "DEFAULT_ALLOWED_TAGS", "TAGS", "ALLOWED_ATTR", "DEFAULT_ALLOWED_ATTR", "ATTRS", "CUSTOM_ELEMENT_HANDLING", "tagNameCheck", "writable", "configurable", "enumerable", "attributeNameCheck", "allowCustomizedBuiltInElements", "FORBID_TAGS", "FORBID_ATTR", "EXTRA_ELEMENT_HANDLING", "tagCheck", "attributeCheck", "ALLOW_ARIA_ATTR", "ALLOW_DATA_ATTR", "ALLOW_UNKNOWN_PROTOCOLS", "ALLOW_SELF_CLOSE_IN_ATTR", "SAFE_FOR_TEMPLATES", "SAFE_FOR_XML", "WHOLE_DOCUMENT", "SET_CONFIG", "SET_CONFIG_ALLOWED_TAGS", "SET_CONFIG_ALLOWED_ATTR", "FORCE_BODY", "RETURN_DOM", "RETURN_DOM_FRAGMENT", "RETURN_TRUSTED_TYPE", "SANITIZE_DOM", "SANITIZE_NAMED_PROPS", "SANITIZE_NAMED_PROPS_PREFIX", "KEEP_CONTENT", "IN_PLACE", "USE_PROFILES", "FORBID_CONTENTS", "DEFAULT_FORBID_CONTENTS", "DATA_URI_TAGS", "DEFAULT_DATA_URI_TAGS", "URI_SAFE_ATTRIBUTES", "DEFAULT_URI_SAFE_ATTRIBUTES", "MATHML_NAMESPACE", "SVG_NAMESPACE", "HTML_NAMESPACE", "NAMESPACE", "IS_EMPTY_INPUT", "ALLOWED_NAMESPACES", "DEFAULT_ALLOWED_NAMESPACES", "DEFAULT_MATHML_TEXT_INTEGRATION_POINTS", "MATHML_TEXT_INTEGRATION_POINTS", "DEFAULT_HTML_INTEGRATION_POINTS", "HTML_INTEGRATION_POINTS", "COMMON_SVG_AND_HTML_ELEMENTS", "PARSER_MEDIA_TYPE", "SUPPORTED_PARSER_MEDIA_TYPES", "DEFAULT_PARSER_MEDIA_TYPE", "CONFIG", "formElement", "isRegexOrFunction", "testValue", "Function", "_parseConfig", "ALLOWED_URI_REGEXP", "customElementHandling", "ADD_TAGS", "ADD_ATTR", "ADD_FORBID_CONTENTS", "table", "tbody", "TRUSTED_TYPES_POLICY", "previousTrustedTypesPolicy", "error", "ALL_SVG_TAGS", "ALL_MATHML_TAGS", "_checkSvgNamespace", "tagName", "parent", "parentTagName", "namespaceURI", "_checkMathMlNamespace", "_checkHtmlNamespace", "_checkValidNamespace", "_forceRemove", "removeChild", "_stripAttributeNode", "removeAttributeNode", "removeAttribute", "_neutralizeRoot", "_neutralizeSubtree", "childNodes", "snapshot", "child", "attributes", "i", "_removeAttribute", "attr", "getAttributeNode", "from", "setAttribute", "_stripDisallowedAttributes", "stack", "_isPatchLinkageAttribute", "lcName", "lcTag", "_neutralizePatchLinkage", "data", "_initDocument", "dirty", "doc", "leadingWhitespace", "matches", "dirtyPayload", "parseFromString", "documentElement", "createDocument", "innerHTML", "body", "insertBefore", "createTextNode", "call", "_createNodeIterator", "SHOW_ELEMENT", "SHOW_COMMENT", "SHOW_TEXT", "SHOW_PROCESSING_INSTRUCTION", "SHOW_CDATA_SECTION", "_stripTemplateExpressions", "_scrubTemplateExpressions", "_node$querySelectorAl", "normalize", "walker", "currentNode", "nextNode", "templates", "querySelectorAll", "tmpl", "_isDocumentFragment", "_isClobbered", "realTagName", "textContent", "hasChildNodes", "_isNode", "_executeHooks", "hook", "_isUnsafeNode", "firstElementChild", "_matchesNameCheck", "check", "_sanitizeDisallowedNode", "_isBasicCustomElement", "parentNode", "childCount", "hoisted", "_forkSharedAllowlist", "hookList", "defaultSet", "setConfigSet", "_handleHookDetachedNode", "_sanitizeElements", "allowedTags", "_isValidAttribute", "nameIsPermitted", "RESERVED_CUSTOM_ELEMENT_NAMES", "_applyTrustedTypesToAttribute", "getAttributeType", "_setAttributeValue", "setAttributeNS", "_sanitizeAttributes", "hookEvent", "attrName", "attrValue", "keepAttr", "allowedAttributes", "forceKeepAttr", "initValue", "_sanitizeShadowDOM", "fragment", "shadowNode", "shadowIterator", "innerSr", "_sanitizeAttachedShadowRoots", "shadow", "item", "isElement", "rootName", "sr", "sanitize", "importedNode", "returnNode", "inPlace", "nn", "appendChild", "firstChild", "walkRoot", "nodeIterator", "entry", "shadowroot", "shadowrootmode", "serializedHTML", "outerHTML", "doctype", "setConfig", "clearConfig", "isValidAttribute", "tag", "addHook", "entryPoint", "hookFunction", "removeHook", "removeHooks", "removeAllHooks", "purify", "LiveController", "Controller", "__publicField", "LiveEvaluator", "LiveObserver", "mutationRecords", "mutationRoots", "event", "element", "LiveState", "LiveComputed", "attributeName", "attributeNode", "LiveAttribute", "roots", "root", "liveState", "functionName", "name", "value", "liveComputed", "expression", "finalExpression", "liveAttribute", "result", "purify", "classNames", "property", "attrName", "target", "addedNodes", "removedNodes", "node", "other", "elements", "selector", "results", "templates", "template", "descriptor", "isToggled", "className", "_a", "import_scroll_lock", "ESCAPE_KEY", "modal_controller_default", "Controller", "__publicField", "insideElement", "insideInteraction", "element", "removeModal", "removeModalIdFromUrlIfNeeded", "_a", "url", "modal", "reverseAnimation", "animationName", "modal_dialog_controller_default", "Controller", "__publicField", "event", "xhr", "target", "_a", "modal_slideshow_controller_default", "Controller", "__publicField", "previous", "selected", "thumbnails", "event", "handlers", "EmblaCarousel", "_a", "index", "modal_trigger_controller_default", "Controller", "__publicField", "b", "modal", "_a", "formData", "_b", "handleAlways", "method", "url", "body", "pair", "response", "$portalModal", "id", "hideOnEsc", "hide", "onKeyDown", "event", "DEFAULT_POPPER_OPTIONS", "hideOnEsc", "popover_controller_default", "Controller", "__publicField", "popper", "reference", "placement", "oppositeVariationPlacement", "matched", "tippy_esm_default", "_a", "_b", "import_lodash", "range_slider_controller_default", "Controller", "__publicField", "min", "max", "debounce", "event", "clientX", "trackRect", "thumbWidth", "adjustedTrackWidth", "x", "percent", "moveEvent", "offsetX", "isMinThumbActive", "moveX", "moveValue", "isThumb", "thumbRect", "pointerX", "isMinThumb", "isMaxThumb", "clickValue", "minDistance", "maxDistance", "onPointerUp", "skipNotify", "skipUpdateInputs", "isMinInput", "isMinHandleMoving", "range", "trackWidth", "adjustedTrackPercent", "leftPercent", "maxPercent", "rightPercent", "SearchListController", "Controller", "__publicField", "firstInteractiveItem", "event", "_a", "handlers", "target", "item", "items", "offset", "interactiveItems", "nextIndex", "nextItem", "_LocalSearchListController_instances", "tokenizeItem_fn", "LocalSearchListController", "__privateAdd", "__privateMethod", "element", "queryTokens", "normalizeText", "matchingItems", "nonMatchingItems", "token", "queryToken", "extractTextContent", "text", "node", "textContent", "child", "toggle_by_controller_default", "Controller", "__publicField", "any", "isToggled", "elem", "event", "targetValue", "_a", "valuesData", "parsed", "v", "suggestController", "value", "choice", "show_by_controller_default", "toggle_by_controller_default", "__publicField", "isToggled", "stepper_controller_default", "Controller", "__publicField", "event", "button", "value", "_a", "currentValue", "interval", "minInterval", "multiplier", "updateValue", "isMax", "isMin", "tabs_controller_default", "Controller", "__publicField", "event", "activeTabsItemController", "key", "itemTarget", "tabsItemController", "panelTarget", "tabsPanelController", "tabs_item_controller_default", "Controller", "isActive", "tabs_panel_controller_default", "Controller", "isActive", "DEFAULT_TIPPY_PROPS", "ROUND_ARROW", "hideOnEsc", "tooltip_controller_default", "Controller", "__publicField", "mutations", "mutation", "props", "key", "tippy_esm_default", "_a", "_b", "event", "frameId", "response", "message", "error", "e", "turboStream", "modalId", "buttonId", "node", "addStimulusController", "redirectPath", "redirectLocation", "urlWithoutAnchor", "urlWithTimestamp", "input_value", "fieldId", "inputField", "url", "query", "historyFns", "targetId", "scrollElement", "controllerName", "stimulusControllers", "location", "searchParams", "e", "turboStream", "dataLayerEvent", "pushDataLayer", "gtmDataLayer", "dataLayer", "application", "Application", "definitions", "application_layout_controller_default", "autofocus_controller_default", "autosubmit_controller_default", "date_calendar_controller_default", "date_range_calendar_controller_default", "expandable_controller_default", "LiveController", "modal_dialog_controller_default", "modal_slideshow_controller_default", "modal_trigger_controller_default", "modal_controller_default", "popover_controller_default", "range_slider_controller_default", "LocalSearchListController", "show_by_controller_default", "stepper_controller_default", "tabs_item_controller_default", "tabs_panel_controller_default", "tabs_controller_default", "tooltip_controller_default"]
}
