{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/VjPWCy4ec8qxUVQXcxUM/0zBbBSnmj16CDmH648FK/gtKx7cgl6.js", "ssg:https://asset.29cm.co.kr/contents/framer/node_modules/hls.js/dist/hls.js", "ssg:https://asset.29cm.co.kr/contents/framer/utils/hls.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.utils.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.module.css.js", "ssg:https://asset.29cm.co.kr/contents/framer/hooks/useCreateAppSchemeLink.js", "ssg:https://asset.29cm.co.kr/contents/framer/hooks/useCreateOneLink.js", "ssg:https://asset.29cm.co.kr/contents/framer/hooks/useMediaQuery.js", "ssg:https://asset.29cm.co.kr/contents/framer/hooks/useIsMobileDevice.js", "ssg:https://asset.29cm.co.kr/contents/framer/utils/getCurrentHref.js", "ssg:https://asset.29cm.co.kr/contents/framer/node_modules/qrcode.react/lib/esm/index.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/@shared/dialogs/AppLinkDialog/AppLinkDialog.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/@shared/dialogs/AppLinkDialog/AppLinkDialog.hooks.js", "ssg:https://asset.29cm.co.kr/contents/framer/apis/live-campaign/LiveCampaignApiService.js", "ssg:https://asset.29cm.co.kr/contents/framer/hooks/fetchers/useFetchLiveCampaign.js", "ssg:https://asset.29cm.co.kr/contents/framer/utils/date-helpers/diffFromNowInMilliseconds.js", "ssg:https://asset.29cm.co.kr/contents/framer/hooks/useLiveStatus.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.hooks.event.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.hooks.js", "ssg:https://asset.29cm.co.kr/contents/framer/apis/live-campaign/LiveCampaignApiService.types.js", "ssg:https://asset.29cm.co.kr/contents/framer/types/live-campaign.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.constants.js", "ssg:https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.js", "ssg:https://framerusercontent.com/modules/yr70XBNJvPzIS15CP2zK/jVDP4pPZiCu0xmHDMBov/TestLiveCampaignVideo.js"],
  "sourcesContent": ["// Generated by Framer (f082bd6)\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addFonts,addPropertyControls,ControlType,cx,Link,RichText,SVG,useActiveVariantCallback,useComponentViewport,useLocaleInfo,useVariantState,withCSS}from\"framer\";import{LayoutGroup,motion,MotionConfigContext}from\"framer-motion\";import*as React from\"react\";const cycleOrder=[\"IYGkJDnO4\",\"PNUhWA9_C\",\"TBAG1TjbR\",\"g4mgq_fct\",\"Bb1dMDJhS\",\"JgfeZXtes\",\"frfTJGoWm\"];const serializationHash=\"framer-8mqJ8\";const variantClassNames={Bb1dMDJhS:\"framer-v-cdh5rk\",frfTJGoWm:\"framer-v-11cydt8\",g4mgq_fct:\"framer-v-1fuayro\",IYGkJDnO4:\"framer-v-7njqwi\",JgfeZXtes:\"framer-v-7mwwtg\",PNUhWA9_C:\"framer-v-apsx67\",TBAG1TjbR:\"framer-v-1uhjhcf\"};function addPropertyOverrides(overrides,...variants){const nextOverrides={};variants?.forEach(variant=>variant&&Object.assign(nextOverrides,overrides[variant]));return nextOverrides;}const transition1={duration:0,type:\"tween\"};const Transition=({value,children})=>{const config=React.useContext(MotionConfigContext);const transition=value??config.transition;const contextValue=React.useMemo(()=>({...config,transition}),[JSON.stringify(transition)]);return /*#__PURE__*/_jsx(MotionConfigContext.Provider,{value:contextValue,children:children});};const Variants=motion.create(React.Fragment);const humanReadableVariantMap={\"Variant 7\":\"frfTJGoWm\",DesktopPrimary:\"IYGkJDnO4\",DesktopSecondary:\"PNUhWA9_C\",DesktopTertiary:\"TBAG1TjbR\",MobilePrimary:\"g4mgq_fct\",MobileSecondary:\"Bb1dMDJhS\",Mobiletertiary:\"JgfeZXtes\"};const getProps=({brandNameKor,desc,descVisible,height,id,onTap,url,width,...props})=>{return{...props,AKriOw6Zk:desc??props.AKriOw6Zk??\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\",h1eW_LV8X:onTap??props.h1eW_LV8X,iLD9hHMek:url??props.iLD9hHMek,jTgPksek5:descVisible??props.jTgPksek5??true,oCwUau3q4:brandNameKor??props.oCwUau3q4??\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\",variant:humanReadableVariantMap[props.variant]??props.variant??\"IYGkJDnO4\"};};const createLayoutDependency=(props,variants)=>{if(props.layoutDependency)return variants.join(\"-\")+props.layoutDependency;return variants.join(\"-\");};const Component=/*#__PURE__*/React.forwardRef(function(props,ref){const{activeLocale,setLocale}=useLocaleInfo();const{style,className,layoutId,variant,oCwUau3q4,AKriOw6Zk,jTgPksek5,iLD9hHMek,h1eW_LV8X,...restProps}=getProps(props);const{baseVariant,classNames,clearLoadingGesture,gestureHandlers,gestureVariant,isLoading,setGestureState,setVariant,variants}=useVariantState({cycleOrder,defaultVariant:\"IYGkJDnO4\",variant,variantClassNames});const layoutDependency=createLayoutDependency(props,variants);const{activeVariantCallback,delay}=useActiveVariantCallback(baseVariant);const onTapz62v8u=activeVariantCallback(async(...args)=>{setGestureState({isPressed:false});if(h1eW_LV8X){const res=await h1eW_LV8X(...args);if(res===false)return false;}});const sharedStyleClassNames=[];const scopingClassNames=cx(serializationHash,...sharedStyleClassNames);const ref1=React.useRef(null);const isDisplayed=()=>{if([\"PNUhWA9_C\",\"TBAG1TjbR\",\"Bb1dMDJhS\",\"JgfeZXtes\",\"frfTJGoWm\"].includes(baseVariant))return true;return false;};const isDisplayed1=()=>{if([\"PNUhWA9_C\",\"TBAG1TjbR\",\"Bb1dMDJhS\",\"JgfeZXtes\",\"frfTJGoWm\"].includes(baseVariant))return false;return true;};const defaultLayoutId=React.useId();const componentViewport=useComponentViewport();return /*#__PURE__*/_jsx(LayoutGroup,{id:layoutId??defaultLayoutId,children:/*#__PURE__*/_jsx(Variants,{animate:variants,initial:false,children:/*#__PURE__*/_jsx(Transition,{value:transition1,children:/*#__PURE__*/_jsx(Link,{href:iLD9hHMek,nodeId:\"IYGkJDnO4\",children:/*#__PURE__*/_jsxs(motion.a,{...restProps,...gestureHandlers,className:`${cx(scopingClassNames,\"framer-7njqwi\",className,classNames)} framer-5lvn5q`,\"data-framer-name\":\"DesktopPrimary\",\"data-highlight\":true,layoutDependency:layoutDependency,layoutId:\"IYGkJDnO4\",onTap:onTapz62v8u,ref:ref??ref1,style:{\"--border-bottom-width\":\"0px\",\"--border-color\":\"rgba(0, 0, 0, 0)\",\"--border-left-width\":\"0px\",\"--border-right-width\":\"0px\",\"--border-style\":\"solid\",\"--border-top-width\":\"0px\",backgroundColor:\"rgb(0, 0, 0)\",borderBottomLeftRadius:6,borderBottomRightRadius:6,borderTopLeftRadius:6,borderTopRightRadius:6,...style},variants:{Bb1dMDJhS:{\"--border-bottom-width\":\"1px\",\"--border-color\":\"rgb(160, 160, 160)\",\"--border-left-width\":\"1px\",\"--border-right-width\":\"1px\",\"--border-style\":\"solid\",\"--border-top-width\":\"1px\",backgroundColor:\"rgba(0, 0, 0, 0)\",borderBottomLeftRadius:3,borderBottomRightRadius:3,borderTopLeftRadius:3,borderTopRightRadius:3},frfTJGoWm:{\"--border-bottom-width\":\"0px\",\"--border-left-width\":\"0px\",\"--border-right-width\":\"0px\",\"--border-top-width\":\"0px\",backgroundColor:\"rgb(255, 255, 255)\",borderBottomLeftRadius:3,borderBottomRightRadius:3,borderTopLeftRadius:3,borderTopRightRadius:3},g4mgq_fct:{\"--border-bottom-width\":\"0px\",\"--border-left-width\":\"0px\",\"--border-right-width\":\"0px\",\"--border-top-width\":\"0px\",borderBottomLeftRadius:3,borderBottomRightRadius:3,borderTopLeftRadius:3,borderTopRightRadius:3},JgfeZXtes:{\"--border-bottom-width\":\"0px\",\"--border-left-width\":\"0px\",\"--border-right-width\":\"0px\",\"--border-top-width\":\"0px\",backgroundColor:\"rgb(244, 244, 244)\",borderBottomLeftRadius:3,borderBottomRightRadius:3,borderTopLeftRadius:3,borderTopRightRadius:3},PNUhWA9_C:{\"--border-bottom-width\":\"1px\",\"--border-color\":\"rgb(160, 160, 160)\",\"--border-left-width\":\"1px\",\"--border-right-width\":\"1px\",\"--border-style\":\"solid\",\"--border-top-width\":\"1px\",backgroundColor:\"rgba(0, 0, 0, 0)\"},TBAG1TjbR:{\"--border-bottom-width\":\"0px\",\"--border-left-width\":\"0px\",\"--border-right-width\":\"0px\",\"--border-top-width\":\"0px\",backgroundColor:\"rgb(244, 244, 244)\"}},...addPropertyOverrides({Bb1dMDJhS:{\"data-border\":true,\"data-framer-name\":\"MobileSecondary\"},frfTJGoWm:{\"data-framer-name\":\"Variant 7\"},g4mgq_fct:{\"data-framer-name\":\"MobilePrimary\"},JgfeZXtes:{\"data-framer-name\":\"Mobiletertiary\"},PNUhWA9_C:{\"data-border\":true,\"data-framer-name\":\"DesktopSecondary\"},TBAG1TjbR:{\"data-framer-name\":\"DesktopTertiary\"}},baseVariant,gestureVariant),children:[/*#__PURE__*/_jsxs(motion.div,{className:\"framer-hgxm4i\",\"data-framer-name\":\"txt\",layoutDependency:layoutDependency,layoutId:\"zlRtlZFSX\",children:[/*#__PURE__*/_jsx(motion.div,{className:\"framer-1uwrtv2\",layoutDependency:layoutDependency,layoutId:\"mhc8Cj6fk\",children:/*#__PURE__*/_jsx(RichText,{__fromCanvasComponent:true,children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-font-size\":\"24px\",\"--framer-line-height\":\"1.6em\",\"--framer-text-color\":\"var(--extracted-a0htzi, rgb(255, 255, 255))\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})}),className:\"framer-7r4kcn\",fonts:[\"CUSTOM;Pretendard SemiBold\"],layoutDependency:layoutDependency,layoutId:\"x5xn4786k\",style:{\"--extracted-a0htzi\":\"rgb(255, 255, 255)\",\"--framer-link-text-color\":\"rgb(0, 153, 255)\",\"--framer-link-text-decoration\":\"underline\"},text:oCwUau3q4,verticalAlignment:\"top\",withExternalLayout:true,...addPropertyOverrides({Bb1dMDJhS:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-line-height\":\"1.4em\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})})},frfTJGoWm:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-line-height\":\"1.4em\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})})},g4mgq_fct:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-line-height\":\"1.4em\",\"--framer-text-color\":\"var(--extracted-a0htzi, rgb(255, 255, 255))\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})})},JgfeZXtes:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-line-height\":\"1.4em\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})})},PNUhWA9_C:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-font-size\":\"24px\",\"--framer-line-height\":\"1.6em\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})})},TBAG1TjbR:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.h3,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgU2VtaUJvbGQ=\",\"--framer-font-family\":'\"Pretendard SemiBold\", \"Pretendard SemiBold Placeholder\", sans-serif',\"--framer-font-size\":\"24px\",\"--framer-line-height\":\"1.6em\"},children:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\"})})}},baseVariant,gestureVariant)})}),jTgPksek5&&/*#__PURE__*/_jsx(RichText,{__fromCanvasComponent:true,children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-line-height\":\"1.6em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(160, 160, 160))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})}),className:\"framer-a1qqc2\",fonts:[\"CUSTOM;Pretendard Regular\"],layoutDependency:layoutDependency,layoutId:\"zD4LG7EaU\",style:{\"--extracted-r6o4lv\":\"rgb(160, 160, 160)\",\"--framer-link-text-color\":\"rgb(0, 153, 255)\",\"--framer-link-text-decoration\":\"underline\"},text:AKriOw6Zk,variants:{Bb1dMDJhS:{\"--extracted-r6o4lv\":\"rgb(71, 71, 71)\"},frfTJGoWm:{\"--extracted-r6o4lv\":\"rgb(71, 71, 71)\"},JgfeZXtes:{\"--extracted-r6o4lv\":\"rgb(71, 71, 71)\"},PNUhWA9_C:{\"--extracted-r6o4lv\":\"rgb(71, 71, 71)\"},TBAG1TjbR:{\"--extracted-r6o4lv\":\"rgb(71, 71, 71)\"}},verticalAlignment:\"top\",withExternalLayout:true,...addPropertyOverrides({Bb1dMDJhS:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-font-size\":\"14px\",\"--framer-line-height\":\"1.4em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(71, 71, 71))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})})},frfTJGoWm:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-font-size\":\"14px\",\"--framer-line-height\":\"1.4em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(71, 71, 71))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})})},g4mgq_fct:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-font-size\":\"14px\",\"--framer-line-height\":\"1.4em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(160, 160, 160))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})})},JgfeZXtes:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-font-size\":\"14px\",\"--framer-line-height\":\"1.4em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(71, 71, 71))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})})},PNUhWA9_C:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-line-height\":\"1.6em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(71, 71, 71))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})})},TBAG1TjbR:{children:/*#__PURE__*/_jsx(React.Fragment,{children:/*#__PURE__*/_jsx(motion.p,{style:{\"--font-selector\":\"Q1VTVE9NO1ByZXRlbmRhcmQgUmVndWxhcg==\",\"--framer-font-family\":'\"Pretendard Regular\", \"Pretendard Regular Placeholder\", sans-serif',\"--framer-line-height\":\"1.6em\",\"--framer-text-alignment\":\"left\",\"--framer-text-color\":\"var(--extracted-r6o4lv, rgb(71, 71, 71))\"},children:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\"})})}},baseVariant,gestureVariant)})]}),/*#__PURE__*/_jsxs(motion.div,{className:\"framer-mc0dn6\",\"data-framer-name\":\"icon\",layoutDependency:layoutDependency,layoutId:\"TZtvPeuES\",children:[isDisplayed()&&/*#__PURE__*/_jsx(SVG,{className:\"framer-jvrif4\",\"data-framer-name\":\"Light theme\",fill:\"black\",intrinsicHeight:24,intrinsicWidth:24,layoutDependency:layoutDependency,layoutId:\"VdD3x4b7g\",svg:'<svg width=\"24\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m17.414 12-8.707 8.707-1.414-1.414L14.586 12 7.293 4.707l1.414-1.414L17.414 12Z\" fill=\"#000\"/></svg>',withExternalLayout:true}),isDisplayed1()&&/*#__PURE__*/_jsx(SVG,{className:\"framer-18yu5sg\",\"data-framer-name\":\"Dark theme\",fill:\"black\",intrinsicHeight:24,intrinsicWidth:24,layoutDependency:layoutDependency,layoutId:\"Bh1s9XCNy\",svg:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" style=\"enable-background:new 0 0 24 24\" xml:space=\"preserve\"><path d=\"m17.4 12-8.7 8.7-1.4-1.4 7.3-7.3-7.3-7.3 1.4-1.4 8.7 8.7z\" style=\"fill-rule:evenodd;clip-rule:evenodd;fill:#fff\"/></svg>',withExternalLayout:true})]})]})})})})});});const css=[\"@supports (aspect-ratio: 1) { body { --framer-aspect-ratio-supported: auto; } }\",\".framer-8mqJ8.framer-5lvn5q, .framer-8mqJ8 .framer-5lvn5q { display: block; }\",\".framer-8mqJ8.framer-7njqwi { align-content: center; align-items: center; cursor: pointer; display: flex; flex-direction: row; flex-wrap: nowrap; height: min-content; justify-content: space-between; overflow: hidden; padding: 20px 30px 20px 30px; position: relative; text-decoration: none; width: 1114px; will-change: var(--framer-will-change-override, transform); }\",\".framer-8mqJ8 .framer-hgxm4i { align-content: flex-start; align-items: flex-start; display: flex; flex: none; flex-direction: column; flex-wrap: nowrap; gap: 0px; height: min-content; justify-content: flex-start; overflow: hidden; padding: 0px; position: relative; width: min-content; }\",\".framer-8mqJ8 .framer-1uwrtv2 { align-content: center; align-items: center; display: flex; flex: none; flex-direction: row; flex-wrap: nowrap; gap: 7px; height: min-content; justify-content: center; overflow: visible; padding: 0px; position: relative; width: min-content; }\",\".framer-8mqJ8 .framer-7r4kcn, .framer-8mqJ8 .framer-a1qqc2 { flex: none; height: auto; position: relative; white-space: pre; width: auto; }\",\".framer-8mqJ8 .framer-mc0dn6 { align-content: center; align-items: center; display: flex; flex: none; flex-direction: row; flex-wrap: nowrap; gap: 10px; height: min-content; justify-content: center; overflow: hidden; padding: 0px; position: relative; width: min-content; }\",\".framer-8mqJ8 .framer-jvrif4, .framer-8mqJ8 .framer-18yu5sg { aspect-ratio: 1 / 1; flex: none; height: var(--framer-aspect-ratio-supported, 24px); position: relative; width: 24px; }\",\"@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)) { .framer-8mqJ8 .framer-hgxm4i, .framer-8mqJ8 .framer-1uwrtv2, .framer-8mqJ8 .framer-mc0dn6 { gap: 0px; } .framer-8mqJ8 .framer-hgxm4i > * { margin: 0px; margin-bottom: calc(0px / 2); margin-top: calc(0px / 2); } .framer-8mqJ8 .framer-hgxm4i > :first-child { margin-top: 0px; } .framer-8mqJ8 .framer-hgxm4i > :last-child { margin-bottom: 0px; } .framer-8mqJ8 .framer-1uwrtv2 > * { margin: 0px; margin-left: calc(7px / 2); margin-right: calc(7px / 2); } .framer-8mqJ8 .framer-1uwrtv2 > :first-child, .framer-8mqJ8 .framer-mc0dn6 > :first-child { margin-left: 0px; } .framer-8mqJ8 .framer-1uwrtv2 > :last-child, .framer-8mqJ8 .framer-mc0dn6 > :last-child { margin-right: 0px; } .framer-8mqJ8 .framer-mc0dn6 > * { margin: 0px; margin-left: calc(10px / 2); margin-right: calc(10px / 2); } }\",\".framer-8mqJ8.framer-v-1fuayro.framer-7njqwi, .framer-8mqJ8.framer-v-cdh5rk.framer-7njqwi, .framer-8mqJ8.framer-v-7mwwtg.framer-7njqwi, .framer-8mqJ8.framer-v-11cydt8.framer-7njqwi { padding: 16px 20px 16px 20px; width: 390px; }\",\".framer-8mqJ8.framer-v-1fuayro .framer-hgxm4i, .framer-8mqJ8.framer-v-1fuayro .framer-1uwrtv2, .framer-8mqJ8.framer-v-cdh5rk .framer-hgxm4i, .framer-8mqJ8.framer-v-cdh5rk .framer-1uwrtv2, .framer-8mqJ8.framer-v-7mwwtg .framer-hgxm4i, .framer-8mqJ8.framer-v-7mwwtg .framer-1uwrtv2, .framer-8mqJ8.framer-v-11cydt8 .framer-hgxm4i, .framer-8mqJ8.framer-v-11cydt8 .framer-1uwrtv2 { gap: 2px; }\",\".framer-8mqJ8.framer-v-1fuayro .framer-18yu5sg, .framer-8mqJ8.framer-v-cdh5rk .framer-jvrif4, .framer-8mqJ8.framer-v-7mwwtg .framer-jvrif4, .framer-8mqJ8.framer-v-11cydt8 .framer-jvrif4 { height: var(--framer-aspect-ratio-supported, 18px); width: 18px; }\",\"@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)) { .framer-8mqJ8.framer-v-1fuayro .framer-hgxm4i, .framer-8mqJ8.framer-v-1fuayro .framer-1uwrtv2 { gap: 0px; } .framer-8mqJ8.framer-v-1fuayro .framer-hgxm4i > * { margin: 0px; margin-bottom: calc(2px / 2); margin-top: calc(2px / 2); } .framer-8mqJ8.framer-v-1fuayro .framer-hgxm4i > :first-child { margin-top: 0px; } .framer-8mqJ8.framer-v-1fuayro .framer-hgxm4i > :last-child { margin-bottom: 0px; } .framer-8mqJ8.framer-v-1fuayro .framer-1uwrtv2 > * { margin: 0px; margin-left: calc(2px / 2); margin-right: calc(2px / 2); } .framer-8mqJ8.framer-v-1fuayro .framer-1uwrtv2 > :first-child { margin-left: 0px; } .framer-8mqJ8.framer-v-1fuayro .framer-1uwrtv2 > :last-child { margin-right: 0px; } }\",\"@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)) { .framer-8mqJ8.framer-v-cdh5rk .framer-hgxm4i, .framer-8mqJ8.framer-v-cdh5rk .framer-1uwrtv2 { gap: 0px; } .framer-8mqJ8.framer-v-cdh5rk .framer-hgxm4i > * { margin: 0px; margin-bottom: calc(2px / 2); margin-top: calc(2px / 2); } .framer-8mqJ8.framer-v-cdh5rk .framer-hgxm4i > :first-child { margin-top: 0px; } .framer-8mqJ8.framer-v-cdh5rk .framer-hgxm4i > :last-child { margin-bottom: 0px; } .framer-8mqJ8.framer-v-cdh5rk .framer-1uwrtv2 > * { margin: 0px; margin-left: calc(2px / 2); margin-right: calc(2px / 2); } .framer-8mqJ8.framer-v-cdh5rk .framer-1uwrtv2 > :first-child { margin-left: 0px; } .framer-8mqJ8.framer-v-cdh5rk .framer-1uwrtv2 > :last-child { margin-right: 0px; } }\",\"@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)) { .framer-8mqJ8.framer-v-7mwwtg .framer-hgxm4i, .framer-8mqJ8.framer-v-7mwwtg .framer-1uwrtv2 { gap: 0px; } .framer-8mqJ8.framer-v-7mwwtg .framer-hgxm4i > * { margin: 0px; margin-bottom: calc(2px / 2); margin-top: calc(2px / 2); } .framer-8mqJ8.framer-v-7mwwtg .framer-hgxm4i > :first-child { margin-top: 0px; } .framer-8mqJ8.framer-v-7mwwtg .framer-hgxm4i > :last-child { margin-bottom: 0px; } .framer-8mqJ8.framer-v-7mwwtg .framer-1uwrtv2 > * { margin: 0px; margin-left: calc(2px / 2); margin-right: calc(2px / 2); } .framer-8mqJ8.framer-v-7mwwtg .framer-1uwrtv2 > :first-child { margin-left: 0px; } .framer-8mqJ8.framer-v-7mwwtg .framer-1uwrtv2 > :last-child { margin-right: 0px; } }\",\"@supports (background: -webkit-named-image(i)) and (not (font-palette:dark)) { .framer-8mqJ8.framer-v-11cydt8 .framer-hgxm4i, .framer-8mqJ8.framer-v-11cydt8 .framer-1uwrtv2 { gap: 0px; } .framer-8mqJ8.framer-v-11cydt8 .framer-hgxm4i > * { margin: 0px; margin-bottom: calc(2px / 2); margin-top: calc(2px / 2); } .framer-8mqJ8.framer-v-11cydt8 .framer-hgxm4i > :first-child { margin-top: 0px; } .framer-8mqJ8.framer-v-11cydt8 .framer-hgxm4i > :last-child { margin-bottom: 0px; } .framer-8mqJ8.framer-v-11cydt8 .framer-1uwrtv2 > * { margin: 0px; margin-left: calc(2px / 2); margin-right: calc(2px / 2); } .framer-8mqJ8.framer-v-11cydt8 .framer-1uwrtv2 > :first-child { margin-left: 0px; } .framer-8mqJ8.framer-v-11cydt8 .framer-1uwrtv2 > :last-child { margin-right: 0px; } }\",'.framer-8mqJ8[data-border=\"true\"]::after, .framer-8mqJ8 [data-border=\"true\"]::after { content: \"\"; border-width: var(--border-top-width, 0) var(--border-right-width, 0) var(--border-bottom-width, 0) var(--border-left-width, 0); border-color: var(--border-color, none); border-style: var(--border-style, none); width: 100%; height: 100%; position: absolute; box-sizing: border-box; left: 0; top: 0; border-radius: inherit; pointer-events: none; }'];/**\n * This is a generated Framer component.\n * @framerIntrinsicHeight 104\n * @framerIntrinsicWidth 1114\n * @framerCanvasComponentVariantDetails {\"propertyName\":\"variant\",\"data\":{\"default\":{\"layout\":[\"fixed\",\"auto\"]},\"PNUhWA9_C\":{\"layout\":[\"fixed\",\"auto\"]},\"TBAG1TjbR\":{\"layout\":[\"fixed\",\"auto\"]},\"g4mgq_fct\":{\"layout\":[\"fixed\",\"auto\"]},\"Bb1dMDJhS\":{\"layout\":[\"fixed\",\"auto\"]},\"JgfeZXtes\":{\"layout\":[\"fixed\",\"auto\"]},\"frfTJGoWm\":{\"layout\":[\"fixed\",\"auto\"]}}}\n * @framerVariables {\"oCwUau3q4\":\"brandNameKor\",\"AKriOw6Zk\":\"desc\",\"jTgPksek5\":\"descVisible\",\"iLD9hHMek\":\"url\",\"h1eW_LV8X\":\"onTap\"}\n * @framerImmutableVariables true\n * @framerDisplayContentsDiv false\n * @framerComponentViewportWidth true\n */const FramergtKx7cgl6=withCSS(Component,css,\"framer-8mqJ8\");export default FramergtKx7cgl6;FramergtKx7cgl6.displayName=\"LandingBanner\";FramergtKx7cgl6.defaultProps={height:104,width:1114};addPropertyControls(FramergtKx7cgl6,{variant:{options:[\"IYGkJDnO4\",\"PNUhWA9_C\",\"TBAG1TjbR\",\"g4mgq_fct\",\"Bb1dMDJhS\",\"JgfeZXtes\",\"frfTJGoWm\"],optionTitles:[\"DesktopPrimary\",\"DesktopSecondary\",\"DesktopTertiary\",\"MobilePrimary\",\"MobileSecondary\",\"Mobiletertiary\",\"Variant 7\"],title:\"Variant\",type:ControlType.Enum},oCwUau3q4:{defaultValue:\"\uBAA8\uD5D8\uAC00\uC758 \uBB3C\uAC74\",displayTextArea:false,placeholder:\"\",title:\"brandNameKor\",type:ControlType.String},AKriOw6Zk:{defaultValue:\"\uBAA8\uB4E0 \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uB7EC \uAC00\uAE30\",displayTextArea:false,title:\"desc\",type:ControlType.String},jTgPksek5:{defaultValue:true,title:\"desc visible\",type:ControlType.Boolean},iLD9hHMek:{title:\"url\",type:ControlType.Link},h1eW_LV8X:{title:\"OnTap\",type:ControlType.EventHandler}});addFonts(FramergtKx7cgl6,[{explicitInter:true,fonts:[{family:\"Pretendard SemiBold\",source:\"custom\",url:\"https://framerusercontent.com/assets/PR1f1tyZwqZQEBMB43Y8WgYpbU.woff2\"},{family:\"Pretendard Regular\",source:\"custom\",url:\"https://framerusercontent.com/assets/Rs6Z4930tvYq1KEhYJKErYwTPE.woff2\"}]}],{supportsExplicitInterCodegen:true});\nexport const __FramerMetadata__ = {\"exports\":{\"Props\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"FramergtKx7cgl6\",\"slots\":[],\"annotations\":{\"framerDisplayContentsDiv\":\"false\",\"framerImmutableVariables\":\"true\",\"framerIntrinsicWidth\":\"1114\",\"framerIntrinsicHeight\":\"104\",\"framerCanvasComponentVariantDetails\":\"{\\\"propertyName\\\":\\\"variant\\\",\\\"data\\\":{\\\"default\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]},\\\"PNUhWA9_C\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]},\\\"TBAG1TjbR\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]},\\\"g4mgq_fct\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]},\\\"Bb1dMDJhS\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]},\\\"JgfeZXtes\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]},\\\"frfTJGoWm\\\":{\\\"layout\\\":[\\\"fixed\\\",\\\"auto\\\"]}}}\",\"framerVariables\":\"{\\\"oCwUau3q4\\\":\\\"brandNameKor\\\",\\\"AKriOw6Zk\\\":\\\"desc\\\",\\\"jTgPksek5\\\":\\\"descVisible\\\",\\\"iLD9hHMek\\\":\\\"url\\\",\\\"h1eW_LV8X\\\":\\\"onTap\\\"}\",\"framerContractVersion\":\"1\",\"framerComponentViewportWidth\":\"true\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./gtKx7cgl6.map", "function getDefaultExportFromCjs(x) {\n  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, \"default\") ? x[\"default\"] : x;\n}\nvar urlToolkit = { exports: {} };\n(function(module, exports) {\n  (function(root) {\n    var URL_REGEX = /^(?=((?:[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    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        baseURL = baseURL.trim();\n        relativeURL = relativeURL.trim();\n        if (!relativeURL) {\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          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          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          builtParts.netLoc = baseParts.netLoc;\n          if (relativeParts.path[0] !== \"/\") {\n            if (!relativeParts.path) {\n              builtParts.path = baseParts.path;\n              if (!relativeParts.params) {\n                builtParts.params = baseParts.params;\n                if (!relativeParts.query) {\n                  builtParts.query = baseParts.query;\n                }\n              }\n            } else {\n              var baseURLPath = baseParts.path;\n              var newPath = baseURLPath.substring(0, baseURLPath.lastIndexOf(\"/\") + 1) + relativeParts.path;\n              builtParts.path = URLToolkit.normalizePath(newPath);\n            }\n          }\n        }\n        if (builtParts.path === null) {\n          builtParts.path = opts.alwaysNormalize ? URLToolkit.normalizePath(relativeParts.path) : 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        path = path.split(\"\").reverse().join(\"\").replace(SLASH_DOT_REGEX, \"\");\n        while (path.length !== (path = path.replace(SLASH_DOT_DOT_REGEX, \"\")).length) {\n        }\n        return path.split(\"\").reverse().join(\"\");\n      },\n      buildURLFromParts: function(parts) {\n        return parts.scheme + parts.netLoc + parts.path + parts.params + parts.query + parts.fragment;\n      }\n    };\n    module.exports = URLToolkit;\n  })();\n})(urlToolkit);\nvar urlToolkitExports = urlToolkit.exports;\nfunction ownKeys(e, r) {\n  var t = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    r && (o = o.filter(function(r2) {\n      return Object.getOwnPropertyDescriptor(e, r2).enumerable;\n    })), t.push.apply(t, o);\n  }\n  return t;\n}\nfunction _objectSpread2(e) {\n  for (var r = 1; r < arguments.length; r++) {\n    var t = null != arguments[r] ? arguments[r] : {};\n    r % 2 ? ownKeys(Object(t), true).forEach(function(r2) {\n      _defineProperty(e, r2, t[r2]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r2) {\n      Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2));\n    });\n  }\n  return e;\n}\nfunction _toPrimitive(t, r) {\n  if (\"object\" != typeof t || !t)\n    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)\n      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 : String(i);\n}\nfunction _defineProperty(obj, key, value) {\n  key = _toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nconst isFiniteNumber = Number.isFinite || function(value) {\n  return typeof value === \"number\" && isFinite(value);\n};\nconst isSafeInteger = Number.isSafeInteger || function(value) {\n  return typeof value === \"number\" && Math.abs(value) <= MAX_SAFE_INTEGER;\n};\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\nlet Events = /* @__PURE__ */ function(Events2) {\n  Events2[\"MEDIA_ATTACHING\"] = \"hlsMediaAttaching\";\n  Events2[\"MEDIA_ATTACHED\"] = \"hlsMediaAttached\";\n  Events2[\"MEDIA_DETACHING\"] = \"hlsMediaDetaching\";\n  Events2[\"MEDIA_DETACHED\"] = \"hlsMediaDetached\";\n  Events2[\"BUFFER_RESET\"] = \"hlsBufferReset\";\n  Events2[\"BUFFER_CODECS\"] = \"hlsBufferCodecs\";\n  Events2[\"BUFFER_CREATED\"] = \"hlsBufferCreated\";\n  Events2[\"BUFFER_APPENDING\"] = \"hlsBufferAppending\";\n  Events2[\"BUFFER_APPENDED\"] = \"hlsBufferAppended\";\n  Events2[\"BUFFER_EOS\"] = \"hlsBufferEos\";\n  Events2[\"BUFFER_FLUSHING\"] = \"hlsBufferFlushing\";\n  Events2[\"BUFFER_FLUSHED\"] = \"hlsBufferFlushed\";\n  Events2[\"MANIFEST_LOADING\"] = \"hlsManifestLoading\";\n  Events2[\"MANIFEST_LOADED\"] = \"hlsManifestLoaded\";\n  Events2[\"MANIFEST_PARSED\"] = \"hlsManifestParsed\";\n  Events2[\"LEVEL_SWITCHING\"] = \"hlsLevelSwitching\";\n  Events2[\"LEVEL_SWITCHED\"] = \"hlsLevelSwitched\";\n  Events2[\"LEVEL_LOADING\"] = \"hlsLevelLoading\";\n  Events2[\"LEVEL_LOADED\"] = \"hlsLevelLoaded\";\n  Events2[\"LEVEL_UPDATED\"] = \"hlsLevelUpdated\";\n  Events2[\"LEVEL_PTS_UPDATED\"] = \"hlsLevelPtsUpdated\";\n  Events2[\"LEVELS_UPDATED\"] = \"hlsLevelsUpdated\";\n  Events2[\"AUDIO_TRACKS_UPDATED\"] = \"hlsAudioTracksUpdated\";\n  Events2[\"AUDIO_TRACK_SWITCHING\"] = \"hlsAudioTrackSwitching\";\n  Events2[\"AUDIO_TRACK_SWITCHED\"] = \"hlsAudioTrackSwitched\";\n  Events2[\"AUDIO_TRACK_LOADING\"] = \"hlsAudioTrackLoading\";\n  Events2[\"AUDIO_TRACK_LOADED\"] = \"hlsAudioTrackLoaded\";\n  Events2[\"SUBTITLE_TRACKS_UPDATED\"] = \"hlsSubtitleTracksUpdated\";\n  Events2[\"SUBTITLE_TRACKS_CLEARED\"] = \"hlsSubtitleTracksCleared\";\n  Events2[\"SUBTITLE_TRACK_SWITCH\"] = \"hlsSubtitleTrackSwitch\";\n  Events2[\"SUBTITLE_TRACK_LOADING\"] = \"hlsSubtitleTrackLoading\";\n  Events2[\"SUBTITLE_TRACK_LOADED\"] = \"hlsSubtitleTrackLoaded\";\n  Events2[\"SUBTITLE_FRAG_PROCESSED\"] = \"hlsSubtitleFragProcessed\";\n  Events2[\"CUES_PARSED\"] = \"hlsCuesParsed\";\n  Events2[\"NON_NATIVE_TEXT_TRACKS_FOUND\"] = \"hlsNonNativeTextTracksFound\";\n  Events2[\"INIT_PTS_FOUND\"] = \"hlsInitPtsFound\";\n  Events2[\"FRAG_LOADING\"] = \"hlsFragLoading\";\n  Events2[\"FRAG_LOAD_EMERGENCY_ABORTED\"] = \"hlsFragLoadEmergencyAborted\";\n  Events2[\"FRAG_LOADED\"] = \"hlsFragLoaded\";\n  Events2[\"FRAG_DECRYPTED\"] = \"hlsFragDecrypted\";\n  Events2[\"FRAG_PARSING_INIT_SEGMENT\"] = \"hlsFragParsingInitSegment\";\n  Events2[\"FRAG_PARSING_USERDATA\"] = \"hlsFragParsingUserdata\";\n  Events2[\"FRAG_PARSING_METADATA\"] = \"hlsFragParsingMetadata\";\n  Events2[\"FRAG_PARSED\"] = \"hlsFragParsed\";\n  Events2[\"FRAG_BUFFERED\"] = \"hlsFragBuffered\";\n  Events2[\"FRAG_CHANGED\"] = \"hlsFragChanged\";\n  Events2[\"FPS_DROP\"] = \"hlsFpsDrop\";\n  Events2[\"FPS_DROP_LEVEL_CAPPING\"] = \"hlsFpsDropLevelCapping\";\n  Events2[\"MAX_AUTO_LEVEL_UPDATED\"] = \"hlsMaxAutoLevelUpdated\";\n  Events2[\"ERROR\"] = \"hlsError\";\n  Events2[\"DESTROYING\"] = \"hlsDestroying\";\n  Events2[\"KEY_LOADING\"] = \"hlsKeyLoading\";\n  Events2[\"KEY_LOADED\"] = \"hlsKeyLoaded\";\n  Events2[\"LIVE_BACK_BUFFER_REACHED\"] = \"hlsLiveBackBufferReached\";\n  Events2[\"BACK_BUFFER_REACHED\"] = \"hlsBackBufferReached\";\n  Events2[\"STEERING_MANIFEST_LOADED\"] = \"hlsSteeringManifestLoaded\";\n  return Events2;\n}({});\nlet ErrorTypes = /* @__PURE__ */ function(ErrorTypes2) {\n  ErrorTypes2[\"NETWORK_ERROR\"] = \"networkError\";\n  ErrorTypes2[\"MEDIA_ERROR\"] = \"mediaError\";\n  ErrorTypes2[\"KEY_SYSTEM_ERROR\"] = \"keySystemError\";\n  ErrorTypes2[\"MUX_ERROR\"] = \"muxError\";\n  ErrorTypes2[\"OTHER_ERROR\"] = \"otherError\";\n  return ErrorTypes2;\n}({});\nlet ErrorDetails = /* @__PURE__ */ function(ErrorDetails2) {\n  ErrorDetails2[\"KEY_SYSTEM_NO_KEYS\"] = \"keySystemNoKeys\";\n  ErrorDetails2[\"KEY_SYSTEM_NO_ACCESS\"] = \"keySystemNoAccess\";\n  ErrorDetails2[\"KEY_SYSTEM_NO_SESSION\"] = \"keySystemNoSession\";\n  ErrorDetails2[\"KEY_SYSTEM_NO_CONFIGURED_LICENSE\"] = \"keySystemNoConfiguredLicense\";\n  ErrorDetails2[\"KEY_SYSTEM_LICENSE_REQUEST_FAILED\"] = \"keySystemLicenseRequestFailed\";\n  ErrorDetails2[\"KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED\"] = \"keySystemServerCertificateRequestFailed\";\n  ErrorDetails2[\"KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED\"] = \"keySystemServerCertificateUpdateFailed\";\n  ErrorDetails2[\"KEY_SYSTEM_SESSION_UPDATE_FAILED\"] = \"keySystemSessionUpdateFailed\";\n  ErrorDetails2[\"KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED\"] = \"keySystemStatusOutputRestricted\";\n  ErrorDetails2[\"KEY_SYSTEM_STATUS_INTERNAL_ERROR\"] = \"keySystemStatusInternalError\";\n  ErrorDetails2[\"MANIFEST_LOAD_ERROR\"] = \"manifestLoadError\";\n  ErrorDetails2[\"MANIFEST_LOAD_TIMEOUT\"] = \"manifestLoadTimeOut\";\n  ErrorDetails2[\"MANIFEST_PARSING_ERROR\"] = \"manifestParsingError\";\n  ErrorDetails2[\"MANIFEST_INCOMPATIBLE_CODECS_ERROR\"] = \"manifestIncompatibleCodecsError\";\n  ErrorDetails2[\"LEVEL_EMPTY_ERROR\"] = \"levelEmptyError\";\n  ErrorDetails2[\"LEVEL_LOAD_ERROR\"] = \"levelLoadError\";\n  ErrorDetails2[\"LEVEL_LOAD_TIMEOUT\"] = \"levelLoadTimeOut\";\n  ErrorDetails2[\"LEVEL_PARSING_ERROR\"] = \"levelParsingError\";\n  ErrorDetails2[\"LEVEL_SWITCH_ERROR\"] = \"levelSwitchError\";\n  ErrorDetails2[\"AUDIO_TRACK_LOAD_ERROR\"] = \"audioTrackLoadError\";\n  ErrorDetails2[\"AUDIO_TRACK_LOAD_TIMEOUT\"] = \"audioTrackLoadTimeOut\";\n  ErrorDetails2[\"SUBTITLE_LOAD_ERROR\"] = \"subtitleTrackLoadError\";\n  ErrorDetails2[\"SUBTITLE_TRACK_LOAD_TIMEOUT\"] = \"subtitleTrackLoadTimeOut\";\n  ErrorDetails2[\"FRAG_LOAD_ERROR\"] = \"fragLoadError\";\n  ErrorDetails2[\"FRAG_LOAD_TIMEOUT\"] = \"fragLoadTimeOut\";\n  ErrorDetails2[\"FRAG_DECRYPT_ERROR\"] = \"fragDecryptError\";\n  ErrorDetails2[\"FRAG_PARSING_ERROR\"] = \"fragParsingError\";\n  ErrorDetails2[\"FRAG_GAP\"] = \"fragGap\";\n  ErrorDetails2[\"REMUX_ALLOC_ERROR\"] = \"remuxAllocError\";\n  ErrorDetails2[\"KEY_LOAD_ERROR\"] = \"keyLoadError\";\n  ErrorDetails2[\"KEY_LOAD_TIMEOUT\"] = \"keyLoadTimeOut\";\n  ErrorDetails2[\"BUFFER_ADD_CODEC_ERROR\"] = \"bufferAddCodecError\";\n  ErrorDetails2[\"BUFFER_INCOMPATIBLE_CODECS_ERROR\"] = \"bufferIncompatibleCodecsError\";\n  ErrorDetails2[\"BUFFER_APPEND_ERROR\"] = \"bufferAppendError\";\n  ErrorDetails2[\"BUFFER_APPENDING_ERROR\"] = \"bufferAppendingError\";\n  ErrorDetails2[\"BUFFER_STALLED_ERROR\"] = \"bufferStalledError\";\n  ErrorDetails2[\"BUFFER_FULL_ERROR\"] = \"bufferFullError\";\n  ErrorDetails2[\"BUFFER_SEEK_OVER_HOLE\"] = \"bufferSeekOverHole\";\n  ErrorDetails2[\"BUFFER_NUDGE_ON_STALL\"] = \"bufferNudgeOnStall\";\n  ErrorDetails2[\"INTERNAL_EXCEPTION\"] = \"internalException\";\n  ErrorDetails2[\"INTERNAL_ABORTED\"] = \"aborted\";\n  ErrorDetails2[\"UNKNOWN\"] = \"unknown\";\n  return ErrorDetails2;\n}({});\nconst noop = function noop2() {\n};\nconst fakeLogger = {\n  trace: noop,\n  debug: noop,\n  log: noop,\n  warn: noop,\n  info: noop,\n  error: noop\n};\nlet exportedLogger = fakeLogger;\nfunction consolePrintFn(type) {\n  const func = self.console[type];\n  if (func) {\n    return func.bind(self.console, `[${type}] >`);\n  }\n  return noop;\n}\nfunction exportLoggerFunctions(debugConfig, ...functions) {\n  functions.forEach(function(type) {\n    exportedLogger[type] = debugConfig[type] ? debugConfig[type].bind(debugConfig) : consolePrintFn(type);\n  });\n}\nfunction enableLogs(debugConfig, id) {\n  if (typeof console === \"object\" && debugConfig === true || typeof debugConfig === \"object\") {\n    exportLoggerFunctions(\n      debugConfig,\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    try {\n      exportedLogger.log(`Debug logs enabled for \"${id}\" in hls.js version ${\"1.5.7\"}`);\n    } catch (e) {\n      exportedLogger = fakeLogger;\n    }\n  } else {\n    exportedLogger = fakeLogger;\n  }\n}\nconst logger = exportedLogger;\nconst DECIMAL_RESOLUTION_REGEX = /^(\\d+)x(\\d+)$/;\nconst ATTR_LIST_REGEX = /(.+?)=(\".*?\"|.*?)(?:,|$)/g;\nclass AttrList {\n  constructor(attrs) {\n    if (typeof attrs === \"string\") {\n      attrs = AttrList.parseAttrList(attrs);\n    }\n    _extends(this, attrs);\n  }\n  get clientAttrs() {\n    return Object.keys(this).filter((attr) => attr.substring(0, 2) === \"X-\");\n  }\n  decimalInteger(attrName) {\n    const intValue = parseInt(this[attrName], 10);\n    if (intValue > Number.MAX_SAFE_INTEGER) {\n      return Infinity;\n    }\n    return intValue;\n  }\n  hexadecimalInteger(attrName) {\n    if (this[attrName]) {\n      let stringValue = (this[attrName] || \"0x\").slice(2);\n      stringValue = (stringValue.length & 1 ? \"0\" : \"\") + stringValue;\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      return value;\n    } else {\n      return null;\n    }\n  }\n  hexadecimalIntegerAsNumber(attrName) {\n    const intValue = parseInt(this[attrName], 16);\n    if (intValue > Number.MAX_SAFE_INTEGER) {\n      return Infinity;\n    }\n    return intValue;\n  }\n  decimalFloatingPoint(attrName) {\n    return parseFloat(this[attrName]);\n  }\n  optionalFloat(attrName, defaultValue) {\n    const value = this[attrName];\n    return value ? parseFloat(value) : defaultValue;\n  }\n  enumeratedString(attrName) {\n    return this[attrName];\n  }\n  bool(attrName) {\n    return this[attrName] === \"YES\";\n  }\n  decimalResolution(attrName) {\n    const res = DECIMAL_RESOLUTION_REGEX.exec(this[attrName]);\n    if (res === null) {\n      return void 0;\n    }\n    return {\n      width: parseInt(res[1], 10),\n      height: parseInt(res[2], 10)\n    };\n  }\n  static parseAttrList(input) {\n    let match;\n    const attrs = {};\n    const quote = '\"';\n    ATTR_LIST_REGEX.lastIndex = 0;\n    while ((match = ATTR_LIST_REGEX.exec(input)) !== null) {\n      let value = match[2];\n      if (value.indexOf(quote) === 0 && value.lastIndexOf(quote) === value.length - 1) {\n        value = value.slice(1, -1);\n      }\n      const name = match[1].trim();\n      attrs[name] = value;\n    }\n    return attrs;\n  }\n}\nfunction isDateRangeCueAttribute(attrName) {\n  return attrName !== \"ID\" && attrName !== \"CLASS\" && attrName !== \"START-DATE\" && attrName !== \"DURATION\" && attrName !== \"END-DATE\" && attrName !== \"END-ON-NEXT\";\n}\nfunction isSCTE35Attribute(attrName) {\n  return attrName === \"SCTE35-OUT\" || attrName === \"SCTE35-IN\";\n}\nclass DateRange {\n  constructor(dateRangeAttr, dateRangeWithSameId) {\n    this.attr = void 0;\n    this._startDate = void 0;\n    this._endDate = void 0;\n    this._badValueForSameId = void 0;\n    if (dateRangeWithSameId) {\n      const previousAttr = dateRangeWithSameId.attr;\n      for (const key in previousAttr) {\n        if (Object.prototype.hasOwnProperty.call(dateRangeAttr, key) && dateRangeAttr[key] !== previousAttr[key]) {\n          logger.warn(`DATERANGE tag attribute: \"${key}\" does not match for tags with ID: \"${dateRangeAttr.ID}\"`);\n          this._badValueForSameId = key;\n          break;\n        }\n      }\n      dateRangeAttr = _extends(new AttrList({}), previousAttr, dateRangeAttr);\n    }\n    this.attr = dateRangeAttr;\n    this._startDate = new Date(dateRangeAttr[\"START-DATE\"]);\n    if (\"END-DATE\" in this.attr) {\n      const endDate = new Date(this.attr[\"END-DATE\"]);\n      if (isFiniteNumber(endDate.getTime())) {\n        this._endDate = endDate;\n      }\n    }\n  }\n  get id() {\n    return this.attr.ID;\n  }\n  get class() {\n    return this.attr.CLASS;\n  }\n  get startDate() {\n    return this._startDate;\n  }\n  get endDate() {\n    if (this._endDate) {\n      return this._endDate;\n    }\n    const duration = this.duration;\n    if (duration !== null) {\n      return new Date(this._startDate.getTime() + duration * 1e3);\n    }\n    return null;\n  }\n  get duration() {\n    if (\"DURATION\" in this.attr) {\n      const duration = this.attr.decimalFloatingPoint(\"DURATION\");\n      if (isFiniteNumber(duration)) {\n        return duration;\n      }\n    } else if (this._endDate) {\n      return (this._endDate.getTime() - this._startDate.getTime()) / 1e3;\n    }\n    return null;\n  }\n  get plannedDuration() {\n    if (\"PLANNED-DURATION\" in this.attr) {\n      return this.attr.decimalFloatingPoint(\"PLANNED-DURATION\");\n    }\n    return null;\n  }\n  get endOnNext() {\n    return this.attr.bool(\"END-ON-NEXT\");\n  }\n  get isValid() {\n    return !!this.id && !this._badValueForSameId && isFiniteNumber(this.startDate.getTime()) && (this.duration === null || this.duration >= 0) && (!this.endOnNext || !!this.class);\n  }\n}\nclass LoadStats {\n  constructor() {\n    this.aborted = false;\n    this.loaded = 0;\n    this.retry = 0;\n    this.total = 0;\n    this.chunkCount = 0;\n    this.bwEstimate = 0;\n    this.loading = {\n      start: 0,\n      first: 0,\n      end: 0\n    };\n    this.parsing = {\n      start: 0,\n      end: 0\n    };\n    this.buffering = {\n      start: 0,\n      first: 0,\n      end: 0\n    };\n  }\n}\nvar ElementaryStreamTypes = {\n  AUDIO: \"audio\",\n  VIDEO: \"video\",\n  AUDIOVIDEO: \"audiovideo\"\n};\nclass BaseSegment {\n  constructor(baseurl) {\n    this._byteRange = null;\n    this._url = null;\n    this.baseurl = void 0;\n    this.relurl = void 0;\n    this.elementaryStreams = {\n      [ElementaryStreamTypes.AUDIO]: null,\n      [ElementaryStreamTypes.VIDEO]: null,\n      [ElementaryStreamTypes.AUDIOVIDEO]: null\n    };\n    this.baseurl = baseurl;\n  }\n  // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array\n  setByteRange(value, previous) {\n    const params = value.split(\"@\", 2);\n    let start;\n    if (params.length === 1) {\n      start = (previous == null ? void 0 : previous.byteRangeEndOffset) || 0;\n    } else {\n      start = parseInt(params[1]);\n    }\n    this._byteRange = [start, parseInt(params[0]) + start];\n  }\n  get byteRange() {\n    if (!this._byteRange) {\n      return [];\n    }\n    return this._byteRange;\n  }\n  get byteRangeStartOffset() {\n    return this.byteRange[0];\n  }\n  get byteRangeEndOffset() {\n    return this.byteRange[1];\n  }\n  get url() {\n    if (!this._url && this.baseurl && this.relurl) {\n      this._url = urlToolkitExports.buildAbsoluteURL(this.baseurl, this.relurl, {\n        alwaysNormalize: true\n      });\n    }\n    return this._url || \"\";\n  }\n  set url(value) {\n    this._url = value;\n  }\n}\nclass Fragment extends BaseSegment {\n  constructor(type, baseurl) {\n    super(baseurl);\n    this._decryptdata = null;\n    this.rawProgramDateTime = null;\n    this.programDateTime = null;\n    this.tagList = [];\n    this.duration = 0;\n    this.sn = 0;\n    this.levelkeys = void 0;\n    this.type = void 0;\n    this.loader = null;\n    this.keyLoader = null;\n    this.level = -1;\n    this.cc = 0;\n    this.startPTS = void 0;\n    this.endPTS = void 0;\n    this.startDTS = void 0;\n    this.endDTS = void 0;\n    this.start = 0;\n    this.deltaPTS = void 0;\n    this.maxStartPTS = void 0;\n    this.minEndPTS = void 0;\n    this.stats = new LoadStats();\n    this.data = void 0;\n    this.bitrateTest = false;\n    this.title = null;\n    this.initSegment = null;\n    this.endList = void 0;\n    this.gap = void 0;\n    this.urlId = 0;\n    this.type = type;\n  }\n  get decryptdata() {\n    const {\n      levelkeys\n    } = this;\n    if (!levelkeys && !this._decryptdata) {\n      return null;\n    }\n    if (!this._decryptdata && this.levelkeys && !this.levelkeys.NONE) {\n      const key = this.levelkeys.identity;\n      if (key) {\n        this._decryptdata = key.getDecryptData(this.sn);\n      } else {\n        const keyFormats = Object.keys(this.levelkeys);\n        if (keyFormats.length === 1) {\n          return this._decryptdata = this.levelkeys[keyFormats[0]].getDecryptData(this.sn);\n        }\n      }\n    }\n    return this._decryptdata;\n  }\n  get end() {\n    return this.start + this.duration;\n  }\n  get endProgramDateTime() {\n    if (this.programDateTime === null) {\n      return null;\n    }\n    if (!isFiniteNumber(this.programDateTime)) {\n      return null;\n    }\n    const duration = !isFiniteNumber(this.duration) ? 0 : this.duration;\n    return this.programDateTime + duration * 1e3;\n  }\n  get encrypted() {\n    var _this$_decryptdata;\n    if ((_this$_decryptdata = this._decryptdata) != null && _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  setKeyFormat(keyFormat) {\n    if (this.levelkeys) {\n      const key = this.levelkeys[keyFormat];\n      if (key && !this._decryptdata) {\n        this._decryptdata = key.getDecryptData(this.sn);\n      }\n    }\n  }\n  abortRequests() {\n    var _this$loader, _this$keyLoader;\n    (_this$loader = this.loader) == null ? void 0 : _this$loader.abort();\n    (_this$keyLoader = this.keyLoader) == null ? void 0 : _this$keyLoader.abort();\n  }\n  setElementaryStreamInfo(type, startPTS, endPTS, startDTS, endDTS, partial = false) {\n    const {\n      elementaryStreams\n    } = 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    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  clearElementaryStreamInfo() {\n    const {\n      elementaryStreams\n    } = this;\n    elementaryStreams[ElementaryStreamTypes.AUDIO] = null;\n    elementaryStreams[ElementaryStreamTypes.VIDEO] = null;\n    elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;\n  }\n}\nclass Part extends BaseSegment {\n  constructor(partAttrs, frag, baseurl, index, previous) {\n    super(baseurl);\n    this.fragOffset = 0;\n    this.duration = 0;\n    this.gap = false;\n    this.independent = false;\n    this.relurl = void 0;\n    this.fragment = void 0;\n    this.index = void 0;\n    this.stats = new LoadStats();\n    this.duration = partAttrs.decimalFloatingPoint(\"DURATION\");\n    this.gap = partAttrs.bool(\"GAP\");\n    this.independent = partAttrs.bool(\"INDEPENDENT\");\n    this.relurl = partAttrs.enumeratedString(\"URI\");\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  get start() {\n    return this.fragment.start + this.fragOffset;\n  }\n  get end() {\n    return this.start + this.duration;\n  }\n  get loaded() {\n    const {\n      elementaryStreams\n    } = this;\n    return !!(elementaryStreams.audio || elementaryStreams.video || elementaryStreams.audiovideo);\n  }\n}\nconst DEFAULT_TARGET_DURATION = 10;\nclass LevelDetails {\n  constructor(baseUrl) {\n    this.PTSKnown = false;\n    this.alignedSliding = false;\n    this.averagetargetduration = void 0;\n    this.endCC = 0;\n    this.endSN = 0;\n    this.fragments = void 0;\n    this.fragmentHint = void 0;\n    this.partList = null;\n    this.dateRanges = void 0;\n    this.live = true;\n    this.ageHeader = 0;\n    this.advancedDateTime = void 0;\n    this.updated = true;\n    this.advanced = true;\n    this.availabilityDelay = void 0;\n    this.misses = 0;\n    this.startCC = 0;\n    this.startSN = 0;\n    this.startTimeOffset = null;\n    this.targetduration = 0;\n    this.totalduration = 0;\n    this.type = null;\n    this.url = void 0;\n    this.m3u8 = \"\";\n    this.version = null;\n    this.canBlockReload = false;\n    this.canSkipUntil = 0;\n    this.canSkipDateRanges = false;\n    this.skippedSegments = 0;\n    this.recentlyRemovedDateranges = void 0;\n    this.partHoldBack = 0;\n    this.holdBack = 0;\n    this.partTarget = 0;\n    this.preloadHint = void 0;\n    this.renditionReports = void 0;\n    this.tuneInGoal = 0;\n    this.deltaUpdateFailed = void 0;\n    this.driftStartTime = 0;\n    this.driftEndTime = 0;\n    this.driftStart = 0;\n    this.driftEnd = 0;\n    this.encryptedFragments = void 0;\n    this.playlistParsingError = null;\n    this.variableList = null;\n    this.hasVariableRefs = false;\n    this.fragments = [];\n    this.encryptedFragments = [];\n    this.dateRanges = {};\n    this.url = baseUrl;\n  }\n  reloaded(previous) {\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 = this.endSN !== previous.endSN || !!partIndexDiff || !!partSnDiff || !this.live;\n    this.advanced = this.endSN > previous.endSN || partSnDiff > 0 || 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    this.availabilityDelay = previous.availabilityDelay;\n  }\n  get hasProgramDateTime() {\n    if (this.fragments.length) {\n      return isFiniteNumber(this.fragments[this.fragments.length - 1].programDateTime);\n    }\n    return false;\n  }\n  get levelTargetDuration() {\n    return this.averagetargetduration || this.targetduration || DEFAULT_TARGET_DURATION;\n  }\n  get drift() {\n    const runTime = this.driftEndTime - this.driftStartTime;\n    if (runTime > 0) {\n      const runDuration = this.driftEnd - this.driftStart;\n      return runDuration * 1e3 / runTime;\n    }\n    return 1;\n  }\n  get edge() {\n    return this.partEnd || this.fragmentEnd;\n  }\n  get partEnd() {\n    var _this$partList;\n    if ((_this$partList = this.partList) != null && _this$partList.length) {\n      return this.partList[this.partList.length - 1].end;\n    }\n    return this.fragmentEnd;\n  }\n  get fragmentEnd() {\n    var _this$fragments;\n    if ((_this$fragments = this.fragments) != null && _this$fragments.length) {\n      return this.fragments[this.fragments.length - 1].end;\n    }\n    return 0;\n  }\n  get age() {\n    if (this.advancedDateTime) {\n      return Math.max(Date.now() - this.advancedDateTime, 0) / 1e3;\n    }\n    return 0;\n  }\n  get lastPartIndex() {\n    var _this$partList2;\n    if ((_this$partList2 = this.partList) != null && _this$partList2.length) {\n      return this.partList[this.partList.length - 1].index;\n    }\n    return -1;\n  }\n  get lastPartSn() {\n    var _this$partList3;\n    if ((_this$partList3 = this.partList) != null && _this$partList3.length) {\n      return this.partList[this.partList.length - 1].fragment.sn;\n    }\n    return this.endSN;\n  }\n}\nfunction base64Decode(base64encodedStr) {\n  return Uint8Array.from(atob(base64encodedStr), (c) => c.charCodeAt(0));\n}\nfunction getKeyIdBytes(str) {\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}\nfunction changeEndianness(keyId) {\n  const swap = function swap2(array, from, to) {\n    const cur = array[from];\n    array[from] = array[to];\n    array[to] = cur;\n  };\n  swap(keyId, 0, 3);\n  swap(keyId, 1, 2);\n  swap(keyId, 4, 5);\n  swap(keyId, 6, 7);\n}\nfunction convertDataUriToArrayBytes(uri) {\n  const colonsplit = uri.split(\":\");\n  let keydata = 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);\n        keydata = base64Decode(data);\n      } else {\n        keydata = getKeyIdBytes(data);\n      }\n    }\n  }\n  return keydata;\n}\nfunction strToUtf8array(str) {\n  return Uint8Array.from(unescape(encodeURIComponent(str)), (c) => c.charCodeAt(0));\n}\nconst optionalSelf = typeof self !== \"undefined\" ? self : void 0;\nvar KeySystems = {\n  CLEARKEY: \"org.w3.clearkey\",\n  FAIRPLAY: \"com.apple.fps\",\n  PLAYREADY: \"com.microsoft.playready\",\n  WIDEVINE: \"com.widevine.alpha\"\n};\nvar 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};\nfunction keySystemFormatToKeySystemDomain(format2) {\n  switch (format2) {\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}\nvar KeySystemIds = {\n  WIDEVINE: \"edef8ba979d64acea3c827dcd51d21ed\"\n};\nfunction keySystemIdToKeySystemDomain(systemId) {\n  if (systemId === KeySystemIds.WIDEVINE) {\n    return KeySystems.WIDEVINE;\n  }\n}\nfunction keySystemDomainToKeySystemFormat(keySystem) {\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}\nfunction getKeySystemsForConfig(config) {\n  const {\n    drmSystems,\n    widevineLicenseUrl\n  } = config;\n  const keySystemsToAttempt = drmSystems ? [KeySystems.FAIRPLAY, KeySystems.WIDEVINE, KeySystems.PLAYREADY, KeySystems.CLEARKEY].filter((keySystem) => !!drmSystems[keySystem]) : [];\n  if (!keySystemsToAttempt[KeySystems.WIDEVINE] && widevineLicenseUrl) {\n    keySystemsToAttempt.push(KeySystems.WIDEVINE);\n  }\n  return keySystemsToAttempt;\n}\nconst requestMediaKeySystemAccess = function(_optionalSelf$navigat) {\n  if (optionalSelf != null && (_optionalSelf$navigat = optionalSelf.navigator) != null && _optionalSelf$navigat.requestMediaKeySystemAccess) {\n    return self.navigator.requestMediaKeySystemAccess.bind(self.navigator);\n  } else {\n    return null;\n  }\n}();\nfunction getSupportedMediaKeySystemConfigurations(keySystem, audioCodecs, videoCodecs, drmSystemOptions) {\n  let initDataTypes;\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(initDataTypes, audioCodecs, videoCodecs, drmSystemOptions);\n}\nfunction createMediaKeySystemConfigurations(initDataTypes, audioCodecs, videoCodecs, drmSystemOptions) {\n  const baseConfig = {\n    initDataTypes,\n    persistentState: drmSystemOptions.persistentState || \"optional\",\n    distinctiveIdentifier: drmSystemOptions.distinctiveIdentifier || \"optional\",\n    sessionTypes: drmSystemOptions.sessionTypes || [drmSystemOptions.sessionType || \"temporary\"],\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  return [baseConfig];\n}\nfunction sliceUint8(array, start, end) {\n  return Uint8Array.prototype.slice ? array.slice(start, end) : new Uint8Array(Array.prototype.slice.call(array, start, end));\n}\nconst isHeader$2 = (data, offset) => {\n  if (offset + 10 <= data.length) {\n    if (data[offset] === 73 && data[offset + 1] === 68 && data[offset + 2] === 51) {\n      if (data[offset + 3] < 255 && data[offset + 4] < 255) {\n        if (data[offset + 6] < 128 && data[offset + 7] < 128 && data[offset + 8] < 128 && data[offset + 9] < 128) {\n          return true;\n        }\n      }\n    }\n  }\n  return false;\n};\nconst isFooter = (data, offset) => {\n  if (offset + 10 <= data.length) {\n    if (data[offset] === 51 && data[offset + 1] === 68 && data[offset + 2] === 73) {\n      if (data[offset + 3] < 255 && data[offset + 4] < 255) {\n        if (data[offset + 6] < 128 && data[offset + 7] < 128 && data[offset + 8] < 128 && data[offset + 9] < 128) {\n          return true;\n        }\n      }\n    }\n  }\n  return false;\n};\nconst getID3Data = (data, offset) => {\n  const front = offset;\n  let length = 0;\n  while (isHeader$2(data, offset)) {\n    length += 10;\n    const size = readSize(data, offset + 6);\n    length += size;\n    if (isFooter(data, offset + 10)) {\n      length += 10;\n    }\n    offset += length;\n  }\n  if (length > 0) {\n    return data.subarray(front, front + length);\n  }\n  return void 0;\n};\nconst readSize = (data, offset) => {\n  let size = 0;\n  size = (data[offset] & 127) << 21;\n  size |= (data[offset + 1] & 127) << 14;\n  size |= (data[offset + 2] & 127) << 7;\n  size |= data[offset + 3] & 127;\n  return size;\n};\nconst canParse$2 = (data, offset) => {\n  return isHeader$2(data, offset) && readSize(data, offset + 6) + 10 <= data.length - offset;\n};\nconst getTimeStamp = (data) => {\n  const frames = getID3Frames(data);\n  for (let i = 0; i < frames.length; i++) {\n    const frame = frames[i];\n    if (isTimeStampFrame(frame)) {\n      return readTimeStamp(frame);\n    }\n  }\n  return void 0;\n};\nconst isTimeStampFrame = (frame) => {\n  return frame && frame.key === \"PRIV\" && frame.info === \"com.apple.streaming.transportStreamTimestamp\";\n};\nconst getFrameData = (data) => {\n  const type = String.fromCharCode(data[0], data[1], data[2], data[3]);\n  const size = readSize(data, 4);\n  const offset = 10;\n  return {\n    type,\n    size,\n    data: data.subarray(offset, offset + size)\n  };\n};\nconst getID3Frames = (id3Data) => {\n  let offset = 0;\n  const frames = [];\n  while (isHeader$2(id3Data, offset)) {\n    const size = readSize(id3Data, offset + 6);\n    offset += 10;\n    const end = offset + size;\n    while (offset + 8 < end) {\n      const frameData = getFrameData(id3Data.subarray(offset));\n      const frame = decodeFrame(frameData);\n      if (frame) {\n        frames.push(frame);\n      }\n      offset += frameData.size + 10;\n    }\n    if (isFooter(id3Data, offset)) {\n      offset += 10;\n    }\n  }\n  return frames;\n};\nconst decodeFrame = (frame) => {\n  if (frame.type === \"PRIV\") {\n    return decodePrivFrame(frame);\n  } else if (frame.type[0] === \"W\") {\n    return decodeURLFrame(frame);\n  }\n  return decodeTextFrame(frame);\n};\nconst decodePrivFrame = (frame) => {\n  if (frame.size < 2) {\n    return void 0;\n  }\n  const owner = utf8ArrayToStr(frame.data, true);\n  const privateData = new Uint8Array(frame.data.subarray(owner.length + 1));\n  return {\n    key: frame.type,\n    info: owner,\n    data: privateData.buffer\n  };\n};\nconst decodeTextFrame = (frame) => {\n  if (frame.size < 2) {\n    return void 0;\n  }\n  if (frame.type === \"TXXX\") {\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 {\n      key: frame.type,\n      info: description,\n      data: value\n    };\n  }\n  const text = utf8ArrayToStr(frame.data.subarray(1));\n  return {\n    key: frame.type,\n    data: text\n  };\n};\nconst decodeURLFrame = (frame) => {\n  if (frame.type === \"WXXX\") {\n    if (frame.size < 2) {\n      return void 0;\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 {\n      key: frame.type,\n      info: description,\n      data: value\n    };\n  }\n  const url = utf8ArrayToStr(frame.data);\n  return {\n    key: frame.type,\n    data: url\n  };\n};\nconst readTimeStamp = (timeStampFrame) => {\n  if (timeStampFrame.data.byteLength === 8) {\n    const data = new Uint8Array(timeStampFrame.data);\n    const pts33Bit = data[3] & 1;\n    let timestamp = (data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7];\n    timestamp /= 45;\n    if (pts33Bit) {\n      timestamp += 4772185884e-2;\n    }\n    return Math.round(timestamp);\n  }\n  return void 0;\n};\nconst utf8ArrayToStr = (array, exitOnNull = false) => {\n  const decoder2 = getTextDecoder();\n  if (decoder2) {\n    const decoded = decoder2.decode(array);\n    if (exitOnNull) {\n      const idx = decoded.indexOf(\"\\0\");\n      return idx !== -1 ? decoded.substring(0, idx) : decoded;\n    }\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 === 0 && exitOnNull) {\n      return out;\n    } else if (c === 0 || c === 3) {\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        out += String.fromCharCode(c);\n        break;\n      case 12:\n      case 13:\n        char2 = array[i++];\n        out += String.fromCharCode((c & 31) << 6 | char2 & 63);\n        break;\n      case 14:\n        char2 = array[i++];\n        char3 = array[i++];\n        out += String.fromCharCode((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0);\n        break;\n    }\n  }\n  return out;\n};\nlet decoder;\nfunction getTextDecoder() {\n  if (navigator.userAgent.includes(\"PlayStation 4\")) {\n    return;\n  }\n  if (!decoder && typeof self.TextDecoder !== \"undefined\") {\n    decoder = new self.TextDecoder(\"utf-8\");\n  }\n  return decoder;\n}\nconst Hex = {\n  hexDump: function(array) {\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      str += h;\n    }\n    return str;\n  }\n};\nconst UINT32_MAX$1 = Math.pow(2, 32) - 1;\nconst push = [].push;\nconst RemuxerTrackIdConfig = {\n  video: 1,\n  audio: 2,\n  id3: 3,\n  text: 4\n};\nfunction bin2str(data) {\n  return String.fromCharCode.apply(null, data);\n}\nfunction readUint16(buffer, offset) {\n  const val = buffer[offset] << 8 | buffer[offset + 1];\n  return val < 0 ? 65536 + val : val;\n}\nfunction readUint32(buffer, offset) {\n  const val = readSint32(buffer, offset);\n  return val < 0 ? 4294967296 + val : val;\n}\nfunction readUint64(buffer, offset) {\n  let result = readUint32(buffer, offset);\n  result *= Math.pow(2, 32);\n  result += readUint32(buffer, offset + 4);\n  return result;\n}\nfunction readSint32(buffer, offset) {\n  return buffer[offset] << 24 | buffer[offset + 1] << 16 | buffer[offset + 2] << 8 | buffer[offset + 3];\n}\nfunction writeUint32(buffer, offset, value) {\n  buffer[offset] = value >> 24;\n  buffer[offset + 1] = value >> 16 & 255;\n  buffer[offset + 2] = value >> 8 & 255;\n  buffer[offset + 3] = value & 255;\n}\nfunction hasMoofData(data) {\n  const end = data.byteLength;\n  for (let i = 0; i < end; ) {\n    const size = readUint32(data, i);\n    if (size > 8 && data[i + 4] === 109 && data[i + 5] === 111 && data[i + 6] === 111 && data[i + 7] === 102) {\n      return true;\n    }\n    i = size > 1 ? i + size : end;\n  }\n  return false;\n}\nfunction findBox(data, path) {\n  const results = [];\n  if (!path.length) {\n    return results;\n  }\n  const end = data.byteLength;\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        results.push(data.subarray(i + 8, endbox));\n      } else {\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  return results;\n}\nfunction parseSegmentIndex(sidx) {\n  const references = [];\n  const version = sidx[0];\n  let index = 8;\n  const timescale = readUint32(sidx, index);\n  index += 4;\n  let earliestPresentationTime = 0;\n  let firstOffset = 0;\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  index += 2;\n  let startByte = sidx.length + firstOffset;\n  const referencesCount = readUint16(sidx, index);\n  index += 2;\n  for (let i = 0; i < referencesCount; i++) {\n    let referenceIndex = index;\n    const referenceInfo = readUint32(sidx, referenceIndex);\n    referenceIndex += 4;\n    const referenceSize = referenceInfo & 2147483647;\n    const referenceType = (referenceInfo & 2147483648) >>> 31;\n    if (referenceType === 1) {\n      logger.warn(\"SIDX has hierarchical references (not supported)\");\n      return null;\n    }\n    const subsegmentDuration = readUint32(sidx, referenceIndex);\n    referenceIndex += 4;\n    references.push({\n      referenceSize,\n      subsegmentDuration,\n      // unscaled\n      info: {\n        duration: subsegmentDuration / timescale,\n        start: startByte,\n        end: startByte + referenceSize - 1\n      }\n    });\n    startByte += referenceSize;\n    referenceIndex += 4;\n    index = referenceIndex;\n  }\n  return {\n    earliestPresentationTime,\n    timescale,\n    version,\n    referencesCount,\n    references\n  };\n}\nfunction parseInitSegment(initSegment) {\n  const result = [];\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) {\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) {\n        version = mdhd[0];\n        const timescale = readUint32(mdhd, version === 0 ? 12 : 20);\n        const hdlr = findBox(trak, [\"mdia\", \"hdlr\"])[0];\n        if (hdlr) {\n          const hdlrType = bin2str(hdlr.subarray(8, 12));\n          const type = {\n            soun: ElementaryStreamTypes.AUDIO,\n            vide: ElementaryStreamTypes.VIDEO\n          }[hdlrType];\n          if (type) {\n            const stsd = findBox(trak, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0];\n            const stsdData = parseStsd(stsd);\n            result[trackId] = {\n              timescale,\n              type\n            };\n            result[type] = _objectSpread2({\n              timescale,\n              id: trackId\n            }, stsdData);\n          }\n        }\n      }\n    }\n  }\n  const trex = findBox(initSegment, [\"moov\", \"mvex\", \"trex\"]);\n  trex.forEach((trex2) => {\n    const trackId = readUint32(trex2, 4);\n    const track = result[trackId];\n    if (track) {\n      track.default = {\n        duration: readUint32(trex2, 12),\n        flags: readUint32(trex2, 20)\n      };\n    }\n  });\n  return result;\n}\nfunction parseStsd(stsd) {\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  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) {\n        const scheme = bin2str(schm.subarray(4, 8));\n        if (scheme === \"cbcs\" || scheme === \"cenc\") {\n          const frma = findBox(sinf, [\"frma\"])[0];\n          if (frma) {\n            codec = bin2str(frma);\n          }\n        }\n      }\n    });\n  }\n  switch (codec) {\n    case \"avc1\":\n    case \"avc2\":\n    case \"avc3\":\n    case \"avc4\": {\n      const avcCBox = findBox(sampleEntriesEnd, [\"avcC\"])[0];\n      codec += \".\" + toHex(avcCBox[1]) + toHex(avcCBox[2]) + toHex(avcCBox[3]);\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 && esdsBox.length > 12) {\n        let i = 4;\n        if (esdsBox[i++] !== 3) {\n          break;\n        }\n        i = skipBERInteger(esdsBox, i);\n        i += 2;\n        const flags = esdsBox[i++];\n        if (flags & 128) {\n          i += 2;\n        }\n        if (flags & 64) {\n          i += esdsBox[i++];\n        }\n        if (esdsBox[i++] !== 4) {\n          break;\n        }\n        i = skipBERInteger(esdsBox, i);\n        const objectType = esdsBox[i++];\n        if (objectType === 64) {\n          codec += \".\" + toHex(objectType);\n        } else {\n          break;\n        }\n        i += 12;\n        if (esdsBox[i++] !== 5) {\n          break;\n        }\n        i = skipBERInteger(esdsBox, i);\n        const firstByte = esdsBox[i++];\n        let audioObjectType = (firstByte & 248) >> 3;\n        if (audioObjectType === 31) {\n          audioObjectType += 1 + ((firstByte & 7) << 3) + ((esdsBox[i] & 224) >> 5);\n        }\n        codec += \".\" + audioObjectType;\n      }\n      break;\n    }\n    case \"hvc1\":\n    case \"hev1\": {\n      const hvcCBox = findBox(sampleEntriesEnd, [\"hvcC\"])[0];\n      const profileByte = hvcCBox[1];\n      const profileSpace = [\"\", \"A\", \"B\", \"C\"][profileByte >> 6];\n      const generalProfileIdc = profileByte & 31;\n      const profileCompat = readUint32(hvcCBox, 2);\n      const tierFlag = (profileByte & 32) >> 5 ? \"H\" : \"L\";\n      const levelIDC = hvcCBox[12];\n      const constraintIndicator = hvcCBox.subarray(6, 12);\n      codec += \".\" + profileSpace + generalProfileIdc;\n      codec += \".\" + 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      break;\n    }\n    case \"dvh1\":\n    case \"dvhe\": {\n      const dvcCBox = findBox(sampleEntriesEnd, [\"dvcC\"])[0];\n      const profile = dvcCBox[2] >> 1 & 127;\n      const level = dvcCBox[2] << 5 & 32 | dvcCBox[3] >> 3 & 31;\n      codec += \".\" + addLeadingZero(profile) + \".\" + addLeadingZero(level);\n      break;\n    }\n    case \"vp09\": {\n      const vpcCBox = findBox(sampleEntriesEnd, [\"vpcC\"])[0];\n      const profile = vpcCBox[4];\n      const level = vpcCBox[5];\n      const bitDepth = vpcCBox[6] >> 4 & 15;\n      codec += \".\" + addLeadingZero(profile) + \".\" + addLeadingZero(level) + \".\" + addLeadingZero(bitDepth);\n      break;\n    }\n    case \"av01\": {\n      const av1CBox = findBox(sampleEntriesEnd, [\"av1C\"])[0];\n      const profile = av1CBox[1] >>> 5;\n      const level = av1CBox[1] & 31;\n      const tierFlag = av1CBox[2] >>> 7 ? \"H\" : \"M\";\n      const highBitDepth = (av1CBox[2] & 64) >> 6;\n      const twelveBit = (av1CBox[2] & 32) >> 5;\n      const bitDepth = profile === 2 && highBitDepth ? twelveBit ? 12 : 10 : highBitDepth ? 10 : 8;\n      const monochrome = (av1CBox[2] & 16) >> 4;\n      const chromaSubsamplingX = (av1CBox[2] & 8) >> 3;\n      const chromaSubsamplingY = (av1CBox[2] & 4) >> 2;\n      const chromaSamplePosition = av1CBox[2] & 3;\n      const colorPrimaries = 1;\n      const transferCharacteristics = 1;\n      const matrixCoefficients = 1;\n      const videoFullRangeFlag = 0;\n      codec += \".\" + profile + \".\" + addLeadingZero(level) + tierFlag + \".\" + addLeadingZero(bitDepth) + \".\" + monochrome + \".\" + chromaSubsamplingX + chromaSubsamplingY + chromaSamplePosition + \".\" + addLeadingZero(colorPrimaries) + \".\" + addLeadingZero(transferCharacteristics) + \".\" + addLeadingZero(matrixCoefficients) + \".\" + videoFullRangeFlag;\n      break;\n    }\n  }\n  return {\n    codec,\n    encrypted\n  };\n}\nfunction skipBERInteger(bytes, i) {\n  const limit = i + 5;\n  while (bytes[i++] & 128 && i < limit) {\n  }\n  return i;\n}\nfunction toHex(x) {\n  return (\"0\" + x.toString(16).toUpperCase()).slice(-2);\n}\nfunction addLeadingZero(num) {\n  return (num < 10 ? \"0\" : \"\") + num;\n}\nfunction patchEncyptionData(initSegment, decryptdata) {\n  if (!initSegment || !decryptdata) {\n    return initSegment;\n  }\n  const keyId = decryptdata.keyId;\n  if (keyId && decryptdata.isCommonEncryption) {\n    const traks = findBox(initSegment, [\"moov\", \"trak\"]);\n    traks.forEach((trak) => {\n      const stsd = findBox(trak, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0];\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            const tencKeyId = tenc.subarray(8, 24);\n            if (!tencKeyId.some((b) => b !== 0)) {\n              logger.log(`[eme] Patching keyId in 'enc${isAudio ? \"a\" : \"v\"}>sinf>>tenc' box: ${Hex.hexDump(tencKeyId)} -> ${Hex.hexDump(keyId)}`);\n              tenc.set(keyId, 8);\n            }\n          }\n        });\n      });\n    });\n  }\n  return initSegment;\n}\nfunction parseSinf(sinf) {\n  const schm = findBox(sinf, [\"schm\"])[0];\n  if (schm) {\n    const scheme = bin2str(schm.subarray(4, 8));\n    if (scheme === \"cbcs\" || scheme === \"cenc\") {\n      return findBox(sinf, [\"schi\", \"tenc\"])[0];\n    }\n  }\n  logger.error(`[eme] missing 'schm' box`);\n  return null;\n}\nfunction getStartDTS(initData, fmp4) {\n  return findBox(fmp4, [\"moof\", \"traf\"]).reduce((result, traf) => {\n    const tfdt = findBox(traf, [\"tfdt\"])[0];\n    const version = tfdt[0];\n    const start = findBox(traf, [\"tfhd\"]).reduce((result2, tfhd) => {\n      const id = readUint32(tfhd, 4);\n      const track = initData[id];\n      if (track) {\n        let baseTime = readUint32(tfdt, 4);\n        if (version === 1) {\n          if (baseTime === UINT32_MAX$1) {\n            logger.warn(`[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time`);\n            return result2;\n          }\n          baseTime *= UINT32_MAX$1 + 1;\n          baseTime += readUint32(tfdt, 8);\n        }\n        const scale = track.timescale || 9e4;\n        const startTime = baseTime / scale;\n        if (isFiniteNumber(startTime) && (result2 === null || startTime < result2)) {\n          return startTime;\n        }\n      }\n      return result2;\n    }, null);\n    if (start !== null && isFiniteNumber(start) && (result === null || start < result)) {\n      return start;\n    }\n    return result;\n  }, null);\n}\nfunction getDuration(data, initData) {\n  let rawDuration = 0;\n  let videoDuration = 0;\n  let audioDuration = 0;\n  const trafs = findBox(data, [\"moof\", \"traf\"]);\n  for (let i = 0; i < trafs.length; i++) {\n    const traf = trafs[i];\n    const tfhd = findBox(traf, [\"tfhd\"])[0];\n    const id = readUint32(tfhd, 4);\n    const track = initData[id];\n    if (!track) {\n      continue;\n    }\n    const trackDefault = track.default;\n    const tfhdFlags = readUint32(tfhd, 0) | (trackDefault == null ? void 0 : trackDefault.flags);\n    let sampleDuration = trackDefault == null ? void 0 : trackDefault.duration;\n    if (tfhdFlags & 8) {\n      if (tfhdFlags & 2) {\n        sampleDuration = readUint32(tfhd, 12);\n      } else {\n        sampleDuration = readUint32(tfhd, 8);\n      }\n    }\n    const timescale = track.timescale || 9e4;\n    const truns = findBox(traf, [\"trun\"]);\n    for (let j = 0; j < truns.length; j++) {\n      rawDuration = computeRawDurationFromSamples(truns[j]);\n      if (!rawDuration && sampleDuration) {\n        const sampleCount = readUint32(truns[j], 4);\n        rawDuration = sampleDuration * sampleCount;\n      }\n      if (track.type === ElementaryStreamTypes.VIDEO) {\n        videoDuration += rawDuration / timescale;\n      } else if (track.type === ElementaryStreamTypes.AUDIO) {\n        audioDuration += rawDuration / timescale;\n      }\n    }\n  }\n  if (videoDuration === 0 && audioDuration === 0) {\n    let sidxMinStart = Infinity;\n    let sidxMaxEnd = 0;\n    let sidxDuration = 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 != null && sidx.references) {\n        sidxMinStart = Math.min(sidxMinStart, sidx.earliestPresentationTime / sidx.timescale);\n        const subSegmentDuration = sidx.references.reduce((dur, ref) => dur + ref.info.duration || 0, 0);\n        sidxMaxEnd = Math.max(sidxMaxEnd, subSegmentDuration + sidx.earliestPresentationTime / sidx.timescale);\n        sidxDuration = sidxMaxEnd - sidxMinStart;\n      }\n    }\n    if (sidxDuration && isFiniteNumber(sidxDuration)) {\n      return sidxDuration;\n    }\n  }\n  if (videoDuration) {\n    return videoDuration;\n  }\n  return audioDuration;\n}\nfunction computeRawDurationFromSamples(trun) {\n  const flags = readUint32(trun, 0);\n  let offset = 8;\n  if (flags & 1) {\n    offset += 4;\n  }\n  if (flags & 4) {\n    offset += 4;\n  }\n  let duration = 0;\n  const sampleCount = readUint32(trun, 4);\n  for (let i = 0; i < sampleCount; i++) {\n    if (flags & 256) {\n      const sampleDuration = readUint32(trun, offset);\n      duration += sampleDuration;\n      offset += 4;\n    }\n    if (flags & 512) {\n      offset += 4;\n    }\n    if (flags & 1024) {\n      offset += 4;\n    }\n    if (flags & 2048) {\n      offset += 4;\n    }\n  }\n  return duration;\n}\nfunction offsetStartDTS(initData, fmp4, timeOffset) {\n  findBox(fmp4, [\"moof\", \"traf\"]).forEach((traf) => {\n    findBox(traf, [\"tfhd\"]).forEach((tfhd) => {\n      const id = readUint32(tfhd, 4);\n      const track = initData[id];\n      if (!track) {\n        return;\n      }\n      const timescale = track.timescale || 9e4;\n      findBox(traf, [\"tfdt\"]).forEach((tfdt) => {\n        const version = tfdt[0];\n        const offset = timeOffset * timescale;\n        if (offset) {\n          let baseMediaDecodeTime = readUint32(tfdt, 4);\n          if (version === 0) {\n            baseMediaDecodeTime -= offset;\n            baseMediaDecodeTime = Math.max(baseMediaDecodeTime, 0);\n            writeUint32(tfdt, 4, baseMediaDecodeTime);\n          } else {\n            baseMediaDecodeTime *= Math.pow(2, 32);\n            baseMediaDecodeTime += readUint32(tfdt, 8);\n            baseMediaDecodeTime -= offset;\n            baseMediaDecodeTime = Math.max(baseMediaDecodeTime, 0);\n            const upper = Math.floor(baseMediaDecodeTime / (UINT32_MAX$1 + 1));\n            const lower = Math.floor(baseMediaDecodeTime % (UINT32_MAX$1 + 1));\n            writeUint32(tfdt, 4, upper);\n            writeUint32(tfdt, 8, lower);\n          }\n        }\n      });\n    });\n  });\n}\nfunction segmentValidRange(data) {\n  const segmentedRange = {\n    valid: null,\n    remainder: null\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  segmentedRange.valid = sliceUint8(data, 0, last.byteOffset - 8);\n  segmentedRange.remainder = sliceUint8(data, last.byteOffset - 8);\n  return segmentedRange;\n}\nfunction appendUint8Array(data1, data2) {\n  const temp = new Uint8Array(data1.length + data2.length);\n  temp.set(data1);\n  temp.set(data2, data1.length);\n  return temp;\n}\nfunction parseSamples(timeOffset, track) {\n  const seiSamples = [];\n  const videoData = track.samples;\n  const timescale = track.timescale;\n  const trackId = track.id;\n  let isHEVCFlavor = false;\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      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      if (baseTime !== void 0) {\n        timeOffset = baseTime;\n      }\n      return findBox(traf, [\"tfhd\"]).map((tfhd) => {\n        const id = readUint32(tfhd, 4);\n        const tfhdFlags = readUint32(tfhd, 0) & 16777215;\n        const baseDataOffsetPresent = (tfhdFlags & 1) !== 0;\n        const sampleDescriptionIndexPresent = (tfhdFlags & 2) !== 0;\n        const defaultSampleDurationPresent = (tfhdFlags & 8) !== 0;\n        let defaultSampleDuration = 0;\n        const defaultSampleSizePresent = (tfhdFlags & 16) !== 0;\n        let defaultSampleSize = 0;\n        const defaultSampleFlagsPresent = (tfhdFlags & 32) !== 0;\n        let tfhdOffset = 8;\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          findBox(traf, [\"trun\"]).map((trun) => {\n            const version = trun[0];\n            const flags = readUint32(trun, 0) & 16777215;\n            const dataOffsetPresent = (flags & 1) !== 0;\n            let dataOffset = 0;\n            const firstSampleFlagsPresent = (flags & 4) !== 0;\n            const sampleDurationPresent = (flags & 256) !== 0;\n            let sampleDuration = 0;\n            const sampleSizePresent = (flags & 512) !== 0;\n            let sampleSize = 0;\n            const sampleFlagsPresent = (flags & 1024) !== 0;\n            const sampleCompositionOffsetsPresent = (flags & 2048) !== 0;\n            let compositionOffset = 0;\n            const sampleCount = readUint32(trun, 4);\n            let trunOffset = 8;\n            if (dataOffsetPresent) {\n              dataOffset = readUint32(trun, trunOffset);\n              trunOffset += 4;\n            }\n            if (firstSampleFlagsPresent) {\n              trunOffset += 4;\n            }\n            let sampleOffset = dataOffset + moofOffset;\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(sampleOffset, sampleOffset + naluSize);\n                    parseSEIMessageFromNALu(data, isHEVCFlavor ? 2 : 1, timeOffset + compositionOffset / timescale, seiSamples);\n                  }\n                  sampleOffset += naluSize;\n                  naluTotalSize += naluSize + 4;\n                }\n              }\n              timeOffset += sampleDuration / timescale;\n            }\n          });\n        }\n      });\n    });\n  });\n  return seiSamples;\n}\nfunction isHEVC(codec) {\n  if (!codec) {\n    return false;\n  }\n  const delimit = codec.indexOf(\".\");\n  const baseCodec = delimit < 0 ? codec : codec.substring(0, delimit);\n  return baseCodec === \"hvc1\" || baseCodec === \"hev1\" || // Dolby Vision\n  baseCodec === \"dvh1\" || baseCodec === \"dvhe\";\n}\nfunction isSEIMessage(isHEVCFlavor, naluHeader) {\n  if (isHEVCFlavor) {\n    const naluType = naluHeader >> 1 & 63;\n    return naluType === 39 || naluType === 40;\n  } else {\n    const naluType = naluHeader & 31;\n    return naluType === 6;\n  }\n}\nfunction parseSEIMessageFromNALu(unescapedData, headerSize, pts, samples) {\n  const data = discardEPB(unescapedData);\n  let seiPtr = 0;\n  seiPtr += headerSize;\n  let payloadType = 0;\n  let payloadSize = 0;\n  let b = 0;\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 === 255);\n    payloadSize = 0;\n    do {\n      if (seiPtr >= data.length) {\n        break;\n      }\n      b = data[seiPtr++];\n      payloadSize += b;\n    } while (b === 255);\n    const leftOver = data.length - seiPtr;\n    let payPtr = seiPtr;\n    if (payloadSize < leftOver) {\n      seiPtr += payloadSize;\n    } else if (payloadSize > leftOver) {\n      logger.error(`Malformed SEI payload. ${payloadSize} is too small, only ${leftOver} bytes left to parse.`);\n      break;\n    }\n    if (payloadType === 4) {\n      const countryCode = data[payPtr++];\n      if (countryCode === 181) {\n        const providerCode = readUint16(data, payPtr);\n        payPtr += 2;\n        if (providerCode === 49) {\n          const userStructure = readUint32(data, payPtr);\n          payPtr += 4;\n          if (userStructure === 1195456820) {\n            const userDataType = data[payPtr++];\n            if (userDataType === 3) {\n              const firstByte = data[payPtr++];\n              const totalCCs = 31 & firstByte;\n              const enabled = 64 & 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              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 = [];\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          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        samples.push({\n          payloadType,\n          pts,\n          uuid: uuidStrArray.join(\"\"),\n          userData: utf8ArrayToStr(userDataBytes),\n          userDataBytes\n        });\n      }\n    }\n  }\n}\nfunction discardEPB(data) {\n  const length = data.byteLength;\n  const EPBPositions = [];\n  let i = 1;\n  while (i < length - 2) {\n    if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 3) {\n      EPBPositions.push(i + 2);\n      i += 2;\n    } else {\n      i++;\n    }\n  }\n  if (EPBPositions.length === 0) {\n    return data;\n  }\n  const newLength = length - EPBPositions.length;\n  const newData = new Uint8Array(newLength);\n  let sourceIndex = 0;\n  for (i = 0; i < newLength; sourceIndex++, i++) {\n    if (sourceIndex === EPBPositions[0]) {\n      sourceIndex++;\n      EPBPositions.shift();\n    }\n    newData[i] = data[sourceIndex];\n  }\n  return newData;\n}\nfunction parseEmsg(data) {\n  const version = data[0];\n  let schemeIdUri = \"\";\n  let value = \"\";\n  let timeScale = 0;\n  let presentationTimeDelta = 0;\n  let presentationTime = 0;\n  let eventDuration = 0;\n  let id = 0;\n  let offset = 0;\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    schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n    while (bin2str(data.subarray(offset, offset + 1)) !== \"\\0\") {\n      value += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n    value += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\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 (!isSafeInteger(presentationTime)) {\n      presentationTime = Number.MAX_SAFE_INTEGER;\n      logger.warn(\"Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box\");\n    }\n    eventDuration = readUint32(data, offset);\n    offset += 4;\n    id = readUint32(data, offset);\n    offset += 4;\n    while (bin2str(data.subarray(offset, offset + 1)) !== \"\\0\") {\n      schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n    schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n    while (bin2str(data.subarray(offset, offset + 1)) !== \"\\0\") {\n      value += bin2str(data.subarray(offset, offset + 1));\n      offset += 1;\n    }\n    value += bin2str(data.subarray(offset, offset + 1));\n    offset += 1;\n  }\n  const payload = data.subarray(offset, data.byteLength);\n  return {\n    schemeIdUri,\n    value,\n    timeScale,\n    presentationTime,\n    presentationTimeDelta,\n    eventDuration,\n    id,\n    payload\n  };\n}\nfunction mp4Box(type, ...payload) {\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 & 255;\n  result[1] = size >> 16 & 255;\n  result[2] = size >> 8 & 255;\n  result[3] = size & 255;\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}\nfunction mp4pssh(systemId, keyids, data) {\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];\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 && 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      0,\n      0,\n      0\n      // Flags\n    ]),\n    systemId,\n    // 16 bytes\n    kidCount,\n    kids,\n    dataSize,\n    data || new Uint8Array()\n  );\n}\nfunction parsePssh(initData) {\n  if (!(initData instanceof ArrayBuffer) || initData.byteLength < 32) {\n    return null;\n  }\n  const result = {\n    version: 0,\n    systemId: \"\",\n    kids: null,\n    data: null\n  };\n  const view = new DataView(initData);\n  const boxSize = view.getUint32(0);\n  if (initData.byteLength !== boxSize && boxSize > 44) {\n    return null;\n  }\n  const type = view.getUint32(4);\n  if (type !== 1886614376) {\n    return null;\n  }\n  result.version = view.getUint32(8) >>> 24;\n  if (result.version > 1) {\n    return null;\n  }\n  result.systemId = Hex.hexDump(new Uint8Array(initData, 12, 16));\n  const dataSizeOrKidCount = view.getUint32(28);\n  if (result.version === 0) {\n    if (boxSize - 32 < dataSizeOrKidCount) {\n      return null;\n    }\n    result.data = new Uint8Array(initData, 32, dataSizeOrKidCount);\n  } else if (result.version === 1) {\n    result.kids = [];\n    for (let i = 0; i < dataSizeOrKidCount; i++) {\n      result.kids.push(new Uint8Array(initData, 32 + i * 16, 16));\n    }\n  }\n  return result;\n}\nlet keyUriToKeyIdMap = {};\nclass LevelKey {\n  static clearKeyUriToKeyIdMap() {\n    keyUriToKeyIdMap = {};\n  }\n  constructor(method, uri, format2, formatversions = [1], iv = null) {\n    this.uri = void 0;\n    this.method = void 0;\n    this.keyFormat = void 0;\n    this.keyFormatVersions = void 0;\n    this.encrypted = void 0;\n    this.isCommonEncryption = void 0;\n    this.iv = null;\n    this.key = null;\n    this.keyId = null;\n    this.pssh = null;\n    this.method = method;\n    this.uri = uri;\n    this.keyFormat = format2;\n    this.keyFormatVersions = formatversions;\n    this.iv = iv;\n    this.encrypted = method ? method !== \"NONE\" : false;\n    this.isCommonEncryption = this.encrypted && method !== \"AES-128\";\n  }\n  isSupported() {\n    if (this.method) {\n      if (this.method === \"AES-128\" || this.method === \"NONE\") {\n        return true;\n      }\n      if (this.keyFormat === \"identity\") {\n        return this.method === \"SAMPLE-AES\";\n      } else {\n        switch (this.keyFormat) {\n          case KeySystemFormats.FAIRPLAY:\n          case KeySystemFormats.WIDEVINE:\n          case KeySystemFormats.PLAYREADY:\n          case KeySystemFormats.CLEARKEY:\n            return [\"ISO-23001-7\", \"SAMPLE-AES\", \"SAMPLE-AES-CENC\", \"SAMPLE-AES-CTR\"].indexOf(this.method) !== -1;\n        }\n      }\n    }\n    return false;\n  }\n  getDecryptData(sn) {\n    if (!this.encrypted || !this.uri) {\n      return null;\n    }\n    if (this.method === \"AES-128\" && this.uri && !this.iv) {\n      if (typeof sn !== \"number\") {\n        if (this.method === \"AES-128\" && !this.iv) {\n          logger.warn(`missing IV for initialization segment with method=\"${this.method}\" - compliance issue`);\n        }\n        sn = 0;\n      }\n      const iv = createInitializationVector(sn);\n      const decryptdata = new LevelKey(this.method, this.uri, \"identity\", this.keyFormatVersions, iv);\n      return decryptdata;\n    }\n    const keyBytes = convertDataUriToArrayBytes(this.uri);\n    if (keyBytes) {\n      switch (this.keyFormat) {\n        case KeySystemFormats.WIDEVINE:\n          this.pssh = keyBytes;\n          if (keyBytes.length >= 22) {\n            this.keyId = keyBytes.subarray(keyBytes.length - 22, keyBytes.length - 6);\n          }\n          break;\n        case KeySystemFormats.PLAYREADY: {\n          const PlayReadyKeySystemUUID = new Uint8Array([154, 4, 240, 121, 152, 64, 66, 134, 171, 146, 230, 91, 224, 136, 95, 149]);\n          this.pssh = mp4pssh(PlayReadyKeySystemUUID, null, keyBytes);\n          const keyBytesUtf16 = new Uint16Array(keyBytes.buffer, keyBytes.byteOffset, keyBytes.byteLength / 2);\n          const keyByteStr = String.fromCharCode.apply(null, Array.from(keyBytesUtf16));\n          const xmlKeyBytes = keyByteStr.substring(keyByteStr.indexOf(\"<\"), keyByteStr.length);\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] ? keyData.childNodes[0].nodeValue : keyData.getAttribute(\"VALUE\");\n            if (keyId) {\n              const keyIdArray = base64Decode(keyId).subarray(0, 16);\n              changeEndianness(keyIdArray);\n              this.keyId = keyIdArray;\n            }\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    if (!this.keyId || this.keyId.byteLength !== 16) {\n      let keyId = keyUriToKeyIdMap[this.uri];\n      if (!keyId) {\n        const val = Object.keys(keyUriToKeyIdMap).length % Number.MAX_SAFE_INTEGER;\n        keyId = new Uint8Array(16);\n        const dv = new DataView(keyId.buffer, 12, 4);\n        dv.setUint32(0, val);\n        keyUriToKeyIdMap[this.uri] = keyId;\n      }\n      this.keyId = keyId;\n    }\n    return this;\n  }\n}\nfunction createInitializationVector(segmentNumber) {\n  const uint8View = new Uint8Array(16);\n  for (let i = 12; i < 16; i++) {\n    uint8View[i] = segmentNumber >> 8 * (15 - i) & 255;\n  }\n  return uint8View;\n}\nconst VARIABLE_REPLACEMENT_REGEX = /\\{\\$([a-zA-Z0-9-_]+)\\}/g;\nfunction hasVariableReferences(str) {\n  return VARIABLE_REPLACEMENT_REGEX.test(str);\n}\nfunction substituteVariablesInAttributes(parsed, attr, attributeNames) {\n  if (parsed.variableList !== null || parsed.hasVariableRefs) {\n    for (let i = attributeNames.length; i--; ) {\n      const name = attributeNames[i];\n      const value = attr[name];\n      if (value) {\n        attr[name] = substituteVariables(parsed, value);\n      }\n    }\n  }\n}\nfunction substituteVariables(parsed, value) {\n  if (parsed.variableList !== null || parsed.hasVariableRefs) {\n    const variableList = parsed.variableList;\n    return value.replace(VARIABLE_REPLACEMENT_REGEX, (variableReference) => {\n      const variableName = variableReference.substring(2, variableReference.length - 1);\n      const variableValue = variableList == null ? void 0 : variableList[variableName];\n      if (variableValue === void 0) {\n        parsed.playlistParsingError || (parsed.playlistParsingError = new Error(`Missing preceding EXT-X-DEFINE tag for Variable Reference: \"${variableName}\"`));\n        return variableReference;\n      }\n      return variableValue;\n    });\n  }\n  return value;\n}\nfunction addVariableDefinition(parsed, attr, parentUrl) {\n  let variableList = parsed.variableList;\n  if (!variableList) {\n    parsed.variableList = variableList = {};\n  }\n  let NAME;\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(`\"${NAME}\" does not match any query parameter in URI: \"${parentUrl}\"`);\n      }\n    } catch (error) {\n      parsed.playlistParsingError || (parsed.playlistParsingError = new Error(`EXT-X-DEFINE QUERYPARAM: ${error.message}`));\n    }\n  } else {\n    NAME = attr.NAME;\n    VALUE = attr.VALUE;\n  }\n  if (NAME in variableList) {\n    parsed.playlistParsingError || (parsed.playlistParsingError = new Error(`EXT-X-DEFINE duplicate Variable Name declarations: \"${NAME}\"`));\n  } else {\n    variableList[NAME] = VALUE || \"\";\n  }\n}\nfunction importVariableDefinition(parsed, attr, sourceVariableList) {\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 || (parsed.playlistParsingError = new Error(`EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: \"${IMPORT}\"`));\n  }\n}\nfunction getMediaSource(preferManagedMediaSource = true) {\n  if (typeof self === \"undefined\")\n    return void 0;\n  const mms = (preferManagedMediaSource || !self.MediaSource) && self.ManagedMediaSource;\n  return mms || self.MediaSource || self.WebKitMediaSource;\n}\nconst 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,\n    // MP4-RA listed codec entry for FLAC\n    flac: 0.9,\n    // legacy browser codec name for FLAC\n    FLAC: 0.9,\n    // 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,\n    // 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    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};\nfunction isCodecType(codec, type) {\n  const typeCodes = sampleEntryCodesISO[type];\n  return !!typeCodes && !!typeCodes[codec.slice(0, 4)];\n}\nfunction areCodecsMediaSourceSupported(codecs, type, preferManagedMediaSource = true) {\n  return !codecs.split(\",\").some((codec) => !isCodecMediaSourceSupported(codec, type, preferManagedMediaSource));\n}\nfunction isCodecMediaSourceSupported(codec, type, preferManagedMediaSource = true) {\n  var _MediaSource$isTypeSu;\n  const MediaSource = getMediaSource(preferManagedMediaSource);\n  return (_MediaSource$isTypeSu = MediaSource == null ? void 0 : MediaSource.isTypeSupported(mimeTypeForCodec(codec, type))) != null ? _MediaSource$isTypeSu : false;\n}\nfunction mimeTypeForCodec(codec, type) {\n  return `${type}/mp4;codecs=\"${codec}\"`;\n}\nfunction videoCodecPreferenceValue(videoCodec) {\n  if (videoCodec) {\n    const fourCC = videoCodec.substring(0, 4);\n    return sampleEntryCodesISO.video[fourCC];\n  }\n  return 2;\n}\nfunction codecsSetSelectionPreferenceValue(codecSet) {\n  return codecSet.split(\",\").reduce((num, fourCC) => {\n    const preferenceValue = 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}\nconst CODEC_COMPATIBLE_NAMES = {};\nfunction getCodecCompatibleNameLower(lowerCaseCodec, preferManagedMediaSource = true) {\n  if (CODEC_COMPATIBLE_NAMES[lowerCaseCodec]) {\n    return CODEC_COMPATIBLE_NAMES[lowerCaseCodec];\n  }\n  const codecsToCheck = {\n    flac: [\"flac\", \"fLaC\", \"FLAC\"],\n    opus: [\"opus\", \"Opus\"]\n  }[lowerCaseCodec];\n  for (let i = 0; i < codecsToCheck.length; i++) {\n    if (isCodecMediaSourceSupported(codecsToCheck[i], \"audio\", preferManagedMediaSource)) {\n      CODEC_COMPATIBLE_NAMES[lowerCaseCodec] = codecsToCheck[i];\n      return codecsToCheck[i];\n    }\n  }\n  return lowerCaseCodec;\n}\nconst AUDIO_CODEC_REGEXP = /flac|opus/i;\nfunction getCodecCompatibleName(codec, preferManagedMediaSource = true) {\n  return codec.replace(AUDIO_CODEC_REGEXP, (m) => getCodecCompatibleNameLower(m.toLowerCase(), preferManagedMediaSource));\n}\nfunction pickMostCompleteCodecName(parsedCodec, levelCodec) {\n  if (parsedCodec && parsedCodec !== \"mp4a\") {\n    return parsedCodec;\n  }\n  return levelCodec;\n}\nfunction convertAVC1ToAVCOTI(codec) {\n  const avcdata = codec.split(\".\");\n  if (avcdata.length > 2) {\n    let result = avcdata.shift() + \".\";\n    result += parseInt(avcdata.shift()).toString(16);\n    result += (\"000\" + parseInt(avcdata.shift()).toString(16)).slice(-4);\n    return result;\n  }\n  return codec;\n}\nconst MASTER_PLAYLIST_REGEX = /#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;\nconst IS_MEDIA_PLAYLIST = /^#EXT(?:INF|-X-TARGETDURATION):/m;\nconst LEVEL_PLAYLIST_REGEX_FAST = new RegExp([\n  /#EXTINF:\\s*(\\d*(?:\\.\\d+)?)(?:,(.*)\\s+)?/.source,\n  // duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title\n  /(?!#) *(\\S[\\S ]*)/.source,\n  // segment URI, group 3 => the URI (note newline is not eaten)\n  /#EXT-X-BYTERANGE:*(.+)/.source,\n  // next segment's byterange, group 4 => range spec (x@y)\n  /#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,\n  // next segment's program date/time group 5 => the datetime spec\n  /#.*/.source\n  // All other non-segment oriented tags will match with all groups empty\n].join(\"|\"), \"g\");\nconst LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#(EXTM3U)/.source, /#EXT-X-(DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\\r?\\n?/.source].join(\"|\"));\nclass M3U8Parser {\n  static findGroup(groups, mediaGroupId) {\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  static resolve(url, baseUrl) {\n    return urlToolkitExports.buildAbsoluteURL(baseUrl, url, {\n      alwaysNormalize: true\n    });\n  }\n  static isMediaPlaylist(str) {\n    return IS_MEDIA_PLAYLIST.test(str);\n  }\n  static parseMasterPlaylist(string, baseurl) {\n    const hasVariableRefs = hasVariableReferences(string);\n    const parsed = {\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 = [];\n    MASTER_PLAYLIST_REGEX.lastIndex = 0;\n    let result;\n    while ((result = MASTER_PLAYLIST_REGEX.exec(string)) != null) {\n      if (result[1]) {\n        var _level$unknownCodecs;\n        const attrs = new AttrList(result[1]);\n        {\n          substituteVariablesInAttributes(parsed, attrs, [\"CODECS\", \"SUPPLEMENTAL-CODECS\", \"ALLOWED-CPC\", \"PATHWAY-ID\", \"STABLE-VARIANT-ID\", \"AUDIO\", \"VIDEO\", \"SUBTITLES\", \"CLOSED-CAPTIONS\", \"NAME\"]);\n        }\n        const uri = substituteVariables(parsed, result[2]);\n        const level = {\n          attrs,\n          bitrate: attrs.decimalInteger(\"BANDWIDTH\") || attrs.decimalInteger(\"AVERAGE-BANDWIDTH\"),\n          name: attrs.NAME,\n          url: M3U8Parser.resolve(uri, baseurl)\n        };\n        const resolution = attrs.decimalResolution(\"RESOLUTION\");\n        if (resolution) {\n          level.width = resolution.width;\n          level.height = resolution.height;\n        }\n        setCodecs(attrs.CODECS, level);\n        if (!((_level$unknownCodecs = level.unknownCodecs) != null && _level$unknownCodecs.length)) {\n          levelsWithKnownCodecs.push(level);\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            const sessionAttrs = new AttrList(attributes);\n            {\n              substituteVariablesInAttributes(parsed, sessionAttrs, [\"DATA-ID\", \"LANGUAGE\", \"VALUE\", \"URI\"]);\n            }\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            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(`[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: \"${attributes}\"`);\n            }\n            break;\n          }\n          case \"DEFINE\": {\n            {\n              const variableAttributes = new AttrList(attributes);\n              substituteVariablesInAttributes(parsed, variableAttributes, [\"NAME\", \"VALUE\", \"QUERYPARAM\"]);\n              addVariableDefinition(parsed, variableAttributes, baseurl);\n            }\n            break;\n          }\n          case \"CONTENT-STEERING\": {\n            const contentSteeringAttributes = new AttrList(attributes);\n            {\n              substituteVariablesInAttributes(parsed, contentSteeringAttributes, [\"SERVER-URI\", \"PATHWAY-ID\"]);\n            }\n            parsed.contentSteering = {\n              uri: M3U8Parser.resolve(contentSteeringAttributes[\"SERVER-URI\"], baseurl),\n              pathwayId: contentSteeringAttributes[\"PATHWAY-ID\"] || \".\"\n            };\n            break;\n          }\n          case \"START\": {\n            parsed.startTimeOffset = parseStartTimeOffset(attributes);\n            break;\n          }\n        }\n      }\n    }\n    const stripUnknownCodecLevels = levelsWithKnownCodecs.length > 0 && levelsWithKnownCodecs.length < parsed.levels.length;\n    parsed.levels = stripUnknownCodecLevels ? levelsWithKnownCodecs : parsed.levels;\n    if (parsed.levels.length === 0) {\n      parsed.playlistParsingError = new Error(\"no levels found in manifest\");\n    }\n    return parsed;\n  }\n  static parseMasterPlaylistMedia(string, baseurl, parsed) {\n    let result;\n    const results = {};\n    const levels = parsed.levels;\n    const groupsByType = {\n      AUDIO: levels.map((level) => ({\n        id: level.attrs.AUDIO,\n        audioCodec: level.audioCodec\n      })),\n      SUBTITLES: levels.map((level) => ({\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]);\n      const type = attrs.TYPE;\n      if (type) {\n        const groups = groupsByType[type];\n        const medias = results[type] || [];\n        results[type] = medias;\n        {\n          substituteVariablesInAttributes(parsed, attrs, [\"URI\", \"GROUP-ID\", \"LANGUAGE\", \"ASSOC-LANGUAGE\", \"STABLE-RENDITION-ID\", \"NAME\", \"INSTREAM-ID\", \"CHARACTERISTICS\", \"CHANNELS\"]);\n        }\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 = {\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        if (groups != null && groups.length) {\n          const groupCodec = M3U8Parser.findGroup(groups, media.groupId) || groups[0];\n          assignCodec(media, groupCodec, \"audioCodec\");\n          assignCodec(media, groupCodec, \"textCodec\");\n        }\n        medias.push(media);\n      }\n    }\n    return results;\n  }\n  static parseLevelPlaylist(string, baseurl, id, type, levelUrlId, multivariantVariableList) {\n    const level = new LevelDetails(baseurl);\n    const fragments = level.fragments;\n    let currentInitSegment = null;\n    let currentSN = 0;\n    let currentPart = 0;\n    let totalduration = 0;\n    let discontinuityCounter = 0;\n    let prevFrag = null;\n    let frag = new Fragment(type, baseurl);\n    let result;\n    let i;\n    let levelkeys;\n    let firstPdtIndex = -1;\n    let createNextFrag = false;\n    let nextByteRange = null;\n    LEVEL_PLAYLIST_REGEX_FAST.lastIndex = 0;\n    level.m3u8 = string;\n    level.hasVariableRefs = hasVariableReferences(string);\n    while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {\n      if (createNextFrag) {\n        createNextFrag = false;\n        frag = new Fragment(type, baseurl);\n        frag.start = totalduration;\n        frag.sn = currentSN;\n        frag.cc = discontinuityCounter;\n        frag.level = id;\n        if (currentInitSegment) {\n          frag.initSegment = currentInitSegment;\n          frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n          currentInitSegment.rawProgramDateTime = null;\n          if (nextByteRange) {\n            frag.setByteRange(nextByteRange);\n            nextByteRange = null;\n          }\n        }\n      }\n      const duration = result[1];\n      if (duration) {\n        frag.duration = parseFloat(duration);\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        if (isFiniteNumber(frag.duration)) {\n          frag.start = 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          const uri = (\" \" + result[3]).slice(1);\n          frag.relurl = substituteVariables(level, uri);\n          assignProgramDateTime(frag, prevFrag);\n          prevFrag = frag;\n          totalduration += frag.duration;\n          currentSN++;\n          currentPart = 0;\n          createNextFrag = true;\n        }\n      } else if (result[4]) {\n        const data = (\" \" + result[4]).slice(1);\n        if (prevFrag) {\n          frag.setByteRange(data, prevFrag);\n        } else {\n          frag.setByteRange(data);\n        }\n      } else if (result[5]) {\n        frag.rawProgramDateTime = (\" \" + result[5]).slice(1);\n        frag.tagList.push([\"PROGRAM-DATE-TIME\", frag.rawProgramDateTime]);\n        if (firstPdtIndex === -1) {\n          firstPdtIndex = fragments.length;\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 (typeof result[i] !== \"undefined\") {\n            break;\n          }\n        }\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) : \"\";\n        switch (tag) {\n          case \"PLAYLIST-TYPE\":\n            level.type = value1.toUpperCase();\n            break;\n          case \"MEDIA-SEQUENCE\":\n            currentSN = level.startSN = parseInt(value1);\n            break;\n          case \"SKIP\": {\n            const skipAttrs = new AttrList(value1);\n            {\n              substituteVariablesInAttributes(level, skipAttrs, [\"RECENTLY-REMOVED-DATERANGES\"]);\n            }\n            const skippedSegments = skipAttrs.decimalInteger(\"SKIPPED-SEGMENTS\");\n            if (isFiniteNumber(skippedSegments)) {\n              level.skippedSegments = skippedSegments;\n              for (let _i = skippedSegments; _i--; ) {\n                fragments.unshift(null);\n              }\n              currentSN += skippedSegments;\n            }\n            const recentlyRemovedDateranges = skipAttrs.enumeratedString(\"RECENTLY-REMOVED-DATERANGES\");\n            if (recentlyRemovedDateranges) {\n              level.recentlyRemovedDateranges = recentlyRemovedDateranges.split(\"\t\");\n            }\n            break;\n          }\n          case \"TARGETDURATION\":\n            level.targetduration = Math.max(parseInt(value1), 1);\n            break;\n          case \"VERSION\":\n            level.version = parseInt(value1);\n            break;\n          case \"INDEPENDENT-SEGMENTS\":\n          case \"EXTM3U\":\n            break;\n          case \"ENDLIST\":\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            break;\n          case \"DATERANGE\": {\n            const dateRangeAttr = new AttrList(value1);\n            {\n              substituteVariablesInAttributes(level, dateRangeAttr, [\"ID\", \"CLASS\", \"START-DATE\", \"END-DATE\", \"SCTE35-CMD\", \"SCTE35-OUT\", \"SCTE35-IN\"]);\n              substituteVariablesInAttributes(level, dateRangeAttr, dateRangeAttr.clientAttrs);\n            }\n            const dateRange = new DateRange(dateRangeAttr, level.dateRanges[dateRangeAttr.ID]);\n            if (dateRange.isValid || level.skippedSegments) {\n              level.dateRanges[dateRange.id] = dateRange;\n            } else {\n              logger.warn(`Ignoring invalid DATERANGE tag: \"${value1}\"`);\n            }\n            frag.tagList.push([\"EXT-X-DATERANGE\", value1]);\n            break;\n          }\n          case \"DEFINE\": {\n            {\n              const variableAttributes = new AttrList(value1);\n              substituteVariablesInAttributes(level, variableAttributes, [\"NAME\", \"VALUE\", \"IMPORT\", \"QUERYPARAM\"]);\n              if (\"IMPORT\" in variableAttributes) {\n                importVariableDefinition(level, variableAttributes, multivariantVariableList);\n              } else {\n                addVariableDefinition(level, variableAttributes, baseurl);\n              }\n            }\n            break;\n          }\n          case \"DISCONTINUITY-SEQUENCE\":\n            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 = void 0;\n                break;\n              }\n              if (!levelkeys) {\n                levelkeys = {};\n              }\n              if (levelkeys[levelKey.keyFormat]) {\n                levelkeys = _extends({}, levelkeys);\n              }\n              levelkeys[levelKey.keyFormat] = levelKey;\n            } else {\n              logger.warn(`[Keys] Ignoring invalid EXT-X-KEY tag: \"${value1}\"`);\n            }\n            break;\n          }\n          case \"START\":\n            level.startTimeOffset = parseStartTimeOffset(value1);\n            break;\n          case \"MAP\": {\n            const mapAttrs = new AttrList(value1);\n            {\n              substituteVariablesInAttributes(level, mapAttrs, [\"BYTERANGE\", \"URI\"]);\n            }\n            if (frag.duration) {\n              const init = new Fragment(type, baseurl);\n              setInitSegment(init, mapAttrs, id, levelkeys);\n              currentInitSegment = init;\n              frag.initSegment = currentInitSegment;\n              if (currentInitSegment.rawProgramDateTime && !frag.rawProgramDateTime) {\n                frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n              }\n            } else {\n              const end = frag.byteRangeEndOffset;\n              if (end) {\n                const start = frag.byteRangeStartOffset;\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            break;\n          }\n          case \"SERVER-CONTROL\": {\n            const serverControlAttrs = new AttrList(value1);\n            level.canBlockReload = serverControlAttrs.bool(\"CAN-BLOCK-RELOAD\");\n            level.canSkipUntil = serverControlAttrs.optionalFloat(\"CAN-SKIP-UNTIL\", 0);\n            level.canSkipDateRanges = level.canSkipUntil > 0 && serverControlAttrs.bool(\"CAN-SKIP-DATERANGES\");\n            level.partHoldBack = serverControlAttrs.optionalFloat(\"PART-HOLD-BACK\", 0);\n            level.holdBack = serverControlAttrs.optionalFloat(\"HOLD-BACK\", 0);\n            break;\n          }\n          case \"PART-INF\": {\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 = currentPart > 0 ? partList[partList.length - 1] : void 0;\n            const index = currentPart++;\n            const partAttrs = new AttrList(value1);\n            {\n              substituteVariablesInAttributes(level, partAttrs, [\"BYTERANGE\", \"URI\"]);\n            }\n            const part = new Part(partAttrs, frag, baseurl, index, previousFragmentPart);\n            partList.push(part);\n            frag.duration += part.duration;\n            break;\n          }\n          case \"PRELOAD-HINT\": {\n            const preloadHintAttrs = new AttrList(value1);\n            {\n              substituteVariablesInAttributes(level, preloadHintAttrs, [\"URI\"]);\n            }\n            level.preloadHint = preloadHintAttrs;\n            break;\n          }\n          case \"RENDITION-REPORT\": {\n            const renditionReportAttrs = new AttrList(value1);\n            {\n              substituteVariablesInAttributes(level, renditionReportAttrs, [\"URI\"]);\n            }\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;\n      }\n    } else if (level.partList) {\n      assignProgramDateTime(frag, prevFrag);\n      frag.cc = discontinuityCounter;\n      level.fragmentHint = frag;\n      if (levelkeys) {\n        setFragLevelKeys(frag, levelkeys, level);\n      }\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      if (firstFragment) {\n        level.startCC = firstFragment.cc;\n      }\n    } else {\n      level.endSN = 0;\n      level.startCC = 0;\n    }\n    if (level.fragmentHint) {\n      totalduration += level.fragmentHint.duration;\n    }\n    level.totalduration = totalduration;\n    level.endCC = discontinuityCounter;\n    if (firstPdtIndex > 0) {\n      backfillProgramDateTimes(fragments, firstPdtIndex);\n    }\n    return level;\n  }\n}\nfunction parseKey(keyTagAttributes, baseurl, parsed) {\n  var _keyAttrs$METHOD, _keyAttrs$KEYFORMAT;\n  const keyAttrs = new AttrList(keyTagAttributes);\n  {\n    substituteVariablesInAttributes(parsed, keyAttrs, [\"KEYFORMAT\", \"KEYFORMATVERSIONS\", \"URI\", \"IV\", \"URI\"]);\n  }\n  const decryptmethod = (_keyAttrs$METHOD = keyAttrs.METHOD) != null ? _keyAttrs$METHOD : \"\";\n  const decrypturi = keyAttrs.URI;\n  const decryptiv = keyAttrs.hexadecimalInteger(\"IV\");\n  const decryptkeyformatversions = keyAttrs.KEYFORMATVERSIONS;\n  const decryptkeyformat = (_keyAttrs$KEYFORMAT = keyAttrs.KEYFORMAT) != null ? _keyAttrs$KEYFORMAT : \"identity\";\n  if (decrypturi && keyAttrs.IV && !decryptiv) {\n    logger.error(`Invalid IV: ${keyAttrs.IV}`);\n  }\n  const resolvedUri = decrypturi ? M3U8Parser.resolve(decrypturi, baseurl) : \"\";\n  const keyFormatVersions = (decryptkeyformatversions ? decryptkeyformatversions : \"1\").split(\"/\").map(Number).filter(Number.isFinite);\n  return new LevelKey(decryptmethod, resolvedUri, decryptkeyformat, keyFormatVersions, decryptiv);\n}\nfunction parseStartTimeOffset(startAttributes) {\n  const startAttrs = new AttrList(startAttributes);\n  const startTimeOffset = startAttrs.decimalFloatingPoint(\"TIME-OFFSET\");\n  if (isFiniteNumber(startTimeOffset)) {\n    return startTimeOffset;\n  }\n  return null;\n}\nfunction setCodecs(codecsAttributeValue, level) {\n  let codecs = (codecsAttributeValue || \"\").split(/[ ,]+/).filter((c) => c);\n  [\"video\", \"audio\", \"text\"].forEach((type) => {\n    const filtered = codecs.filter((codec) => isCodecType(codec, type));\n    if (filtered.length) {\n      level[`${type}Codec`] = filtered.join(\",\");\n      codecs = codecs.filter((codec) => filtered.indexOf(codec) === -1);\n    }\n  });\n  level.unknownCodecs = codecs;\n}\nfunction assignCodec(media, groupItem, codecProperty) {\n  const codecValue = groupItem[codecProperty];\n  if (codecValue) {\n    media[codecProperty] = codecValue;\n  }\n}\nfunction backfillProgramDateTimes(fragments, firstPdtIndex) {\n  let fragPrev = fragments[firstPdtIndex];\n  for (let i = firstPdtIndex; i--; ) {\n    const frag = fragments[i];\n    if (!frag) {\n      return;\n    }\n    frag.programDateTime = fragPrev.programDateTime - frag.duration * 1e3;\n    fragPrev = frag;\n  }\n}\nfunction assignProgramDateTime(frag, prevFrag) {\n  if (frag.rawProgramDateTime) {\n    frag.programDateTime = Date.parse(frag.rawProgramDateTime);\n  } else if (prevFrag != null && prevFrag.programDateTime) {\n    frag.programDateTime = prevFrag.endProgramDateTime;\n  }\n  if (!isFiniteNumber(frag.programDateTime)) {\n    frag.programDateTime = null;\n    frag.rawProgramDateTime = null;\n  }\n}\nfunction setInitSegment(frag, mapAttrs, id, levelkeys) {\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}\nfunction setFragLevelKeys(frag, levelkeys, level) {\n  frag.levelkeys = levelkeys;\n  const {\n    encryptedFragments\n  } = level;\n  if ((!encryptedFragments.length || encryptedFragments[encryptedFragments.length - 1].levelkeys !== levelkeys) && Object.keys(levelkeys).some((format2) => levelkeys[format2].isCommonEncryption)) {\n    encryptedFragments.push(frag);\n  }\n}\nvar PlaylistContextType = {\n  MANIFEST: \"manifest\",\n  LEVEL: \"level\",\n  AUDIO_TRACK: \"audioTrack\",\n  SUBTITLE_TRACK: \"subtitleTrack\"\n};\nvar PlaylistLevelType = {\n  MAIN: \"main\",\n  AUDIO: \"audio\",\n  SUBTITLE: \"subtitle\"\n};\nfunction mapContextToLevelType(context) {\n  const {\n    type\n  } = context;\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}\nfunction getResponseUrl(response, context) {\n  let url = response.url;\n  if (url === void 0 || url.indexOf(\"data:\") === 0) {\n    url = context.url;\n  }\n  return url;\n}\nclass PlaylistLoader {\n  constructor(hls) {\n    this.hls = void 0;\n    this.loaders = /* @__PURE__ */ Object.create(null);\n    this.variableList = null;\n    this.hls = hls;\n    this.registerListeners();\n  }\n  startLoad(startPosition) {\n  }\n  stopLoad() {\n    this.destroyInternalLoaders();\n  }\n  registerListeners() {\n    const {\n      hls\n    } = 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  }\n  unregisterListeners() {\n    const {\n      hls\n    } = 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  }\n  /**\n   * Returns defaults or configured loader-type overloads (pLoader and loader config params)\n   */\n  createInternalLoader(context) {\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);\n    this.loaders[context.type] = loader;\n    return loader;\n  }\n  getInternalLoader(context) {\n    return this.loaders[context.type];\n  }\n  resetInternalLoader(contextType) {\n    if (this.loaders[contextType]) {\n      delete this.loaders[contextType];\n    }\n  }\n  /**\n   * Call `destroy` on all internal loader instances mapped (one per context type)\n   */\n  destroyInternalLoaders() {\n    for (const contextType in this.loaders) {\n      const loader = this.loaders[contextType];\n      if (loader) {\n        loader.destroy();\n      }\n      this.resetInternalLoader(contextType);\n    }\n  }\n  destroy() {\n    this.variableList = null;\n    this.unregisterListeners();\n    this.destroyInternalLoaders();\n  }\n  onManifestLoading(event, data) {\n    const {\n      url\n    } = 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    });\n  }\n  onLevelLoading(event, data) {\n    const {\n      id,\n      level,\n      pathwayId,\n      url,\n      deliveryDirectives\n    } = data;\n    this.load({\n      id,\n      level,\n      pathwayId,\n      responseType: \"text\",\n      type: PlaylistContextType.LEVEL,\n      url,\n      deliveryDirectives\n    });\n  }\n  onAudioTrackLoading(event, data) {\n    const {\n      id,\n      groupId,\n      url,\n      deliveryDirectives\n    } = data;\n    this.load({\n      id,\n      groupId,\n      level: null,\n      responseType: \"text\",\n      type: PlaylistContextType.AUDIO_TRACK,\n      url,\n      deliveryDirectives\n    });\n  }\n  onSubtitleTrackLoading(event, data) {\n    const {\n      id,\n      groupId,\n      url,\n      deliveryDirectives\n    } = data;\n    this.load({\n      id,\n      groupId,\n      level: null,\n      responseType: \"text\",\n      type: PlaylistContextType.SUBTITLE_TRACK,\n      url,\n      deliveryDirectives\n    });\n  }\n  load(context) {\n    var _context$deliveryDire;\n    const config = this.hls.config;\n    let loader = this.getInternalLoader(context);\n    if (loader) {\n      const loaderContext = loader.context;\n      if (loaderContext && loaderContext.url === context.url && loaderContext.level === context.level) {\n        logger.trace(\"[playlist-loader]: playlist request ongoing\");\n        return;\n      }\n      logger.log(`[playlist-loader]: aborting previous loader for type: ${context.type}`);\n      loader.abort();\n    }\n    let loadPolicy;\n    if (context.type === PlaylistContextType.MANIFEST) {\n      loadPolicy = config.manifestLoadPolicy.default;\n    } else {\n      loadPolicy = _extends({}, config.playlistLoadPolicy.default, {\n        timeoutRetry: null,\n        errorRetry: null\n      });\n    }\n    loader = this.createInternalLoader(context);\n    if (isFiniteNumber((_context$deliveryDire = context.deliveryDirectives) == null ? void 0 : _context$deliveryDire.part)) {\n      let levelDetails;\n      if (context.type === PlaylistContextType.LEVEL && context.level !== null) {\n        levelDetails = this.hls.levels[context.level].details;\n      } else if (context.type === PlaylistContextType.AUDIO_TRACK && context.id !== null) {\n        levelDetails = this.hls.audioTracks[context.id].details;\n      } else if (context.type === PlaylistContextType.SUBTITLE_TRACK && context.id !== null) {\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 = Math.max(partTarget * 3, targetDuration * 0.8) * 1e3;\n          loadPolicy = _extends({}, loadPolicy, {\n            maxTimeToFirstByteMs: Math.min(maxLowLatencyPlaylistRefresh, loadPolicy.maxTimeToFirstByteMs),\n            maxLoadTimeMs: Math.min(maxLowLatencyPlaylistRefresh, loadPolicy.maxTimeToFirstByteMs)\n          });\n        }\n      }\n    }\n    const legacyRetryCompatibility = loadPolicy.errorRetry || loadPolicy.timeoutRetry || {};\n    const loaderConfig = {\n      loadPolicy,\n      timeout: loadPolicy.maxLoadTimeMs,\n      maxRetry: legacyRetryCompatibility.maxNumRetry || 0,\n      retryDelay: legacyRetryCompatibility.retryDelayMs || 0,\n      maxRetryDelay: legacyRetryCompatibility.maxRetryDelayMs || 0\n    };\n    const loaderCallbacks = {\n      onSuccess: (response, stats, context2, networkDetails) => {\n        const loader2 = this.getInternalLoader(context2);\n        this.resetInternalLoader(context2.type);\n        const string = response.data;\n        if (string.indexOf(\"#EXTM3U\") !== 0) {\n          this.handleManifestParsingError(response, context2, new Error(\"no EXTM3U delimiter\"), networkDetails || null, stats);\n          return;\n        }\n        stats.parsing.start = performance.now();\n        if (M3U8Parser.isMediaPlaylist(string)) {\n          this.handleTrackOrLevelPlaylist(response, stats, context2, networkDetails || null, loader2);\n        } else {\n          this.handleMasterPlaylist(response, stats, context2, networkDetails);\n        }\n      },\n      onError: (response, context2, networkDetails, stats) => {\n        this.handleNetworkError(context2, networkDetails, false, response, stats);\n      },\n      onTimeout: (stats, context2, networkDetails) => {\n        this.handleNetworkError(context2, networkDetails, true, void 0, stats);\n      }\n    };\n    loader.load(context, loaderConfig, loaderCallbacks);\n  }\n  handleMasterPlaylist(response, stats, context, networkDetails) {\n    const hls = this.hls;\n    const string = response.data;\n    const url = getResponseUrl(response, context);\n    const parsedResult = M3U8Parser.parseMasterPlaylist(string, url);\n    if (parsedResult.playlistParsingError) {\n      this.handleManifestParsingError(response, context, parsedResult.playlistParsingError, networkDetails, stats);\n      return;\n    }\n    const {\n      contentSteering,\n      levels,\n      sessionData,\n      sessionKeys,\n      startTimeOffset,\n      variableList\n    } = parsedResult;\n    this.variableList = variableList;\n    const {\n      AUDIO: audioTracks = [],\n      SUBTITLES: subtitles,\n      \"CLOSED-CAPTIONS\": captions\n    } = M3U8Parser.parseMasterPlaylistMedia(string, url, parsedResult);\n    if (audioTracks.length) {\n      const embeddedAudioFound = audioTracks.some((audioTrack) => !audioTrack.url);\n      if (!embeddedAudioFound && levels[0].audioCodec && !levels[0].attrs.AUDIO) {\n        logger.log(\"[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one\");\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({}),\n          bitrate: 0,\n          url: \"\"\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  handleTrackOrLevelPlaylist(response, stats, context, networkDetails, loader) {\n    const hls = this.hls;\n    const {\n      id,\n      level,\n      type\n    } = context;\n    const url = getResponseUrl(response, context);\n    const levelUrlId = 0;\n    const levelId = isFiniteNumber(level) ? level : isFiniteNumber(id) ? id : 0;\n    const levelType = mapContextToLevelType(context);\n    const levelDetails = M3U8Parser.parseLevelPlaylist(response.data, url, levelId, levelType, levelUrlId, this.variableList);\n    if (type === PlaylistContextType.MANIFEST) {\n      const singleLevel = {\n        attrs: new AttrList({}),\n        bitrate: 0,\n        details: levelDetails,\n        name: \"\",\n        url\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    stats.parsing.end = performance.now();\n    context.levelDetails = levelDetails;\n    this.handlePlaylistLoaded(levelDetails, response, stats, context, networkDetails, loader);\n  }\n  handleManifestParsingError(response, context, error, networkDetails, stats) {\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  handleNetworkError(context, networkDetails, timeout = false, response, stats) {\n    let message = `A network ${timeout ? \"timeout\" : \"error\" + (response ? \" (status \" + response.code + \")\" : \"\")} occurred while loading ${context.type}`;\n    if (context.type === PlaylistContextType.LEVEL) {\n      message += `: ${context.level} id: ${context.id}`;\n    } else if (context.type === PlaylistContextType.AUDIO_TRACK || context.type === PlaylistContextType.SUBTITLE_TRACK) {\n      message += ` id: ${context.id} group-id: \"${context.groupId}\"`;\n    }\n    const error = new Error(message);\n    logger.warn(`[playlist-loader]: ${message}`);\n    let details = ErrorDetails.UNKNOWN;\n    let fatal = false;\n    const loader = this.getInternalLoader(context);\n    switch (context.type) {\n      case PlaylistContextType.MANIFEST:\n        details = timeout ? ErrorDetails.MANIFEST_LOAD_TIMEOUT : ErrorDetails.MANIFEST_LOAD_ERROR;\n        fatal = true;\n        break;\n      case PlaylistContextType.LEVEL:\n        details = timeout ? ErrorDetails.LEVEL_LOAD_TIMEOUT : ErrorDetails.LEVEL_LOAD_ERROR;\n        fatal = false;\n        break;\n      case PlaylistContextType.AUDIO_TRACK:\n        details = timeout ? ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT : ErrorDetails.AUDIO_TRACK_LOAD_ERROR;\n        fatal = false;\n        break;\n      case PlaylistContextType.SUBTITLE_TRACK:\n        details = timeout ? ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT : ErrorDetails.SUBTITLE_LOAD_ERROR;\n        fatal = false;\n        break;\n    }\n    if (loader) {\n      this.resetInternalLoader(context.type);\n    }\n    const 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    if (response) {\n      const url = (networkDetails == null ? void 0 : networkDetails.url) || context.url;\n      errorData.response = _objectSpread2({\n        url,\n        data: void 0\n      }, response);\n    }\n    this.hls.trigger(Events.ERROR, errorData);\n  }\n  handlePlaylistLoaded(levelDetails, response, stats, context, networkDetails, loader) {\n    const hls = this.hls;\n    const {\n      type,\n      level,\n      id,\n      groupId,\n      deliveryDirectives\n    } = context;\n    const url = getResponseUrl(response, context);\n    const parent = mapContextToLevelType(context);\n    const levelIndex = typeof context.level === \"number\" && parent === PlaylistLevelType.MAIN ? level : void 0;\n    if (!levelDetails.fragments.length) {\n      const _error = new Error(\"No Segments found in Playlist\");\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.NETWORK_ERROR,\n        details: ErrorDetails.LEVEL_EMPTY_ERROR,\n        fatal: false,\n        url,\n        error: _error,\n        reason: _error.message,\n        response,\n        context,\n        level: levelIndex,\n        parent,\n        networkDetails,\n        stats\n      });\n      return;\n    }\n    if (!levelDetails.targetduration) {\n      levelDetails.playlistParsingError = new Error(\"Missing Target Duration\");\n    }\n    const error = levelDetails.playlistParsingError;\n    if (error) {\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    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    switch (type) {\n      case PlaylistContextType.MANIFEST:\n      case PlaylistContextType.LEVEL:\n        hls.trigger(Events.LEVEL_LOADED, {\n          details: levelDetails,\n          level: levelIndex || 0,\n          id: id || 0,\n          stats,\n          networkDetails,\n          deliveryDirectives\n        });\n        break;\n      case PlaylistContextType.AUDIO_TRACK:\n        hls.trigger(Events.AUDIO_TRACK_LOADED, {\n          details: levelDetails,\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          id: id || 0,\n          groupId: groupId || \"\",\n          stats,\n          networkDetails,\n          deliveryDirectives\n        });\n        break;\n    }\n  }\n}\nfunction sendAddTrackEvent(track, videoEl) {\n  let event;\n  try {\n    event = new Event(\"addtrack\");\n  } catch (err) {\n    event = document.createEvent(\"Event\");\n    event.initEvent(\"addtrack\", false, false);\n  }\n  event.track = track;\n  videoEl.dispatchEvent(event);\n}\nfunction addCueToTrack(track, cue) {\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(cue.startTime, cue.endTime, cue.text);\n        textTrackCue.id = cue.id;\n        track.addCue(textTrackCue);\n      } catch (err2) {\n        logger.debug(`[texttrack-utils]: Legacy TextTrackCue fallback failed: ${err2}`);\n      }\n    }\n  }\n  if (mode === \"disabled\") {\n    track.mode = mode;\n  }\n}\nfunction clearCurrentCues(track) {\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      track.removeCue(track.cues[i]);\n    }\n  }\n  if (mode === \"disabled\") {\n    track.mode = mode;\n  }\n}\nfunction removeCuesInRange(track, start, end, predicate) {\n  const mode = track.mode;\n  if (mode === \"disabled\") {\n    track.mode = \"hidden\";\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}\nfunction getFirstCueIndexAfterTime(cues, time) {\n  if (time < cues[0].startTime) {\n    return 0;\n  }\n  const len = cues.length - 1;\n  if (time > cues[len].endTime) {\n    return -1;\n  }\n  let left = 0;\n  let right = len;\n  while (left <= right) {\n    const mid = Math.floor((right + left) / 2);\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      return mid;\n    }\n  }\n  return cues[left].startTime - time < time - cues[right].startTime ? left : right;\n}\nfunction getCuesInRange(cues, start, end) {\n  const cuesFound = [];\n  const firstCueInRange = getFirstCueIndexAfterTime(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}\nfunction filterSubtitleTracks(textTrackList) {\n  const tracks = [];\n  for (let i = 0; i < textTrackList.length; i++) {\n    const track = textTrackList[i];\n    if ((track.kind === \"subtitles\" || track.kind === \"captions\") && track.label) {\n      tracks.push(textTrackList[i]);\n    }\n  }\n  return tracks;\n}\nvar MetadataSchema = {\n  audioId3: \"org.id3\",\n  dateRange: \"com.apple.quicktime.HLS\",\n  emsg: \"https://aomedia.org/emsg/ID3\"\n};\nconst MIN_CUE_DURATION = 0.25;\nfunction getCueClass() {\n  if (typeof self === \"undefined\")\n    return void 0;\n  return self.VTTCue || self.TextTrackCue;\n}\nfunction createCueWithDataFields(Cue, startTime, endTime, data, type) {\n  let cue = new Cue(startTime, endTime, \"\");\n  try {\n    cue.value = data;\n    if (type) {\n      cue.type = type;\n    }\n  } catch (e) {\n    cue = new Cue(startTime, endTime, JSON.stringify(type ? _objectSpread2({\n      type\n    }, data) : data));\n  }\n  return cue;\n}\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})();\nfunction dateRangeDateToTimelineSeconds(date, offset) {\n  return date.getTime() / 1e3 - offset;\n}\nfunction hexToArrayBuffer(str) {\n  return Uint8Array.from(str.replace(/^0x/, \"\").replace(/([\\da-fA-F]{2}) ?/g, \"0x$1 \").replace(/ +$/, \"\").split(\" \")).buffer;\n}\nclass ID3TrackController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.id3Track = null;\n    this.media = null;\n    this.dateRangeCuesAppended = {};\n    this.hls = hls;\n    this._registerListeners();\n  }\n  destroy() {\n    this._unregisterListeners();\n    this.id3Track = null;\n    this.media = null;\n    this.dateRangeCuesAppended = {};\n    this.hls = null;\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = 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  }\n  _unregisterListeners() {\n    const {\n      hls\n    } = 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  }\n  // Add ID3 metatadata text track.\n  onMediaAttached(event, data) {\n    this.media = data.media;\n  }\n  onMediaDetaching() {\n    if (!this.id3Track) {\n      return;\n    }\n    clearCurrentCues(this.id3Track);\n    this.id3Track = null;\n    this.media = null;\n    this.dateRangeCuesAppended = {};\n  }\n  onManifestLoading() {\n    this.dateRangeCuesAppended = {};\n  }\n  createTrack(media) {\n    const track = this.getID3Track(media.textTracks);\n    track.mode = \"hidden\";\n    return track;\n  }\n  getID3Track(textTracks) {\n    if (!this.media) {\n      return;\n    }\n    for (let i = 0; i < textTracks.length; i++) {\n      const textTrack = textTracks[i];\n      if (textTrack.kind === \"metadata\" && textTrack.label === \"id3\") {\n        sendAddTrackEvent(textTrack, this.media);\n        return textTrack;\n      }\n    }\n    return this.media.addTextTrack(\"metadata\", \"id3\");\n  }\n  onFragParsingMetadata(event, data) {\n    if (!this.media) {\n      return;\n    }\n    const {\n      hls: {\n        config: {\n          enableEmsgMetadataCues,\n          enableID3MetadataCues\n        }\n      }\n    } = this;\n    if (!enableEmsgMetadataCues && !enableID3MetadataCues) {\n      return;\n    }\n    const {\n      samples\n    } = data;\n    if (!this.id3Track) {\n      this.id3Track = this.createTrack(this.media);\n    }\n    const Cue = getCueClass();\n    if (!Cue) {\n      return;\n    }\n    for (let i = 0; i < samples.length; i++) {\n      const type = samples[i].type;\n      if (type === MetadataSchema.emsg && !enableEmsgMetadataCues || !enableID3MetadataCues) {\n        continue;\n      }\n      const frames = getID3Frames(samples[i].data);\n      if (frames) {\n        const startTime = samples[i].pts;\n        let endTime = startTime + samples[i].duration;\n        if (endTime > MAX_CUE_ENDTIME) {\n          endTime = MAX_CUE_ENDTIME;\n        }\n        const timeDiff = endTime - startTime;\n        if (timeDiff <= 0) {\n          endTime = startTime + MIN_CUE_DURATION;\n        }\n        for (let j = 0; j < frames.length; j++) {\n          const frame = frames[j];\n          if (!isTimeStampFrame(frame)) {\n            this.updateId3CueEnds(startTime, type);\n            const cue = createCueWithDataFields(Cue, startTime, endTime, frame, type);\n            if (cue) {\n              this.id3Track.addCue(cue);\n            }\n          }\n        }\n      }\n    }\n  }\n  updateId3CueEnds(startTime, type) {\n    var _this$id3Track;\n    const cues = (_this$id3Track = this.id3Track) == null ? void 0 : _this$id3Track.cues;\n    if (cues) {\n      for (let i = cues.length; i--; ) {\n        const cue = cues[i];\n        if (cue.type === type && cue.startTime < startTime && cue.endTime === MAX_CUE_ENDTIME) {\n          cue.endTime = startTime;\n        }\n      }\n    }\n  }\n  onBufferFlushing(event, {\n    startOffset,\n    endOffset,\n    type\n  }) {\n    const {\n      id3Track,\n      hls\n    } = this;\n    if (!hls) {\n      return;\n    }\n    const {\n      config: {\n        enableEmsgMetadataCues,\n        enableID3MetadataCues\n      }\n    } = hls;\n    if (id3Track && (enableEmsgMetadataCues || enableID3MetadataCues)) {\n      let predicate;\n      if (type === \"audio\") {\n        predicate = (cue) => cue.type === MetadataSchema.audioId3 && enableID3MetadataCues;\n      } else if (type === \"video\") {\n        predicate = (cue) => cue.type === MetadataSchema.emsg && enableEmsgMetadataCues;\n      } else {\n        predicate = (cue) => cue.type === MetadataSchema.audioId3 && enableID3MetadataCues || cue.type === MetadataSchema.emsg && enableEmsgMetadataCues;\n      }\n      removeCuesInRange(id3Track, startOffset, endOffset, predicate);\n    }\n  }\n  onLevelUpdated(event, {\n    details\n  }) {\n    if (!this.media || !details.hasProgramDateTime || !this.hls.config.enableDateRangeMetadataCues) {\n      return;\n    }\n    const {\n      dateRangeCuesAppended,\n      id3Track\n    } = this;\n    const {\n      dateRanges\n    } = details;\n    const ids = Object.keys(dateRanges);\n    if (id3Track) {\n      const idsToRemove = Object.keys(dateRangeCuesAppended).filter((id) => !ids.includes(id));\n      for (let i = idsToRemove.length; i--; ) {\n        const id = idsToRemove[i];\n        Object.keys(dateRangeCuesAppended[id].cues).forEach((key) => {\n          id3Track.removeCue(dateRangeCuesAppended[id].cues[key]);\n        });\n        delete dateRangeCuesAppended[id];\n      }\n    }\n    const lastFragment = details.fragments[details.fragments.length - 1];\n    if (ids.length === 0 || !isFiniteNumber(lastFragment == null ? void 0 : lastFragment.programDateTime)) {\n      return;\n    }\n    if (!this.id3Track) {\n      this.id3Track = this.createTrack(this.media);\n    }\n    const dateTimeOffset = lastFragment.programDateTime / 1e3 - lastFragment.start;\n    const Cue = getCueClass();\n    for (let i = 0; i < ids.length; i++) {\n      const id = ids[i];\n      const dateRange = dateRanges[id];\n      const startTime = dateRangeDateToTimelineSeconds(dateRange.startDate, dateTimeOffset);\n      const appendedDateRangeCues = dateRangeCuesAppended[id];\n      const cues = (appendedDateRangeCues == null ? void 0 : appendedDateRangeCues.cues) || {};\n      let durationKnown = (appendedDateRangeCues == null ? void 0 : appendedDateRangeCues.durationKnown) || false;\n      let endTime = MAX_CUE_ENDTIME;\n      const endDate = dateRange.endDate;\n      if (endDate) {\n        endTime = dateRangeDateToTimelineSeconds(endDate, dateTimeOffset);\n        durationKnown = true;\n      } else if (dateRange.endOnNext && !durationKnown) {\n        const nextDateRangeWithSameClass = ids.reduce((candidateDateRange, id2) => {\n          if (id2 !== dateRange.id) {\n            const otherDateRange = dateRanges[id2];\n            if (otherDateRange.class === dateRange.class && otherDateRange.startDate > dateRange.startDate && (!candidateDateRange || dateRange.startDate < candidateDateRange.startDate)) {\n              return otherDateRange;\n            }\n          }\n          return candidateDateRange;\n        }, null);\n        if (nextDateRangeWithSameClass) {\n          endTime = dateRangeDateToTimelineSeconds(nextDateRangeWithSameClass.startDate, dateTimeOffset);\n          durationKnown = true;\n        }\n      }\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          }\n        } else if (Cue) {\n          let data = dateRange.attr[key];\n          if (isSCTE35Attribute(key)) {\n            data = hexToArrayBuffer(data);\n          }\n          const _cue = createCueWithDataFields(Cue, startTime, endTime, {\n            key,\n            data\n          }, MetadataSchema.dateRange);\n          if (_cue) {\n            _cue.id = id;\n            this.id3Track.addCue(_cue);\n            cues[key] = _cue;\n          }\n        }\n      }\n      dateRangeCuesAppended[id] = {\n        cues,\n        dateRange,\n        durationKnown\n      };\n    }\n  }\n}\nclass LatencyController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.config = void 0;\n    this.media = null;\n    this.levelDetails = null;\n    this.currentTime = 0;\n    this.stallCount = 0;\n    this._latency = null;\n    this.timeupdateHandler = () => this.timeupdate();\n    this.hls = hls;\n    this.config = hls.config;\n    this.registerListeners();\n  }\n  get latency() {\n    return this._latency || 0;\n  }\n  get maxLatency() {\n    const {\n      config,\n      levelDetails\n    } = this;\n    if (config.liveMaxLatencyDuration !== void 0) {\n      return config.liveMaxLatencyDuration;\n    }\n    return levelDetails ? config.liveMaxLatencyDurationCount * levelDetails.targetduration : 0;\n  }\n  get targetLatency() {\n    const {\n      levelDetails\n    } = this;\n    if (levelDetails === null) {\n      return null;\n    }\n    const {\n      holdBack,\n      partHoldBack,\n      targetduration\n    } = levelDetails;\n    const {\n      liveSyncDuration,\n      liveSyncDurationCount,\n      lowLatencyMode\n    } = this.config;\n    const userConfig = this.hls.userConfig;\n    let targetLatency = lowLatencyMode ? partHoldBack || holdBack : holdBack;\n    if (userConfig.liveSyncDuration || userConfig.liveSyncDurationCount || targetLatency === 0) {\n      targetLatency = liveSyncDuration !== void 0 ? liveSyncDuration : liveSyncDurationCount * targetduration;\n    }\n    const maxLiveSyncOnStallIncrease = targetduration;\n    const liveSyncOnStallIncrease = 1;\n    return targetLatency + Math.min(this.stallCount * liveSyncOnStallIncrease, maxLiveSyncOnStallIncrease);\n  }\n  get liveSyncPosition() {\n    const liveEdge = this.estimateLiveEdge();\n    const targetLatency = this.targetLatency;\n    const levelDetails = this.levelDetails;\n    if (liveEdge === null || targetLatency === null || 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 = edge - (this.config.lowLatencyMode && levelDetails.partTarget || levelDetails.targetduration);\n    return Math.min(Math.max(min, syncPosition), max);\n  }\n  get drift() {\n    const {\n      levelDetails\n    } = this;\n    if (levelDetails === null) {\n      return 1;\n    }\n    return levelDetails.drift;\n  }\n  get edgeStalled() {\n    const {\n      levelDetails\n    } = this;\n    if (levelDetails === null) {\n      return 0;\n    }\n    const maxLevelUpdateAge = (this.config.lowLatencyMode && levelDetails.partTarget || levelDetails.targetduration) * 3;\n    return Math.max(levelDetails.age - maxLevelUpdateAge, 0);\n  }\n  get forwardBufferLength() {\n    const {\n      media,\n      levelDetails\n    } = this;\n    if (!media || !levelDetails) {\n      return 0;\n    }\n    const bufferedRanges = media.buffered.length;\n    return (bufferedRanges ? media.buffered.end(bufferedRanges - 1) : levelDetails.edge) - this.currentTime;\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.onMediaDetaching();\n    this.levelDetails = null;\n    this.hls = this.timeupdateHandler = null;\n  }\n  registerListeners() {\n    this.hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    this.hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    this.hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    this.hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    this.hls.on(Events.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    this.hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    this.hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    this.hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    this.hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    this.hls.off(Events.ERROR, this.onError, this);\n  }\n  onMediaAttached(event, data) {\n    this.media = data.media;\n    this.media.addEventListener(\"timeupdate\", this.timeupdateHandler);\n  }\n  onMediaDetaching() {\n    if (this.media) {\n      this.media.removeEventListener(\"timeupdate\", this.timeupdateHandler);\n      this.media = null;\n    }\n  }\n  onManifestLoading() {\n    this.levelDetails = null;\n    this._latency = null;\n    this.stallCount = 0;\n  }\n  onLevelUpdated(event, {\n    details\n  }) {\n    this.levelDetails = details;\n    if (details.advanced) {\n      this.timeupdate();\n    }\n    if (!details.live && this.media) {\n      this.media.removeEventListener(\"timeupdate\", this.timeupdateHandler);\n    }\n  }\n  onError(event, data) {\n    var _this$levelDetails;\n    if (data.details !== ErrorDetails.BUFFER_STALLED_ERROR) {\n      return;\n    }\n    this.stallCount++;\n    if ((_this$levelDetails = this.levelDetails) != null && _this$levelDetails.live) {\n      logger.warn(\"[playback-rate-controller]: Stall detected, adjusting target latency\");\n    }\n  }\n  timeupdate() {\n    const {\n      media,\n      levelDetails\n    } = this;\n    if (!media || !levelDetails) {\n      return;\n    }\n    this.currentTime = media.currentTime;\n    const latency = this.computeLatency();\n    if (latency === null) {\n      return;\n    }\n    this._latency = latency;\n    const {\n      lowLatencyMode,\n      maxLiveSyncPlaybackRate\n    } = this.config;\n    if (!lowLatencyMode || maxLiveSyncPlaybackRate === 1 || !levelDetails.live) {\n      return;\n    }\n    const targetLatency = this.targetLatency;\n    if (targetLatency === null) {\n      return;\n    }\n    const distanceFromTarget = latency - targetLatency;\n    const liveMinLatencyDuration = Math.min(this.maxLatency, targetLatency + levelDetails.targetduration);\n    const inLiveRange = distanceFromTarget < liveMinLatencyDuration;\n    if (inLiveRange && distanceFromTarget > 0.05 && this.forwardBufferLength > 1) {\n      const max = Math.min(2, Math.max(1, maxLiveSyncPlaybackRate));\n      const rate = Math.round(2 / (1 + Math.exp(-0.75 * distanceFromTarget - this.edgeStalled)) * 20) / 20;\n      media.playbackRate = Math.min(max, Math.max(1, rate));\n    } else if (media.playbackRate !== 1 && media.playbackRate !== 0) {\n      media.playbackRate = 1;\n    }\n  }\n  estimateLiveEdge() {\n    const {\n      levelDetails\n    } = this;\n    if (levelDetails === null) {\n      return null;\n    }\n    return levelDetails.edge + levelDetails.age;\n  }\n  computeLatency() {\n    const liveEdge = this.estimateLiveEdge();\n    if (liveEdge === null) {\n      return null;\n    }\n    return liveEdge - this.currentTime;\n  }\n}\nconst HdcpLevels = [\"NONE\", \"TYPE-0\", \"TYPE-1\", null];\nfunction isHdcpLevel(value) {\n  return HdcpLevels.indexOf(value) > -1;\n}\nconst VideoRangeValues = [\"SDR\", \"PQ\", \"HLG\"];\nfunction isVideoRange(value) {\n  return !!value && VideoRangeValues.indexOf(value) > -1;\n}\nvar HlsSkip = {\n  No: \"\",\n  Yes: \"YES\",\n  v2: \"v2\"\n};\nfunction getSkipValue(details, msn) {\n  const {\n    canSkipUntil,\n    canSkipDateRanges,\n    endSN\n  } = details;\n  const snChangeGoal = msn !== void 0 ? msn - endSN : 0;\n  if (canSkipUntil && snChangeGoal < canSkipUntil) {\n    if (canSkipDateRanges) {\n      return HlsSkip.v2;\n    }\n    return HlsSkip.Yes;\n  }\n  return HlsSkip.No;\n}\nclass HlsUrlParameters {\n  constructor(msn, part, skip) {\n    this.msn = void 0;\n    this.part = void 0;\n    this.skip = void 0;\n    this.msn = msn;\n    this.part = part;\n    this.skip = skip;\n  }\n  addDirectives(uri) {\n    const url = new self.URL(uri);\n    if (this.msn !== void 0) {\n      url.searchParams.set(\"_HLS_msn\", this.msn.toString());\n    }\n    if (this.part !== void 0) {\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}\nclass Level {\n  constructor(data) {\n    this._attrs = void 0;\n    this.audioCodec = void 0;\n    this.bitrate = void 0;\n    this.codecSet = void 0;\n    this.url = void 0;\n    this.frameRate = void 0;\n    this.height = void 0;\n    this.id = void 0;\n    this.name = void 0;\n    this.videoCodec = void 0;\n    this.width = void 0;\n    this.details = void 0;\n    this.fragmentError = 0;\n    this.loadError = 0;\n    this.loaded = void 0;\n    this.realBitrate = 0;\n    this.supportedPromise = void 0;\n    this.supportedResult = void 0;\n    this._avgBitrate = 0;\n    this._audioGroups = void 0;\n    this._subtitleGroups = void 0;\n    this._urlId = 0;\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].filter((c) => !!c).map((s) => s.substring(0, 4)).join(\",\");\n    this.addGroupId(\"audio\", data.attrs.AUDIO);\n    this.addGroupId(\"text\", data.attrs.SUBTITLES);\n  }\n  get maxBitrate() {\n    return Math.max(this.realBitrate, this.bitrate);\n  }\n  get averageBitrate() {\n    return this._avgBitrate || this.realBitrate || this.bitrate;\n  }\n  get attrs() {\n    return this._attrs[0];\n  }\n  get codecs() {\n    return this.attrs.CODECS || \"\";\n  }\n  get pathwayId() {\n    return this.attrs[\"PATHWAY-ID\"] || \".\";\n  }\n  get videoRange() {\n    return this.attrs[\"VIDEO-RANGE\"] || \"SDR\";\n  }\n  get score() {\n    return this.attrs.optionalFloat(\"SCORE\", 0);\n  }\n  get uri() {\n    return this.url[0] || \"\";\n  }\n  hasAudioGroup(groupId) {\n    return hasGroup(this._audioGroups, groupId);\n  }\n  hasSubtitleGroup(groupId) {\n    return hasGroup(this._subtitleGroups, groupId);\n  }\n  get audioGroups() {\n    return this._audioGroups;\n  }\n  get subtitleGroups() {\n    return this._subtitleGroups;\n  }\n  addGroupId(type, groupId) {\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  // Deprecated methods (retained for backwards compatibility)\n  get urlId() {\n    return 0;\n  }\n  set urlId(value) {\n  }\n  get audioGroupIds() {\n    return this.audioGroups ? [this.audioGroupId] : void 0;\n  }\n  get textGroupIds() {\n    return this.subtitleGroups ? [this.textGroupId] : void 0;\n  }\n  get audioGroupId() {\n    var _this$audioGroups;\n    return (_this$audioGroups = this.audioGroups) == null ? void 0 : _this$audioGroups[0];\n  }\n  get textGroupId() {\n    var _this$subtitleGroups;\n    return (_this$subtitleGroups = this.subtitleGroups) == null ? void 0 : _this$subtitleGroups[0];\n  }\n  addFallback() {\n  }\n}\nfunction hasGroup(groups, groupId) {\n  if (!groupId || !groups) {\n    return false;\n  }\n  return groups.indexOf(groupId) !== -1;\n}\nfunction updateFromToPTS(fragFrom, fragTo) {\n  const fragToPTS = fragTo.startPTS;\n  if (isFiniteNumber(fragToPTS)) {\n    let duration = 0;\n    let frag;\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.duration = duration;\n    }\n  } else if (fragTo.sn > fragFrom.sn) {\n    const contiguous = fragFrom.cc === fragTo.cc;\n    if (contiguous && fragFrom.minEndPTS) {\n      fragTo.start = fragFrom.start + (fragFrom.minEndPTS - fragFrom.start);\n    } else {\n      fragTo.start = fragFrom.start + fragFrom.duration;\n    }\n  } else {\n    fragTo.start = Math.max(fragFrom.start - fragTo.duration, 0);\n  }\n}\nfunction updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) {\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;\n  const fragEndPts = frag.endPTS;\n  if (isFiniteNumber(fragStartPts)) {\n    const deltaPTS = Math.abs(fragStartPts - startPTS);\n    if (!isFiniteNumber(frag.deltaPTS)) {\n      frag.deltaPTS = deltaPTS;\n    } else {\n      frag.deltaPTS = Math.max(deltaPTS, frag.deltaPTS);\n    }\n    maxStartPTS = Math.max(startPTS, fragStartPts);\n    startPTS = Math.min(startPTS, fragStartPts);\n    startDTS = Math.min(startDTS, frag.startDTS);\n    minEndPTS = Math.min(endPTS, fragEndPts);\n    endPTS = Math.max(endPTS, fragEndPts);\n    endDTS = Math.max(endDTS, frag.endDTS);\n  }\n  const drift = startPTS - frag.start;\n  if (frag.start !== 0) {\n    frag.start = startPTS;\n  }\n  frag.duration = 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  const sn = frag.sn;\n  if (!details || sn < details.startSN || sn > details.endSN) {\n    return 0;\n  }\n  let i;\n  const fragIdx = sn - details.startSN;\n  const fragments = details.fragments;\n  fragments[fragIdx] = frag;\n  for (i = fragIdx; i > 0; i--) {\n    updateFromToPTS(fragments[i], fragments[i - 1]);\n  }\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  details.PTSKnown = details.alignedSliding = true;\n  return drift;\n}\nfunction mergeDetails(oldDetails, newDetails) {\n  let currentInitSegment = 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  if (oldDetails.fragmentHint) {\n    delete oldDetails.fragmentHint.endPTS;\n  }\n  let ccOffset = 0;\n  let PTSFrag;\n  mapFragmentIntersection(oldDetails, newDetails, (oldFrag, newFrag) => {\n    if (oldFrag.relurl) {\n      ccOffset = oldFrag.cc - newFrag.cc;\n    }\n    if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {\n      newFrag.start = newFrag.startPTS = oldFrag.startPTS;\n      newFrag.startDTS = oldFrag.startDTS;\n      newFrag.maxStartPTS = oldFrag.maxStartPTS;\n      newFrag.endPTS = oldFrag.endPTS;\n      newFrag.endDTS = oldFrag.endDTS;\n      newFrag.minEndPTS = oldFrag.minEndPTS;\n      newFrag.duration = oldFrag.endPTS - oldFrag.startPTS;\n      if (newFrag.duration) {\n        PTSFrag = newFrag;\n      }\n      newDetails.PTSKnown = newDetails.alignedSliding = true;\n    }\n    newFrag.elementaryStreams = oldFrag.elementaryStreams;\n    newFrag.loader = oldFrag.loader;\n    newFrag.stats = oldFrag.stats;\n    if (oldFrag.initSegment) {\n      newFrag.initSegment = oldFrag.initSegment;\n      currentInitSegment = oldFrag.initSegment;\n    }\n  });\n  if (currentInitSegment) {\n    const fragmentsToCheck = newDetails.fragmentHint ? newDetails.fragments.concat(newDetails.fragmentHint) : newDetails.fragments;\n    fragmentsToCheck.forEach((frag) => {\n      var _currentInitSegment;\n      if (frag && (!frag.initSegment || frag.initSegment.relurl === ((_currentInitSegment = currentInitSegment) == null ? void 0 : _currentInitSegment.relurl))) {\n        frag.initSegment = currentInitSegment;\n      }\n    });\n  }\n  if (newDetails.skippedSegments) {\n    newDetails.deltaUpdateFailed = newDetails.fragments.some((frag) => !frag);\n    if (newDetails.deltaUpdateFailed) {\n      logger.warn(\"[level-helper] Previous playlist missing segments skipped in delta playlist\");\n      for (let i = newDetails.skippedSegments; i--; ) {\n        newDetails.fragments.shift();\n      }\n      newDetails.startSN = newDetails.fragments[0].sn;\n      newDetails.startCC = newDetails.fragments[0].cc;\n    } else if (newDetails.canSkipDateRanges) {\n      newDetails.dateRanges = mergeDateRanges(oldDetails.dateRanges, newDetails.dateRanges, newDetails.recentlyRemovedDateranges);\n    }\n  }\n  const newFragments = newDetails.fragments;\n  if (ccOffset) {\n    logger.warn(\"discontinuity sliding from playlist, take drift into account\");\n    for (let i = 0; i < newFragments.length; i++) {\n      newFragments[i].cc += ccOffset;\n    }\n  }\n  if (newDetails.skippedSegments) {\n    newDetails.startCC = newDetails.fragments[0].cc;\n  }\n  mapPartIntersection(oldDetails.partList, newDetails.partList, (oldPart, newPart) => {\n    newPart.elementaryStreams = oldPart.elementaryStreams;\n    newPart.stats = oldPart.stats;\n  });\n  if (PTSFrag) {\n    updateFragPTSDTS(newDetails, PTSFrag, PTSFrag.startPTS, PTSFrag.endPTS, PTSFrag.startDTS, PTSFrag.endDTS);\n  } else {\n    adjustSliding(oldDetails, newDetails);\n  }\n  if (newFragments.length) {\n    newDetails.totalduration = newDetails.edge - newFragments[0].start;\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}\nfunction mergeDateRanges(oldDateRanges, deltaDateRanges, recentlyRemovedDateranges) {\n  const dateRanges = _extends({}, oldDateRanges);\n  if (recentlyRemovedDateranges) {\n    recentlyRemovedDateranges.forEach((id) => {\n      delete dateRanges[id];\n    });\n  }\n  Object.keys(deltaDateRanges).forEach((id) => {\n    const dateRange = new DateRange(deltaDateRanges[id].attr, dateRanges[id]);\n    if (dateRange.isValid) {\n      dateRanges[id] = dateRange;\n    } else {\n      logger.warn(`Ignoring invalid Playlist Delta Update DATERANGE tag: \"${JSON.stringify(deltaDateRanges[id].attr)}\"`);\n    }\n  });\n  return dateRanges;\n}\nfunction mapPartIntersection(oldParts, newParts, intersectionFn) {\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 (oldPart && newPart && oldPart.index === newPart.index && oldPart.fragment.sn === newPart.fragment.sn) {\n        intersectionFn(oldPart, newPart);\n      } else {\n        delta--;\n      }\n    }\n  }\n}\nfunction mapFragmentIntersection(oldDetails, newDetails, intersectionFn) {\n  const skippedSegments = newDetails.skippedSegments;\n  const start = Math.max(oldDetails.startSN, newDetails.startSN) - newDetails.startSN;\n  const end = (oldDetails.fragmentHint ? 1 : 0) + (skippedSegments ? newDetails.endSN : Math.min(oldDetails.endSN, newDetails.endSN)) - newDetails.startSN;\n  const delta = newDetails.startSN - oldDetails.startSN;\n  const newFrags = newDetails.fragmentHint ? newDetails.fragments.concat(newDetails.fragmentHint) : newDetails.fragments;\n  const oldFrags = oldDetails.fragmentHint ? oldDetails.fragments.concat(oldDetails.fragmentHint) : oldDetails.fragments;\n  for (let i = start; i <= end; i++) {\n    const oldFrag = oldFrags[delta + i];\n    let newFrag = newFrags[i];\n    if (skippedSegments && !newFrag && i < skippedSegments) {\n      newFrag = newDetails.fragments[i] = oldFrag;\n    }\n    if (oldFrag && newFrag) {\n      intersectionFn(oldFrag, newFrag);\n    }\n  }\n}\nfunction adjustSliding(oldDetails, newDetails) {\n  const delta = newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN;\n  const oldFragments = oldDetails.fragments;\n  if (delta < 0 || delta >= oldFragments.length) {\n    return;\n  }\n  addSliding(newDetails, oldFragments[delta].start);\n}\nfunction addSliding(details, start) {\n  if (start) {\n    const fragments = details.fragments;\n    for (let i = details.skippedSegments; i < fragments.length; i++) {\n      fragments[i].start += start;\n    }\n    if (details.fragmentHint) {\n      details.fragmentHint.start += start;\n    }\n  }\n}\nfunction computeReloadInterval(newDetails, distanceToLiveEdgeMs = Infinity) {\n  let reloadInterval = 1e3 * newDetails.targetduration;\n  if (newDetails.updated) {\n    const fragments = newDetails.fragments;\n    const liveEdgeMaxTargetDurations = 4;\n    if (fragments.length && reloadInterval * liveEdgeMaxTargetDurations > distanceToLiveEdgeMs) {\n      const lastSegmentDuration = fragments[fragments.length - 1].duration * 1e3;\n      if (lastSegmentDuration < reloadInterval) {\n        reloadInterval = lastSegmentDuration;\n      }\n    }\n  } else {\n    reloadInterval /= 2;\n  }\n  return Math.round(reloadInterval);\n}\nfunction getFragmentWithSN(level, sn, fragCurrent) {\n  if (!(level != null && level.details)) {\n    return null;\n  }\n  const levelDetails = level.details;\n  let fragment = levelDetails.fragments[sn - levelDetails.startSN];\n  if (fragment) {\n    return fragment;\n  }\n  fragment = levelDetails.fragmentHint;\n  if (fragment && fragment.sn === sn) {\n    return fragment;\n  }\n  if (sn < levelDetails.startSN && fragCurrent && fragCurrent.sn === sn) {\n    return fragCurrent;\n  }\n  return null;\n}\nfunction getPartWith(level, sn, partIndex) {\n  var _level$details;\n  if (!(level != null && level.details)) {\n    return null;\n  }\n  return findPart((_level$details = level.details) == null ? void 0 : _level$details.partList, sn, partIndex);\n}\nfunction findPart(partList, sn, partIndex) {\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}\nfunction reassignFragmentLevelIndexes(levels) {\n  levels.forEach((level, index) => {\n    const {\n      details\n    } = level;\n    if (details != null && details.fragments) {\n      details.fragments.forEach((fragment) => {\n        fragment.level = index;\n      });\n    }\n  });\n}\nfunction isTimeoutError(error) {\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}\nfunction getRetryConfig(loadPolicy, error) {\n  const isTimeout = isTimeoutError(error);\n  return loadPolicy.default[`${isTimeout ? \"timeout\" : \"error\"}Retry`];\n}\nfunction getRetryDelay(retryConfig, retryCount) {\n  const backoffFactor = retryConfig.backoff === \"linear\" ? 1 : Math.pow(2, retryCount);\n  return Math.min(backoffFactor * retryConfig.retryDelayMs, retryConfig.maxRetryDelayMs);\n}\nfunction getLoaderConfigWithoutReties(loderConfig) {\n  return _objectSpread2(_objectSpread2({}, loderConfig), {\n    errorRetry: null,\n    timeoutRetry: null\n  });\n}\nfunction shouldRetry(retryConfig, retryCount, isTimeout, loaderResponse) {\n  if (!retryConfig) {\n    return false;\n  }\n  const httpStatus = loaderResponse == null ? void 0 : loaderResponse.code;\n  const retry = retryCount < retryConfig.maxNumRetry && (retryForHttpStatus(httpStatus) || !!isTimeout);\n  return retryConfig.shouldRetry ? retryConfig.shouldRetry(retryConfig, retryCount, isTimeout, loaderResponse, retry) : retry;\n}\nfunction retryForHttpStatus(httpStatus) {\n  return httpStatus === 0 && navigator.onLine === false || !!httpStatus && (httpStatus < 400 || httpStatus > 499);\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(list, comparisonFn) {\n    let minIndex = 0;\n    let maxIndex = list.length - 1;\n    let currentIndex = null;\n    let currentElement = null;\n    while (minIndex <= maxIndex) {\n      currentIndex = (minIndex + maxIndex) / 2 | 0;\n      currentElement = list[currentIndex];\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    return null;\n  }\n};\nfunction findFragmentByPDT(fragments, PDTValue, maxFragLookUpTolerance) {\n  if (PDTValue === null || !Array.isArray(fragments) || !fragments.length || !isFiniteNumber(PDTValue)) {\n    return null;\n  }\n  const startPDT = fragments[0].programDateTime;\n  if (PDTValue < (startPDT || 0)) {\n    return null;\n  }\n  const endPDT = fragments[fragments.length - 1].endProgramDateTime;\n  if (PDTValue >= (endPDT || 0)) {\n    return null;\n  }\n  maxFragLookUpTolerance = maxFragLookUpTolerance || 0;\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  return null;\n}\nfunction findFragmentByPTS(fragPrevious, fragments, bufferEnd = 0, maxFragLookUpTolerance = 0) {\n  let fragNext = null;\n  if (fragPrevious) {\n    fragNext = fragments[fragPrevious.sn - fragments[0].sn + 1] || null;\n    const bufferEdgeError = fragPrevious.endDTS - bufferEnd;\n    if (bufferEdgeError > 0 && bufferEdgeError < 15e-7) {\n      bufferEnd += 15e-7;\n    }\n  } else if (bufferEnd === 0 && fragments[0].start === 0) {\n    fragNext = fragments[0];\n  }\n  if (fragNext && (!fragPrevious || fragPrevious.level === fragNext.level) && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0) {\n    return fragNext;\n  }\n  const foundFragment = BinarySearch.search(fragments, fragmentWithinToleranceTest.bind(null, bufferEnd, maxFragLookUpTolerance));\n  if (foundFragment && (foundFragment !== fragPrevious || !fragNext)) {\n    return foundFragment;\n  }\n  return fragNext;\n}\nfunction fragmentWithinToleranceTest(bufferEnd = 0, maxFragLookUpTolerance = 0, candidate) {\n  if (candidate.start <= bufferEnd && candidate.start + candidate.duration > bufferEnd) {\n    return 0;\n  }\n  const candidateLookupTolerance = Math.min(maxFragLookUpTolerance, candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0));\n  if (candidate.start + candidate.duration - candidateLookupTolerance <= bufferEnd) {\n    return 1;\n  } else if (candidate.start - candidateLookupTolerance > bufferEnd && candidate.start) {\n    return -1;\n  }\n  return 0;\n}\nfunction pdtWithinToleranceTest(pdtBufferEnd, maxFragLookUpTolerance, candidate) {\n  const candidateLookupTolerance = Math.min(maxFragLookUpTolerance, candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0)) * 1e3;\n  const endProgramDateTime = candidate.endProgramDateTime || 0;\n  return endProgramDateTime - candidateLookupTolerance > pdtBufferEnd;\n}\nfunction findFragWithCC(fragments, cc) {\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}\nvar NetworkErrorAction = {\n  DoNothing: 0,\n  SendEndCallback: 1,\n  SendAlternateToPenaltyBox: 2,\n  RemoveAlternatePermanently: 3,\n  InsertDiscontinuity: 4,\n  RetryRequest: 5\n};\nvar ErrorActionFlags = {\n  None: 0,\n  MoveAllAlternatesMatchingHost: 1,\n  MoveAllAlternatesMatchingHDCP: 2,\n  SwitchToSDR: 4\n};\nclass ErrorController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.playlistError = 0;\n    this.penalizedRenditions = {};\n    this.log = void 0;\n    this.warn = void 0;\n    this.error = void 0;\n    this.hls = hls;\n    this.log = logger.log.bind(logger, `[info]:`);\n    this.warn = logger.warn.bind(logger, `[warning]:`);\n    this.error = logger.error.bind(logger, `[error]:`);\n    this.registerListeners();\n  }\n  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  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  destroy() {\n    this.unregisterListeners();\n    this.hls = null;\n    this.penalizedRenditions = {};\n  }\n  startLoad(startPosition) {\n  }\n  stopLoad() {\n    this.playlistError = 0;\n  }\n  getVariantLevelIndex(frag) {\n    return (frag == null ? void 0 : frag.type) === PlaylistLevelType.MAIN ? frag.level : this.hls.loadLevel;\n  }\n  onManifestLoading() {\n    this.playlistError = 0;\n    this.penalizedRenditions = {};\n  }\n  onLevelUpdated() {\n    this.playlistError = 0;\n  }\n  onError(event, data) {\n    var _data$frag, _data$level;\n    if (data.fatal) {\n      return;\n    }\n    const hls = this.hls;\n    const context = data.context;\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        if ((_data$frag = data.frag) != null && _data$frag.gap) {\n          data.errorAction = {\n            action: NetworkErrorAction.DoNothing,\n            flags: ErrorActionFlags.None\n          };\n          return;\n        }\n      case ErrorDetails.FRAG_GAP:\n      case ErrorDetails.FRAG_DECRYPT_ERROR: {\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          var _data$context, _data$context$levelDe;\n          const levelIndex = data.parent === PlaylistLevelType.MAIN ? data.level : hls.loadLevel;\n          if (data.details === ErrorDetails.LEVEL_EMPTY_ERROR && !!((_data$context = data.context) != null && (_data$context$levelDe = _data$context.levelDetails) != null && _data$context$levelDe.live)) {\n            data.errorAction = this.getPlaylistRetryOrSwitchAction(data, levelIndex);\n          } else {\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 == null ? void 0 : context.level) === \"number\") {\n          data.errorAction = this.getPlaylistRetryOrSwitchAction(data, context.level);\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.levels[hls.loadLevel];\n          if (level && (context.type === PlaylistContextType.AUDIO_TRACK && level.hasAudioGroup(context.groupId) || context.type === PlaylistContextType.SUBTITLE_TRACK && level.hasSubtitleGroup(context.groupId))) {\n            data.errorAction = this.getPlaylistRetryOrSwitchAction(data, hls.loadLevel);\n            data.errorAction.action = NetworkErrorAction.SendAlternateToPenaltyBox;\n            data.errorAction.flags = ErrorActionFlags.MoveAllAlternatesMatchingHost;\n            return;\n          }\n        }\n        return;\n      case ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:\n        {\n          const level = hls.levels[hls.loadLevel];\n          const restrictedHdcpLevel = level == null ? void 0 : level.attrs[\"HDCP-LEVEL\"];\n          if (restrictedHdcpLevel) {\n            data.errorAction = {\n              action: NetworkErrorAction.SendAlternateToPenaltyBox,\n              flags: ErrorActionFlags.MoveAllAlternatesMatchingHDCP,\n              hdcpLevel: restrictedHdcpLevel\n            };\n          } else {\n            this.keySystemError(data);\n          }\n        }\n        return;\n      case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n      case ErrorDetails.REMUX_ALLOC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        data.errorAction = this.getLevelSwitchAction(data, (_data$level = data.level) != null ? _data$level : hls.loadLevel);\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 = {\n          action: NetworkErrorAction.DoNothing,\n          flags: ErrorActionFlags.None\n        };\n        return;\n    }\n    if (data.type === ErrorTypes.KEY_SYSTEM_ERROR) {\n      this.keySystemError(data);\n    }\n  }\n  keySystemError(data) {\n    const levelIndex = this.getVariantLevelIndex(data.frag);\n    data.levelRetry = false;\n    data.errorAction = this.getLevelSwitchAction(data, levelIndex);\n  }\n  getPlaylistRetryOrSwitchAction(data, levelIndex) {\n    const hls = this.hls;\n    const retryConfig = getRetryConfig(hls.config.playlistLoadPolicy, data);\n    const retryCount = this.playlistError++;\n    const retry = shouldRetry(retryConfig, retryCount, isTimeoutError(data), data.response);\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  getFragRetryOrSwitchAction(data) {\n    const hls = this.hls;\n    const variantLevelIndex = this.getVariantLevelIndex(data.frag);\n    const level = hls.levels[variantLevelIndex];\n    const {\n      fragLoadPolicy,\n      keyLoadPolicy\n    } = hls.config;\n    const retryConfig = getRetryConfig(data.details.startsWith(\"key\") ? keyLoadPolicy : fragLoadPolicy, data);\n    const fragmentErrors = hls.levels.reduce((acc, level2) => acc + level2.fragmentError, 0);\n    if (level) {\n      if (data.details !== ErrorDetails.FRAG_GAP) {\n        level.fragmentError++;\n      }\n      const retry = shouldRetry(retryConfig, fragmentErrors, isTimeoutError(data), data.response);\n      if (retry) {\n        return {\n          action: NetworkErrorAction.RetryRequest,\n          flags: ErrorActionFlags.None,\n          retryConfig,\n          retryCount: fragmentErrors\n        };\n      }\n    }\n    const errorAction = this.getLevelSwitchAction(data, variantLevelIndex);\n    if (retryConfig) {\n      errorAction.retryConfig = retryConfig;\n      errorAction.retryCount = fragmentErrors;\n    }\n    return errorAction;\n  }\n  getLevelSwitchAction(data, levelIndex) {\n    const hls = this.hls;\n    if (levelIndex === null || levelIndex === void 0) {\n      levelIndex = hls.loadLevel;\n    }\n    const level = this.hls.levels[levelIndex];\n    if (level) {\n      var _data$frag2, _data$context2;\n      const errorDetails = data.details;\n      level.loadError++;\n      if (errorDetails === ErrorDetails.BUFFER_APPEND_ERROR) {\n        level.fragmentError++;\n      }\n      let nextLevel = -1;\n      const {\n        levels,\n        loadLevel,\n        minAutoLevel,\n        maxAutoLevel\n      } = hls;\n      if (!hls.autoLevelEnabled) {\n        hls.loadLevel = -1;\n      }\n      const fragErrorType = (_data$frag2 = data.frag) == null ? void 0 : _data$frag2.type;\n      const isAudioCodecError = fragErrorType === PlaylistLevelType.AUDIO && errorDetails === ErrorDetails.FRAG_PARSING_ERROR || data.sourceBufferName === \"audio\" && (errorDetails === ErrorDetails.BUFFER_ADD_CODEC_ERROR || errorDetails === ErrorDetails.BUFFER_APPEND_ERROR);\n      const findAudioCodecAlternate = isAudioCodecError && levels.some(({\n        audioCodec\n      }) => level.audioCodec !== audioCodec);\n      const isVideoCodecError = data.sourceBufferName === \"video\" && (errorDetails === ErrorDetails.BUFFER_ADD_CODEC_ERROR || errorDetails === ErrorDetails.BUFFER_APPEND_ERROR);\n      const findVideoCodecAlternate = isVideoCodecError && levels.some(({\n        codecSet,\n        audioCodec\n      }) => level.codecSet !== codecSet && level.audioCodec === audioCodec);\n      const {\n        type: playlistErrorType,\n        groupId: playlistErrorGroupId\n      } = (_data$context2 = data.context) != null ? _data$context2 : {};\n      for (let i = levels.length; i--; ) {\n        const candidate = (i + loadLevel) % levels.length;\n        if (candidate !== loadLevel && candidate >= minAutoLevel && candidate <= maxAutoLevel && levels[candidate].loadError === 0) {\n          var _level$audioGroups, _level$subtitleGroups;\n          const levelCandidate = levels[candidate];\n          if (errorDetails === ErrorDetails.FRAG_GAP && data.frag) {\n            const levelDetails = levels[candidate].details;\n            if (levelDetails) {\n              const fragCandidate = findFragmentByPTS(data.frag, levelDetails.fragments, data.frag.start);\n              if (fragCandidate != null && fragCandidate.gap) {\n                continue;\n              }\n            }\n          } else if (playlistErrorType === PlaylistContextType.AUDIO_TRACK && levelCandidate.hasAudioGroup(playlistErrorGroupId) || playlistErrorType === PlaylistContextType.SUBTITLE_TRACK && levelCandidate.hasSubtitleGroup(playlistErrorGroupId)) {\n            continue;\n          } else if (fragErrorType === PlaylistLevelType.AUDIO && (_level$audioGroups = level.audioGroups) != null && _level$audioGroups.some((groupId) => levelCandidate.hasAudioGroup(groupId)) || fragErrorType === PlaylistLevelType.SUBTITLE && (_level$subtitleGroups = level.subtitleGroups) != null && _level$subtitleGroups.some((groupId) => levelCandidate.hasSubtitleGroup(groupId)) || findAudioCodecAlternate && level.audioCodec === levelCandidate.audioCodec || !findAudioCodecAlternate && level.audioCodec !== levelCandidate.audioCodec || findVideoCodecAlternate && level.codecSet === levelCandidate.codecSet) {\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    return {\n      action: NetworkErrorAction.SendAlternateToPenaltyBox,\n      flags: ErrorActionFlags.MoveAllAlternatesMatchingHost\n    };\n  }\n  onErrorOut(event, data) {\n    var _data$errorAction;\n    switch ((_data$errorAction = data.errorAction) == null ? void 0 : _data$errorAction.action) {\n      case NetworkErrorAction.DoNothing:\n        break;\n      case NetworkErrorAction.SendAlternateToPenaltyBox:\n        this.sendAlternateToPenaltyBox(data);\n        if (!data.errorAction.resolved && data.details !== ErrorDetails.FRAG_GAP) {\n          data.fatal = true;\n        } else if (/MediaSource readyState: ended/.test(data.error.message)) {\n          this.warn(`MediaSource ended after \"${data.sourceBufferName}\" sourceBuffer append error. Attempting to recover from media error.`);\n          this.hls.recoverMediaError();\n        }\n        break;\n    }\n    if (data.fatal) {\n      this.hls.stopLoad();\n      return;\n    }\n  }\n  sendAlternateToPenaltyBox(data) {\n    const hls = this.hls;\n    const errorAction = data.errorAction;\n    if (!errorAction) {\n      return;\n    }\n    const {\n      flags,\n      hdcpLevel,\n      nextAutoLevel\n    } = errorAction;\n    switch (flags) {\n      case ErrorActionFlags.None:\n        this.switchLevel(data, nextAutoLevel);\n        break;\n      case ErrorActionFlags.MoveAllAlternatesMatchingHDCP:\n        if (hdcpLevel) {\n          hls.maxHdcpLevel = HdcpLevels[HdcpLevels.indexOf(hdcpLevel) - 1];\n          errorAction.resolved = true;\n        }\n        this.warn(`Restricting playback to HDCP-LEVEL of \"${hls.maxHdcpLevel}\" or lower`);\n        break;\n    }\n    if (!errorAction.resolved) {\n      this.switchLevel(data, nextAutoLevel);\n    }\n  }\n  switchLevel(data, levelIndex) {\n    if (levelIndex !== void 0 && data.errorAction) {\n      this.warn(`switching to level ${levelIndex} after ${data.details}`);\n      this.hls.nextAutoLevel = levelIndex;\n      data.errorAction.resolved = true;\n      this.hls.nextLoadLevel = this.hls.nextAutoLevel;\n    }\n  }\n}\nclass BasePlaylistController {\n  constructor(hls, logPrefix) {\n    this.hls = void 0;\n    this.timer = -1;\n    this.requestScheduled = -1;\n    this.canLoad = false;\n    this.log = void 0;\n    this.warn = void 0;\n    this.log = logger.log.bind(logger, `${logPrefix}:`);\n    this.warn = logger.warn.bind(logger, `${logPrefix}:`);\n    this.hls = hls;\n  }\n  destroy() {\n    this.clearTimer();\n    this.hls = this.log = this.warn = null;\n  }\n  clearTimer() {\n    if (this.timer !== -1) {\n      self.clearTimeout(this.timer);\n      this.timer = -1;\n    }\n  }\n  startLoad() {\n    this.canLoad = true;\n    this.requestScheduled = -1;\n    this.loadPlaylist();\n  }\n  stopLoad() {\n    this.canLoad = false;\n    this.clearTimer();\n  }\n  switchParams(playlistUri, previous) {\n    const renditionReports = previous == null ? void 0 : 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;\n        try {\n          uri = new self.URL(attr.URI, previous.url).href;\n        } catch (error) {\n          logger.warn(`Could not construct new URL for Rendition Report: ${error}`);\n          uri = attr.URI || \"\";\n        }\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 == null ? void 0 : previous.lastPartSn);\n        let part = parseInt(attr[\"LAST-PART\"]) || (previous == null ? void 0 : previous.lastPartIndex);\n        if (this.hls.config.lowLatencyMode) {\n          const currentGoal = Math.min(previous.age - previous.partTarget, previous.targetduration);\n          if (part >= 0 && currentGoal > previous.partTarget) {\n            part += 1;\n          }\n        }\n        return new HlsUrlParameters(msn, part >= 0 ? part : void 0, HlsSkip.No);\n      }\n    }\n  }\n  loadPlaylist(hlsUrlParameters) {\n    if (this.requestScheduled === -1) {\n      this.requestScheduled = self.performance.now();\n    }\n  }\n  shouldLoadPlaylist(playlist) {\n    return this.canLoad && !!playlist && !!playlist.url && (!playlist.details || playlist.details.live);\n  }\n  shouldReloadPlaylist(playlist) {\n    return this.timer === -1 && this.requestScheduled === -1 && this.shouldLoadPlaylist(playlist);\n  }\n  playlistLoaded(index, data, previousDetails) {\n    const {\n      details,\n      stats\n    } = data;\n    const now2 = self.performance.now();\n    const elapsed = stats.loading.first ? Math.max(0, now2 - stats.loading.first) : 0;\n    details.advancedDateTime = Date.now() - elapsed;\n    if (details.live || previousDetails != null && previousDetails.live) {\n      details.reloaded(previousDetails);\n      if (previousDetails) {\n        this.log(`live playlist ${index} ${details.advanced ? \"REFRESHED \" + details.lastPartSn + \"-\" + details.lastPartIndex : details.updated ? \"UPDATED\" : \"MISSED\"}`);\n      }\n      if (previousDetails && details.fragments.length > 0) {\n        mergeDetails(previousDetails, details);\n      }\n      if (!this.canLoad || !details.live) {\n        return;\n      }\n      let deliveryDirectives;\n      let msn = void 0;\n      let part = void 0;\n      if (details.canBlockReload && details.endSN && details.advanced) {\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 lastPart = lastPartSn === endSn;\n        const nextSnStartIndex = lowLatencyMode ? 0 : lastPartIndex;\n        if (hasParts) {\n          msn = lastPart ? endSn + 1 : lastPartSn;\n          part = lastPart ? nextSnStartIndex : lastPartIndex + 1;\n        } else {\n          msn = endSn + 1;\n        }\n        const lastAdvanced = details.age;\n        const cdnAge = lastAdvanced + details.ageHeader;\n        let currentGoal = Math.min(cdnAge - details.partTarget, details.targetduration * 1.5);\n        if (currentGoal > 0) {\n          if (previousDetails && currentGoal > previousDetails.tuneInGoal) {\n            this.warn(`CDN Tune-in goal increased from: ${previousDetails.tuneInGoal} to: ${currentGoal} with playlist age: ${details.age}`);\n            currentGoal = 0;\n          } else {\n            const segments = Math.floor(currentGoal / details.targetduration);\n            msn += segments;\n            if (part !== void 0) {\n              const parts = Math.round(currentGoal % details.targetduration / details.partTarget);\n              part += parts;\n            }\n            this.log(`CDN Tune-in age: ${details.ageHeader}s last advanced ${lastAdvanced.toFixed(2)}s goal: ${currentGoal} skip sn ${segments} to part ${part}`);\n          }\n          details.tuneInGoal = currentGoal;\n        }\n        deliveryDirectives = this.getDeliveryDirectives(details, data.deliveryDirectives, msn, part);\n        if (lowLatencyMode || !lastPart) {\n          this.loadPlaylist(deliveryDirectives);\n          return;\n        }\n      } else if (details.canBlockReload || details.canSkipUntil) {\n        deliveryDirectives = this.getDeliveryDirectives(details, data.deliveryDirectives, msn, part);\n      }\n      const bufferInfo = this.hls.mainForwardBufferInfo;\n      const position = bufferInfo ? bufferInfo.end - bufferInfo.len : 0;\n      const distanceToLiveEdgeMs = (details.edge - position) * 1e3;\n      const reloadInterval = computeReloadInterval(details, distanceToLiveEdgeMs);\n      if (details.updated && now2 > this.requestScheduled + reloadInterval) {\n        this.requestScheduled = stats.loading.start;\n      }\n      if (msn !== void 0 && details.canBlockReload) {\n        this.requestScheduled = stats.loading.first + reloadInterval - (details.partTarget * 1e3 || 1e3);\n      } else if (this.requestScheduled === -1 || this.requestScheduled + reloadInterval < now2) {\n        this.requestScheduled = now2;\n      } else if (this.requestScheduled - now2 <= 0) {\n        this.requestScheduled += reloadInterval;\n      }\n      let estimatedTimeUntilUpdate = this.requestScheduled - now2;\n      estimatedTimeUntilUpdate = Math.max(0, estimatedTimeUntilUpdate);\n      this.log(`reload live playlist ${index} in ${Math.round(estimatedTimeUntilUpdate)} ms`);\n      this.timer = self.setTimeout(() => this.loadPlaylist(deliveryDirectives), estimatedTimeUntilUpdate);\n    } else {\n      this.clearTimer();\n    }\n  }\n  getDeliveryDirectives(details, previousDeliveryDirectives, msn, part) {\n    let skip = getSkipValue(details, msn);\n    if (previousDeliveryDirectives != null && 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  checkRetry(errorEvent) {\n    const errorDetails = errorEvent.details;\n    const isTimeout = isTimeoutError(errorEvent);\n    const errorAction = errorEvent.errorAction;\n    const {\n      action,\n      retryCount = 0,\n      retryConfig\n    } = errorAction || {};\n    const retry = !!errorAction && !!retryConfig && (action === NetworkErrorAction.RetryRequest || !errorAction.resolved && action === NetworkErrorAction.SendAlternateToPenaltyBox);\n    if (retry) {\n      var _errorEvent$context;\n      this.requestScheduled = -1;\n      if (retryCount >= retryConfig.maxNumRetry) {\n        return false;\n      }\n      if (isTimeout && (_errorEvent$context = errorEvent.context) != null && _errorEvent$context.deliveryDirectives) {\n        this.warn(`Retrying playlist loading ${retryCount + 1}/${retryConfig.maxNumRetry} after \"${errorDetails}\" without delivery-directives`);\n        this.loadPlaylist();\n      } else {\n        const delay = getRetryDelay(retryConfig, retryCount);\n        this.timer = self.setTimeout(() => this.loadPlaylist(), delay);\n        this.warn(`Retrying playlist loading ${retryCount + 1}/${retryConfig.maxNumRetry} after \"${errorDetails}\" in ${delay}ms`);\n      }\n      errorEvent.levelRetry = true;\n      errorAction.resolved = true;\n    }\n    return retry;\n  }\n}\nclass EWMA {\n  //  About half of the estimated value will be from the last |halfLife| samples by weight.\n  constructor(halfLife, estimate = 0, weight = 0) {\n    this.halfLife = void 0;\n    this.alpha_ = void 0;\n    this.estimate_ = void 0;\n    this.totalWeight_ = void 0;\n    this.halfLife = halfLife;\n    this.alpha_ = halfLife ? Math.exp(Math.log(0.5) / halfLife) : 0;\n    this.estimate_ = estimate;\n    this.totalWeight_ = weight;\n  }\n  sample(weight, value) {\n    const adjAlpha = Math.pow(this.alpha_, weight);\n    this.estimate_ = value * (1 - adjAlpha) + adjAlpha * this.estimate_;\n    this.totalWeight_ += weight;\n  }\n  getTotalWeight() {\n    return this.totalWeight_;\n  }\n  getEstimate() {\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}\nclass EwmaBandWidthEstimator {\n  constructor(slow, fast, defaultEstimate, defaultTTFB = 100) {\n    this.defaultEstimate_ = void 0;\n    this.minWeight_ = void 0;\n    this.minDelayMs_ = void 0;\n    this.slow_ = void 0;\n    this.fast_ = void 0;\n    this.defaultTTFB_ = void 0;\n    this.ttfb_ = void 0;\n    this.defaultEstimate_ = defaultEstimate;\n    this.minWeight_ = 1e-3;\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  update(slow, fast) {\n    const {\n      slow_,\n      fast_,\n      ttfb_\n    } = 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  sample(durationMs, numBytes) {\n    durationMs = Math.max(durationMs, this.minDelayMs_);\n    const numBits = 8 * numBytes;\n    const durationS = durationMs / 1e3;\n    const bandwidthInBps = numBits / durationS;\n    this.fast_.sample(durationS, bandwidthInBps);\n    this.slow_.sample(durationS, bandwidthInBps);\n  }\n  sampleTTFB(ttfb) {\n    const seconds = ttfb / 1e3;\n    const weight = Math.sqrt(2) * Math.exp(-Math.pow(seconds, 2) / 2);\n    this.ttfb_.sample(weight, Math.max(ttfb, 5));\n  }\n  canEstimate() {\n    return this.fast_.getTotalWeight() >= this.minWeight_;\n  }\n  getEstimate() {\n    if (this.canEstimate()) {\n      return Math.min(this.fast_.getEstimate(), this.slow_.getEstimate());\n    } else {\n      return this.defaultEstimate_;\n    }\n  }\n  getEstimateTTFB() {\n    if (this.ttfb_.getTotalWeight() >= this.minWeight_) {\n      return this.ttfb_.getEstimate();\n    } else {\n      return this.defaultTTFB_;\n    }\n  }\n  destroy() {\n  }\n}\nconst SUPPORTED_INFO_DEFAULT = {\n  supported: true,\n  configurations: [],\n  decodingInfoResults: [{\n    supported: true,\n    powerEfficient: true,\n    smooth: true\n  }]\n};\nconst SUPPORTED_INFO_CACHE = {};\nfunction requiresMediaCapabilitiesDecodingInfo(level, audioTracksByGroup, currentVideoRange, currentFrameRate, currentBw, audioPreference) {\n  const audioGroups = level.audioCodec ? level.audioGroups : null;\n  const audioCodecPreference = audioPreference == null ? void 0 : audioPreference.audioCodec;\n  const channelsPreference = audioPreference == null ? void 0 : audioPreference.channels;\n  const maxChannels = channelsPreference ? parseInt(channelsPreference) : audioCodecPreference ? Infinity : 2;\n  let audioChannels = null;\n  if (audioGroups != null && audioGroups.length) {\n    try {\n      if (audioGroups.length === 1 && audioGroups[0]) {\n        audioChannels = audioTracksByGroup.groups[audioGroups[0]].channels;\n      } else {\n        audioChannels = audioGroups.reduce((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            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 level.videoCodec !== void 0 && (level.width > 1920 && level.height > 1088 || level.height > 1920 && level.width > 1088 || level.frameRate > Math.max(currentFrameRate, 30) || level.videoRange !== \"SDR\" && level.videoRange !== currentVideoRange || level.bitrate > Math.max(currentBw, 8e6)) || !!audioChannels && isFiniteNumber(maxChannels) && Object.keys(audioChannels).some((channels) => parseInt(channels) > maxChannels);\n}\nfunction getMediaDecodingInfoPromise(level, audioTracksByGroup, mediaCapabilities) {\n  const videoCodecs = level.videoCodec;\n  const audioCodecs = level.audioCodec;\n  if (!videoCodecs || !audioCodecs || !mediaCapabilities) {\n    return Promise.resolve(SUPPORTED_INFO_DEFAULT);\n  }\n  const baseVideoConfiguration = {\n    width: level.width,\n    height: level.height,\n    bitrate: Math.ceil(Math.max(level.bitrate * 0.9, level.averageBitrate)),\n    // Assume a framerate of 30fps since MediaCapabilities will not accept Level default of 0.\n    framerate: level.frameRate || 30\n  };\n  const videoRange = level.videoRange;\n  if (videoRange !== \"SDR\") {\n    baseVideoConfiguration.transferFunction = videoRange.toLowerCase();\n  }\n  const configurations = videoCodecs.split(\",\").map((videoCodec) => ({\n    type: \"media-source\",\n    video: _objectSpread2(_objectSpread2({}, baseVideoConfiguration), {}, {\n      contentType: mimeTypeForCodec(videoCodec, \"video\")\n    })\n  }));\n  if (audioCodecs && level.audioGroups) {\n    level.audioGroups.forEach((audioGroupId) => {\n      var _audioTracksByGroup$g;\n      if (!audioGroupId) {\n        return;\n      }\n      (_audioTracksByGroup$g = audioTracksByGroup.groups[audioGroupId]) == null ? void 0 : _audioTracksByGroup$g.tracks.forEach((audioTrack) => {\n        if (audioTrack.groupId === audioGroupId) {\n          const channels = audioTrack.channels || \"\";\n          const channelsNumber = parseFloat(channels);\n          if (isFiniteNumber(channelsNumber) && channelsNumber > 2) {\n            configurations.push.apply(configurations, audioCodecs.split(\",\").map((audioCodec) => ({\n              type: \"media-source\",\n              audio: {\n                contentType: mimeTypeForCodec(audioCodec, \"audio\"),\n                channels: \"\" + channelsNumber\n                // spatialRendering:\n                //   audioCodec === 'ec-3' && channels.indexOf('JOC'),\n              }\n            })));\n          }\n        }\n      });\n    });\n  }\n  return Promise.all(configurations.map((configuration) => {\n    const decodingInfoKey = getMediaDecodingInfoKey(configuration);\n    return SUPPORTED_INFO_CACHE[decodingInfoKey] || (SUPPORTED_INFO_CACHE[decodingInfoKey] = mediaCapabilities.decodingInfo(configuration));\n  })).then((decodingInfoResults) => ({\n    supported: !decodingInfoResults.some((info) => !info.supported),\n    configurations,\n    decodingInfoResults\n  })).catch((error) => ({\n    supported: false,\n    configurations,\n    decodingInfoResults: [],\n    error\n  }));\n}\nfunction getMediaDecodingInfoKey(config) {\n  const {\n    audio,\n    video\n  } = config;\n  const mediaConfig = video || audio;\n  if (mediaConfig) {\n    const codec = mediaConfig.contentType.split('\"')[1];\n    if (video) {\n      return `r${video.height}x${video.width}f${Math.ceil(video.framerate)}${video.transferFunction || \"sd\"}_${codec}_${Math.ceil(video.bitrate / 1e5)}`;\n    }\n    if (audio) {\n      return `c${audio.channels}${audio.spatialRendering ? \"s\" : \"n\"}_${codec}`;\n    }\n  }\n  return \"\";\n}\nfunction 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}\nfunction getVideoSelectionOptions(currentVideoRange, videoPreference) {\n  let preferHDR = false;\n  let allowedVideoRanges = [];\n  if (currentVideoRange) {\n    preferHDR = currentVideoRange !== \"SDR\";\n    allowedVideoRanges = [currentVideoRange];\n  }\n  if (videoPreference) {\n    allowedVideoRanges = videoPreference.allowedVideoRanges || VideoRangeValues.slice(0);\n    preferHDR = videoPreference.preferHDR !== void 0 ? videoPreference.preferHDR : isHdrSupported();\n    if (preferHDR) {\n      allowedVideoRanges = allowedVideoRanges.filter((range) => range !== \"SDR\");\n    } else {\n      allowedVideoRanges = [\"SDR\"];\n    }\n  }\n  return {\n    preferHDR,\n    allowedVideoRanges\n  };\n}\nfunction getStartCodecTier(codecTiers, currentVideoRange, currentBw, audioPreference, videoPreference) {\n  const codecSets = Object.keys(codecTiers);\n  const channelsPreference = audioPreference == null ? void 0 : audioPreference.channels;\n  const audioCodecPreference = audioPreference == null ? void 0 : audioPreference.audioCodec;\n  const preferStereo = channelsPreference && parseInt(channelsPreference) === 2;\n  let hasStereo = true;\n  let hasCurrentVideoRange = false;\n  let minHeight = Infinity;\n  let minFramerate = Infinity;\n  let minBitrate = Infinity;\n  let selectedScore = 0;\n  let videoRanges = [];\n  const {\n    preferHDR,\n    allowedVideoRanges\n  } = getVideoSelectionOptions(currentVideoRange, videoPreference);\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((range) => tier.videoRanges[range] > 0);\n    if (matchingVideoRanges.length > 0) {\n      hasCurrentVideoRange = true;\n      videoRanges = matchingVideoRanges;\n    }\n  }\n  minHeight = isFiniteNumber(minHeight) ? minHeight : 0;\n  minFramerate = isFiniteNumber(minFramerate) ? minFramerate : 0;\n  const maxHeight = Math.max(1080, minHeight);\n  const maxFramerate = Math.max(30, minFramerate);\n  minBitrate = isFiniteNumber(minBitrate) ? minBitrate : currentBw;\n  currentBw = Math.max(minBitrate, currentBw);\n  if (!hasCurrentVideoRange) {\n    currentVideoRange = void 0;\n    videoRanges = [];\n  }\n  const codecSet = codecSets.reduce((selected, candidate) => {\n    const candidateTier = codecTiers[candidate];\n    if (candidate === selected) {\n      return selected;\n    }\n    if (candidateTier.minBitrate > currentBw) {\n      logStartCodecCandidateIgnored(candidate, `min bitrate of ${candidateTier.minBitrate} > current estimate of ${currentBw}`);\n      return selected;\n    }\n    if (!candidateTier.hasDefaultAudio) {\n      logStartCodecCandidateIgnored(candidate, `no renditions with default or auto-select sound found`);\n      return selected;\n    }\n    if (audioCodecPreference && candidate.indexOf(audioCodecPreference.substring(0, 4)) % 5 !== 0) {\n      logStartCodecCandidateIgnored(candidate, `audio codec preference \"${audioCodecPreference}\" not found`);\n      return selected;\n    }\n    if (channelsPreference && !preferStereo) {\n      if (!candidateTier.channels[channelsPreference]) {\n        logStartCodecCandidateIgnored(candidate, `no renditions with ${channelsPreference} channel sound found (channels options: ${Object.keys(candidateTier.channels)})`);\n        return selected;\n      }\n    } else if ((!audioCodecPreference || preferStereo) && hasStereo && candidateTier.channels[\"2\"] === 0) {\n      logStartCodecCandidateIgnored(candidate, `no renditions with stereo sound found`);\n      return selected;\n    }\n    if (candidateTier.minHeight > maxHeight) {\n      logStartCodecCandidateIgnored(candidate, `min resolution of ${candidateTier.minHeight} > maximum of ${maxHeight}`);\n      return selected;\n    }\n    if (candidateTier.minFramerate > maxFramerate) {\n      logStartCodecCandidateIgnored(candidate, `min framerate of ${candidateTier.minFramerate} > maximum of ${maxFramerate}`);\n      return selected;\n    }\n    if (!videoRanges.some((range) => candidateTier.videoRanges[range] > 0)) {\n      logStartCodecCandidateIgnored(candidate, `no variants with VIDEO-RANGE of ${JSON.stringify(videoRanges)} found`);\n      return selected;\n    }\n    if (candidateTier.maxScore < selectedScore) {\n      logStartCodecCandidateIgnored(candidate, `max score of ${candidateTier.maxScore} < selected max of ${selectedScore}`);\n      return selected;\n    }\n    if (selected && (codecsSetSelectionPreferenceValue(candidate) >= codecsSetSelectionPreferenceValue(selected) || candidateTier.fragmentError > codecTiers[selected].fragmentError)) {\n      return selected;\n    }\n    selectedScore = candidateTier.maxScore;\n    return candidate;\n  }, void 0);\n  return {\n    codecSet,\n    videoRanges,\n    preferHDR,\n    minFramerate,\n    minBitrate\n  };\n}\nfunction logStartCodecCandidateIgnored(codeSet, reason) {\n  logger.log(`[abr] start candidates with \"${codeSet}\" ignored because ${reason}`);\n}\nfunction getAudioTracksByGroup(allAudioTracks) {\n  return allAudioTracks.reduce((audioTracksByGroup, track) => {\n    let trackGroup = audioTracksByGroup.groups[track.groupId];\n    if (!trackGroup) {\n      trackGroup = audioTracksByGroup.groups[track.groupId] = {\n        tracks: [],\n        channels: {\n          2: 0\n        },\n        hasDefault: false,\n        hasAutoSelect: false\n      };\n    }\n    trackGroup.tracks.push(track);\n    const channelsKey = track.channels || \"2\";\n    trackGroup.channels[channelsKey] = (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    hasDefaultAudio: false,\n    hasAutoSelectAudio: false,\n    groups: {}\n  });\n}\nfunction getCodecTiers(levels, audioTracksByGroup, minAutoLevel, maxAutoLevel) {\n  return levels.slice(minAutoLevel, maxAutoLevel + 1).reduce((tiers, level) => {\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        maxScore: 0,\n        videoRanges: {\n          SDR: 0\n        },\n        channels: {\n          \"2\": 0\n        },\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.maxScore = Math.max(tier.maxScore, level.score);\n    tier.fragmentError += level.fragmentError;\n    tier.videoRanges[level.videoRange] = (tier.videoRanges[level.videoRange] || 0) + 1;\n    if (audioGroups) {\n      audioGroups.forEach((audioGroupId) => {\n        if (!audioGroupId) {\n          return;\n        }\n        const audioGroup = audioTracksByGroup.groups[audioGroupId];\n        tier.hasDefaultAudio = tier.hasDefaultAudio || audioTracksByGroup.hasDefaultAudio ? audioGroup.hasDefault : audioGroup.hasAutoSelect || !audioTracksByGroup.hasDefaultAudio && !audioTracksByGroup.hasAutoSelectAudio;\n        Object.keys(audioGroup.channels).forEach((channels) => {\n          tier.channels[channels] = (tier.channels[channels] || 0) + audioGroup.channels[channels];\n        });\n      });\n    }\n    return tiers;\n  }, {});\n}\nfunction findMatchingOption(option, tracks, matchPredicate) {\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}\nfunction matchesOption(option, track, matchPredicate) {\n  const {\n    groupId,\n    name,\n    lang,\n    assocLang,\n    characteristics,\n    default: isDefault\n  } = option;\n  const forced = option.forced;\n  return (groupId === void 0 || track.groupId === groupId) && (name === void 0 || track.name === name) && (lang === void 0 || track.lang === lang) && (lang === void 0 || track.assocLang === assocLang) && (isDefault === void 0 || track.default === isDefault) && (forced === void 0 || track.forced === forced) && (characteristics === void 0 || characteristicsMatch(characteristics, track.characteristics)) && (matchPredicate === void 0 || matchPredicate(option, track));\n}\nfunction characteristicsMatch(characteristicsA, characteristicsB = \"\") {\n  const arrA = characteristicsA.split(\",\");\n  const arrB = characteristicsB.split(\",\");\n  return arrA.length === arrB.length && !arrA.some((el) => arrB.indexOf(el) === -1);\n}\nfunction audioMatchPredicate(option, track) {\n  const {\n    audioCodec,\n    channels\n  } = option;\n  return (audioCodec === void 0 || (track.audioCodec || \"\").substring(0, 4) === audioCodec.substring(0, 4)) && (channels === void 0 || channels === (track.channels || \"2\"));\n}\nfunction findClosestLevelWithAudioGroup(option, levels, allAudioTracks, searchIndex, matchPredicate) {\n  const currentLevel = levels[searchIndex];\n  const variants = levels.reduce((variantMap, level, index) => {\n    const uri = level.uri;\n    const renditions2 = variantMap[uri] || (variantMap[uri] = []);\n    renditions2.push(index);\n    return variantMap;\n  }, {});\n  const renditions = variants[currentLevel.uri];\n  if (renditions.length > 1) {\n    searchIndex = Math.max.apply(Math, renditions);\n  }\n  const currentVideoRange = currentLevel.videoRange;\n  const currentFrameRate = currentLevel.frameRate;\n  const currentVideoCodec = currentLevel.codecSet.substring(0, 4);\n  const matchingVideo = searchDownAndUpList(levels, searchIndex, (level) => {\n    if (level.videoRange !== currentVideoRange || level.frameRate !== currentFrameRate || level.codecSet.substring(0, 4) !== currentVideoCodec) {\n      return false;\n    }\n    const audioGroups = level.audioGroups;\n    const tracks = allAudioTracks.filter((track) => !audioGroups || audioGroups.indexOf(track.groupId) !== -1);\n    return findMatchingOption(option, tracks, matchPredicate) > -1;\n  });\n  if (matchingVideo > -1) {\n    return matchingVideo;\n  }\n  return searchDownAndUpList(levels, searchIndex, (level) => {\n    const audioGroups = level.audioGroups;\n    const tracks = allAudioTracks.filter((track) => !audioGroups || audioGroups.indexOf(track.groupId) !== -1);\n    return findMatchingOption(option, tracks, matchPredicate) > -1;\n  });\n}\nfunction searchDownAndUpList(arr, searchIndex, predicate) {\n  for (let i = searchIndex; i; 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}\nclass AbrController {\n  constructor(_hls) {\n    this.hls = void 0;\n    this.lastLevelLoadSec = 0;\n    this.lastLoadedFragLevel = -1;\n    this.firstSelection = -1;\n    this._nextAutoLevel = -1;\n    this.nextAutoLevelKey = \"\";\n    this.audioTracksByGroup = null;\n    this.codecTiers = null;\n    this.timer = -1;\n    this.fragCurrent = null;\n    this.partCurrent = null;\n    this.bitrateTestDelay = 0;\n    this.bwEstimator = void 0;\n    this._abandonRulesCheck = () => {\n      const {\n        fragCurrent: frag,\n        partCurrent: part,\n        hls\n      } = this;\n      const {\n        autoLevelEnabled,\n        media\n      } = hls;\n      if (!frag || !media) {\n        return;\n      }\n      const now2 = performance.now();\n      const stats = part ? part.stats : frag.stats;\n      const duration = part ? part.duration : frag.duration;\n      const timeLoading = now2 - stats.loading.start;\n      const minAutoLevel = hls.minAutoLevel;\n      if (stats.aborted || stats.loaded && stats.loaded === stats.total || frag.level <= minAutoLevel) {\n        this.clearTimer();\n        this._nextAutoLevel = -1;\n        return;\n      }\n      if (!autoLevelEnabled || media.paused || !media.playbackRate || !media.readyState) {\n        return;\n      }\n      const bufferInfo = hls.mainForwardBufferInfo;\n      if (bufferInfo === null) {\n        return;\n      }\n      const ttfbEstimate = this.bwEstimator.getEstimateTTFB();\n      const playbackRate = Math.abs(media.playbackRate);\n      if (timeLoading <= Math.max(ttfbEstimate, 1e3 * (duration / (playbackRate * 2)))) {\n        return;\n      }\n      const bufferStarvationDelay = bufferInfo.len / playbackRate;\n      const ttfb = stats.loading.first ? stats.loading.first - stats.loading.start : -1;\n      const loadedFirstByte = stats.loaded && ttfb > -1;\n      const bwEstimate = this.getBwEstimate();\n      const levels = hls.levels;\n      const level = levels[frag.level];\n      const expectedLen = stats.total || Math.max(stats.loaded, Math.round(duration * level.averageBitrate / 8));\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 ? stats.loaded * 1e3 / timeStreaming : 0;\n      const fragLoadedDelay = loadRate ? (expectedLen - stats.loaded) / loadRate : expectedLen * 8 / bwEstimate + ttfbEstimate / 1e3;\n      if (fragLoadedDelay <= bufferStarvationDelay) {\n        return;\n      }\n      const bwe = loadRate ? loadRate * 8 : bwEstimate;\n      let fragLevelNextLoadedDelay = Number.POSITIVE_INFINITY;\n      let nextLoadLevel;\n      for (nextLoadLevel = frag.level - 1; nextLoadLevel > minAutoLevel; nextLoadLevel--) {\n        const levelNextBitrate = levels[nextLoadLevel].maxBitrate;\n        fragLevelNextLoadedDelay = this.getTimeToLoadFrag(ttfbEstimate / 1e3, bwe, duration * levelNextBitrate, !levels[nextLoadLevel].details);\n        if (fragLevelNextLoadedDelay < bufferStarvationDelay) {\n          break;\n        }\n      }\n      if (fragLevelNextLoadedDelay >= fragLoadedDelay) {\n        return;\n      }\n      if (fragLevelNextLoadedDelay > duration * 10) {\n        return;\n      }\n      hls.nextLoadLevel = hls.nextAutoLevel = nextLoadLevel;\n      if (loadedFirstByte) {\n        this.bwEstimator.sample(timeLoading - Math.min(ttfbEstimate, ttfb), stats.loaded);\n      } else {\n        this.bwEstimator.sampleTTFB(timeLoading);\n      }\n      const nextLoadLevelBitrate = levels[nextLoadLevel].maxBitrate;\n      if (this.getBwEstimate() * this.hls.config.abrBandWidthUpFactor > nextLoadLevelBitrate) {\n        this.resetEstimator(nextLoadLevelBitrate);\n      }\n      this.clearTimer();\n      logger.warn(`[abr] Fragment ${frag.sn}${part ? \" part \" + part.index : \"\"} of level ${frag.level} is loading too slowly;\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(3)} s\n      TTFB estimate: ${ttfb | 0} ms\n      Current BW estimate: ${isFiniteNumber(bwEstimate) ? bwEstimate | 0 : \"Unknown\"} bps\n      New BW estimate: ${this.getBwEstimate() | 0} bps\n      Switching to level ${nextLoadLevel} @ ${nextLoadLevelBitrate | 0} bps`);\n      hls.trigger(Events.FRAG_LOAD_EMERGENCY_ABORTED, {\n        frag,\n        part,\n        stats\n      });\n    };\n    this.hls = _hls;\n    this.bwEstimator = this.initEstimator();\n    this.registerListeners();\n  }\n  resetEstimator(abrEwmaDefaultEstimate) {\n    if (abrEwmaDefaultEstimate) {\n      logger.log(`setting initial bwe to ${abrEwmaDefaultEstimate}`);\n      this.hls.config.abrEwmaDefaultEstimate = abrEwmaDefaultEstimate;\n    }\n    this.firstSelection = -1;\n    this.bwEstimator = this.initEstimator();\n  }\n  initEstimator() {\n    const config = this.hls.config;\n    return new EwmaBandWidthEstimator(config.abrEwmaSlowVoD, config.abrEwmaFastVoD, config.abrEwmaDefaultEstimate);\n  }\n  registerListeners() {\n    const {\n      hls\n    } = 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  unregisterListeners() {\n    const {\n      hls\n    } = 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  destroy() {\n    this.unregisterListeners();\n    this.clearTimer();\n    this.hls = this._abandonRulesCheck = null;\n    this.fragCurrent = this.partCurrent = null;\n  }\n  onManifestLoading(event, data) {\n    this.lastLoadedFragLevel = -1;\n    this.firstSelection = -1;\n    this.lastLevelLoadSec = 0;\n    this.fragCurrent = this.partCurrent = null;\n    this.onLevelsUpdated();\n    this.clearTimer();\n  }\n  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  onMaxAutoLevelUpdated() {\n    this.firstSelection = -1;\n    this.nextAutoLevelKey = \"\";\n  }\n  onFragLoading(event, data) {\n    const frag = data.frag;\n    if (this.ignoreFragment(frag)) {\n      return;\n    }\n    if (!frag.bitrateTest) {\n      var _data$part;\n      this.fragCurrent = frag;\n      this.partCurrent = (_data$part = data.part) != null ? _data$part : null;\n    }\n    this.clearTimer();\n    this.timer = self.setInterval(this._abandonRulesCheck, 100);\n  }\n  onLevelSwitching(event, data) {\n    this.clearTimer();\n  }\n  onError(event, data) {\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        this.lastLoadedFragLevel = -1;\n        this.firstSelection = -1;\n        break;\n      case ErrorDetails.FRAG_LOAD_TIMEOUT: {\n        const frag = data.frag;\n        const {\n          fragCurrent,\n          partCurrent: part\n        } = this;\n        if (frag && fragCurrent && frag.sn === fragCurrent.sn && frag.level === fragCurrent.level) {\n          const now2 = performance.now();\n          const stats = part ? part.stats : frag.stats;\n          const timeLoading = now2 - stats.loading.start;\n          const ttfb = stats.loading.first ? stats.loading.first - stats.loading.start : -1;\n          const loadedFirstByte = stats.loaded && ttfb > -1;\n          if (loadedFirstByte) {\n            const ttfbEstimate = this.bwEstimator.getEstimateTTFB();\n            this.bwEstimator.sample(timeLoading - Math.min(ttfbEstimate, ttfb), stats.loaded);\n          } else {\n            this.bwEstimator.sampleTTFB(timeLoading);\n          }\n        }\n        break;\n      }\n    }\n  }\n  getTimeToLoadFrag(timeToFirstByteSec, bandwidth, fragSizeBits, isSwitch) {\n    const fragLoadSec = timeToFirstByteSec + fragSizeBits / bandwidth;\n    const playlistLoadSec = isSwitch ? this.lastLevelLoadSec : 0;\n    return fragLoadSec + playlistLoadSec;\n  }\n  onLevelLoaded(event, data) {\n    const config = this.hls.config;\n    const {\n      loading\n    } = data.stats;\n    const timeLoadingMs = loading.end - loading.start;\n    if (isFiniteNumber(timeLoadingMs)) {\n      this.lastLevelLoadSec = timeLoadingMs / 1e3;\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  }\n  onFragLoaded(event, {\n    frag,\n    part\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    this.clearTimer();\n    if (frag.level === this._nextAutoLevel) {\n      this._nextAutoLevel = -1;\n    }\n    this.firstSelection = -1;\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 = (level.loaded ? level.loaded.bytes : 0) + stats.loaded;\n      const loadedDuration = (level.loaded ? level.loaded.duration : 0) + duration;\n      level.loaded = {\n        bytes: loadedBytes,\n        duration: loadedDuration\n      };\n      level.realBitrate = Math.round(8 * loadedBytes / loadedDuration);\n    }\n    if (frag.bitrateTest) {\n      const 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      this.lastLoadedFragLevel = frag.level;\n    }\n  }\n  onFragBuffered(event, data) {\n    const {\n      frag,\n      part\n    } = data;\n    const stats = part != null && part.stats.loaded ? part.stats : frag.stats;\n    if (stats.aborted) {\n      return;\n    }\n    if (this.ignoreFragment(frag)) {\n      return;\n    }\n    const processingMs = stats.parsing.end - stats.loading.start - Math.min(stats.loading.first - stats.loading.start, this.bwEstimator.getEstimateTTFB());\n    this.bwEstimator.sample(processingMs, stats.loaded);\n    stats.bwEstimate = this.getBwEstimate();\n    if (frag.bitrateTest) {\n      this.bitrateTestDelay = processingMs / 1e3;\n    } else {\n      this.bitrateTestDelay = 0;\n    }\n  }\n  ignoreFragment(frag) {\n    return frag.type !== PlaylistLevelType.MAIN || frag.sn === \"initSegment\";\n  }\n  clearTimer() {\n    if (this.timer > -1) {\n      self.clearInterval(this.timer);\n      this.timer = -1;\n    }\n  }\n  get firstAutoLevel() {\n    const {\n      maxAutoLevel,\n      minAutoLevel\n    } = this.hls;\n    const bwEstimate = this.getBwEstimate();\n    const maxStartDelay = this.hls.config.maxStarvationDelay;\n    const abrAutoLevel = this.findBestLevel(bwEstimate, minAutoLevel, maxAutoLevel, 0, maxStartDelay, 1, 1);\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    logger.warn(`[abr] Could not find best starting auto level. Defaulting to first in playlist ${firstLevel} clamped to ${clamped}`);\n    return clamped;\n  }\n  get forcedAutoLevel() {\n    if (this.nextAutoLevelKey) {\n      return -1;\n    }\n    return this._nextAutoLevel;\n  }\n  // return next auto level\n  get nextAutoLevel() {\n    const forcedAutoLevel = this.forcedAutoLevel;\n    const bwEstimator = this.bwEstimator;\n    const useEstimate = bwEstimator.canEstimate();\n    const loadedFirstFrag = this.lastLoadedFragLevel > -1;\n    if (forcedAutoLevel !== -1 && (!useEstimate || !loadedFirstFrag || this.nextAutoLevelKey === this.getAutoLevelKey())) {\n      return forcedAutoLevel;\n    }\n    const nextABRAutoLevel = useEstimate && loadedFirstFrag ? this.getNextABRAutoLevel() : this.firstAutoLevel;\n    if (forcedAutoLevel !== -1) {\n      const levels = this.hls.levels;\n      if (levels.length > Math.max(forcedAutoLevel, nextABRAutoLevel) && levels[forcedAutoLevel].loadError <= levels[nextABRAutoLevel].loadError) {\n        return forcedAutoLevel;\n      }\n    }\n    this._nextAutoLevel = nextABRAutoLevel;\n    this.nextAutoLevelKey = this.getAutoLevelKey();\n    return nextABRAutoLevel;\n  }\n  getAutoLevelKey() {\n    return `${this.getBwEstimate()}_${this.getStarvationDelay().toFixed(2)}`;\n  }\n  getNextABRAutoLevel() {\n    const {\n      fragCurrent,\n      partCurrent,\n      hls\n    } = this;\n    const {\n      maxAutoLevel,\n      config,\n      minAutoLevel\n    } = hls;\n    const currentFragDuration = partCurrent ? partCurrent.duration : fragCurrent ? fragCurrent.duration : 0;\n    const avgbw = this.getBwEstimate();\n    const bufferStarvationDelay = this.getStarvationDelay();\n    let bwFactor = config.abrBandWidthFactor;\n    let bwUpFactor = config.abrBandWidthUpFactor;\n    if (bufferStarvationDelay) {\n      const _bestLevel = this.findBestLevel(avgbw, minAutoLevel, maxAutoLevel, bufferStarvationDelay, 0, bwFactor, bwUpFactor);\n      if (_bestLevel >= 0) {\n        return _bestLevel;\n      }\n    }\n    let maxStarvationDelay = currentFragDuration ? Math.min(currentFragDuration, config.maxStarvationDelay) : config.maxStarvationDelay;\n    if (!bufferStarvationDelay) {\n      const bitrateTestDelay = this.bitrateTestDelay;\n      if (bitrateTestDelay) {\n        const maxLoadingDelay = currentFragDuration ? Math.min(currentFragDuration, config.maxLoadingDelay) : config.maxLoadingDelay;\n        maxStarvationDelay = maxLoadingDelay - bitrateTestDelay;\n        logger.info(`[abr] bitrate test took ${Math.round(1e3 * bitrateTestDelay)}ms, set first fragment max fetchDuration to ${Math.round(1e3 * maxStarvationDelay)} ms`);\n        bwFactor = bwUpFactor = 1;\n      }\n    }\n    const bestLevel = this.findBestLevel(avgbw, minAutoLevel, maxAutoLevel, bufferStarvationDelay, maxStarvationDelay, bwFactor, bwUpFactor);\n    logger.info(`[abr] ${bufferStarvationDelay ? \"rebuffering expected\" : \"buffer is empty\"}, optimal quality level ${bestLevel}`);\n    if (bestLevel > -1) {\n      return bestLevel;\n    }\n    const minLevel = hls.levels[minAutoLevel];\n    const autoLevel = hls.levels[hls.loadLevel];\n    if ((minLevel == null ? void 0 : minLevel.bitrate) < (autoLevel == null ? void 0 : autoLevel.bitrate)) {\n      return minAutoLevel;\n    }\n    return hls.loadLevel;\n  }\n  getStarvationDelay() {\n    const hls = this.hls;\n    const media = hls.media;\n    if (!media) {\n      return Infinity;\n    }\n    const playbackRate = media && media.playbackRate !== 0 ? Math.abs(media.playbackRate) : 1;\n    const bufferInfo = hls.mainForwardBufferInfo;\n    return (bufferInfo ? bufferInfo.len : 0) / playbackRate;\n  }\n  getBwEstimate() {\n    return this.bwEstimator.canEstimate() ? this.bwEstimator.getEstimate() : this.hls.config.abrEwmaDefaultEstimate;\n  }\n  findBestLevel(currentBw, minAutoLevel, maxAutoLevel, bufferStarvationDelay, maxStarvationDelay, bwFactor, bwUpFactor) {\n    var _level$details;\n    const maxFetchDuration = bufferStarvationDelay + maxStarvationDelay;\n    const lastLoadedFragLevel = this.lastLoadedFragLevel;\n    const selectionBaseLevel = lastLoadedFragLevel === -1 ? this.hls.firstLevel : lastLoadedFragLevel;\n    const {\n      fragCurrent,\n      partCurrent\n    } = this;\n    const {\n      levels,\n      allAudioTracks,\n      loadLevel,\n      config\n    } = this.hls;\n    if (levels.length === 1) {\n      return 0;\n    }\n    const level = levels[selectionBaseLevel];\n    const live = !!(level != null && (_level$details = level.details) != null && _level$details.live);\n    const firstSelection = loadLevel === -1 || lastLoadedFragLevel === -1;\n    let currentCodecSet;\n    let currentVideoRange = \"SDR\";\n    let currentFrameRate = (level == null ? void 0 : level.frameRate) || 0;\n    const {\n      audioPreference,\n      videoPreference\n    } = config;\n    const audioTracksByGroup = this.audioTracksByGroup || (this.audioTracksByGroup = getAudioTracksByGroup(allAudioTracks));\n    if (firstSelection) {\n      if (this.firstSelection !== -1) {\n        return this.firstSelection;\n      }\n      const codecTiers = this.codecTiers || (this.codecTiers = getCodecTiers(levels, audioTracksByGroup, minAutoLevel, maxAutoLevel));\n      const startTier = getStartCodecTier(codecTiers, currentVideoRange, currentBw, audioPreference, videoPreference);\n      const {\n        codecSet,\n        videoRanges,\n        minFramerate,\n        minBitrate,\n        preferHDR\n      } = startTier;\n      currentCodecSet = codecSet;\n      currentVideoRange = preferHDR ? videoRanges[videoRanges.length - 1] : videoRanges[0];\n      currentFrameRate = minFramerate;\n      currentBw = Math.max(currentBw, minBitrate);\n      logger.log(`[abr] picked start tier ${JSON.stringify(startTier)}`);\n    } else {\n      currentCodecSet = level == null ? void 0 : level.codecSet;\n      currentVideoRange = level == null ? void 0 : level.videoRange;\n    }\n    const currentFragDuration = partCurrent ? partCurrent.duration : fragCurrent ? fragCurrent.duration : 0;\n    const ttfbEstimateSec = this.bwEstimator.getEstimateTTFB() / 1e3;\n    const levelsSkipped = [];\n    for (let i = maxAutoLevel; i >= minAutoLevel; i--) {\n      var _levelInfo$supportedR;\n      const levelInfo = levels[i];\n      const upSwitch = i > selectionBaseLevel;\n      if (!levelInfo) {\n        continue;\n      }\n      if (config.useMediaCapabilities && !levelInfo.supportedResult && !levelInfo.supportedPromise) {\n        const mediaCapabilities = navigator.mediaCapabilities;\n        if (typeof (mediaCapabilities == null ? void 0 : mediaCapabilities.decodingInfo) === \"function\" && requiresMediaCapabilitiesDecodingInfo(levelInfo, audioTracksByGroup, currentVideoRange, currentFrameRate, currentBw, audioPreference)) {\n          levelInfo.supportedPromise = getMediaDecodingInfoPromise(levelInfo, audioTracksByGroup, mediaCapabilities);\n          levelInfo.supportedPromise.then((decodingInfo) => {\n            if (!this.hls) {\n              return;\n            }\n            levelInfo.supportedResult = decodingInfo;\n            const levels2 = this.hls.levels;\n            const index = levels2.indexOf(levelInfo);\n            if (decodingInfo.error) {\n              logger.warn(`[abr] MediaCapabilities decodingInfo error: \"${decodingInfo.error}\" for level ${index} ${JSON.stringify(decodingInfo)}`);\n            } else if (!decodingInfo.supported) {\n              logger.warn(`[abr] Unsupported MediaCapabilities decodingInfo result for level ${index} ${JSON.stringify(decodingInfo)}`);\n              if (index > -1 && levels2.length > 1) {\n                logger.log(`[abr] Removing unsupported level ${index}`);\n                this.hls.removeLevel(index);\n              }\n            }\n          });\n        } else {\n          levelInfo.supportedResult = SUPPORTED_INFO_DEFAULT;\n        }\n      }\n      if (currentCodecSet && levelInfo.codecSet !== currentCodecSet || currentVideoRange && levelInfo.videoRange !== currentVideoRange || upSwitch && currentFrameRate > levelInfo.frameRate || !upSwitch && currentFrameRate > 0 && currentFrameRate < levelInfo.frameRate || levelInfo.supportedResult && !((_levelInfo$supportedR = levelInfo.supportedResult.decodingInfoResults) != null && _levelInfo$supportedR[0].smooth)) {\n        levelsSkipped.push(i);\n        continue;\n      }\n      const levelDetails = levelInfo.details;\n      const avgDuration = (partCurrent ? levelDetails == null ? void 0 : levelDetails.partTarget : levelDetails == null ? void 0 : levelDetails.averagetargetduration) || currentFragDuration;\n      let adjustedbw;\n      if (!upSwitch) {\n        adjustedbw = bwFactor * currentBw;\n      } else {\n        adjustedbw = bwUpFactor * currentBw;\n      }\n      const bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levels[i].averageBitrate : levels[i].maxBitrate;\n      const fetchDuration = this.getTimeToLoadFrag(ttfbEstimateSec, adjustedbw, bitrate * avgDuration, levelDetails === void 0);\n      const canSwitchWithinTolerance = (\n        // if adjusted bw is greater than level bitrate AND\n        adjustedbw >= bitrate && // no level change, or new level has no error history\n        (i === lastLoadedFragLevel || levelInfo.loadError === 0 && levelInfo.fragmentError === 0) && // 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 || !isFiniteNumber(fetchDuration) || live && !this.bitrateTestDelay || fetchDuration < maxFetchDuration)\n      );\n      if (canSwitchWithinTolerance) {\n        const forcedAutoLevel = this.forcedAutoLevel;\n        if (i !== loadLevel && (forcedAutoLevel === -1 || forcedAutoLevel !== loadLevel)) {\n          if (levelsSkipped.length) {\n            logger.trace(`[abr] Skipped level(s) ${levelsSkipped.join(\",\")} of ${maxAutoLevel} max with CODECS and VIDEO-RANGE:\"${levels[levelsSkipped[0]].codecs}\" ${levels[levelsSkipped[0]].videoRange}; not compatible with \"${level.codecs}\" ${currentVideoRange}`);\n          }\n          logger.info(`[abr] switch candidate:${selectionBaseLevel}->${i} adjustedbw(${Math.round(adjustedbw)})-bitrate=${Math.round(adjustedbw - bitrate)} ttfb:${ttfbEstimateSec.toFixed(1)} avgDuration:${avgDuration.toFixed(1)} maxFetchDuration:${maxFetchDuration.toFixed(1)} fetchDuration:${fetchDuration.toFixed(1)} firstSelection:${firstSelection} codecSet:${currentCodecSet} videoRange:${currentVideoRange} hls.loadLevel:${loadLevel}`);\n        }\n        if (firstSelection) {\n          this.firstSelection = i;\n        }\n        return i;\n      }\n    }\n    return -1;\n  }\n  set nextAutoLevel(nextLevel) {\n    const {\n      maxAutoLevel,\n      minAutoLevel\n    } = this.hls;\n    const value = Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);\n    if (this._nextAutoLevel !== value) {\n      this.nextAutoLevelKey = \"\";\n      this._nextAutoLevel = value;\n    }\n  }\n}\nclass TaskLoop {\n  constructor() {\n    this._boundTick = void 0;\n    this._tickTimer = null;\n    this._tickInterval = null;\n    this._tickCallCount = 0;\n    this._boundTick = this.tick.bind(this);\n  }\n  destroy() {\n    this.onHandlerDestroying();\n    this.onHandlerDestroyed();\n  }\n  onHandlerDestroying() {\n    this.clearNextTick();\n    this.clearInterval();\n  }\n  onHandlerDestroyed() {\n  }\n  hasInterval() {\n    return !!this._tickInterval;\n  }\n  hasNextTick() {\n    return !!this._tickTimer;\n  }\n  /**\n   * @param millis - Interval time (ms)\n   * @eturns True when interval has been scheduled, false when already scheduled (no effect)\n   */\n  setInterval(millis) {\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   * @returns True when interval was cleared, false when none was set (no effect)\n   */\n  clearInterval() {\n    if (this._tickInterval) {\n      self.clearInterval(this._tickInterval);\n      this._tickInterval = null;\n      return true;\n    }\n    return false;\n  }\n  /**\n   * @returns True when timeout was cleared, false when none was set (no effect)\n   */\n  clearNextTick() {\n    if (this._tickTimer) {\n      self.clearTimeout(this._tickTimer);\n      this._tickTimer = null;\n      return true;\n    }\n    return false;\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  tick() {\n    this._tickCallCount++;\n    if (this._tickCallCount === 1) {\n      this.doTick();\n      if (this._tickCallCount > 1) {\n        this.tickImmediate();\n      }\n      this._tickCallCount = 0;\n    }\n  }\n  tickImmediate() {\n    this.clearNextTick();\n    this._tickTimer = self.setTimeout(this._boundTick, 0);\n  }\n  /**\n   * For subclass to implement task logic\n   * @abstract\n   */\n  doTick() {\n  }\n}\nvar FragmentState = {\n  NOT_LOADED: \"NOT_LOADED\",\n  APPENDING: \"APPENDING\",\n  PARTIAL: \"PARTIAL\",\n  OK: \"OK\"\n};\nclass FragmentTracker {\n  constructor(hls) {\n    this.activePartLists = /* @__PURE__ */ Object.create(null);\n    this.endListFragments = /* @__PURE__ */ Object.create(null);\n    this.fragments = /* @__PURE__ */ Object.create(null);\n    this.timeRanges = /* @__PURE__ */ Object.create(null);\n    this.bufferPadding = 0.2;\n    this.hls = void 0;\n    this.hasGaps = false;\n    this.hls = hls;\n    this._registerListeners();\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = 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  _unregisterListeners() {\n    const {\n      hls\n    } = 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  destroy() {\n    this._unregisterListeners();\n    this.fragments = // @ts-ignore\n    this.activePartLists = // @ts-ignore\n    this.endListFragments = this.timeRanges = null;\n  }\n  /**\n   * Return a Fragment or Part with an appended range that matches the position and levelType\n   * Otherwise, return null\n   */\n  getAppendedFrag(position, levelType) {\n    const activeParts = this.activePartLists[levelType];\n    if (activeParts) {\n      for (let i = activeParts.length; i--; ) {\n        const activePart = activeParts[i];\n        if (!activePart) {\n          break;\n        }\n        const appendedPTS = activePart.end;\n        if (activePart.start <= position && appendedPTS !== null && position <= appendedPTS) {\n          return activePart;\n        }\n      }\n    }\n    return this.getBufferedFrag(position, levelType);\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  getBufferedFrag(position, levelType) {\n    const {\n      fragments\n    } = this;\n    const keys = Object.keys(fragments);\n    for (let i = keys.length; i--; ) {\n      const fragmentEntity = fragments[keys[i]];\n      if ((fragmentEntity == null ? void 0 : fragmentEntity.body.type) === levelType && fragmentEntity.buffered) {\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   * 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  detectEvictedFragments(elementaryStream, timeRange, playlistType, appendedPart) {\n    if (this.timeRanges) {\n      this.timeRanges[elementaryStream] = timeRange;\n    }\n    const appendedPartSn = (appendedPart == null ? void 0 : 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 (!fragmentEntity.buffered && !fragmentEntity.loaded) {\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      esData.time.some((time) => {\n        const isNotBuffered = !this.isTimeBuffered(time.startPTS, time.endPTS, timeRange);\n        if (isNotBuffered) {\n          this.removeFragment(fragmentEntity.body);\n        }\n        return isNotBuffered;\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  detectPartialFragments(data) {\n    const timeRanges = this.timeRanges;\n    const {\n      frag,\n      part\n    } = data;\n    if (!timeRanges || frag.sn === \"initSegment\") {\n      return;\n    }\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) => {\n      const streamInfo = frag.elementaryStreams[elementaryStream];\n      if (!streamInfo) {\n        return;\n      }\n      const timeRange = timeRanges[elementaryStream];\n      const partial = isFragHint || streamInfo.partial === true;\n      fragmentEntity.range[elementaryStream] = this.getBufferedTimes(frag, part, partial, timeRange);\n    });\n    fragmentEntity.loaded = null;\n    if (Object.keys(fragmentEntity.range).length) {\n      fragmentEntity.buffered = true;\n      const endList = fragmentEntity.body.endList = frag.endList || fragmentEntity.body.endList;\n      if (endList) {\n        this.endListFragments[fragmentEntity.body.type] = fragmentEntity;\n      }\n      if (!isPartial(fragmentEntity)) {\n        this.removeParts(frag.sn - 1, frag.type);\n      }\n    } else {\n      this.removeFragment(fragmentEntity.body);\n    }\n  }\n  removeParts(snToKeep, levelType) {\n    const activeParts = this.activePartLists[levelType];\n    if (!activeParts) {\n      return;\n    }\n    this.activePartLists[levelType] = activeParts.filter((part) => part.fragment.sn >= snToKeep);\n  }\n  fragBuffered(frag, force) {\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: /* @__PURE__ */ Object.create(null)\n      };\n      if (frag.gap) {\n        this.hasGaps = true;\n      }\n    }\n    if (fragmentEntity) {\n      fragmentEntity.loaded = null;\n      fragmentEntity.buffered = true;\n    }\n  }\n  getBufferedTimes(fragment, part, partial, timeRange) {\n    const buffered = {\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        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          buffered.time.push({\n            startPTS: start,\n            endPTS: end\n          });\n        }\n      } else if (endPTS <= startTime) {\n        break;\n      }\n    }\n    return buffered;\n  }\n  /**\n   * Gets the partial fragment for a certain time\n   */\n  getPartialFragment(time) {\n    let bestFragment = null;\n    let timePadding;\n    let startTime;\n    let endTime;\n    let bestOverlap = 0;\n    const {\n      bufferPadding,\n      fragments\n    } = 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          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  isEndListAppended(type) {\n    const lastFragmentEntity = this.endListFragments[type];\n    return lastFragmentEntity !== void 0 && (lastFragmentEntity.buffered || isPartial(lastFragmentEntity));\n  }\n  getState(fragment) {\n    const fragKey = getFragmentKey(fragment);\n    const fragmentEntity = this.fragments[fragKey];\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    return FragmentState.NOT_LOADED;\n  }\n  isTimeBuffered(startPTS, endPTS, timeRange) {\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      if (endPTS <= startTime) {\n        return false;\n      }\n    }\n    return false;\n  }\n  onFragLoaded(event, data) {\n    const {\n      frag,\n      part\n    } = data;\n    if (frag.sn === \"initSegment\" || frag.bitrateTest) {\n      return;\n    }\n    const loaded = part ? null : data;\n    const fragKey = getFragmentKey(frag);\n    this.fragments[fragKey] = {\n      body: frag,\n      appendedPTS: null,\n      loaded,\n      buffered: false,\n      range: /* @__PURE__ */ Object.create(null)\n    };\n  }\n  onBufferAppended(event, data) {\n    const {\n      frag,\n      part,\n      timeRanges\n    } = 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    this.timeRanges = timeRanges;\n    Object.keys(timeRanges).forEach((elementaryStream) => {\n      const timeRange = timeRanges[elementaryStream];\n      this.detectEvictedFragments(elementaryStream, timeRange, playlistType, part);\n    });\n  }\n  onFragBuffered(event, data) {\n    this.detectPartialFragments(data);\n  }\n  hasFragment(fragment) {\n    const fragKey = getFragmentKey(fragment);\n    return !!this.fragments[fragKey];\n  }\n  hasParts(type) {\n    var _this$activePartLists;\n    return !!((_this$activePartLists = this.activePartLists[type]) != null && _this$activePartLists.length);\n  }\n  removeFragmentsInRange(start, end, playlistType, withGapOnly, unbufferedOnly) {\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 (frag.start < end && frag.end > start && (fragmentEntity.buffered || unbufferedOnly)) {\n        this.removeFragment(frag);\n      }\n    });\n  }\n  removeFragment(fragment) {\n    const fragKey = getFragmentKey(fragment);\n    fragment.stats.loaded = 0;\n    fragment.clearElementaryStreamInfo();\n    const activeParts = this.activePartLists[fragment.type];\n    if (activeParts) {\n      const snToRemove = fragment.sn;\n      this.activePartLists[fragment.type] = activeParts.filter((part) => part.fragment.sn !== snToRemove);\n    }\n    delete this.fragments[fragKey];\n    if (fragment.endList) {\n      delete this.endListFragments[fragment.type];\n    }\n  }\n  removeAllFragments() {\n    this.fragments = /* @__PURE__ */ Object.create(null);\n    this.endListFragments = /* @__PURE__ */ Object.create(null);\n    this.activePartLists = /* @__PURE__ */ Object.create(null);\n    this.hasGaps = false;\n  }\n}\nfunction isPartial(fragmentEntity) {\n  var _fragmentEntity$range, _fragmentEntity$range2, _fragmentEntity$range3;\n  return fragmentEntity.buffered && (fragmentEntity.body.gap || ((_fragmentEntity$range = fragmentEntity.range.video) == null ? void 0 : _fragmentEntity$range.partial) || ((_fragmentEntity$range2 = fragmentEntity.range.audio) == null ? void 0 : _fragmentEntity$range2.partial) || ((_fragmentEntity$range3 = fragmentEntity.range.audiovideo) == null ? void 0 : _fragmentEntity$range3.partial));\n}\nfunction getFragmentKey(fragment) {\n  return `${fragment.type}_${fragment.level}_${fragment.sn}`;\n}\nconst noopBuffered = {\n  length: 0,\n  start: () => 0,\n  end: () => 0\n};\nclass BufferHelper {\n  /**\n   * Return true if `media`'s buffered include `position`\n   */\n  static isBuffered(media, position) {\n    try {\n      if (media) {\n        const buffered = BufferHelper.getBuffered(media);\n        for (let i = 0; i < buffered.length; i++) {\n          if (position >= buffered.start(i) && position <= buffered.end(i)) {\n            return true;\n          }\n        }\n      }\n    } catch (error) {\n    }\n    return false;\n  }\n  static bufferInfo(media, pos, maxHoleDuration) {\n    try {\n      if (media) {\n        const vbuffered = BufferHelper.getBuffered(media);\n        const buffered = [];\n        let i;\n        for (i = 0; i < vbuffered.length; i++) {\n          buffered.push({\n            start: vbuffered.start(i),\n            end: vbuffered.end(i)\n          });\n        }\n        return this.bufferedInfo(buffered, pos, maxHoleDuration);\n      }\n    } catch (error) {\n    }\n    return {\n      len: 0,\n      start: pos,\n      end: pos,\n      nextStart: void 0\n    };\n  }\n  static bufferedInfo(buffered, pos, maxHoleDuration) {\n    pos = Math.max(0, pos);\n    buffered.sort(function(a, b) {\n      const diff = a.start - b.start;\n      if (diff) {\n        return diff;\n      } else {\n        return b.end - a.end;\n      }\n    });\n    let buffered2 = [];\n    if (maxHoleDuration) {\n      for (let i = 0; i < buffered.length; i++) {\n        const buf2len = buffered2.length;\n        if (buf2len) {\n          const buf2end = buffered2[buf2len - 1].end;\n          if (buffered[i].start - buf2end < maxHoleDuration) {\n            if (buffered[i].end > buf2end) {\n              buffered2[buf2len - 1].end = buffered[i].end;\n            }\n          } else {\n            buffered2.push(buffered[i]);\n          }\n        } else {\n          buffered2.push(buffered[i]);\n        }\n      }\n    } else {\n      buffered2 = buffered;\n    }\n    let bufferLen = 0;\n    let bufferStartNext;\n    let bufferStart = pos;\n    let bufferEnd = pos;\n    for (let i = 0; i < buffered2.length; i++) {\n      const start = buffered2[i].start;\n      const end = buffered2[i].end;\n      if (pos + maxHoleDuration >= start && pos < end) {\n        bufferStart = start;\n        bufferEnd = end;\n        bufferLen = bufferEnd - pos;\n      } else if (pos + maxHoleDuration < start) {\n        bufferStartNext = start;\n        break;\n      }\n    }\n    return {\n      len: bufferLen,\n      start: bufferStart || 0,\n      end: bufferEnd || 0,\n      nextStart: bufferStartNext\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) {\n    try {\n      return media.buffered;\n    } catch (e) {\n      logger.log(\"failed to get media.buffered\", e);\n      return noopBuffered;\n    }\n  }\n}\nclass ChunkMetadata {\n  constructor(level, sn, id, size = 0, part = -1, partial = false) {\n    this.level = void 0;\n    this.sn = void 0;\n    this.part = void 0;\n    this.id = void 0;\n    this.size = void 0;\n    this.partial = void 0;\n    this.transmuxing = getNewPerformanceTiming();\n    this.buffering = {\n      audio: getNewPerformanceTiming(),\n      video: getNewPerformanceTiming(),\n      audiovideo: getNewPerformanceTiming()\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}\nfunction getNewPerformanceTiming() {\n  return {\n    start: 0,\n    executeStart: 0,\n    executeEnd: 0,\n    end: 0\n  };\n}\nfunction findFirstFragWithCC(fragments, cc) {\n  for (let i = 0, len = fragments.length; i < len; i++) {\n    var _fragments$i;\n    if (((_fragments$i = fragments[i]) == null ? void 0 : _fragments$i.cc) === cc) {\n      return fragments[i];\n    }\n  }\n  return null;\n}\nfunction shouldAlignOnDiscontinuities(lastFrag, switchDetails, details) {\n  if (switchDetails) {\n    if (details.endCC > details.startCC || lastFrag && lastFrag.cc < details.startCC) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction findDiscontinuousReferenceFrag(prevDetails, curDetails) {\n  const prevFrags = prevDetails.fragments;\n  const curFrags = curDetails.fragments;\n  if (!curFrags.length || !prevFrags.length) {\n    logger.log(\"No fragments to align\");\n    return;\n  }\n  const prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc);\n  if (!prevStartFrag || prevStartFrag && !prevStartFrag.startPTS) {\n    logger.log(\"No frag in previous level to align on\");\n    return;\n  }\n  return prevStartFrag;\n}\nfunction adjustFragmentStart(frag, sliding) {\n  if (frag) {\n    const start = frag.start + sliding;\n    frag.start = frag.startPTS = start;\n    frag.endPTS = start + frag.duration;\n  }\n}\nfunction adjustSlidingStart(sliding, details) {\n  const fragments = details.fragments;\n  for (let i = 0, len = fragments.length; i < len; i++) {\n    adjustFragmentStart(fragments[i], sliding);\n  }\n  if (details.fragmentHint) {\n    adjustFragmentStart(details.fragmentHint, sliding);\n  }\n  details.alignedSliding = true;\n}\nfunction alignStream(lastFrag, switchDetails, details) {\n  if (!switchDetails) {\n    return;\n  }\n  alignDiscontinuities(lastFrag, details, switchDetails);\n  if (!details.alignedSliding && switchDetails) {\n    alignMediaPlaylistByPDT(details, switchDetails);\n  }\n  if (!details.alignedSliding && switchDetails && !details.skippedSegments) {\n    adjustSliding(switchDetails, details);\n  }\n}\nfunction alignDiscontinuities(lastFrag, details, switchDetails) {\n  if (shouldAlignOnDiscontinuities(lastFrag, switchDetails, details)) {\n    const referenceFrag = findDiscontinuousReferenceFrag(switchDetails, details);\n    if (referenceFrag && isFiniteNumber(referenceFrag.start)) {\n      logger.log(`Adjusting PTS using last level due to CC increase within current level ${details.url}`);\n      adjustSlidingStart(referenceFrag.start, details);\n    }\n  }\n}\nfunction alignMediaPlaylistByPDT(details, refDetails) {\n  if (!details.hasProgramDateTime || !refDetails.hasProgramDateTime) {\n    return;\n  }\n  const fragments = details.fragments;\n  const refFragments = refDetails.fragments;\n  if (!fragments.length || !refFragments.length) {\n    return;\n  }\n  let refFrag;\n  let frag;\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 = findFirstFragWithCC(fragments, refFrag.cc) || 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  const delta = (targetPDT - refPDT) / 1e3 - (frag.start - refFrag.start);\n  adjustSlidingStart(delta, details);\n}\nconst MIN_CHUNK_SIZE = Math.pow(2, 17);\nclass FragmentLoader {\n  constructor(config) {\n    this.config = void 0;\n    this.loader = null;\n    this.partLoadTimeout = -1;\n    this.config = config;\n  }\n  destroy() {\n    if (this.loader) {\n      this.loader.destroy();\n      this.loader = null;\n    }\n  }\n  abort() {\n    if (this.loader) {\n      this.loader.abort();\n    }\n  }\n  load(frag, onProgress) {\n    const url = frag.url;\n    if (!url) {\n      return Promise.reject(new LoadError({\n        type: ErrorTypes.NETWORK_ERROR,\n        details: ErrorDetails.FRAG_LOAD_ERROR,\n        fatal: false,\n        frag,\n        error: new Error(`Fragment does not have a ${url ? \"part list\" : \"url\"}`),\n        networkDetails: null\n      }));\n    }\n    this.abort();\n    const config = this.config;\n    const FragmentILoader = config.fLoader;\n    const DefaultILoader = config.loader;\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          frag.gap = false;\n        }\n      }\n      const loader = this.loader = frag.loader = FragmentILoader ? new FragmentILoader(config) : new DefaultILoader(config);\n      const loaderContext = createLoaderContext(frag);\n      const loadPolicy = getLoaderConfigWithoutReties(config.fragLoadPolicy.default);\n      const loaderConfig = {\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      frag.stats = loader.stats;\n      loader.load(loaderContext, loaderConfig, {\n        onSuccess: (response, stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          let payload = response.data;\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(new LoadError({\n            type: ErrorTypes.NETWORK_ERROR,\n            details: ErrorDetails.FRAG_LOAD_ERROR,\n            fatal: false,\n            frag,\n            response: _objectSpread2({\n              url,\n              data: void 0\n            }, response),\n            error: new Error(`HTTP Error ${response.code} ${response.text}`),\n            networkDetails,\n            stats\n          }));\n        },\n        onAbort: (stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          reject(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        onTimeout: (stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          reject(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        onProgress: (stats, context, data, networkDetails) => {\n          if (onProgress) {\n            onProgress({\n              frag,\n              part: null,\n              payload: data,\n              networkDetails\n            });\n          }\n        }\n      });\n    });\n  }\n  loadPart(frag, part, onProgress) {\n    this.abort();\n    const config = this.config;\n    const FragmentILoader = config.fLoader;\n    const DefaultILoader = config.loader;\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 = frag.loader = FragmentILoader ? new FragmentILoader(config) : new DefaultILoader(config);\n      const loaderContext = createLoaderContext(frag, part);\n      const loadPolicy = getLoaderConfigWithoutReties(config.fragLoadPolicy.default);\n      const loaderConfig = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n        highWaterMark: MIN_CHUNK_SIZE\n      };\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 = {\n            frag,\n            part,\n            payload: response.data,\n            networkDetails\n          };\n          onProgress(partLoadedData);\n          resolve(partLoadedData);\n        },\n        onError: (response, context, networkDetails, stats) => {\n          this.resetLoader(frag, loader);\n          reject(new LoadError({\n            type: ErrorTypes.NETWORK_ERROR,\n            details: ErrorDetails.FRAG_LOAD_ERROR,\n            fatal: false,\n            frag,\n            part,\n            response: _objectSpread2({\n              url: loaderContext.url,\n              data: void 0\n            }, response),\n            error: new Error(`HTTP Error ${response.code} ${response.text}`),\n            networkDetails,\n            stats\n          }));\n        },\n        onAbort: (stats, context, networkDetails) => {\n          frag.stats.aborted = part.stats.aborted;\n          this.resetLoader(frag, loader);\n          reject(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        onTimeout: (stats, context, networkDetails) => {\n          this.resetLoader(frag, loader);\n          reject(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  updateStatsFromPart(frag, 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(Math.round(fragStats.loaded / partTotal), estTotalParts);\n      const estRemainingParts = estTotalParts - estLoadedParts;\n      const estRemainingBytes = 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      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  resetLoader(frag, loader) {\n    frag.loader = null;\n    if (this.loader === loader) {\n      self.clearTimeout(this.partLoadTimeout);\n      this.loader = null;\n    }\n    loader.destroy();\n  }\n}\nfunction createLoaderContext(frag, part = null) {\n  const segment = part || frag;\n  const loaderContext = {\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;\n  const end = segment.byteRangeEndOffset;\n  if (isFiniteNumber(start) && isFiniteNumber(end)) {\n    var _frag$decryptdata;\n    let byteRangeStart = start;\n    let byteRangeEnd = end;\n    if (frag.sn === \"initSegment\" && ((_frag$decryptdata = frag.decryptdata) == null ? void 0 : _frag$decryptdata.method) === \"AES-128\") {\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}\nfunction createGapLoadError(frag, part) {\n  const error = new Error(`GAP ${frag.gap ? \"tag\" : \"attribute\"} found`);\n  const errorData = {\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}\nclass LoadError extends Error {\n  constructor(data) {\n    super(data.error.message);\n    this.data = void 0;\n    this.data = data;\n  }\n}\nclass AESCrypto {\n  constructor(subtle, iv) {\n    this.subtle = void 0;\n    this.aesIV = void 0;\n    this.subtle = subtle;\n    this.aesIV = iv;\n  }\n  decrypt(data, key) {\n    return this.subtle.decrypt({\n      name: \"AES-CBC\",\n      iv: this.aesIV\n    }, key, data);\n  }\n}\nclass FastAESKey {\n  constructor(subtle, key) {\n    this.subtle = void 0;\n    this.key = void 0;\n    this.subtle = subtle;\n    this.key = key;\n  }\n  expandKey() {\n    return this.subtle.importKey(\"raw\", this.key, {\n      name: \"AES-CBC\"\n    }, false, [\"encrypt\", \"decrypt\"]);\n  }\n}\nfunction removePadding(array) {\n  const outputBytes = array.byteLength;\n  const paddingBytes = outputBytes && new DataView(array.buffer).getUint8(outputBytes - 1);\n  if (paddingBytes) {\n    return sliceUint8(array, 0, outputBytes - paddingBytes);\n  }\n  return array;\n}\nclass AESDecryptor {\n  constructor() {\n    this.rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54];\n    this.subMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)];\n    this.invSubMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)];\n    this.sBox = new Uint32Array(256);\n    this.invSBox = new Uint32Array(256);\n    this.key = new Uint32Array(0);\n    this.ksRows = 0;\n    this.keySize = 0;\n    this.keySchedule = void 0;\n    this.invKeySchedule = void 0;\n    this.initTable();\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    return newArray;\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    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 ^ 283;\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 & 255 ^ 99;\n      sBox[x] = sx;\n      invSBox[sx] = x;\n      const x2 = d[x];\n      const x4 = d[x2];\n      const x8 = d[x4];\n      let t = d[sx] * 257 ^ sx * 16843008;\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      t = x8 * 16843009 ^ x4 * 65537 ^ x2 * 257 ^ x * 16843008;\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      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  expandKey(keyBuffer) {\n    const key = this.uint8ArrayToUint32Array_(keyBuffer);\n    let sameKey = true;\n    let offset = 0;\n    while (offset < key.length && sameKey) {\n      sameKey = key[offset] === this.key[offset];\n      offset++;\n    }\n    if (sameKey) {\n      return;\n    }\n    this.key = key;\n    const keySize = this.keySize = key.length;\n    if (keySize !== 4 && keySize !== 6 && keySize !== 8) {\n      throw new Error(\"Invalid aes key size=\" + keySize);\n    }\n    const ksRows = this.ksRows = (keySize + 6 + 1) * 4;\n    let ksRow;\n    let invKsRow;\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    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    let prev;\n    let t;\n    for (ksRow = 0; ksRow < ksRows; ksRow++) {\n      if (ksRow < keySize) {\n        prev = keySchedule[ksRow] = key[ksRow];\n        continue;\n      }\n      t = prev;\n      if (ksRow % keySize === 0) {\n        t = t << 8 | t >>> 24;\n        t = sbox[t >>> 24] << 24 | sbox[t >>> 16 & 255] << 16 | sbox[t >>> 8 & 255] << 8 | sbox[t & 255];\n        t ^= rcon[ksRow / keySize | 0] << 24;\n      } else if (keySize > 6 && ksRow % keySize === 4) {\n        t = sbox[t >>> 24] << 24 | sbox[t >>> 16 & 255] << 16 | sbox[t >>> 8 & 255] << 8 | sbox[t & 255];\n      }\n      keySchedule[ksRow] = prev = (keySchedule[ksRow - keySize] ^ t) >>> 0;\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      if (invKsRow < 4 || ksRow <= 4) {\n        invKeySchedule[invKsRow] = t;\n      } else {\n        invKeySchedule[invKsRow] = invSubMix0[sbox[t >>> 24]] ^ invSubMix1[sbox[t >>> 16 & 255]] ^ invSubMix2[sbox[t >>> 8 & 255]] ^ invSubMix3[sbox[t & 255]];\n      }\n      invKeySchedule[invKsRow] = invKeySchedule[invKsRow] >>> 0;\n    }\n  }\n  // Adding this as a method greatly improves performance.\n  networkToHostOrderSwap(word) {\n    return word << 24 | (word & 65280) << 8 | (word & 16711680) >> 8 | word >>> 24;\n  }\n  decrypt(inputArrayBuffer, offset, aesIV) {\n    const nRounds = this.keySize + 6;\n    const invKeySchedule = this.invKeySchedule;\n    const invSBOX = this.invSBox;\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    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    const inputInt32 = new Int32Array(inputArrayBuffer);\n    const outputInt32 = new Int32Array(inputInt32.length);\n    let t0, t1, t2, t3;\n    let s0, s1, s2, s3;\n    let inputWords0, inputWords1, inputWords2, inputWords3;\n    let ksRow, i;\n    const swapWord = this.networkToHostOrderSwap;\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      s0 = inputWords0 ^ invKeySchedule[0];\n      s1 = inputWords3 ^ invKeySchedule[1];\n      s2 = inputWords2 ^ invKeySchedule[2];\n      s3 = inputWords1 ^ invKeySchedule[3];\n      ksRow = 4;\n      for (i = 1; i < nRounds; i++) {\n        t0 = invSubMix0[s0 >>> 24] ^ invSubMix1[s1 >> 16 & 255] ^ invSubMix2[s2 >> 8 & 255] ^ invSubMix3[s3 & 255] ^ invKeySchedule[ksRow];\n        t1 = invSubMix0[s1 >>> 24] ^ invSubMix1[s2 >> 16 & 255] ^ invSubMix2[s3 >> 8 & 255] ^ invSubMix3[s0 & 255] ^ invKeySchedule[ksRow + 1];\n        t2 = invSubMix0[s2 >>> 24] ^ invSubMix1[s3 >> 16 & 255] ^ invSubMix2[s0 >> 8 & 255] ^ invSubMix3[s1 & 255] ^ invKeySchedule[ksRow + 2];\n        t3 = invSubMix0[s3 >>> 24] ^ invSubMix1[s0 >> 16 & 255] ^ invSubMix2[s1 >> 8 & 255] ^ invSubMix3[s2 & 255] ^ invKeySchedule[ksRow + 3];\n        s0 = t0;\n        s1 = t1;\n        s2 = t2;\n        s3 = t3;\n        ksRow = ksRow + 4;\n      }\n      t0 = invSBOX[s0 >>> 24] << 24 ^ invSBOX[s1 >> 16 & 255] << 16 ^ invSBOX[s2 >> 8 & 255] << 8 ^ invSBOX[s3 & 255] ^ invKeySchedule[ksRow];\n      t1 = invSBOX[s1 >>> 24] << 24 ^ invSBOX[s2 >> 16 & 255] << 16 ^ invSBOX[s3 >> 8 & 255] << 8 ^ invSBOX[s0 & 255] ^ invKeySchedule[ksRow + 1];\n      t2 = invSBOX[s2 >>> 24] << 24 ^ invSBOX[s3 >> 16 & 255] << 16 ^ invSBOX[s0 >> 8 & 255] << 8 ^ invSBOX[s1 & 255] ^ invKeySchedule[ksRow + 2];\n      t3 = invSBOX[s3 >>> 24] << 24 ^ invSBOX[s0 >> 16 & 255] << 16 ^ invSBOX[s1 >> 8 & 255] << 8 ^ invSBOX[s2 & 255] ^ invKeySchedule[ksRow + 3];\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      initVector0 = inputWords0;\n      initVector1 = inputWords1;\n      initVector2 = inputWords2;\n      initVector3 = inputWords3;\n      offset = offset + 4;\n    }\n    return outputInt32.buffer;\n  }\n}\nconst CHUNK_SIZE = 16;\nclass Decrypter {\n  constructor(config, {\n    removePKCS7Padding = true\n  } = {}) {\n    this.logEnabled = true;\n    this.removePKCS7Padding = void 0;\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    this.useSoftware = void 0;\n    this.useSoftware = config.enableSoftwareAES;\n    this.removePKCS7Padding = removePKCS7Padding;\n    if (removePKCS7Padding) {\n      try {\n        const browserCrypto = self.crypto;\n        if (browserCrypto) {\n          this.subtle = browserCrypto.subtle || browserCrypto.webkitSubtle;\n        }\n      } catch (e) {\n      }\n    }\n    if (this.subtle === null) {\n      this.useSoftware = true;\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  isSync() {\n    return this.useSoftware;\n  }\n  flush() {\n    const {\n      currentResult,\n      remainderData\n    } = 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  reset() {\n    this.currentResult = null;\n    this.currentIV = null;\n    this.remainderData = null;\n    if (this.softwareDecrypter) {\n      this.softwareDecrypter = null;\n    }\n  }\n  decrypt(data, key, iv) {\n    if (this.useSoftware) {\n      return new Promise((resolve, reject) => {\n        this.softwareDecrypt(new Uint8Array(data), key, iv);\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);\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  softwareDecrypt(data, key, iv) {\n    const {\n      currentIV,\n      currentResult,\n      remainderData\n    } = this;\n    this.logOnce(\"JS AES decrypt\");\n    if (remainderData) {\n      data = appendUint8Array(remainderData, data);\n      this.remainderData = null;\n    }\n    const currentChunk = this.getValidChunk(data);\n    if (!currentChunk.length) {\n      return null;\n    }\n    if (currentIV) {\n      iv = currentIV;\n    }\n    let softwareDecrypter = this.softwareDecrypter;\n    if (!softwareDecrypter) {\n      softwareDecrypter = this.softwareDecrypter = new AESDecryptor();\n    }\n    softwareDecrypter.expandKey(key);\n    const result = currentResult;\n    this.currentResult = softwareDecrypter.decrypt(currentChunk.buffer, 0, iv);\n    this.currentIV = sliceUint8(currentChunk, -16).buffer;\n    if (!result) {\n      return null;\n    }\n    return result;\n  }\n  webCryptoDecrypt(data, key, iv) {\n    const subtle = this.subtle;\n    if (this.key !== key || !this.fastAesKey) {\n      this.key = key;\n      this.fastAesKey = new FastAESKey(subtle, key);\n    }\n    return this.fastAesKey.expandKey().then((aesKey) => {\n      if (!subtle) {\n        return Promise.reject(new Error(\"web crypto not initialized\"));\n      }\n      this.logOnce(\"WebCrypto AES decrypt\");\n      const crypto2 = new AESCrypto(subtle, new Uint8Array(iv));\n      return crypto2.decrypt(data.buffer, aesKey);\n    }).catch((err) => {\n      logger.warn(`[decrypter]: WebCrypto Error, disable WebCrypto API, ${err.name}: ${err.message}`);\n      return this.onWebCryptoError(data, key, iv);\n    });\n  }\n  onWebCryptoError(data, key, iv) {\n    this.useSoftware = true;\n    this.logEnabled = true;\n    this.softwareDecrypt(data, key, iv);\n    const decryptResult = this.flush();\n    if (decryptResult) {\n      return decryptResult.buffer;\n    }\n    throw new Error(\"WebCrypto and softwareDecrypt: failed to decrypt data\");\n  }\n  getValidChunk(data) {\n    let currentChunk = data;\n    const splitPoint = data.length - data.length % CHUNK_SIZE;\n    if (splitPoint !== data.length) {\n      currentChunk = sliceUint8(data, 0, splitPoint);\n      this.remainderData = sliceUint8(data, splitPoint);\n    }\n    return currentChunk;\n  }\n  logOnce(msg) {\n    if (!this.logEnabled) {\n      return;\n    }\n    logger.log(`[decrypter]: ${msg}`);\n    this.logEnabled = false;\n  }\n}\nconst TimeRanges = {\n  toString: function(r) {\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    return log;\n  }\n};\nconst 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};\nclass BaseStreamController extends TaskLoop {\n  constructor(hls, fragmentTracker, keyLoader, logPrefix, playlistType) {\n    super();\n    this.hls = void 0;\n    this.fragPrevious = null;\n    this.fragCurrent = null;\n    this.fragmentTracker = void 0;\n    this.transmuxer = null;\n    this._state = State.STOPPED;\n    this.playlistType = void 0;\n    this.media = null;\n    this.mediaBuffer = null;\n    this.config = void 0;\n    this.bitrateTest = false;\n    this.lastCurrentTime = 0;\n    this.nextLoadPosition = 0;\n    this.startPosition = 0;\n    this.startTimeOffset = null;\n    this.loadedmetadata = false;\n    this.retryDate = 0;\n    this.levels = null;\n    this.fragmentLoader = void 0;\n    this.keyLoader = void 0;\n    this.levelLastLoaded = null;\n    this.startFragRequested = false;\n    this.decrypter = void 0;\n    this.initPTS = [];\n    this.onvseeking = null;\n    this.onvended = null;\n    this.logPrefix = \"\";\n    this.log = void 0;\n    this.warn = void 0;\n    this.playlistType = playlistType;\n    this.logPrefix = logPrefix;\n    this.log = logger.log.bind(logger, `${logPrefix}:`);\n    this.warn = logger.warn.bind(logger, `${logPrefix}:`);\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    hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n  }\n  doTick() {\n    this.onTickEnd();\n  }\n  onTickEnd() {\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  startLoad(startPosition) {\n  }\n  stopLoad() {\n    this.fragmentLoader.abort();\n    this.keyLoader.abort(this.playlistType);\n    const frag = this.fragCurrent;\n    if (frag != null && 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  _streamEnded(bufferInfo, levelDetails) {\n    if (levelDetails.live || bufferInfo.nextStart || !bufferInfo.end || !this.media) {\n      return false;\n    }\n    const partList = levelDetails.partList;\n    if (partList != null && partList.length) {\n      const lastPart = partList[partList.length - 1];\n      const lastPartBuffered = BufferHelper.isBuffered(this.media, lastPart.start + lastPart.duration / 2);\n      return lastPartBuffered;\n    }\n    const playlistType = levelDetails.fragments[levelDetails.fragments.length - 1].type;\n    return this.fragmentTracker.isEndListAppended(playlistType);\n  }\n  getLevelDetails() {\n    if (this.levels && this.levelLastLoaded !== null) {\n      var _this$levelLastLoaded;\n      return (_this$levelLastLoaded = this.levelLastLoaded) == null ? void 0 : _this$levelLastLoaded.details;\n    }\n  }\n  onMediaAttached(event, data) {\n    const media = this.media = this.mediaBuffer = data.media;\n    this.onvseeking = this.onMediaSeeking.bind(this);\n    this.onvended = this.onMediaEnded.bind(this);\n    media.addEventListener(\"seeking\", this.onvseeking);\n    media.addEventListener(\"ended\", this.onvended);\n    const config = this.config;\n    if (this.levels && config.autoStartLoad && this.state === State.STOPPED) {\n      this.startLoad(config.startPosition);\n    }\n  }\n  onMediaDetaching() {\n    const media = this.media;\n    if (media != null && media.ended) {\n      this.log(\"MSE detaching and video ended, reset startPosition\");\n      this.startPosition = this.lastCurrentTime = 0;\n    }\n    if (media && this.onvseeking && this.onvended) {\n      media.removeEventListener(\"seeking\", this.onvseeking);\n      media.removeEventListener(\"ended\", this.onvended);\n      this.onvseeking = this.onvended = null;\n    }\n    if (this.keyLoader) {\n      this.keyLoader.detach();\n    }\n    this.media = this.mediaBuffer = null;\n    this.loadedmetadata = false;\n    this.fragmentTracker.removeAllFragments();\n    this.stopLoad();\n  }\n  onMediaSeeking() {\n    const {\n      config,\n      fragCurrent,\n      media,\n      mediaBuffer,\n      state\n    } = this;\n    const currentTime = media ? media.currentTime : 0;\n    const bufferInfo = BufferHelper.bufferInfo(mediaBuffer ? mediaBuffer : media, currentTime, config.maxBufferHole);\n    this.log(`media seeking to ${isFiniteNumber(currentTime) ? currentTime.toFixed(3) : currentTime}, state: ${state}`);\n    if (this.state === State.ENDED) {\n      this.resetLoadingState();\n    } else if (fragCurrent) {\n      const tolerance = config.maxFragLookUpTolerance;\n      const fragStartOffset = fragCurrent.start - tolerance;\n      const fragEndOffset = fragCurrent.start + fragCurrent.duration + tolerance;\n      if (!bufferInfo.len || fragEndOffset < bufferInfo.start || fragStartOffset > bufferInfo.end) {\n        const pastFragment = currentTime > fragEndOffset;\n        if (currentTime < fragStartOffset || pastFragment) {\n          if (pastFragment && fragCurrent.loader) {\n            this.log(\"seeking outside of buffer while fragment load in progress, cancel fragment load\");\n            fragCurrent.abortRequests();\n            this.resetLoadingState();\n          }\n          this.fragPrevious = null;\n        }\n      }\n    }\n    if (media) {\n      this.fragmentTracker.removeFragmentsInRange(currentTime, Infinity, this.playlistType, true);\n      this.lastCurrentTime = currentTime;\n    }\n    if (!this.loadedmetadata && !bufferInfo.len) {\n      this.nextLoadPosition = this.startPosition = currentTime;\n    }\n    this.tickImmediate();\n  }\n  onMediaEnded() {\n    this.startPosition = this.lastCurrentTime = 0;\n  }\n  onManifestLoaded(event, data) {\n    this.startTimeOffset = data.startTimeOffset;\n    this.initPTS = [];\n  }\n  onHandlerDestroying() {\n    this.hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n    this.stopLoad();\n    super.onHandlerDestroying();\n    this.hls = null;\n  }\n  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    this.hls = this.log = this.warn = this.decrypter = this.keyLoader = this.fragmentLoader = this.fragmentTracker = null;\n    super.onHandlerDestroyed();\n  }\n  loadFragment(frag, level, targetBufferTime) {\n    this._loadFragForPlayback(frag, level, targetBufferTime);\n  }\n  _loadFragForPlayback(frag, level, targetBufferTime) {\n    const progressCallback = (data) => {\n      if (this.fragContextChanged(frag)) {\n        this.warn(`Fragment ${frag.sn}${data.part ? \" p: \" + data.part.index : \"\"} of level ${frag.level} was dropped during download.`);\n        this.fragmentTracker.removeFragment(frag);\n        return;\n      }\n      frag.stats.chunkCount++;\n      this._handleFragmentLoadProgress(data);\n    };\n    this._doFragLoad(frag, level, targetBufferTime, progressCallback).then((data) => {\n      if (!data) {\n        return;\n      }\n      const state = this.state;\n      if (this.fragContextChanged(frag)) {\n        if (state === State.FRAG_LOADING || !this.fragCurrent && state === State.PARSING) {\n          this.fragmentTracker.removeFragment(frag);\n          this.state = State.IDLE;\n        }\n        return;\n      }\n      if (\"payload\" in data) {\n        this.log(`Loaded fragment ${frag.sn} of level ${frag.level}`);\n        this.hls.trigger(Events.FRAG_LOADED, data);\n      }\n      this._handleFragmentLoadComplete(data);\n    }).catch((reason) => {\n      if (this.state === State.STOPPED || this.state === State.ERROR) {\n        return;\n      }\n      this.warn(reason);\n      this.resetFragmentLoading(frag);\n    });\n  }\n  clearTrackerIfNeeded(frag) {\n    var _this$mediaBuffer;\n    const {\n      fragmentTracker\n    } = this;\n    const fragState = fragmentTracker.getState(frag);\n    if (fragState === FragmentState.APPENDING) {\n      const playlistType = frag.type;\n      const bufferedInfo = this.getFwdBufferInfo(this.mediaBuffer, playlistType);\n      const minForwardBufferLength = Math.max(frag.duration, bufferedInfo ? bufferedInfo.len : this.config.maxBufferLength);\n      if (this.reduceMaxBufferLength(minForwardBufferLength)) {\n        fragmentTracker.removeFragment(frag);\n      }\n    } else if (((_this$mediaBuffer = this.mediaBuffer) == null ? void 0 : _this$mediaBuffer.buffered.length) === 0) {\n      fragmentTracker.removeAllFragments();\n    } else if (fragmentTracker.hasParts(frag.type)) {\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  checkLiveUpdate(details) {\n    if (details.updated && !details.live) {\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  flushMainBuffer(startOffset, endOffset, type = null) {\n    if (!(startOffset - endOffset)) {\n      return;\n    }\n    const flushScope = {\n      startOffset,\n      endOffset,\n      type\n    };\n    this.hls.trigger(Events.BUFFER_FLUSHING, flushScope);\n  }\n  _loadInitSegment(frag, level) {\n    this._doFragLoad(frag, level).then((data) => {\n      if (!data || this.fragContextChanged(frag) || !this.levels) {\n        throw new Error(\"init load aborted\");\n      }\n      return data;\n    }).then((data) => {\n      const {\n        hls\n      } = this;\n      const {\n        payload\n      } = data;\n      const decryptData = frag.decryptdata;\n      if (payload && payload.byteLength > 0 && decryptData != null && decryptData.key && decryptData.iv && decryptData.method === \"AES-128\") {\n        const startTime = self.performance.now();\n        return this.decrypter.decrypt(new Uint8Array(payload), decryptData.key.buffer, decryptData.iv.buffer).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        }).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    }).catch((reason) => {\n      if (this.state === State.STOPPED || this.state === State.ERROR) {\n        return;\n      }\n      this.warn(reason);\n      this.resetFragmentLoading(frag);\n    });\n  }\n  completeInitSegmentLoad(data) {\n    const {\n      levels\n    } = this;\n    if (!levels) {\n      throw new Error(\"init load aborted, missing levels\");\n    }\n    const stats = data.frag.stats;\n    this.state = State.IDLE;\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  fragContextChanged(frag) {\n    const {\n      fragCurrent\n    } = this;\n    return !frag || !fragCurrent || frag.sn !== fragCurrent.sn || frag.level !== fragCurrent.level;\n  }\n  fragBufferedComplete(frag, part) {\n    var _frag$startPTS, _frag$endPTS, _this$fragCurrent, _this$fragPrevious;\n    const media = this.mediaBuffer ? this.mediaBuffer : this.media;\n    this.log(`Buffered ${frag.type} sn: ${frag.sn}${part ? \" part: \" + part.index : \"\"} of ${this.playlistType === PlaylistLevelType.MAIN ? \"level\" : \"track\"} ${frag.level} (frag:[${((_frag$startPTS = frag.startPTS) != null ? _frag$startPTS : NaN).toFixed(3)}-${((_frag$endPTS = frag.endPTS) != null ? _frag$endPTS : NaN).toFixed(3)}] > buffer:${media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : \"(detached)\"})`);\n    if (frag.sn !== \"initSegment\") {\n      var _this$levels;\n      if (frag.type !== PlaylistLevelType.SUBTITLE) {\n        const el = frag.elementaryStreams;\n        if (!Object.keys(el).some((type) => !!el[type])) {\n          this.state = State.IDLE;\n          return;\n        }\n      }\n      const level = (_this$levels = this.levels) == null ? void 0 : _this$levels[frag.level];\n      if (level != null && level.fragmentError) {\n        this.log(`Resetting level fragment error count of ${level.fragmentError} on frag buffered`);\n        level.fragmentError = 0;\n      }\n    }\n    this.state = State.IDLE;\n    if (!media) {\n      return;\n    }\n    if (!this.loadedmetadata && frag.type == PlaylistLevelType.MAIN && media.buffered.length && ((_this$fragCurrent = this.fragCurrent) == null ? void 0 : _this$fragCurrent.sn) === ((_this$fragPrevious = this.fragPrevious) == null ? void 0 : _this$fragPrevious.sn)) {\n      this.loadedmetadata = true;\n      this.seekToStartPos();\n    }\n    this.tick();\n  }\n  seekToStartPos() {\n  }\n  _handleFragmentLoadComplete(fragLoadedEndData) {\n    const {\n      transmuxer\n    } = this;\n    if (!transmuxer) {\n      return;\n    }\n    const {\n      frag,\n      part,\n      partsLoaded\n    } = fragLoadedEndData;\n    const complete = !partsLoaded || partsLoaded.length === 0 || partsLoaded.some((fragLoaded) => !fragLoaded);\n    const chunkMeta = new ChunkMetadata(frag.level, frag.sn, frag.stats.chunkCount + 1, 0, part ? part.index : -1, !complete);\n    transmuxer.flush(chunkMeta);\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  _handleFragmentLoadProgress(frag) {\n  }\n  _doFragLoad(frag, level, targetBufferTime = null, progressCallback) {\n    var _frag$decryptdata;\n    const details = level == null ? void 0 : level.details;\n    if (!this.levels || !details) {\n      throw new Error(`frag load aborted, missing level${details ? \"\" : \" detail\"}s`);\n    }\n    let keyLoadingPromise = null;\n    if (frag.encrypted && !((_frag$decryptdata = frag.decryptdata) != null && _frag$decryptdata.key)) {\n      this.log(`Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${this.logPrefix === \"[stream-controller]\" ? \"level\" : \"track\"} ${frag.level}`);\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, {\n        frag\n      });\n      if (this.fragCurrent === null) {\n        keyLoadingPromise = Promise.reject(new Error(`frag load aborted, context changed in KEY_LOADING`));\n      }\n    } else if (!frag.encrypted && details.encryptedFragments.length) {\n      this.keyLoader.loadClear(frag, details.encryptedFragments);\n    }\n    targetBufferTime = Math.max(frag.start, targetBufferTime || 0);\n    if (this.config.lowLatencyMode && frag.sn !== \"initSegment\") {\n      const partList = details.partList;\n      if (partList && progressCallback) {\n        if (targetBufferTime > frag.end && 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          this.log(`Loading part sn: ${frag.sn} p: ${part.index} cc: ${frag.cc} of playlist [${details.startSN}-${details.endSN}] parts [0-${partIndex}-${partList.length - 1}] ${this.logPrefix === \"[stream-controller]\" ? \"level\" : \"track\"}: ${frag.level}, target: ${parseFloat(targetBufferTime.toFixed(3))}`);\n          this.nextLoadPosition = part.start + part.duration;\n          this.state = State.FRAG_LOADING;\n          let _result;\n          if (keyLoadingPromise) {\n            _result = keyLoadingPromise.then((keyLoadedData) => {\n              if (!keyLoadedData || this.fragContextChanged(keyLoadedData.frag)) {\n                return null;\n              }\n              return this.doFragPartsLoad(frag, part, level, progressCallback);\n            }).catch((error) => this.handleFragLoadError(error));\n          } else {\n            _result = this.doFragPartsLoad(frag, part, level, progressCallback).catch((error) => 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(new Error(`frag load aborted, context changed in FRAG_LOADING parts`));\n          }\n          return _result;\n        } else if (!frag.url || this.loadedEndOfParts(partList, targetBufferTime)) {\n          return Promise.resolve(null);\n        }\n      }\n    }\n    this.log(`Loading fragment ${frag.sn} cc: ${frag.cc} ${details ? \"of [\" + details.startSN + \"-\" + details.endSN + \"] \" : \"\"}${this.logPrefix === \"[stream-controller]\" ? \"level\" : \"track\"}: ${frag.level}, target: ${parseFloat(targetBufferTime.toFixed(3))}`);\n    if (isFiniteNumber(frag.sn) && !this.bitrateTest) {\n      this.nextLoadPosition = frag.start + frag.duration;\n    }\n    this.state = State.FRAG_LOADING;\n    const dataOnProgress = this.config.progressive;\n    let result;\n    if (dataOnProgress && keyLoadingPromise) {\n      result = keyLoadingPromise.then((keyLoadedData) => {\n        if (!keyLoadedData || this.fragContextChanged(keyLoadedData == null ? void 0 : keyLoadedData.frag)) {\n          return null;\n        }\n        return this.fragmentLoader.load(frag, progressCallback);\n      }).catch((error) => this.handleFragLoadError(error));\n    } else {\n      result = Promise.all([this.fragmentLoader.load(frag, dataOnProgress ? progressCallback : void 0), keyLoadingPromise]).then(([fragLoadedData]) => {\n        if (!dataOnProgress && fragLoadedData && progressCallback) {\n          progressCallback(fragLoadedData);\n        }\n        return fragLoadedData;\n      }).catch((error) => this.handleFragLoadError(error));\n    }\n    this.hls.trigger(Events.FRAG_LOADING, {\n      frag,\n      targetBufferTime\n    });\n    if (this.fragCurrent === null) {\n      return Promise.reject(new Error(`frag load aborted, context changed in FRAG_LOADING`));\n    }\n    return result;\n  }\n  doFragPartsLoad(frag, fromPart, level, progressCallback) {\n    return new Promise((resolve, reject) => {\n      var _level$details;\n      const partsLoaded = [];\n      const initialPartList = (_level$details = level.details) == null ? void 0 : _level$details.partList;\n      const loadPart = (part) => {\n        this.fragmentLoader.loadPart(frag, part, progressCallback).then((partLoadedData) => {\n          partsLoaded[part.index] = partLoadedData;\n          const loadedPart = partLoadedData.part;\n          this.hls.trigger(Events.FRAG_LOADED, partLoadedData);\n          const nextPart = getPartWith(level, frag.sn, part.index + 1) || findPart(initialPartList, frag.sn, part.index + 1);\n          if (nextPart) {\n            loadPart(nextPart);\n          } else {\n            return resolve({\n              frag,\n              part: loadedPart,\n              partsLoaded\n            });\n          }\n        }).catch(reject);\n      };\n      loadPart(fromPart);\n    });\n  }\n  handleFragLoadError(error) {\n    if (\"data\" in error) {\n      const data = error.data;\n      if (error.data && data.details === ErrorDetails.INTERNAL_ABORTED) {\n        this.handleFragLoadAborted(data.frag, data.part);\n      } else {\n        this.hls.trigger(Events.ERROR, data);\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  _handleTransmuxerFlush(chunkMeta) {\n    const context = this.getCurrentContext(chunkMeta);\n    if (!context || this.state !== State.PARSING) {\n      if (!this.fragCurrent && this.state !== State.STOPPED && this.state !== State.ERROR) {\n        this.state = State.IDLE;\n      }\n      return;\n    }\n    const {\n      frag,\n      part,\n      level\n    } = context;\n    const now2 = self.performance.now();\n    frag.stats.parsing.end = now2;\n    if (part) {\n      part.stats.parsing.end = now2;\n    }\n    this.updateLevelTiming(frag, part, level, chunkMeta.partial);\n  }\n  getCurrentContext(chunkMeta) {\n    const {\n      levels,\n      fragCurrent\n    } = this;\n    const {\n      level: levelIndex,\n      sn,\n      part: partIndex\n    } = chunkMeta;\n    if (!(levels != null && levels[levelIndex])) {\n      this.warn(`Levels object was unset while buffering fragment ${sn} of level ${levelIndex}. The current chunk will not be buffered.`);\n      return null;\n    }\n    const level = levels[levelIndex];\n    const part = partIndex > -1 ? getPartWith(level, sn, partIndex) : null;\n    const frag = part ? part.fragment : getFragmentWithSN(level, sn, fragCurrent);\n    if (!frag) {\n      return null;\n    }\n    if (fragCurrent && fragCurrent !== frag) {\n      frag.stats = fragCurrent.stats;\n    }\n    return {\n      frag,\n      part,\n      level\n    };\n  }\n  bufferFragmentData(data, frag, part, chunkMeta, noBacktracking) {\n    var _buffer;\n    if (!data || this.state !== State.PARSING) {\n      return;\n    }\n    const {\n      data1,\n      data2\n    } = data;\n    let buffer = data1;\n    if (data1 && data2) {\n      buffer = appendUint8Array(data1, data2);\n    }\n    if (!((_buffer = buffer) != null && _buffer.length)) {\n      return;\n    }\n    const segment = {\n      type: data.type,\n      frag,\n      part,\n      chunkMeta,\n      parent: frag.type,\n      data: buffer\n    };\n    this.hls.trigger(Events.BUFFER_APPENDING, segment);\n    if (data.dropped && data.independent && !part) {\n      if (noBacktracking) {\n        return;\n      }\n      this.flushBufferGap(frag);\n    }\n  }\n  flushBufferGap(frag) {\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    if (!BufferHelper.isBuffered(media, media.currentTime)) {\n      this.flushMainBuffer(0, frag.start);\n      return;\n    }\n    const currentTime = media.currentTime;\n    const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n    const fragDuration = frag.duration;\n    const segmentFraction = Math.min(this.config.maxFragLookUpTolerance * 2, fragDuration * 0.25);\n    const start = Math.max(Math.min(frag.start - segmentFraction, bufferInfo.end - segmentFraction), currentTime + segmentFraction);\n    if (frag.start - start > segmentFraction) {\n      this.flushMainBuffer(start, frag.start);\n    }\n  }\n  getFwdBufferInfo(bufferable, type) {\n    const pos = this.getLoadPosition();\n    if (!isFiniteNumber(pos)) {\n      return null;\n    }\n    return this.getFwdBufferInfoAtPos(bufferable, pos, type);\n  }\n  getFwdBufferInfoAtPos(bufferable, pos, type) {\n    const {\n      config: {\n        maxBufferHole\n      }\n    } = this;\n    const bufferInfo = BufferHelper.bufferInfo(bufferable, pos, maxBufferHole);\n    if (bufferInfo.len === 0 && bufferInfo.nextStart !== void 0) {\n      const bufferedFragAtPos = this.fragmentTracker.getBufferedFrag(pos, type);\n      if (bufferedFragAtPos && bufferInfo.nextStart < bufferedFragAtPos.end) {\n        return BufferHelper.bufferInfo(bufferable, pos, Math.max(bufferInfo.nextStart, maxBufferHole));\n      }\n    }\n    return bufferInfo;\n  }\n  getMaxBufferLength(levelBitrate) {\n    const {\n      config\n    } = this;\n    let maxBufLen;\n    if (levelBitrate) {\n      maxBufLen = Math.max(8 * config.maxBufferSize / levelBitrate, config.maxBufferLength);\n    } else {\n      maxBufLen = config.maxBufferLength;\n    }\n    return Math.min(maxBufLen, config.maxMaxBufferLength);\n  }\n  reduceMaxBufferLength(threshold) {\n    const config = this.config;\n    const minLength = threshold || config.maxBufferLength;\n    if (config.maxMaxBufferLength >= minLength) {\n      config.maxMaxBufferLength /= 2;\n      this.warn(`Reduce max buffer length to ${config.maxMaxBufferLength}s`);\n      return true;\n    }\n    return false;\n  }\n  getAppendedFrag(position, playlistType = PlaylistLevelType.MAIN) {\n    const fragOrPart = this.fragmentTracker.getAppendedFrag(position, PlaylistLevelType.MAIN);\n    if (fragOrPart && \"fragment\" in fragOrPart) {\n      return fragOrPart.fragment;\n    }\n    return fragOrPart;\n  }\n  getNextFragment(pos, levelDetails) {\n    const fragments = levelDetails.fragments;\n    const fragLen = fragments.length;\n    if (!fragLen) {\n      return null;\n    }\n    const {\n      config\n    } = this;\n    const start = fragments[0].start;\n    let frag;\n    if (levelDetails.live) {\n      const initialLiveManifestSize = config.initialLiveManifestSize;\n      if (fragLen < initialLiveManifestSize) {\n        this.warn(`Not enough fragments to start playback (have: ${fragLen}, need: ${initialLiveManifestSize})`);\n        return null;\n      }\n      if (!levelDetails.PTSKnown && !this.startFragRequested && this.startPosition === -1 || pos < start) {\n        frag = this.getInitialLiveFragment(levelDetails, fragments);\n        this.startPosition = this.nextLoadPosition = frag ? this.hls.liveSyncPosition || frag.start : pos;\n      }\n    } else if (pos <= start) {\n      frag = fragments[0];\n    }\n    if (!frag) {\n      const end = config.lowLatencyMode ? levelDetails.partEnd : levelDetails.fragmentEnd;\n      frag = this.getFragmentAtPosition(pos, end, levelDetails);\n    }\n    return this.mapToInitFragWhenRequired(frag);\n  }\n  isLoopLoading(frag, targetBufferTime) {\n    const trackerState = this.fragmentTracker.getState(frag);\n    return (trackerState === FragmentState.OK || trackerState === FragmentState.PARTIAL && !!frag.gap) && this.nextLoadPosition > targetBufferTime;\n  }\n  getNextFragmentLoopLoading(frag, levelDetails, bufferInfo, playlistType, maxBufLen) {\n    const gapStart = frag.gap;\n    const nextFragment = this.getNextFragment(this.nextLoadPosition, levelDetails);\n    if (nextFragment === null) {\n      return nextFragment;\n    }\n    frag = nextFragment;\n    if (gapStart && frag && !frag.gap && bufferInfo.nextStart) {\n      const nextbufferInfo = this.getFwdBufferInfoAtPos(this.mediaBuffer ? this.mediaBuffer : this.media, bufferInfo.nextStart, playlistType);\n      if (nextbufferInfo !== null && bufferInfo.len + nextbufferInfo.len >= maxBufLen) {\n        this.log(`buffer full after gaps in \"${playlistType}\" playlist starting at sn: ${frag.sn}`);\n        return null;\n      }\n    }\n    return frag;\n  }\n  mapToInitFragWhenRequired(frag) {\n    if (frag != null && frag.initSegment && !(frag != null && frag.initSegment.data) && !this.bitrateTest) {\n      return frag.initSegment;\n    }\n    return frag;\n  }\n  getNextPart(partList, frag, targetBufferTime) {\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 ((contiguous || part.independent || independentAttrOmitted) && part.fragment === frag) {\n        nextPart = i;\n      }\n      contiguous = loaded;\n    }\n    return nextPart;\n  }\n  loadedEndOfParts(partList, targetBufferTime) {\n    const lastPart = partList[partList.length - 1];\n    return lastPart && targetBufferTime > lastPart.start && lastPart.loaded;\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  getInitialLiveFragment(levelDetails, fragments) {\n    const fragPrevious = this.fragPrevious;\n    let frag = null;\n    if (fragPrevious) {\n      if (levelDetails.hasProgramDateTime) {\n        this.log(`Live playlist, switching playlist, load frag with same PDT: ${fragPrevious.programDateTime}`);\n        frag = findFragmentByPDT(fragments, fragPrevious.endProgramDateTime, this.config.maxFragLookUpTolerance);\n      }\n      if (!frag) {\n        const targetSN = fragPrevious.sn + 1;\n        if (targetSN >= levelDetails.startSN && targetSN <= levelDetails.endSN) {\n          const fragNext = fragments[targetSN - levelDetails.startSN];\n          if (fragPrevious.cc === fragNext.cc) {\n            frag = fragNext;\n            this.log(`Live playlist, switching playlist, load frag with next SN: ${frag.sn}`);\n          }\n        }\n        if (!frag) {\n          frag = findFragWithCC(fragments, fragPrevious.cc);\n          if (frag) {\n            this.log(`Live playlist, switching playlist, load frag with same CC: ${frag.sn}`);\n          }\n        }\n      }\n    } else {\n      const liveStart = this.hls.liveSyncPosition;\n      if (liveStart !== null) {\n        frag = this.getFragmentAtPosition(liveStart, this.bitrateTest ? levelDetails.fragmentEnd : levelDetails.edge, levelDetails);\n      }\n    }\n    return frag;\n  }\n  /*\n  This method finds the best matching fragment given the provided position.\n   */\n  getFragmentAtPosition(bufferEnd, end, levelDetails) {\n    const {\n      config\n    } = this;\n    let {\n      fragPrevious\n    } = this;\n    let {\n      fragments,\n      endSN\n    } = levelDetails;\n    const {\n      fragmentHint\n    } = levelDetails;\n    const tolerance = config.maxFragLookUpTolerance;\n    const partList = levelDetails.partList;\n    const loadingParts = !!(config.lowLatencyMode && partList != null && partList.length && fragmentHint);\n    if (loadingParts && fragmentHint && !this.bitrateTest) {\n      fragments = fragments.concat(fragmentHint);\n      endSN = fragmentHint.sn;\n    }\n    let frag;\n    if (bufferEnd < end) {\n      const lookupTolerance = bufferEnd > end - tolerance ? 0 : tolerance;\n      frag = findFragmentByPTS(fragPrevious, fragments, bufferEnd, lookupTolerance);\n    } else {\n      frag = fragments[fragments.length - 1];\n    }\n    if (frag) {\n      const curSNIdx = frag.sn - levelDetails.startSN;\n      const fragState = this.fragmentTracker.getState(frag);\n      if (fragState === FragmentState.OK || fragState === FragmentState.PARTIAL && frag.gap) {\n        fragPrevious = frag;\n      }\n      if (fragPrevious && frag.sn === fragPrevious.sn && (!loadingParts || partList[0].fragment.sn > frag.sn)) {\n        const sameLevel = fragPrevious && frag.level === fragPrevious.level;\n        if (sameLevel) {\n          const nextFrag = fragments[curSNIdx + 1];\n          if (frag.sn < endSN && this.fragmentTracker.getState(nextFrag) !== FragmentState.OK) {\n            frag = nextFrag;\n          } else {\n            frag = null;\n          }\n        }\n      }\n    }\n    return frag;\n  }\n  synchronizeToLiveEdge(levelDetails) {\n    const {\n      config,\n      media\n    } = this;\n    if (!media) {\n      return;\n    }\n    const liveSyncPosition = this.hls.liveSyncPosition;\n    const currentTime = media.currentTime;\n    const start = levelDetails.fragments[0].start;\n    const end = levelDetails.edge;\n    const withinSlidingWindow = currentTime >= start - config.maxFragLookUpTolerance && currentTime <= end;\n    if (liveSyncPosition !== null && media.duration > liveSyncPosition && (currentTime < liveSyncPosition || !withinSlidingWindow)) {\n      const maxLatency = config.liveMaxLatencyDuration !== void 0 ? config.liveMaxLatencyDuration : config.liveMaxLatencyDurationCount * levelDetails.targetduration;\n      if (!withinSlidingWindow && media.readyState < 4 || currentTime < end - maxLatency) {\n        if (!this.loadedmetadata) {\n          this.nextLoadPosition = liveSyncPosition;\n        }\n        if (media.readyState) {\n          this.warn(`Playback: ${currentTime.toFixed(3)} is located too far from the end of live sliding playlist: ${end}, reset currentTime to : ${liveSyncPosition.toFixed(3)}`);\n          media.currentTime = liveSyncPosition;\n        }\n      }\n    }\n  }\n  alignPlaylists(details, previousDetails, switchDetails) {\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.fragments[0].start;\n    const firstLevelLoad = !previousDetails;\n    const aligned = details.alignedSliding && isFiniteNumber(slidingStart);\n    if (firstLevelLoad || !aligned && !slidingStart) {\n      const {\n        fragPrevious\n      } = this;\n      alignStream(fragPrevious, switchDetails, details);\n      const alignedSlidingStart = details.fragments[0].start;\n      this.log(`Live playlist sliding: ${alignedSlidingStart.toFixed(2)} start-sn: ${previousDetails ? previousDetails.startSN : \"na\"}->${details.startSN} prev-sn: ${fragPrevious ? fragPrevious.sn : \"na\"} fragments: ${length}`);\n      return alignedSlidingStart;\n    }\n    return slidingStart;\n  }\n  waitForCdnTuneIn(details) {\n    const advancePartLimit = 3;\n    return details.live && details.canBlockReload && details.partTarget && details.tuneInGoal > Math.max(details.partHoldBack, details.partTarget * advancePartLimit);\n  }\n  setStartPosition(details, sliding) {\n    let startPosition = this.startPosition;\n    if (startPosition < sliding) {\n      startPosition = -1;\n    }\n    if (startPosition === -1 || this.lastCurrentTime === -1) {\n      const offsetInMultivariantPlaylist = this.startTimeOffset !== null;\n      const startTimeOffset = offsetInMultivariantPlaylist ? this.startTimeOffset : details.startTimeOffset;\n      if (startTimeOffset !== null && isFiniteNumber(startTimeOffset)) {\n        startPosition = sliding + startTimeOffset;\n        if (startTimeOffset < 0) {\n          startPosition += details.totalduration;\n        }\n        startPosition = Math.min(Math.max(sliding, startPosition), sliding + details.totalduration);\n        this.log(`Start time offset ${startTimeOffset} found in ${offsetInMultivariantPlaylist ? \"multivariant\" : \"media\"} playlist, adjust startPosition to ${startPosition}`);\n        this.startPosition = startPosition;\n      } else if (details.live) {\n        startPosition = this.hls.liveSyncPosition || sliding;\n      } else {\n        this.startPosition = startPosition = 0;\n      }\n      this.lastCurrentTime = startPosition;\n    }\n    this.nextLoadPosition = startPosition;\n  }\n  getLoadPosition() {\n    const {\n      media\n    } = this;\n    let pos = 0;\n    if (this.loadedmetadata && media) {\n      pos = media.currentTime;\n    } else if (this.nextLoadPosition) {\n      pos = this.nextLoadPosition;\n    }\n    return pos;\n  }\n  handleFragLoadAborted(frag, part) {\n    if (this.transmuxer && frag.sn !== \"initSegment\" && frag.stats.aborted) {\n      this.warn(`Fragment ${frag.sn}${part ? \" part \" + part.index : \"\"} of level ${frag.level} was aborted`);\n      this.resetFragmentLoading(frag);\n    }\n  }\n  resetFragmentLoading(frag) {\n    if (!this.fragCurrent || !this.fragContextChanged(frag) && this.state !== State.FRAG_LOADING_WAITING_RETRY) {\n      this.state = State.IDLE;\n    }\n  }\n  onFragmentOrKeyLoadError(filterType, data) {\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    if (!frag || frag.type !== filterType || !this.levels) {\n      return;\n    }\n    if (this.fragContextChanged(frag)) {\n      var _this$fragCurrent2;\n      this.warn(`Frag load error must match current frag to retry ${frag.url} > ${(_this$fragCurrent2 = this.fragCurrent) == null ? void 0 : _this$fragCurrent2.url}`);\n      return;\n    }\n    const gapTagEncountered = data.details === ErrorDetails.FRAG_GAP;\n    if (gapTagEncountered) {\n      this.fragmentTracker.fragBuffered(frag, true);\n    }\n    const errorAction = data.errorAction;\n    const {\n      action,\n      retryCount = 0,\n      retryConfig\n    } = errorAction || {};\n    if (errorAction && action === NetworkErrorAction.RetryRequest && retryConfig) {\n      this.resetStartWhenNotLoaded(this.levelLastLoaded);\n      const delay = getRetryDelay(retryConfig, retryCount);\n      this.warn(`Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${data.details}, retrying loading ${retryCount + 1}/${retryConfig.maxNumRetry} in ${delay}ms`);\n      errorAction.resolved = true;\n      this.retryDate = self.performance.now() + delay;\n      this.state = State.FRAG_LOADING_WAITING_RETRY;\n    } else if (retryConfig && errorAction) {\n      this.resetFragmentErrors(filterType);\n      if (retryCount < retryConfig.maxNumRetry) {\n        if (!gapTagEncountered && action !== NetworkErrorAction.RemoveAlternatePermanently) {\n          errorAction.resolved = true;\n        }\n      } else {\n        logger.warn(`${data.details} reached or exceeded max retry (${retryCount})`);\n        return;\n      }\n    } else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {\n      this.state = State.WAITING_LEVEL;\n    } else {\n      this.state = State.ERROR;\n    }\n    this.tickImmediate();\n  }\n  reduceLengthAndFlushBuffer(data) {\n    if (this.state === State.PARSING || this.state === State.PARSED) {\n      const playlistType = data.parent;\n      const bufferedInfo = this.getFwdBufferInfo(this.mediaBuffer, playlistType);\n      const buffered = bufferedInfo && bufferedInfo.len > 0.5;\n      if (buffered) {\n        this.reduceMaxBufferLength(bufferedInfo.len);\n      }\n      const flushBuffer = !buffered;\n      if (flushBuffer) {\n        this.warn(`Buffer full error while media.currentTime is not buffered, flush ${playlistType} buffer`);\n      }\n      if (data.frag) {\n        this.fragmentTracker.removeFragment(data.frag);\n        this.nextLoadPosition = data.frag.start;\n      }\n      this.resetLoadingState();\n      return flushBuffer;\n    }\n    return false;\n  }\n  resetFragmentErrors(filterType) {\n    if (filterType === PlaylistLevelType.AUDIO) {\n      this.fragCurrent = null;\n    }\n    if (!this.loadedmetadata) {\n      this.startFragRequested = false;\n    }\n    if (this.state !== State.STOPPED) {\n      this.state = State.IDLE;\n    }\n  }\n  afterBufferFlushed(media, bufferType, playlistType) {\n    if (!media) {\n      return;\n    }\n    const bufferedTimeRanges = BufferHelper.getBuffered(media);\n    this.fragmentTracker.detectEvictedFragments(bufferType, bufferedTimeRanges, playlistType);\n    if (this.state === State.ENDED) {\n      this.resetLoadingState();\n    }\n  }\n  resetLoadingState() {\n    this.log(\"Reset loading state\");\n    this.fragCurrent = null;\n    this.fragPrevious = null;\n    this.state = State.IDLE;\n  }\n  resetStartWhenNotLoaded(level) {\n    if (!this.loadedmetadata) {\n      this.startFragRequested = false;\n      const details = level ? level.details : null;\n      if (details != null && details.live) {\n        this.startPosition = -1;\n        this.setStartPosition(details, 0);\n        this.resetLoadingState();\n      } else {\n        this.nextLoadPosition = this.startPosition;\n      }\n    }\n  }\n  resetWhenMissingContext(chunkMeta) {\n    this.warn(`The loading context changed while buffering fragment ${chunkMeta.sn} of level ${chunkMeta.level}. This chunk will not be buffered.`);\n    this.removeUnbufferedFrags();\n    this.resetStartWhenNotLoaded(this.levelLastLoaded);\n    this.resetLoadingState();\n  }\n  removeUnbufferedFrags(start = 0) {\n    this.fragmentTracker.removeFragmentsInRange(start, Infinity, this.playlistType, false, true);\n  }\n  updateLevelTiming(frag, part, level, partial) {\n    var _this$transmuxer;\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((result, type) => {\n      const info = frag.elementaryStreams[type];\n      if (info) {\n        const parsedDuration = info.endPTS - info.startPTS;\n        if (parsedDuration <= 0) {\n          this.warn(`Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration})`);\n          return result || false;\n        }\n        const drift = partial ? 0 : updateFragPTSDTS(details, frag, info.startPTS, info.endPTS, info.startDTS, info.endDTS);\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    }, false);\n    if (!parsed && ((_this$transmuxer = this.transmuxer) == null ? void 0 : _this$transmuxer.error) === null) {\n      const error = new Error(`Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing`);\n      if (level.fragmentError === 0) {\n        level.fragmentError++;\n        frag.gap = true;\n        this.fragmentTracker.removeFragment(frag);\n        this.fragmentTracker.fragBuffered(frag, true);\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 level \"${level.url}\"`\n      });\n      if (!this.hls) {\n        return;\n      }\n      this.resetTransmuxer();\n    }\n    this.state = State.PARSED;\n    this.hls.trigger(Events.FRAG_PARSED, {\n      frag,\n      part\n    });\n  }\n  resetTransmuxer() {\n    if (this.transmuxer) {\n      this.transmuxer.destroy();\n      this.transmuxer = null;\n    }\n  }\n  recoverWorkerError(data) {\n    if (data.event === \"demuxerWorker\") {\n      this.fragmentTracker.removeAllFragments();\n      this.resetTransmuxer();\n      this.resetStartWhenNotLoaded(this.levelLastLoaded);\n      this.resetLoadingState();\n    }\n  }\n  set state(nextState) {\n    const previousState = this._state;\n    if (previousState !== nextState) {\n      this._state = nextState;\n      this.log(`${previousState}->${nextState}`);\n    }\n  }\n  get state() {\n    return this._state;\n  }\n}\nclass ChunkCache {\n  constructor() {\n    this.chunks = [];\n    this.dataLength = 0;\n  }\n  push(chunk) {\n    this.chunks.push(chunk);\n    this.dataLength += chunk.length;\n  }\n  flush() {\n    const {\n      chunks,\n      dataLength\n    } = this;\n    let result;\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  reset() {\n    this.chunks.length = 0;\n    this.dataLength = 0;\n  }\n}\nfunction concatUint8Arrays(chunks, dataLength) {\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}\nfunction hasUMDWorker() {\n  return typeof __HLS_WORKER_BUNDLE__ === \"function\";\n}\nfunction injectWorker() {\n  const blob = new self.Blob([`var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(${__HLS_WORKER_BUNDLE__.toString()})(true);`], {\n    type: \"text/javascript\"\n  });\n  const objectURL = self.URL.createObjectURL(blob);\n  const worker = new self.Worker(objectURL);\n  return {\n    worker,\n    objectURL\n  };\n}\nfunction loadWorker(path) {\n  const scriptURL = new self.URL(path, self.location.href).href;\n  const worker = new self.Worker(scriptURL);\n  return {\n    worker,\n    scriptURL\n  };\n}\nfunction dummyTrack(type = \"\", inputTimeScale = 9e4) {\n  return {\n    type,\n    id: -1,\n    pid: -1,\n    inputTimeScale,\n    sequenceNumber: -1,\n    samples: [],\n    dropped: 0\n  };\n}\nclass BaseAudioDemuxer {\n  constructor() {\n    this._audioTrack = void 0;\n    this._id3Track = void 0;\n    this.frameIndex = 0;\n    this.cachedData = null;\n    this.basePTS = null;\n    this.initPTS = null;\n    this.lastPTS = null;\n  }\n  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\n    this._id3Track = {\n      type: \"id3\",\n      id: 3,\n      pid: -1,\n      inputTimeScale: 9e4,\n      sequenceNumber: 0,\n      samples: [],\n      dropped: 0\n    };\n  }\n  resetTimeStamp(deaultTimestamp) {\n    this.initPTS = deaultTimestamp;\n    this.resetContiguity();\n  }\n  resetContiguity() {\n    this.basePTS = null;\n    this.lastPTS = null;\n    this.frameIndex = 0;\n  }\n  canParse(data, offset) {\n    return false;\n  }\n  appendFrame(track, data, offset) {\n  }\n  // feed incoming data to the front of the parsing pipeline\n  demux(data, timeOffset) {\n    if (this.cachedData) {\n      data = appendUint8Array(this.cachedData, data);\n      this.cachedData = null;\n    }\n    let id3Data = getID3Data(data, 0);\n    let offset = id3Data ? id3Data.length : 0;\n    let lastDataIndex;\n    const track = this._audioTrack;\n    const id3Track = this._id3Track;\n    const timestamp = id3Data ? getTimeStamp(id3Data) : void 0;\n    const length = data.length;\n    if (this.basePTS === null || this.frameIndex === 0 && isFiniteNumber(timestamp)) {\n      this.basePTS = initPTSFn(timestamp, timeOffset, this.initPTS);\n      this.lastPTS = this.basePTS;\n    }\n    if (this.lastPTS === null) {\n      this.lastPTS = this.basePTS;\n    }\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    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 (canParse$2(data, offset)) {\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 = sliceUint8(data, lastDataIndex);\n        if (this.cachedData) {\n          this.cachedData = appendUint8Array(this.cachedData, partialData);\n        } else {\n          this.cachedData = partialData;\n        }\n      }\n    }\n    return {\n      audioTrack: track,\n      videoTrack: dummyTrack(),\n      id3Track,\n      textTrack: dummyTrack()\n    };\n  }\n  demuxSampleAes(data, keyData, timeOffset) {\n    return Promise.reject(new Error(`[${this}] This demuxer does not support Sample-AES decryption`));\n  }\n  flush(timeOffset) {\n    const cachedData = this.cachedData;\n    if (cachedData) {\n      this.cachedData = null;\n      this.demux(cachedData, 0);\n    }\n    return {\n      audioTrack: this._audioTrack,\n      videoTrack: dummyTrack(),\n      id3Track: this._id3Track,\n      textTrack: dummyTrack()\n    };\n  }\n  destroy() {\n  }\n}\nconst initPTSFn = (timestamp, timeOffset, initPTS) => {\n  if (isFiniteNumber(timestamp)) {\n    return timestamp * 90;\n  }\n  const init90kHz = initPTS ? initPTS.baseTime * 9e4 / initPTS.timescale : 0;\n  return timeOffset * 9e4 + init90kHz;\n};\nfunction getAudioConfig(observer, data, offset, audioCodec) {\n  let adtsObjectType;\n  let adtsExtensionSamplingIndex;\n  let adtsChannelConfig;\n  let config;\n  const userAgent = navigator.userAgent.toLowerCase();\n  const manifestCodec = audioCodec;\n  const adtsSamplingRates = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n  adtsObjectType = ((data[offset + 2] & 192) >>> 6) + 1;\n  const adtsSamplingIndex = (data[offset + 2] & 60) >>> 2;\n  if (adtsSamplingIndex > adtsSamplingRates.length - 1) {\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  adtsChannelConfig = (data[offset + 2] & 1) << 2;\n  adtsChannelConfig |= (data[offset + 3] & 192) >>> 6;\n  logger.log(`manifest codec:${audioCodec}, ADTS type:${adtsObjectType}, samplingIndex:${adtsSamplingIndex}`);\n  if (/firefox/i.test(userAgent)) {\n    if (adtsSamplingIndex >= 6) {\n      adtsObjectType = 5;\n      config = new Array(4);\n      adtsExtensionSamplingIndex = adtsSamplingIndex - 3;\n    } else {\n      adtsObjectType = 2;\n      config = new Array(2);\n      adtsExtensionSamplingIndex = adtsSamplingIndex;\n    }\n  } else if (userAgent.indexOf(\"android\") !== -1) {\n    adtsObjectType = 2;\n    config = new Array(2);\n    adtsExtensionSamplingIndex = adtsSamplingIndex;\n  } else {\n    adtsObjectType = 5;\n    config = new Array(4);\n    if (audioCodec && (audioCodec.indexOf(\"mp4a.40.29\") !== -1 || audioCodec.indexOf(\"mp4a.40.5\") !== -1) || !audioCodec && adtsSamplingIndex >= 6) {\n      adtsExtensionSamplingIndex = adtsSamplingIndex - 3;\n    } else {\n      if (audioCodec && audioCodec.indexOf(\"mp4a.40.2\") !== -1 && (adtsSamplingIndex >= 6 && adtsChannelConfig === 1 || /vivaldi/i.test(userAgent)) || !audioCodec && adtsChannelConfig === 1) {\n        adtsObjectType = 2;\n        config = new Array(2);\n      }\n      adtsExtensionSamplingIndex = adtsSamplingIndex;\n    }\n  }\n  config[0] = adtsObjectType << 3;\n  config[0] |= (adtsSamplingIndex & 14) >> 1;\n  config[1] |= (adtsSamplingIndex & 1) << 7;\n  config[1] |= adtsChannelConfig << 3;\n  if (adtsObjectType === 5) {\n    config[1] |= (adtsExtensionSamplingIndex & 14) >> 1;\n    config[2] = (adtsExtensionSamplingIndex & 1) << 7;\n    config[2] |= 2 << 2;\n    config[3] = 0;\n  }\n  return {\n    config,\n    samplerate: adtsSamplingRates[adtsSamplingIndex],\n    channelCount: adtsChannelConfig,\n    codec: \"mp4a.40.\" + adtsObjectType,\n    manifestCodec\n  };\n}\nfunction isHeaderPattern$1(data, offset) {\n  return data[offset] === 255 && (data[offset + 1] & 246) === 240;\n}\nfunction getHeaderLength(data, offset) {\n  return data[offset + 1] & 1 ? 7 : 9;\n}\nfunction getFullFrameLength(data, offset) {\n  return (data[offset + 3] & 3) << 11 | data[offset + 4] << 3 | (data[offset + 5] & 224) >>> 5;\n}\nfunction canGetFrameLength(data, offset) {\n  return offset + 5 < data.length;\n}\nfunction isHeader$1(data, offset) {\n  return offset + 1 < data.length && isHeaderPattern$1(data, offset);\n}\nfunction canParse$1(data, offset) {\n  return canGetFrameLength(data, offset) && isHeaderPattern$1(data, offset) && getFullFrameLength(data, offset) <= data.length - offset;\n}\nfunction probe$1(data, offset) {\n  if (isHeader$1(data, offset)) {\n    const headerLength = getHeaderLength(data, offset);\n    if (offset + headerLength >= data.length) {\n      return false;\n    }\n    const frameLength = getFullFrameLength(data, offset);\n    if (frameLength <= headerLength) {\n      return false;\n    }\n    const newOffset = offset + frameLength;\n    return newOffset === data.length || isHeader$1(data, newOffset);\n  }\n  return false;\n}\nfunction initTrackConfig(track, observer, data, offset, audioCodec) {\n  if (!track.samplerate) {\n    const config = getAudioConfig(observer, data, offset, audioCodec);\n    if (!config) {\n      return;\n    }\n    track.config = config.config;\n    track.samplerate = config.samplerate;\n    track.channelCount = config.channelCount;\n    track.codec = config.codec;\n    track.manifestCodec = config.manifestCodec;\n    logger.log(`parsed codec:${track.codec}, rate:${config.samplerate}, channels:${config.channelCount}`);\n  }\n}\nfunction getFrameDuration(samplerate) {\n  return 1024 * 9e4 / samplerate;\n}\nfunction parseFrameHeader(data, offset) {\n  const headerLength = getHeaderLength(data, offset);\n  if (offset + headerLength <= data.length) {\n    const frameLength = getFullFrameLength(data, offset) - headerLength;\n    if (frameLength > 0) {\n      return {\n        headerLength,\n        frameLength\n      };\n    }\n  }\n}\nfunction appendFrame$2(track, data, offset, pts, frameIndex) {\n  const frameDuration = getFrameDuration(track.samplerate);\n  const stamp = pts + frameIndex * frameDuration;\n  const header = parseFrameHeader(data, offset);\n  let unit;\n  if (header) {\n    const {\n      frameLength,\n      headerLength\n    } = header;\n    const _length = headerLength + frameLength;\n    const missing = Math.max(0, offset + _length - data.length);\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    const _sample = {\n      unit,\n      pts: stamp\n    };\n    if (!missing) {\n      track.samples.push(_sample);\n    }\n    return {\n      sample: _sample,\n      length: _length,\n      missing\n    };\n  }\n  const length = data.length - offset;\n  unit = new Uint8Array(length);\n  unit.set(data.subarray(offset, data.length), 0);\n  const sample = {\n    unit,\n    pts: stamp\n  };\n  return {\n    sample,\n    length,\n    missing: -1\n  };\n}\nlet chromeVersion$1 = null;\nconst BitratesMap = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];\nconst SamplingRateMap = [44100, 48e3, 32e3, 22050, 24e3, 16e3, 11025, 12e3, 8e3];\nconst SamplesCoefficients = [\n  // MPEG 2.5\n  [\n    0,\n    // Reserved\n    72,\n    // Layer3\n    144,\n    // Layer2\n    12\n    // Layer1\n  ],\n  // Reserved\n  [\n    0,\n    // Reserved\n    0,\n    // Layer3\n    0,\n    // Layer2\n    0\n    // Layer1\n  ],\n  // MPEG 2\n  [\n    0,\n    // Reserved\n    72,\n    // Layer3\n    144,\n    // Layer2\n    12\n    // Layer1\n  ],\n  // MPEG 1\n  [\n    0,\n    // Reserved\n    144,\n    // Layer3\n    144,\n    // Layer2\n    12\n    // Layer1\n  ]\n];\nconst BytesInSlot = [\n  0,\n  // Reserved\n  1,\n  // Layer3\n  1,\n  // Layer2\n  4\n  // Layer1\n];\nfunction appendFrame$1(track, data, offset, pts, frameIndex) {\n  if (offset + 24 > data.length) {\n    return;\n  }\n  const header = parseHeader(data, offset);\n  if (header && offset + header.frameLength <= data.length) {\n    const frameDuration = header.samplesPerFrame * 9e4 / 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    track.config = [];\n    track.channelCount = header.channelCount;\n    track.samplerate = header.sampleRate;\n    track.samples.push(sample);\n    return {\n      sample,\n      length: header.frameLength,\n      missing: 0\n    };\n  }\n}\nfunction parseHeader(data, offset) {\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 (mpegVersion !== 1 && bitRateIndex !== 0 && bitRateIndex !== 15 && sampleRateIndex !== 3) {\n    const paddingBit = data[offset + 2] >> 1 & 1;\n    const channelMode = data[offset + 3] >> 6;\n    const columnInBitrates = mpegVersion === 3 ? 3 - mpegLayer : mpegLayer === 3 ? 3 : 4;\n    const bitRate = BitratesMap[columnInBitrates * 14 + bitRateIndex - 1] * 1e3;\n    const columnInSampleRates = mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2;\n    const sampleRate = SamplingRateMap[columnInSampleRates * 3 + sampleRateIndex];\n    const channelCount = channelMode === 3 ? 1 : 2;\n    const sampleCoefficient = SamplesCoefficients[mpegVersion][mpegLayer];\n    const bytesInSlot = BytesInSlot[mpegLayer];\n    const samplesPerFrame = sampleCoefficient * 8 * bytesInSlot;\n    const frameLength = Math.floor(sampleCoefficient * bitRate / sampleRate + paddingBit) * bytesInSlot;\n    if (chromeVersion$1 === null) {\n      const userAgent = navigator.userAgent || \"\";\n      const result = userAgent.match(/Chrome\\/(\\d+)/i);\n      chromeVersion$1 = result ? parseInt(result[1]) : 0;\n    }\n    const needChromeFix = !!chromeVersion$1 && chromeVersion$1 <= 87;\n    if (needChromeFix && mpegLayer === 2 && bitRate >= 224e3 && channelMode === 0) {\n      data[offset + 3] = data[offset + 3] | 128;\n    }\n    return {\n      sampleRate,\n      channelCount,\n      frameLength,\n      samplesPerFrame\n    };\n  }\n}\nfunction isHeaderPattern(data, offset) {\n  return data[offset] === 255 && (data[offset + 1] & 224) === 224 && (data[offset + 1] & 6) !== 0;\n}\nfunction isHeader(data, offset) {\n  return offset + 1 < data.length && isHeaderPattern(data, offset);\n}\nfunction canParse(data, offset) {\n  const headerSize = 4;\n  return isHeaderPattern(data, offset) && headerSize <= data.length - offset;\n}\nfunction probe(data, offset) {\n  if (offset + 1 < data.length && isHeaderPattern(data, offset)) {\n    const headerLength = 4;\n    const header = parseHeader(data, offset);\n    let frameLength = headerLength;\n    if (header != null && header.frameLength) {\n      frameLength = header.frameLength;\n    }\n    const newOffset = offset + frameLength;\n    return newOffset === data.length || isHeader(data, newOffset);\n  }\n  return false;\n}\nclass AACDemuxer extends BaseAudioDemuxer {\n  constructor(observer, config) {\n    super();\n    this.observer = void 0;\n    this.config = void 0;\n    this.observer = observer;\n    this.config = config;\n  }\n  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\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: 9e4,\n      dropped: 0\n    };\n  }\n  // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS\n  static probe(data) {\n    if (!data) {\n      return false;\n    }\n    const id3Data = getID3Data(data, 0);\n    let offset = (id3Data == null ? void 0 : id3Data.length) || 0;\n    if (probe(data, offset)) {\n      return false;\n    }\n    for (let length = data.length; offset < length; offset++) {\n      if (probe$1(data, offset)) {\n        logger.log(\"ADTS sync word found !\");\n        return true;\n      }\n    }\n    return false;\n  }\n  canParse(data, offset) {\n    return canParse$1(data, offset);\n  }\n  appendFrame(track, data, offset) {\n    initTrackConfig(track, this.observer, data, offset, track.manifestCodec);\n    const frame = appendFrame$2(track, data, offset, this.basePTS, this.frameIndex);\n    if (frame && frame.missing === 0) {\n      return frame;\n    }\n  }\n}\nconst emsgSchemePattern = /\\/emsg[-/]ID3/i;\nclass MP4Demuxer {\n  constructor(observer, config) {\n    this.remainderData = null;\n    this.timeOffset = 0;\n    this.config = void 0;\n    this.videoTrack = void 0;\n    this.audioTrack = void 0;\n    this.id3Track = void 0;\n    this.txtTrack = void 0;\n    this.config = config;\n  }\n  resetTimeStamp() {\n  }\n  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\n    const videoTrack = this.videoTrack = dummyTrack(\"video\", 1);\n    const audioTrack = this.audioTrack = dummyTrack(\"audio\", 1);\n    const captionTrack = this.txtTrack = dummyTrack(\"text\", 1);\n    this.id3Track = dummyTrack(\"id3\", 1);\n    this.timeOffset = 0;\n    if (!(initSegment != null && initSegment.byteLength)) {\n      return;\n    }\n    const initData = parseInitSegment(initSegment);\n    if (initData.video) {\n      const {\n        id,\n        timescale,\n        codec\n      } = initData.video;\n      videoTrack.id = id;\n      videoTrack.timescale = captionTrack.timescale = timescale;\n      videoTrack.codec = codec;\n    }\n    if (initData.audio) {\n      const {\n        id,\n        timescale,\n        codec\n      } = initData.audio;\n      audioTrack.id = id;\n      audioTrack.timescale = timescale;\n      audioTrack.codec = codec;\n    }\n    captionTrack.id = RemuxerTrackIdConfig.text;\n    videoTrack.sampleDuration = 0;\n    videoTrack.duration = audioTrack.duration = trackDuration;\n  }\n  resetContiguity() {\n    this.remainderData = null;\n  }\n  static probe(data) {\n    return hasMoofData(data);\n  }\n  demux(data, timeOffset) {\n    this.timeOffset = timeOffset;\n    let videoSamples = data;\n    const videoTrack = this.videoTrack;\n    const textTrack = this.txtTrack;\n    if (this.config.progressive) {\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    return {\n      videoTrack,\n      audioTrack: this.audioTrack,\n      id3Track,\n      textTrack: this.txtTrack\n    };\n  }\n  flush() {\n    const timeOffset = this.timeOffset;\n    const videoTrack = this.videoTrack;\n    const textTrack = this.txtTrack;\n    videoTrack.samples = this.remainderData || new Uint8Array();\n    this.remainderData = null;\n    const id3Track = this.extractID3Track(videoTrack, this.timeOffset);\n    textTrack.samples = parseSamples(timeOffset, videoTrack);\n    return {\n      videoTrack,\n      audioTrack: dummyTrack(),\n      id3Track,\n      textTrack: dummyTrack()\n    };\n  }\n  extractID3Track(videoTrack, timeOffset) {\n    const id3Track = this.id3Track;\n    if (videoTrack.samples.length) {\n      const emsgs = findBox(videoTrack.samples, [\"emsg\"]);\n      if (emsgs) {\n        emsgs.forEach((data) => {\n          const emsgInfo = parseEmsg(data);\n          if (emsgSchemePattern.test(emsgInfo.schemeIdUri)) {\n            const pts = isFiniteNumber(emsgInfo.presentationTime) ? emsgInfo.presentationTime / emsgInfo.timeScale : timeOffset + emsgInfo.presentationTimeDelta / emsgInfo.timeScale;\n            let duration = emsgInfo.eventDuration === 4294967295 ? Number.POSITIVE_INFINITY : emsgInfo.eventDuration / emsgInfo.timeScale;\n            if (duration <= 1e-3) {\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,\n              type: MetadataSchema.emsg,\n              duration\n            });\n          }\n        });\n      }\n    }\n    return id3Track;\n  }\n  demuxSampleAes(data, keyData, timeOffset) {\n    return Promise.reject(new Error(\"The MP4 demuxer does not support SAMPLE-AES decryption\"));\n  }\n  destroy() {\n  }\n}\nconst getAudioBSID = (data, offset) => {\n  let bsid = 0;\n  let numBits = 5;\n  offset += numBits;\n  const temp = new Uint32Array(1);\n  const mask = new Uint32Array(1);\n  const byte = new Uint8Array(1);\n  while (numBits > 0) {\n    byte[0] = data[offset];\n    const bits = Math.min(numBits, 8);\n    const shift = 8 - bits;\n    mask[0] = 4278190080 >>> 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};\nclass AC3Demuxer extends BaseAudioDemuxer {\n  constructor(observer) {\n    super();\n    this.observer = void 0;\n    this.observer = observer;\n  }\n  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\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: 9e4,\n      dropped: 0\n    };\n  }\n  canParse(data, offset) {\n    return offset + 64 < data.length;\n  }\n  appendFrame(track, data, offset) {\n    const frameLength = appendFrame(track, data, offset, this.basePTS, this.frameIndex);\n    if (frameLength !== -1) {\n      const sample = track.samples[track.samples.length - 1];\n      return {\n        sample,\n        length: frameLength,\n        missing: 0\n      };\n    }\n  }\n  static probe(data) {\n    if (!data) {\n      return false;\n    }\n    const id3Data = getID3Data(data, 0);\n    if (!id3Data) {\n      return false;\n    }\n    const offset = id3Data.length;\n    if (data[offset] === 11 && data[offset + 1] === 119 && getTimeStamp(id3Data) !== void 0 && // check the bsid to confirm ac-3\n    getAudioBSID(data, offset) < 16) {\n      return true;\n    }\n    return false;\n  }\n}\nfunction appendFrame(track, data, start, pts, frameIndex) {\n  if (start + 8 > data.length) {\n    return -1;\n  }\n  if (data[start] !== 11 || data[start + 1] !== 119) {\n    return -1;\n  }\n  const samplingRateCode = data[start + 4] >> 6;\n  if (samplingRateCode >= 3) {\n    return -1;\n  }\n  const samplingRateMap = [48e3, 44100, 32e3];\n  const sampleRate = samplingRateMap[samplingRateCode];\n  const frameSizeCode = data[start + 4] & 63;\n  const frameSizeMap = [64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105, 144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160, 174, 240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336, 224, 244, 336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349, 480, 384, 417, 576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512, 557, 768, 512, 558, 768, 640, 696, 960, 640, 697, 960, 768, 835, 1152, 768, 836, 1152, 896, 975, 1344, 896, 976, 1344, 1024, 1114, 1536, 1024, 1115, 1536, 1152, 1253, 1728, 1152, 1254, 1728, 1280, 1393, 1920, 1280, 1394, 1920];\n  const frameLength = frameSizeMap[frameSizeCode * 3 + samplingRateCode] * 2;\n  if (start + frameLength > data.length) {\n    return -1;\n  }\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  const lfeon = (data[start + 6] << 8 | data[start + 7]) >> 12 - skipCount & 1;\n  const channelsMap = [2, 1, 2, 3, 3, 4, 4, 5];\n  const channelCount = channelsMap[channelMode] + lfeon;\n  const bsid = data[start + 5] >> 3;\n  const bsmod = data[start + 5] & 7;\n  const config = new Uint8Array([samplingRateCode << 6 | bsid << 1 | bsmod >> 2, (bsmod & 3) << 6 | channelMode << 3 | lfeon << 2 | frameSizeCode >> 4, frameSizeCode << 4 & 224]);\n  const frameDuration = 1536 / sampleRate * 9e4;\n  const stamp = pts + frameIndex * frameDuration;\n  const unit = data.subarray(start, start + frameLength);\n  track.config = config;\n  track.channelCount = channelCount;\n  track.samplerate = sampleRate;\n  track.samples.push({\n    unit,\n    pts: stamp\n  });\n  return frameLength;\n}\nclass BaseVideoParser {\n  constructor() {\n    this.VideoSample = null;\n  }\n  createVideoSample(key, pts, dts, debug) {\n    return {\n      key,\n      frame: false,\n      pts,\n      dts,\n      units: [],\n      debug,\n      length: 0\n    };\n  }\n  getLastNalUnit(samples) {\n    var _VideoSample;\n    let VideoSample = this.VideoSample;\n    let lastUnit;\n    if (!VideoSample || VideoSample.units.length === 0) {\n      VideoSample = samples[samples.length - 1];\n    }\n    if ((_VideoSample = VideoSample) != null && _VideoSample.units) {\n      const units = VideoSample.units;\n      lastUnit = units[units.length - 1];\n    }\n    return lastUnit;\n  }\n  pushAccessUnit(VideoSample, videoTrack) {\n    if (VideoSample.units.length && VideoSample.frame) {\n      if (VideoSample.pts === void 0) {\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          videoTrack.dropped++;\n          return;\n        }\n      }\n      videoTrack.samples.push(VideoSample);\n    }\n    if (VideoSample.debug.length) {\n      logger.log(VideoSample.pts + \"/\" + VideoSample.dts + \":\" + VideoSample.debug);\n    }\n  }\n}\nclass ExpGolomb {\n  constructor(data) {\n    this.data = void 0;\n    this.bytesAvailable = void 0;\n    this.word = void 0;\n    this.bitsAvailable = void 0;\n    this.data = data;\n    this.bytesAvailable = data.byteLength;\n    this.word = 0;\n    this.bitsAvailable = 0;\n  }\n  // ():void\n  loadWord() {\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    workingBytes.set(data.subarray(position, position + availableBytes));\n    this.word = new DataView(workingBytes.buffer).getUint32(0);\n    this.bitsAvailable = availableBytes * 8;\n    this.bytesAvailable -= availableBytes;\n  }\n  // (count:int):void\n  skipBits(count) {\n    let skipBytes;\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  // (size:int):uint\n  readBits(size) {\n    let bits = Math.min(this.bitsAvailable, size);\n    const valu = this.word >>> 32 - bits;\n    if (size > 32) {\n      logger.error(\"Cannot read more than 32 bits at a time\");\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    bits = size - bits;\n    if (bits > 0 && this.bitsAvailable) {\n      return valu << bits | this.readBits(bits);\n    } else {\n      return valu;\n    }\n  }\n  // ():uint\n  skipLZ() {\n    let leadingZeroCount;\n    for (leadingZeroCount = 0; leadingZeroCount < this.bitsAvailable; ++leadingZeroCount) {\n      if ((this.word & 2147483648 >>> leadingZeroCount) !== 0) {\n        this.word <<= leadingZeroCount;\n        this.bitsAvailable -= leadingZeroCount;\n        return leadingZeroCount;\n      }\n    }\n    this.loadWord();\n    return leadingZeroCount + this.skipLZ();\n  }\n  // ():void\n  skipUEG() {\n    this.skipBits(1 + this.skipLZ());\n  }\n  // ():void\n  skipEG() {\n    this.skipBits(1 + this.skipLZ());\n  }\n  // ():uint\n  readUEG() {\n    const clz = this.skipLZ();\n    return this.readBits(clz + 1) - 1;\n  }\n  // ():int\n  readEG() {\n    const valu = this.readUEG();\n    if (1 & valu) {\n      return 1 + valu >>> 1;\n    } else {\n      return -1 * (valu >>> 1);\n    }\n  }\n  // Some convenience functions\n  // :Boolean\n  readBoolean() {\n    return this.readBits(1) === 1;\n  }\n  // ():int\n  readUByte() {\n    return this.readBits(8);\n  }\n  // ():int\n  readUShort() {\n    return this.readBits(16);\n  }\n  // ():int\n  readUInt() {\n    return this.readBits(32);\n  }\n  /**\n   * Advance the ExpGolomb decoder past a scaling list. The scaling\n   * 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) {\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 = this.readEG();\n        nextScale = (lastScale + deltaScale + 256) % 256;\n      }\n      lastScale = nextScale === 0 ? lastScale : nextScale;\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() {\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 = this.readUByte.bind(this);\n    const readBits = this.readBits.bind(this);\n    const readUEG = this.readUEG.bind(this);\n    const readBoolean = this.readBoolean.bind(this);\n    const skipBits = this.skipBits.bind(this);\n    const skipEG = this.skipEG.bind(this);\n    const skipUEG = this.skipUEG.bind(this);\n    const skipScalingList = this.skipScalingList.bind(this);\n    readUByte();\n    const profileIdc = readUByte();\n    readBits(5);\n    skipBits(3);\n    readUByte();\n    skipUEG();\n    if (profileIdc === 100 || profileIdc === 110 || profileIdc === 122 || profileIdc === 244 || profileIdc === 44 || profileIdc === 83 || profileIdc === 86 || profileIdc === 118 || profileIdc === 128) {\n      const chromaFormatIdc = readUEG();\n      if (chromaFormatIdc === 3) {\n        skipBits(1);\n      }\n      skipUEG();\n      skipUEG();\n      skipBits(1);\n      if (readBoolean()) {\n        scalingListCount = chromaFormatIdc !== 3 ? 8 : 12;\n        for (i = 0; i < scalingListCount; i++) {\n          if (readBoolean()) {\n            if (i < 6) {\n              skipScalingList(16);\n            } else {\n              skipScalingList(64);\n            }\n          }\n        }\n      }\n    }\n    skipUEG();\n    const picOrderCntType = readUEG();\n    if (picOrderCntType === 0) {\n      readUEG();\n    } else if (picOrderCntType === 1) {\n      skipBits(1);\n      skipEG();\n      skipEG();\n      numRefFramesInPicOrderCntCycle = readUEG();\n      for (i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n        skipEG();\n      }\n    }\n    skipUEG();\n    skipBits(1);\n    const picWidthInMbsMinus1 = readUEG();\n    const picHeightInMapUnitsMinus1 = readUEG();\n    const frameMbsOnlyFlag = readBits(1);\n    if (frameMbsOnlyFlag === 0) {\n      skipBits(1);\n    }\n    skipBits(1);\n    if (readBoolean()) {\n      frameCropLeftOffset = readUEG();\n      frameCropRightOffset = readUEG();\n      frameCropTopOffset = readUEG();\n      frameCropBottomOffset = readUEG();\n    }\n    let pixelRatio = [1, 1];\n    if (readBoolean()) {\n      if (readBoolean()) {\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 = [readUByte() << 8 | readUByte(), readUByte() << 8 | readUByte()];\n            break;\n          }\n        }\n      }\n    }\n    return {\n      width: Math.ceil((picWidthInMbsMinus1 + 1) * 16 - frameCropLeftOffset * 2 - frameCropRightOffset * 2),\n      height: (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 - (frameMbsOnlyFlag ? 2 : 4) * (frameCropTopOffset + frameCropBottomOffset),\n      pixelRatio\n    };\n  }\n  readSliceType() {\n    this.readUByte();\n    this.readUEG();\n    return this.readUEG();\n  }\n}\nclass AvcVideoParser extends BaseVideoParser {\n  parseAVCPES(track, textTrack, pes, last, duration) {\n    const units = this.parseAVCNALu(track, pes.data);\n    let VideoSample = this.VideoSample;\n    let push2;\n    let spsfound = false;\n    pes.data = null;\n    if (VideoSample && units.length && !track.audFound) {\n      this.pushAccessUnit(VideoSample, track);\n      VideoSample = this.VideoSample = this.createVideoSample(false, pes.pts, pes.dts, \"\");\n    }\n    units.forEach((unit) => {\n      var _VideoSample2;\n      switch (unit.type) {\n        case 1: {\n          let iskey = false;\n          push2 = true;\n          const data = unit.data;\n          if (spsfound && data.length > 4) {\n            const sliceType = new ExpGolomb(data).readSliceType();\n            if (sliceType === 2 || sliceType === 4 || sliceType === 7 || sliceType === 9) {\n              iskey = true;\n            }\n          }\n          if (iskey) {\n            var _VideoSample;\n            if ((_VideoSample = VideoSample) != null && _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(true, pes.pts, pes.dts, \"\");\n          }\n          VideoSample.frame = true;\n          VideoSample.key = iskey;\n          break;\n        }\n        case 5:\n          push2 = true;\n          if ((_VideoSample2 = VideoSample) != null && _VideoSample2.frame && !VideoSample.key) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = this.VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(true, pes.pts, pes.dts, \"\");\n          }\n          VideoSample.key = true;\n          VideoSample.frame = true;\n          break;\n        case 6: {\n          push2 = true;\n          parseSEIMessageFromNALu(unit.data, 1, pes.pts, textTrack.samples);\n          break;\n        }\n        case 7: {\n          var _track$pixelRatio, _track$pixelRatio2;\n          push2 = true;\n          spsfound = true;\n          const sps = unit.data;\n          const expGolombDecoder = new ExpGolomb(sps);\n          const config = expGolombDecoder.readSPS();\n          if (!track.sps || track.width !== config.width || track.height !== config.height || ((_track$pixelRatio = track.pixelRatio) == null ? void 0 : _track$pixelRatio[0]) !== config.pixelRatio[0] || ((_track$pixelRatio2 = track.pixelRatio) == null ? void 0 : _track$pixelRatio2[1]) !== config.pixelRatio[1]) {\n            track.width = config.width;\n            track.height = config.height;\n            track.pixelRatio = config.pixelRatio;\n            track.sps = [sps];\n            track.duration = duration;\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              codecstring += h;\n            }\n            track.codec = codecstring;\n          }\n          break;\n        }\n        case 8:\n          push2 = true;\n          track.pps = [unit.data];\n          break;\n        case 9:\n          push2 = true;\n          track.audFound = true;\n          if (VideoSample) {\n            this.pushAccessUnit(VideoSample, track);\n          }\n          VideoSample = this.VideoSample = this.createVideoSample(false, pes.pts, pes.dts, \"\");\n          break;\n        case 12:\n          push2 = true;\n          break;\n        default:\n          push2 = false;\n          if (VideoSample) {\n            VideoSample.debug += \"unknown NAL \" + unit.type + \" \";\n          }\n          break;\n      }\n      if (VideoSample && push2) {\n        const units2 = VideoSample.units;\n        units2.push(unit);\n      }\n    });\n    if (last && VideoSample) {\n      this.pushAccessUnit(VideoSample, track);\n      this.VideoSample = null;\n    }\n  }\n  parseAVCNALu(track, array) {\n    const len = array.byteLength;\n    let state = track.naluState || 0;\n    const lastState = state;\n    const units = [];\n    let i = 0;\n    let value;\n    let overflow;\n    let unitType;\n    let lastUnitStart = -1;\n    let lastUnitType = 0;\n    if (state === -1) {\n      lastUnitStart = 0;\n      lastUnitType = array[0] & 31;\n      state = 0;\n      i = 1;\n    }\n    while (i < len) {\n      value = array[i++];\n      if (!state) {\n        state = value ? 0 : 1;\n        continue;\n      }\n      if (state === 1) {\n        state = value ? 0 : 2;\n        continue;\n      }\n      if (!value) {\n        state = 3;\n      } else if (value === 1) {\n        overflow = i - state - 1;\n        if (lastUnitStart >= 0) {\n          const unit = {\n            data: array.subarray(lastUnitStart, overflow),\n            type: lastUnitType\n          };\n          units.push(unit);\n        } else {\n          const lastUnit = this.getLastNalUnit(track.samples);\n          if (lastUnit) {\n            if (lastState && i <= 4 - lastState) {\n              if (lastUnit.state) {\n                lastUnit.data = lastUnit.data.subarray(0, lastUnit.data.byteLength - lastState);\n              }\n            }\n            if (overflow > 0) {\n              lastUnit.data = appendUint8Array(lastUnit.data, array.subarray(0, overflow));\n              lastUnit.state = 0;\n            }\n          }\n        }\n        if (i < len) {\n          unitType = array[i] & 31;\n          lastUnitStart = i;\n          lastUnitType = unitType;\n          state = 0;\n        } else {\n          state = -1;\n        }\n      } else {\n        state = 0;\n      }\n    }\n    if (lastUnitStart >= 0 && state >= 0) {\n      const unit = {\n        data: array.subarray(lastUnitStart, len),\n        type: lastUnitType,\n        state\n      };\n      units.push(unit);\n    }\n    if (units.length === 0) {\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}\nclass SampleAesDecrypter {\n  constructor(observer, config, keyData) {\n    this.keyData = void 0;\n    this.decrypter = void 0;\n    this.keyData = keyData;\n    this.decrypter = new Decrypter(config, {\n      removePKCS7Padding: false\n    });\n  }\n  decryptBuffer(encryptedData) {\n    return this.decrypter.decrypt(encryptedData, this.keyData.key.buffer, this.keyData.iv.buffer);\n  }\n  // AAC - encrypt all full 16 bytes blocks starting from offset 16\n  decryptAacSample(samples, sampleIndex, callback) {\n    const curUnit = samples[sampleIndex].unit;\n    if (curUnit.length <= 16) {\n      return;\n    }\n    const encryptedData = curUnit.subarray(16, curUnit.length - curUnit.length % 16);\n    const encryptedBuffer = encryptedData.buffer.slice(encryptedData.byteOffset, encryptedData.byteOffset + encryptedData.length);\n    this.decryptBuffer(encryptedBuffer).then((decryptedBuffer) => {\n      const decryptedData = new Uint8Array(decryptedBuffer);\n      curUnit.set(decryptedData, 16);\n      if (!this.decrypter.isSync()) {\n        this.decryptAacSamples(samples, sampleIndex + 1, callback);\n      }\n    });\n  }\n  decryptAacSamples(samples, sampleIndex, callback) {\n    for (; ; sampleIndex++) {\n      if (sampleIndex >= samples.length) {\n        callback();\n        return;\n      }\n      if (samples[sampleIndex].unit.length < 32) {\n        continue;\n      }\n      this.decryptAacSample(samples, sampleIndex, callback);\n      if (!this.decrypter.isSync()) {\n        return;\n      }\n    }\n  }\n  // AVC - encrypt one 16 bytes block out of ten, starting from offset 32\n  getAvcEncryptedData(decodedData) {\n    const encryptedDataLen = Math.floor((decodedData.length - 48) / 160) * 16 + 16;\n    const encryptedData = new Int8Array(encryptedDataLen);\n    let outputPos = 0;\n    for (let inputPos = 32; inputPos < decodedData.length - 16; inputPos += 160, outputPos += 16) {\n      encryptedData.set(decodedData.subarray(inputPos, inputPos + 16), outputPos);\n    }\n    return encryptedData;\n  }\n  getAvcDecryptedUnit(decodedData, decryptedData) {\n    const uint8DecryptedData = new Uint8Array(decryptedData);\n    let inputPos = 0;\n    for (let outputPos = 32; outputPos < decodedData.length - 16; outputPos += 160, inputPos += 16) {\n      decodedData.set(uint8DecryptedData.subarray(inputPos, inputPos + 16), outputPos);\n    }\n    return decodedData;\n  }\n  decryptAvcSample(samples, sampleIndex, unitIndex, callback, curUnit) {\n    const decodedData = discardEPB(curUnit.data);\n    const encryptedData = this.getAvcEncryptedData(decodedData);\n    this.decryptBuffer(encryptedData.buffer).then((decryptedBuffer) => {\n      curUnit.data = this.getAvcDecryptedUnit(decodedData, decryptedBuffer);\n      if (!this.decrypter.isSync()) {\n        this.decryptAvcSamples(samples, sampleIndex, unitIndex + 1, callback);\n      }\n    });\n  }\n  decryptAvcSamples(samples, sampleIndex, unitIndex, callback) {\n    if (samples instanceof Uint8Array) {\n      throw new Error(\"Cannot decrypt samples of type Uint8Array\");\n    }\n    for (; ; sampleIndex++, unitIndex = 0) {\n      if (sampleIndex >= samples.length) {\n        callback();\n        return;\n      }\n      const curUnits = samples[sampleIndex].units;\n      for (; ; unitIndex++) {\n        if (unitIndex >= curUnits.length) {\n          break;\n        }\n        const curUnit = curUnits[unitIndex];\n        if (curUnit.data.length <= 48 || curUnit.type !== 1 && curUnit.type !== 5) {\n          continue;\n        }\n        this.decryptAvcSample(samples, sampleIndex, unitIndex, callback, curUnit);\n        if (!this.decrypter.isSync()) {\n          return;\n        }\n      }\n    }\n  }\n}\nconst PACKET_LENGTH = 188;\nclass TSDemuxer {\n  constructor(observer, config, typeSupported) {\n    this.observer = void 0;\n    this.config = void 0;\n    this.typeSupported = void 0;\n    this.sampleAes = null;\n    this.pmtParsed = false;\n    this.audioCodec = void 0;\n    this.videoCodec = void 0;\n    this._duration = 0;\n    this._pmtId = -1;\n    this._videoTrack = void 0;\n    this._audioTrack = void 0;\n    this._id3Track = void 0;\n    this._txtTrack = void 0;\n    this.aacOverFlow = null;\n    this.remainderData = null;\n    this.videoParser = void 0;\n    this.observer = observer;\n    this.config = config;\n    this.typeSupported = typeSupported;\n    this.videoParser = new AvcVideoParser();\n  }\n  static probe(data) {\n    const syncOffset = TSDemuxer.syncOffset(data);\n    if (syncOffset > 0) {\n      logger.warn(`MPEG2-TS detected but first sync word found @ offset ${syncOffset}`);\n    }\n    return syncOffset !== -1;\n  }\n  static syncOffset(data) {\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      let foundPat = false;\n      let packetStart = -1;\n      let tsPackets = 0;\n      for (let j = i; j < length; j += PACKET_LENGTH) {\n        if (data[j] === 71 && (length - j === PACKET_LENGTH || data[j + PACKET_LENGTH] === 71)) {\n          tsPackets++;\n          if (packetStart === -1) {\n            packetStart = j;\n            if (packetStart !== 0) {\n              scanwindow = Math.min(packetStart + PACKET_LENGTH * 99, data.length - PACKET_LENGTH) + 1;\n            }\n          }\n          if (!foundPat) {\n            foundPat = parsePID(data, j) === 0;\n          }\n          if (foundPat && tsPackets > 1 && (packetStart === 0 && tsPackets > 2 || j + PACKET_LENGTH > scanwindow)) {\n            return packetStart;\n          }\n        } else if (tsPackets) {\n          return -1;\n        } else {\n          break;\n        }\n      }\n      i++;\n    }\n    return -1;\n  }\n  /**\n   * Creates a track model internal to demuxer used to drive remuxing input\n   */\n  static createTrack(type, duration) {\n    return {\n      container: type === \"video\" || type === \"audio\" ? \"video/mp2t\" : void 0,\n      type,\n      id: RemuxerTrackIdConfig[type],\n      pid: -1,\n      inputTimeScale: 9e4,\n      sequenceNumber: 0,\n      samples: [],\n      dropped: 0,\n      duration: type === \"audio\" ? duration : void 0\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  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\n    this.pmtParsed = false;\n    this._pmtId = -1;\n    this._videoTrack = TSDemuxer.createTrack(\"video\");\n    this._audioTrack = TSDemuxer.createTrack(\"audio\", trackDuration);\n    this._id3Track = TSDemuxer.createTrack(\"id3\");\n    this._txtTrack = TSDemuxer.createTrack(\"text\");\n    this._audioTrack.segmentCodec = \"aac\";\n    this.aacOverFlow = null;\n    this.remainderData = null;\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n    this._duration = trackDuration;\n  }\n  resetTimeStamp() {\n  }\n  resetContiguity() {\n    const {\n      _audioTrack,\n      _videoTrack,\n      _id3Track\n    } = 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  demux(data, timeOffset, isSampleAes = false, flush = false) {\n    if (!isSampleAes) {\n      this.sampleAes = null;\n    }\n    let pes;\n    const videoTrack = this._videoTrack;\n    const audioTrack = this._audioTrack;\n    const id3Track = this._id3Track;\n    const textTrack = this._txtTrack;\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 = null;\n    let pmtParsed = this.pmtParsed;\n    let pmtId = this._pmtId;\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    if (len < PACKET_LENGTH && !flush) {\n      this.remainderData = data;\n      return {\n        audioTrack,\n        videoTrack,\n        id3Track,\n        textTrack\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(data.buffer, len, data.buffer.byteLength - len);\n    }\n    let tsPacketErrors = 0;\n    for (let start = syncOffset; start < len; start += PACKET_LENGTH) {\n      if (data[start] === 71) {\n        const stt = !!(data[start + 1] & 64);\n        const pid = parsePID(data, start);\n        const atf = (data[start + 3] & 48) >> 4;\n        let offset;\n        if (atf > 1) {\n          offset = start + 5 + data[start + 4];\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))) {\n                this.videoParser.parseAVCPES(videoTrack, textTrack, pes, false, this._duration);\n              }\n              videoData = {\n                data: [],\n                size: 0\n              };\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))) {\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                    {\n                      this.parseAC3PES(audioTrack, pes);\n                    }\n                    break;\n                }\n              }\n              audioData = {\n                data: [],\n                size: 0\n              };\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))) {\n                this.parseID3PES(id3Track, pes);\n              }\n              id3Data = {\n                data: [],\n                size: 0\n              };\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            pmtId = this._pmtId = parsePAT(data, offset);\n            break;\n          case pmtId: {\n            if (stt) {\n              offset += data[offset] + 1;\n            }\n            const parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes);\n            videoPid = parsedPIDs.videoPid;\n            if (videoPid > 0) {\n              videoTrack.pid = videoPid;\n              videoTrack.segmentCodec = parsedPIDs.segmentVideoCodec;\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            if (unknownPID !== null && !pmtParsed) {\n              logger.warn(`MPEG-TS PMT found at ${start} after unknown PID '${unknownPID}'. Backtracking to sync byte @${syncOffset} to parse all TS packets.`);\n              unknownPID = null;\n              start = syncOffset - 188;\n            }\n            pmtParsed = this.pmtParsed = true;\n            break;\n          }\n          case 17:\n          case 8191:\n            break;\n          default:\n            unknownPID = pid;\n            break;\n        }\n      } else {\n        tsPacketErrors++;\n      }\n    }\n    if (tsPacketErrors > 0) {\n      const error = new Error(`Found ${tsPacketErrors} TS packet/s that do not start with 0x47`);\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    }\n    videoTrack.pesData = videoData;\n    audioTrack.pesData = audioData;\n    id3Track.pesData = id3Data;\n    const demuxResult = {\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack\n    };\n    if (flush) {\n      this.extractRemainingSamples(demuxResult);\n    }\n    return demuxResult;\n  }\n  flush() {\n    const {\n      remainderData\n    } = this;\n    this.remainderData = null;\n    let result;\n    if (remainderData) {\n      result = this.demux(remainderData, -1, false, true);\n    } else {\n      result = {\n        videoTrack: this._videoTrack,\n        audioTrack: this._audioTrack,\n        id3Track: this._id3Track,\n        textTrack: this._txtTrack\n      };\n    }\n    this.extractRemainingSamples(result);\n    if (this.sampleAes) {\n      return this.decrypt(result, this.sampleAes);\n    }\n    return result;\n  }\n  extractRemainingSamples(demuxResult) {\n    const {\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack\n    } = demuxResult;\n    const videoData = videoTrack.pesData;\n    const audioData = audioTrack.pesData;\n    const id3Data = id3Track.pesData;\n    let pes;\n    if (videoData && (pes = parsePES(videoData))) {\n      this.videoParser.parseAVCPES(videoTrack, textTrack, pes, true, this._duration);\n      videoTrack.pesData = null;\n    } else {\n      videoTrack.pesData = videoData;\n    }\n    if (audioData && (pes = parsePES(audioData))) {\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          {\n            this.parseAC3PES(audioTrack, pes);\n          }\n          break;\n      }\n      audioTrack.pesData = null;\n    } else {\n      if (audioData != null && audioData.size) {\n        logger.log(\"last AAC PES packet truncated,might overlap between fragments\");\n      }\n      audioTrack.pesData = audioData;\n    }\n    if (id3Data && (pes = parsePES(id3Data))) {\n      this.parseID3PES(id3Track, pes);\n      id3Track.pesData = null;\n    } else {\n      id3Track.pesData = id3Data;\n    }\n  }\n  demuxSampleAes(data, keyData, timeOffset) {\n    const demuxResult = this.demux(data, timeOffset, true, !this.config.progressive);\n    const sampleAes = this.sampleAes = new SampleAesDecrypter(this.observer, this.config, keyData);\n    return this.decrypt(demuxResult, sampleAes);\n  }\n  decrypt(demuxResult, sampleAes) {\n    return new Promise((resolve) => {\n      const {\n        audioTrack,\n        videoTrack\n      } = demuxResult;\n      if (audioTrack.samples && audioTrack.segmentCodec === \"aac\") {\n        sampleAes.decryptAacSamples(audioTrack.samples, 0, () => {\n          if (videoTrack.samples) {\n            sampleAes.decryptAvcSamples(videoTrack.samples, 0, 0, () => {\n              resolve(demuxResult);\n            });\n          } else {\n            resolve(demuxResult);\n          }\n        });\n      } else if (videoTrack.samples) {\n        sampleAes.decryptAvcSamples(videoTrack.samples, 0, 0, () => {\n          resolve(demuxResult);\n        });\n      }\n    });\n  }\n  destroy() {\n    this._duration = 0;\n  }\n  parseAACPES(track, 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      if (frameMissingBytes === -1) {\n        data = appendUint8Array(aacOverFlow.sample.unit, data);\n      } else {\n        const frameOverflowBytes = sampleLength - frameMissingBytes;\n        aacOverFlow.sample.unit.set(data.subarray(0, frameMissingBytes), frameOverflowBytes);\n        track.samples.push(aacOverFlow.sample);\n        startOffset = aacOverFlow.missing;\n      }\n    }\n    let offset;\n    let len;\n    for (offset = startOffset, len = data.length; offset < len - 1; offset++) {\n      if (isHeader$1(data, offset)) {\n        break;\n      }\n    }\n    if (offset !== startOffset) {\n      let reason;\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      const error = new Error(reason);\n      logger.warn(`parsing error: ${reason}`);\n      this.observer.emit(Events.ERROR, Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.FRAG_PARSING_ERROR,\n        fatal: false,\n        levelRetry: recoverable,\n        error,\n        reason\n      });\n      if (!recoverable) {\n        return;\n      }\n    }\n    initTrackConfig(track, this.observer, data, offset, this.audioCodec);\n    let pts;\n    if (pes.pts !== void 0) {\n      pts = pes.pts;\n    } else if (aacOverFlow) {\n      const frameDuration = getFrameDuration(track.samplerate);\n      pts = aacOverFlow.sample.pts + frameDuration;\n    } else {\n      logger.warn(\"[tsdemuxer]: AAC PES unknown PTS\");\n      return;\n    }\n    let frameIndex = 0;\n    let frame;\n    while (offset < len) {\n      frame = appendFrame$2(track, data, offset, pts, frameIndex);\n      offset += frame.length;\n      if (!frame.missing) {\n        frameIndex++;\n        for (; offset < len - 1; offset++) {\n          if (isHeader$1(data, offset)) {\n            break;\n          }\n        }\n      } else {\n        this.aacOverFlow = frame;\n        break;\n      }\n    }\n  }\n  parseMPEGPES(track, 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 === void 0) {\n      logger.warn(\"[tsdemuxer]: MPEG PES unknown PTS\");\n      return;\n    }\n    while (offset < length) {\n      if (isHeader(data, offset)) {\n        const frame = appendFrame$1(track, data, offset, pts, frameIndex);\n        if (frame) {\n          offset += frame.length;\n          frameIndex++;\n        } else {\n          break;\n        }\n      } else {\n        offset++;\n      }\n    }\n  }\n  parseAC3PES(track, pes) {\n    {\n      const data = pes.data;\n      const pts = pes.pts;\n      if (pts === void 0) {\n        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      while (offset < length && (parsed = appendFrame(track, data, offset, pts, frameIndex++)) > 0) {\n        offset += parsed;\n      }\n    }\n  }\n  parseID3PES(id3Track, pes) {\n    if (pes.pts === void 0) {\n      logger.warn(\"[tsdemuxer]: ID3 PES unknown PTS\");\n      return;\n    }\n    const id3Sample = _extends({}, pes, {\n      type: this._videoTrack ? MetadataSchema.emsg : MetadataSchema.audioId3,\n      duration: Number.POSITIVE_INFINITY\n    });\n    id3Track.samples.push(id3Sample);\n  }\n}\nfunction parsePID(data, offset) {\n  return ((data[offset + 1] & 31) << 8) + data[offset + 2];\n}\nfunction parsePAT(data, offset) {\n  return (data[offset + 10] & 31) << 8 | data[offset + 11];\n}\nfunction parsePMT(data, offset, typeSupported, isSampleAes) {\n  const result = {\n    audioPid: -1,\n    videoPid: -1,\n    id3Pid: -1,\n    segmentVideoCodec: \"avc\",\n    segmentAudioCodec: \"aac\"\n  };\n  const sectionLength = (data[offset + 1] & 15) << 8 | data[offset + 2];\n  const tableEnd = offset + 3 + sectionLength - 4;\n  const programInfoLength = (data[offset + 10] & 15) << 8 | data[offset + 11];\n  offset += 12 + programInfoLength;\n  while (offset < tableEnd) {\n    const pid = parsePID(data, offset);\n    const esInfoLength = (data[offset + 3] & 15) << 8 | data[offset + 4];\n    switch (data[offset]) {\n      case 207:\n        if (!isSampleAes) {\n          logEncryptedSamplesFoundInUnencryptedStream(\"ADTS AAC\");\n          break;\n        }\n      case 15:\n        if (result.audioPid === -1) {\n          result.audioPid = pid;\n        }\n        break;\n      case 21:\n        if (result.id3Pid === -1) {\n          result.id3Pid = pid;\n        }\n        break;\n      case 219:\n        if (!isSampleAes) {\n          logEncryptedSamplesFoundInUnencryptedStream(\"H.264\");\n          break;\n        }\n      case 27:\n        if (result.videoPid === -1) {\n          result.videoPid = pid;\n          result.segmentVideoCodec = \"avc\";\n        }\n        break;\n      case 3:\n      case 4:\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      case 193:\n        if (!isSampleAes) {\n          logEncryptedSamplesFoundInUnencryptedStream(\"AC-3\");\n          break;\n        }\n      case 129:\n        {\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        }\n        break;\n      case 6:\n        if (result.audioPid === -1 && esInfoLength > 0) {\n          let parsePos = offset + 5;\n          let remaining = esInfoLength;\n          while (remaining > 2) {\n            const descriptorId = data[parsePos];\n            switch (descriptorId) {\n              case 106:\n                {\n                  if (typeSupported.ac3 !== true) {\n                    logger.log(\"AC-3 audio found, not supported in this browser for now\");\n                  } else {\n                    result.audioPid = pid;\n                    result.segmentAudioCodec = \"ac3\";\n                  }\n                }\n                break;\n            }\n            const descriptorLen = data[parsePos + 1] + 2;\n            parsePos += descriptorLen;\n            remaining -= descriptorLen;\n          }\n        }\n        break;\n      case 194:\n      case 135:\n        logger.warn(\"Unsupported EC-3 in M2TS found\");\n        break;\n      case 36:\n        logger.warn(\"Unsupported HEVC in M2TS found\");\n        break;\n    }\n    offset += esInfoLength + 5;\n  }\n  return result;\n}\nfunction logEncryptedSamplesFoundInUnencryptedStream(type) {\n  logger.log(`${type} with AES-128-CBC encryption found in unencrypted stream`);\n}\nfunction parsePES(stream) {\n  let i = 0;\n  let frag;\n  let pesLen;\n  let pesHdrLen;\n  let pesPts;\n  let pesDts;\n  const data = stream.data;\n  if (!stream || stream.size === 0) {\n    return null;\n  }\n  while (data[0].length < 19 && data.length > 1) {\n    data[0] = appendUint8Array(data[0], data[1]);\n    data.splice(1, 1);\n  }\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 (pesLen && pesLen > stream.size - 6) {\n      return null;\n    }\n    const pesFlags = frag[7];\n    if (pesFlags & 192) {\n      pesPts = (frag[9] & 14) * 536870912 + // 1 << 29\n      (frag[10] & 255) * 4194304 + // 1 << 22\n      (frag[11] & 254) * 16384 + // 1 << 14\n      (frag[12] & 255) * 128 + // 1 << 7\n      (frag[13] & 254) / 2;\n      if (pesFlags & 64) {\n        pesDts = (frag[14] & 14) * 536870912 + // 1 << 29\n        (frag[15] & 255) * 4194304 + // 1 << 22\n        (frag[16] & 254) * 16384 + // 1 << 14\n        (frag[17] & 255) * 128 + // 1 << 7\n        (frag[18] & 254) / 2;\n        if (pesPts - pesDts > 60 * 9e4) {\n          logger.warn(`${Math.round((pesPts - pesDts) / 9e4)}s delta between PTS and DTS, align them`);\n          pesPts = pesDts;\n        }\n      } else {\n        pesDts = pesPts;\n      }\n    }\n    pesHdrLen = frag[8];\n    let payloadStartOffset = pesHdrLen + 9;\n    if (stream.size <= payloadStartOffset) {\n      return null;\n    }\n    stream.size -= payloadStartOffset;\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          payloadStartOffset -= len;\n          continue;\n        } else {\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      pesLen -= pesHdrLen + 3;\n    }\n    return {\n      data: pesData,\n      pts: pesPts,\n      dts: pesDts,\n      len: pesLen\n    };\n  }\n  return null;\n}\nclass MP3Demuxer extends BaseAudioDemuxer {\n  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\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: 9e4,\n      dropped: 0\n    };\n  }\n  static probe(data) {\n    if (!data) {\n      return false;\n    }\n    const id3Data = getID3Data(data, 0);\n    let offset = (id3Data == null ? void 0 : id3Data.length) || 0;\n    if (id3Data && data[offset] === 11 && data[offset + 1] === 119 && getTimeStamp(id3Data) !== void 0 && // check the bsid to confirm ac-3 or ec-3 (not mp3)\n    getAudioBSID(data, offset) <= 16) {\n      return false;\n    }\n    for (let length = data.length; offset < length; offset++) {\n      if (probe(data, offset)) {\n        logger.log(\"MPEG Audio sync word found !\");\n        return true;\n      }\n    }\n    return false;\n  }\n  canParse(data, offset) {\n    return canParse(data, offset);\n  }\n  appendFrame(track, data, offset) {\n    if (this.basePTS === null) {\n      return;\n    }\n    return appendFrame$1(track, data, offset, this.basePTS, this.frameIndex);\n  }\n}\nclass AAC {\n  static getSilentFrame(codec, channelCount) {\n    switch (codec) {\n      case \"mp4a.40.2\":\n        if (channelCount === 1) {\n          return new Uint8Array([0, 200, 0, 128, 35, 128]);\n        } else if (channelCount === 2) {\n          return new Uint8Array([33, 0, 73, 144, 2, 25, 0, 35, 128]);\n        } else if (channelCount === 3) {\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 142]);\n        } else if (channelCount === 4) {\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 128, 44, 128, 8, 2, 56]);\n        } else if (channelCount === 5) {\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 56]);\n        } else if (channelCount === 6) {\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 0, 178, 0, 32, 8, 224]);\n        }\n        break;\n      default:\n        if (channelCount === 1) {\n          return new Uint8Array([1, 64, 34, 128, 163, 78, 230, 128, 186, 8, 0, 0, 0, 28, 6, 241, 193, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n        } else if (channelCount === 2) {\n          return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n        } else if (channelCount === 3) {\n          return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n        }\n        break;\n    }\n    return void 0;\n  }\n}\nconst UINT32_MAX = Math.pow(2, 32) - 1;\nclass MP4 {\n  static init() {\n    MP4.types = {\n      avc1: [],\n      // codingname\n      avcC: [],\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    let i;\n    for (i in MP4.types) {\n      if (MP4.types.hasOwnProperty(i)) {\n        MP4.types[i] = [i.charCodeAt(0), i.charCodeAt(1), i.charCodeAt(2), i.charCodeAt(3)];\n      }\n    }\n    const videoHdlr = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      // pre_defined\n      118,\n      105,\n      100,\n      101,\n      // handler_type: 'vide'\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      86,\n      105,\n      100,\n      101,\n      111,\n      72,\n      97,\n      110,\n      100,\n      108,\n      101,\n      114,\n      0\n      // name: 'VideoHandler'\n    ]);\n    const audioHdlr = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      // pre_defined\n      115,\n      111,\n      117,\n      110,\n      // handler_type: 'soun'\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      83,\n      111,\n      117,\n      110,\n      100,\n      72,\n      97,\n      110,\n      100,\n      108,\n      101,\n      114,\n      0\n      // name: 'SoundHandler'\n    ]);\n    MP4.HDLR_TYPES = {\n      video: videoHdlr,\n      audio: audioHdlr\n    };\n    const dref = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      1,\n      // entry_count\n      0,\n      0,\n      0,\n      12,\n      // entry_size\n      117,\n      114,\n      108,\n      32,\n      // 'url' type\n      0,\n      // version 0\n      0,\n      0,\n      1\n      // entry_flags\n    ]);\n    const stco = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0\n      // entry_count\n    ]);\n    MP4.STTS = MP4.STSC = MP4.STCO = stco;\n    MP4.STSZ = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      // sample_size\n      0,\n      0,\n      0,\n      0\n      // sample_count\n    ]);\n    MP4.VMHD = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      1,\n      // flags\n      0,\n      0,\n      // graphicsmode\n      0,\n      0,\n      0,\n      0,\n      0,\n      0\n      // opcolor\n    ]);\n    MP4.SMHD = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      // balance\n      0,\n      0\n      // reserved\n    ]);\n    MP4.STSD = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      1\n    ]);\n    const majorBrand = new Uint8Array([105, 115, 111, 109]);\n    const avc1Brand = new Uint8Array([97, 118, 99, 49]);\n    const minorVersion = new Uint8Array([0, 0, 0, 1]);\n    MP4.FTYP = MP4.box(MP4.types.ftyp, majorBrand, minorVersion, majorBrand, avc1Brand);\n    MP4.DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, dref));\n  }\n  static box(type, ...payload) {\n    let size = 8;\n    let i = payload.length;\n    const len = i;\n    while (i--) {\n      size += payload[i].byteLength;\n    }\n    const result = new Uint8Array(size);\n    result[0] = size >> 24 & 255;\n    result[1] = size >> 16 & 255;\n    result[2] = size >> 8 & 255;\n    result[3] = size & 255;\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  static hdlr(type) {\n    return MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type]);\n  }\n  static mdat(data) {\n    return MP4.box(MP4.types.mdat, data);\n  }\n  static mdhd(timescale, duration) {\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(MP4.types.mdhd, new Uint8Array([\n      1,\n      // version 1\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      // creation_time\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      // modification_time\n      timescale >> 24 & 255,\n      timescale >> 16 & 255,\n      timescale >> 8 & 255,\n      timescale & 255,\n      // timescale\n      upperWordDuration >> 24,\n      upperWordDuration >> 16 & 255,\n      upperWordDuration >> 8 & 255,\n      upperWordDuration & 255,\n      lowerWordDuration >> 24,\n      lowerWordDuration >> 16 & 255,\n      lowerWordDuration >> 8 & 255,\n      lowerWordDuration & 255,\n      85,\n      196,\n      // 'und' language (undetermined)\n      0,\n      0\n    ]));\n  }\n  static mdia(track) {\n    return MP4.box(MP4.types.mdia, MP4.mdhd(track.timescale, track.duration), MP4.hdlr(track.type), MP4.minf(track));\n  }\n  static mfhd(sequenceNumber) {\n    return MP4.box(MP4.types.mfhd, new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      // flags\n      sequenceNumber >> 24,\n      sequenceNumber >> 16 & 255,\n      sequenceNumber >> 8 & 255,\n      sequenceNumber & 255\n      // sequence_number\n    ]));\n  }\n  static minf(track) {\n    if (track.type === \"audio\") {\n      return MP4.box(MP4.types.minf, MP4.box(MP4.types.smhd, MP4.SMHD), MP4.DINF, MP4.stbl(track));\n    } else {\n      return MP4.box(MP4.types.minf, MP4.box(MP4.types.vmhd, MP4.VMHD), MP4.DINF, MP4.stbl(track));\n    }\n  }\n  static moof(sn, baseMediaDecodeTime, track) {\n    return MP4.box(MP4.types.moof, MP4.mfhd(sn), MP4.traf(track, baseMediaDecodeTime));\n  }\n  static moov(tracks) {\n    let i = tracks.length;\n    const boxes = [];\n    while (i--) {\n      boxes[i] = MP4.trak(tracks[i]);\n    }\n    return MP4.box.apply(null, [MP4.types.moov, MP4.mvhd(tracks[0].timescale, tracks[0].duration)].concat(boxes).concat(MP4.mvex(tracks)));\n  }\n  static mvex(tracks) {\n    let i = tracks.length;\n    const boxes = [];\n    while (i--) {\n      boxes[i] = MP4.trex(tracks[i]);\n    }\n    return MP4.box.apply(null, [MP4.types.mvex, ...boxes]);\n  }\n  static mvhd(timescale, duration) {\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      1,\n      // version 1\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      // creation_time\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      // modification_time\n      timescale >> 24 & 255,\n      timescale >> 16 & 255,\n      timescale >> 8 & 255,\n      timescale & 255,\n      // timescale\n      upperWordDuration >> 24,\n      upperWordDuration >> 16 & 255,\n      upperWordDuration >> 8 & 255,\n      upperWordDuration & 255,\n      lowerWordDuration >> 24,\n      lowerWordDuration >> 16 & 255,\n      lowerWordDuration >> 8 & 255,\n      lowerWordDuration & 255,\n      0,\n      1,\n      0,\n      0,\n      // 1.0 rate\n      1,\n      0,\n      // 1.0 volume\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      64,\n      0,\n      0,\n      0,\n      // transformation: unity matrix\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // pre_defined\n      255,\n      255,\n      255,\n      255\n      // next_track_ID\n    ]);\n    return MP4.box(MP4.types.mvhd, bytes);\n  }\n  static sdtp(track) {\n    const samples = track.samples || [];\n    const bytes = new Uint8Array(4 + samples.length);\n    let i;\n    let flags;\n    for (i = 0; i < samples.length; i++) {\n      flags = samples[i].flags;\n      bytes[i + 4] = flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy;\n    }\n    return MP4.box(MP4.types.sdtp, bytes);\n  }\n  static stbl(track) {\n    return MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.box(MP4.types.stts, MP4.STTS), MP4.box(MP4.types.stsc, MP4.STSC), MP4.box(MP4.types.stsz, MP4.STSZ), MP4.box(MP4.types.stco, MP4.STCO));\n  }\n  static avc1(track) {\n    let sps = [];\n    let pps = [];\n    let i;\n    let data;\n    let len;\n    for (i = 0; i < track.sps.length; i++) {\n      data = track.sps[i];\n      len = data.byteLength;\n      sps.push(len >>> 8 & 255);\n      sps.push(len & 255);\n      sps = sps.concat(Array.prototype.slice.call(data));\n    }\n    for (i = 0; i < track.pps.length; i++) {\n      data = track.pps[i];\n      len = data.byteLength;\n      pps.push(len >>> 8 & 255);\n      pps.push(len & 255);\n      pps = pps.concat(Array.prototype.slice.call(data));\n    }\n    const avcc = MP4.box(MP4.types.avcC, new Uint8Array([\n      1,\n      // version\n      sps[3],\n      // profile\n      sps[4],\n      // profile compat\n      sps[5],\n      // level\n      252 | 3,\n      // lengthSizeMinusOne, hard-coded to 4 bytes\n      224 | track.sps.length\n      // 3bit reserved (111) + numOfSequenceParameterSets\n    ].concat(sps).concat([\n      track.pps.length\n      // numOfPictureParameterSets\n    ]).concat(pps)));\n    const width = track.width;\n    const height = track.height;\n    const hSpacing = track.pixelRatio[0];\n    const vSpacing = track.pixelRatio[1];\n    return MP4.box(\n      MP4.types.avc1,\n      new Uint8Array([\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        1,\n        // data_reference_index\n        0,\n        0,\n        // pre_defined\n        0,\n        0,\n        // reserved\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        // pre_defined\n        width >> 8 & 255,\n        width & 255,\n        // width\n        height >> 8 & 255,\n        height & 255,\n        // height\n        0,\n        72,\n        0,\n        0,\n        // horizresolution\n        0,\n        72,\n        0,\n        0,\n        // vertresolution\n        0,\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        1,\n        // frame_count\n        18,\n        100,\n        97,\n        105,\n        108,\n        // dailymotion/hls.js\n        121,\n        109,\n        111,\n        116,\n        105,\n        111,\n        110,\n        47,\n        104,\n        108,\n        115,\n        46,\n        106,\n        115,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        // compressorname\n        0,\n        24,\n        // depth = 24\n        17,\n        17\n      ]),\n      // pre_defined = -1\n      avcc,\n      MP4.box(MP4.types.btrt, new Uint8Array([\n        0,\n        28,\n        156,\n        128,\n        // bufferSizeDB\n        0,\n        45,\n        198,\n        192,\n        // maxBitrate\n        0,\n        45,\n        198,\n        192\n      ])),\n      // avgBitrate\n      MP4.box(MP4.types.pasp, new Uint8Array([\n        hSpacing >> 24,\n        // hSpacing\n        hSpacing >> 16 & 255,\n        hSpacing >> 8 & 255,\n        hSpacing & 255,\n        vSpacing >> 24,\n        // vSpacing\n        vSpacing >> 16 & 255,\n        vSpacing >> 8 & 255,\n        vSpacing & 255\n      ]))\n    );\n  }\n  static esds(track) {\n    const configlen = track.config.length;\n    return new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      3,\n      // descriptor_type\n      23 + configlen,\n      // length\n      0,\n      1,\n      // es_id\n      0,\n      // stream_priority\n      4,\n      // descriptor_type\n      15 + configlen,\n      // length\n      64,\n      // codec : mpeg4_audio\n      21,\n      // stream_type\n      0,\n      0,\n      0,\n      // buffer_size\n      0,\n      0,\n      0,\n      0,\n      // maxBitrate\n      0,\n      0,\n      0,\n      0,\n      // avgBitrate\n      5\n      // descriptor_type\n    ].concat([configlen]).concat(track.config).concat([6, 1, 2]));\n  }\n  static audioStsd(track) {\n    const samplerate = track.samplerate;\n    return new Uint8Array([\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      1,\n      // data_reference_index\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      track.channelCount,\n      // channelcount\n      0,\n      16,\n      // sampleSize:16bits\n      0,\n      0,\n      0,\n      0,\n      // reserved2\n      samplerate >> 8 & 255,\n      samplerate & 255,\n      //\n      0,\n      0\n    ]);\n  }\n  static mp4a(track) {\n    return MP4.box(MP4.types.mp4a, MP4.audioStsd(track), MP4.box(MP4.types.esds, MP4.esds(track)));\n  }\n  static mp3(track) {\n    return MP4.box(MP4.types[\".mp3\"], MP4.audioStsd(track));\n  }\n  static ac3(track) {\n    return MP4.box(MP4.types[\"ac-3\"], MP4.audioStsd(track), MP4.box(MP4.types.dac3, track.config));\n  }\n  static stsd(track) {\n    if (track.type === \"audio\") {\n      if (track.segmentCodec === \"mp3\" && track.codec === \"mp3\") {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp3(track));\n      }\n      if (track.segmentCodec === \"ac3\") {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.ac3(track));\n      }\n      return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp4a(track));\n    } else {\n      return MP4.box(MP4.types.stsd, MP4.STSD, MP4.avc1(track));\n    }\n  }\n  static tkhd(track) {\n    const id = track.id;\n    const duration = track.duration * track.timescale;\n    const width = track.width;\n    const height = track.height;\n    const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n    const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n    return MP4.box(MP4.types.tkhd, new Uint8Array([\n      1,\n      // version 1\n      0,\n      0,\n      7,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      // creation_time\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      // modification_time\n      id >> 24 & 255,\n      id >> 16 & 255,\n      id >> 8 & 255,\n      id & 255,\n      // track_ID\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      upperWordDuration >> 24,\n      upperWordDuration >> 16 & 255,\n      upperWordDuration >> 8 & 255,\n      upperWordDuration & 255,\n      lowerWordDuration >> 24,\n      lowerWordDuration >> 16 & 255,\n      lowerWordDuration >> 8 & 255,\n      lowerWordDuration & 255,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      // layer\n      0,\n      0,\n      // alternate_group\n      0,\n      0,\n      // non-audio track volume\n      0,\n      0,\n      // reserved\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      64,\n      0,\n      0,\n      0,\n      // transformation: unity matrix\n      width >> 8 & 255,\n      width & 255,\n      0,\n      0,\n      // width\n      height >> 8 & 255,\n      height & 255,\n      0,\n      0\n      // height\n    ]));\n  }\n  static traf(track, baseMediaDecodeTime) {\n    const sampleDependencyTable = MP4.sdtp(track);\n    const id = track.id;\n    const upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1));\n    const lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1));\n    return MP4.box(\n      MP4.types.traf,\n      MP4.box(MP4.types.tfhd, new Uint8Array([\n        0,\n        // version 0\n        0,\n        0,\n        0,\n        // flags\n        id >> 24,\n        id >> 16 & 255,\n        id >> 8 & 255,\n        id & 255\n        // track_ID\n      ])),\n      MP4.box(MP4.types.tfdt, new Uint8Array([\n        1,\n        // version 1\n        0,\n        0,\n        0,\n        // flags\n        upperWordBaseMediaDecodeTime >> 24,\n        upperWordBaseMediaDecodeTime >> 16 & 255,\n        upperWordBaseMediaDecodeTime >> 8 & 255,\n        upperWordBaseMediaDecodeTime & 255,\n        lowerWordBaseMediaDecodeTime >> 24,\n        lowerWordBaseMediaDecodeTime >> 16 & 255,\n        lowerWordBaseMediaDecodeTime >> 8 & 255,\n        lowerWordBaseMediaDecodeTime & 255\n      ])),\n      MP4.trun(track, sampleDependencyTable.length + 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   * Generate a track box.\n   * @param track a track definition\n   */\n  static trak(track) {\n    track.duration = track.duration || 4294967295;\n    return MP4.box(MP4.types.trak, MP4.tkhd(track), MP4.mdia(track));\n  }\n  static trex(track) {\n    const id = track.id;\n    return MP4.box(MP4.types.trex, new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      id >> 24,\n      id >> 16 & 255,\n      id >> 8 & 255,\n      id & 255,\n      // track_ID\n      0,\n      0,\n      0,\n      1,\n      // default_sample_description_index\n      0,\n      0,\n      0,\n      0,\n      // default_sample_duration\n      0,\n      0,\n      0,\n      0,\n      // default_sample_size\n      0,\n      1,\n      0,\n      1\n      // default_sample_flags\n    ]));\n  }\n  static trun(track, offset) {\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      track.type === \"video\" ? 1 : 0,\n      // version 1 for video with signed-int sample_composition_time_offset\n      0,\n      15,\n      1,\n      // flags\n      len >>> 24 & 255,\n      len >>> 16 & 255,\n      len >>> 8 & 255,\n      len & 255,\n      // sample_count\n      offset >>> 24 & 255,\n      offset >>> 16 & 255,\n      offset >>> 8 & 255,\n      offset & 255\n      // data_offset\n    ], 0);\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        duration >>> 24 & 255,\n        duration >>> 16 & 255,\n        duration >>> 8 & 255,\n        duration & 255,\n        // sample_duration\n        size >>> 24 & 255,\n        size >>> 16 & 255,\n        size >>> 8 & 255,\n        size & 255,\n        // sample_size\n        flags.isLeading << 2 | flags.dependsOn,\n        flags.isDependedOn << 6 | flags.hasRedundancy << 4 | flags.paddingValue << 1 | flags.isNonSync,\n        flags.degradPrio & 240 << 8,\n        flags.degradPrio & 15,\n        // sample_flags\n        cts >>> 24 & 255,\n        cts >>> 16 & 255,\n        cts >>> 8 & 255,\n        cts & 255\n        // sample_composition_time_offset\n      ], 12 + 16 * i);\n    }\n    return MP4.box(MP4.types.trun, array);\n  }\n  static initSegment(tracks) {\n    if (!MP4.types) {\n      MP4.init();\n    }\n    const movie = MP4.moov(tracks);\n    const result = appendUint8Array(MP4.FTYP, movie);\n    return result;\n  }\n}\nMP4.types = void 0;\nMP4.HDLR_TYPES = void 0;\nMP4.STTS = void 0;\nMP4.STSC = void 0;\nMP4.STCO = void 0;\nMP4.STSZ = void 0;\nMP4.VMHD = void 0;\nMP4.SMHD = void 0;\nMP4.STSD = void 0;\nMP4.FTYP = void 0;\nMP4.DINF = void 0;\nconst MPEG_TS_CLOCK_FREQ_HZ = 9e4;\nfunction toTimescaleFromBase(baseTime, destScale, srcBase = 1, round = false) {\n  const result = baseTime * destScale * srcBase;\n  return round ? Math.round(result) : result;\n}\nfunction toTimescaleFromScale(baseTime, destScale, srcScale = 1, round = false) {\n  return toTimescaleFromBase(baseTime, destScale, 1 / srcScale, round);\n}\nfunction toMsFromMpegTsClock(baseTime, round = false) {\n  return toTimescaleFromBase(baseTime, 1e3, 1 / MPEG_TS_CLOCK_FREQ_HZ, round);\n}\nfunction toMpegTsClockFromTimescale(baseTime, srcScale = 1) {\n  return toTimescaleFromBase(baseTime, MPEG_TS_CLOCK_FREQ_HZ, 1 / srcScale);\n}\nconst MAX_SILENT_FRAME_DURATION = 10 * 1e3;\nconst AAC_SAMPLES_PER_FRAME = 1024;\nconst MPEG_AUDIO_SAMPLE_PER_FRAME = 1152;\nconst AC3_SAMPLES_PER_FRAME = 1536;\nlet chromeVersion = null;\nlet safariWebkitVersion = null;\nclass MP4Remuxer {\n  constructor(observer, config, typeSupported, vendor = \"\") {\n    this.observer = void 0;\n    this.config = void 0;\n    this.typeSupported = void 0;\n    this.ISGenerated = false;\n    this._initPTS = null;\n    this._initDTS = null;\n    this.nextAvcDts = null;\n    this.nextAudioPts = null;\n    this.videoSampleDuration = null;\n    this.isAudioContiguous = false;\n    this.isVideoContiguous = false;\n    this.videoTrackConfig = void 0;\n    this.observer = observer;\n    this.config = config;\n    this.typeSupported = typeSupported;\n    this.ISGenerated = false;\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  destroy() {\n    this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;\n  }\n  resetTimeStamp(defaultTimeStamp) {\n    logger.log(\"[mp4-remuxer]: initPTS & initDTS reset\");\n    this._initPTS = this._initDTS = defaultTimeStamp;\n  }\n  resetNextTimestamp() {\n    logger.log(\"[mp4-remuxer]: reset next timestamp\");\n    this.isVideoContiguous = false;\n    this.isAudioContiguous = false;\n  }\n  resetInitSegment() {\n    logger.log(\"[mp4-remuxer]: ISGenerated flag reset\");\n    this.ISGenerated = false;\n    this.videoTrackConfig = void 0;\n  }\n  getVideoStartPts(videoSamples) {\n    let rolloverDetected = false;\n    const startPTS = videoSamples.reduce((minPTS, sample) => {\n      const delta = sample.pts - minPTS;\n      if (delta < -4294967296) {\n        rolloverDetected = true;\n        return normalizePts(minPTS, sample.pts);\n      } else if (delta > 0) {\n        return minPTS;\n      } else {\n        return sample.pts;\n      }\n    }, videoSamples[0].pts);\n    if (rolloverDetected) {\n      logger.debug(\"PTS rollover detected\");\n    }\n    return startPTS;\n  }\n  remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, flush, playlistType) {\n    let video;\n    let audio;\n    let initSegment;\n    let text;\n    let id3;\n    let independent;\n    let audioTimeOffset = timeOffset;\n    let videoTimeOffset = timeOffset;\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 = (!hasAudio || enoughAudioSamples) && (!hasVideo || enoughVideoSamples) || this.ISGenerated || flush;\n    if (canRemuxAvc) {\n      if (this.ISGenerated) {\n        var _videoTrack$pixelRati, _config$pixelRatio, _videoTrack$pixelRati2, _config$pixelRatio2;\n        const config = this.videoTrackConfig;\n        if (config && (videoTrack.width !== config.width || videoTrack.height !== config.height || ((_videoTrack$pixelRati = videoTrack.pixelRatio) == null ? void 0 : _videoTrack$pixelRati[0]) !== ((_config$pixelRatio = config.pixelRatio) == null ? void 0 : _config$pixelRatio[0]) || ((_videoTrack$pixelRati2 = videoTrack.pixelRatio) == null ? void 0 : _videoTrack$pixelRati2[1]) !== ((_config$pixelRatio2 = config.pixelRatio) == null ? void 0 : _config$pixelRatio2[1]))) {\n          this.resetInitSegment();\n        }\n      } else {\n        initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);\n      }\n      const isVideoContiguous = this.isVideoContiguous;\n      let firstKeyFrameIndex = -1;\n      let firstKeyFramePTS;\n      if (enoughVideoSamples) {\n        firstKeyFrameIndex = findKeyframeIndex(videoTrack.samples);\n        if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {\n          independent = true;\n          if (firstKeyFrameIndex > 0) {\n            logger.warn(`[mp4-remuxer]: Dropped ${firstKeyFrameIndex} out of ${length} video samples due to a missing keyframe`);\n            const startPTS = this.getVideoStartPts(videoTrack.samples);\n            videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);\n            videoTrack.dropped += firstKeyFrameIndex;\n            videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / videoTrack.inputTimeScale;\n            firstKeyFramePTS = videoTimeOffset;\n          } else if (firstKeyFrameIndex === -1) {\n            logger.warn(`[mp4-remuxer]: No keyframe found out of ${length} video samples`);\n            independent = false;\n          }\n        }\n      }\n      if (this.ISGenerated) {\n        if (enoughAudioSamples && enoughVideoSamples) {\n          const startPTS = this.getVideoStartPts(videoTrack.samples);\n          const tsDelta = 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        if (enoughAudioSamples) {\n          if (!audioTrack.samplerate) {\n            logger.warn(\"[mp4-remuxer]: regenerate InitSegment as audio detected\");\n            initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);\n          }\n          audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset : void 0);\n          if (enoughVideoSamples) {\n            const audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;\n            if (!videoTrack.inputTimeScale) {\n              logger.warn(\"[mp4-remuxer]: regenerate InitSegment as video detected\");\n              initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);\n            }\n            video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength);\n          }\n        } else if (enoughVideoSamples) {\n          video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, 0);\n        }\n        if (video) {\n          video.firstKeyFrame = firstKeyFrameIndex;\n          video.independent = firstKeyFrameIndex !== -1;\n          video.firstKeyFramePTS = firstKeyFramePTS;\n        }\n      }\n    }\n    if (this.ISGenerated && this._initPTS && this._initDTS) {\n      if (id3Track.samples.length) {\n        id3 = flushTextTrackMetadataCueSamples(id3Track, timeOffset, this._initPTS, this._initDTS);\n      }\n      if (textTrack.samples.length) {\n        text = flushTextTrackUserdataCueSamples(textTrack, timeOffset, this._initPTS);\n      }\n    }\n    return {\n      audio,\n      video,\n      initSegment,\n      independent,\n      text,\n      id3\n    };\n  }\n  generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset) {\n    const audioSamples = audioTrack.samples;\n    const videoSamples = videoTrack.samples;\n    const typeSupported = this.typeSupported;\n    const tracks = {};\n    const _initPTS = this._initPTS;\n    let computePTSDTS = !_initPTS || accurateTimeOffset;\n    let container = \"audio/mp4\";\n    let initPTS;\n    let initDTS;\n    let timescale;\n    if (computePTSDTS) {\n      initPTS = initDTS = Infinity;\n    }\n    if (audioTrack.config && audioSamples.length) {\n      audioTrack.timescale = audioTrack.samplerate;\n      switch (audioTrack.segmentCodec) {\n        case \"mp3\":\n          if (typeSupported.mpeg) {\n            container = \"audio/mpeg\";\n            audioTrack.codec = \"\";\n          } else if (typeSupported.mp3) {\n            audioTrack.codec = \"mp3\";\n          }\n          break;\n        case \"ac3\":\n          audioTrack.codec = \"ac-3\";\n          break;\n      }\n      tracks.audio = {\n        id: \"audio\",\n        container,\n        codec: audioTrack.codec,\n        initSegment: audioTrack.segmentCodec === \"mp3\" && typeSupported.mpeg ? new Uint8Array(0) : MP4.initSegment([audioTrack]),\n        metadata: {\n          channelCount: audioTrack.channelCount\n        }\n      };\n      if (computePTSDTS) {\n        timescale = audioTrack.inputTimeScale;\n        if (!_initPTS || timescale !== _initPTS.timescale) {\n          initPTS = initDTS = audioSamples[0].pts - Math.round(timescale * timeOffset);\n        } else {\n          computePTSDTS = false;\n        }\n      }\n    }\n    if (videoTrack.sps && videoTrack.pps && videoSamples.length) {\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        timescale = videoTrack.inputTimeScale;\n        if (!_initPTS || timescale !== _initPTS.timescale) {\n          const startPTS = this.getVideoStartPts(videoSamples);\n          const startOffset = Math.round(timescale * timeOffset);\n          initDTS = Math.min(initDTS, normalizePts(videoSamples[0].dts, startPTS) - startOffset);\n          initPTS = Math.min(initPTS, startPTS - startOffset);\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    if (Object.keys(tracks).length) {\n      this.ISGenerated = true;\n      if (computePTSDTS) {\n        this._initPTS = {\n          baseTime: initPTS,\n          timescale\n        };\n        this._initDTS = {\n          baseTime: initDTS,\n          timescale\n        };\n      } else {\n        initPTS = timescale = void 0;\n      }\n      return {\n        tracks,\n        initPTS,\n        timescale\n      };\n    }\n  }\n  remuxVideo(track, timeOffset, contiguous, audioTrackLength) {\n    const timeScale = track.inputTimeScale;\n    const inputSamples = track.samples;\n    const outputSamples = [];\n    const nbSamples = inputSamples.length;\n    const initPTS = this._initPTS;\n    let nextAvcDts = this.nextAvcDts;\n    let offset = 8;\n    let mp4SampleDuration = this.videoSampleDuration;\n    let firstDTS;\n    let lastDTS;\n    let minPTS = Number.POSITIVE_INFINITY;\n    let maxPTS = Number.NEGATIVE_INFINITY;\n    let sortSamples = false;\n    if (!contiguous || nextAvcDts === null) {\n      const pts = timeOffset * timeScale;\n      const cts = inputSamples[0].pts - normalizePts(inputSamples[0].dts, inputSamples[0].pts);\n      if (chromeVersion && nextAvcDts !== null && Math.abs(pts - cts - nextAvcDts) < 15e3) {\n        contiguous = true;\n      } else {\n        nextAvcDts = pts - cts;\n      }\n    }\n    const initTime = initPTS.baseTime * timeScale / initPTS.timescale;\n    for (let i = 0; i < nbSamples; i++) {\n      const sample = inputSamples[i];\n      sample.pts = normalizePts(sample.pts - initTime, nextAvcDts);\n      sample.dts = normalizePts(sample.dts - initTime, nextAvcDts);\n      if (sample.dts < inputSamples[i > 0 ? i - 1 : i].dts) {\n        sortSamples = true;\n      }\n    }\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    firstDTS = inputSamples[0].dts;\n    lastDTS = inputSamples[inputSamples.length - 1].dts;\n    const inputDuration = lastDTS - firstDTS;\n    const averageSampleDuration = inputDuration ? Math.round(inputDuration / (nbSamples - 1)) : mp4SampleDuration || track.inputTimeScale / 30;\n    if (contiguous) {\n      const delta = firstDTS - nextAvcDts;\n      const foundHole = delta > averageSampleDuration;\n      const foundOverlap = delta < -1;\n      if (foundHole || foundOverlap) {\n        if (foundHole) {\n          logger.warn(`AVC: ${toMsFromMpegTsClock(delta, true)} ms (${delta}dts) hole between fragments detected at ${timeOffset.toFixed(3)}`);\n        } else {\n          logger.warn(`AVC: ${toMsFromMpegTsClock(-delta, true)} ms (${delta}dts) overlapping between fragments detected at ${timeOffset.toFixed(3)}`);\n        }\n        if (!foundOverlap || nextAvcDts >= inputSamples[0].pts || chromeVersion) {\n          firstDTS = nextAvcDts;\n          const firstPTS = inputSamples[0].pts - delta;\n          if (foundHole) {\n            inputSamples[0].dts = firstDTS;\n            inputSamples[0].pts = firstPTS;\n          } else {\n            for (let i = 0; i < inputSamples.length; i++) {\n              if (inputSamples[i].dts > firstPTS) {\n                break;\n              }\n              inputSamples[i].dts -= delta;\n              inputSamples[i].pts -= delta;\n            }\n          }\n          logger.log(`Video: Initial PTS/DTS adjusted: ${toMsFromMpegTsClock(firstPTS, true)}/${toMsFromMpegTsClock(firstDTS, true)}, delta: ${toMsFromMpegTsClock(delta, true)} ms`);\n        }\n      }\n    }\n    firstDTS = Math.max(0, firstDTS);\n    let nbNalu = 0;\n    let naluLen = 0;\n    let dtsStep = firstDTS;\n    for (let i = 0; i < nbSamples; i++) {\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      naluLen += sampleLen;\n      nbNalu += nbUnits;\n      sample.length = sampleLen;\n      if (sample.dts < dtsStep) {\n        sample.dts = dtsStep;\n        dtsStep += averageSampleDuration / 4 | 0 || 1;\n      } else {\n        dtsStep = sample.dts;\n      }\n      minPTS = Math.min(sample.pts, minPTS);\n      maxPTS = Math.max(sample.pts, maxPTS);\n    }\n    lastDTS = inputSamples[nbSamples - 1].dts;\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    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      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      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 = i > 0 ? VideoSample.dts - inputSamples[i - 1].dts : averageSampleDuration;\n        ptsDelta = i > 0 ? VideoSample.pts - inputSamples[i - 1].pts : averageSampleDuration;\n        if (config.stretchShortVideoTrack && this.nextAudioPts !== null) {\n          const gapTolerance = Math.floor(config.maxBufferHole * timeScale);\n          const deltaToFrameEnd = (audioTrackLength ? minPTS + audioTrackLength * timeScale : this.nextAudioPts) - VideoSample.pts;\n          if (deltaToFrameEnd > gapTolerance) {\n            mp4SampleDuration = deltaToFrameEnd - lastFrameDuration;\n            if (mp4SampleDuration < 0) {\n              mp4SampleDuration = lastFrameDuration;\n            } else {\n              stretchedLastFrame = true;\n            }\n            logger.log(`[mp4-remuxer]: It is approximately ${deltaToFrameEnd / 90} ms to the next segment; using duration ${mp4SampleDuration / 90} ms for the last video frame.`);\n          } else {\n            mp4SampleDuration = lastFrameDuration;\n          }\n        } else {\n          mp4SampleDuration = lastFrameDuration;\n        }\n      }\n      const compositionTimeOffset = Math.round(VideoSample.pts - VideoSample.dts);\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      outputSamples.push(new Mp4Sample(VideoSample.key, mp4SampleDuration, mp4SampleLength, compositionTimeOffset));\n    }\n    if (outputSamples.length) {\n      if (chromeVersion) {\n        if (chromeVersion < 70) {\n          const flags = outputSamples[0].flags;\n          flags.dependsOn = 2;\n          flags.isNonSync = 0;\n        }\n      } else if (safariWebkitVersion) {\n        if (maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta && averageSampleDuration / maxDtsDelta < 0.025 && outputSamples[0].cts === 0) {\n          logger.warn(\"Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.\");\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 ? outputSamples[i - 1].duration : averageSampleDuration;\n            }\n            outputSamples[i].cts = 0;\n            dts = nextDts;\n          }\n        }\n      }\n    }\n    mp4SampleDuration = stretchedLastFrame || !mp4SampleDuration ? averageSampleDuration : mp4SampleDuration;\n    this.nextAvcDts = nextAvcDts = lastDTS + mp4SampleDuration;\n    this.videoSampleDuration = mp4SampleDuration;\n    this.isVideoContiguous = true;\n    const moof = MP4.moof(track.sequenceNumber++, firstDTS, _extends({}, track, {\n      samples: outputSamples\n    }));\n    const type = \"video\";\n    const data = {\n      data1: moof,\n      data2: mdat,\n      startPTS: minPTS / timeScale,\n      endPTS: (maxPTS + mp4SampleDuration) / timeScale,\n      startDTS: firstDTS / timeScale,\n      endDTS: nextAvcDts / 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  getSamplesPerFrame(track) {\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  remuxAudio(track, timeOffset, contiguous, accurateTimeOffset, videoTimeOffset) {\n    const inputTimeScale = track.inputTimeScale;\n    const mp4timeScale = track.samplerate ? track.samplerate : inputTimeScale;\n    const scaleFactor = inputTimeScale / mp4timeScale;\n    const mp4SampleDuration = this.getSamplesPerFrame(track);\n    const inputSampleDuration = mp4SampleDuration * scaleFactor;\n    const initPTS = this._initPTS;\n    const rawMPEG = track.segmentCodec === \"mp3\" && this.typeSupported.mpeg;\n    const outputSamples = [];\n    const alignedWithVideo = videoTimeOffset !== void 0;\n    let inputSamples = track.samples;\n    let offset = rawMPEG ? 0 : 8;\n    let nextAudioPts = this.nextAudioPts || -1;\n    const timeOffsetMpegTS = timeOffset * inputTimeScale;\n    const initTime = initPTS.baseTime * inputTimeScale / initPTS.timescale;\n    this.isAudioContiguous = contiguous = contiguous || inputSamples.length && nextAudioPts > 0 && (accurateTimeOffset && Math.abs(timeOffsetMpegTS - nextAudioPts) < 9e3 || Math.abs(normalizePts(inputSamples[0].pts - initTime, timeOffsetMpegTS) - nextAudioPts) < 20 * inputSampleDuration);\n    inputSamples.forEach(function(sample) {\n      sample.pts = normalizePts(sample.pts - initTime, timeOffsetMpegTS);\n    });\n    if (!contiguous || nextAudioPts < 0) {\n      inputSamples = inputSamples.filter((sample) => sample.pts >= 0);\n      if (!inputSamples.length) {\n        return;\n      }\n      if (videoTimeOffset === 0) {\n        nextAudioPts = 0;\n      } else if (accurateTimeOffset && !alignedWithVideo) {\n        nextAudioPts = Math.max(0, timeOffsetMpegTS);\n      } else {\n        nextAudioPts = inputSamples[0].pts;\n      }\n    }\n    if (track.segmentCodec === \"aac\") {\n      const maxAudioFramesDrift = this.config.maxAudioFramesDrift;\n      for (let i = 0, nextPts = nextAudioPts; i < inputSamples.length; i++) {\n        const sample = inputSamples[i];\n        const pts = sample.pts;\n        const delta = pts - nextPts;\n        const duration = Math.abs(1e3 * delta / inputTimeScale);\n        if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) {\n          if (i === 0) {\n            logger.warn(`Audio frame @ ${(pts / inputTimeScale).toFixed(3)}s overlaps nextAudioPts by ${Math.round(1e3 * delta / inputTimeScale)} ms.`);\n            this.nextAudioPts = nextAudioPts = nextPts = pts;\n          }\n        } else if (delta >= maxAudioFramesDrift * inputSampleDuration && duration < MAX_SILENT_FRAME_DURATION && alignedWithVideo) {\n          let missing = Math.round(delta / inputSampleDuration);\n          nextPts = pts - missing * inputSampleDuration;\n          if (nextPts < 0) {\n            missing--;\n            nextPts += inputSampleDuration;\n          }\n          if (i === 0) {\n            this.nextAudioPts = nextAudioPts = nextPts;\n          }\n          logger.warn(`[mp4-remuxer]: Injecting ${missing} audio frame @ ${(nextPts / inputTimeScale).toFixed(3)}s due to ${Math.round(1e3 * delta / inputTimeScale)} ms gap.`);\n          for (let j = 0; j < missing; j++) {\n            const newStamp = Math.max(nextPts, 0);\n            let fillFrame = AAC.getSilentFrame(track.manifestCodec || track.codec, track.channelCount);\n            if (!fillFrame) {\n              logger.log(\"[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.\");\n              fillFrame = sample.unit.subarray();\n            }\n            inputSamples.splice(i, 0, {\n              unit: fillFrame,\n              pts: newStamp\n            });\n            nextPts += inputSampleDuration;\n            i++;\n          }\n        }\n        sample.pts = nextPts;\n        nextPts += inputSampleDuration;\n      }\n    }\n    let firstPTS = null;\n    let lastPTS = null;\n    let mdat;\n    let mdatSize = 0;\n    let sampleLength = 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        const prevSample = outputSamples[j - 1];\n        prevSample.duration = Math.round((pts - lastPTS) / scaleFactor);\n      } else {\n        if (contiguous && track.segmentCodec === \"aac\") {\n          pts = nextAudioPts;\n        }\n        firstPTS = pts;\n        if (mdatSize > 0) {\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          return;\n        }\n      }\n      mdat.set(unit, offset);\n      const unitLen = unit.byteLength;\n      offset += unitLen;\n      outputSamples.push(new Mp4Sample(true, mp4SampleDuration, unitLen, 0));\n      lastPTS = pts;\n    }\n    const nbSamples = outputSamples.length;\n    if (!nbSamples) {\n      return;\n    }\n    const lastSample = outputSamples[outputSamples.length - 1];\n    this.nextAudioPts = nextAudioPts = lastPTS + scaleFactor * lastSample.duration;\n    const moof = rawMPEG ? new Uint8Array(0) : MP4.moof(track.sequenceNumber++, firstPTS / scaleFactor, _extends({}, track, {\n      samples: outputSamples\n    }));\n    track.samples = [];\n    const start = firstPTS / inputTimeScale;\n    const end = nextAudioPts / inputTimeScale;\n    const type = \"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    this.isAudioContiguous = true;\n    return audioData;\n  }\n  remuxEmptyAudio(track, timeOffset, contiguous, videoData) {\n    const inputTimeScale = track.inputTimeScale;\n    const mp4timeScale = track.samplerate ? track.samplerate : inputTimeScale;\n    const scaleFactor = inputTimeScale / mp4timeScale;\n    const nextAudioPts = this.nextAudioPts;\n    const initDTS = this._initDTS;\n    const init90kHz = initDTS.baseTime * 9e4 / initDTS.timescale;\n    const startDTS = (nextAudioPts !== null ? nextAudioPts : videoData.startDTS * inputTimeScale) + init90kHz;\n    const endDTS = videoData.endDTS * inputTimeScale + init90kHz;\n    const frameDuration = scaleFactor * AAC_SAMPLES_PER_FRAME;\n    const nbSamples = Math.ceil((endDTS - startDTS) / frameDuration);\n    const silentFrame = AAC.getSilentFrame(track.manifestCodec || track.codec, track.channelCount);\n    logger.warn(\"[mp4-remuxer]: remux empty Audio\");\n    if (!silentFrame) {\n      logger.trace(\"[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec\");\n      return;\n    }\n    const samples = [];\n    for (let i = 0; i < nbSamples; i++) {\n      const stamp = startDTS + i * frameDuration;\n      samples.push({\n        unit: silentFrame,\n        pts: stamp,\n        dts: stamp\n      });\n    }\n    track.samples = samples;\n    return this.remuxAudio(track, timeOffset, contiguous, false);\n  }\n}\nfunction normalizePts(value, reference) {\n  let offset;\n  if (reference === null) {\n    return value;\n  }\n  if (reference < value) {\n    offset = -8589934592;\n  } else {\n    offset = 8589934592;\n  }\n  while (Math.abs(value - reference) > 4294967296) {\n    value += offset;\n  }\n  return value;\n}\nfunction findKeyframeIndex(samples) {\n  for (let i = 0; i < samples.length; i++) {\n    if (samples[i].key) {\n      return i;\n    }\n  }\n  return -1;\n}\nfunction flushTextTrackMetadataCueSamples(track, timeOffset, initPTS, initDTS) {\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    sample.pts = normalizePts(sample.pts - initPTS.baseTime * inputTimeScale / initPTS.timescale, timeOffset * inputTimeScale) / inputTimeScale;\n    sample.dts = normalizePts(sample.dts - initDTS.baseTime * inputTimeScale / initDTS.timescale, timeOffset * inputTimeScale) / inputTimeScale;\n  }\n  const samples = track.samples;\n  track.samples = [];\n  return {\n    samples\n  };\n}\nfunction flushTextTrackUserdataCueSamples(track, timeOffset, initPTS) {\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    sample.pts = normalizePts(sample.pts - initPTS.baseTime * inputTimeScale / initPTS.timescale, timeOffset * inputTimeScale) / 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}\nclass Mp4Sample {\n  constructor(isKeyframe, duration, size, cts) {\n    this.size = void 0;\n    this.duration = void 0;\n    this.cts = void 0;\n    this.flags = void 0;\n    this.duration = duration;\n    this.size = size;\n    this.cts = cts;\n    this.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}\nclass PassThroughRemuxer {\n  constructor() {\n    this.emitInitSegment = false;\n    this.audioCodec = void 0;\n    this.videoCodec = void 0;\n    this.initData = void 0;\n    this.initPTS = null;\n    this.initTracks = void 0;\n    this.lastEndTime = null;\n  }\n  destroy() {\n  }\n  resetTimeStamp(defaultInitPTS) {\n    this.initPTS = defaultInitPTS;\n    this.lastEndTime = null;\n  }\n  resetNextTimestamp() {\n    this.lastEndTime = null;\n  }\n  resetInitSegment(initSegment, audioCodec, videoCodec, decryptdata) {\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n    this.generateInitSegment(patchEncyptionData(initSegment, decryptdata));\n    this.emitInitSegment = true;\n  }\n  generateInitSegment(initSegment) {\n    let {\n      audioCodec,\n      videoCodec\n    } = this;\n    if (!(initSegment != null && initSegment.byteLength)) {\n      this.initTracks = void 0;\n      this.initData = void 0;\n      return;\n    }\n    const initData = this.initData = parseInitSegment(initSegment);\n    if (initData.audio) {\n      audioCodec = getParsedTrackCodec(initData.audio, ElementaryStreamTypes.AUDIO);\n    }\n    if (initData.video) {\n      videoCodec = getParsedTrackCodec(initData.video, ElementaryStreamTypes.VIDEO);\n    }\n    const tracks = {};\n    if (initData.audio && initData.video) {\n      tracks.audiovideo = {\n        container: \"video/mp4\",\n        codec: audioCodec + \",\" + videoCodec,\n        initSegment,\n        id: \"main\"\n      };\n    } else if (initData.audio) {\n      tracks.audio = {\n        container: \"audio/mp4\",\n        codec: audioCodec,\n        initSegment,\n        id: \"audio\"\n      };\n    } else if (initData.video) {\n      tracks.video = {\n        container: \"video/mp4\",\n        codec: videoCodec,\n        initSegment,\n        id: \"main\"\n      };\n    } else {\n      logger.warn(\"[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.\");\n    }\n    this.initTracks = tracks;\n  }\n  remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset) {\n    var _initData, _initData2;\n    let {\n      initPTS,\n      lastEndTime\n    } = this;\n    const result = {\n      audio: void 0,\n      video: void 0,\n      text: textTrack,\n      id3: id3Track,\n      initSegment: void 0\n    };\n    if (!isFiniteNumber(lastEndTime)) {\n      lastEndTime = this.lastEndTime = timeOffset || 0;\n    }\n    const data = videoTrack.samples;\n    if (!(data != null && data.length)) {\n      return result;\n    }\n    const initSegment = {\n      initPTS: void 0,\n      timescale: 1\n    };\n    let initData = this.initData;\n    if (!((_initData = initData) != null && _initData.length)) {\n      this.generateInitSegment(data);\n      initData = this.initData;\n    }\n    if (!((_initData2 = initData) != null && _initData2.length)) {\n      logger.warn(\"[passthrough-remuxer.ts]: Failed to generate initSegment.\");\n      return result;\n    }\n    if (this.emitInitSegment) {\n      initSegment.tracks = this.initTracks;\n      this.emitInitSegment = false;\n    }\n    const duration = getDuration(data, initData);\n    const startDTS = getStartDTS(initData, data);\n    const decodeTime = startDTS === null ? timeOffset : startDTS;\n    if (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || initSegment.timescale !== initPTS.timescale && accurateTimeOffset) {\n      initSegment.initPTS = decodeTime - timeOffset;\n      if (initPTS && initPTS.timescale === 1) {\n        logger.warn(`Adjusting initPTS by ${initSegment.initPTS - initPTS.baseTime}`);\n      }\n      this.initPTS = initPTS = {\n        baseTime: initSegment.initPTS,\n        timescale: 1\n      };\n    }\n    const startTime = audioTrack ? decodeTime - initPTS.baseTime / initPTS.timescale : lastEndTime;\n    const endTime = startTime + duration;\n    offsetStartDTS(initData, data, initPTS.baseTime / initPTS.timescale);\n    if (duration > 0) {\n      this.lastEndTime = endTime;\n    } else {\n      logger.warn(\"Duration parsed from mp4 should be greater than zero\");\n      this.resetNextTimestamp();\n    }\n    const hasAudio = !!initData.audio;\n    const hasVideo = !!initData.video;\n    let type = \"\";\n    if (hasAudio) {\n      type += \"audio\";\n    }\n    if (hasVideo) {\n      type += \"video\";\n    }\n    const track = {\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    };\n    result.audio = track.type === \"audio\" ? track : void 0;\n    result.video = track.type !== \"audio\" ? track : void 0;\n    result.initSegment = initSegment;\n    result.id3 = flushTextTrackMetadataCueSamples(id3Track, timeOffset, initPTS, initPTS);\n    if (textTrack.samples.length) {\n      result.text = flushTextTrackUserdataCueSamples(textTrack, timeOffset, initPTS);\n    }\n    return result;\n  }\n}\nfunction isInvalidInitPts(initPTS, startDTS, timeOffset, duration) {\n  if (initPTS === null) {\n    return true;\n  }\n  const minDuration = Math.max(duration, 1);\n  const startTime = startDTS - initPTS.baseTime / initPTS.timescale;\n  return Math.abs(startTime - timeOffset) > minDuration;\n}\nfunction getParsedTrackCodec(track, type) {\n  const parsedCodec = track == null ? void 0 : track.codec;\n  if (parsedCodec && parsedCodec.length > 4) {\n    return parsedCodec;\n  }\n  if (type === ElementaryStreamTypes.AUDIO) {\n    if (parsedCodec === \"ec-3\" || parsedCodec === \"ac-3\" || parsedCodec === \"alac\") {\n      return parsedCodec;\n    }\n    if (parsedCodec === \"fLaC\" || parsedCodec === \"Opus\") {\n      const preferManagedMediaSource = false;\n      return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);\n    }\n    const result = \"mp4a.40.5\";\n    logger.info(`Parsed audio codec \"${parsedCodec}\" or audio object type not handled. Using \"${result}\"`);\n    return result;\n  }\n  logger.warn(`Unhandled video codec \"${parsedCodec}\"`);\n  if (parsedCodec === \"hvc1\" || parsedCodec === \"hev1\") {\n    return \"hvc1.1.6.L120.90\";\n  }\n  if (parsedCodec === \"av01\") {\n    return \"av01.0.04M.08\";\n  }\n  return \"avc1.42e01e\";\n}\nlet now;\ntry {\n  now = self.performance.now.bind(self.performance);\n} catch (err) {\n  logger.debug(\"Unable to use Performance API on this environment\");\n  now = optionalSelf == null ? void 0 : optionalSelf.Date.now;\n}\nconst muxConfig = [{\n  demux: MP4Demuxer,\n  remux: PassThroughRemuxer\n}, {\n  demux: TSDemuxer,\n  remux: MP4Remuxer\n}, {\n  demux: AACDemuxer,\n  remux: MP4Remuxer\n}, {\n  demux: MP3Demuxer,\n  remux: MP4Remuxer\n}];\n{\n  muxConfig.splice(2, 0, {\n    demux: AC3Demuxer,\n    remux: MP4Remuxer\n  });\n}\nclass Transmuxer {\n  constructor(observer, typeSupported, config, vendor, id) {\n    this.async = false;\n    this.observer = void 0;\n    this.typeSupported = void 0;\n    this.config = void 0;\n    this.vendor = void 0;\n    this.id = void 0;\n    this.demuxer = void 0;\n    this.remuxer = void 0;\n    this.decrypter = void 0;\n    this.probe = void 0;\n    this.decryptionPromise = null;\n    this.transmuxConfig = void 0;\n    this.currentTransmuxState = void 0;\n    this.observer = observer;\n    this.typeSupported = typeSupported;\n    this.config = config;\n    this.vendor = vendor;\n    this.id = id;\n  }\n  configure(transmuxConfig) {\n    this.transmuxConfig = transmuxConfig;\n    if (this.decrypter) {\n      this.decrypter.reset();\n    }\n  }\n  push(data, decryptdata, chunkMeta, state) {\n    const stats = chunkMeta.transmuxing;\n    stats.executeStart = now();\n    let uintData = new Uint8Array(data);\n    const {\n      currentTransmuxState,\n      transmuxConfig\n    } = this;\n    if (state) {\n      this.currentTransmuxState = state;\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    const keyData = getEncryptionType(uintData, decryptdata);\n    if (keyData && keyData.method === \"AES-128\") {\n      const decrypter = this.getDecrypter();\n      if (decrypter.isSync()) {\n        let decryptedData = decrypter.softwareDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer);\n        const loadingParts = chunkMeta.part > -1;\n        if (loadingParts) {\n          decryptedData = decrypter.flush();\n        }\n        if (!decryptedData) {\n          stats.executeEnd = now();\n          return emptyResult(chunkMeta);\n        }\n        uintData = new Uint8Array(decryptedData);\n      } else {\n        this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer).then((decryptedData) => {\n          const result2 = this.push(decryptedData, null, chunkMeta);\n          this.decryptionPromise = null;\n          return result2;\n        });\n        return this.decryptionPromise;\n      }\n    }\n    const resetMuxers = this.needsProbing(discontinuity, trackSwitch);\n    if (resetMuxers) {\n      const error = this.configureTransmuxer(uintData);\n      if (error) {\n        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    if (discontinuity || trackSwitch || initSegmentChange || resetMuxers) {\n      this.resetInitSegment(initSegmentData, audioCodec, videoCodec, duration, decryptdata);\n    }\n    if (discontinuity || initSegmentChange || resetMuxers) {\n      this.resetInitialTimestamp(defaultInitPts);\n    }\n    if (!contiguous) {\n      this.resetContiguity();\n    }\n    const result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta);\n    const currentState = this.currentTransmuxState;\n    currentState.contiguous = true;\n    currentState.discontinuity = false;\n    currentState.trackSwitch = false;\n    stats.executeEnd = now();\n    return result;\n  }\n  // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type)\n  flush(chunkMeta) {\n    const stats = chunkMeta.transmuxing;\n    stats.executeStart = now();\n    const {\n      decrypter,\n      currentTransmuxState,\n      decryptionPromise\n    } = this;\n    if (decryptionPromise) {\n      return decryptionPromise.then(() => {\n        return this.flush(chunkMeta);\n      });\n    }\n    const transmuxResults = [];\n    const {\n      timeOffset\n    } = currentTransmuxState;\n    if (decrypter) {\n      const decryptedData = decrypter.flush();\n      if (decryptedData) {\n        transmuxResults.push(this.push(decryptedData, null, chunkMeta));\n      }\n    }\n    const {\n      demuxer,\n      remuxer\n    } = this;\n    if (!demuxer || !remuxer) {\n      stats.executeEnd = now();\n      return [emptyResult(chunkMeta)];\n    }\n    const demuxResultOrPromise = demuxer.flush(timeOffset);\n    if (isPromise(demuxResultOrPromise)) {\n      return demuxResultOrPromise.then((demuxResult) => {\n        this.flushRemux(transmuxResults, demuxResult, chunkMeta);\n        return transmuxResults;\n      });\n    }\n    this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);\n    return transmuxResults;\n  }\n  flushRemux(transmuxResults, demuxResult, chunkMeta) {\n    const {\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack\n    } = demuxResult;\n    const {\n      accurateTimeOffset,\n      timeOffset\n    } = this.currentTransmuxState;\n    logger.log(`[transmuxer.ts]: Flushed fragment ${chunkMeta.sn}${chunkMeta.part > -1 ? \" p: \" + chunkMeta.part : \"\"} of level ${chunkMeta.level}`);\n    const remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);\n    transmuxResults.push({\n      remuxResult,\n      chunkMeta\n    });\n    chunkMeta.transmuxing.executeEnd = now();\n  }\n  resetInitialTimestamp(defaultInitPts) {\n    const {\n      demuxer,\n      remuxer\n    } = this;\n    if (!demuxer || !remuxer) {\n      return;\n    }\n    demuxer.resetTimeStamp(defaultInitPts);\n    remuxer.resetTimeStamp(defaultInitPts);\n  }\n  resetContiguity() {\n    const {\n      demuxer,\n      remuxer\n    } = this;\n    if (!demuxer || !remuxer) {\n      return;\n    }\n    demuxer.resetContiguity();\n    remuxer.resetNextTimestamp();\n  }\n  resetInitSegment(initSegmentData, audioCodec, videoCodec, trackDuration, decryptdata) {\n    const {\n      demuxer,\n      remuxer\n    } = this;\n    if (!demuxer || !remuxer) {\n      return;\n    }\n    demuxer.resetInitSegment(initSegmentData, audioCodec, videoCodec, trackDuration);\n    remuxer.resetInitSegment(initSegmentData, audioCodec, videoCodec, decryptdata);\n  }\n  destroy() {\n    if (this.demuxer) {\n      this.demuxer.destroy();\n      this.demuxer = void 0;\n    }\n    if (this.remuxer) {\n      this.remuxer.destroy();\n      this.remuxer = void 0;\n    }\n  }\n  transmux(data, keyData, timeOffset, accurateTimeOffset, chunkMeta) {\n    let result;\n    if (keyData && keyData.method === \"SAMPLE-AES\") {\n      result = this.transmuxSampleAes(data, keyData, timeOffset, accurateTimeOffset, chunkMeta);\n    } else {\n      result = this.transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta);\n    }\n    return result;\n  }\n  transmuxUnencrypted(data, timeOffset, accurateTimeOffset, chunkMeta) {\n    const {\n      audioTrack,\n      videoTrack,\n      id3Track,\n      textTrack\n    } = this.demuxer.demux(data, timeOffset, false, !this.config.progressive);\n    const remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, false, this.id);\n    return {\n      remuxResult,\n      chunkMeta\n    };\n  }\n  transmuxSampleAes(data, decryptData, timeOffset, accurateTimeOffset, chunkMeta) {\n    return this.demuxer.demuxSampleAes(data, decryptData, timeOffset).then((demuxResult) => {\n      const remuxResult = this.remuxer.remux(demuxResult.audioTrack, demuxResult.videoTrack, demuxResult.id3Track, demuxResult.textTrack, timeOffset, accurateTimeOffset, false, this.id);\n      return {\n        remuxResult,\n        chunkMeta\n      };\n    });\n  }\n  configureTransmuxer(data) {\n    const {\n      config,\n      observer,\n      typeSupported,\n      vendor\n    } = this;\n    let mux;\n    for (let i = 0, len = muxConfig.length; i < len; i++) {\n      var _muxConfig$i$demux;\n      if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data)) {\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    const demuxer = this.demuxer;\n    const remuxer = this.remuxer;\n    const Remuxer = mux.remux;\n    const Demuxer = mux.demux;\n    if (!remuxer || !(remuxer instanceof Remuxer)) {\n      this.remuxer = new Remuxer(observer, config, typeSupported, vendor);\n    }\n    if (!demuxer || !(demuxer instanceof Demuxer)) {\n      this.demuxer = new Demuxer(observer, config, typeSupported);\n      this.probe = Demuxer.probe;\n    }\n  }\n  needsProbing(discontinuity, trackSwitch) {\n    return !this.demuxer || !this.remuxer || discontinuity || trackSwitch;\n  }\n  getDecrypter() {\n    let decrypter = this.decrypter;\n    if (!decrypter) {\n      decrypter = this.decrypter = new Decrypter(this.config);\n    }\n    return decrypter;\n  }\n}\nfunction getEncryptionType(data, decryptData) {\n  let encryptionType = null;\n  if (data.byteLength > 0 && (decryptData == null ? void 0 : decryptData.key) != null && decryptData.iv !== null && decryptData.method != null) {\n    encryptionType = decryptData;\n  }\n  return encryptionType;\n}\nconst emptyResult = (chunkMeta) => ({\n  remuxResult: {},\n  chunkMeta\n});\nfunction isPromise(p) {\n  return \"then\" in p && p.then instanceof Function;\n}\nclass TransmuxConfig {\n  constructor(audioCodec, videoCodec, initSegmentData, duration, defaultInitPts) {\n    this.audioCodec = void 0;\n    this.videoCodec = void 0;\n    this.initSegmentData = void 0;\n    this.duration = void 0;\n    this.defaultInitPts = void 0;\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n    this.initSegmentData = initSegmentData;\n    this.duration = duration;\n    this.defaultInitPts = defaultInitPts || null;\n  }\n}\nclass TransmuxState {\n  constructor(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange) {\n    this.discontinuity = void 0;\n    this.contiguous = void 0;\n    this.accurateTimeOffset = void 0;\n    this.trackSwitch = void 0;\n    this.timeOffset = void 0;\n    this.initSegmentChange = void 0;\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}\nvar eventemitter3 = { exports: {} };\n(function(module) {\n  var has = Object.prototype.hasOwnProperty, prefix = \"~\";\n  function Events2() {\n  }\n  if (Object.create) {\n    Events2.prototype = /* @__PURE__ */ Object.create(null);\n    if (!new Events2().__proto__)\n      prefix = false;\n  }\n  function EE(fn, context, once) {\n    this.fn = fn;\n    this.context = context;\n    this.once = once || false;\n  }\n  function addListener(emitter, event, fn, context, once) {\n    if (typeof fn !== \"function\") {\n      throw new TypeError(\"The listener must be a function\");\n    }\n    var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;\n    if (!emitter._events[evt])\n      emitter._events[evt] = listener, emitter._eventsCount++;\n    else if (!emitter._events[evt].fn)\n      emitter._events[evt].push(listener);\n    else\n      emitter._events[evt] = [emitter._events[evt], listener];\n    return emitter;\n  }\n  function clearEvent(emitter, evt) {\n    if (--emitter._eventsCount === 0)\n      emitter._events = new Events2();\n    else\n      delete emitter._events[evt];\n  }\n  function EventEmitter2() {\n    this._events = new Events2();\n    this._eventsCount = 0;\n  }\n  EventEmitter2.prototype.eventNames = function eventNames() {\n    var names = [], events, name;\n    if (this._eventsCount === 0)\n      return names;\n    for (name in events = this._events) {\n      if (has.call(events, name))\n        names.push(prefix ? name.slice(1) : name);\n    }\n    if (Object.getOwnPropertySymbols) {\n      return names.concat(Object.getOwnPropertySymbols(events));\n    }\n    return names;\n  };\n  EventEmitter2.prototype.listeners = function listeners(event) {\n    var evt = prefix ? prefix + event : event, handlers = this._events[evt];\n    if (!handlers)\n      return [];\n    if (handlers.fn)\n      return [handlers.fn];\n    for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n      ee[i] = handlers[i].fn;\n    }\n    return ee;\n  };\n  EventEmitter2.prototype.listenerCount = function listenerCount(event) {\n    var evt = prefix ? prefix + event : event, listeners = this._events[evt];\n    if (!listeners)\n      return 0;\n    if (listeners.fn)\n      return 1;\n    return listeners.length;\n  };\n  EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n    var evt = prefix ? prefix + event : event;\n    if (!this._events[evt])\n      return false;\n    var listeners = this._events[evt], len = arguments.length, args, i;\n    if (listeners.fn) {\n      if (listeners.once)\n        this.removeListener(event, listeners.fn, void 0, true);\n      switch (len) {\n        case 1:\n          return listeners.fn.call(listeners.context), true;\n        case 2:\n          return listeners.fn.call(listeners.context, a1), true;\n        case 3:\n          return listeners.fn.call(listeners.context, a1, a2), true;\n        case 4:\n          return listeners.fn.call(listeners.context, a1, a2, a3), true;\n        case 5:\n          return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n        case 6:\n          return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n      }\n      for (i = 1, args = new Array(len - 1); i < len; i++) {\n        args[i - 1] = arguments[i];\n      }\n      listeners.fn.apply(listeners.context, args);\n    } else {\n      var length = listeners.length, j;\n      for (i = 0; i < length; i++) {\n        if (listeners[i].once)\n          this.removeListener(event, listeners[i].fn, void 0, true);\n        switch (len) {\n          case 1:\n            listeners[i].fn.call(listeners[i].context);\n            break;\n          case 2:\n            listeners[i].fn.call(listeners[i].context, a1);\n            break;\n          case 3:\n            listeners[i].fn.call(listeners[i].context, a1, a2);\n            break;\n          case 4:\n            listeners[i].fn.call(listeners[i].context, a1, a2, a3);\n            break;\n          default:\n            if (!args)\n              for (j = 1, args = new Array(len - 1); j < len; j++) {\n                args[j - 1] = arguments[j];\n              }\n            listeners[i].fn.apply(listeners[i].context, args);\n        }\n      }\n    }\n    return true;\n  };\n  EventEmitter2.prototype.on = function on(event, fn, context) {\n    return addListener(this, event, fn, context, false);\n  };\n  EventEmitter2.prototype.once = function once(event, fn, context) {\n    return addListener(this, event, fn, context, true);\n  };\n  EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {\n    var evt = prefix ? prefix + event : event;\n    if (!this._events[evt])\n      return this;\n    if (!fn) {\n      clearEvent(this, evt);\n      return this;\n    }\n    var listeners = this._events[evt];\n    if (listeners.fn) {\n      if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {\n        clearEvent(this, evt);\n      }\n    } else {\n      for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n        if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {\n          events.push(listeners[i]);\n        }\n      }\n      if (events.length)\n        this._events[evt] = events.length === 1 ? events[0] : events;\n      else\n        clearEvent(this, evt);\n    }\n    return this;\n  };\n  EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {\n    var evt;\n    if (event) {\n      evt = prefix ? prefix + event : event;\n      if (this._events[evt])\n        clearEvent(this, evt);\n    } else {\n      this._events = new Events2();\n      this._eventsCount = 0;\n    }\n    return this;\n  };\n  EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;\n  EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;\n  EventEmitter2.prefixed = prefix;\n  EventEmitter2.EventEmitter = EventEmitter2;\n  {\n    module.exports = EventEmitter2;\n  }\n})(eventemitter3);\nvar eventemitter3Exports = eventemitter3.exports;\nvar EventEmitter = /* @__PURE__ */ getDefaultExportFromCjs(eventemitter3Exports);\nclass TransmuxerInterface {\n  constructor(hls, id, onTransmuxComplete, onFlush) {\n    this.error = null;\n    this.hls = void 0;\n    this.id = void 0;\n    this.observer = void 0;\n    this.frag = null;\n    this.part = null;\n    this.useWorker = void 0;\n    this.workerContext = null;\n    this.onwmsg = void 0;\n    this.transmuxer = null;\n    this.onTransmuxComplete = void 0;\n    this.onFlush = void 0;\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    const forwardMessage = (ev, data) => {\n      data = data || {};\n      data.frag = this.frag;\n      data.id = this.id;\n      if (ev === Events.ERROR) {\n        this.error = data.error;\n      }\n      this.hls.trigger(ev, data);\n    };\n    this.observer = new EventEmitter();\n    this.observer.on(Events.FRAG_DECRYPTED, forwardMessage);\n    this.observer.on(Events.ERROR, forwardMessage);\n    const MediaSource = getMediaSource(config.preferManagedMediaSource) || {\n      isTypeSupported: () => false\n    };\n    const m2tsTypeSupported = {\n      mpeg: MediaSource.isTypeSupported(\"audio/mpeg\"),\n      mp3: MediaSource.isTypeSupported('audio/mp4; codecs=\"mp3\"'),\n      ac3: MediaSource.isTypeSupported('audio/mp4; codecs=\"ac-3\"')\n    };\n    const vendor = navigator.vendor;\n    if (this.useWorker && typeof Worker !== \"undefined\") {\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          this.onwmsg = (ev) => this.onWorkerMessage(ev);\n          const {\n            worker\n          } = this.workerContext;\n          worker.addEventListener(\"message\", this.onwmsg);\n          worker.onerror = (event) => {\n            const error = new Error(`${event.message}  (${event.filename}:${event.lineno})`);\n            config.enableWorker = false;\n            logger.warn(`Error in \"${id}\" Web Worker, fallback to inline`);\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          worker.postMessage({\n            cmd: \"init\",\n            typeSupported: m2tsTypeSupported,\n            vendor,\n            id,\n            config: JSON.stringify(config)\n          });\n        } catch (err) {\n          logger.warn(`Error setting up \"${id}\" Web Worker, fallback to inline`, err);\n          this.resetWorker();\n          this.error = null;\n          this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, vendor, id);\n        }\n        return;\n      }\n    }\n    this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, vendor, id);\n  }\n  resetWorker() {\n    if (this.workerContext) {\n      const {\n        worker,\n        objectURL\n      } = this.workerContext;\n      if (objectURL) {\n        self.URL.revokeObjectURL(objectURL);\n      }\n      worker.removeEventListener(\"message\", this.onwmsg);\n      worker.onerror = null;\n      worker.terminate();\n      this.workerContext = null;\n    }\n  }\n  destroy() {\n    if (this.workerContext) {\n      this.resetWorker();\n      this.onwmsg = void 0;\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.observer = null;\n    this.hls = null;\n  }\n  push(data, initSegmentData, audioCodec, videoCodec, frag, part, duration, accurateTimeOffset, chunkMeta, defaultInitPTS) {\n    var _frag$initSegment, _lastFrag$initSegment;\n    chunkMeta.transmuxing.start = self.performance.now();\n    const {\n      transmuxer\n    } = this;\n    const timeOffset = part ? part.start : frag.start;\n    const decryptdata = frag.decryptdata;\n    const lastFrag = this.frag;\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 = snDiff === 0 && chunkMeta.id > 1 && chunkMeta.id === (lastFrag == null ? void 0 : lastFrag.stats.chunkCount);\n    const contiguous = !trackSwitch && (snDiff === 1 || snDiff === 0 && (partDiff === 1 || progressive && partDiff <= 0));\n    const now2 = self.performance.now();\n    if (trackSwitch || snDiff || frag.stats.parsing.start === 0) {\n      frag.stats.parsing.start = now2;\n    }\n    if (part && (partDiff || !contiguous)) {\n      part.stats.parsing.start = now2;\n    }\n    const initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));\n    const state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);\n    if (!contiguous || discontinuity || initSegmentChange) {\n      logger.log(`[transmuxer-interface, ${frag.type}]: Starting new transmux session for sn: ${chunkMeta.sn} p: ${chunkMeta.part} level: ${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(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);\n      this.configureTransmuxer(config);\n    }\n    this.frag = frag;\n    this.part = part;\n    if (this.workerContext) {\n      this.workerContext.worker.postMessage({\n        cmd: \"demux\",\n        data,\n        decryptdata,\n        chunkMeta,\n        state\n      }, data instanceof ArrayBuffer ? [data] : []);\n    } else if (transmuxer) {\n      const transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state);\n      if (isPromise(transmuxResult)) {\n        transmuxer.async = true;\n        transmuxResult.then((data2) => {\n          this.handleTransmuxComplete(data2);\n        }).catch((error) => {\n          this.transmuxerError(error, chunkMeta, \"transmuxer-interface push error\");\n        });\n      } else {\n        transmuxer.async = false;\n        this.handleTransmuxComplete(transmuxResult);\n      }\n    }\n  }\n  flush(chunkMeta) {\n    chunkMeta.transmuxing.start = self.performance.now();\n    const {\n      transmuxer\n    } = this;\n    if (this.workerContext) {\n      this.workerContext.worker.postMessage({\n        cmd: \"flush\",\n        chunkMeta\n      });\n    } else if (transmuxer) {\n      let transmuxResult = transmuxer.flush(chunkMeta);\n      const asyncFlush = isPromise(transmuxResult);\n      if (asyncFlush || transmuxer.async) {\n        if (!isPromise(transmuxResult)) {\n          transmuxResult = Promise.resolve(transmuxResult);\n        }\n        transmuxResult.then((data) => {\n          this.handleFlushResult(data, chunkMeta);\n        }).catch((error) => {\n          this.transmuxerError(error, chunkMeta, \"transmuxer-interface flush error\");\n        });\n      } else {\n        this.handleFlushResult(transmuxResult, chunkMeta);\n      }\n    }\n  }\n  transmuxerError(error, chunkMeta, reason) {\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      fatal: false,\n      error,\n      err: error,\n      reason\n    });\n  }\n  handleFlushResult(results, chunkMeta) {\n    results.forEach((result) => {\n      this.handleTransmuxComplete(result);\n    });\n    this.onFlush(chunkMeta);\n  }\n  onWorkerMessage(ev) {\n    const data = ev.data;\n    const hls = this.hls;\n    switch (data.event) {\n      case \"init\": {\n        var _this$workerContext;\n        const objectURL = (_this$workerContext = this.workerContext) == null ? void 0 : _this$workerContext.objectURL;\n        if (objectURL) {\n          self.URL.revokeObjectURL(objectURL);\n        }\n        break;\n      }\n      case \"transmuxComplete\": {\n        this.handleTransmuxComplete(data.data);\n        break;\n      }\n      case \"flush\": {\n        this.onFlush(data.data);\n        break;\n      }\n      case \"workerLog\":\n        if (logger[data.data.logType]) {\n          logger[data.data.logType](data.data.message);\n        }\n        break;\n      default: {\n        data.data = data.data || {};\n        data.data.frag = this.frag;\n        data.data.id = this.id;\n        hls.trigger(data.event, data.data);\n        break;\n      }\n    }\n  }\n  configureTransmuxer(config) {\n    const {\n      transmuxer\n    } = this;\n    if (this.workerContext) {\n      this.workerContext.worker.postMessage({\n        cmd: \"configure\",\n        config\n      });\n    } else if (transmuxer) {\n      transmuxer.configure(config);\n    }\n  }\n  handleTransmuxComplete(result) {\n    result.chunkMeta.transmuxing.end = self.performance.now();\n    this.onTransmuxComplete(result);\n  }\n}\nfunction subtitleOptionsIdentical(trackList1, trackList2) {\n  if (trackList1.length !== trackList2.length) {\n    return false;\n  }\n  for (let i = 0; i < trackList1.length; i++) {\n    if (!mediaAttributesIdentical(trackList1[i].attrs, trackList2[i].attrs)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction mediaAttributesIdentical(attrs1, attrs2, customAttributes) {\n  const stableRenditionId = attrs1[\"STABLE-RENDITION-ID\"];\n  if (stableRenditionId && !customAttributes) {\n    return stableRenditionId === attrs2[\"STABLE-RENDITION-ID\"];\n  }\n  return !(customAttributes || [\"LANGUAGE\", \"NAME\", \"CHARACTERISTICS\", \"AUTOSELECT\", \"DEFAULT\", \"FORCED\", \"ASSOC-LANGUAGE\"]).some((subtitleAttribute) => attrs1[subtitleAttribute] !== attrs2[subtitleAttribute]);\n}\nfunction subtitleTrackMatchesTextTrack(subtitleTrack, textTrack) {\n  return textTrack.label.toLowerCase() === subtitleTrack.name.toLowerCase() && (!textTrack.language || textTrack.language.toLowerCase() === (subtitleTrack.lang || \"\").toLowerCase());\n}\nconst TICK_INTERVAL$2 = 100;\nclass AudioStreamController extends BaseStreamController {\n  constructor(hls, fragmentTracker, keyLoader) {\n    super(hls, fragmentTracker, keyLoader, \"[audio-stream-controller]\", PlaylistLevelType.AUDIO);\n    this.videoBuffer = null;\n    this.videoTrackCC = -1;\n    this.waitingVideoCC = -1;\n    this.bufferedTrack = null;\n    this.switchingTrack = null;\n    this.trackId = -1;\n    this.waitingData = null;\n    this.mainDetails = null;\n    this.flushing = false;\n    this.bufferFlushed = false;\n    this.cachedTrackLoadedData = null;\n    this._registerListeners();\n  }\n  onHandlerDestroying() {\n    this._unregisterListeners();\n    super.onHandlerDestroying();\n    this.mainDetails = null;\n    this.bufferedTrack = null;\n    this.switchingTrack = null;\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = 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_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.ERROR, this.onError, 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_BUFFERED, this.onFragBuffered, this);\n  }\n  _unregisterListeners() {\n    const {\n      hls\n    } = 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_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.ERROR, this.onError, 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_BUFFERED, this.onFragBuffered, this);\n  }\n  // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value\n  onInitPtsFound(event, {\n    frag,\n    id,\n    initPTS,\n    timescale\n  }) {\n    if (id === \"main\") {\n      const cc = frag.cc;\n      this.initPTS[frag.cc] = {\n        baseTime: initPTS,\n        timescale\n      };\n      this.log(`InitPTS for cc: ${cc} found from main: ${initPTS}`);\n      this.videoTrackCC = cc;\n      if (this.state === State.WAITING_INIT_PTS) {\n        this.tick();\n      }\n    }\n  }\n  startLoad(startPosition) {\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$2);\n    if (lastCurrentTime > 0 && startPosition === -1) {\n      this.log(`Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(3)}`);\n      startPosition = lastCurrentTime;\n      this.state = State.IDLE;\n    } else {\n      this.loadedmetadata = false;\n      this.state = State.WAITING_TRACK;\n    }\n    this.nextLoadPosition = this.startPosition = this.lastCurrentTime = startPosition;\n    this.tick();\n  }\n  doTick() {\n    switch (this.state) {\n      case State.IDLE:\n        this.doTickIdle();\n        break;\n      case State.WAITING_TRACK: {\n        var _levels$trackId;\n        const {\n          levels,\n          trackId\n        } = this;\n        const details = levels == null ? void 0 : (_levels$trackId = levels[trackId]) == null ? void 0 : _levels$trackId.details;\n        if (details) {\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        var _this$media;\n        const now2 = performance.now();\n        const retryDate = this.retryDate;\n        if (!retryDate || now2 >= retryDate || (_this$media = this.media) != null && _this$media.seeking) {\n          const {\n            levels,\n            trackId\n          } = this;\n          this.log(\"RetryDate reached, switch back to IDLE state\");\n          this.resetStartWhenNotLoaded((levels == null ? void 0 : levels[trackId]) || null);\n          this.state = State.IDLE;\n        }\n        break;\n      }\n      case State.WAITING_INIT_PTS: {\n        const waitingData = this.waitingData;\n        if (waitingData) {\n          const {\n            frag,\n            part,\n            cache,\n            complete\n          } = waitingData;\n          if (this.initPTS[frag.cc] !== void 0) {\n            this.waitingData = null;\n            this.waitingVideoCC = -1;\n            this.state = State.FRAG_LOADING;\n            const payload = cache.flush();\n            const data = {\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 (this.videoTrackCC !== this.waitingVideoCC) {\n            this.log(`Waiting fragment cc (${frag.cc}) cancelled because video is at cc ${this.videoTrackCC}`);\n            this.clearWaitingFragment();\n          } else {\n            const pos = this.getLoadPosition();\n            const bufferInfo = BufferHelper.bufferInfo(this.mediaBuffer, pos, this.config.maxBufferHole);\n            const waitingFragmentAtPosition = fragmentWithinToleranceTest(bufferInfo.end, this.config.maxFragLookUpTolerance, frag);\n            if (waitingFragmentAtPosition < 0) {\n              this.log(`Waiting fragment cc (${frag.cc}) @ ${frag.start} cancelled because another fragment at ${bufferInfo.end} is needed`);\n              this.clearWaitingFragment();\n            }\n          }\n        } else {\n          this.state = State.IDLE;\n        }\n      }\n    }\n    this.onTickEnd();\n  }\n  clearWaitingFragment() {\n    const waitingData = this.waitingData;\n    if (waitingData) {\n      this.fragmentTracker.removeFragment(waitingData.frag);\n      this.waitingData = null;\n      this.waitingVideoCC = -1;\n      this.state = State.IDLE;\n    }\n  }\n  resetLoadingState() {\n    this.clearWaitingFragment();\n    super.resetLoadingState();\n  }\n  onTickEnd() {\n    const {\n      media\n    } = this;\n    if (!(media != null && media.readyState)) {\n      return;\n    }\n    this.lastCurrentTime = media.currentTime;\n  }\n  doTickIdle() {\n    const {\n      hls,\n      levels,\n      media,\n      trackId\n    } = this;\n    const config = hls.config;\n    if (!media && (this.startFragRequested || !config.startFragPrefetch) || !(levels != null && levels[trackId])) {\n      return;\n    }\n    const levelInfo = levels[trackId];\n    const trackDetails = levelInfo.details;\n    if (!trackDetails || trackDetails.live && this.levelLastLoaded !== levelInfo || this.waitForCdnTuneIn(trackDetails)) {\n      this.state = State.WAITING_TRACK;\n      return;\n    }\n    const bufferable = this.mediaBuffer ? this.mediaBuffer : this.media;\n    if (this.bufferFlushed && bufferable) {\n      this.bufferFlushed = false;\n      this.afterBufferFlushed(bufferable, ElementaryStreamTypes.AUDIO, PlaylistLevelType.AUDIO);\n    }\n    const bufferInfo = this.getFwdBufferInfo(bufferable, PlaylistLevelType.AUDIO);\n    if (bufferInfo === null) {\n      return;\n    }\n    const {\n      bufferedTrack,\n      switchingTrack\n    } = this;\n    if (!switchingTrack && this._streamEnded(bufferInfo, trackDetails)) {\n      hls.trigger(Events.BUFFER_EOS, {\n        type: \"audio\"\n      });\n      this.state = State.ENDED;\n      return;\n    }\n    const mainBufferInfo = this.getFwdBufferInfo(this.videoBuffer ? this.videoBuffer : this.media, PlaylistLevelType.MAIN);\n    const bufferLen = bufferInfo.len;\n    const maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len);\n    const fragments = trackDetails.fragments;\n    const start = fragments[0].start;\n    let targetBufferTime = this.flushing ? this.getLoadPosition() : bufferInfo.end;\n    if (switchingTrack && media) {\n      const pos = this.getLoadPosition();\n      if (bufferedTrack && !mediaAttributesIdentical(switchingTrack.attrs, bufferedTrack.attrs)) {\n        targetBufferTime = pos;\n      }\n      if (trackDetails.PTSKnown && pos < start) {\n        if (bufferInfo.end > start || bufferInfo.nextStart) {\n          this.log(\"Alt audio track ahead of main track, seek to start of alt audio track\");\n          media.currentTime = start + 0.05;\n        }\n      }\n    }\n    if (bufferLen >= maxBufLen && !switchingTrack && targetBufferTime < fragments[fragments.length - 1].start) {\n      return;\n    }\n    let frag = this.getNextFragment(targetBufferTime, trackDetails);\n    let atGap = false;\n    if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n      atGap = !!frag.gap;\n      frag = this.getNextFragmentLoopLoading(frag, trackDetails, bufferInfo, PlaylistLevelType.MAIN, maxBufLen);\n    }\n    if (!frag) {\n      this.bufferFlushed = true;\n      return;\n    }\n    const atBufferSyncLimit = mainBufferInfo && frag.start > mainBufferInfo.end + trackDetails.targetduration;\n    if (atBufferSyncLimit || // Or wait for main buffer after buffing some audio\n    !(mainBufferInfo != null && mainBufferInfo.len) && bufferInfo.len) {\n      const mainFrag = this.getAppendedFrag(frag.start, PlaylistLevelType.MAIN);\n      if (mainFrag === null) {\n        return;\n      }\n      atGap || (atGap = !!mainFrag.gap || !!atBufferSyncLimit && mainBufferInfo.len === 0);\n      if (atBufferSyncLimit && !atGap || atGap && bufferInfo.nextStart && bufferInfo.nextStart < mainFrag.end) {\n        return;\n      }\n    }\n    this.loadFragment(frag, levelInfo, targetBufferTime);\n  }\n  getMaxBufferLength(mainBufferLength) {\n    const maxConfigBuffer = super.getMaxBufferLength();\n    if (!mainBufferLength) {\n      return maxConfigBuffer;\n    }\n    return Math.min(Math.max(maxConfigBuffer, mainBufferLength), this.config.maxMaxBufferLength);\n  }\n  onMediaDetaching() {\n    this.videoBuffer = null;\n    this.bufferFlushed = this.flushing = false;\n    super.onMediaDetaching();\n  }\n  onAudioTracksUpdated(event, {\n    audioTracks\n  }) {\n    this.resetTransmuxer();\n    this.levels = audioTracks.map((mediaPlaylist) => new Level(mediaPlaylist));\n  }\n  onAudioTrackSwitching(event, data) {\n    const altAudio = !!data.url;\n    this.trackId = data.id;\n    const {\n      fragCurrent\n    } = this;\n    if (fragCurrent) {\n      fragCurrent.abortRequests();\n      this.removeUnbufferedFrags(fragCurrent.start);\n    }\n    this.resetLoadingState();\n    if (!altAudio) {\n      this.resetTransmuxer();\n    } else {\n      this.setInterval(TICK_INTERVAL$2);\n    }\n    if (altAudio) {\n      this.switchingTrack = data;\n      this.state = State.IDLE;\n      this.flushAudioIfNeeded(data);\n    } else {\n      this.switchingTrack = null;\n      this.bufferedTrack = data;\n      this.state = State.STOPPED;\n    }\n    this.tick();\n  }\n  onManifestLoading() {\n    this.fragmentTracker.removeAllFragments();\n    this.startPosition = this.lastCurrentTime = 0;\n    this.bufferFlushed = this.flushing = false;\n    this.levels = this.mainDetails = this.waitingData = this.bufferedTrack = this.cachedTrackLoadedData = this.switchingTrack = null;\n    this.startFragRequested = false;\n    this.trackId = this.videoTrackCC = this.waitingVideoCC = -1;\n  }\n  onLevelLoaded(event, data) {\n    this.mainDetails = data.details;\n    if (this.cachedTrackLoadedData !== null) {\n      this.hls.trigger(Events.AUDIO_TRACK_LOADED, this.cachedTrackLoadedData);\n      this.cachedTrackLoadedData = null;\n    }\n  }\n  onAudioTrackLoaded(event, data) {\n    var _track$details;\n    if (this.mainDetails == null) {\n      this.cachedTrackLoadedData = data;\n      return;\n    }\n    const {\n      levels\n    } = this;\n    const {\n      details: newDetails,\n      id: trackId\n    } = data;\n    if (!levels) {\n      this.warn(`Audio tracks were reset while loading level ${trackId}`);\n      return;\n    }\n    this.log(`Audio track ${trackId} loaded [${newDetails.startSN},${newDetails.endSN}]${newDetails.lastPartSn ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]` : \"\"},duration:${newDetails.totalduration}`);\n    const track = levels[trackId];\n    let sliding = 0;\n    if (newDetails.live || (_track$details = track.details) != null && _track$details.live) {\n      this.checkLiveUpdate(newDetails);\n      const mainDetails = this.mainDetails;\n      if (newDetails.deltaUpdateFailed || !mainDetails) {\n        return;\n      }\n      if (!track.details && newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {\n        alignMediaPlaylistByPDT(newDetails, mainDetails);\n        sliding = newDetails.fragments[0].start;\n      } else {\n        var _this$levelLastLoaded;\n        sliding = this.alignPlaylists(newDetails, track.details, (_this$levelLastLoaded = this.levelLastLoaded) == null ? void 0 : _this$levelLastLoaded.details);\n      }\n    }\n    track.details = newDetails;\n    this.levelLastLoaded = track;\n    if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {\n      this.setStartPosition(this.mainDetails || newDetails, sliding);\n    }\n    if (this.state === State.WAITING_TRACK && !this.waitForCdnTuneIn(newDetails)) {\n      this.state = State.IDLE;\n    }\n    this.tick();\n  }\n  _handleFragmentLoadProgress(data) {\n    var _frag$initSegment;\n    const {\n      frag,\n      part,\n      payload\n    } = data;\n    const {\n      config,\n      trackId,\n      levels\n    } = this;\n    if (!levels) {\n      this.warn(`Audio tracks were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`);\n      return;\n    }\n    const track = levels[trackId];\n    if (!track) {\n      this.warn(\"Audio track is undefined on fragment load progress\");\n      return;\n    }\n    const details = track.details;\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 = config.defaultAudioCodec || track.audioCodec || \"mp4a.40.2\";\n    let transmuxer = this.transmuxer;\n    if (!transmuxer) {\n      transmuxer = this.transmuxer = new TransmuxerInterface(this.hls, PlaylistLevelType.AUDIO, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this));\n    }\n    const initPTS = this.initPTS[frag.cc];\n    const initSegmentData = (_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.data;\n    if (initPTS !== void 0) {\n      const accurateTimeOffset = false;\n      const partIndex = part ? part.index : -1;\n      const partial = partIndex !== -1;\n      const chunkMeta = new ChunkMetadata(frag.level, frag.sn, frag.stats.chunkCount, payload.byteLength, partIndex, partial);\n      transmuxer.push(payload, initSegmentData, audioCodec, \"\", frag, part, details.totalduration, accurateTimeOffset, chunkMeta, initPTS);\n    } else {\n      this.log(`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      const {\n        cache\n      } = this.waitingData = this.waitingData || {\n        frag,\n        part,\n        cache: new ChunkCache(),\n        complete: false\n      };\n      cache.push(new Uint8Array(payload));\n      this.waitingVideoCC = this.videoTrackCC;\n      this.state = State.WAITING_INIT_PTS;\n    }\n  }\n  _handleFragmentLoadComplete(fragLoadedData) {\n    if (this.waitingData) {\n      this.waitingData.complete = true;\n      return;\n    }\n    super._handleFragmentLoadComplete(fragLoadedData);\n  }\n  onBufferReset() {\n    this.mediaBuffer = this.videoBuffer = null;\n    this.loadedmetadata = false;\n  }\n  onBufferCreated(event, data) {\n    const audioTrack = data.tracks.audio;\n    if (audioTrack) {\n      this.mediaBuffer = audioTrack.buffer || null;\n    }\n    if (data.tracks.video) {\n      this.videoBuffer = data.tracks.video.buffer || null;\n    }\n  }\n  onFragBuffered(event, data) {\n    const {\n      frag,\n      part\n    } = data;\n    if (frag.type !== PlaylistLevelType.AUDIO) {\n      if (!this.loadedmetadata && frag.type === PlaylistLevelType.MAIN) {\n        const bufferable = this.videoBuffer || this.media;\n        if (bufferable) {\n          const bufferedTimeRanges = BufferHelper.getBuffered(bufferable);\n          if (bufferedTimeRanges.length) {\n            this.loadedmetadata = true;\n          }\n        }\n      }\n      return;\n    }\n    if (this.fragContextChanged(frag)) {\n      this.warn(`Fragment ${frag.sn}${part ? \" p: \" + part.index : \"\"} of level ${frag.level} finished buffering, but was aborted. state: ${this.state}, audioSwitch: ${this.switchingTrack ? this.switchingTrack.name : \"false\"}`);\n      return;\n    }\n    if (frag.sn !== \"initSegment\") {\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, _objectSpread2({}, track));\n      }\n    }\n    this.fragBufferedComplete(frag, part);\n  }\n  onError(event, data) {\n    var _data$context;\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        if (!data.levelRetry && this.state === State.WAITING_TRACK && ((_data$context = data.context) == null ? void 0 : _data$context.type) === PlaylistContextType.AUDIO_TRACK) {\n          this.state = State.IDLE;\n        }\n        break;\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n      case ErrorDetails.BUFFER_FULL_ERROR:\n        if (!data.parent || data.parent !== \"audio\") {\n          return;\n        }\n        if (data.details === ErrorDetails.BUFFER_APPEND_ERROR) {\n          this.resetLoadingState();\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    }\n  }\n  onBufferFlushing(event, {\n    type\n  }) {\n    if (type !== ElementaryStreamTypes.VIDEO) {\n      this.flushing = true;\n    }\n  }\n  onBufferFlushed(event, {\n    type\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  _handleTransmuxComplete(transmuxResult) {\n    var _id3$samples;\n    const id = \"audio\";\n    const {\n      hls\n    } = this;\n    const {\n      remuxResult,\n      chunkMeta\n    } = transmuxResult;\n    const context = this.getCurrentContext(chunkMeta);\n    if (!context) {\n      this.resetWhenMissingContext(chunkMeta);\n      return;\n    }\n    const {\n      frag,\n      part,\n      level\n    } = context;\n    const {\n      details\n    } = level;\n    const {\n      audio,\n      text,\n      id3,\n      initSegment\n    } = remuxResult;\n    if (this.fragContextChanged(frag) || !details) {\n      this.fragmentTracker.removeFragment(frag);\n      return;\n    }\n    this.state = State.PARSING;\n    if (this.switchingTrack && audio) {\n      this.completeAudioSwitch(this.switchingTrack);\n    }\n    if (initSegment != null && initSegment.tracks) {\n      const mapFragment = frag.initSegment || frag;\n      this._bufferInitSegment(level, initSegment.tracks, mapFragment, chunkMeta);\n      hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n        frag: mapFragment,\n        id,\n        tracks: initSegment.tracks\n      });\n    }\n    if (audio) {\n      const {\n        startPTS,\n        endPTS,\n        startDTS,\n        endDTS\n      } = audio;\n      if (part) {\n        part.elementaryStreams[ElementaryStreamTypes.AUDIO] = {\n          startPTS,\n          endPTS,\n          startDTS,\n          endDTS\n        };\n      }\n      frag.setElementaryStreamInfo(ElementaryStreamTypes.AUDIO, startPTS, endPTS, startDTS, endDTS);\n      this.bufferFragmentData(audio, frag, part, chunkMeta);\n    }\n    if (id3 != null && (_id3$samples = id3.samples) != null && _id3$samples.length) {\n      const emittedID3 = _extends({\n        id,\n        frag,\n        details\n      }, id3);\n      hls.trigger(Events.FRAG_PARSING_METADATA, emittedID3);\n    }\n    if (text) {\n      const emittedText = _extends({\n        id,\n        frag,\n        details\n      }, text);\n      hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText);\n    }\n  }\n  _bufferInitSegment(currentLevel, tracks, frag, chunkMeta) {\n    if (this.state !== State.PARSING) {\n      return;\n    }\n    if (tracks.video) {\n      delete tracks.video;\n    }\n    const track = tracks.audio;\n    if (!track) {\n      return;\n    }\n    track.id = \"audio\";\n    const variantAudioCodecs = currentLevel.audioCodec;\n    this.log(`Init audio buffer, container:${track.container}, codecs[level/parsed]=[${variantAudioCodecs}/${track.codec}]`);\n    if (variantAudioCodecs && variantAudioCodecs.split(\",\").length === 1) {\n      track.levelCodec = variantAudioCodecs;\n    }\n    this.hls.trigger(Events.BUFFER_CODECS, tracks);\n    const initSegment = track.initSegment;\n    if (initSegment != null && initSegment.byteLength) {\n      const segment = {\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    this.tickImmediate();\n  }\n  loadFragment(frag, track, targetBufferTime) {\n    const fragState = this.fragmentTracker.getState(frag);\n    this.fragCurrent = frag;\n    if (this.switchingTrack || fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {\n      var _track$details2;\n      if (frag.sn === \"initSegment\") {\n        this._loadInitSegment(frag, track);\n      } else if ((_track$details2 = track.details) != null && _track$details2.live && !this.initPTS[frag.cc]) {\n        this.log(`Waiting for video PTS in continuity counter ${frag.cc} of live stream before loading audio fragment ${frag.sn} of level ${this.trackId}`);\n        this.state = State.WAITING_INIT_PTS;\n        const mainDetails = this.mainDetails;\n        if (mainDetails && mainDetails.fragments[0].start !== track.details.fragments[0].start) {\n          alignMediaPlaylistByPDT(track.details, mainDetails);\n        }\n      } else {\n        this.startFragRequested = true;\n        super.loadFragment(frag, track, targetBufferTime);\n      }\n    } else {\n      this.clearTrackerIfNeeded(frag);\n    }\n  }\n  flushAudioIfNeeded(switchingTrack) {\n    const {\n      media,\n      bufferedTrack\n    } = this;\n    const bufferedAttributes = bufferedTrack == null ? void 0 : bufferedTrack.attrs;\n    const switchAttributes = switchingTrack.attrs;\n    if (media && bufferedAttributes && (bufferedAttributes.CHANNELS !== switchAttributes.CHANNELS || bufferedTrack.name !== switchingTrack.name || bufferedTrack.lang !== switchingTrack.lang)) {\n      this.log(\"Switching audio track : flushing all audio\");\n      super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\");\n      this.bufferedTrack = null;\n    }\n  }\n  completeAudioSwitch(switchingTrack) {\n    const {\n      hls\n    } = this;\n    this.flushAudioIfNeeded(switchingTrack);\n    this.bufferedTrack = switchingTrack;\n    this.switchingTrack = null;\n    hls.trigger(Events.AUDIO_TRACK_SWITCHED, _objectSpread2({}, switchingTrack));\n  }\n}\nclass AudioTrackController extends BasePlaylistController {\n  constructor(hls) {\n    super(hls, \"[audio-track-controller]\");\n    this.tracks = [];\n    this.groupIds = null;\n    this.tracksInGroup = [];\n    this.trackId = -1;\n    this.currentTrack = null;\n    this.selectDefaultTrack = true;\n    this.registerListeners();\n  }\n  registerListeners() {\n    const {\n      hls\n    } = 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  unregisterListeners() {\n    const {\n      hls\n    } = 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  destroy() {\n    this.unregisterListeners();\n    this.tracks.length = 0;\n    this.tracksInGroup.length = 0;\n    this.currentTrack = null;\n    super.destroy();\n  }\n  onManifestLoading() {\n    this.tracks = [];\n    this.tracksInGroup = [];\n    this.groupIds = null;\n    this.currentTrack = null;\n    this.trackId = -1;\n    this.selectDefaultTrack = true;\n  }\n  onManifestParsed(event, data) {\n    this.tracks = data.audioTracks || [];\n  }\n  onAudioTrackLoaded(event, data) {\n    const {\n      id,\n      groupId,\n      details\n    } = data;\n    const trackInActiveGroup = this.tracksInGroup[id];\n    if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) {\n      this.warn(`Audio track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup == null ? void 0 : trackInActiveGroup.groupId}`);\n      return;\n    }\n    const curDetails = trackInActiveGroup.details;\n    trackInActiveGroup.details = data.details;\n    this.log(`Audio track ${id} \"${trackInActiveGroup.name}\" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`);\n    if (id === this.trackId) {\n      this.playlistLoaded(id, data, curDetails);\n    }\n  }\n  onLevelLoading(event, data) {\n    this.switchLevel(data.level);\n  }\n  onLevelSwitching(event, data) {\n    this.switchLevel(data.level);\n  }\n  switchLevel(levelIndex) {\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 (!audioGroups || (currentGroups == null ? void 0 : currentGroups.length) !== (audioGroups == null ? void 0 : audioGroups.length) || audioGroups != null && audioGroups.some((groupId) => (currentGroups == null ? void 0 : currentGroups.indexOf(groupId)) === -1)) {\n      this.groupIds = audioGroups;\n      this.trackId = -1;\n      this.currentTrack = null;\n      const audioTracks = this.tracks.filter((track) => !audioGroups || audioGroups.indexOf(track.groupId) !== -1);\n      if (audioTracks.length) {\n        if (this.selectDefaultTrack && !audioTracks.some((track) => track.default)) {\n          this.selectDefaultTrack = false;\n        }\n        audioTracks.forEach((track, i) => {\n          track.id = i;\n        });\n      } else if (!currentTrack && !this.tracksInGroup.length) {\n        return;\n      }\n      this.tracksInGroup = audioTracks;\n      const audioPreference = this.hls.config.audioPreference;\n      if (!currentTrack && audioPreference) {\n        const groupIndex = findMatchingOption(audioPreference, audioTracks, audioMatchPredicate);\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      let trackId = this.findTrackId(currentTrack);\n      if (trackId === -1 && currentTrack) {\n        trackId = this.findTrackId(null);\n      }\n      const audioTracksUpdated = {\n        audioTracks\n      };\n      this.log(`Updating audio tracks, ${audioTracks.length} track(s) found in group(s): ${audioGroups == null ? void 0 : audioGroups.join(\",\")}`);\n      this.hls.trigger(Events.AUDIO_TRACKS_UPDATED, audioTracksUpdated);\n      const selectedTrackId = this.trackId;\n      if (trackId !== -1 && selectedTrackId === -1) {\n        this.setAudioTrack(trackId);\n      } else if (audioTracks.length && selectedTrackId === -1) {\n        var _this$groupIds;\n        const error = new Error(`No audio track selected for current audio group-ID(s): ${(_this$groupIds = this.groupIds) == null ? void 0 : _this$groupIds.join(\",\")} track count: ${audioTracks.length}`);\n        this.warn(error.message);\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    } else if (this.shouldReloadPlaylist(currentTrack)) {\n      this.setAudioTrack(this.trackId);\n    }\n  }\n  onError(event, data) {\n    if (data.fatal || !data.context) {\n      return;\n    }\n    if (data.context.type === PlaylistContextType.AUDIO_TRACK && data.context.id === this.trackId && (!this.groupIds || this.groupIds.indexOf(data.context.groupId) !== -1)) {\n      this.requestScheduled = -1;\n      this.checkRetry(data);\n    }\n  }\n  get allAudioTracks() {\n    return this.tracks;\n  }\n  get audioTracks() {\n    return this.tracksInGroup;\n  }\n  get audioTrack() {\n    return this.trackId;\n  }\n  set audioTrack(newId) {\n    this.selectDefaultTrack = false;\n    this.setAudioTrack(newId);\n  }\n  setAudioOption(audioOption) {\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        const currentTrack = this.currentTrack;\n        if (currentTrack && matchesOption(audioOption, currentTrack, audioMatchPredicate)) {\n          return currentTrack;\n        }\n        const groupIndex = findMatchingOption(audioOption, this.tracksInGroup, audioMatchPredicate);\n        if (groupIndex > -1) {\n          const track = this.tracksInGroup[groupIndex];\n          this.setAudioTrack(groupIndex);\n          return track;\n        } else if (currentTrack) {\n          let searchIndex = hls.loadLevel;\n          if (searchIndex === -1) {\n            searchIndex = hls.firstAutoLevel;\n          }\n          const switchIndex = findClosestLevelWithAudioGroup(audioOption, hls.levels, allAudioTracks, searchIndex, audioMatchPredicate);\n          if (switchIndex === -1) {\n            return null;\n          }\n          hls.nextLoadLevel = switchIndex;\n        }\n        if (audioOption.channels || audioOption.audioCodec) {\n          const withoutCodecAndChannelsMatch = findMatchingOption(audioOption, allAudioTracks);\n          if (withoutCodecAndChannelsMatch > -1) {\n            return allAudioTracks[withoutCodecAndChannelsMatch];\n          }\n        }\n      }\n    }\n    return null;\n  }\n  setAudioTrack(newId) {\n    const tracks = this.tracksInGroup;\n    if (newId < 0 || newId >= tracks.length) {\n      this.warn(`Invalid audio track id: ${newId}`);\n      return;\n    }\n    this.clearTimer();\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(`Switching to audio-track ${newId} \"${track.name}\" lang:${track.lang} group:${track.groupId} channels:${track.channels}`);\n    this.trackId = newId;\n    this.currentTrack = track;\n    this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, _objectSpread2({}, track));\n    if (trackLoaded) {\n      return;\n    }\n    const hlsUrlParameters = this.switchParams(track.url, lastTrack == null ? void 0 : lastTrack.details);\n    this.loadPlaylist(hlsUrlParameters);\n  }\n  findTrackId(currentTrack) {\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 (!currentTrack || matchesOption(currentTrack, track, audioMatchPredicate)) {\n        return i;\n      }\n    }\n    if (currentTrack) {\n      const {\n        name,\n        lang,\n        assocLang,\n        characteristics,\n        audioCodec,\n        channels\n      } = currentTrack;\n      for (let i = 0; i < audioTracks.length; i++) {\n        const track = audioTracks[i];\n        if (matchesOption({\n          name,\n          lang,\n          assocLang,\n          characteristics,\n          audioCodec,\n          channels\n        }, track, audioMatchPredicate)) {\n          return i;\n        }\n      }\n      for (let i = 0; i < audioTracks.length; i++) {\n        const track = audioTracks[i];\n        if (mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\"LANGUAGE\", \"ASSOC-LANGUAGE\", \"CHARACTERISTICS\"])) {\n          return i;\n        }\n      }\n      for (let i = 0; i < audioTracks.length; i++) {\n        const track = audioTracks[i];\n        if (mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\"LANGUAGE\"])) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n  loadPlaylist(hlsUrlParameters) {\n    const audioTrack = this.currentTrack;\n    if (this.shouldLoadPlaylist(audioTrack) && audioTrack) {\n      super.loadPlaylist();\n      const id = audioTrack.id;\n      const groupId = audioTrack.groupId;\n      let url = audioTrack.url;\n      if (hlsUrlParameters) {\n        try {\n          url = hlsUrlParameters.addDirectives(url);\n        } catch (error) {\n          this.warn(`Could not construct new URL with HLS Delivery Directives: ${error}`);\n        }\n      }\n      this.log(`loading audio-track playlist ${id} \"${audioTrack.name}\" lang:${audioTrack.lang} group:${groupId}`);\n      this.clearTimer();\n      this.hls.trigger(Events.AUDIO_TRACK_LOADING, {\n        url,\n        id,\n        groupId,\n        deliveryDirectives: hlsUrlParameters || null\n      });\n    }\n  }\n}\nconst TICK_INTERVAL$1 = 500;\nclass SubtitleStreamController extends BaseStreamController {\n  constructor(hls, fragmentTracker, keyLoader) {\n    super(hls, fragmentTracker, keyLoader, \"[subtitle-stream-controller]\", PlaylistLevelType.SUBTITLE);\n    this.currentTrackId = -1;\n    this.tracksBuffered = [];\n    this.mainDetails = null;\n    this._registerListeners();\n  }\n  onHandlerDestroying() {\n    this._unregisterListeners();\n    super.onHandlerDestroying();\n    this.mainDetails = null;\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = 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_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.ERROR, this.onError, 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    hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  _unregisterListeners() {\n    const {\n      hls\n    } = 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_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.ERROR, this.onError, 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    hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  startLoad(startPosition) {\n    this.stopLoad();\n    this.state = State.IDLE;\n    this.setInterval(TICK_INTERVAL$1);\n    this.nextLoadPosition = this.startPosition = this.lastCurrentTime = startPosition;\n    this.tick();\n  }\n  onManifestLoading() {\n    this.mainDetails = null;\n    this.fragmentTracker.removeAllFragments();\n  }\n  onMediaDetaching() {\n    this.tracksBuffered = [];\n    super.onMediaDetaching();\n  }\n  onLevelLoaded(event, data) {\n    this.mainDetails = data.details;\n  }\n  onSubtitleFragProcessed(event, data) {\n    const {\n      frag,\n      success\n    } = data;\n    this.fragPrevious = frag;\n    this.state = State.IDLE;\n    if (!success) {\n      return;\n    }\n    const buffered = this.tracksBuffered[this.currentTrackId];\n    if (!buffered) {\n      return;\n    }\n    let timeRange;\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    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);\n    this.fragBufferedComplete(frag, null);\n  }\n  onBufferFlushing(event, data) {\n    const {\n      startOffset,\n      endOffset\n    } = 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(startOffset, endOffsetSubtitles, PlaylistLevelType.SUBTITLE);\n    }\n  }\n  onFragBuffered(event, data) {\n    if (!this.loadedmetadata && data.frag.type === PlaylistLevelType.MAIN) {\n      var _this$media;\n      if ((_this$media = this.media) != null && _this$media.buffered.length) {\n        this.loadedmetadata = true;\n      }\n    }\n  }\n  // If something goes wrong, proceed to next frag, if we were processing one.\n  onError(event, data) {\n    const frag = data.frag;\n    if ((frag == null ? void 0 : frag.type) === PlaylistLevelType.SUBTITLE) {\n      if (this.fragCurrent) {\n        this.fragCurrent.abortRequests();\n      }\n      if (this.state !== State.STOPPED) {\n        this.state = State.IDLE;\n      }\n    }\n  }\n  // Got all new subtitle levels.\n  onSubtitleTracksUpdated(event, {\n    subtitleTracks\n  }) {\n    if (this.levels && subtitleOptionsIdentical(this.levels, subtitleTracks)) {\n      this.levels = subtitleTracks.map((mediaPlaylist) => new Level(mediaPlaylist));\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(0, Number.POSITIVE_INFINITY, PlaylistLevelType.SUBTITLE);\n    this.fragPrevious = null;\n    this.mediaBuffer = null;\n  }\n  onSubtitleTrackSwitch(event, data) {\n    var _this$levels;\n    this.currentTrackId = data.id;\n    if (!((_this$levels = this.levels) != null && _this$levels.length) || this.currentTrackId === -1) {\n      this.clearInterval();\n      return;\n    }\n    const currentTrack = this.levels[this.currentTrackId];\n    if (currentTrack != null && currentTrack.details) {\n      this.mediaBuffer = this.mediaBufferTimeRanges;\n    } else {\n      this.mediaBuffer = null;\n    }\n    if (currentTrack) {\n      this.setInterval(TICK_INTERVAL$1);\n    }\n  }\n  // Got a new set of subtitle fragments.\n  onSubtitleTrackLoaded(event, data) {\n    var _track$details;\n    const {\n      currentTrackId,\n      levels\n    } = this;\n    const {\n      details: newDetails,\n      id: trackId\n    } = data;\n    if (!levels) {\n      this.warn(`Subtitle tracks were reset while loading level ${trackId}`);\n      return;\n    }\n    const track = levels[currentTrackId];\n    if (trackId >= levels.length || trackId !== currentTrackId || !track) {\n      return;\n    }\n    this.log(`Subtitle track ${trackId} loaded [${newDetails.startSN},${newDetails.endSN}]${newDetails.lastPartSn ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]` : \"\"},duration:${newDetails.totalduration}`);\n    this.mediaBuffer = this.mediaBufferTimeRanges;\n    let sliding = 0;\n    if (newDetails.live || (_track$details = track.details) != null && _track$details.live) {\n      const mainDetails = this.mainDetails;\n      if (newDetails.deltaUpdateFailed || !mainDetails) {\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.fragments[0].start;\n        } else if (mainSlidingStartFragment) {\n          sliding = mainSlidingStartFragment.start;\n          addSliding(newDetails, sliding);\n        }\n      } else {\n        var _this$levelLastLoaded;\n        sliding = this.alignPlaylists(newDetails, track.details, (_this$levelLastLoaded = this.levelLastLoaded) == null ? void 0 : _this$levelLastLoaded.details);\n        if (sliding === 0 && mainSlidingStartFragment) {\n          sliding = mainSlidingStartFragment.start;\n          addSliding(newDetails, sliding);\n        }\n      }\n    }\n    track.details = newDetails;\n    this.levelLastLoaded = track;\n    if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {\n      this.setStartPosition(this.mainDetails || newDetails, sliding);\n    }\n    this.tick();\n    if (newDetails.live && !this.fragCurrent && this.media && this.state === State.IDLE) {\n      const foundFrag = findFragmentByPTS(null, newDetails.fragments, this.media.currentTime, 0);\n      if (!foundFrag) {\n        this.warn(\"Subtitle playlist not aligned with playback\");\n        track.details = void 0;\n      }\n    }\n  }\n  _handleFragmentLoadComplete(fragLoadedData) {\n    const {\n      frag,\n      payload\n    } = fragLoadedData;\n    const decryptData = frag.decryptdata;\n    const hls = this.hls;\n    if (this.fragContextChanged(frag)) {\n      return;\n    }\n    if (payload && payload.byteLength > 0 && decryptData != null && decryptData.key && decryptData.iv && decryptData.method === \"AES-128\") {\n      const startTime = performance.now();\n      this.decrypter.decrypt(new Uint8Array(payload), decryptData.key.buffer, decryptData.iv.buffer).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      }).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      }).catch((err) => {\n        this.warn(`${err.name}: ${err.message}`);\n        this.state = State.IDLE;\n      });\n    }\n  }\n  doTick() {\n    if (!this.media) {\n      this.state = State.IDLE;\n      return;\n    }\n    if (this.state === State.IDLE) {\n      const {\n        currentTrackId,\n        levels\n      } = this;\n      const track = levels == null ? void 0 : levels[currentTrackId];\n      if (!track || !levels.length || !track.details) {\n        return;\n      }\n      const {\n        config\n      } = this;\n      const currentTime = this.getLoadPosition();\n      const bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime, config.maxBufferHole);\n      const {\n        end: targetBufferTime,\n        len: bufferLen\n      } = bufferedInfo;\n      const mainBufferInfo = this.getFwdBufferInfo(this.media, PlaylistLevelType.MAIN);\n      const trackDetails = track.details;\n      const maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + trackDetails.levelTargetDuration;\n      if (bufferLen > maxBufLen) {\n        return;\n      }\n      const fragments = trackDetails.fragments;\n      const fragLen = fragments.length;\n      const end = trackDetails.edge;\n      let foundFrag = null;\n      const fragPrevious = this.fragPrevious;\n      if (targetBufferTime < end) {\n        const tolerance = config.maxFragLookUpTolerance;\n        const lookupTolerance = targetBufferTime > end - tolerance ? 0 : tolerance;\n        foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), lookupTolerance);\n        if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) {\n          foundFrag = fragments[0];\n        }\n      } else {\n        foundFrag = fragments[fragLen - 1];\n      }\n      if (!foundFrag) {\n        return;\n      }\n      foundFrag = this.mapToInitFragWhenRequired(foundFrag);\n      if (foundFrag.sn !== \"initSegment\") {\n        const curSNIdx = foundFrag.sn - trackDetails.startSN;\n        const prevFrag = fragments[curSNIdx - 1];\n        if (prevFrag && prevFrag.cc === foundFrag.cc && this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED) {\n          foundFrag = prevFrag;\n        }\n      }\n      if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {\n        this.loadFragment(foundFrag, track, targetBufferTime);\n      }\n    }\n  }\n  getMaxBufferLength(mainBufferLength) {\n    const maxConfigBuffer = super.getMaxBufferLength();\n    if (!mainBufferLength) {\n      return maxConfigBuffer;\n    }\n    return Math.max(maxConfigBuffer, mainBufferLength);\n  }\n  loadFragment(frag, level, targetBufferTime) {\n    this.fragCurrent = frag;\n    if (frag.sn === \"initSegment\") {\n      this._loadInitSegment(frag, level);\n    } else {\n      this.startFragRequested = true;\n      super.loadFragment(frag, level, targetBufferTime);\n    }\n  }\n  get mediaBufferTimeRanges() {\n    return new BufferableInstance(this.tracksBuffered[this.currentTrackId] || []);\n  }\n}\nclass BufferableInstance {\n  constructor(timeranges) {\n    this.buffered = void 0;\n    const getRange = (name, index, length) => {\n      index = index >>> 0;\n      if (index > length - 1) {\n        throw new DOMException(`Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length})`);\n      }\n      return timeranges[index][name];\n    };\n    this.buffered = {\n      get length() {\n        return timeranges.length;\n      },\n      end(index) {\n        return getRange(\"end\", index, timeranges.length);\n      },\n      start(index) {\n        return getRange(\"start\", index, timeranges.length);\n      }\n    };\n  }\n}\nclass SubtitleTrackController extends BasePlaylistController {\n  constructor(hls) {\n    super(hls, \"[subtitle-track-controller]\");\n    this.media = null;\n    this.tracks = [];\n    this.groupIds = null;\n    this.tracksInGroup = [];\n    this.trackId = -1;\n    this.currentTrack = null;\n    this.selectDefaultTrack = true;\n    this.queuedDefaultTrack = -1;\n    this.asyncPollTrackChange = () => this.pollTrackChange(0);\n    this.useTextTrackPolling = false;\n    this.subtitlePollingInterval = -1;\n    this._subtitleDisplay = true;\n    this.onTextTracksChanged = () => {\n      if (!this.useTextTrackPolling) {\n        self.clearInterval(this.subtitlePollingInterval);\n      }\n      if (!this.media || !this.hls.config.renderTextTracksNatively) {\n        return;\n      }\n      let textTrack = null;\n      const tracks = filterSubtitleTracks(this.media.textTracks);\n      for (let i = 0; i < tracks.length; i++) {\n        if (tracks[i].mode === \"hidden\") {\n          textTrack = tracks[i];\n        } else if (tracks[i].mode === \"showing\") {\n          textTrack = tracks[i];\n          break;\n        }\n      }\n      const trackId = this.findTrackForTextTrack(textTrack);\n      if (this.subtitleTrack !== trackId) {\n        this.setSubtitleTrack(trackId);\n      }\n    };\n    this.registerListeners();\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.tracks.length = 0;\n    this.tracksInGroup.length = 0;\n    this.currentTrack = null;\n    this.onTextTracksChanged = this.asyncPollTrackChange = null;\n    super.destroy();\n  }\n  get subtitleDisplay() {\n    return this._subtitleDisplay;\n  }\n  set subtitleDisplay(value) {\n    this._subtitleDisplay = value;\n    if (this.trackId > -1) {\n      this.toggleTrackModes();\n    }\n  }\n  registerListeners() {\n    const {\n      hls\n    } = 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  unregisterListeners() {\n    const {\n      hls\n    } = 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  // Listen for subtitle track change, then extract the current track ID.\n  onMediaAttached(event, data) {\n    this.media = data.media;\n    if (!this.media) {\n      return;\n    }\n    if (this.queuedDefaultTrack > -1) {\n      this.subtitleTrack = this.queuedDefaultTrack;\n      this.queuedDefaultTrack = -1;\n    }\n    this.useTextTrackPolling = !(this.media.textTracks && \"onchange\" in this.media.textTracks);\n    if (this.useTextTrackPolling) {\n      this.pollTrackChange(500);\n    } else {\n      this.media.textTracks.addEventListener(\"change\", this.asyncPollTrackChange);\n    }\n  }\n  pollTrackChange(timeout) {\n    self.clearInterval(this.subtitlePollingInterval);\n    this.subtitlePollingInterval = self.setInterval(this.onTextTracksChanged, timeout);\n  }\n  onMediaDetaching() {\n    if (!this.media) {\n      return;\n    }\n    self.clearInterval(this.subtitlePollingInterval);\n    if (!this.useTextTrackPolling) {\n      this.media.textTracks.removeEventListener(\"change\", this.asyncPollTrackChange);\n    }\n    if (this.trackId > -1) {\n      this.queuedDefaultTrack = this.trackId;\n    }\n    const textTracks = filterSubtitleTracks(this.media.textTracks);\n    textTracks.forEach((track) => {\n      clearCurrentCues(track);\n    });\n    this.subtitleTrack = -1;\n    this.media = null;\n  }\n  onManifestLoading() {\n    this.tracks = [];\n    this.groupIds = null;\n    this.tracksInGroup = [];\n    this.trackId = -1;\n    this.currentTrack = null;\n    this.selectDefaultTrack = true;\n  }\n  // Fired whenever a new manifest is loaded.\n  onManifestParsed(event, data) {\n    this.tracks = data.subtitleTracks;\n  }\n  onSubtitleTrackLoaded(event, data) {\n    const {\n      id,\n      groupId,\n      details\n    } = data;\n    const trackInActiveGroup = this.tracksInGroup[id];\n    if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) {\n      this.warn(`Subtitle track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup == null ? void 0 : trackInActiveGroup.groupId}`);\n      return;\n    }\n    const curDetails = trackInActiveGroup.details;\n    trackInActiveGroup.details = data.details;\n    this.log(`Subtitle track ${id} \"${trackInActiveGroup.name}\" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`);\n    if (id === this.trackId) {\n      this.playlistLoaded(id, data, curDetails);\n    }\n  }\n  onLevelLoading(event, data) {\n    this.switchLevel(data.level);\n  }\n  onLevelSwitching(event, data) {\n    this.switchLevel(data.level);\n  }\n  switchLevel(levelIndex) {\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 (!subtitleGroups || (currentGroups == null ? void 0 : currentGroups.length) !== (subtitleGroups == null ? void 0 : subtitleGroups.length) || subtitleGroups != null && subtitleGroups.some((groupId) => (currentGroups == null ? void 0 : currentGroups.indexOf(groupId)) === -1)) {\n      this.groupIds = subtitleGroups;\n      this.trackId = -1;\n      this.currentTrack = null;\n      const subtitleTracks = this.tracks.filter((track) => !subtitleGroups || subtitleGroups.indexOf(track.groupId) !== -1);\n      if (subtitleTracks.length) {\n        if (this.selectDefaultTrack && !subtitleTracks.some((track) => track.default)) {\n          this.selectDefaultTrack = false;\n        }\n        subtitleTracks.forEach((track, i) => {\n          track.id = i;\n        });\n      } else if (!currentTrack && !this.tracksInGroup.length) {\n        return;\n      }\n      this.tracksInGroup = subtitleTracks;\n      const subtitlePreference = this.hls.config.subtitlePreference;\n      if (!currentTrack && subtitlePreference) {\n        this.selectDefaultTrack = false;\n        const groupIndex = findMatchingOption(subtitlePreference, subtitleTracks);\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      let trackId = this.findTrackId(currentTrack);\n      if (trackId === -1 && currentTrack) {\n        trackId = this.findTrackId(null);\n      }\n      const subtitleTracksUpdated = {\n        subtitleTracks\n      };\n      this.log(`Updating subtitle tracks, ${subtitleTracks.length} track(s) found in \"${subtitleGroups == null ? void 0 : subtitleGroups.join(\",\")}\" group-id`);\n      this.hls.trigger(Events.SUBTITLE_TRACKS_UPDATED, subtitleTracksUpdated);\n      if (trackId !== -1 && this.trackId === -1) {\n        this.setSubtitleTrack(trackId);\n      }\n    } else if (this.shouldReloadPlaylist(currentTrack)) {\n      this.setSubtitleTrack(this.trackId);\n    }\n  }\n  findTrackId(currentTrack) {\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 (selectDefault && !track.default || !selectDefault && !currentTrack) {\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 (mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\"LANGUAGE\", \"ASSOC-LANGUAGE\", \"CHARACTERISTICS\"])) {\n          return i;\n        }\n      }\n      for (let i = 0; i < tracks.length; i++) {\n        const track = tracks[i];\n        if (mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\"LANGUAGE\"])) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n  findTrackForTextTrack(textTrack) {\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  onError(event, data) {\n    if (data.fatal || !data.context) {\n      return;\n    }\n    if (data.context.type === PlaylistContextType.SUBTITLE_TRACK && data.context.id === this.trackId && (!this.groupIds || this.groupIds.indexOf(data.context.groupId) !== -1)) {\n      this.checkRetry(data);\n    }\n  }\n  get allSubtitleTracks() {\n    return this.tracks;\n  }\n  /** get alternate subtitle tracks list from playlist **/\n  get subtitleTracks() {\n    return this.tracksInGroup;\n  }\n  /** get/set index of the selected subtitle track (based on index in subtitle track lists) **/\n  get subtitleTrack() {\n    return this.trackId;\n  }\n  set subtitleTrack(newId) {\n    this.selectDefaultTrack = false;\n    this.setSubtitleTrack(newId);\n  }\n  setSubtitleOption(subtitleOption) {\n    this.hls.config.subtitlePreference = subtitleOption;\n    if (subtitleOption) {\n      const allSubtitleTracks = this.allSubtitleTracks;\n      this.selectDefaultTrack = false;\n      if (allSubtitleTracks.length) {\n        const currentTrack = this.currentTrack;\n        if (currentTrack && matchesOption(subtitleOption, currentTrack)) {\n          return currentTrack;\n        }\n        const groupIndex = findMatchingOption(subtitleOption, this.tracksInGroup);\n        if (groupIndex > -1) {\n          const track = this.tracksInGroup[groupIndex];\n          this.setSubtitleTrack(groupIndex);\n          return track;\n        } else if (currentTrack) {\n          return null;\n        } else {\n          const allIndex = findMatchingOption(subtitleOption, allSubtitleTracks);\n          if (allIndex > -1) {\n            return allSubtitleTracks[allIndex];\n          }\n        }\n      }\n    }\n    return null;\n  }\n  loadPlaylist(hlsUrlParameters) {\n    super.loadPlaylist();\n    const currentTrack = this.currentTrack;\n    if (this.shouldLoadPlaylist(currentTrack) && currentTrack) {\n      const id = currentTrack.id;\n      const groupId = currentTrack.groupId;\n      let url = currentTrack.url;\n      if (hlsUrlParameters) {\n        try {\n          url = hlsUrlParameters.addDirectives(url);\n        } catch (error) {\n          this.warn(`Could not construct new URL with HLS Delivery Directives: ${error}`);\n        }\n      }\n      this.log(`Loading subtitle playlist for id ${id}`);\n      this.hls.trigger(Events.SUBTITLE_TRACK_LOADING, {\n        url,\n        id,\n        groupId,\n        deliveryDirectives: hlsUrlParameters || null\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  toggleTrackModes() {\n    const {\n      media\n    } = this;\n    if (!media) {\n      return;\n    }\n    const textTracks = filterSubtitleTracks(media.textTracks);\n    const currentTrack = this.currentTrack;\n    let nextTrack;\n    if (currentTrack) {\n      nextTrack = textTracks.filter((textTrack) => subtitleTrackMatchesTextTrack(currentTrack, textTrack))[0];\n      if (!nextTrack) {\n        this.warn(`Unable to find subtitle TextTrack with name \"${currentTrack.name}\" and language \"${currentTrack.lang}\"`);\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   * 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  setSubtitleTrack(newId) {\n    const tracks = this.tracksInGroup;\n    if (!this.media) {\n      this.queuedDefaultTrack = newId;\n      return;\n    }\n    if (newId < -1 || newId >= tracks.length || !isFiniteNumber(newId)) {\n      this.warn(`Invalid subtitle track id: ${newId}`);\n      return;\n    }\n    this.clearTimer();\n    this.selectDefaultTrack = false;\n    const lastTrack = this.currentTrack;\n    const track = tracks[newId] || null;\n    this.trackId = newId;\n    this.currentTrack = track;\n    this.toggleTrackModes();\n    if (!track) {\n      this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, {\n        id: newId\n      });\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(`Switching to subtitle-track ${newId}` + (track ? ` \"${track.name}\" lang:${track.lang} group:${track.groupId}` : \"\"));\n    const {\n      id,\n      groupId = \"\",\n      name,\n      type,\n      url\n    } = 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(track.url, lastTrack == null ? void 0 : lastTrack.details);\n    this.loadPlaylist(hlsUrlParameters);\n  }\n}\nclass BufferOperationQueue {\n  constructor(sourceBufferReference) {\n    this.buffers = void 0;\n    this.queues = {\n      video: [],\n      audio: [],\n      audiovideo: []\n    };\n    this.buffers = sourceBufferReference;\n  }\n  append(operation, type, pending) {\n    const queue = this.queues[type];\n    queue.push(operation);\n    if (queue.length === 1 && !pending) {\n      this.executeNext(type);\n    }\n  }\n  insertAbort(operation, type) {\n    const queue = this.queues[type];\n    queue.unshift(operation);\n    this.executeNext(type);\n  }\n  appendBlocker(type) {\n    let execute;\n    const promise = new Promise((resolve) => {\n      execute = resolve;\n    });\n    const operation = {\n      execute,\n      onStart: () => {\n      },\n      onComplete: () => {\n      },\n      onError: () => {\n      }\n    };\n    this.append(operation, type);\n    return promise;\n  }\n  executeNext(type) {\n    const queue = this.queues[type];\n    if (queue.length) {\n      const operation = queue[0];\n      try {\n        operation.execute();\n      } catch (error) {\n        logger.warn(`[buffer-operation-queue]: Exception executing \"${type}\" SourceBuffer operation: ${error}`);\n        operation.onError(error);\n        const sb = this.buffers[type];\n        if (!(sb != null && sb.updating)) {\n          this.shiftAndExecuteNext(type);\n        }\n      }\n    }\n  }\n  shiftAndExecuteNext(type) {\n    this.queues[type].shift();\n    this.executeNext(type);\n  }\n  current(type) {\n    return this.queues[type][0];\n  }\n}\nconst VIDEO_CODEC_PROFILE_REPLACE = /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\\.[^.,]+)+/;\nclass BufferController {\n  constructor(hls) {\n    this.details = null;\n    this._objectUrl = null;\n    this.operationQueue = void 0;\n    this.listeners = void 0;\n    this.hls = void 0;\n    this.bufferCodecEventsExpected = 0;\n    this._bufferCodecEventsTotal = 0;\n    this.media = null;\n    this.mediaSource = null;\n    this.lastMpegAudioChunk = null;\n    this.appendSource = void 0;\n    this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0\n    };\n    this.tracks = {};\n    this.pendingTracks = {};\n    this.sourceBuffer = void 0;\n    this.log = void 0;\n    this.warn = void 0;\n    this.error = void 0;\n    this._onEndStreaming = (event) => {\n      if (!this.hls) {\n        return;\n      }\n      this.hls.pauseBuffering();\n    };\n    this._onStartStreaming = (event) => {\n      if (!this.hls) {\n        return;\n      }\n      this.hls.resumeBuffering();\n    };\n    this._onMediaSourceOpen = () => {\n      const {\n        media,\n        mediaSource\n      } = this;\n      this.log(\"Media source opened\");\n      if (media) {\n        media.removeEventListener(\"emptied\", this._onMediaEmptied);\n        this.updateMediaElementDuration();\n        this.hls.trigger(Events.MEDIA_ATTACHED, {\n          media,\n          mediaSource\n        });\n      }\n      if (mediaSource) {\n        mediaSource.removeEventListener(\"sourceopen\", this._onMediaSourceOpen);\n      }\n      this.checkPendingTracks();\n    };\n    this._onMediaSourceClose = () => {\n      this.log(\"Media source closed\");\n    };\n    this._onMediaSourceEnded = () => {\n      this.log(\"Media source ended\");\n    };\n    this._onMediaEmptied = () => {\n      const {\n        mediaSrc,\n        _objectUrl\n      } = this;\n      if (mediaSrc !== _objectUrl) {\n        logger.error(`Media element src was set while attaching MediaSource (${_objectUrl} > ${mediaSrc})`);\n      }\n    };\n    this.hls = hls;\n    const logPrefix = \"[buffer-controller]\";\n    this.appendSource = hls.config.preferManagedMediaSource && typeof self !== \"undefined\" && self.ManagedMediaSource;\n    this.log = logger.log.bind(logger, logPrefix);\n    this.warn = logger.warn.bind(logger, logPrefix);\n    this.error = logger.error.bind(logger, logPrefix);\n    this._initSourceBuffer();\n    this.registerListeners();\n  }\n  hasSourceTypes() {\n    return this.getSourceBufferTypes().length > 0 || Object.keys(this.pendingTracks).length > 0;\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.details = null;\n    this.lastMpegAudioChunk = null;\n    this.hls = null;\n  }\n  registerListeners() {\n    const {\n      hls\n    } = 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  }\n  unregisterListeners() {\n    const {\n      hls\n    } = 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  }\n  _initSourceBuffer() {\n    this.sourceBuffer = {};\n    this.operationQueue = new BufferOperationQueue(this.sourceBuffer);\n    this.listeners = {\n      audio: [],\n      video: [],\n      audiovideo: []\n    };\n    this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0\n    };\n    this.lastMpegAudioChunk = null;\n  }\n  onManifestLoading() {\n    this.bufferCodecEventsExpected = this._bufferCodecEventsTotal = 0;\n    this.details = null;\n  }\n  onManifestParsed(event, data) {\n    let codecEvents = 2;\n    if (data.audio && !data.video || !data.altAudio || false) {\n      codecEvents = 1;\n    }\n    this.bufferCodecEventsExpected = this._bufferCodecEventsTotal = codecEvents;\n    this.log(`${this.bufferCodecEventsExpected} bufferCodec event(s) expected`);\n  }\n  onMediaAttaching(event, data) {\n    const media = this.media = data.media;\n    const MediaSource = getMediaSource(this.appendSource);\n    if (media && MediaSource) {\n      var _ms$constructor;\n      const ms = this.mediaSource = new MediaSource();\n      this.log(`created media source: ${(_ms$constructor = ms.constructor) == null ? void 0 : _ms$constructor.name}`);\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      const objectUrl = this._objectUrl = self.URL.createObjectURL(ms);\n      if (this.appendSource) {\n        try {\n          media.removeAttribute(\"src\");\n          const MMS = self.ManagedMediaSource;\n          media.disableRemotePlayback = 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      media.addEventListener(\"emptied\", this._onMediaEmptied);\n    }\n  }\n  onMediaDetaching() {\n    const {\n      media,\n      mediaSource,\n      _objectUrl\n    } = this;\n    if (mediaSource) {\n      this.log(\"media source detaching\");\n      if (mediaSource.readyState === \"open\") {\n        try {\n          mediaSource.endOfStream();\n        } catch (err) {\n          this.warn(`onMediaDetaching: ${err.message} while calling endOfStream`);\n        }\n      }\n      this.onBufferReset();\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(\"startstreaming\", this._onStartStreaming);\n        mediaSource.removeEventListener(\"endstreaming\", this._onEndStreaming);\n      }\n      if (media) {\n        media.removeEventListener(\"emptied\", this._onMediaEmptied);\n        if (_objectUrl) {\n          self.URL.revokeObjectURL(_objectUrl);\n        }\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(\"media|source.src was changed by a third party - skip cleanup\");\n        }\n      }\n      this.mediaSource = null;\n      this.media = null;\n      this._objectUrl = null;\n      this.bufferCodecEventsExpected = this._bufferCodecEventsTotal;\n      this.pendingTracks = {};\n      this.tracks = {};\n    }\n    this.hls.trigger(Events.MEDIA_DETACHED, void 0);\n  }\n  onBufferReset() {\n    this.getSourceBufferTypes().forEach((type) => {\n      this.resetBuffer(type);\n    });\n    this._initSourceBuffer();\n  }\n  resetBuffer(type) {\n    const sb = this.sourceBuffer[type];\n    try {\n      if (sb) {\n        var _this$mediaSource;\n        this.removeBufferListeners(type);\n        this.sourceBuffer[type] = void 0;\n        if ((_this$mediaSource = this.mediaSource) != null && _this$mediaSource.sourceBuffers.length) {\n          this.mediaSource.removeSourceBuffer(sb);\n        }\n      }\n    } catch (err) {\n      this.warn(`onBufferReset ${type}`, err);\n    }\n  }\n  onBufferCodecs(event, data) {\n    const sourceBufferCount = this.getSourceBufferTypes().length;\n    const trackNames = Object.keys(data);\n    trackNames.forEach((trackName) => {\n      if (sourceBufferCount) {\n        const track = this.tracks[trackName];\n        if (track && typeof track.buffer.changeType === \"function\") {\n          var _trackCodec;\n          const {\n            id,\n            codec,\n            levelCodec,\n            container,\n            metadata\n          } = data[trackName];\n          const currentCodecFull = pickMostCompleteCodecName(track.codec, track.levelCodec);\n          const currentCodec = currentCodecFull == null ? void 0 : currentCodecFull.replace(VIDEO_CODEC_PROFILE_REPLACE, \"$1\");\n          let trackCodec = pickMostCompleteCodecName(codec, levelCodec);\n          const nextCodec = (_trackCodec = trackCodec) == null ? void 0 : _trackCodec.replace(VIDEO_CODEC_PROFILE_REPLACE, \"$1\");\n          if (trackCodec && currentCodec !== nextCodec) {\n            if (trackName.slice(0, 5) === \"audio\") {\n              trackCodec = getCodecCompatibleName(trackCodec, this.appendSource);\n            }\n            const mimeType = `${container};codecs=${trackCodec}`;\n            this.appendChangeType(trackName, mimeType);\n            this.log(`switching codec ${currentCodecFull} to ${trackCodec}`);\n            this.tracks[trackName] = {\n              buffer: track.buffer,\n              codec,\n              container,\n              levelCodec,\n              metadata,\n              id\n            };\n          }\n        }\n      } else {\n        this.pendingTracks[trackName] = data[trackName];\n      }\n    });\n    if (sourceBufferCount) {\n      return;\n    }\n    const bufferCodecEventsExpected = Math.max(this.bufferCodecEventsExpected - 1, 0);\n    if (this.bufferCodecEventsExpected !== bufferCodecEventsExpected) {\n      this.log(`${bufferCodecEventsExpected} bufferCodec event(s) expected ${trackNames.join(\",\")}`);\n      this.bufferCodecEventsExpected = bufferCodecEventsExpected;\n    }\n    if (this.mediaSource && this.mediaSource.readyState === \"open\") {\n      this.checkPendingTracks();\n    }\n  }\n  appendChangeType(type, mimeType) {\n    const {\n      operationQueue\n    } = this;\n    const operation = {\n      execute: () => {\n        const sb = this.sourceBuffer[type];\n        if (sb) {\n          this.log(`changing ${type} sourceBuffer type to ${mimeType}`);\n          sb.changeType(mimeType);\n        }\n        operationQueue.shiftAndExecuteNext(type);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n      },\n      onError: (error) => {\n        this.warn(`Failed to change ${type} SourceBuffer type`, error);\n      }\n    };\n    operationQueue.append(operation, type, !!this.pendingTracks[type]);\n  }\n  onBufferAppending(event, eventData) {\n    const {\n      hls,\n      operationQueue,\n      tracks\n    } = this;\n    const {\n      data,\n      type,\n      frag,\n      part,\n      chunkMeta\n    } = eventData;\n    const chunkStats = chunkMeta.buffering[type];\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    const audioTrack = tracks.audio;\n    let checkTimestampOffset = false;\n    if (type === \"audio\" && (audioTrack == null ? void 0 : audioTrack.container) === \"audio/mpeg\") {\n      checkTimestampOffset = !this.lastMpegAudioChunk || chunkMeta.id === 1 || this.lastMpegAudioChunk.sn !== chunkMeta.sn;\n      this.lastMpegAudioChunk = chunkMeta;\n    }\n    const fragStart = frag.start;\n    const operation = {\n      execute: () => {\n        chunkStats.executeStart = self.performance.now();\n        if (checkTimestampOffset) {\n          const sb = this.sourceBuffer[type];\n          if (sb) {\n            const delta = fragStart - sb.timestampOffset;\n            if (Math.abs(delta) >= 0.1) {\n              this.log(`Updating audio SourceBuffer timestampOffset to ${fragStart} (delta: ${delta}) sn: ${frag.sn})`);\n              sb.timestampOffset = fragStart;\n            }\n          }\n        }\n        this.appendExecutor(data, type);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\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        const {\n          sourceBuffer\n        } = this;\n        const timeRanges = {};\n        for (const type2 in sourceBuffer) {\n          timeRanges[type2] = BufferHelper.getBuffered(sourceBuffer[type2]);\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) => {\n        const event2 = {\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        if (error.code === DOMException.QUOTA_EXCEEDED_ERR) {\n          event2.details = ErrorDetails.BUFFER_FULL_ERROR;\n        } else {\n          const appendErrorCount = ++this.appendErrors[type];\n          event2.details = ErrorDetails.BUFFER_APPEND_ERROR;\n          this.warn(`Failed ${appendErrorCount}/${hls.config.appendErrorMaxRetry} times to append segment in \"${type}\" sourceBuffer`);\n          if (appendErrorCount >= hls.config.appendErrorMaxRetry) {\n            event2.fatal = true;\n          }\n        }\n        hls.trigger(Events.ERROR, event2);\n      }\n    };\n    operationQueue.append(operation, type, !!this.pendingTracks[type]);\n  }\n  onBufferFlushing(event, data) {\n    const {\n      operationQueue\n    } = this;\n    const flushOperation = (type) => ({\n      execute: this.removeExecutor.bind(this, type, data.startOffset, data.endOffset),\n      onStart: () => {\n      },\n      onComplete: () => {\n        this.hls.trigger(Events.BUFFER_FLUSHED, {\n          type\n        });\n      },\n      onError: (error) => {\n        this.warn(`Failed to remove from ${type} SourceBuffer`, error);\n      }\n    });\n    if (data.type) {\n      operationQueue.append(flushOperation(data.type), data.type);\n    } else {\n      this.getSourceBufferTypes().forEach((type) => {\n        operationQueue.append(flushOperation(type), type);\n      });\n    }\n  }\n  onFragParsed(event, data) {\n    const {\n      frag,\n      part\n    } = data;\n    const buffersAppendedTo = [];\n    const elementaryStreams = part ? part.elementaryStreams : 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    const onUnblocked = () => {\n      const now2 = self.performance.now();\n      frag.stats.buffering.end = now2;\n      if (part) {\n        part.stats.buffering.end = now2;\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    if (buffersAppendedTo.length === 0) {\n      this.warn(`Fragments must have at least one ElementaryStreamType set. type: ${frag.type} level: ${frag.level} sn: ${frag.sn}`);\n    }\n    this.blockBuffers(onUnblocked, buffersAppendedTo);\n  }\n  onFragChanged(event, data) {\n    this.trimBuffers();\n  }\n  // on BUFFER_EOS mark matching sourcebuffer(s) as ended and trigger checkEos()\n  // an undefined data.type will mark all buffers as EOS.\n  onBufferEos(event, data) {\n    const ended = this.getSourceBufferTypes().reduce((acc, type) => {\n      const sb = this.sourceBuffer[type];\n      if (sb && (!data.type || data.type === type)) {\n        sb.ending = true;\n        if (!sb.ended) {\n          sb.ended = true;\n          this.log(`${type} sourceBuffer now EOS`);\n        }\n      }\n      return acc && !!(!sb || sb.ended);\n    }, true);\n    if (ended) {\n      this.log(`Queueing mediaSource.endOfStream()`);\n      this.blockBuffers(() => {\n        this.getSourceBufferTypes().forEach((type) => {\n          const sb = this.sourceBuffer[type];\n          if (sb) {\n            sb.ending = false;\n          }\n        });\n        const {\n          mediaSource\n        } = this;\n        if (!mediaSource || mediaSource.readyState !== \"open\") {\n          if (mediaSource) {\n            this.log(`Could not call mediaSource.endOfStream(). mediaSource.readyState: ${mediaSource.readyState}`);\n          }\n          return;\n        }\n        this.log(`Calling mediaSource.endOfStream()`);\n        mediaSource.endOfStream();\n      });\n    }\n  }\n  onLevelUpdated(event, {\n    details\n  }) {\n    if (!details.fragments.length) {\n      return;\n    }\n    this.details = details;\n    if (this.getSourceBufferTypes().length) {\n      this.blockBuffers(this.updateMediaElementDuration.bind(this));\n    } else {\n      this.updateMediaElementDuration();\n    }\n  }\n  trimBuffers() {\n    const {\n      hls,\n      details,\n      media\n    } = this;\n    if (!media || details === null) {\n      return;\n    }\n    const sourceBufferTypes = this.getSourceBufferTypes();\n    if (!sourceBufferTypes.length) {\n      return;\n    }\n    const config = hls.config;\n    const currentTime = media.currentTime;\n    const targetDuration = details.levelTargetDuration;\n    const backBufferLength = details.live && config.liveBackBufferLength !== null ? config.liveBackBufferLength : config.backBufferLength;\n    if (isFiniteNumber(backBufferLength) && backBufferLength > 0) {\n      const maxBackBufferLength = Math.max(backBufferLength, targetDuration);\n      const targetBackBufferPosition = Math.floor(currentTime / targetDuration) * targetDuration - maxBackBufferLength;\n      this.flushBackBuffer(currentTime, targetDuration, targetBackBufferPosition);\n    }\n    if (isFiniteNumber(config.frontBufferFlushThreshold) && config.frontBufferFlushThreshold > 0) {\n      const frontBufferLength = Math.max(config.maxBufferLength, config.frontBufferFlushThreshold);\n      const maxFrontBufferLength = Math.max(frontBufferLength, targetDuration);\n      const targetFrontBufferPosition = Math.floor(currentTime / targetDuration) * targetDuration + maxFrontBufferLength;\n      this.flushFrontBuffer(currentTime, targetDuration, targetFrontBufferPosition);\n    }\n  }\n  flushBackBuffer(currentTime, targetDuration, targetBackBufferPosition) {\n    const {\n      details,\n      sourceBuffer\n    } = this;\n    const sourceBufferTypes = this.getSourceBufferTypes();\n    sourceBufferTypes.forEach((type) => {\n      const sb = sourceBuffer[type];\n      if (sb) {\n        const buffered = BufferHelper.getBuffered(sb);\n        if (buffered.length > 0 && targetBackBufferPosition > buffered.start(0)) {\n          this.hls.trigger(Events.BACK_BUFFER_REACHED, {\n            bufferEnd: targetBackBufferPosition\n          });\n          if (details != null && details.live) {\n            this.hls.trigger(Events.LIVE_BACK_BUFFER_REACHED, {\n              bufferEnd: targetBackBufferPosition\n            });\n          } else if (sb.ended && buffered.end(buffered.length - 1) - currentTime < targetDuration * 2) {\n            this.log(`Cannot flush ${type} back buffer while SourceBuffer is in ended state`);\n            return;\n          }\n          this.hls.trigger(Events.BUFFER_FLUSHING, {\n            startOffset: 0,\n            endOffset: targetBackBufferPosition,\n            type\n          });\n        }\n      }\n    });\n  }\n  flushFrontBuffer(currentTime, targetDuration, targetFrontBufferPosition) {\n    const {\n      sourceBuffer\n    } = this;\n    const sourceBufferTypes = this.getSourceBufferTypes();\n    sourceBufferTypes.forEach((type) => {\n      const sb = sourceBuffer[type];\n      if (sb) {\n        const buffered = BufferHelper.getBuffered(sb);\n        const numBufferedRanges = buffered.length;\n        if (numBufferedRanges < 2) {\n          return;\n        }\n        const bufferStart = buffered.start(numBufferedRanges - 1);\n        const bufferEnd = buffered.end(numBufferedRanges - 1);\n        if (targetFrontBufferPosition > bufferStart || currentTime >= bufferStart && currentTime <= bufferEnd) {\n          return;\n        } else if (sb.ended && currentTime - bufferEnd < 2 * targetDuration) {\n          this.log(`Cannot flush ${type} front buffer while SourceBuffer is in ended state`);\n          return;\n        }\n        this.hls.trigger(Events.BUFFER_FLUSHING, {\n          startOffset: bufferStart,\n          endOffset: Infinity,\n          type\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  updateMediaElementDuration() {\n    if (!this.details || !this.media || !this.mediaSource || this.mediaSource.readyState !== \"open\") {\n      return;\n    }\n    const {\n      details,\n      hls,\n      media,\n      mediaSource\n    } = this;\n    const levelDuration = details.fragments[0].start + details.totalduration;\n    const mediaDuration = media.duration;\n    const msDuration = isFiniteNumber(mediaSource.duration) ? mediaSource.duration : 0;\n    if (details.live && hls.config.liveDurationInfinity) {\n      mediaSource.duration = Infinity;\n      this.updateSeekableRange(details);\n    } else if (levelDuration > msDuration && levelDuration > mediaDuration || !isFiniteNumber(mediaDuration)) {\n      this.log(`Updating Media Source duration to ${levelDuration.toFixed(3)}`);\n      mediaSource.duration = levelDuration;\n    }\n  }\n  updateSeekableRange(levelDetails) {\n    const mediaSource = this.mediaSource;\n    const fragments = levelDetails.fragments;\n    const len = fragments.length;\n    if (len && levelDetails.live && mediaSource != null && mediaSource.setLiveSeekableRange) {\n      const start = Math.max(0, fragments[0].start);\n      const end = Math.max(start, start + levelDetails.totalduration);\n      this.log(`Media Source duration is set to ${mediaSource.duration}. Setting seekable range to ${start}-${end}.`);\n      mediaSource.setLiveSeekableRange(start, end);\n    }\n  }\n  checkPendingTracks() {\n    const {\n      bufferCodecEventsExpected,\n      operationQueue,\n      pendingTracks\n    } = this;\n    const pendingTracksCount = Object.keys(pendingTracks).length;\n    if (pendingTracksCount && (!bufferCodecEventsExpected || pendingTracksCount === 2 || \"audiovideo\" in pendingTracks)) {\n      this.createSourceBuffers(pendingTracks);\n      this.pendingTracks = {};\n      const buffers = this.getSourceBufferTypes();\n      if (buffers.length) {\n        this.hls.trigger(Events.BUFFER_CREATED, {\n          tracks: this.tracks\n        });\n        buffers.forEach((type) => {\n          operationQueue.executeNext(type);\n        });\n      } else {\n        const error = new Error(\"could not create source buffer for media codec(s)\");\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  createSourceBuffers(tracks) {\n    const {\n      sourceBuffer,\n      mediaSource\n    } = this;\n    if (!mediaSource) {\n      throw Error(\"createSourceBuffers called when mediaSource was null\");\n    }\n    for (const trackName in tracks) {\n      if (!sourceBuffer[trackName]) {\n        const track = tracks[trackName];\n        if (!track) {\n          throw Error(`source buffer exists for track ${trackName}, however track does not`);\n        }\n        let codec = track.levelCodec || track.codec;\n        if (codec) {\n          if (trackName.slice(0, 5) === \"audio\") {\n            codec = getCodecCompatibleName(codec, this.appendSource);\n          }\n        }\n        const mimeType = `${track.container};codecs=${codec}`;\n        this.log(`creating sourceBuffer(${mimeType})`);\n        try {\n          const sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType);\n          const sbName = trackName;\n          this.addBufferListener(sbName, \"updatestart\", this._onSBUpdateStart);\n          this.addBufferListener(sbName, \"updateend\", this._onSBUpdateEnd);\n          this.addBufferListener(sbName, \"error\", this._onSBUpdateError);\n          if (this.appendSource) {\n            this.addBufferListener(sbName, \"bufferedchange\", (type, event) => {\n              const removedRanges = event.removedRanges;\n              if (removedRanges != null && removedRanges.length) {\n                this.hls.trigger(Events.BUFFER_FLUSHED, {\n                  type: trackName\n                });\n              }\n            });\n          }\n          this.tracks[trackName] = {\n            buffer: sb,\n            codec,\n            container: track.container,\n            levelCodec: track.levelCodec,\n            metadata: track.metadata,\n            id: track.id\n          };\n        } catch (err) {\n          this.error(`error while trying to add sourceBuffer: ${err.message}`);\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.BUFFER_ADD_CODEC_ERROR,\n            fatal: false,\n            error: err,\n            sourceBufferName: trackName,\n            mimeType\n          });\n        }\n      }\n    }\n  }\n  get mediaSrc() {\n    var _this$media;\n    const media = ((_this$media = this.media) == null ? void 0 : _this$media.firstChild) || this.media;\n    return media == null ? void 0 : media.src;\n  }\n  _onSBUpdateStart(type) {\n    const {\n      operationQueue\n    } = this;\n    const operation = operationQueue.current(type);\n    operation.onStart();\n  }\n  _onSBUpdateEnd(type) {\n    var _this$mediaSource2;\n    if (((_this$mediaSource2 = this.mediaSource) == null ? void 0 : _this$mediaSource2.readyState) === \"closed\") {\n      this.resetBuffer(type);\n      return;\n    }\n    const {\n      operationQueue\n    } = this;\n    const operation = operationQueue.current(type);\n    operation.onComplete();\n    operationQueue.shiftAndExecuteNext(type);\n  }\n  _onSBUpdateError(type, event) {\n    var _this$mediaSource3;\n    const error = new Error(`${type} SourceBuffer error. MediaSource readyState: ${(_this$mediaSource3 = this.mediaSource) == null ? void 0 : _this$mediaSource3.readyState}`);\n    this.error(`${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    const operation = this.operationQueue.current(type);\n    if (operation) {\n      operation.onError(error);\n    }\n  }\n  // This method must result in an updateend event; if remove is not called, _onSBUpdateEnd must be called manually\n  removeExecutor(type, startOffset, endOffset) {\n    const {\n      media,\n      mediaSource,\n      operationQueue,\n      sourceBuffer\n    } = this;\n    const sb = sourceBuffer[type];\n    if (!media || !mediaSource || !sb) {\n      this.warn(`Attempting to remove from the ${type} SourceBuffer, but it does not exist`);\n      operationQueue.shiftAndExecuteNext(type);\n      return;\n    }\n    const mediaDuration = isFiniteNumber(media.duration) ? media.duration : Infinity;\n    const msDuration = isFiniteNumber(mediaSource.duration) ? mediaSource.duration : Infinity;\n    const removeStart = Math.max(0, startOffset);\n    const removeEnd = Math.min(endOffset, mediaDuration, msDuration);\n    if (removeEnd > removeStart && (!sb.ending || sb.ended)) {\n      sb.ended = false;\n      this.log(`Removing [${removeStart},${removeEnd}] from the ${type} SourceBuffer`);\n      sb.remove(removeStart, removeEnd);\n    } else {\n      operationQueue.shiftAndExecuteNext(type);\n    }\n  }\n  // This method must result in an updateend event; if append is not called, _onSBUpdateEnd must be called manually\n  appendExecutor(data, type) {\n    const sb = this.sourceBuffer[type];\n    if (!sb) {\n      if (!this.pendingTracks[type]) {\n        throw new Error(`Attempting to append to the ${type} SourceBuffer, but it does not exist`);\n      }\n      return;\n    }\n    sb.ended = false;\n    sb.appendBuffer(data);\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  blockBuffers(onUnblocked, buffers = this.getSourceBufferTypes()) {\n    if (!buffers.length) {\n      this.log(\"Blocking operation requested, but no SourceBuffers exist\");\n      Promise.resolve().then(onUnblocked);\n      return;\n    }\n    const {\n      operationQueue\n    } = this;\n    const blockingOperations = buffers.map((type) => operationQueue.appendBlocker(type));\n    Promise.all(blockingOperations).then(() => {\n      onUnblocked();\n      buffers.forEach((type) => {\n        const sb = this.sourceBuffer[type];\n        if (!(sb != null && sb.updating)) {\n          operationQueue.shiftAndExecuteNext(type);\n        }\n      });\n    });\n  }\n  getSourceBufferTypes() {\n    return Object.keys(this.sourceBuffer);\n  }\n  addBufferListener(type, event, fn) {\n    const buffer = this.sourceBuffer[type];\n    if (!buffer) {\n      return;\n    }\n    const listener = fn.bind(this, type);\n    this.listeners[type].push({\n      event,\n      listener\n    });\n    buffer.addEventListener(event, listener);\n  }\n  removeBufferListeners(type) {\n    const buffer = this.sourceBuffer[type];\n    if (!buffer) {\n      return;\n    }\n    this.listeners[type].forEach((l) => {\n      buffer.removeEventListener(l.event, l.listener);\n    });\n  }\n}\nfunction removeSourceChildren(node) {\n  const sourceChildren = node.querySelectorAll(\"source\");\n  [].slice.call(sourceChildren).forEach((source) => {\n    node.removeChild(source);\n  });\n}\nfunction addSource(media, url) {\n  const source = self.document.createElement(\"source\");\n  source.type = \"video/mp4\";\n  source.src = url;\n  media.appendChild(source);\n}\nconst specialCea608CharsCodes = {\n  42: 225,\n  // lowercase a, acute accent\n  92: 233,\n  // lowercase e, acute accent\n  94: 237,\n  // lowercase i, acute accent\n  95: 243,\n  // lowercase o, acute accent\n  96: 250,\n  // lowercase u, acute accent\n  123: 231,\n  // lowercase c with cedilla\n  124: 247,\n  // division symbol\n  125: 209,\n  // uppercase N tilde\n  126: 241,\n  // lowercase n tilde\n  127: 9608,\n  // 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  128: 174,\n  // Registered symbol (R)\n  129: 176,\n  // degree sign\n  130: 189,\n  // 1/2 symbol\n  131: 191,\n  // Inverted (open) question mark\n  132: 8482,\n  // Trademark symbol (TM)\n  133: 162,\n  // Cents symbol\n  134: 163,\n  // Pounds sterling\n  135: 9834,\n  // Music 8'th note\n  136: 224,\n  // lowercase a, grave accent\n  137: 32,\n  // transparent space (regular)\n  138: 232,\n  // lowercase e, grave accent\n  139: 226,\n  // lowercase a, circumflex accent\n  140: 234,\n  // lowercase e, circumflex accent\n  141: 238,\n  // lowercase i, circumflex accent\n  142: 244,\n  // lowercase o, circumflex accent\n  143: 251,\n  // 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  144: 193,\n  // capital letter A with acute\n  145: 201,\n  // capital letter E with acute\n  146: 211,\n  // capital letter O with acute\n  147: 218,\n  // capital letter U with acute\n  148: 220,\n  // capital letter U with diaresis\n  149: 252,\n  // lowercase letter U with diaeresis\n  150: 8216,\n  // opening single quote\n  151: 161,\n  // inverted exclamation mark\n  152: 42,\n  // asterisk\n  153: 8217,\n  // closing single quote\n  154: 9473,\n  // box drawings heavy horizontal\n  155: 169,\n  // copyright sign\n  156: 8480,\n  // Service mark\n  157: 8226,\n  // (round) bullet\n  158: 8220,\n  // Left double quotation mark\n  159: 8221,\n  // Right double quotation mark\n  160: 192,\n  // uppercase A, grave accent\n  161: 194,\n  // uppercase A, circumflex\n  162: 199,\n  // uppercase C with cedilla\n  163: 200,\n  // uppercase E, grave accent\n  164: 202,\n  // uppercase E, circumflex\n  165: 203,\n  // capital letter E with diaresis\n  166: 235,\n  // lowercase letter e with diaresis\n  167: 206,\n  // uppercase I, circumflex\n  168: 207,\n  // uppercase I, with diaresis\n  169: 239,\n  // lowercase i, with diaresis\n  170: 212,\n  // uppercase O, circumflex\n  171: 217,\n  // uppercase U, grave accent\n  172: 249,\n  // lowercase u, grave accent\n  173: 219,\n  // uppercase U, circumflex\n  174: 171,\n  // left-pointing double angle quotation mark\n  175: 187,\n  // 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  176: 195,\n  // Uppercase A, tilde\n  177: 227,\n  // Lowercase a, tilde\n  178: 205,\n  // Uppercase I, acute accent\n  179: 204,\n  // Uppercase I, grave accent\n  180: 236,\n  // Lowercase i, grave accent\n  181: 210,\n  // Uppercase O, grave accent\n  182: 242,\n  // Lowercase o, grave accent\n  183: 213,\n  // Uppercase O, tilde\n  184: 245,\n  // Lowercase o, tilde\n  185: 123,\n  // Open curly brace\n  186: 125,\n  // Closing curly brace\n  187: 92,\n  // Backslash\n  188: 94,\n  // Caret\n  189: 95,\n  // Underscore\n  190: 124,\n  // Pipe (vertical line)\n  191: 8764,\n  // Tilde operator\n  192: 196,\n  // Uppercase A, umlaut\n  193: 228,\n  // Lowercase A, umlaut\n  194: 214,\n  // Uppercase O, umlaut\n  195: 246,\n  // Lowercase o, umlaut\n  196: 223,\n  // Esszett (sharp S)\n  197: 165,\n  // Yen symbol\n  198: 164,\n  // Generic currency sign\n  199: 9475,\n  // Box drawings heavy vertical\n  200: 197,\n  // Uppercase A, ring\n  201: 229,\n  // Lowercase A, ring\n  202: 216,\n  // Uppercase O, stroke\n  203: 248,\n  // Lowercase o, strok\n  204: 9487,\n  // Box drawings heavy down and right\n  205: 9491,\n  // Box drawings heavy down and left\n  206: 9495,\n  // Box drawings heavy up and right\n  207: 9499\n  // Box drawings heavy up and left\n};\nconst getCharForByte = function getCharForByte2(byte) {\n  let charCode = byte;\n  if (specialCea608CharsCodes.hasOwnProperty(byte)) {\n    charCode = specialCea608CharsCodes[byte];\n  }\n  return String.fromCharCode(charCode);\n};\nconst NR_ROWS = 15;\nconst NR_COLS = 100;\nconst rowsLowCh1 = {\n  17: 1,\n  18: 3,\n  21: 5,\n  22: 7,\n  23: 9,\n  16: 11,\n  19: 12,\n  20: 14\n};\nconst rowsHighCh1 = {\n  17: 2,\n  18: 4,\n  21: 6,\n  22: 8,\n  23: 10,\n  19: 13,\n  20: 15\n};\nconst rowsLowCh2 = {\n  25: 1,\n  26: 3,\n  29: 5,\n  30: 7,\n  31: 9,\n  24: 11,\n  27: 12,\n  28: 14\n};\nconst rowsHighCh2 = {\n  25: 2,\n  26: 4,\n  29: 6,\n  30: 8,\n  31: 10,\n  27: 13,\n  28: 15\n};\nconst backgroundColors = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\", \"black\", \"transparent\"];\nclass CaptionsLogger {\n  constructor() {\n    this.time = null;\n    this.verboseLevel = 0;\n  }\n  log(severity, msg) {\n    if (this.verboseLevel >= severity) {\n      const m = typeof msg === \"function\" ? msg() : msg;\n      logger.log(`${this.time} [${severity}] ${m}`);\n    }\n  }\n}\nconst numArrayToHexArray = function numArrayToHexArray2(numArray) {\n  const hexArray = [];\n  for (let j = 0; j < numArray.length; j++) {\n    hexArray.push(numArray[j].toString(16));\n  }\n  return hexArray;\n};\nclass PenState {\n  constructor() {\n    this.foreground = \"white\";\n    this.underline = false;\n    this.italics = false;\n    this.background = \"black\";\n    this.flash = 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  setStyles(styles) {\n    const attribs = [\"foreground\", \"underline\", \"italics\", \"background\", \"flash\"];\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  isDefault() {\n    return this.foreground === \"white\" && !this.underline && !this.italics && this.background === \"black\" && !this.flash;\n  }\n  equals(other) {\n    return this.foreground === other.foreground && this.underline === other.underline && this.italics === other.italics && this.background === other.background && this.flash === other.flash;\n  }\n  copy(newPenState) {\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  toString() {\n    return \"color=\" + this.foreground + \", underline=\" + this.underline + \", italics=\" + this.italics + \", background=\" + this.background + \", flash=\" + this.flash;\n  }\n}\nclass StyledUnicodeChar {\n  constructor() {\n    this.uchar = \" \";\n    this.penState = new PenState();\n  }\n  reset() {\n    this.uchar = \" \";\n    this.penState.reset();\n  }\n  setChar(uchar, newPenState) {\n    this.uchar = uchar;\n    this.penState.copy(newPenState);\n  }\n  setPenState(newPenState) {\n    this.penState.copy(newPenState);\n  }\n  equals(other) {\n    return this.uchar === other.uchar && this.penState.equals(other.penState);\n  }\n  copy(newChar) {\n    this.uchar = newChar.uchar;\n    this.penState.copy(newChar.penState);\n  }\n  isEmpty() {\n    return this.uchar === \" \" && this.penState.isDefault();\n  }\n}\nclass Row {\n  constructor(logger2) {\n    this.chars = [];\n    this.pos = 0;\n    this.currPenState = new PenState();\n    this.cueStartTime = null;\n    this.logger = void 0;\n    for (let i = 0; i < NR_COLS; i++) {\n      this.chars.push(new StyledUnicodeChar());\n    }\n    this.logger = logger2;\n  }\n  equals(other) {\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  copy(other) {\n    for (let i = 0; i < NR_COLS; i++) {\n      this.chars[i].copy(other.chars[i]);\n    }\n  }\n  isEmpty() {\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   *  Set the cursor to a valid column.\n   */\n  setCursor(absPos) {\n    if (this.pos !== absPos) {\n      this.pos = absPos;\n    }\n    if (this.pos < 0) {\n      this.logger.log(3, \"Negative cursor position \" + this.pos);\n      this.pos = 0;\n    } else if (this.pos > NR_COLS) {\n      this.logger.log(3, \"Too large cursor position \" + this.pos);\n      this.pos = NR_COLS;\n    }\n  }\n  /**\n   * Move the cursor relative to current position.\n   */\n  moveCursor(relPos) {\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   * 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  insertChar(byte) {\n    if (byte >= 144) {\n      this.backSpace();\n    }\n    const char = getCharForByte(byte);\n    if (this.pos >= NR_COLS) {\n      this.logger.log(0, () => \"Cannot insert \" + byte.toString(16) + \" (\" + char + \") at position \" + this.pos + \". Skipping it!\");\n      return;\n    }\n    this.chars[this.pos].setChar(char, this.currPenState);\n    this.moveCursor(1);\n  }\n  clearFromPos(startPos) {\n    let i;\n    for (i = startPos; i < NR_COLS; i++) {\n      this.chars[i].reset();\n    }\n  }\n  clear() {\n    this.clearFromPos(0);\n    this.pos = 0;\n    this.currPenState.reset();\n  }\n  clearToEndOfRow() {\n    this.clearFromPos(this.pos);\n  }\n  getTextString() {\n    const chars = [];\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      chars.push(char);\n    }\n    if (empty) {\n      return \"\";\n    } else {\n      return chars.join(\"\");\n    }\n  }\n  setPenStyles(styles) {\n    this.currPenState.setStyles(styles);\n    const currChar = this.chars[this.pos];\n    currChar.setPenState(this.currPenState);\n  }\n}\nclass CaptionScreen {\n  constructor(logger2) {\n    this.rows = [];\n    this.currRow = NR_ROWS - 1;\n    this.nrRollUpRows = null;\n    this.lastOutputScreen = null;\n    this.logger = void 0;\n    for (let i = 0; i < NR_ROWS; i++) {\n      this.rows.push(new Row(logger2));\n    }\n    this.logger = logger2;\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  equals(other) {\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  copy(other) {\n    for (let i = 0; i < NR_ROWS; i++) {\n      this.rows[i].copy(other.rows[i]);\n    }\n  }\n  isEmpty() {\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  backSpace() {\n    const row = this.rows[this.currRow];\n    row.backSpace();\n  }\n  clearToEndOfRow() {\n    const row = this.rows[this.currRow];\n    row.clearToEndOfRow();\n  }\n  /**\n   * Insert a character (without styling) in the current row.\n   */\n  insertChar(char) {\n    const row = this.rows[this.currRow];\n    row.insertChar(char);\n  }\n  setPen(styles) {\n    const row = this.rows[this.currRow];\n    row.setPenStyles(styles);\n  }\n  moveCursor(relPos) {\n    const row = this.rows[this.currRow];\n    row.moveCursor(relPos);\n  }\n  setCursor(absPos) {\n    this.logger.log(2, \"setCursor: \" + absPos);\n    const row = this.rows[this.currRow];\n    row.setCursor(absPos);\n  }\n  setPAC(pacData) {\n    this.logger.log(2, () => \"pacData = \" + JSON.stringify(pacData));\n    let newRow = pacData.row - 1;\n    if (this.nrRollUpRows && newRow < this.nrRollUpRows - 1) {\n      newRow = this.nrRollUpRows - 1;\n    }\n    if (this.nrRollUpRows && this.currRow !== newRow) {\n      for (let i = 0; i < NR_ROWS; i++) {\n        this.rows[i].clear();\n      }\n      const topRowIndex = this.currRow + 1 - this.nrRollUpRows;\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(lastOutputScreen.rows[topRowIndex + i]);\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 = {\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   * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility).\n   */\n  setBkgData(bkgData) {\n    this.logger.log(2, () => \"bkgData = \" + JSON.stringify(bkgData));\n    this.backSpace();\n    this.setPen(bkgData);\n    this.insertChar(32);\n  }\n  setRollUpRows(nrRows) {\n    this.nrRollUpRows = nrRows;\n  }\n  rollUp() {\n    if (this.nrRollUpRows === null) {\n      this.logger.log(3, \"roll_up but nrRollUpRows not set yet\");\n      return;\n    }\n    this.logger.log(1, () => 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(2, \"Rolling up\");\n  }\n  /**\n   * Get all non-empty rows with as unicode text.\n   */\n  getDisplayText(asOneRow) {\n    asOneRow = asOneRow || false;\n    const displayText = [];\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  getTextAndFormat() {\n    return this.rows;\n  }\n}\nclass Cea608Channel {\n  constructor(channelNumber, outputFilter, logger2) {\n    this.chNr = void 0;\n    this.outputFilter = void 0;\n    this.mode = void 0;\n    this.verbose = void 0;\n    this.displayedMemory = void 0;\n    this.nonDisplayedMemory = void 0;\n    this.lastOutputScreen = void 0;\n    this.currRollUpRow = void 0;\n    this.writeScreen = void 0;\n    this.cueStartTime = void 0;\n    this.logger = void 0;\n    this.chNr = channelNumber;\n    this.outputFilter = outputFilter;\n    this.mode = null;\n    this.verbose = 0;\n    this.displayedMemory = new CaptionScreen(logger2);\n    this.nonDisplayedMemory = new CaptionScreen(logger2);\n    this.lastOutputScreen = new CaptionScreen(logger2);\n    this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1];\n    this.writeScreen = this.displayedMemory;\n    this.mode = null;\n    this.cueStartTime = null;\n    this.logger = logger2;\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  getHandler() {\n    return this.outputFilter;\n  }\n  setHandler(newHandler) {\n    this.outputFilter = newHandler;\n  }\n  setPAC(pacData) {\n    this.writeScreen.setPAC(pacData);\n  }\n  setBkgData(bkgData) {\n    this.writeScreen.setBkgData(bkgData);\n  }\n  setMode(newMode) {\n    if (newMode === this.mode) {\n      return;\n    }\n    this.mode = newMode;\n    this.logger.log(2, () => \"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  insertChars(chars) {\n    for (let i = 0; i < chars.length; i++) {\n      this.writeScreen.insertChar(chars[i]);\n    }\n    const screen = this.writeScreen === this.displayedMemory ? \"DISP\" : \"NON_DISP\";\n    this.logger.log(2, () => screen + \": \" + this.writeScreen.getDisplayText(true));\n    if (this.mode === \"MODE_PAINT-ON\" || this.mode === \"MODE_ROLL-UP\") {\n      this.logger.log(1, () => \"DISPLAYED: \" + this.displayedMemory.getDisplayText(true));\n      this.outputDataUpdate();\n    }\n  }\n  ccRCL() {\n    this.logger.log(2, \"RCL - Resume Caption Loading\");\n    this.setMode(\"MODE_POP-ON\");\n  }\n  ccBS() {\n    this.logger.log(2, \"BS - BackSpace\");\n    if (this.mode === \"MODE_TEXT\") {\n      return;\n    }\n    this.writeScreen.backSpace();\n    if (this.writeScreen === this.displayedMemory) {\n      this.outputDataUpdate();\n    }\n  }\n  ccAOF() {\n  }\n  ccAON() {\n  }\n  ccDER() {\n    this.logger.log(2, \"DER- Delete to End of Row\");\n    this.writeScreen.clearToEndOfRow();\n    this.outputDataUpdate();\n  }\n  ccRU(nrRows) {\n    this.logger.log(2, \"RU(\" + nrRows + \") - Roll Up\");\n    this.writeScreen = this.displayedMemory;\n    this.setMode(\"MODE_ROLL-UP\");\n    this.writeScreen.setRollUpRows(nrRows);\n  }\n  ccFON() {\n    this.logger.log(2, \"FON - Flash On\");\n    this.writeScreen.setPen({\n      flash: true\n    });\n  }\n  ccRDC() {\n    this.logger.log(2, \"RDC - Resume Direct Captioning\");\n    this.setMode(\"MODE_PAINT-ON\");\n  }\n  ccTR() {\n    this.logger.log(2, \"TR\");\n    this.setMode(\"MODE_TEXT\");\n  }\n  ccRTD() {\n    this.logger.log(2, \"RTD\");\n    this.setMode(\"MODE_TEXT\");\n  }\n  ccEDM() {\n    this.logger.log(2, \"EDM - Erase Displayed Memory\");\n    this.displayedMemory.reset();\n    this.outputDataUpdate(true);\n  }\n  ccCR() {\n    this.logger.log(2, \"CR - Carriage Return\");\n    this.writeScreen.rollUp();\n    this.outputDataUpdate(true);\n  }\n  ccENM() {\n    this.logger.log(2, \"ENM - Erase Non-displayed Memory\");\n    this.nonDisplayedMemory.reset();\n  }\n  ccEOC() {\n    this.logger.log(2, \"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(1, () => \"DISP: \" + this.displayedMemory.getDisplayText());\n    }\n    this.outputDataUpdate(true);\n  }\n  ccTO(nrCols) {\n    this.logger.log(2, \"TO(\" + nrCols + \") - Tab Offset\");\n    this.writeScreen.moveCursor(nrCols);\n  }\n  ccMIDROW(secondByte) {\n    const styles = {\n      flash: false\n    };\n    styles.underline = secondByte % 2 === 1;\n    styles.italics = secondByte >= 46;\n    if (!styles.italics) {\n      const colorIndex = Math.floor(secondByte / 2) - 16;\n      const colors = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\"];\n      styles.foreground = colors[colorIndex];\n    } else {\n      styles.foreground = \"white\";\n    }\n    this.logger.log(2, \"MIDROW: \" + JSON.stringify(styles));\n    this.writeScreen.setPen(styles);\n  }\n  outputDataUpdate(dispatch = false) {\n    const time = this.logger.time;\n    if (time === null) {\n      return;\n    }\n    if (this.outputFilter) {\n      if (this.cueStartTime === null && !this.displayedMemory.isEmpty()) {\n        this.cueStartTime = time;\n      } else {\n        if (!this.displayedMemory.equals(this.lastOutputScreen)) {\n          this.outputFilter.newCue(this.cueStartTime, time, this.lastOutputScreen);\n          if (dispatch && this.outputFilter.dispatchCue) {\n            this.outputFilter.dispatchCue();\n          }\n          this.cueStartTime = this.displayedMemory.isEmpty() ? null : time;\n        }\n      }\n      this.lastOutputScreen.copy(this.displayedMemory);\n    }\n  }\n  cueSplitAtTime(t) {\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        this.cueStartTime = t;\n      }\n    }\n  }\n}\nclass Cea608Parser {\n  constructor(field, out1, out2) {\n    this.channels = void 0;\n    this.currentChannel = 0;\n    this.cmdHistory = createCmdHistory();\n    this.logger = void 0;\n    const logger2 = this.logger = new CaptionsLogger();\n    this.channels = [null, new Cea608Channel(field, out1, logger2), new Cea608Channel(field + 1, out2, logger2)];\n  }\n  getHandler(channel) {\n    return this.channels[channel].getHandler();\n  }\n  setHandler(channel, newHandler) {\n    this.channels[channel].setHandler(newHandler);\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, byteList) {\n    let cmdFound;\n    let a;\n    let b;\n    let charsFound = false;\n    this.logger.time = time;\n    for (let i = 0; i < byteList.length; i += 2) {\n      a = byteList[i] & 127;\n      b = byteList[i + 1] & 127;\n      if (a === 0 && b === 0) {\n        continue;\n      } else {\n        this.logger.log(3, \"[\" + numArrayToHexArray([byteList[i], byteList[i + 1]]) + \"] -> (\" + numArrayToHexArray([a, b]) + \")\");\n      }\n      cmdFound = this.parseCmd(a, b);\n      if (!cmdFound) {\n        cmdFound = this.parseMidrow(a, b);\n      }\n      if (!cmdFound) {\n        cmdFound = this.parsePAC(a, b);\n      }\n      if (!cmdFound) {\n        cmdFound = this.parseBackgroundAttributes(a, b);\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];\n            channel.insertChars(charsFound);\n          } else {\n            this.logger.log(2, \"No channel found yet. TEXT-MODE?\");\n          }\n        }\n      }\n      if (!cmdFound && !charsFound) {\n        this.logger.log(2, \"Couldn't parse cleaned data \" + numArrayToHexArray([a, b]) + \" orig: \" + numArrayToHexArray([byteList[i], byteList[i + 1]]));\n      }\n    }\n  }\n  /**\n   * Parse Command.\n   * @returns True if a command was found\n   */\n  parseCmd(a, b) {\n    const {\n      cmdHistory\n    } = this;\n    const cond1 = (a === 20 || a === 28 || a === 21 || a === 29) && b >= 32 && b <= 47;\n    const cond2 = (a === 23 || a === 31) && b >= 33 && b <= 35;\n    if (!(cond1 || cond2)) {\n      return false;\n    }\n    if (hasCmdRepeated(a, b, cmdHistory)) {\n      setLastCmd(null, null, cmdHistory);\n      this.logger.log(3, \"Repeated command (\" + numArrayToHexArray([a, b]) + \") is dropped\");\n      return true;\n    }\n    const chNr = a === 20 || a === 21 || a === 23 ? 1 : 2;\n    const channel = this.channels[chNr];\n    if (a === 20 || a === 21 || a === 28 || a === 29) {\n      if (b === 32) {\n        channel.ccRCL();\n      } else if (b === 33) {\n        channel.ccBS();\n      } else if (b === 34) {\n        channel.ccAOF();\n      } else if (b === 35) {\n        channel.ccAON();\n      } else if (b === 36) {\n        channel.ccDER();\n      } else if (b === 37) {\n        channel.ccRU(2);\n      } else if (b === 38) {\n        channel.ccRU(3);\n      } else if (b === 39) {\n        channel.ccRU(4);\n      } else if (b === 40) {\n        channel.ccFON();\n      } else if (b === 41) {\n        channel.ccRDC();\n      } else if (b === 42) {\n        channel.ccTR();\n      } else if (b === 43) {\n        channel.ccRTD();\n      } else if (b === 44) {\n        channel.ccEDM();\n      } else if (b === 45) {\n        channel.ccCR();\n      } else if (b === 46) {\n        channel.ccENM();\n      } else if (b === 47) {\n        channel.ccEOC();\n      }\n    } else {\n      channel.ccTO(b - 32);\n    }\n    setLastCmd(a, b, cmdHistory);\n    this.currentChannel = chNr;\n    return true;\n  }\n  /**\n   * Parse midrow styling command\n   */\n  parseMidrow(a, b) {\n    let chNr = 0;\n    if ((a === 17 || a === 25) && b >= 32 && b <= 47) {\n      if (a === 17) {\n        chNr = 1;\n      } else {\n        chNr = 2;\n      }\n      if (chNr !== this.currentChannel) {\n        this.logger.log(0, \"Mismatch channel in midrow parsing\");\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(3, \"MIDROW (\" + numArrayToHexArray([a, b]) + \")\");\n      return true;\n    }\n    return false;\n  }\n  /**\n   * Parse Preable Access Codes (Table 53).\n   * @returns {Boolean} Tells if PAC found\n   */\n  parsePAC(a, b) {\n    let row;\n    const cmdHistory = this.cmdHistory;\n    const case1 = (a >= 17 && a <= 23 || a >= 25 && a <= 31) && b >= 64 && b <= 127;\n    const case2 = (a === 16 || a === 24) && b >= 64 && b <= 95;\n    if (!(case1 || case2)) {\n      return false;\n    }\n    if (hasCmdRepeated(a, b, cmdHistory)) {\n      setLastCmd(null, null, cmdHistory);\n      return true;\n    }\n    const chNr = a <= 23 ? 1 : 2;\n    if (b >= 64 && b <= 95) {\n      row = chNr === 1 ? rowsLowCh1[a] : rowsLowCh2[a];\n    } else {\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    setLastCmd(a, b, cmdHistory);\n    this.currentChannel = chNr;\n    return true;\n  }\n  /**\n   * Interpret the second byte of the pac, and return the information.\n   * @returns pacData with style parameters\n   */\n  interpretPAC(row, byte) {\n    let pacIndex;\n    const pacData = {\n      color: null,\n      italics: false,\n      indent: null,\n      underline: false,\n      row\n    };\n    if (byte > 95) {\n      pacIndex = byte - 96;\n    } else {\n      pacIndex = byte - 64;\n    }\n    pacData.underline = (pacIndex & 1) === 1;\n    if (pacIndex <= 13) {\n      pacData.color = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\", \"white\"][Math.floor(pacIndex / 2)];\n    } else if (pacIndex <= 15) {\n      pacData.italics = true;\n      pacData.color = \"white\";\n    } else {\n      pacData.indent = Math.floor((pacIndex - 16) / 2) * 4;\n    }\n    return pacData;\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, b) {\n    let channelNr;\n    let charCodes = null;\n    let charCode1 = null;\n    if (a >= 25) {\n      channelNr = 2;\n      charCode1 = a - 8;\n    } else {\n      channelNr = 1;\n      charCode1 = a;\n    }\n    if (charCode1 >= 17 && charCode1 <= 19) {\n      let oneCode;\n      if (charCode1 === 17) {\n        oneCode = b + 80;\n      } else if (charCode1 === 18) {\n        oneCode = b + 112;\n      } else {\n        oneCode = b + 144;\n      }\n      this.logger.log(2, \"Special char '\" + getCharForByte(oneCode) + \"' in channel \" + channelNr);\n      charCodes = [oneCode];\n    } else if (a >= 32 && a <= 127) {\n      charCodes = b === 0 ? [a] : [a, b];\n    }\n    if (charCodes) {\n      const hexCodes = numArrayToHexArray(charCodes);\n      this.logger.log(3, \"Char codes =  \" + hexCodes.join(\",\"));\n      setLastCmd(a, b, this.cmdHistory);\n    }\n    return charCodes;\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, b) {\n    const case1 = (a === 16 || a === 24) && b >= 32 && b <= 47;\n    const case2 = (a === 23 || a === 31) && b >= 45 && b <= 47;\n    if (!(case1 || case2)) {\n      return false;\n    }\n    let index;\n    const bkgData = {};\n    if (a === 16 || a === 24) {\n      index = Math.floor((b - 32) / 2);\n      bkgData.background = backgroundColors[index];\n      if (b % 2 === 1) {\n        bkgData.background = bkgData.background + \"_semi\";\n      }\n    } else if (b === 45) {\n      bkgData.background = \"transparent\";\n    } else {\n      bkgData.foreground = \"black\";\n      if (b === 47) {\n        bkgData.underline = true;\n      }\n    }\n    const chNr = a <= 23 ? 1 : 2;\n    const channel = this.channels[chNr];\n    channel.setBkgData(bkgData);\n    setLastCmd(a, b, this.cmdHistory);\n    return true;\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    this.cmdHistory = createCmdHistory();\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) {\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}\nfunction setLastCmd(a, b, cmdHistory) {\n  cmdHistory.a = a;\n  cmdHistory.b = b;\n}\nfunction hasCmdRepeated(a, b, cmdHistory) {\n  return cmdHistory.a === a && cmdHistory.b === b;\n}\nfunction createCmdHistory() {\n  return {\n    a: null,\n    b: null\n  };\n}\nclass OutputFilter {\n  constructor(timelineController, trackName) {\n    this.timelineController = void 0;\n    this.cueRanges = [];\n    this.trackName = void 0;\n    this.startTime = null;\n    this.endTime = null;\n    this.screen = null;\n    this.timelineController = timelineController;\n    this.trackName = trackName;\n  }\n  dispatchCue() {\n    if (this.startTime === null) {\n      return;\n    }\n    this.timelineController.addCues(this.trackName, this.startTime, this.endTime, this.screen, this.cueRanges);\n    this.startTime = null;\n  }\n  newCue(startTime, endTime, screen) {\n    if (this.startTime === null || this.startTime > startTime) {\n      this.startTime = startTime;\n    }\n    this.endTime = endTime;\n    this.screen = screen;\n    this.timelineController.createCaptionsTrack(this.trackName);\n  }\n  reset() {\n    this.cueRanges = [];\n    this.startTime = null;\n  }\n}\nvar VTTCue = function() {\n  if (optionalSelf != null && optionalSelf.VTTCue) {\n    return self.VTTCue;\n  }\n  const AllowedDirections = [\"\", \"lr\", \"rl\"];\n  const AllowedAlignments = [\"start\", \"middle\", \"end\", \"left\", \"right\"];\n  function isAllowedValue(allowed, value) {\n    if (typeof value !== \"string\") {\n      return false;\n    }\n    if (!Array.isArray(allowed)) {\n      return false;\n    }\n    const lcValue = value.toLowerCase();\n    if (~allowed.indexOf(lcValue)) {\n      return lcValue;\n    }\n    return false;\n  }\n  function findDirectionSetting(value) {\n    return isAllowedValue(AllowedDirections, value);\n  }\n  function findAlignSetting(value) {\n    return isAllowedValue(AllowedAlignments, value);\n  }\n  function extend(obj, ...rest) {\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    return obj;\n  }\n  function VTTCue2(startTime, endTime, text) {\n    const cue = this;\n    const baseObj = {\n      enumerable: true\n    };\n    cue.hasBeenReset = false;\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 = \"\";\n    let _snapToLines = true;\n    let _line = \"auto\";\n    let _lineAlign = \"start\";\n    let _position = 50;\n    let _positionAlign = \"middle\";\n    let _size = 50;\n    let _align = \"middle\";\n    Object.defineProperty(cue, \"id\", extend({}, baseObj, {\n      get: function() {\n        return _id;\n      },\n      set: function(value) {\n        _id = \"\" + value;\n      }\n    }));\n    Object.defineProperty(cue, \"pauseOnExit\", extend({}, baseObj, {\n      get: function() {\n        return _pauseOnExit;\n      },\n      set: function(value) {\n        _pauseOnExit = !!value;\n      }\n    }));\n    Object.defineProperty(cue, \"startTime\", extend({}, baseObj, {\n      get: function() {\n        return _startTime;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"Start time must be set to a number.\");\n        }\n        _startTime = value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"endTime\", extend({}, baseObj, {\n      get: function() {\n        return _endTime;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"End time must be set to a number.\");\n        }\n        _endTime = value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"text\", extend({}, baseObj, {\n      get: function() {\n        return _text;\n      },\n      set: function(value) {\n        _text = \"\" + value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"region\", extend({}, baseObj, {\n      get: function() {\n        return _region;\n      },\n      set: function(value) {\n        _region = value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"vertical\", extend({}, baseObj, {\n      get: function() {\n        return _vertical;\n      },\n      set: function(value) {\n        const setting = findDirectionSetting(value);\n        if (setting === false) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _vertical = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"snapToLines\", extend({}, baseObj, {\n      get: function() {\n        return _snapToLines;\n      },\n      set: function(value) {\n        _snapToLines = !!value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"line\", extend({}, baseObj, {\n      get: function() {\n        return _line;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\" && value !== \"auto\") {\n          throw new SyntaxError(\"An invalid number or illegal string was specified.\");\n        }\n        _line = value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"lineAlign\", extend({}, baseObj, {\n      get: function() {\n        return _lineAlign;\n      },\n      set: function(value) {\n        const setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _lineAlign = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"position\", extend({}, baseObj, {\n      get: function() {\n        return _position;\n      },\n      set: function(value) {\n        if (value < 0 || value > 100) {\n          throw new Error(\"Position must be between 0 and 100.\");\n        }\n        _position = value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"positionAlign\", extend({}, baseObj, {\n      get: function() {\n        return _positionAlign;\n      },\n      set: function(value) {\n        const setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _positionAlign = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"size\", extend({}, baseObj, {\n      get: function() {\n        return _size;\n      },\n      set: function(value) {\n        if (value < 0 || value > 100) {\n          throw new Error(\"Size must be between 0 and 100.\");\n        }\n        _size = value;\n        this.hasBeenReset = true;\n      }\n    }));\n    Object.defineProperty(cue, \"align\", extend({}, baseObj, {\n      get: function() {\n        return _align;\n      },\n      set: function(value) {\n        const setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _align = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n    cue.displayState = void 0;\n  }\n  VTTCue2.prototype.getCueAsHTML = function() {\n    const WebVTT = self.WebVTT;\n    return WebVTT.convertCueToDOMTree(self, this.text);\n  };\n  return VTTCue2;\n}();\nclass StringDecoder {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  decode(data, options) {\n    if (!data) {\n      return \"\";\n    }\n    if (typeof data !== \"string\") {\n      throw new Error(\"Error - expected string data.\");\n    }\n    return decodeURIComponent(encodeURIComponent(data));\n  }\n}\nfunction parseTimeStamp(input) {\n  function computeSeconds(h, m2, s, f) {\n    return (h | 0) * 3600 + (m2 | 0) * 60 + (s | 0) + parseFloat(f || 0);\n  }\n  const m = input.match(/^(?:(\\d+):)?(\\d{2}):(\\d{2})(\\.\\d+)?/);\n  if (!m) {\n    return null;\n  }\n  if (parseFloat(m[2]) > 59) {\n    return computeSeconds(m[2], m[3], 0, m[4]);\n  }\n  return computeSeconds(m[1], m[2], m[3], m[4]);\n}\nclass Settings {\n  constructor() {\n    this.values = /* @__PURE__ */ Object.create(null);\n  }\n  // Only accept the first assignment to any key.\n  set(k, v) {\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, dflt, defaultKey) {\n    if (defaultKey) {\n      return this.has(k) ? this.values[k] : dflt[defaultKey];\n    }\n    return this.has(k) ? this.values[k] : dflt;\n  }\n  // Check whether we have a value for a key.\n  has(k) {\n    return k in this.values;\n  }\n  // Accept a setting if its one of the given alternatives.\n  alt(k, v, a) {\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, v) {\n    if (/^-?\\d+$/.test(v)) {\n      this.set(k, parseInt(v, 10));\n    }\n  }\n  // Accept a setting if its a valid percentage.\n  percent(k, v) {\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}\nfunction parseOptions(input, callback, keyValueDelim, groupDelim) {\n  const groups = groupDelim ? input.split(groupDelim) : [input];\n  for (const i in groups) {\n    if (typeof groups[i] !== \"string\") {\n      continue;\n    }\n    const kv = groups[i].split(keyValueDelim);\n    if (kv.length !== 2) {\n      continue;\n    }\n    const k = kv[0];\n    const v = kv[1];\n    callback(k, v);\n  }\n}\nconst defaults = new VTTCue(0, 0, \"\");\nconst center = defaults.align === \"middle\" ? \"middle\" : \"center\";\nfunction parseCue(input, cue, regionList) {\n  const oInput = input;\n  function consumeTimeStamp() {\n    const ts = parseTimeStamp(input);\n    if (ts === null) {\n      throw new Error(\"Malformed timestamp: \" + oInput);\n    }\n    input = input.replace(/^[^\\sa-zA-Z-]+/, \"\");\n    return ts;\n  }\n  function consumeCueSettings(input2, cue2) {\n    const settings = new Settings();\n    parseOptions(input2, function(k, v) {\n      let vals;\n      switch (k) {\n        case \"region\":\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          settings.alt(k, vals[0], [\"auto\"]);\n          if (vals.length === 2) {\n            settings.alt(\"lineAlign\", vals[1], [\"start\", center, \"end\"]);\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], [\"start\", center, \"end\", \"line-left\", \"line-right\", \"auto\"]);\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    }, /:/, /\\s/);\n    cue2.region = settings.get(\"region\", null);\n    cue2.vertical = settings.get(\"vertical\", \"\");\n    let line = settings.get(\"line\", \"auto\");\n    if (line === \"auto\" && defaults.line === -1) {\n      line = -1;\n    }\n    cue2.line = line;\n    cue2.lineAlign = settings.get(\"lineAlign\", \"start\");\n    cue2.snapToLines = settings.get(\"snapToLines\", true);\n    cue2.size = settings.get(\"size\", 100);\n    cue2.align = settings.get(\"align\", center);\n    let position = settings.get(\"position\", \"auto\");\n    if (position === \"auto\" && defaults.position === 50) {\n      position = cue2.align === \"start\" || cue2.align === \"left\" ? 0 : cue2.align === \"end\" || cue2.align === \"right\" ? 100 : 50;\n    }\n    cue2.position = position;\n  }\n  function skipWhitespace() {\n    input = input.replace(/^\\s+/, \"\");\n  }\n  skipWhitespace();\n  cue.startTime = consumeTimeStamp();\n  skipWhitespace();\n  if (input.slice(0, 3) !== \"-->\") {\n    throw new Error(\"Malformed time stamp (time stamps must be separated by '-->'): \" + oInput);\n  }\n  input = input.slice(3);\n  skipWhitespace();\n  cue.endTime = consumeTimeStamp();\n  skipWhitespace();\n  consumeCueSettings(input, cue);\n}\nfunction fixLineBreaks(input) {\n  return input.replace(/<br(?: \\/)?>/gi, \"\\n\");\n}\nclass VTTParser {\n  constructor() {\n    this.state = \"INITIAL\";\n    this.buffer = \"\";\n    this.decoder = new StringDecoder();\n    this.regionList = [];\n    this.cue = null;\n    this.oncue = void 0;\n    this.onparsingerror = void 0;\n    this.onflush = void 0;\n  }\n  parse(data) {\n    const _this = this;\n    if (data) {\n      _this.buffer += _this.decoder.decode(data, {\n        stream: true\n      });\n    }\n    function collectNextLine() {\n      let buffer = _this.buffer;\n      let pos = 0;\n      buffer = fixLineBreaks(buffer);\n      while (pos < buffer.length && buffer[pos] !== \"\\r\" && buffer[pos] !== \"\\n\") {\n        ++pos;\n      }\n      const line = buffer.slice(0, pos);\n      if (buffer[pos] === \"\\r\") {\n        ++pos;\n      }\n      if (buffer[pos] === \"\\n\") {\n        ++pos;\n      }\n      _this.buffer = buffer.slice(pos);\n      return line;\n    }\n    function parseHeader2(input) {\n      parseOptions(input, function(k, v) {\n      }, /:/);\n    }\n    try {\n      let line = \"\";\n      if (_this.state === \"INITIAL\") {\n        if (!/\\r\\n|\\n/.test(_this.buffer)) {\n          return this;\n        }\n        line = collectNextLine();\n        const m = line.match(/^(\u00EF\u00BB\u00BF)?WEBVTT([ \\t].*)?$/);\n        if (!(m != null && m[0])) {\n          throw new Error(\"Malformed WebVTT signature.\");\n        }\n        _this.state = \"HEADER\";\n      }\n      let alreadyCollectedLine = false;\n      while (_this.buffer) {\n        if (!/\\r\\n|\\n/.test(_this.buffer)) {\n          return this;\n        }\n        if (!alreadyCollectedLine) {\n          line = collectNextLine();\n        } else {\n          alreadyCollectedLine = false;\n        }\n        switch (_this.state) {\n          case \"HEADER\":\n            if (/:/.test(line)) {\n              parseHeader2(line);\n            } else if (!line) {\n              _this.state = \"ID\";\n            }\n            continue;\n          case \"NOTE\":\n            if (!line) {\n              _this.state = \"ID\";\n            }\n            continue;\n          case \"ID\":\n            if (/^NOTE($|[ \\t])/.test(line)) {\n              _this.state = \"NOTE\";\n              break;\n            }\n            if (!line) {\n              continue;\n            }\n            _this.cue = new VTTCue(0, 0, \"\");\n            _this.state = \"CUE\";\n            if (line.indexOf(\"-->\") === -1) {\n              _this.cue.id = line;\n              continue;\n            }\n          case \"CUE\":\n            if (!_this.cue) {\n              _this.state = \"BADCUE\";\n              continue;\n            }\n            try {\n              parseCue(line, _this.cue, _this.regionList);\n            } catch (e) {\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              if (!line || hasSubstring && (alreadyCollectedLine = true)) {\n                if (_this.oncue && _this.cue) {\n                  _this.oncue(_this.cue);\n                }\n                _this.cue = null;\n                _this.state = \"ID\";\n                continue;\n              }\n              if (_this.cue === null) {\n                continue;\n              }\n              if (_this.cue.text) {\n                _this.cue.text += \"\\n\";\n              }\n              _this.cue.text += line;\n            }\n            continue;\n          case \"BADCUE\":\n            if (!line) {\n              _this.state = \"ID\";\n            }\n        }\n      }\n    } catch (e) {\n      if (_this.state === \"CUETEXT\" && _this.cue && _this.oncue) {\n        _this.oncue(_this.cue);\n      }\n      _this.cue = null;\n      _this.state = _this.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n    }\n    return this;\n  }\n  flush() {\n    const _this = this;\n    try {\n      if (_this.cue || _this.state === \"HEADER\") {\n        _this.buffer += \"\\n\\n\";\n        _this.parse();\n      }\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    return this;\n  }\n}\nconst LINEBREAKS = /\\r\\n|\\n\\r|\\n|\\r/g;\nconst startsWith = function startsWith2(inputString, searchString, position = 0) {\n  return inputString.slice(position, position + searchString.length) === searchString;\n};\nconst cueString2millis = function cueString2millis2(timeString) {\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 = timeString.length > 9 ? parseInt(timeString.substring(0, timeString.indexOf(\":\"))) : 0;\n  if (!isFiniteNumber(ts) || !isFiniteNumber(secs) || !isFiniteNumber(mins) || !isFiniteNumber(hours)) {\n    throw Error(`Malformed X-TIMESTAMP-MAP: Local:${timeString}`);\n  }\n  ts += 1e3 * secs;\n  ts += 60 * 1e3 * mins;\n  ts += 60 * 60 * 1e3 * hours;\n  return ts;\n};\nconst hash = function hash2(text) {\n  let _hash = 5381;\n  let i = text.length;\n  while (i) {\n    _hash = _hash * 33 ^ text.charCodeAt(--i);\n  }\n  return (_hash >>> 0).toString();\n};\nfunction generateCueId(startTime, endTime, text) {\n  return hash(startTime.toString()) + hash(endTime.toString()) + hash(text);\n}\nconst calculateOffset = function calculateOffset2(vttCCs, cc, presentationTime) {\n  let currCC = vttCCs[cc];\n  let prevCC = vttCCs[currCC.prevCC];\n  if (!prevCC || !prevCC.new && currCC.new) {\n    vttCCs.ccOffset = vttCCs.presentationOffset = currCC.start;\n    currCC.new = false;\n    return;\n  }\n  while ((_prevCC = prevCC) != null && _prevCC.new) {\n    var _prevCC;\n    vttCCs.ccOffset += currCC.start - prevCC.start;\n    currCC.new = false;\n    currCC = prevCC;\n    prevCC = vttCCs[currCC.prevCC];\n  }\n  vttCCs.presentationOffset = presentationTime;\n};\nfunction parseWebVTT(vttByteArray, initPTS, vttCCs, cc, timeOffset, callBack, errorCallBack) {\n  const parser = new VTTParser();\n  const vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, \"\\n\").split(\"\\n\");\n  const cues = [];\n  const init90kHz = initPTS ? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale) : 0;\n  let cueTime = \"00:00.000\";\n  let timestampMapMPEGTS = 0;\n  let timestampMapLOCAL = 0;\n  let parsingError;\n  let inHeader = true;\n  parser.oncue = function(cue) {\n    const currCC = vttCCs[cc];\n    let cueOffset = vttCCs.ccOffset;\n    const webVttMpegTsMapOffset = (timestampMapMPEGTS - init90kHz) / 9e4;\n    if (currCC != null && currCC.new) {\n      if (timestampMapLOCAL !== void 0) {\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      cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;\n    }\n    const duration = cue.endTime - cue.startTime;\n    const startTime = normalizePts((cue.startTime + cueOffset - timestampMapLOCAL) * 9e4, timeOffset * 9e4) / 9e4;\n    cue.startTime = Math.max(startTime, 0);\n    cue.endTime = Math.max(startTime + duration, 0);\n    const text = cue.text.trim();\n    cue.text = decodeURIComponent(encodeURIComponent(text));\n    if (!cue.id) {\n      cue.id = generateCueId(cue.startTime, cue.endTime, text);\n    }\n    if (cue.endTime > 0) {\n      cues.push(cue);\n    }\n  };\n  parser.onparsingerror = function(error) {\n    parsingError = error;\n  };\n  parser.onflush = function() {\n    if (parsingError) {\n      errorCallBack(parsingError);\n      return;\n    }\n    callBack(cues);\n  };\n  vttLines.forEach((line) => {\n    if (inHeader) {\n      if (startsWith(line, \"X-TIMESTAMP-MAP=\")) {\n        inHeader = false;\n        line.slice(16).split(\",\").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          timestampMapLOCAL = cueString2millis(cueTime) / 1e3;\n        } catch (error) {\n          parsingError = error;\n        }\n        return;\n      } else if (line === \"\") {\n        inHeader = false;\n      }\n    }\n    parser.parse(line + \"\\n\");\n  });\n  parser.flush();\n}\nconst IMSC1_CODEC = \"stpp.ttml.im1t\";\nconst HMSF_REGEX = /^(\\d{2,}):(\\d{2}):(\\d{2}):(\\d{2})\\.?(\\d+)?$/;\nconst TIME_UNIT_REGEX = /^(\\d*(?:\\.\\d*)?)(h|m|s|ms|f|t)$/;\nconst textAlignToLineAlign = {\n  left: \"start\",\n  center: \"center\",\n  right: \"end\",\n  start: \"start\",\n  end: \"end\"\n};\nfunction parseIMSC1(payload, initPTS, callBack, errorCallBack) {\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  const ttmlList = results.map((mdat) => utf8ArrayToStr(mdat));\n  const syncTime = toTimescaleFromScale(initPTS.baseTime, 1, initPTS.timescale);\n  try {\n    ttmlList.forEach((ttml) => callBack(parseTTML(ttml, syncTime)));\n  } catch (error) {\n    errorCallBack(error);\n  }\n}\nfunction parseTTML(ttml, syncTime) {\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.keys(defaultRateInfo).reduce((result, key) => {\n    result[key] = tt.getAttribute(`ttp:${key}`) || defaultRateInfo[key];\n    return result;\n  }, {});\n  const trim = tt.getAttribute(\"xml:space\") !== \"preserve\";\n  const styleElements = collectionToDictionary(getElementCollection(tt, \"styling\", \"style\"));\n  const regionElements = collectionToDictionary(getElementCollection(tt, \"layout\", \"region\"));\n  const cueElements = getElementCollection(tt, \"body\", \"[begin]\");\n  return [].map.call(cueElements, (cueElement) => {\n    const cueText = getTextContent(cueElement, trim);\n    if (!cueText || !cueElement.hasAttribute(\"begin\")) {\n      return null;\n    }\n    const startTime = parseTtmlTime(cueElement.getAttribute(\"begin\"), rateInfo);\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    const region = regionElements[cueElement.getAttribute(\"region\")];\n    const style = styleElements[cueElement.getAttribute(\"style\")];\n    const styles = getTtmlStyles(region, style, styleElements);\n    const {\n      textAlign\n    } = styles;\n    if (textAlign) {\n      const lineAlign = textAlignToLineAlign[textAlign];\n      if (lineAlign) {\n        cue.lineAlign = lineAlign;\n      }\n      cue.align = textAlign;\n    }\n    _extends(cue, styles);\n    return cue;\n  }).filter((cue) => cue !== null);\n}\nfunction getElementCollection(fromElement, parentName, childName) {\n  const parent = fromElement.getElementsByTagName(parentName)[0];\n  if (parent) {\n    return [].slice.call(parent.querySelectorAll(childName));\n  }\n  return [];\n}\nfunction collectionToDictionary(elementsWithId) {\n  return elementsWithId.reduce((dict, element) => {\n    const id = element.getAttribute(\"xml:id\");\n    if (id) {\n      dict[id] = element;\n    }\n    return dict;\n  }, {});\n}\nfunction getTextContent(element, trim) {\n  return [].slice.call(element.childNodes).reduce((str, node, i) => {\n    var _node$childNodes;\n    if (node.nodeName === \"br\" && i) {\n      return str + \"\\n\";\n    }\n    if ((_node$childNodes = node.childNodes) != null && _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}\nfunction getTtmlStyles(region, style, styleElements) {\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  const regionStyleName = region != null && region.hasAttribute(\"style\") ? region.getAttribute(\"style\") : null;\n  if (regionStyleName && styleElements.hasOwnProperty(regionStyleName)) {\n    regionStyle = styleElements[regionStyleName];\n  }\n  return styleAttributes.reduce((styles, name) => {\n    const value = getAttributeNS(style, ttsNs, name) || getAttributeNS(region, ttsNs, name) || getAttributeNS(regionStyle, ttsNs, name);\n    if (value) {\n      styles[name] = value;\n    }\n    return styles;\n  }, {});\n}\nfunction getAttributeNS(element, ns, name) {\n  if (!element) {\n    return null;\n  }\n  return element.hasAttributeNS(ns, name) ? element.getAttributeNS(ns, name) : null;\n}\nfunction timestampParsingError(node) {\n  return new Error(`Could not parse ttml timestamp ${node}`);\n}\nfunction parseTtmlTime(timeAttributeValue, rateInfo) {\n  if (!timeAttributeValue) {\n    return null;\n  }\n  let seconds = 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}\nfunction parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo) {\n  const m = HMSF_REGEX.exec(timeAttributeValue);\n  const frames = (m[4] | 0) + (m[5] | 0) / rateInfo.subFrameRate;\n  return (m[1] | 0) * 3600 + (m[2] | 0) * 60 + (m[3] | 0) + frames / rateInfo.frameRate;\n}\nfunction parseTimeUnits(timeAttributeValue, rateInfo) {\n  const m = TIME_UNIT_REGEX.exec(timeAttributeValue);\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 * 1e3;\n    case \"f\":\n      return value / rateInfo.frameRate;\n    case \"t\":\n      return value / rateInfo.tickRate;\n  }\n  return value;\n}\nclass TimelineController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.media = null;\n    this.config = void 0;\n    this.enabled = true;\n    this.Cues = void 0;\n    this.textTracks = [];\n    this.tracks = [];\n    this.initPTS = [];\n    this.unparsedVttFrags = [];\n    this.captionsTracks = {};\n    this.nonNativeCaptionsTracks = {};\n    this.cea608Parser1 = void 0;\n    this.cea608Parser2 = void 0;\n    this.lastCc = -1;\n    this.lastSn = -1;\n    this.lastPartIndex = -1;\n    this.prevCC = -1;\n    this.vttCCs = newVTTCCs();\n    this.captionsProperties = void 0;\n    this.hls = hls;\n    this.config = hls.config;\n    this.Cues = hls.config.cueHandler;\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    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  destroy() {\n    const {\n      hls\n    } = 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    this.hls = this.config = null;\n    this.cea608Parser1 = this.cea608Parser2 = void 0;\n  }\n  initCea608Parsers() {\n    if (this.config.enableCEA708Captions && (!this.cea608Parser1 || !this.cea608Parser2)) {\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  addCues(trackName, startTime, endTime, screen, cueRanges) {\n    let merged = false;\n    for (let i = cueRanges.length; i--; ) {\n      const cueRange = cueRanges[i];\n      const overlap = intersection(cueRange[0], cueRange[1], startTime, endTime);\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    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  // Triggered when an initial PTS is found; used for synchronisation of WebVTT.\n  onInitPtsFound(event, {\n    frag,\n    id,\n    initPTS,\n    timescale\n  }) {\n    const {\n      unparsedVttFrags\n    } = this;\n    if (id === \"main\") {\n      this.initPTS[frag.cc] = {\n        baseTime: initPTS,\n        timescale\n      };\n    }\n    if (unparsedVttFrags.length) {\n      this.unparsedVttFrags = [];\n      unparsedVttFrags.forEach((frag2) => {\n        this.onFragLoaded(Events.FRAG_LOADED, frag2);\n      });\n    }\n  }\n  getExistingTrack(label, language) {\n    const {\n      media\n    } = this;\n    if (media) {\n      for (let i = 0; i < media.textTracks.length; i++) {\n        const textTrack = media.textTracks[i];\n        if (canReuseVttTextTrack(textTrack, {\n          name: label,\n          lang: language,\n          attrs: {}\n        })) {\n          return textTrack;\n        }\n      }\n    }\n    return null;\n  }\n  createCaptionsTrack(trackName) {\n    if (this.config.renderTextTracksNatively) {\n      this.createNativeTrack(trackName);\n    } else {\n      this.createNonNativeTrack(trackName);\n    }\n  }\n  createNativeTrack(trackName) {\n    if (this.captionsTracks[trackName]) {\n      return;\n    }\n    const {\n      captionsProperties,\n      captionsTracks,\n      media\n    } = this;\n    const {\n      label,\n      languageCode\n    } = captionsProperties[trackName];\n    const existingTrack = this.getExistingTrack(label, languageCode);\n    if (!existingTrack) {\n      const textTrack = this.createTextTrack(\"captions\", label, languageCode);\n      if (textTrack) {\n        textTrack[trackName] = true;\n        captionsTracks[trackName] = textTrack;\n      }\n    } else {\n      captionsTracks[trackName] = existingTrack;\n      clearCurrentCues(captionsTracks[trackName]);\n      sendAddTrackEvent(captionsTracks[trackName], media);\n    }\n  }\n  createNonNativeTrack(trackName) {\n    if (this.nonNativeCaptionsTracks[trackName]) {\n      return;\n    }\n    const trackProperties = this.captionsProperties[trackName];\n    if (!trackProperties) {\n      return;\n    }\n    const label = trackProperties.label;\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, {\n      tracks: [track]\n    });\n  }\n  createTextTrack(kind, label, lang) {\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    return media.addTextTrack(kind, label, lang);\n  }\n  onMediaAttaching(event, data) {\n    this.media = data.media;\n    this._cleanTracks();\n  }\n  onMediaDetaching() {\n    const {\n      captionsTracks\n    } = this;\n    Object.keys(captionsTracks).forEach((trackName) => {\n      clearCurrentCues(captionsTracks[trackName]);\n      delete captionsTracks[trackName];\n    });\n    this.nonNativeCaptionsTracks = {};\n  }\n  onManifestLoading() {\n    this.lastCc = -1;\n    this.lastSn = -1;\n    this.lastPartIndex = -1;\n    this.prevCC = -1;\n    this.vttCCs = newVTTCCs();\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  _cleanTracks() {\n    const {\n      media\n    } = 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  onSubtitleTracksUpdated(event, data) {\n    const tracks = 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      if (this.config.renderTextTracksNatively) {\n        const media = this.media;\n        const inUseTracks = media ? filterSubtitleTracks(media.textTracks) : null;\n        this.tracks.forEach((track, index) => {\n          let textTrack;\n          if (inUseTracks) {\n            let inUseTrack = null;\n            for (let i = 0; i < inUseTracks.length; i++) {\n              if (inUseTracks[i] && canReuseVttTextTrack(inUseTracks[i], track)) {\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(textTrackKind, track.name, track.lang);\n            if (textTrack) {\n              textTrack.mode = \"disabled\";\n            }\n          }\n          if (textTrack) {\n            this.textTracks.push(textTrack);\n          }\n        });\n        if (inUseTracks != null && inUseTracks.length) {\n          const unusedTextTracks = inUseTracks.filter((t) => t !== null).map((t) => t.label);\n          if (unusedTextTracks.length) {\n            logger.warn(`Media element contains unused subtitle tracks: ${unusedTextTracks.join(\", \")}. Replace media element for each source to clear TextTracks and captions menu.`);\n          }\n        }\n      } else if (this.tracks.length) {\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  onManifestLoaded(event, data) {\n    if (this.config.enableCEA708Captions && data.captions) {\n      data.captions.forEach((captionsTrack) => {\n        const instreamIdMatch = /(?:CC|SERVICE)([1-4])/.exec(captionsTrack.instreamId);\n        if (!instreamIdMatch) {\n          return;\n        }\n        const trackName = `textTrack${instreamIdMatch[1]}`;\n        const trackProperties = this.captionsProperties[trackName];\n        if (!trackProperties) {\n          return;\n        }\n        trackProperties.label = captionsTrack.name;\n        if (captionsTrack.lang) {\n          trackProperties.languageCode = captionsTrack.lang;\n        }\n        trackProperties.media = captionsTrack;\n      });\n    }\n  }\n  closedCaptionsForLevel(frag) {\n    const level = this.hls.levels[frag.level];\n    return level == null ? void 0 : level.attrs[\"CLOSED-CAPTIONS\"];\n  }\n  onFragLoading(event, data) {\n    this.initCea608Parsers();\n    const {\n      cea608Parser1,\n      cea608Parser2,\n      lastCc,\n      lastSn,\n      lastPartIndex\n    } = this;\n    if (!this.enabled || !cea608Parser1 || !cea608Parser2) {\n      return;\n    }\n    if (data.frag.type === PlaylistLevelType.MAIN) {\n      var _data$part$index, _data$part;\n      const {\n        cc,\n        sn\n      } = data.frag;\n      const partIndex = (_data$part$index = data == null ? void 0 : (_data$part = data.part) == null ? void 0 : _data$part.index) != null ? _data$part$index : -1;\n      if (!(sn === lastSn + 1 || sn === lastSn && partIndex === lastPartIndex + 1 || cc === lastCc)) {\n        cea608Parser1.reset();\n        cea608Parser2.reset();\n      }\n      this.lastCc = cc;\n      this.lastSn = sn;\n      this.lastPartIndex = partIndex;\n    }\n  }\n  onFragLoaded(event, data) {\n    const {\n      frag,\n      payload\n    } = data;\n    if (frag.type === PlaylistLevelType.SUBTITLE) {\n      if (payload.byteLength) {\n        const decryptData = frag.decryptdata;\n        const decrypted = \"stats\" in data;\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 (trackPlaylistMedia && trackPlaylistMedia.textCodec === IMSC1_CODEC) {\n            this._parseIMSC1(frag, payload);\n          } else {\n            this._parseVTTs(data);\n          }\n        }\n      } else {\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  _parseIMSC1(frag, payload) {\n    const hls = this.hls;\n    parseIMSC1(payload, this.initPTS[frag.cc], (cues) => {\n      this._appendCues(cues, frag.level);\n      hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n        success: true,\n        frag\n      });\n    }, (error) => {\n      logger.log(`Failed to parse IMSC1: ${error}`);\n      hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n        success: false,\n        frag,\n        error\n      });\n    });\n  }\n  _parseVTTs(data) {\n    var _frag$initSegment;\n    const {\n      frag,\n      payload\n    } = data;\n    const {\n      initPTS,\n      unparsedVttFrags\n    } = this;\n    const maxAvCC = initPTS.length - 1;\n    if (!initPTS[frag.cc] && maxAvCC === -1) {\n      unparsedVttFrags.push(data);\n      return;\n    }\n    const hls = this.hls;\n    const payloadWebVTT = (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)) : payload;\n    parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], this.vttCCs, frag.cc, frag.start, (cues) => {\n      this._appendCues(cues, frag.level);\n      hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n        success: true,\n        frag\n      });\n    }, (error) => {\n      const missingInitPTS = error.message === \"Missing initPTS for VTT MPEGTS\";\n      if (missingInitPTS) {\n        unparsedVttFrags.push(data);\n      } else {\n        this._fallbackToIMSC1(frag, payload);\n      }\n      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,\n        error\n      });\n    });\n  }\n  _fallbackToIMSC1(frag, payload) {\n    const trackPlaylistMedia = this.tracks[frag.level];\n    if (!trackPlaylistMedia.textCodec) {\n      parseIMSC1(payload, this.initPTS[frag.cc], () => {\n        trackPlaylistMedia.textCodec = IMSC1_CODEC;\n        this._parseIMSC1(frag, payload);\n      }, () => {\n        trackPlaylistMedia.textCodec = \"wvtt\";\n      });\n    }\n  }\n  _appendCues(cues, fragLevel) {\n    const hls = this.hls;\n    if (this.config.renderTextTracksNatively) {\n      const textTrack = this.textTracks[fragLevel];\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, {\n        type: \"subtitles\",\n        cues,\n        track\n      });\n    }\n  }\n  onFragDecrypted(event, data) {\n    const {\n      frag\n    } = data;\n    if (frag.type === PlaylistLevelType.SUBTITLE) {\n      this.onFragLoaded(Events.FRAG_LOADED, data);\n    }\n  }\n  onSubtitleTracksCleared() {\n    this.tracks = [];\n    this.captionsTracks = {};\n  }\n  onFragParsingUserdata(event, data) {\n    this.initCea608Parsers();\n    const {\n      cea608Parser1,\n      cea608Parser2\n    } = this;\n    if (!this.enabled || !cea608Parser1 || !cea608Parser2) {\n      return;\n    }\n    const {\n      frag,\n      samples\n    } = data;\n    if (frag.type === PlaylistLevelType.MAIN && this.closedCaptionsForLevel(frag) === \"NONE\") {\n      return;\n    }\n    for (let i = 0; i < samples.length; i++) {\n      const ccBytes = samples[i].bytes;\n      if (ccBytes) {\n        const ccdatas = this.extractCea608Data(ccBytes);\n        cea608Parser1.addData(samples[i].pts, ccdatas[0]);\n        cea608Parser2.addData(samples[i].pts, ccdatas[1]);\n      }\n    }\n  }\n  onBufferFlushing(event, {\n    startOffset,\n    endOffset,\n    endOffsetSubtitles,\n    type\n  }) {\n    const {\n      media\n    } = this;\n    if (!media || media.currentTime < endOffset) {\n      return;\n    }\n    if (!type || type === \"video\") {\n      const {\n        captionsTracks\n      } = this;\n      Object.keys(captionsTracks).forEach((trackName) => removeCuesInRange(captionsTracks[trackName], startOffset, endOffset));\n    }\n    if (this.config.renderTextTracksNatively) {\n      if (startOffset === 0 && endOffsetSubtitles !== void 0) {\n        const {\n          textTracks\n        } = this;\n        Object.keys(textTracks).forEach((trackName) => removeCuesInRange(textTracks[trackName], startOffset, endOffsetSubtitles));\n      }\n    }\n  }\n  extractCea608Data(byteArray) {\n    const actualCCBytes = [[], []];\n    const count = byteArray[0] & 31;\n    let position = 2;\n    for (let j = 0; j < count; j++) {\n      const tmpByte = byteArray[position++];\n      const ccbyte1 = 127 & byteArray[position++];\n      const ccbyte2 = 127 & byteArray[position++];\n      if (ccbyte1 === 0 && ccbyte2 === 0) {\n        continue;\n      }\n      const ccValid = (4 & tmpByte) !== 0;\n      if (ccValid) {\n        const ccType = 3 & tmpByte;\n        if (0 === ccType || 1 === ccType) {\n          actualCCBytes[ccType].push(ccbyte1);\n          actualCCBytes[ccType].push(ccbyte2);\n        }\n      }\n    }\n    return actualCCBytes;\n  }\n}\nfunction captionsOrSubtitlesFromCharacteristics(track) {\n  if (track.characteristics) {\n    if (/transcribes-spoken-dialog/gi.test(track.characteristics) && /describes-music-and-sound/gi.test(track.characteristics)) {\n      return \"captions\";\n    }\n  }\n  return \"subtitles\";\n}\nfunction canReuseVttTextTrack(inUseTrack, manifestTrack) {\n  return !!inUseTrack && inUseTrack.kind === captionsOrSubtitlesFromCharacteristics(manifestTrack) && subtitleTrackMatchesTextTrack(manifestTrack, inUseTrack);\n}\nfunction intersection(x1, x2, y1, y2) {\n  return Math.min(x2, y2) - Math.max(x1, y1);\n}\nfunction newVTTCCs() {\n  return {\n    ccOffset: 0,\n    presentationOffset: 0,\n    0: {\n      start: 0,\n      prevCC: -1,\n      new: true\n    }\n  };\n}\nclass CapLevelController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.autoLevelCapping = void 0;\n    this.firstLevel = void 0;\n    this.media = void 0;\n    this.restrictedLevels = void 0;\n    this.timer = void 0;\n    this.clientRect = void 0;\n    this.streamController = void 0;\n    this.hls = hls;\n    this.autoLevelCapping = Number.POSITIVE_INFINITY;\n    this.firstLevel = -1;\n    this.media = null;\n    this.restrictedLevels = [];\n    this.timer = void 0;\n    this.clientRect = null;\n    this.registerListeners();\n  }\n  setStreamController(streamController) {\n    this.streamController = streamController;\n  }\n  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    this.hls = this.streamController = null;\n  }\n  registerListeners() {\n    const {\n      hls\n    } = 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  unregisterListener() {\n    const {\n      hls\n    } = 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  onFpsDropLevelCapping(event, data) {\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  onMediaAttaching(event, data) {\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  onManifestParsed(event, data) {\n    const hls = this.hls;\n    this.restrictedLevels = [];\n    this.firstLevel = data.firstLevel;\n    if (hls.config.capLevelToPlayerSize && data.video) {\n      this.startCapping();\n    }\n  }\n  onLevelsUpdated(event, data) {\n    if (this.timer && isFiniteNumber(this.autoLevelCapping)) {\n      this.detectPlayerSize();\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  onBufferCodecs(event, data) {\n    const hls = this.hls;\n    if (hls.config.capLevelToPlayerSize && data.video) {\n      this.startCapping();\n    }\n  }\n  onMediaDetaching() {\n    this.stopCapping();\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          logger.log(`Setting autoLevelCapping to ${maxLevel}: ${levels[maxLevel].height}p@${levels[maxLevel].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}`);\n        }\n        hls.autoLevelCapping = maxLevel;\n        if (hls.autoLevelCapping > this.autoLevelCapping && this.streamController) {\n          this.streamController.nextLevelSwitch();\n        }\n        this.autoLevelCapping = hls.autoLevelCapping;\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) {\n    const levels = this.hls.levels;\n    if (!levels.length) {\n      return -1;\n    }\n    const validLevels = levels.filter((level, index) => this.isLevelAllowed(level) && index <= capLevelIndex);\n    this.clientRect = null;\n    return CapLevelController.getMaxLevelByMediaSize(validLevels, this.mediaWidth, this.mediaHeight);\n  }\n  startCapping() {\n    if (this.timer) {\n      return;\n    }\n    this.autoLevelCapping = Number.POSITIVE_INFINITY;\n    self.clearInterval(this.timer);\n    this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1e3);\n    this.detectPlayerSize();\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 = void 0;\n    }\n  }\n  getDimensions() {\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    if (media) {\n      const clientRect = media.getBoundingClientRect();\n      boundsRect.width = clientRect.width;\n      boundsRect.height = clientRect.height;\n      if (!boundsRect.width && !boundsRect.height) {\n        boundsRect.width = clientRect.right - clientRect.left || media.width || 0;\n        boundsRect.height = clientRect.bottom - clientRect.top || media.height || 0;\n      }\n    }\n    this.clientRect = boundsRect;\n    return boundsRect;\n  }\n  get mediaWidth() {\n    return this.getDimensions().width * this.contentScaleFactor;\n  }\n  get mediaHeight() {\n    return this.getDimensions().height * this.contentScaleFactor;\n  }\n  get contentScaleFactor() {\n    let pixelRatio = 1;\n    if (!this.hls.config.ignoreDevicePixelRatio) {\n      try {\n        pixelRatio = self.devicePixelRatio;\n      } catch (e) {\n      }\n    }\n    return pixelRatio;\n  }\n  isLevelAllowed(level) {\n    const restrictedLevels = this.restrictedLevels;\n    return !restrictedLevels.some((restrictedLevel) => {\n      return level.bitrate === restrictedLevel.bitrate && level.width === restrictedLevel.width && level.height === restrictedLevel.height;\n    });\n  }\n  static getMaxLevelByMediaSize(levels, width, height) {\n    if (!(levels != null && levels.length)) {\n      return -1;\n    }\n    const atGreatestBandwidth = (curLevel, nextLevel) => {\n      if (!nextLevel) {\n        return true;\n      }\n      return curLevel.width !== nextLevel.width || curLevel.height !== nextLevel.height;\n    };\n    let maxLevelIndex = levels.length - 1;\n    const squareSize = Math.max(width, height);\n    for (let i = 0; i < levels.length; i += 1) {\n      const level = levels[i];\n      if ((level.width >= squareSize || level.height >= squareSize) && atGreatestBandwidth(level, levels[i + 1])) {\n        maxLevelIndex = i;\n        break;\n      }\n    }\n    return maxLevelIndex;\n  }\n}\nclass FPSController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.isVideoPlaybackQualityAvailable = false;\n    this.timer = void 0;\n    this.media = null;\n    this.lastTime = void 0;\n    this.lastDroppedFrames = 0;\n    this.lastDecodedFrames = 0;\n    this.streamController = void 0;\n    this.hls = hls;\n    this.registerListeners();\n  }\n  setStreamController(streamController) {\n    this.streamController = streamController;\n  }\n  registerListeners() {\n    this.hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n  }\n  unregisterListeners() {\n    this.hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n  }\n  destroy() {\n    if (this.timer) {\n      clearInterval(this.timer);\n    }\n    this.unregisterListeners();\n    this.isVideoPlaybackQualityAvailable = false;\n    this.media = null;\n  }\n  onMediaAttaching(event, data) {\n    const config = this.hls.config;\n    if (config.capLevelOnFPSDrop) {\n      const media = 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      self.clearInterval(this.timer);\n      this.timer = self.setInterval(this.checkFPSInterval.bind(this), config.fpsDroppedMonitoringPeriod);\n    }\n  }\n  checkFPS(video, decodedFrames, droppedFrames) {\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 = 1e3 * currentDropped / currentPeriod;\n        const hls = this.hls;\n        hls.trigger(Events.FPS_DROP, {\n          currentDropped,\n          currentDecoded,\n          totalDroppedFrames: droppedFrames\n        });\n        if (droppedFPS > 0) {\n          if (currentDropped > hls.config.fpsDroppedMonitoringThreshold * currentDecoded) {\n            let currentLevel = hls.currentLevel;\n            logger.warn(\"drop FPS ratio greater than max allowed value for currentLevel: \" + currentLevel);\n            if (currentLevel > 0 && (hls.autoLevelCapping === -1 || hls.autoLevelCapping >= currentLevel)) {\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  checkFPSInterval() {\n    const video = this.media;\n    if (video) {\n      if (this.isVideoPlaybackQualityAvailable) {\n        const videoPlaybackQuality = video.getVideoPlaybackQuality();\n        this.checkFPS(video, videoPlaybackQuality.totalVideoFrames, videoPlaybackQuality.droppedVideoFrames);\n      } else {\n        this.checkFPS(video, video.webkitDecodedFrameCount, video.webkitDroppedFrameCount);\n      }\n    }\n  }\n}\nconst LOGGER_PREFIX = \"[eme]\";\nclass EMEController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.config = void 0;\n    this.media = null;\n    this.keyFormatPromise = null;\n    this.keySystemAccessPromises = {};\n    this._requestLicenseFailureCount = 0;\n    this.mediaKeySessions = [];\n    this.keyIdToKeySessionPromise = {};\n    this.setMediaKeysQueue = EMEController.CDMCleanupPromise ? [EMEController.CDMCleanupPromise] : [];\n    this.onMediaEncrypted = this._onMediaEncrypted.bind(this);\n    this.onWaitingForKey = this._onWaitingForKey.bind(this);\n    this.debug = logger.debug.bind(logger, LOGGER_PREFIX);\n    this.log = logger.log.bind(logger, LOGGER_PREFIX);\n    this.warn = logger.warn.bind(logger, LOGGER_PREFIX);\n    this.error = logger.error.bind(logger, LOGGER_PREFIX);\n    this.hls = hls;\n    this.config = hls.config;\n    this.registerListeners();\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.onMediaDetached();\n    const config = this.config;\n    config.requestMediaKeySystemAccessFunc = null;\n    config.licenseXhrSetup = config.licenseResponseCallback = void 0;\n    config.drmSystems = config.drmSystemOptions = {};\n    this.hls = this.onMediaEncrypted = this.onWaitingForKey = this.keyIdToKeySessionPromise = null;\n    this.config = null;\n  }\n  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  }\n  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  }\n  getLicenseServerUrl(keySystem) {\n    const {\n      drmSystems,\n      widevineLicenseUrl\n    } = this.config;\n    const keySystemConfiguration = drmSystems[keySystem];\n    if (keySystemConfiguration) {\n      return keySystemConfiguration.licenseUrl;\n    }\n    if (keySystem === KeySystems.WIDEVINE && widevineLicenseUrl) {\n      return widevineLicenseUrl;\n    }\n    throw new Error(`no license server URL configured for key-system \"${keySystem}\"`);\n  }\n  getServerCertificateUrl(keySystem) {\n    const {\n      drmSystems\n    } = this.config;\n    const keySystemConfiguration = drmSystems[keySystem];\n    if (keySystemConfiguration) {\n      return keySystemConfiguration.serverCertificateUrl;\n    } else {\n      this.log(`No Server Certificate in config.drmSystems[\"${keySystem}\"]`);\n    }\n  }\n  attemptKeySystemAccess(keySystemsToAttempt) {\n    const levels = this.hls.levels;\n    const uniqueCodec = (value, i, a) => !!value && a.indexOf(value) === i;\n    const audioCodecs = levels.map((level) => level.audioCodec).filter(uniqueCodec);\n    const videoCodecs = levels.map((level) => level.videoCodec).filter(uniqueCodec);\n    if (audioCodecs.length + videoCodecs.length === 0) {\n      videoCodecs.push(\"avc1.42e01e\");\n    }\n    return new Promise((resolve, reject) => {\n      const attempt = (keySystems) => {\n        const keySystem = keySystems.shift();\n        this.getMediaKeysPromise(keySystem, audioCodecs, videoCodecs).then((mediaKeys) => resolve({\n          keySystem,\n          mediaKeys\n        })).catch((error) => {\n          if (keySystems.length) {\n            attempt(keySystems);\n          } else if (error instanceof EMEKeyError) {\n            reject(error);\n          } else {\n            reject(new EMEKeyError({\n              type: ErrorTypes.KEY_SYSTEM_ERROR,\n              details: ErrorDetails.KEY_SYSTEM_NO_ACCESS,\n              error,\n              fatal: true\n            }, error.message));\n          }\n        });\n      };\n      attempt(keySystemsToAttempt);\n    });\n  }\n  requestMediaKeySystemAccess(keySystem, supportedConfigurations) {\n    const {\n      requestMediaKeySystemAccessFunc\n    } = this.config;\n    if (!(typeof requestMediaKeySystemAccessFunc === \"function\")) {\n      let errMessage = `Configured requestMediaKeySystemAccess is not a function ${requestMediaKeySystemAccessFunc}`;\n      if (requestMediaKeySystemAccess === null && self.location.protocol === \"http:\") {\n        errMessage = `navigator.requestMediaKeySystemAccess is not available over insecure protocol ${location.protocol}`;\n      }\n      return Promise.reject(new Error(errMessage));\n    }\n    return requestMediaKeySystemAccessFunc(keySystem, supportedConfigurations);\n  }\n  getMediaKeysPromise(keySystem, audioCodecs, videoCodecs) {\n    const mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations(keySystem, audioCodecs, videoCodecs, this.config.drmSystemOptions);\n    const keySystemAccessPromises = this.keySystemAccessPromises[keySystem];\n    let keySystemAccess = keySystemAccessPromises == null ? void 0 : keySystemAccessPromises.keySystemAccess;\n    if (!keySystemAccess) {\n      this.log(`Requesting encrypted media \"${keySystem}\" key-system access with config: ${JSON.stringify(mediaKeySystemConfigs)}`);\n      keySystemAccess = this.requestMediaKeySystemAccess(keySystem, mediaKeySystemConfigs);\n      const _keySystemAccessPromises = this.keySystemAccessPromises[keySystem] = {\n        keySystemAccess\n      };\n      keySystemAccess.catch((error) => {\n        this.log(`Failed to obtain access to key-system \"${keySystem}\": ${error}`);\n      });\n      return keySystemAccess.then((mediaKeySystemAccess) => {\n        this.log(`Access for key-system \"${mediaKeySystemAccess.keySystem}\" obtained`);\n        const certificateRequest = this.fetchServerCertificate(keySystem);\n        this.log(`Create media-keys for \"${keySystem}\"`);\n        _keySystemAccessPromises.mediaKeys = mediaKeySystemAccess.createMediaKeys().then((mediaKeys) => {\n          this.log(`Media-keys created for \"${keySystem}\"`);\n          return certificateRequest.then((certificate) => {\n            if (certificate) {\n              return this.setMediaKeysServerCertificate(mediaKeys, keySystem, certificate);\n            }\n            return mediaKeys;\n          });\n        });\n        _keySystemAccessPromises.mediaKeys.catch((error) => {\n          this.error(`Failed to create media-keys for \"${keySystem}\"}: ${error}`);\n        });\n        return _keySystemAccessPromises.mediaKeys;\n      });\n    }\n    return keySystemAccess.then(() => keySystemAccessPromises.mediaKeys);\n  }\n  createMediaKeySessionContext({\n    decryptdata,\n    keySystem,\n    mediaKeys\n  }) {\n    this.log(`Creating key-system session \"${keySystem}\" keyId: ${Hex.hexDump(decryptdata.keyId || [])}`);\n    const mediaKeysSession = mediaKeys.createSession();\n    const mediaKeySessionContext = {\n      decryptdata,\n      keySystem,\n      mediaKeys,\n      mediaKeysSession,\n      keyStatus: \"status-pending\"\n    };\n    this.mediaKeySessions.push(mediaKeySessionContext);\n    return mediaKeySessionContext;\n  }\n  renewKeySession(mediaKeySessionContext) {\n    const decryptdata = mediaKeySessionContext.decryptdata;\n    if (decryptdata.pssh) {\n      const keySessionContext = this.createMediaKeySessionContext(mediaKeySessionContext);\n      const keyId = this.getKeyIdString(decryptdata);\n      const scheme = \"cenc\";\n      this.keyIdToKeySessionPromise[keyId] = this.generateRequestWithPreferredKeySession(keySessionContext, scheme, decryptdata.pssh, \"expired\");\n    } else {\n      this.warn(`Could not renew expired session. Missing pssh initData.`);\n    }\n    this.removeSession(mediaKeySessionContext);\n  }\n  getKeyIdString(decryptdata) {\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 Hex.hexDump(decryptdata.keyId);\n  }\n  updateKeySession(mediaKeySessionContext, data) {\n    var _mediaKeySessionConte;\n    const keySession = mediaKeySessionContext.mediaKeysSession;\n    this.log(`Updating key-session \"${keySession.sessionId}\" for keyID ${Hex.hexDump(((_mediaKeySessionConte = mediaKeySessionContext.decryptdata) == null ? void 0 : _mediaKeySessionConte.keyId) || [])}\n      } (data length: ${data ? data.byteLength : data})`);\n    return keySession.update(data);\n  }\n  selectKeySystemFormat(frag) {\n    const keyFormats = Object.keys(frag.levelkeys || {});\n    if (!this.keyFormatPromise) {\n      this.log(`Selecting key-system from fragment (sn: ${frag.sn} ${frag.type}: ${frag.level}) key formats ${keyFormats.join(\", \")}`);\n      this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n    }\n    return this.keyFormatPromise;\n  }\n  getKeyFormatPromise(keyFormats) {\n    return new Promise((resolve, reject) => {\n      const keySystemsInConfig = getKeySystemsForConfig(this.config);\n      const keySystemsToAttempt = keyFormats.map(keySystemFormatToKeySystemDomain).filter((value) => !!value && keySystemsInConfig.indexOf(value) !== -1);\n      return this.getKeySystemSelectionPromise(keySystemsToAttempt).then(({\n        keySystem\n      }) => {\n        const keySystemFormat = keySystemDomainToKeySystemFormat(keySystem);\n        if (keySystemFormat) {\n          resolve(keySystemFormat);\n        } else {\n          reject(new Error(`Unable to find format for key-system \"${keySystem}\"`));\n        }\n      }).catch(reject);\n    });\n  }\n  loadKey(data) {\n    const decryptdata = data.keyInfo.decryptdata;\n    const keyId = this.getKeyIdString(decryptdata);\n    const keyDetails = `(keyId: ${keyId} format: \"${decryptdata.keyFormat}\" method: ${decryptdata.method} uri: ${decryptdata.uri})`;\n    this.log(`Starting session for key ${keyDetails}`);\n    let keySessionContextPromise = this.keyIdToKeySessionPromise[keyId];\n    if (!keySessionContextPromise) {\n      keySessionContextPromise = this.keyIdToKeySessionPromise[keyId] = this.getKeySystemForKeyPromise(decryptdata).then(({\n        keySystem,\n        mediaKeys\n      }) => {\n        this.throwIfDestroyed();\n        this.log(`Handle encrypted media sn: ${data.frag.sn} ${data.frag.type}: ${data.frag.level} using key ${keyDetails}`);\n        return this.attemptSetMediaKeys(keySystem, mediaKeys).then(() => {\n          this.throwIfDestroyed();\n          const keySessionContext = this.createMediaKeySessionContext({\n            keySystem,\n            mediaKeys,\n            decryptdata\n          });\n          const scheme = \"cenc\";\n          return this.generateRequestWithPreferredKeySession(keySessionContext, scheme, decryptdata.pssh, \"playlist-key\");\n        });\n      });\n      keySessionContextPromise.catch((error) => this.handleError(error));\n    }\n    return keySessionContextPromise;\n  }\n  throwIfDestroyed(message = \"Invalid state\") {\n    if (!this.hls) {\n      throw new Error(\"invalid state\");\n    }\n  }\n  handleError(error) {\n    if (!this.hls) {\n      return;\n    }\n    this.error(error.message);\n    if (error instanceof EMEKeyError) {\n      this.hls.trigger(Events.ERROR, error.data);\n    } else {\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  getKeySystemForKeyPromise(decryptdata) {\n    const keyId = this.getKeyIdString(decryptdata);\n    const mediaKeySessionContext = this.keyIdToKeySessionPromise[keyId];\n    if (!mediaKeySessionContext) {\n      const keySystem = keySystemFormatToKeySystemDomain(decryptdata.keyFormat);\n      const keySystemsToAttempt = keySystem ? [keySystem] : getKeySystemsForConfig(this.config);\n      return this.attemptKeySystemAccess(keySystemsToAttempt);\n    }\n    return mediaKeySessionContext;\n  }\n  getKeySystemSelectionPromise(keySystemsToAttempt) {\n    if (!keySystemsToAttempt.length) {\n      keySystemsToAttempt = getKeySystemsForConfig(this.config);\n    }\n    if (keySystemsToAttempt.length === 0) {\n      throw new EMEKeyError({\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_CONFIGURED_LICENSE,\n        fatal: true\n      }, `Missing key-system license configuration options ${JSON.stringify({\n        drmSystems: this.config.drmSystems\n      })}`);\n    }\n    return this.attemptKeySystemAccess(keySystemsToAttempt);\n  }\n  _onMediaEncrypted(event) {\n    const {\n      initDataType,\n      initData\n    } = event;\n    this.debug(`\"${event.type}\" event: init data type: \"${initDataType}\"`);\n    if (initData === null) {\n      return;\n    }\n    let keyId;\n    let keySystemDomain;\n    if (initDataType === \"sinf\" && this.config.drmSystems[KeySystems.FAIRPLAY]) {\n      const json = bin2str(new Uint8Array(initData));\n      try {\n        const sinf = base64Decode(JSON.parse(json).sinf);\n        const tenc = parseSinf(new Uint8Array(sinf));\n        if (!tenc) {\n          return;\n        }\n        keyId = tenc.subarray(8, 24);\n        keySystemDomain = KeySystems.FAIRPLAY;\n      } catch (error) {\n        this.warn('Failed to parse sinf \"encrypted\" event message initData');\n        return;\n      }\n    } else {\n      const psshInfo = parsePssh(initData);\n      if (psshInfo === null) {\n        return;\n      }\n      if (psshInfo.version === 0 && psshInfo.systemId === KeySystemIds.WIDEVINE && psshInfo.data) {\n        keyId = psshInfo.data.subarray(8, 24);\n      }\n      keySystemDomain = keySystemIdToKeySystemDomain(psshInfo.systemId);\n    }\n    if (!keySystemDomain || !keyId) {\n      return;\n    }\n    const keyIdHex = Hex.hexDump(keyId);\n    const {\n      keyIdToKeySessionPromise,\n      mediaKeySessions\n    } = this;\n    let keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex];\n    for (let i = 0; i < mediaKeySessions.length; i++) {\n      const keyContext = mediaKeySessions[i];\n      const decryptdata = keyContext.decryptdata;\n      if (decryptdata.pssh || !decryptdata.keyId) {\n        continue;\n      }\n      const oldKeyIdHex = Hex.hexDump(decryptdata.keyId);\n      if (keyIdHex === oldKeyIdHex || decryptdata.uri.replace(/-/g, \"\").indexOf(keyIdHex) !== -1) {\n        keySessionContextPromise = keyIdToKeySessionPromise[oldKeyIdHex];\n        delete keyIdToKeySessionPromise[oldKeyIdHex];\n        decryptdata.pssh = new Uint8Array(initData);\n        decryptdata.keyId = keyId;\n        keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex] = keySessionContextPromise.then(() => {\n          return this.generateRequestWithPreferredKeySession(keyContext, initDataType, initData, \"encrypted-event-key-match\");\n        });\n        break;\n      }\n    }\n    if (!keySessionContextPromise) {\n      keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex] = this.getKeySystemSelectionPromise([keySystemDomain]).then(({\n        keySystem,\n        mediaKeys\n      }) => {\n        var _keySystemToKeySystem;\n        this.throwIfDestroyed();\n        const decryptdata = new LevelKey(\"ISO-23001-7\", keyIdHex, (_keySystemToKeySystem = keySystemDomainToKeySystemFormat(keySystem)) != null ? _keySystemToKeySystem : \"\");\n        decryptdata.pssh = new Uint8Array(initData);\n        decryptdata.keyId = keyId;\n        return this.attemptSetMediaKeys(keySystem, mediaKeys).then(() => {\n          this.throwIfDestroyed();\n          const keySessionContext = this.createMediaKeySessionContext({\n            decryptdata,\n            keySystem,\n            mediaKeys\n          });\n          return this.generateRequestWithPreferredKeySession(keySessionContext, initDataType, initData, \"encrypted-event-no-match\");\n        });\n      });\n    }\n    keySessionContextPromise.catch((error) => this.handleError(error));\n  }\n  _onWaitingForKey(event) {\n    this.log(`\"${event.type}\" event`);\n  }\n  attemptSetMediaKeys(keySystem, mediaKeys) {\n    const queue = this.setMediaKeysQueue.slice();\n    this.log(`Setting media-keys for \"${keySystem}\"`);\n    const setMediaKeysPromise = Promise.all(queue).then(() => {\n      if (!this.media) {\n        throw new Error(\"Attempted to set mediaKeys without media element attached\");\n      }\n      return this.media.setMediaKeys(mediaKeys);\n    });\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((p) => queue.indexOf(p) === -1);\n    });\n  }\n  generateRequestWithPreferredKeySession(context, initDataType, initData, reason) {\n    var _this$config$drmSyste, _this$config$drmSyste2;\n    const generateRequestFilter = (_this$config$drmSyste = this.config.drmSystems) == null ? void 0 : (_this$config$drmSyste2 = _this$config$drmSyste[context.keySystem]) == null ? void 0 : _this$config$drmSyste2.generateRequest;\n    if (generateRequestFilter) {\n      try {\n        const mappedInitData = generateRequestFilter.call(this.hls, initDataType, initData, context);\n        if (!mappedInitData) {\n          throw new Error(\"Invalid response from configured generateRequest filter\");\n        }\n        initDataType = mappedInitData.initDataType;\n        initData = context.decryptdata.pssh = mappedInitData.initData ? new Uint8Array(mappedInitData.initData) : null;\n      } catch (error) {\n        var _this$hls;\n        this.warn(error.message);\n        if ((_this$hls = this.hls) != null && _this$hls.config.debug) {\n          throw error;\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    const keyId = this.getKeyIdString(context.decryptdata);\n    this.log(`Generating key-session request for \"${reason}\": ${keyId} (init data type: ${initDataType} length: ${initData ? initData.byteLength : null})`);\n    const licenseStatus = new EventEmitter();\n    const onmessage = context._onmessage = (event) => {\n      const keySession = context.mediaKeysSession;\n      if (!keySession) {\n        licenseStatus.emit(\"error\", new Error(\"invalid state\"));\n        return;\n      }\n      const {\n        messageType,\n        message\n      } = event;\n      this.log(`\"${messageType}\" message event for session \"${keySession.sessionId}\" message size: ${message.byteLength}`);\n      if (messageType === \"license-request\" || messageType === \"license-renewal\") {\n        this.renewLicense(context, message).catch((error) => {\n          this.handleError(error);\n          licenseStatus.emit(\"error\", error);\n        });\n      } else if (messageType === \"license-release\") {\n        if (context.keySystem === KeySystems.FAIRPLAY) {\n          this.updateKeySession(context, strToUtf8array(\"acknowledged\"));\n          this.removeSession(context);\n        }\n      } else {\n        this.warn(`unhandled media key message type \"${messageType}\"`);\n      }\n    };\n    const onkeystatuseschange = context._onkeystatuseschange = (event) => {\n      const keySession = context.mediaKeysSession;\n      if (!keySession) {\n        licenseStatus.emit(\"error\", new Error(\"invalid state\"));\n        return;\n      }\n      this.onKeyStatusChange(context);\n      const keyStatus = context.keyStatus;\n      licenseStatus.emit(\"keyStatus\", keyStatus);\n      if (keyStatus === \"expired\") {\n        this.warn(`${context.keySystem} expired for key ${keyId}`);\n        this.renewKeySession(context);\n      }\n    };\n    context.mediaKeysSession.addEventListener(\"message\", onmessage);\n    context.mediaKeysSession.addEventListener(\"keystatuseschange\", onkeystatuseschange);\n    const keyUsablePromise = new Promise((resolve, reject) => {\n      licenseStatus.on(\"error\", reject);\n      licenseStatus.on(\"keyStatus\", (keyStatus) => {\n        if (keyStatus.startsWith(\"usable\")) {\n          resolve();\n        } else if (keyStatus === \"output-restricted\") {\n          reject(new EMEKeyError({\n            type: ErrorTypes.KEY_SYSTEM_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED,\n            fatal: false\n          }, \"HDCP level output restricted\"));\n        } else if (keyStatus === \"internal-error\") {\n          reject(new EMEKeyError({\n            type: ErrorTypes.KEY_SYSTEM_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR,\n            fatal: true\n          }, `key status changed to \"${keyStatus}\"`));\n        } else if (keyStatus === \"expired\") {\n          reject(new Error(\"key expired while generating request\"));\n        } else {\n          this.warn(`unhandled key status change \"${keyStatus}\"`);\n        }\n      });\n    });\n    return context.mediaKeysSession.generateRequest(initDataType, initData).then(() => {\n      var _context$mediaKeysSes;\n      this.log(`Request generated for key-session \"${(_context$mediaKeysSes = context.mediaKeysSession) == null ? void 0 : _context$mediaKeysSes.sessionId}\" keyId: ${keyId}`);\n    }).catch((error) => {\n      throw new EMEKeyError({\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_SESSION,\n        error,\n        fatal: false\n      }, `Error generating key-session request: ${error}`);\n    }).then(() => keyUsablePromise).catch((error) => {\n      licenseStatus.removeAllListeners();\n      this.removeSession(context);\n      throw error;\n    }).then(() => {\n      licenseStatus.removeAllListeners();\n      return context;\n    });\n  }\n  onKeyStatusChange(mediaKeySessionContext) {\n    mediaKeySessionContext.mediaKeysSession.keyStatuses.forEach((status2, keyId) => {\n      this.log(`key status change \"${status2}\" for keyStatuses keyId: ${Hex.hexDump(\"buffer\" in keyId ? new Uint8Array(keyId.buffer, keyId.byteOffset, keyId.byteLength) : new Uint8Array(keyId))} session keyId: ${Hex.hexDump(new Uint8Array(mediaKeySessionContext.decryptdata.keyId || []))} uri: ${mediaKeySessionContext.decryptdata.uri}`);\n      mediaKeySessionContext.keyStatus = status2;\n    });\n  }\n  fetchServerCertificate(keySystem) {\n    const config = this.config;\n    const Loader = config.loader;\n    const certLoader = new Loader(config);\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 = {\n        responseType: \"arraybuffer\",\n        url\n      };\n      const loadPolicy = config.certLoadPolicy.default;\n      const loaderConfig = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0\n      };\n      const loaderCallbacks = {\n        onSuccess: (response, stats, context, networkDetails) => {\n          resolve(response.data);\n        },\n        onError: (response, contex, networkDetails, stats) => {\n          reject(new EMEKeyError({\n            type: ErrorTypes.KEY_SYSTEM_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n            fatal: true,\n            networkDetails,\n            response: _objectSpread2({\n              url: loaderContext.url,\n              data: void 0\n            }, response)\n          }, `\"${keySystem}\" certificate request failed (${url}). Status: ${response.code} (${response.text})`));\n        },\n        onTimeout: (stats, context, networkDetails) => {\n          reject(new EMEKeyError({\n            type: ErrorTypes.KEY_SYSTEM_ERROR,\n            details: ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n            fatal: true,\n            networkDetails,\n            response: {\n              url: loaderContext.url,\n              data: void 0\n            }\n          }, `\"${keySystem}\" certificate request timed out (${url})`));\n        },\n        onAbort: (stats, context, networkDetails) => {\n          reject(new Error(\"aborted\"));\n        }\n      };\n      certLoader.load(loaderContext, loaderConfig, loaderCallbacks);\n    });\n  }\n  setMediaKeysServerCertificate(mediaKeys, keySystem, cert) {\n    return new Promise((resolve, reject) => {\n      mediaKeys.setServerCertificate(cert).then((success) => {\n        this.log(`setServerCertificate ${success ? \"success\" : \"not supported by CDM\"} (${cert == null ? void 0 : cert.byteLength}) on \"${keySystem}\"`);\n        resolve(mediaKeys);\n      }).catch((error) => {\n        reject(new EMEKeyError({\n          type: ErrorTypes.KEY_SYSTEM_ERROR,\n          details: ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED,\n          error,\n          fatal: true\n        }, error.message));\n      });\n    });\n  }\n  renewLicense(context, keyMessage) {\n    return this.requestLicense(context, new Uint8Array(keyMessage)).then((data) => {\n      return this.updateKeySession(context, new Uint8Array(data)).catch((error) => {\n        throw new EMEKeyError({\n          type: ErrorTypes.KEY_SYSTEM_ERROR,\n          details: ErrorDetails.KEY_SYSTEM_SESSION_UPDATE_FAILED,\n          error,\n          fatal: true\n        }, error.message);\n      });\n    });\n  }\n  unpackPlayReadyKeyMessage(xhr, licenseChallenge) {\n    const xmlString = String.fromCharCode.apply(null, new Uint16Array(licenseChallenge.buffer));\n    if (!xmlString.includes(\"PlayReadyKeyMessage\")) {\n      xhr.setRequestHeader(\"Content-Type\", \"text/xml; charset=utf-8\");\n      return licenseChallenge;\n    }\n    const keyMessageXml = new DOMParser().parseFromString(xmlString, \"application/xml\");\n    const headers = keyMessageXml.querySelectorAll(\"HttpHeader\");\n    if (headers.length > 0) {\n      let header;\n      for (let i = 0, len = headers.length; i < len; i++) {\n        var _header$querySelector, _header$querySelector2;\n        header = headers[i];\n        const name = (_header$querySelector = header.querySelector(\"name\")) == null ? void 0 : _header$querySelector.textContent;\n        const value = (_header$querySelector2 = header.querySelector(\"value\")) == null ? void 0 : _header$querySelector2.textContent;\n        if (name && value) {\n          xhr.setRequestHeader(name, value);\n        }\n      }\n    }\n    const challengeElement = keyMessageXml.querySelector(\"Challenge\");\n    const challengeText = challengeElement == null ? void 0 : challengeElement.textContent;\n    if (!challengeText) {\n      throw new Error(`Cannot find <Challenge> in key message`);\n    }\n    return strToUtf8array(atob(challengeText));\n  }\n  setupLicenseXHR(xhr, url, keysListItem, licenseChallenge) {\n    const licenseXhrSetup = this.config.licenseXhrSetup;\n    if (!licenseXhrSetup) {\n      xhr.open(\"POST\", url, true);\n      return Promise.resolve({\n        xhr,\n        licenseChallenge\n      });\n    }\n    return Promise.resolve().then(() => {\n      if (!keysListItem.decryptdata) {\n        throw new Error(\"Key removed\");\n      }\n      return licenseXhrSetup.call(this.hls, xhr, url, keysListItem, licenseChallenge);\n    }).catch((error) => {\n      if (!keysListItem.decryptdata) {\n        throw error;\n      }\n      xhr.open(\"POST\", url, true);\n      return licenseXhrSetup.call(this.hls, xhr, url, keysListItem, licenseChallenge);\n    }).then((licenseXhrSetupResult) => {\n      if (!xhr.readyState) {\n        xhr.open(\"POST\", url, true);\n      }\n      const finalLicenseChallenge = licenseXhrSetupResult ? licenseXhrSetupResult : licenseChallenge;\n      return {\n        xhr,\n        licenseChallenge: finalLicenseChallenge\n      };\n    });\n  }\n  requestLicense(keySessionContext, licenseChallenge) {\n    const keyLoadPolicy = this.config.keyLoadPolicy.default;\n    return new Promise((resolve, reject) => {\n      const url = this.getLicenseServerUrl(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 (!this.hls || !keySessionContext.mediaKeysSession) {\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(`License received ${data instanceof ArrayBuffer ? data.byteLength : data}`);\n            const licenseResponseCallback = this.config.licenseResponseCallback;\n            if (licenseResponseCallback) {\n              try {\n                data = licenseResponseCallback.call(this.hls, xhr, url, keySessionContext);\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 (this._requestLicenseFailureCount > maxNumRetry || xhr.status >= 400 && xhr.status < 500) {\n              reject(new EMEKeyError({\n                type: ErrorTypes.KEY_SYSTEM_ERROR,\n                details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,\n                fatal: true,\n                networkDetails: xhr,\n                response: {\n                  url,\n                  data: void 0,\n                  code: xhr.status,\n                  text: xhr.statusText\n                }\n              }, `License Request XHR failed (${url}). Status: ${xhr.status} (${xhr.statusText})`));\n            } else {\n              const attemptsLeft = maxNumRetry - this._requestLicenseFailureCount + 1;\n              this.warn(`Retrying license request, ${attemptsLeft} attempts left`);\n              this.requestLicense(keySessionContext, licenseChallenge).then(resolve, reject);\n            }\n          }\n        }\n      };\n      if (keySessionContext.licenseXhr && keySessionContext.licenseXhr.readyState !== XMLHttpRequest.DONE) {\n        keySessionContext.licenseXhr.abort();\n      }\n      keySessionContext.licenseXhr = xhr;\n      this.setupLicenseXHR(xhr, url, keySessionContext, licenseChallenge).then(({\n        xhr: xhr2,\n        licenseChallenge: licenseChallenge2\n      }) => {\n        if (keySessionContext.keySystem == KeySystems.PLAYREADY) {\n          licenseChallenge2 = this.unpackPlayReadyKeyMessage(xhr2, licenseChallenge2);\n        }\n        xhr2.send(licenseChallenge2);\n      });\n    });\n  }\n  onMediaAttached(event, data) {\n    if (!this.config.emeEnabled) {\n      return;\n    }\n    const media = data.media;\n    this.media = media;\n    media.addEventListener(\"encrypted\", this.onMediaEncrypted);\n    media.addEventListener(\"waitingforkey\", this.onWaitingForKey);\n  }\n  onMediaDetached() {\n    const media = this.media;\n    const mediaKeysList = this.mediaKeySessions;\n    if (media) {\n      media.removeEventListener(\"encrypted\", this.onMediaEncrypted);\n      media.removeEventListener(\"waitingforkey\", this.onWaitingForKey);\n      this.media = null;\n    }\n    this._requestLicenseFailureCount = 0;\n    this.setMediaKeysQueue = [];\n    this.mediaKeySessions = [];\n    this.keyIdToKeySessionPromise = {};\n    LevelKey.clearKeyUriToKeyIdMap();\n    const keySessionCount = mediaKeysList.length;\n    EMEController.CDMCleanupPromise = Promise.all(mediaKeysList.map((mediaKeySessionContext) => this.removeSession(mediaKeySessionContext)).concat(media == null ? void 0 : media.setMediaKeys(null).catch((error) => {\n      this.log(`Could not clear media keys: ${error}`);\n    }))).then(() => {\n      if (keySessionCount) {\n        this.log(\"finished closing key sessions and clearing media keys\");\n        mediaKeysList.length = 0;\n      }\n    }).catch((error) => {\n      this.log(`Could not close sessions and clear media keys: ${error}`);\n    });\n  }\n  onManifestLoading() {\n    this.keyFormatPromise = null;\n  }\n  onManifestLoaded(event, {\n    sessionKeys\n  }) {\n    if (!sessionKeys || !this.config.emeEnabled) {\n      return;\n    }\n    if (!this.keyFormatPromise) {\n      const keyFormats = sessionKeys.reduce((formats, sessionKey) => {\n        if (formats.indexOf(sessionKey.keyFormat) === -1) {\n          formats.push(sessionKey.keyFormat);\n        }\n        return formats;\n      }, []);\n      this.log(`Selecting key-system from session-keys ${keyFormats.join(\", \")}`);\n      this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n    }\n  }\n  removeSession(mediaKeySessionContext) {\n    const {\n      mediaKeysSession,\n      licenseXhr\n    } = mediaKeySessionContext;\n    if (mediaKeysSession) {\n      this.log(`Remove licenses and keys and close session ${mediaKeysSession.sessionId}`);\n      if (mediaKeySessionContext._onmessage) {\n        mediaKeysSession.removeEventListener(\"message\", mediaKeySessionContext._onmessage);\n        mediaKeySessionContext._onmessage = void 0;\n      }\n      if (mediaKeySessionContext._onkeystatuseschange) {\n        mediaKeysSession.removeEventListener(\"keystatuseschange\", mediaKeySessionContext._onkeystatuseschange);\n        mediaKeySessionContext._onkeystatuseschange = void 0;\n      }\n      if (licenseXhr && licenseXhr.readyState !== XMLHttpRequest.DONE) {\n        licenseXhr.abort();\n      }\n      mediaKeySessionContext.mediaKeysSession = mediaKeySessionContext.decryptdata = mediaKeySessionContext.licenseXhr = void 0;\n      const index = this.mediaKeySessions.indexOf(mediaKeySessionContext);\n      if (index > -1) {\n        this.mediaKeySessions.splice(index, 1);\n      }\n      return mediaKeysSession.remove().catch((error) => {\n        this.log(`Could not remove session: ${error}`);\n      }).then(() => {\n        return mediaKeysSession.close();\n      }).catch((error) => {\n        this.log(`Could not close session: ${error}`);\n      });\n    }\n  }\n}\nEMEController.CDMCleanupPromise = void 0;\nclass EMEKeyError extends Error {\n  constructor(data, message) {\n    super(message);\n    this.data = void 0;\n    data.error || (data.error = new Error(message));\n    this.data = data;\n    data.err = data.error;\n  }\n}\nvar CmObjectType;\n(function(CmObjectType2) {\n  CmObjectType2[\"MANIFEST\"] = \"m\";\n  CmObjectType2[\"AUDIO\"] = \"a\";\n  CmObjectType2[\"VIDEO\"] = \"v\";\n  CmObjectType2[\"MUXED\"] = \"av\";\n  CmObjectType2[\"INIT\"] = \"i\";\n  CmObjectType2[\"CAPTION\"] = \"c\";\n  CmObjectType2[\"TIMED_TEXT\"] = \"tt\";\n  CmObjectType2[\"KEY\"] = \"k\";\n  CmObjectType2[\"OTHER\"] = \"o\";\n})(CmObjectType || (CmObjectType = {}));\nvar CmStreamingFormat;\n(function(CmStreamingFormat2) {\n  CmStreamingFormat2[\"DASH\"] = \"d\";\n  CmStreamingFormat2[\"HLS\"] = \"h\";\n  CmStreamingFormat2[\"SMOOTH\"] = \"s\";\n  CmStreamingFormat2[\"OTHER\"] = \"o\";\n})(CmStreamingFormat || (CmStreamingFormat = {}));\nvar CmcdHeaderField;\n(function(CmcdHeaderField2) {\n  CmcdHeaderField2[\"OBJECT\"] = \"CMCD-Object\";\n  CmcdHeaderField2[\"REQUEST\"] = \"CMCD-Request\";\n  CmcdHeaderField2[\"SESSION\"] = \"CMCD-Session\";\n  CmcdHeaderField2[\"STATUS\"] = \"CMCD-Status\";\n})(CmcdHeaderField || (CmcdHeaderField = {}));\nconst CmcdHeaderMap = {\n  [CmcdHeaderField.OBJECT]: [\"br\", \"d\", \"ot\", \"tb\"],\n  [CmcdHeaderField.REQUEST]: [\"bl\", \"dl\", \"mtp\", \"nor\", \"nrr\", \"su\"],\n  [CmcdHeaderField.SESSION]: [\"cid\", \"pr\", \"sf\", \"sid\", \"st\", \"v\"],\n  [CmcdHeaderField.STATUS]: [\"bs\", \"rtp\"]\n};\nclass SfItem {\n  constructor(value, params) {\n    this.value = void 0;\n    this.params = void 0;\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}\nclass SfToken {\n  constructor(description) {\n    this.description = void 0;\n    this.description = description;\n  }\n}\nconst DICT = \"Dict\";\nfunction 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}\nfunction throwError(action, src, type, cause) {\n  return new Error(`failed to ${action} \"${format(src)}\" as ${type}`, {\n    cause\n  });\n}\nconst BARE_ITEM = \"Bare Item\";\nconst BOOLEAN = \"Boolean\";\nconst BYTES = \"Byte Sequence\";\nconst DECIMAL = \"Decimal\";\nconst INTEGER = \"Integer\";\nfunction isInvalidInt(value) {\n  return value < -999999999999999 || 999999999999999 < value;\n}\nconst STRING_REGEX = /[\\x00-\\x1f\\x7f]+/;\nconst TOKEN = \"Token\";\nconst KEY = \"Key\";\nfunction serializeError(src, type, cause) {\n  return throwError(\"serialize\", src, type, cause);\n}\nfunction serializeBoolean(value) {\n  if (typeof value !== \"boolean\") {\n    throw serializeError(value, BOOLEAN);\n  }\n  return value ? \"?1\" : \"?0\";\n}\nfunction base64encode(binary) {\n  return btoa(String.fromCharCode(...binary));\n}\nfunction serializeByteSequence(value) {\n  if (ArrayBuffer.isView(value) === false) {\n    throw serializeError(value, BYTES);\n  }\n  return `:${base64encode(value)}:`;\n}\nfunction serializeInteger(value) {\n  if (isInvalidInt(value)) {\n    throw serializeError(value, INTEGER);\n  }\n  return value.toString();\n}\nfunction serializeDate(value) {\n  return `@${serializeInteger(value.getTime() / 1e3)}`;\n}\nfunction 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    const flooredValue = Math.floor(value * decimalShift);\n    return (flooredValue % 2 === 0 ? flooredValue : flooredValue + 1) / decimalShift;\n  } else {\n    return Math.round(value * decimalShift) / decimalShift;\n  }\n}\nfunction serializeDecimal(value) {\n  const roundedValue = roundToEven(value, 3);\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}\nconst STRING = \"String\";\nfunction serializeString(value) {\n  if (STRING_REGEX.test(value)) {\n    throw serializeError(value, STRING);\n  }\n  return `\"${value.replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`)}\"`;\n}\nfunction symbolToStr(symbol) {\n  return symbol.description || symbol.toString().slice(7, -1);\n}\nfunction 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}\nfunction serializeBareItem(value) {\n  switch (typeof value) {\n    case \"number\":\n      if (!isFiniteNumber(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      throw serializeError(value, BARE_ITEM);\n  }\n}\nfunction serializeKey(value) {\n  if (/^[a-z*][a-z0-9\\-_.*]*$/.test(value) === false) {\n    throw serializeError(value, KEY);\n  }\n  return value;\n}\nfunction serializeParams(params) {\n  if (params == null) {\n    return \"\";\n  }\n  return Object.entries(params).map(([key, value]) => {\n    if (value === true) {\n      return `;${serializeKey(key)}`;\n    }\n    return `;${serializeKey(key)}=${serializeBareItem(value)}`;\n  }).join(\"\");\n}\nfunction serializeItem(value) {\n  if (value instanceof SfItem) {\n    return `${serializeBareItem(value.value)}${serializeParams(value.params)}`;\n  } else {\n    return serializeBareItem(value);\n  }\n}\nfunction serializeInnerList(value) {\n  return `(${value.value.map(serializeItem).join(\" \")})${serializeParams(value.params)}`;\n}\nfunction serializeDict(dict, options = {\n  whitespace: true\n}) {\n  if (typeof dict !== \"object\") {\n    throw serializeError(dict, DICT);\n  }\n  const entries = dict instanceof Map ? dict.entries() : Object.entries(dict);\n  const optionalWhiteSpace = options != null && options.whitespace ? \" \" : \"\";\n  return Array.from(entries).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    } else {\n      output += \"=\";\n      if (Array.isArray(item.value)) {\n        output += serializeInnerList(item);\n      } else {\n        output += serializeItem(item);\n      }\n    }\n    return output;\n  }).join(`,${optionalWhiteSpace}`);\n}\nfunction encodeSfDict(value, options) {\n  return serializeDict(value, options);\n}\nconst isTokenField = (key) => key === \"ot\" || key === \"sf\" || key === \"st\";\nconst isValid = (value) => {\n  if (typeof value === \"number\") {\n    return isFiniteNumber(value);\n  }\n  return value != null && value !== \"\" && value !== false;\n};\nfunction 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  while (toPath[0] === fromPath[0]) {\n    toPath.shift();\n    fromPath.shift();\n  }\n  while (fromPath.length) {\n    fromPath.shift();\n    toPath.unshift(\"..\");\n  }\n  return toPath.join(\"/\");\n}\nfunction uuid() {\n  try {\n    return crypto.randomUUID();\n  } catch (error) {\n    try {\n      const url = URL.createObjectURL(new Blob());\n      const uuid2 = url.toString();\n      URL.revokeObjectURL(url);\n      return uuid2.slice(uuid2.lastIndexOf(\"/\") + 1);\n    } catch (error2) {\n      let dt = (/* @__PURE__ */ new Date()).getTime();\n      const uuid2 = \"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 & 3 | 8).toString(16);\n      });\n      return uuid2;\n    }\n  }\n}\nconst toRounded = (value) => Math.round(value);\nconst toUrlSafe = (value, options) => {\n  if (options != null && options.baseUrl) {\n    value = urlToRelativePath(value, options.baseUrl);\n  }\n  return encodeURIComponent(value);\n};\nconst toHundred = (value) => toRounded(value / 100) * 100;\nconst CmcdFormatters = {\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: toUrlSafe,\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};\nfunction processCmcd(obj, options) {\n  const results = {};\n  if (obj == null || typeof obj !== \"object\") {\n    return results;\n  }\n  const keys = Object.keys(obj).sort();\n  const formatters = _extends({}, CmcdFormatters, options == null ? void 0 : options.formatters);\n  const filter = options == null ? void 0 : options.filter;\n  keys.forEach((key) => {\n    if (filter != null && filter(key)) {\n      return;\n    }\n    let value = obj[key];\n    const formatter = formatters[key];\n    if (formatter) {\n      value = formatter(value, options);\n    }\n    if (key === \"v\" && value === 1) {\n      return;\n    }\n    if (key == \"pr\" && value === 1) {\n      return;\n    }\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}\nfunction encodeCmcd(cmcd, options = {}) {\n  if (!cmcd) {\n    return \"\";\n  }\n  return encodeSfDict(processCmcd(cmcd, options), _extends({\n    whitespace: false\n  }, options));\n}\nfunction toCmcdHeaders(cmcd, options = {}) {\n  if (!cmcd) {\n    return {};\n  }\n  const entries = Object.entries(cmcd);\n  const headerMap = Object.entries(CmcdHeaderMap).concat(Object.entries((options == null ? void 0 : options.customHeaderMap) || {}));\n  const shards = entries.reduce((acc, entry) => {\n    var _headerMap$find, _acc$field;\n    const [key, value] = entry;\n    const field = ((_headerMap$find = headerMap.find((entry2) => entry2[1].includes(key))) == null ? void 0 : _headerMap$find[0]) || CmcdHeaderField.REQUEST;\n    (_acc$field = acc[field]) != null ? _acc$field : acc[field] = {};\n    acc[field][key] = value;\n    return acc;\n  }, {});\n  return Object.entries(shards).reduce((acc, [field, value]) => {\n    acc[field] = encodeCmcd(value, options);\n    return acc;\n  }, {});\n}\nfunction appendCmcdHeaders(headers, cmcd, options) {\n  return _extends(headers, toCmcdHeaders(cmcd, options));\n}\nconst CMCD_PARAM = \"CMCD\";\nfunction toCmcdQuery(cmcd, options = {}) {\n  if (!cmcd) {\n    return \"\";\n  }\n  const params = encodeCmcd(cmcd, options);\n  return `${CMCD_PARAM}=${encodeURIComponent(params)}`;\n}\nconst REGEX = /CMCD=[^&#]+/;\nfunction appendCmcdQuery(url, cmcd, options) {\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}\nclass CMCDController {\n  // eslint-disable-line no-restricted-globals\n  constructor(hls) {\n    this.hls = void 0;\n    this.config = void 0;\n    this.media = void 0;\n    this.sid = void 0;\n    this.cid = void 0;\n    this.useHeaders = false;\n    this.includeKeys = void 0;\n    this.initialized = false;\n    this.starved = false;\n    this.buffering = true;\n    this.audioBuffer = void 0;\n    this.videoBuffer = void 0;\n    this.onWaiting = () => {\n      if (this.initialized) {\n        this.starved = true;\n      }\n      this.buffering = true;\n    };\n    this.onPlaying = () => {\n      if (!this.initialized) {\n        this.initialized = true;\n      }\n      this.buffering = false;\n    };\n    this.applyPlaylistData = (context) => {\n      try {\n        this.apply(context, {\n          ot: CmObjectType.MANIFEST,\n          su: !this.initialized\n        });\n      } catch (error) {\n        logger.warn(\"Could not generate manifest CMCD data.\", error);\n      }\n    };\n    this.applyFragmentData = (context) => {\n      try {\n        const fragment = context.frag;\n        const level = this.hls.levels[fragment.level];\n        const ot = this.getObjectType(fragment);\n        const data = {\n          d: fragment.duration * 1e3,\n          ot\n        };\n        if (ot === CmObjectType.VIDEO || ot === CmObjectType.AUDIO || ot == CmObjectType.MUXED) {\n          data.br = level.bitrate / 1e3;\n          data.tb = this.getTopBandwidth(ot) / 1e3;\n          data.bl = this.getBufferLength(ot);\n        }\n        this.apply(context, data);\n      } catch (error) {\n        logger.warn(\"Could not generate segment CMCD data.\", error);\n      }\n    };\n    this.hls = hls;\n    const config = this.config = hls.config;\n    const {\n      cmcd\n    } = config;\n    if (cmcd != null) {\n      config.pLoader = this.createPlaylistLoader();\n      config.fLoader = this.createFragmentLoader();\n      this.sid = cmcd.sessionId || uuid();\n      this.cid = cmcd.contentId;\n      this.useHeaders = cmcd.useHeaders === true;\n      this.includeKeys = cmcd.includeKeys;\n      this.registerListeners();\n    }\n  }\n  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  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  destroy() {\n    this.unregisterListeners();\n    this.onMediaDetached();\n    this.hls = this.config = this.audioBuffer = this.videoBuffer = null;\n    this.onWaiting = this.onPlaying = null;\n  }\n  onMediaAttached(event, data) {\n    this.media = data.media;\n    this.media.addEventListener(\"waiting\", this.onWaiting);\n    this.media.addEventListener(\"playing\", this.onPlaying);\n  }\n  onMediaDetached() {\n    if (!this.media) {\n      return;\n    }\n    this.media.removeEventListener(\"waiting\", this.onWaiting);\n    this.media.removeEventListener(\"playing\", this.onPlaying);\n    this.media = null;\n  }\n  onBufferCreated(event, data) {\n    var _data$tracks$audio, _data$tracks$video;\n    this.audioBuffer = (_data$tracks$audio = data.tracks.audio) == null ? void 0 : _data$tracks$audio.buffer;\n    this.videoBuffer = (_data$tracks$video = data.tracks.video) == null ? void 0 : _data$tracks$video.buffer;\n  }\n  /**\n   * Create baseline CMCD data\n   */\n  createData() {\n    var _this$media;\n    return {\n      v: 1,\n      sf: CmStreamingFormat.HLS,\n      sid: this.sid,\n      cid: this.cid,\n      pr: (_this$media = this.media) == null ? void 0 : _this$media.playbackRate,\n      mtp: this.hls.bandwidthEstimate / 1e3\n    };\n  }\n  /**\n   * Apply CMCD data to a request.\n   */\n  apply(context, data = {}) {\n    _extends(data, this.createData());\n    const isVideo = data.ot === CmObjectType.INIT || data.ot === CmObjectType.VIDEO || data.ot === CmObjectType.MUXED;\n    if (this.starved && isVideo) {\n      data.bs = true;\n      data.su = true;\n      this.starved = false;\n    }\n    if (data.su == null) {\n      data.su = this.buffering;\n    }\n    const {\n      includeKeys\n    } = 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    if (this.useHeaders) {\n      if (!context.headers) {\n        context.headers = {};\n      }\n      appendCmcdHeaders(context.headers, data);\n    } else {\n      context.url = appendCmcdQuery(context.url, data);\n    }\n  }\n  /**\n   * The CMCD object type.\n   */\n  getObjectType(fragment) {\n    const {\n      type\n    } = fragment;\n    if (type === \"subtitle\") {\n      return CmObjectType.TIMED_TEXT;\n    }\n    if (fragment.sn === \"initSegment\") {\n      return CmObjectType.INIT;\n    }\n    if (type === \"audio\") {\n      return CmObjectType.AUDIO;\n    }\n    if (type === \"main\") {\n      if (!this.hls.audioTracks.length) {\n        return CmObjectType.MUXED;\n      }\n      return CmObjectType.VIDEO;\n    }\n    return void 0;\n  }\n  /**\n   * Get the highest bitrate.\n   */\n  getTopBandwidth(type) {\n    let bitrate = 0;\n    let levels;\n    const hls = this.hls;\n    if (type === CmObjectType.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    for (const level of levels) {\n      if (level.bitrate > bitrate) {\n        bitrate = level.bitrate;\n      }\n    }\n    return bitrate > 0 ? bitrate : NaN;\n  }\n  /**\n   * Get the buffer length for a media type in milliseconds\n   */\n  getBufferLength(type) {\n    const media = this.hls.media;\n    const buffer = type === CmObjectType.AUDIO ? this.audioBuffer : this.videoBuffer;\n    if (!buffer || !media) {\n      return NaN;\n    }\n    const info = BufferHelper.bufferInfo(buffer, media.currentTime, this.config.maxBufferHole);\n    return info.len * 1e3;\n  }\n  /**\n   * Create a playlist loader\n   */\n  createPlaylistLoader() {\n    const {\n      pLoader\n    } = this.config;\n    const apply = this.applyPlaylistData;\n    const Ctor = pLoader || this.config.loader;\n    return class CmcdPlaylistLoader {\n      constructor(config) {\n        this.loader = void 0;\n        this.loader = new Ctor(config);\n      }\n      get stats() {\n        return this.loader.stats;\n      }\n      get context() {\n        return this.loader.context;\n      }\n      destroy() {\n        this.loader.destroy();\n      }\n      abort() {\n        this.loader.abort();\n      }\n      load(context, config, callbacks) {\n        apply(context);\n        this.loader.load(context, config, callbacks);\n      }\n    };\n  }\n  /**\n   * Create a playlist loader\n   */\n  createFragmentLoader() {\n    const {\n      fLoader\n    } = this.config;\n    const apply = this.applyFragmentData;\n    const Ctor = fLoader || this.config.loader;\n    return class CmcdFragmentLoader {\n      constructor(config) {\n        this.loader = void 0;\n        this.loader = new Ctor(config);\n      }\n      get stats() {\n        return this.loader.stats;\n      }\n      get context() {\n        return this.loader.context;\n      }\n      destroy() {\n        this.loader.destroy();\n      }\n      abort() {\n        this.loader.abort();\n      }\n      load(context, config, callbacks) {\n        apply(context);\n        this.loader.load(context, config, callbacks);\n      }\n    };\n  }\n}\nconst PATHWAY_PENALTY_DURATION_MS = 3e5;\nclass ContentSteeringController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.log = void 0;\n    this.loader = null;\n    this.uri = null;\n    this.pathwayId = \".\";\n    this.pathwayPriority = null;\n    this.timeToLoad = 300;\n    this.reloadTimer = -1;\n    this.updated = 0;\n    this.started = false;\n    this.enabled = true;\n    this.levels = null;\n    this.audioTracks = null;\n    this.subtitleTracks = null;\n    this.penalizedPathways = {};\n    this.hls = hls;\n    this.log = logger.log.bind(logger, `[content-steering]:`);\n    this.registerListeners();\n  }\n  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  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  startLoad() {\n    this.started = true;\n    this.clearTimeout();\n    if (this.enabled && this.uri) {\n      if (this.updated) {\n        const ttl = this.timeToLoad * 1e3 - (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  stopLoad() {\n    this.started = false;\n    if (this.loader) {\n      this.loader.destroy();\n      this.loader = null;\n    }\n    this.clearTimeout();\n  }\n  clearTimeout() {\n    if (this.reloadTimer !== -1) {\n      self.clearTimeout(this.reloadTimer);\n      this.reloadTimer = -1;\n    }\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.stopLoad();\n    this.hls = null;\n    this.levels = this.audioTracks = this.subtitleTracks = null;\n  }\n  removeLevel(levelToRemove) {\n    const levels = this.levels;\n    if (levels) {\n      this.levels = levels.filter((level) => level !== levelToRemove);\n    }\n  }\n  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  onManifestLoaded(event, data) {\n    const {\n      contentSteering\n    } = 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  onManifestParsed(event, data) {\n    this.audioTracks = data.audioTracks;\n    this.subtitleTracks = data.subtitleTracks;\n  }\n  onError(event, data) {\n    const {\n      errorAction\n    } = data;\n    if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox && errorAction.flags === ErrorActionFlags.MoveAllAlternatesMatchingHost) {\n      const levels = this.levels;\n      let pathwayPriority = this.pathwayPriority;\n      let errorPathway = this.pathwayId;\n      if (data.context) {\n        const {\n          groupId,\n          pathwayId,\n          type\n        } = 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        pathwayPriority = levels.reduce((pathways, level) => {\n          if (pathways.indexOf(level.pathwayId) === -1) {\n            pathways.push(level.pathwayId);\n          }\n          return pathways;\n        }, []);\n      }\n      if (pathwayPriority && pathwayPriority.length > 1) {\n        this.updatePathwayPriority(pathwayPriority);\n        errorAction.resolved = this.pathwayId !== errorPathway;\n      }\n      if (!errorAction.resolved) {\n        logger.warn(`Could not resolve ${data.details} (\"${data.error.message}\") with content-steering for Pathway: ${errorPathway} levels: ${levels ? levels.length : levels} priorities: ${JSON.stringify(pathwayPriority)} penalized: ${JSON.stringify(this.penalizedPathways)}`);\n      }\n    }\n  }\n  filterParsedLevels(levels) {\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(`No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to \"${pathwayId}\"`);\n      pathwayLevels = this.getLevelsForPathway(pathwayId);\n      this.pathwayId = pathwayId;\n    }\n    if (pathwayLevels.length !== levels.length) {\n      this.log(`Found ${pathwayLevels.length}/${levels.length} levels in Pathway \"${this.pathwayId}\"`);\n      return pathwayLevels;\n    }\n    return levels;\n  }\n  getLevelsForPathway(pathwayId) {\n    if (this.levels === null) {\n      return [];\n    }\n    return this.levels.filter((level) => pathwayId === level.pathwayId);\n  }\n  updatePathwayPriority(pathwayPriority) {\n    this.pathwayPriority = pathwayPriority;\n    let levels;\n    const penalizedPathways = this.penalizedPathways;\n    const now2 = performance.now();\n    Object.keys(penalizedPathways).forEach((pathwayId) => {\n      if (now2 - 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 = 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, {\n          levels\n        });\n        const levelAfterChange = this.hls.levels[selectedIndex];\n        if (selectedLevel && levelAfterChange && this.levels) {\n          if (levelAfterChange.attrs[\"STABLE-VARIANT-ID\"] !== selectedLevel.attrs[\"STABLE-VARIANT-ID\"] && levelAfterChange.bitrate !== selectedLevel.bitrate) {\n            this.log(`Unstable Pathways change from bitrate ${selectedLevel.bitrate} to ${levelAfterChange.bitrate}`);\n          }\n          this.hls.nextLoadLevel = selectedIndex;\n        }\n        break;\n      }\n    }\n  }\n  getPathwayForGroupId(groupId, type, defaultPathway) {\n    const levels = this.getLevelsForPathway(defaultPathway).concat(this.levels || []);\n    for (let i = 0; i < levels.length; i++) {\n      if (type === PlaylistContextType.AUDIO_TRACK && levels[i].hasAudioGroup(groupId) || type === PlaylistContextType.SUBTITLE_TRACK && levels[i].hasSubtitleGroup(groupId)) {\n        return levels[i].pathwayId;\n      }\n    }\n    return defaultPathway;\n  }\n  clonePathways(pathwayClones) {\n    const levels = this.levels;\n    if (!levels) {\n      return;\n    }\n    const audioGroupCloneMap = {};\n    const subtitleGroupCloneMap = {};\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((baseLevel) => {\n        const attributes = new AttrList(baseLevel.attrs);\n        attributes[\"PATHWAY-ID\"] = cloneId;\n        const clonedAudioGroupId = attributes.AUDIO && `${attributes.AUDIO}_clone_${cloneId}`;\n        const clonedSubtitleGroupId = 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(baseLevel.uri, attributes[\"STABLE-VARIANT-ID\"], \"PER-VARIANT-URIS\", uriReplacement);\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(\"audio\", `${baseLevel.audioGroups[i]}_clone_${cloneId}`);\n          }\n        }\n        if (baseLevel.subtitleGroups) {\n          for (let i = 1; i < baseLevel.subtitleGroups.length; i++) {\n            clonedLevel.addGroupId(\"text\", `${baseLevel.subtitleGroups[i]}_clone_${cloneId}`);\n          }\n        }\n        return clonedLevel;\n      });\n      levels.push(...clonedVariants);\n      cloneRenditionGroups(this.audioTracks, audioGroupCloneMap, uriReplacement, cloneId);\n      cloneRenditionGroups(this.subtitleTracks, subtitleGroupCloneMap, uriReplacement, cloneId);\n    });\n  }\n  loadSteeringManifest(uri) {\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);\n    let 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 = (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 = {\n      responseType: \"json\",\n      url: url.href\n    };\n    const loadPolicy = config.steeringManifestLoadPolicy.default;\n    const legacyRetryCompatibility = loadPolicy.errorRetry || loadPolicy.timeoutRetry || {};\n    const loaderConfig = {\n      loadPolicy,\n      timeout: loadPolicy.maxLoadTimeMs,\n      maxRetry: legacyRetryCompatibility.maxNumRetry || 0,\n      retryDelay: legacyRetryCompatibility.retryDelayMs || 0,\n      maxRetryDelay: legacyRetryCompatibility.maxRetryDelayMs || 0\n    };\n    const callbacks = {\n      onSuccess: (response, stats, context2, networkDetails) => {\n        this.log(`Loaded steering manifest: \"${url}\"`);\n        const steeringData = response.data;\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(`Failed to parse Steering Manifest RELOAD-URI: ${reloadUri}`);\n            return;\n          }\n        }\n        this.scheduleRefresh(this.uri || context2.url);\n        if (pathwayClones) {\n          this.clonePathways(pathwayClones);\n        }\n        const loadedSteeringData = {\n          steeringManifest: steeringData,\n          url: url.toString()\n        };\n        this.hls.trigger(Events.STEERING_MANIFEST_LOADED, loadedSteeringData);\n        if (pathwayPriority) {\n          this.updatePathwayPriority(pathwayPriority);\n        }\n      },\n      onError: (error, context2, networkDetails, stats) => {\n        this.log(`Error loading steering manifest: ${error.code} ${error.text} (${context2.url})`);\n        this.stopLoad();\n        if (error.code === 410) {\n          this.enabled = false;\n          this.log(`Steering manifest ${context2.url} no longer available`);\n          return;\n        }\n        let ttl = this.timeToLoad * 1e3;\n        if (error.code === 429) {\n          const loader = this.loader;\n          if (typeof (loader == null ? void 0 : loader.getResponseHeader) === \"function\") {\n            const retryAfter = loader.getResponseHeader(\"Retry-After\");\n            if (retryAfter) {\n              ttl = parseFloat(retryAfter) * 1e3;\n            }\n          }\n          this.log(`Steering manifest ${context2.url} rate limited`);\n          return;\n        }\n        this.scheduleRefresh(this.uri || context2.url, ttl);\n      },\n      onTimeout: (stats, context2, networkDetails) => {\n        this.log(`Timeout loading steering manifest (${context2.url})`);\n        this.scheduleRefresh(this.uri || context2.url);\n      }\n    };\n    this.log(`Requesting steering manifest: ${url}`);\n    this.loader.load(context, loaderConfig, callbacks);\n  }\n  scheduleRefresh(uri, ttlMs = this.timeToLoad * 1e3) {\n    this.clearTimeout();\n    this.reloadTimer = self.setTimeout(() => {\n      var _this$hls;\n      const media = (_this$hls = this.hls) == null ? void 0 : _this$hls.media;\n      if (media && !media.ended) {\n        this.loadSteeringManifest(uri);\n        return;\n      }\n      this.scheduleRefresh(uri, this.timeToLoad * 1e3);\n    }, ttlMs);\n  }\n}\nfunction cloneRenditionGroups(tracks, groupCloneMap, uriReplacement, cloneId) {\n  if (!tracks) {\n    return;\n  }\n  Object.keys(groupCloneMap).forEach((audioGroupId) => {\n    const clonedTracks = tracks.filter((track) => track.groupId === audioGroupId).map((track) => {\n      const clonedTrack = _extends({}, track);\n      clonedTrack.details = void 0;\n      clonedTrack.attrs = new AttrList(clonedTrack.attrs);\n      clonedTrack.url = clonedTrack.attrs.URI = performUriReplacement(track.url, track.attrs[\"STABLE-RENDITION-ID\"], \"PER-RENDITION-URIS\", uriReplacement);\n      clonedTrack.groupId = clonedTrack.attrs[\"GROUP-ID\"] = groupCloneMap[audioGroupId];\n      clonedTrack.attrs[\"PATHWAY-ID\"] = cloneId;\n      return clonedTrack;\n    });\n    tracks.push(...clonedTracks);\n  });\n}\nfunction performUriReplacement(uri, stableId, perOptionKey, uriReplacement) {\n  const {\n    HOST: host,\n    PARAMS: params,\n    [perOptionKey]: perOptionUris\n  } = uriReplacement;\n  let perVariantUri;\n  if (stableId) {\n    perVariantUri = perOptionUris == null ? void 0 : 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).sort().forEach((key) => {\n      if (key) {\n        url.searchParams.set(key, params[key]);\n      }\n    });\n  }\n  return url.href;\n}\nconst AGE_HEADER_LINE_REGEX = /^age:\\s*[\\d.]+\\s*$/im;\nclass XhrLoader {\n  constructor(config) {\n    this.xhrSetup = void 0;\n    this.requestTimeout = void 0;\n    this.retryTimeout = void 0;\n    this.retryDelay = void 0;\n    this.config = null;\n    this.callbacks = null;\n    this.context = null;\n    this.loader = null;\n    this.stats = void 0;\n    this.xhrSetup = config ? config.xhrSetup || null : null;\n    this.stats = new LoadStats();\n    this.retryDelay = 0;\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    this.stats = null;\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  abort() {\n    var _this$callbacks;\n    this.abortInternal();\n    if ((_this$callbacks = this.callbacks) != null && _this$callbacks.onAbort) {\n      this.callbacks.onAbort(this.stats, this.context, this.loader);\n    }\n  }\n  load(context, config, callbacks) {\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  loadInternal() {\n    const {\n      config,\n      context\n    } = this;\n    if (!config || !context) {\n      return;\n    }\n    const xhr = this.loader = new self.XMLHttpRequest();\n    const stats = this.stats;\n    stats.loading.first = 0;\n    stats.loaded = 0;\n    stats.aborted = false;\n    const xhrSetup = this.xhrSetup;\n    if (xhrSetup) {\n      Promise.resolve().then(() => {\n        if (this.stats.aborted)\n          return;\n        return xhrSetup(xhr, context.url);\n      }).catch((error) => {\n        xhr.open(\"GET\", context.url, true);\n        return xhrSetup(xhr, context.url);\n      }).then(() => {\n        if (this.stats.aborted)\n          return;\n        this.openAndSendXhr(xhr, context, config);\n      }).catch((error) => {\n        this.callbacks.onError({\n          code: xhr.status,\n          text: error.message\n        }, context, xhr, stats);\n        return;\n      });\n    } else {\n      this.openAndSendXhr(xhr, context, config);\n    }\n  }\n  openAndSendXhr(xhr, context, config) {\n    if (!xhr.readyState) {\n      xhr.open(\"GET\", context.url, true);\n    }\n    const headers = context.headers;\n    const {\n      maxTimeToFirstByteMs,\n      maxLoadTimeMs\n    } = config.loadPolicy;\n    if (headers) {\n      for (const header in headers) {\n        xhr.setRequestHeader(header, headers[header]);\n      }\n    }\n    if (context.rangeEnd) {\n      xhr.setRequestHeader(\"Range\", \"bytes=\" + context.rangeStart + \"-\" + (context.rangeEnd - 1));\n    }\n    xhr.onreadystatechange = this.readystatechange.bind(this);\n    xhr.onprogress = this.loadprogress.bind(this);\n    xhr.responseType = context.responseType;\n    self.clearTimeout(this.requestTimeout);\n    config.timeout = maxTimeToFirstByteMs && isFiniteNumber(maxTimeToFirstByteMs) ? maxTimeToFirstByteMs : maxLoadTimeMs;\n    this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), config.timeout);\n    xhr.send();\n  }\n  readystatechange() {\n    const {\n      context,\n      loader: xhr,\n      stats\n    } = this;\n    if (!context || !xhr) {\n      return;\n    }\n    const readyState = xhr.readyState;\n    const config = this.config;\n    if (stats.aborted) {\n      return;\n    }\n    if (readyState >= 2) {\n      if (stats.loading.first === 0) {\n        stats.loading.first = Math.max(self.performance.now(), stats.loading.start);\n        if (config.timeout !== config.loadPolicy.maxLoadTimeMs) {\n          self.clearTimeout(this.requestTimeout);\n          config.timeout = config.loadPolicy.maxLoadTimeMs;\n          this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), config.loadPolicy.maxLoadTimeMs - (stats.loading.first - stats.loading.start));\n        }\n      }\n      if (readyState === 4) {\n        self.clearTimeout(this.requestTimeout);\n        xhr.onreadystatechange = null;\n        xhr.onprogress = null;\n        const status2 = xhr.status;\n        const useResponse = xhr.responseType !== \"text\";\n        if (status2 >= 200 && status2 < 300 && (useResponse && xhr.response || xhr.responseText !== null)) {\n          stats.loading.end = Math.max(self.performance.now(), stats.loading.first);\n          const data = useResponse ? xhr.response : xhr.responseText;\n          const len = xhr.responseType === \"arraybuffer\" ? data.byteLength : data.length;\n          stats.loaded = stats.total = len;\n          stats.bwEstimate = stats.total * 8e3 / (stats.loading.end - stats.loading.first);\n          if (!this.callbacks) {\n            return;\n          }\n          const onProgress = this.callbacks.onProgress;\n          if (onProgress) {\n            onProgress(stats, context, data, xhr);\n          }\n          if (!this.callbacks) {\n            return;\n          }\n          const response = {\n            url: xhr.responseURL,\n            data,\n            code: status2\n          };\n          this.callbacks.onSuccess(response, stats, context, xhr);\n        } else {\n          const retryConfig = config.loadPolicy.errorRetry;\n          const retryCount = stats.retry;\n          const response = {\n            url: context.url,\n            data: void 0,\n            code: status2\n          };\n          if (shouldRetry(retryConfig, retryCount, false, response)) {\n            this.retry(retryConfig);\n          } else {\n            logger.error(`${status2} while loading ${context.url}`);\n            this.callbacks.onError({\n              code: status2,\n              text: xhr.statusText\n            }, context, xhr, stats);\n          }\n        }\n      }\n    }\n  }\n  loadtimeout() {\n    var _this$config;\n    const retryConfig = (_this$config = this.config) == null ? void 0 : _this$config.loadPolicy.timeoutRetry;\n    const retryCount = this.stats.retry;\n    if (shouldRetry(retryConfig, retryCount, true)) {\n      this.retry(retryConfig);\n    } else {\n      var _this$context;\n      logger.warn(`timeout while loading ${(_this$context = this.context) == null ? void 0 : _this$context.url}`);\n      const callbacks = this.callbacks;\n      if (callbacks) {\n        this.abortInternal();\n        callbacks.onTimeout(this.stats, this.context, this.loader);\n      }\n    }\n  }\n  retry(retryConfig) {\n    const {\n      context,\n      stats\n    } = this;\n    this.retryDelay = getRetryDelay(retryConfig, stats.retry);\n    stats.retry++;\n    logger.warn(`${status ? \"HTTP Status \" + status : \"Timeout\"} while loading ${context == null ? void 0 : context.url}, retrying ${stats.retry}/${retryConfig.maxNumRetry} in ${this.retryDelay}ms`);\n    this.abortInternal();\n    this.loader = null;\n    self.clearTimeout(this.retryTimeout);\n    this.retryTimeout = self.setTimeout(this.loadInternal.bind(this), this.retryDelay);\n  }\n  loadprogress(event) {\n    const stats = this.stats;\n    stats.loaded = event.loaded;\n    if (event.lengthComputable) {\n      stats.total = event.total;\n    }\n  }\n  getCacheAge() {\n    let result = null;\n    if (this.loader && AGE_HEADER_LINE_REGEX.test(this.loader.getAllResponseHeaders())) {\n      const ageHeader = this.loader.getResponseHeader(\"age\");\n      result = ageHeader ? parseFloat(ageHeader) : null;\n    }\n    return result;\n  }\n  getResponseHeader(name) {\n    if (this.loader && new RegExp(`^${name}:\\\\s*[\\\\d.]+\\\\s*$`, \"im\").test(this.loader.getAllResponseHeaders())) {\n      return this.loader.getResponseHeader(name);\n    }\n    return null;\n  }\n}\nfunction fetchSupported() {\n  if (\n    // @ts-ignore\n    self.fetch && self.AbortController && self.ReadableStream && self.Request\n  ) {\n    try {\n      new self.ReadableStream({});\n      return true;\n    } catch (e) {\n    }\n  }\n  return false;\n}\nconst BYTERANGE = /(\\d+)-(\\d+)\\/(\\d+)/;\nclass FetchLoader {\n  constructor(config) {\n    this.fetchSetup = void 0;\n    this.requestTimeout = void 0;\n    this.request = null;\n    this.response = null;\n    this.controller = void 0;\n    this.context = null;\n    this.config = null;\n    this.callbacks = null;\n    this.stats = void 0;\n    this.loader = null;\n    this.fetchSetup = config.fetchSetup || getRequest;\n    this.controller = new self.AbortController();\n    this.stats = new LoadStats();\n  }\n  destroy() {\n    this.loader = this.callbacks = this.context = this.config = this.request = null;\n    this.abortInternal();\n    this.response = null;\n    this.fetchSetup = this.controller = this.stats = null;\n  }\n  abortInternal() {\n    if (this.controller && !this.stats.loading.end) {\n      this.stats.aborted = true;\n      this.controller.abort();\n    }\n  }\n  abort() {\n    var _this$callbacks;\n    this.abortInternal();\n    if ((_this$callbacks = this.callbacks) != null && _this$callbacks.onAbort) {\n      this.callbacks.onAbort(this.stats, this.context, this.response);\n    }\n  }\n  load(context, config, callbacks) {\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    const initParams = getRequestParameters(context, this.controller.signal);\n    const onProgress = callbacks.onProgress;\n    const isArrayBuffer = context.responseType === \"arraybuffer\";\n    const LENGTH = isArrayBuffer ? \"byteLength\" : \"length\";\n    const {\n      maxTimeToFirstByteMs,\n      maxLoadTimeMs\n    } = config.loadPolicy;\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 = maxTimeToFirstByteMs && isFiniteNumber(maxTimeToFirstByteMs) ? maxTimeToFirstByteMs : maxLoadTimeMs;\n    this.requestTimeout = self.setTimeout(() => {\n      this.abortInternal();\n      callbacks.onTimeout(stats, context, this.response);\n    }, config.timeout);\n    self.fetch(this.request).then((response) => {\n      this.response = this.loader = response;\n      const first = Math.max(self.performance.now(), stats.loading.start);\n      self.clearTimeout(this.requestTimeout);\n      config.timeout = maxLoadTimeMs;\n      this.requestTimeout = self.setTimeout(() => {\n        this.abortInternal();\n        callbacks.onTimeout(stats, context, this.response);\n      }, maxLoadTimeMs - (first - stats.loading.start));\n      if (!response.ok) {\n        const {\n          status: status2,\n          statusText\n        } = response;\n        throw new FetchError(statusText || \"fetch, bad network response\", status2, response);\n      }\n      stats.loading.first = first;\n      stats.total = getContentLength(response.headers) || stats.total;\n      if (onProgress && isFiniteNumber(config.highWaterMark)) {\n        return this.loadProgressively(response, stats, context, config.highWaterMark, onProgress);\n      }\n      if (isArrayBuffer) {\n        return response.arrayBuffer();\n      }\n      if (context.responseType === \"json\") {\n        return response.json();\n      }\n      return response.text();\n    }).then((responseData) => {\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(self.performance.now(), stats.loading.first);\n      const total = responseData[LENGTH];\n      if (total) {\n        stats.loaded = stats.total = total;\n      }\n      const loaderResponse = {\n        url: response.url,\n        data: responseData,\n        code: response.status\n      };\n      if (onProgress && !isFiniteNumber(config.highWaterMark)) {\n        onProgress(stats, context, responseData, response);\n      }\n      callbacks.onSuccess(loaderResponse, stats, context, response);\n    }).catch((error) => {\n      self.clearTimeout(this.requestTimeout);\n      if (stats.aborted) {\n        return;\n      }\n      const code = !error ? 0 : error.code || 0;\n      const text = !error ? null : error.message;\n      callbacks.onError({\n        code,\n        text\n      }, context, error ? error.details : null, stats);\n    });\n  }\n  getCacheAge() {\n    let result = 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  getResponseHeader(name) {\n    return this.response ? this.response.headers.get(name) : null;\n  }\n  loadProgressively(response, stats, context, highWaterMark = 0, onProgress) {\n    const chunkCache = new ChunkCache();\n    const reader = response.body.getReader();\n    const pump = () => {\n      return reader.read().then((data) => {\n        if (data.done) {\n          if (chunkCache.dataLength) {\n            onProgress(stats, context, chunkCache.flush(), response);\n          }\n          return Promise.resolve(new ArrayBuffer(0));\n        }\n        const chunk = data.value;\n        const len = chunk.length;\n        stats.loaded += len;\n        if (len < highWaterMark || chunkCache.dataLength) {\n          chunkCache.push(chunk);\n          if (chunkCache.dataLength >= highWaterMark) {\n            onProgress(stats, context, chunkCache.flush(), response);\n          }\n        } else {\n          onProgress(stats, context, chunk, response);\n        }\n        return pump();\n      }).catch(() => {\n        return Promise.reject();\n      });\n    };\n    return pump();\n  }\n}\nfunction getRequestParameters(context, signal) {\n  const initParams = {\n    method: \"GET\",\n    mode: \"cors\",\n    credentials: \"same-origin\",\n    signal,\n    headers: new self.Headers(_extends({}, context.headers))\n  };\n  if (context.rangeEnd) {\n    initParams.headers.set(\"Range\", \"bytes=\" + context.rangeStart + \"-\" + String(context.rangeEnd - 1));\n  }\n  return initParams;\n}\nfunction getByteRangeLength(byteRangeHeader) {\n  const result = BYTERANGE.exec(byteRangeHeader);\n  if (result) {\n    return parseInt(result[2]) - parseInt(result[1]) + 1;\n  }\n}\nfunction getContentLength(headers) {\n  const contentRange = headers.get(\"Content-Range\");\n  if (contentRange) {\n    const byteRangeLength = getByteRangeLength(contentRange);\n    if (isFiniteNumber(byteRangeLength)) {\n      return byteRangeLength;\n    }\n  }\n  const contentLength = headers.get(\"Content-Length\");\n  if (contentLength) {\n    return parseInt(contentLength);\n  }\n}\nfunction getRequest(context, initParams) {\n  return new self.Request(context.url, initParams);\n}\nclass FetchError extends Error {\n  constructor(message, code, details) {\n    super(message);\n    this.code = void 0;\n    this.details = void 0;\n    this.code = code;\n    this.details = details;\n  }\n}\nconst WHITESPACE_CHAR = /\\s/;\nconst Cues = {\n  newCue(track, startTime, endTime, captionScreen) {\n    const result = [];\n    let row;\n    let cue;\n    let indenting;\n    let indent;\n    let text;\n    const Cue = self.VTTCue || self.TextTrackCue;\n    for (let r = 0; r < captionScreen.rows.length; r++) {\n      row = captionScreen.rows[r];\n      indenting = true;\n      indent = 0;\n      text = \"\";\n      if (!row.isEmpty()) {\n        var _track$cues;\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        row.cueStartTime = startTime;\n        if (startTime === endTime) {\n          endTime += 1e-4;\n        }\n        if (indent >= 16) {\n          indent--;\n        } else {\n          indent++;\n        }\n        const cueText = fixLineBreaks(text.trim());\n        const id = generateCueId(startTime, endTime, cueText);\n        if (!(track != null && (_track$cues = track.cues) != null && _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          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      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((cue2) => addCueToTrack(track, cue2));\n    }\n    return result;\n  }\n};\nconst defaultLoadPolicy = {\n  maxTimeToFirstByteMs: 8e3,\n  maxLoadTimeMs: 2e4,\n  timeoutRetry: null,\n  errorRetry: null\n};\nconst hlsDefaultConfig = _objectSpread2(_objectSpread2({\n  autoStartLoad: true,\n  // used by stream-controller\n  startPosition: -1,\n  // used by stream-controller\n  defaultAudioCodec: void 0,\n  // used by stream-controller\n  debug: false,\n  // used by logger\n  capLevelOnFPSDrop: false,\n  // used by fps-controller\n  capLevelToPlayerSize: false,\n  // used by cap-level-controller\n  ignoreDevicePixelRatio: false,\n  // used by cap-level-controller\n  preferManagedMediaSource: true,\n  initialLiveManifestSize: 1,\n  // used by stream-controller\n  maxBufferLength: 30,\n  // used by stream-controller\n  backBufferLength: Infinity,\n  // used by buffer-controller\n  frontBufferFlushThreshold: Infinity,\n  maxBufferSize: 60 * 1e3 * 1e3,\n  // used by stream-controller\n  maxBufferHole: 0.1,\n  // used by stream-controller\n  highBufferWatchdogPeriod: 2,\n  // used by stream-controller\n  nudgeOffset: 0.1,\n  // used by stream-controller\n  nudgeMaxRetry: 3,\n  // used by stream-controller\n  maxFragLookUpTolerance: 0.25,\n  // used by stream-controller\n  liveSyncDurationCount: 3,\n  // used by latency-controller\n  liveMaxLatencyDurationCount: Infinity,\n  // used by latency-controller\n  liveSyncDuration: void 0,\n  // used by latency-controller\n  liveMaxLatencyDuration: void 0,\n  // used by latency-controller\n  maxLiveSyncPlaybackRate: 1,\n  // used by latency-controller\n  liveDurationInfinity: false,\n  // used by buffer-controller\n  /**\n   * @deprecated use backBufferLength\n   */\n  liveBackBufferLength: null,\n  // used by buffer-controller\n  maxMaxBufferLength: 600,\n  // used by stream-controller\n  enableWorker: true,\n  // used by transmuxer\n  workerPath: null,\n  // used by transmuxer\n  enableSoftwareAES: true,\n  // used by decrypter\n  startLevel: void 0,\n  // used by level-controller\n  startFragPrefetch: false,\n  // used by stream-controller\n  fpsDroppedMonitoringPeriod: 5e3,\n  // used by fps-controller\n  fpsDroppedMonitoringThreshold: 0.2,\n  // used by fps-controller\n  appendErrorMaxRetry: 3,\n  // used by buffer-controller\n  loader: XhrLoader,\n  // loader: FetchLoader,\n  fLoader: void 0,\n  // used by fragment-loader\n  pLoader: void 0,\n  // used by playlist-loader\n  xhrSetup: void 0,\n  // used by xhr-loader\n  licenseXhrSetup: void 0,\n  // used by eme-controller\n  licenseResponseCallback: void 0,\n  // used by eme-controller\n  abrController: AbrController,\n  bufferController: BufferController,\n  capLevelController: CapLevelController,\n  errorController: ErrorController,\n  fpsController: FPSController,\n  stretchShortVideoTrack: false,\n  // used by mp4-remuxer\n  maxAudioFramesDrift: 1,\n  // used by mp4-remuxer\n  forceKeyFrameOnDiscontinuity: true,\n  // used by ts-demuxer\n  abrEwmaFastLive: 3,\n  // used by abr-controller\n  abrEwmaSlowLive: 9,\n  // used by abr-controller\n  abrEwmaFastVoD: 3,\n  // used by abr-controller\n  abrEwmaSlowVoD: 9,\n  // used by abr-controller\n  abrEwmaDefaultEstimate: 5e5,\n  // 500 kbps  // used by abr-controller\n  abrEwmaDefaultEstimateMax: 5e6,\n  // 5 mbps\n  abrBandWidthFactor: 0.95,\n  // used by abr-controller\n  abrBandWidthUpFactor: 0.7,\n  // used by abr-controller\n  abrMaxWithRealBitrate: false,\n  // used by abr-controller\n  maxStarvationDelay: 4,\n  // used by abr-controller\n  maxLoadingDelay: 4,\n  // used by abr-controller\n  minAutoBitrate: 0,\n  // used by hls\n  emeEnabled: false,\n  // used by eme-controller\n  widevineLicenseUrl: void 0,\n  // used by eme-controller\n  drmSystems: {},\n  // used by eme-controller\n  drmSystemOptions: {},\n  // used by eme-controller\n  requestMediaKeySystemAccessFunc: requestMediaKeySystemAccess,\n  // used by eme-controller\n  testBandwidth: true,\n  progressive: false,\n  lowLatencyMode: true,\n  cmcd: void 0,\n  enableDateRangeMetadataCues: true,\n  enableEmsgMetadataCues: true,\n  enableID3MetadataCues: true,\n  useMediaCapabilities: true,\n  certLoadPolicy: {\n    default: defaultLoadPolicy\n  },\n  keyLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 8e3,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 2e4,\n        backoff: \"linear\"\n      },\n      errorRetry: {\n        maxNumRetry: 8,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 2e4,\n        backoff: \"linear\"\n      }\n    }\n  },\n  manifestLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: Infinity,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  playlistLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  fragLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 12e4,\n      timeoutRetry: {\n        maxNumRetry: 4,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 6,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  steeringManifestLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  // These default settings are deprecated in favor of the above policies\n  // and are maintained for backwards compatibility\n  manifestLoadingTimeOut: 1e4,\n  manifestLoadingMaxRetry: 1,\n  manifestLoadingRetryDelay: 1e3,\n  manifestLoadingMaxRetryTimeout: 64e3,\n  levelLoadingTimeOut: 1e4,\n  levelLoadingMaxRetry: 4,\n  levelLoadingRetryDelay: 1e3,\n  levelLoadingMaxRetryTimeout: 64e3,\n  fragLoadingTimeOut: 2e4,\n  fragLoadingMaxRetry: 6,\n  fragLoadingRetryDelay: 1e3,\n  fragLoadingMaxRetryTimeout: 64e3\n}, timelineConfig()), {}, {\n  subtitleStreamController: SubtitleStreamController,\n  subtitleTrackController: SubtitleTrackController,\n  timelineController: TimelineController,\n  audioStreamController: AudioStreamController,\n  audioTrackController: AudioTrackController,\n  emeController: EMEController,\n  cmcdController: CMCDController,\n  contentSteeringController: ContentSteeringController\n});\nfunction timelineConfig() {\n  return {\n    cueHandler: Cues,\n    // used by timeline-controller\n    enableWebVTT: true,\n    // used by timeline-controller\n    enableIMSC1: true,\n    // used by timeline-controller\n    enableCEA708Captions: true,\n    // used by timeline-controller\n    captionsTextTrack1Label: \"English\",\n    // used by timeline-controller\n    captionsTextTrack1LanguageCode: \"en\",\n    // used by timeline-controller\n    captionsTextTrack2Label: \"Spanish\",\n    // used by timeline-controller\n    captionsTextTrack2LanguageCode: \"es\",\n    // used by timeline-controller\n    captionsTextTrack3Label: \"Unknown CC\",\n    // used by timeline-controller\n    captionsTextTrack3LanguageCode: \"\",\n    // used by timeline-controller\n    captionsTextTrack4Label: \"Unknown CC\",\n    // used by timeline-controller\n    captionsTextTrack4LanguageCode: \"\",\n    // used by timeline-controller\n    renderTextTracksNatively: true\n  };\n}\nfunction mergeConfig(defaultConfig, userConfig) {\n  if ((userConfig.liveSyncDurationCount || userConfig.liveMaxLatencyDurationCount) && (userConfig.liveSyncDuration || userConfig.liveMaxLatencyDuration)) {\n    throw new Error(\"Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration\");\n  }\n  if (userConfig.liveMaxLatencyDurationCount !== void 0 && (userConfig.liveSyncDurationCount === void 0 || userConfig.liveMaxLatencyDurationCount <= userConfig.liveSyncDurationCount)) {\n    throw new Error('Illegal hls.js config: \"liveMaxLatencyDurationCount\" must be greater than \"liveSyncDurationCount\"');\n  }\n  if (userConfig.liveMaxLatencyDuration !== void 0 && (userConfig.liveSyncDuration === void 0 || userConfig.liveMaxLatencyDuration <= userConfig.liveSyncDuration)) {\n    throw new Error('Illegal hls.js config: \"liveMaxLatencyDuration\" must be greater than \"liveSyncDuration\"');\n  }\n  const defaultsCopy = deepCpy(defaultConfig);\n  const deprecatedSettingTypes = [\"manifest\", \"level\", \"frag\"];\n  const deprecatedSettings = [\"TimeOut\", \"MaxRetry\", \"RetryDelay\", \"MaxRetryTimeout\"];\n  deprecatedSettingTypes.forEach((type) => {\n    const policyName = `${type === \"level\" ? \"playlist\" : type}LoadPolicy`;\n    const policyNotSet = userConfig[policyName] === void 0;\n    const report = [];\n    deprecatedSettings.forEach((setting) => {\n      const deprecatedSetting = `${type}Loading${setting}`;\n      const value = userConfig[deprecatedSetting];\n      if (value !== void 0 && policyNotSet) {\n        report.push(deprecatedSetting);\n        const settings = defaultsCopy[policyName].default;\n        userConfig[policyName] = {\n          default: settings\n        };\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(`hls.js config: \"${report.join('\", \"')}\" setting(s) are deprecated, use \"${policyName}\": ${JSON.stringify(userConfig[policyName])}`);\n    }\n  });\n  return _objectSpread2(_objectSpread2({}, defaultsCopy), userConfig);\n}\nfunction deepCpy(obj) {\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}\nfunction enableStreamingMode(config) {\n  const currentLoader = config.loader;\n  if (currentLoader !== FetchLoader && currentLoader !== XhrLoader) {\n    logger.log(\"[config]: Custom loader detected, cannot enable progressive streaming\");\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}\nlet chromeOrFirefox;\nclass LevelController extends BasePlaylistController {\n  constructor(hls, contentSteeringController) {\n    super(hls, \"[level-controller]\");\n    this._levels = [];\n    this._firstLevel = -1;\n    this._maxAutoLevel = -1;\n    this._startLevel = void 0;\n    this.currentLevel = null;\n    this.currentLevelIndex = -1;\n    this.manualLevelIndex = -1;\n    this.steering = void 0;\n    this.onParsedComplete = void 0;\n    this.steering = contentSteeringController;\n    this._registerListeners();\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = 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  _unregisterListeners() {\n    const {\n      hls\n    } = 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  destroy() {\n    this._unregisterListeners();\n    this.steering = null;\n    this.resetLevels();\n    super.destroy();\n  }\n  stopLoad() {\n    const levels = this._levels;\n    levels.forEach((level) => {\n      level.loadError = 0;\n      level.fragmentError = 0;\n    });\n    super.stopLoad();\n  }\n  resetLevels() {\n    this._startLevel = void 0;\n    this.manualLevelIndex = -1;\n    this.currentLevelIndex = -1;\n    this.currentLevel = null;\n    this._levels = [];\n    this._maxAutoLevel = -1;\n  }\n  onManifestLoading(event, data) {\n    this.resetLevels();\n  }\n  onManifestLoaded(event, data) {\n    const preferManagedMediaSource = this.hls.config.preferManagedMediaSource;\n    const levels = [];\n    const redundantSet = {};\n    const generatePathwaySet = {};\n    let resolutionFound = false;\n    let videoCodecFound = false;\n    let audioCodecFound = false;\n    data.levels.forEach((levelParsed) => {\n      var _audioCodec, _videoCodec;\n      const attributes = levelParsed.attrs;\n      let {\n        audioCodec,\n        videoCodec\n      } = levelParsed;\n      if (((_audioCodec = audioCodec) == null ? void 0 : _audioCodec.indexOf(\"mp4a.40.34\")) !== -1) {\n        chromeOrFirefox || (chromeOrFirefox = /chrome|firefox/i.test(navigator.userAgent));\n        if (chromeOrFirefox) {\n          levelParsed.audioCodec = audioCodec = void 0;\n        }\n      }\n      if (audioCodec) {\n        levelParsed.audioCodec = audioCodec = getCodecCompatibleName(audioCodec, preferManagedMediaSource);\n      }\n      if (((_videoCodec = videoCodec) == null ? void 0 : _videoCodec.indexOf(\"avc1\")) === 0) {\n        videoCodec = levelParsed.videoCodec = convertAVC1ToAVCOTI(videoCodec);\n      }\n      const {\n        width,\n        height,\n        unknownCodecs\n      } = levelParsed;\n      resolutionFound || (resolutionFound = !!(width && height));\n      videoCodecFound || (videoCodecFound = !!videoCodec);\n      audioCodecFound || (audioCodecFound = !!audioCodec);\n      if (unknownCodecs != null && unknownCodecs.length || audioCodec && !areCodecsMediaSourceSupported(audioCodec, \"audio\", preferManagedMediaSource) || videoCodec && !areCodecsMediaSourceSupported(videoCodec, \"video\", preferManagedMediaSource)) {\n        return;\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      if (!redundantSet[levelKey]) {\n        const level = new Level(levelParsed);\n        redundantSet[levelKey] = level;\n        generatePathwaySet[levelKey] = 1;\n        levels.push(level);\n      } else if (redundantSet[levelKey].uri !== levelParsed.url && !levelParsed.attrs[\"PATHWAY-ID\"]) {\n        const pathwayCount = generatePathwaySet[levelKey] += 1;\n        levelParsed.attrs[\"PATHWAY-ID\"] = new Array(pathwayCount + 1).join(\".\");\n        const level = new Level(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    this.filterAndSortMediaOptions(levels, data, resolutionFound, videoCodecFound, audioCodecFound);\n  }\n  filterAndSortMediaOptions(filteredLevels, data, resolutionFound, videoCodecFound, audioCodecFound) {\n    let audioTracks = [];\n    let subtitleTracks = [];\n    let levels = filteredLevels;\n    if ((resolutionFound || videoCodecFound) && audioCodecFound) {\n      levels = levels.filter(({\n        videoCodec,\n        videoRange,\n        width,\n        height\n      }) => (!!videoCodec || !!(width && height)) && isVideoRange(videoRange));\n    }\n    if (levels.length === 0) {\n      Promise.resolve().then(() => {\n        if (this.hls) {\n          if (data.levels.length) {\n            this.warn(`One or more CODECS in variant not supported: ${JSON.stringify(data.levels[0].attrs)}`);\n          }\n          const error = new Error(\"no level with compatible codecs found in manifest\");\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: error.message\n          });\n        }\n      });\n      return;\n    }\n    if (data.audioTracks) {\n      const {\n        preferManagedMediaSource\n      } = this.hls.config;\n      audioTracks = data.audioTracks.filter((track) => !track.audioCodec || areCodecsMediaSourceSupported(track.audioCodec, \"audio\", preferManagedMediaSource));\n      assignTrackIdsByGroup(audioTracks);\n    }\n    if (data.subtitles) {\n      subtitleTracks = data.subtitles;\n      assignTrackIdsByGroup(subtitleTracks);\n    }\n    const unsortedLevels = levels.slice(0);\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\"] || \"\") ? 1 : -1;\n      }\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 VideoRangeValues.indexOf(a.videoRange) - VideoRangeValues.indexOf(b.videoRange);\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    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    this._levels = levels;\n    for (let i = 0; i < levels.length; i++) {\n      if (levels[i] === firstLevelInPlaylist) {\n        var _this$hls$userConfig;\n        this._firstLevel = i;\n        const firstLevelBitrate = firstLevelInPlaylist.bitrate;\n        const bandwidthEstimate = this.hls.bandwidthEstimate;\n        this.log(`manifest loaded, ${levels.length} level(s) found, first bitrate: ${firstLevelBitrate}`);\n        if (((_this$hls$userConfig = this.hls.userConfig) == null ? void 0 : _this$hls$userConfig.abrEwmaDefaultEstimate) === void 0) {\n          const startingBwEstimate = Math.min(firstLevelBitrate, this.hls.config.abrEwmaDefaultEstimateMax);\n          if (startingBwEstimate > bandwidthEstimate && bandwidthEstimate === hlsDefaultConfig.abrEwmaDefaultEstimate) {\n            this.hls.bandwidthEstimate = startingBwEstimate;\n          }\n        }\n        break;\n      }\n    }\n    const audioOnly = audioCodecFound && !videoCodecFound;\n    const edata = {\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: !audioOnly && audioTracks.some((t) => !!t.url)\n    };\n    this.hls.trigger(Events.MANIFEST_PARSED, edata);\n    if (this.hls.config.autoStartLoad || this.hls.forceStartLoad) {\n      this.hls.startLoad(this.hls.config.startPosition);\n    }\n  }\n  get levels() {\n    if (this._levels.length === 0) {\n      return null;\n    }\n    return this._levels;\n  }\n  get level() {\n    return this.currentLevelIndex;\n  }\n  set level(newLevel) {\n    const levels = this._levels;\n    if (levels.length === 0) {\n      return;\n    }\n    if (newLevel < 0 || newLevel >= levels.length) {\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    const lastLevelIndex = this.currentLevelIndex;\n    const lastLevel = this.currentLevel;\n    const lastPathwayId = lastLevel ? lastLevel.attrs[\"PATHWAY-ID\"] : void 0;\n    const level = levels[newLevel];\n    const pathwayId = level.attrs[\"PATHWAY-ID\"];\n    this.currentLevelIndex = newLevel;\n    this.currentLevel = level;\n    if (lastLevelIndex === newLevel && level.details && lastLevel && lastPathwayId === pathwayId) {\n      return;\n    }\n    this.log(`Switching to level ${newLevel} (${level.height ? level.height + \"p \" : \"\"}${level.videoRange ? level.videoRange + \" \" : \"\"}${level.codecSet ? level.codecSet + \" \" : \"\"}@${level.bitrate})${pathwayId ? \" with Pathway \" + pathwayId : \"\"} from level ${lastLevelIndex}${lastPathwayId ? \" with Pathway \" + lastPathwayId : \"\"}`);\n    const 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    this.hls.trigger(Events.LEVEL_SWITCHING, levelSwitchingData);\n    const levelDetails = level.details;\n    if (!levelDetails || levelDetails.live) {\n      const hlsUrlParameters = this.switchParams(level.uri, lastLevel == null ? void 0 : lastLevel.details);\n      this.loadPlaylist(hlsUrlParameters);\n    }\n  }\n  get manualLevel() {\n    return this.manualLevelIndex;\n  }\n  set manualLevel(newLevel) {\n    this.manualLevelIndex = newLevel;\n    if (this._startLevel === void 0) {\n      this._startLevel = newLevel;\n    }\n    if (newLevel !== -1) {\n      this.level = newLevel;\n    }\n  }\n  get firstLevel() {\n    return this._firstLevel;\n  }\n  set firstLevel(newLevel) {\n    this._firstLevel = newLevel;\n  }\n  get startLevel() {\n    if (this._startLevel === void 0) {\n      const configStartLevel = this.hls.config.startLevel;\n      if (configStartLevel !== void 0) {\n        return configStartLevel;\n      }\n      return this.hls.firstAutoLevel;\n    }\n    return this._startLevel;\n  }\n  set startLevel(newLevel) {\n    this._startLevel = newLevel;\n  }\n  onError(event, data) {\n    if (data.fatal || !data.context) {\n      return;\n    }\n    if (data.context.type === PlaylistContextType.LEVEL && data.context.level === this.level) {\n      this.checkRetry(data);\n    }\n  }\n  // reset errors on the successful load of a fragment\n  onFragBuffered(event, {\n    frag\n  }) {\n    if (frag !== void 0 && 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 != null && level.loadError) {\n        this.log(`Resetting level error count of ${level.loadError} on frag buffered`);\n        level.loadError = 0;\n      }\n    }\n  }\n  onLevelLoaded(event, data) {\n    var _data$deliveryDirecti2;\n    const {\n      level,\n      details\n    } = data;\n    const curLevel = this._levels[level];\n    if (!curLevel) {\n      var _data$deliveryDirecti;\n      this.warn(`Invalid level index ${level}`);\n      if ((_data$deliveryDirecti = data.deliveryDirectives) != null && _data$deliveryDirecti.skip) {\n        details.deltaUpdateFailed = true;\n      }\n      return;\n    }\n    if (level === this.currentLevelIndex) {\n      if (curLevel.fragmentError === 0) {\n        curLevel.loadError = 0;\n      }\n      this.playlistLoaded(level, data, curLevel.details);\n    } else if ((_data$deliveryDirecti2 = data.deliveryDirectives) != null && _data$deliveryDirecti2.skip) {\n      details.deltaUpdateFailed = true;\n    }\n  }\n  loadPlaylist(hlsUrlParameters) {\n    super.loadPlaylist();\n    const currentLevelIndex = this.currentLevelIndex;\n    const currentLevel = this.currentLevel;\n    if (currentLevel && this.shouldLoadPlaylist(currentLevel)) {\n      let url = currentLevel.uri;\n      if (hlsUrlParameters) {\n        try {\n          url = hlsUrlParameters.addDirectives(url);\n        } catch (error) {\n          this.warn(`Could not construct new URL with HLS Delivery Directives: ${error}`);\n        }\n      }\n      const pathwayId = currentLevel.attrs[\"PATHWAY-ID\"];\n      this.log(`Loading level index ${currentLevelIndex}${(hlsUrlParameters == null ? void 0 : hlsUrlParameters.msn) !== void 0 ? \" at sn \" + hlsUrlParameters.msn + \" part \" + hlsUrlParameters.part : \"\"} with${pathwayId ? \" Pathway \" + pathwayId : \"\"} ${url}`);\n      this.clearTimer();\n      this.hls.trigger(Events.LEVEL_LOADING, {\n        url,\n        level: currentLevelIndex,\n        pathwayId: currentLevel.attrs[\"PATHWAY-ID\"],\n        id: 0,\n        // 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  set nextLoadLevel(nextLevel) {\n    this.level = nextLevel;\n    if (this.manualLevelIndex === -1) {\n      this.hls.nextAutoLevel = nextLevel;\n    }\n  }\n  removeLevel(levelIndex) {\n    var _this$currentLevel;\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 = this.currentLevel) != null && _this$currentLevel.details) {\n      this.currentLevelIndex = this.currentLevel.details.fragments[0].level;\n    }\n    this.hls.trigger(Events.LEVELS_UPDATED, {\n      levels\n    });\n  }\n  onLevelsUpdated(event, {\n    levels\n  }) {\n    this._levels = levels;\n  }\n  checkMaxAutoUpdated() {\n    const {\n      autoLevelCapping,\n      maxAutoLevel,\n      maxHdcpLevel\n    } = 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}\nfunction assignTrackIdsByGroup(tracks) {\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}\nclass KeyLoader {\n  constructor(config) {\n    this.config = void 0;\n    this.keyUriToKeyInfo = {};\n    this.emeController = null;\n    this.config = config;\n  }\n  abort(type) {\n    for (const uri in this.keyUriToKeyInfo) {\n      const loader = this.keyUriToKeyInfo[uri].loader;\n      if (loader) {\n        var _loader$context;\n        if (type && type !== ((_loader$context = loader.context) == null ? void 0 : _loader$context.frag.type)) {\n          return;\n        }\n        loader.abort();\n      }\n    }\n  }\n  detach() {\n    for (const uri in this.keyUriToKeyInfo) {\n      const keyInfo = this.keyUriToKeyInfo[uri];\n      if (keyInfo.mediaKeySessionContext || keyInfo.decryptdata.isCommonEncryption) {\n        delete this.keyUriToKeyInfo[uri];\n      }\n    }\n  }\n  destroy() {\n    this.detach();\n    for (const uri in this.keyUriToKeyInfo) {\n      const loader = this.keyUriToKeyInfo[uri].loader;\n      if (loader) {\n        loader.destroy();\n      }\n    }\n    this.keyUriToKeyInfo = {};\n  }\n  createKeyLoadError(frag, details = ErrorDetails.KEY_LOAD_ERROR, error, networkDetails, response) {\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  loadClear(loadingFrag, encryptedFragments) {\n    if (this.emeController && this.config.emeEnabled) {\n      const {\n        sn,\n        cc\n      } = loadingFrag;\n      for (let i = 0; i < encryptedFragments.length; i++) {\n        const frag = encryptedFragments[i];\n        if (cc <= frag.cc && (sn === \"initSegment\" || frag.sn === \"initSegment\" || sn < frag.sn)) {\n          this.emeController.selectKeySystemFormat(frag).then((keySystemFormat) => {\n            frag.setKeyFormat(keySystemFormat);\n          });\n          break;\n        }\n      }\n    }\n  }\n  load(frag) {\n    if (!frag.decryptdata && frag.encrypted && this.emeController) {\n      return this.emeController.selectKeySystemFormat(frag).then((keySystemFormat) => {\n        return this.loadInternal(frag, keySystemFormat);\n      });\n    }\n    return this.loadInternal(frag);\n  }\n  loadInternal(frag, keySystemFormat) {\n    var _keyInfo, _keyInfo2;\n    if (keySystemFormat) {\n      frag.setKeyFormat(keySystemFormat);\n    }\n    const decryptdata = frag.decryptdata;\n    if (!decryptdata) {\n      const error = new Error(keySystemFormat ? `Expected frag.decryptdata to be defined after setting format ${keySystemFormat}` : \"Missing decryption data on fragment in onKeyLoading\");\n      return Promise.reject(this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, error));\n    }\n    const uri = decryptdata.uri;\n    if (!uri) {\n      return Promise.reject(this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, new Error(`Invalid key URI: \"${uri}\"`)));\n    }\n    let keyInfo = this.keyUriToKeyInfo[uri];\n    if ((_keyInfo = keyInfo) != null && _keyInfo.decryptdata.key) {\n      decryptdata.key = keyInfo.decryptdata.key;\n      return Promise.resolve({\n        frag,\n        keyInfo\n      });\n    }\n    if ((_keyInfo2 = keyInfo) != null && _keyInfo2.keyLoadPromise) {\n      var _keyInfo$mediaKeySess;\n      switch ((_keyInfo$mediaKeySess = keyInfo.mediaKeySessionContext) == null ? void 0 : _keyInfo$mediaKeySess.keyStatus) {\n        case void 0:\n        case \"status-pending\":\n        case \"usable\":\n        case \"usable-in-future\":\n          return keyInfo.keyLoadPromise.then((keyLoadedData) => {\n            decryptdata.key = keyLoadedData.keyInfo.decryptdata.key;\n            return {\n              frag,\n              keyInfo\n            };\n          });\n      }\n    }\n    keyInfo = this.keyUriToKeyInfo[uri] = {\n      decryptdata,\n      keyLoadPromise: null,\n      loader: null,\n      mediaKeySessionContext: null\n    };\n    switch (decryptdata.method) {\n      case \"ISO-23001-7\":\n      case \"SAMPLE-AES\":\n      case \"SAMPLE-AES-CENC\":\n      case \"SAMPLE-AES-CTR\":\n        if (decryptdata.keyFormat === \"identity\") {\n          return this.loadKeyHTTP(keyInfo, frag);\n        }\n        return this.loadKeyEME(keyInfo, frag);\n      case \"AES-128\":\n        return this.loadKeyHTTP(keyInfo, frag);\n      default:\n        return Promise.reject(this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, new Error(`Key supplied with unsupported METHOD: \"${decryptdata.method}\"`)));\n    }\n  }\n  loadKeyEME(keyInfo, frag) {\n    const keyLoadedData = {\n      frag,\n      keyInfo\n    };\n    if (this.emeController && this.config.emeEnabled) {\n      const keySessionContextPromise = this.emeController.loadKey(keyLoadedData);\n      if (keySessionContextPromise) {\n        return (keyInfo.keyLoadPromise = keySessionContextPromise.then((keySessionContext) => {\n          keyInfo.mediaKeySessionContext = keySessionContext;\n          return keyLoadedData;\n        })).catch((error) => {\n          keyInfo.keyLoadPromise = null;\n          throw error;\n        });\n      }\n    }\n    return Promise.resolve(keyLoadedData);\n  }\n  loadKeyHTTP(keyInfo, frag) {\n    const config = this.config;\n    const Loader = config.loader;\n    const keyLoader = new Loader(config);\n    frag.keyLoader = keyInfo.loader = keyLoader;\n    return keyInfo.keyLoadPromise = new Promise((resolve, reject) => {\n      const loaderContext = {\n        keyInfo,\n        frag,\n        responseType: \"arraybuffer\",\n        url: keyInfo.decryptdata.uri\n      };\n      const loadPolicy = config.keyLoadPolicy.default;\n      const loaderConfig = {\n        loadPolicy,\n        timeout: loadPolicy.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0\n      };\n      const loaderCallbacks = {\n        onSuccess: (response, stats, context, networkDetails) => {\n          const {\n            frag: frag2,\n            keyInfo: keyInfo2,\n            url: uri\n          } = context;\n          if (!frag2.decryptdata || keyInfo2 !== this.keyUriToKeyInfo[uri]) {\n            return reject(this.createKeyLoadError(frag2, ErrorDetails.KEY_LOAD_ERROR, new Error(\"after key load, decryptdata unset or changed\"), networkDetails));\n          }\n          keyInfo2.decryptdata.key = frag2.decryptdata.key = new Uint8Array(response.data);\n          frag2.keyLoader = null;\n          keyInfo2.loader = null;\n          resolve({\n            frag: frag2,\n            keyInfo: keyInfo2\n          });\n        },\n        onError: (response, context, networkDetails, stats) => {\n          this.resetLoader(context);\n          reject(this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, new Error(`HTTP Error ${response.code} loading key ${response.text}`), networkDetails, _objectSpread2({\n            url: loaderContext.url,\n            data: void 0\n          }, response)));\n        },\n        onTimeout: (stats, context, networkDetails) => {\n          this.resetLoader(context);\n          reject(this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_TIMEOUT, new Error(\"key loading timed out\"), networkDetails));\n        },\n        onAbort: (stats, context, networkDetails) => {\n          this.resetLoader(context);\n          reject(this.createKeyLoadError(frag, ErrorDetails.INTERNAL_ABORTED, new Error(\"key loading aborted\"), networkDetails));\n        }\n      };\n      keyLoader.load(loaderContext, loaderConfig, loaderCallbacks);\n    });\n  }\n  resetLoader(context) {\n    const {\n      frag,\n      keyInfo,\n      url: uri\n    } = context;\n    const loader = keyInfo.loader;\n    if (frag.keyLoader === loader) {\n      frag.keyLoader = null;\n      keyInfo.loader = null;\n    }\n    delete this.keyUriToKeyInfo[uri];\n    if (loader) {\n      loader.destroy();\n    }\n  }\n}\nfunction getSourceBuffer() {\n  return self.SourceBuffer || self.WebKitSourceBuffer;\n}\nfunction isMSESupported() {\n  const mediaSource = getMediaSource();\n  if (!mediaSource) {\n    return false;\n  }\n  const sourceBuffer = getSourceBuffer();\n  return !sourceBuffer || sourceBuffer.prototype && typeof sourceBuffer.prototype.appendBuffer === \"function\" && typeof sourceBuffer.prototype.remove === \"function\";\n}\nfunction isSupported() {\n  if (!isMSESupported()) {\n    return false;\n  }\n  const mediaSource = getMediaSource();\n  return typeof (mediaSource == null ? void 0 : mediaSource.isTypeSupported) === \"function\" && ([\"avc1.42E01E,mp4a.40.2\", \"av01.0.01M.08\", \"vp09.00.50.08\"].some((codecsForVideoContainer) => mediaSource.isTypeSupported(mimeTypeForCodec(codecsForVideoContainer, \"video\"))) || [\"mp4a.40.2\", \"fLaC\"].some((codecForAudioContainer) => mediaSource.isTypeSupported(mimeTypeForCodec(codecForAudioContainer, \"audio\"))));\n}\nfunction changeTypeSupported() {\n  var _sourceBuffer$prototy;\n  const sourceBuffer = getSourceBuffer();\n  return typeof (sourceBuffer == null ? void 0 : (_sourceBuffer$prototy = sourceBuffer.prototype) == null ? void 0 : _sourceBuffer$prototy.changeType) === \"function\";\n}\nconst STALL_MINIMUM_DURATION_MS = 250;\nconst MAX_START_GAP_JUMP = 2;\nconst SKIP_BUFFER_HOLE_STEP_SECONDS = 0.1;\nconst SKIP_BUFFER_RANGE_START = 0.05;\nclass GapController {\n  constructor(config, media, fragmentTracker, hls) {\n    this.config = void 0;\n    this.media = null;\n    this.fragmentTracker = void 0;\n    this.hls = void 0;\n    this.nudgeRetry = 0;\n    this.stallReported = false;\n    this.stalled = null;\n    this.moved = false;\n    this.seeking = false;\n    this.config = config;\n    this.media = media;\n    this.fragmentTracker = fragmentTracker;\n    this.hls = hls;\n  }\n  destroy() {\n    this.media = null;\n    this.hls = this.fragmentTracker = null;\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  poll(lastCurrentTime, activeFrag) {\n    const {\n      config,\n      media,\n      stalled\n    } = this;\n    if (media === null) {\n      return;\n    }\n    const {\n      currentTime,\n      seeking\n    } = media;\n    const seeked = this.seeking && !seeking;\n    const beginSeek = !this.seeking && seeking;\n    this.seeking = seeking;\n    if (currentTime !== lastCurrentTime) {\n      this.moved = true;\n      if (!seeking) {\n        this.nudgeRetry = 0;\n      }\n      if (stalled !== null) {\n        if (this.stallReported) {\n          const _stalledDuration = self.performance.now() - stalled;\n          logger.warn(`playback not stuck anymore @${currentTime}, after ${Math.round(_stalledDuration)}ms`);\n          this.stallReported = false;\n        }\n        this.stalled = null;\n      }\n      return;\n    }\n    if (beginSeek || seeked) {\n      this.stalled = null;\n      return;\n    }\n    if (media.paused && !seeking || media.ended || media.playbackRate === 0 || !BufferHelper.getBuffered(media).length) {\n      this.nudgeRetry = 0;\n      return;\n    }\n    const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n    const nextStart = bufferInfo.nextStart || 0;\n    if (seeking) {\n      const hasEnoughBuffer = bufferInfo.len > MAX_START_GAP_JUMP;\n      const noBufferGap = !nextStart || activeFrag && activeFrag.start <= currentTime || nextStart - currentTime > MAX_START_GAP_JUMP && !this.fragmentTracker.getPartialFragment(currentTime);\n      if (hasEnoughBuffer || noBufferGap) {\n        return;\n      }\n      this.moved = false;\n    }\n    if (!this.moved && this.stalled !== null) {\n      var _level$details;\n      const isBuffered = bufferInfo.len > 0;\n      if (!isBuffered && !nextStart) {\n        return;\n      }\n      const startJump = Math.max(nextStart, bufferInfo.start || 0) - currentTime;\n      const level = this.hls.levels ? this.hls.levels[this.hls.currentLevel] : null;\n      const isLive = level == null ? void 0 : (_level$details = level.details) == null ? void 0 : _level$details.live;\n      const maxStartGapJump = isLive ? level.details.targetduration * 2 : MAX_START_GAP_JUMP;\n      const partialOrGap = this.fragmentTracker.getPartialFragment(currentTime);\n      if (startJump > 0 && (startJump <= maxStartGapJump || partialOrGap)) {\n        if (!media.paused) {\n          this._trySkipBufferHole(partialOrGap);\n        }\n        return;\n      }\n    }\n    const tnow = self.performance.now();\n    if (stalled === null) {\n      this.stalled = tnow;\n      return;\n    }\n    const stalledDuration = tnow - stalled;\n    if (!seeking && stalledDuration >= STALL_MINIMUM_DURATION_MS) {\n      this._reportStall(bufferInfo);\n      if (!this.media) {\n        return;\n      }\n    }\n    const bufferedWithHoles = BufferHelper.bufferInfo(media, currentTime, config.maxBufferHole);\n    this._tryFixBufferStall(bufferedWithHoles, stalledDuration);\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  _tryFixBufferStall(bufferInfo, stalledDurationMs) {\n    const {\n      config,\n      fragmentTracker,\n      media\n    } = this;\n    if (media === null) {\n      return;\n    }\n    const currentTime = media.currentTime;\n    const partial = fragmentTracker.getPartialFragment(currentTime);\n    if (partial) {\n      const targetTime = this._trySkipBufferHole(partial);\n      if (targetTime || !this.media) {\n        return;\n      }\n    }\n    if ((bufferInfo.len > config.maxBufferHole || bufferInfo.nextStart && bufferInfo.nextStart - currentTime < config.maxBufferHole) && stalledDurationMs > config.highBufferWatchdogPeriod * 1e3) {\n      logger.warn(\"Trying to nudge playhead over buffer-hole\");\n      this.stalled = null;\n      this._tryNudgeBuffer();\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  _reportStall(bufferInfo) {\n    const {\n      hls,\n      media,\n      stallReported\n    } = this;\n    if (!stallReported && media) {\n      this.stallReported = true;\n      const error = new Error(`Playback stalling at @${media.currentTime} due to low buffer (${JSON.stringify(bufferInfo)})`);\n      logger.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      });\n    }\n  }\n  /**\n   * Attempts to fix buffer stalls by jumping over known gaps caused by partial fragments\n   * @param partial - The partial fragment found at the current time (where playback is stalling).\n   * @private\n   */\n  _trySkipBufferHole(partial) {\n    const {\n      config,\n      hls,\n      media\n    } = this;\n    if (media === null) {\n      return 0;\n    }\n    const currentTime = media.currentTime;\n    const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n    const startTime = currentTime < bufferInfo.start ? bufferInfo.start : bufferInfo.nextStart;\n    if (startTime) {\n      const bufferStarved = bufferInfo.len <= config.maxBufferHole;\n      const waiting = bufferInfo.len > 0 && bufferInfo.len < 1 && media.readyState < 3;\n      const gapLength = startTime - currentTime;\n      if (gapLength > 0 && (bufferStarved || waiting)) {\n        if (gapLength > config.maxBufferHole) {\n          const {\n            fragmentTracker\n          } = this;\n          let startGap = false;\n          if (currentTime === 0) {\n            const startFrag = fragmentTracker.getAppendedFrag(0, PlaylistLevelType.MAIN);\n            if (startFrag && startTime < startFrag.end) {\n              startGap = true;\n            }\n          }\n          if (!startGap) {\n            const startProvisioned = partial || fragmentTracker.getAppendedFrag(currentTime, PlaylistLevelType.MAIN);\n            if (startProvisioned) {\n              let moreToLoad = false;\n              let pos = startProvisioned.end;\n              while (pos < startTime) {\n                const provisioned = fragmentTracker.getPartialFragment(pos);\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        }\n        const targetTime = Math.max(startTime + SKIP_BUFFER_RANGE_START, currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS);\n        logger.warn(`skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}`);\n        this.moved = true;\n        this.stalled = null;\n        media.currentTime = targetTime;\n        if (partial && !partial.gap) {\n          const error = new Error(`fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}`);\n          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: partial\n          });\n        }\n        return targetTime;\n      }\n    }\n    return 0;\n  }\n  /**\n   * Attempts to fix buffer stalls by advancing the mediaElement's current time by a small amount.\n   * @private\n   */\n  _tryNudgeBuffer() {\n    const {\n      config,\n      hls,\n      media,\n      nudgeRetry\n    } = this;\n    if (media === null) {\n      return;\n    }\n    const currentTime = media.currentTime;\n    this.nudgeRetry++;\n    if (nudgeRetry < config.nudgeMaxRetry) {\n      const targetTime = currentTime + (nudgeRetry + 1) * config.nudgeOffset;\n      const error = new Error(`Nudging 'currentTime' from ${currentTime} to ${targetTime}`);\n      logger.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      });\n    } else {\n      const error = new Error(`Playhead still not moving while enough data buffered @${currentTime} after ${config.nudgeMaxRetry} nudges`);\n      logger.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      });\n    }\n  }\n}\nconst TICK_INTERVAL = 100;\nclass StreamController extends BaseStreamController {\n  constructor(hls, fragmentTracker, keyLoader) {\n    super(hls, fragmentTracker, keyLoader, \"[stream-controller]\", PlaylistLevelType.MAIN);\n    this.audioCodecSwap = false;\n    this.gapController = null;\n    this.level = -1;\n    this._forceStartLoad = false;\n    this.altAudio = false;\n    this.audioOnly = false;\n    this.fragPlaying = null;\n    this.onvplaying = null;\n    this.onvseeked = null;\n    this.fragLastKbps = 0;\n    this.couldBacktrack = false;\n    this.backtrackFragment = null;\n    this.audioCodecSwitch = false;\n    this.videoBuffer = null;\n    this._registerListeners();\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = 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_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this);\n    hls.on(Events.ERROR, this.onError, this);\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  _unregisterListeners() {\n    const {\n      hls\n    } = 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_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this);\n    hls.off(Events.ERROR, this.onError, this);\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  onHandlerDestroying() {\n    this._unregisterListeners();\n    super.onHandlerDestroying();\n  }\n  startLoad(startPosition) {\n    if (this.levels) {\n      const {\n        lastCurrentTime,\n        hls\n      } = this;\n      this.stopLoad();\n      this.setInterval(TICK_INTERVAL);\n      this.level = -1;\n      if (!this.startFragRequested) {\n        let startLevel = hls.startLevel;\n        if (startLevel === -1) {\n          if (hls.config.testBandwidth && this.levels.length > 1) {\n            startLevel = 0;\n            this.bitrateTest = true;\n          } else {\n            startLevel = hls.firstAutoLevel;\n          }\n        }\n        hls.nextLoadLevel = startLevel;\n        this.level = hls.loadLevel;\n        this.loadedmetadata = false;\n      }\n      if (lastCurrentTime > 0 && startPosition === -1) {\n        this.log(`Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(3)}`);\n        startPosition = lastCurrentTime;\n      }\n      this.state = State.IDLE;\n      this.nextLoadPosition = this.startPosition = this.lastCurrentTime = startPosition;\n      this.tick();\n    } else {\n      this._forceStartLoad = true;\n      this.state = State.STOPPED;\n    }\n  }\n  stopLoad() {\n    this._forceStartLoad = false;\n    super.stopLoad();\n  }\n  doTick() {\n    switch (this.state) {\n      case State.WAITING_LEVEL: {\n        const {\n          levels,\n          level\n        } = this;\n        const currentLevel = levels == null ? void 0 : levels[level];\n        const details = currentLevel == null ? void 0 : currentLevel.details;\n        if (details && (!details.live || this.levelLastLoaded === currentLevel)) {\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        {\n          var _this$media;\n          const now2 = self.performance.now();\n          const retryDate = this.retryDate;\n          if (!retryDate || now2 >= retryDate || (_this$media = this.media) != null && _this$media.seeking) {\n            const {\n              levels,\n              level\n            } = this;\n            const currentLevel = levels == null ? void 0 : levels[level];\n            this.resetStartWhenNotLoaded(currentLevel || null);\n            this.state = State.IDLE;\n          }\n        }\n        break;\n    }\n    if (this.state === State.IDLE) {\n      this.doTickIdle();\n    }\n    this.onTickEnd();\n  }\n  onTickEnd() {\n    super.onTickEnd();\n    this.checkBuffer();\n    this.checkFragmentChanged();\n  }\n  doTickIdle() {\n    const {\n      hls,\n      levelLastLoaded,\n      levels,\n      media\n    } = this;\n    if (levelLastLoaded === null || !media && (this.startFragRequested || !hls.config.startFragPrefetch)) {\n      return;\n    }\n    if (this.altAudio && this.audioOnly) {\n      return;\n    }\n    const level = hls.nextLoadLevel;\n    if (!(levels != null && levels[level])) {\n      return;\n    }\n    const levelInfo = levels[level];\n    const bufferInfo = this.getMainFwdBufferInfo();\n    if (bufferInfo === null) {\n      return;\n    }\n    const lastDetails = this.getLevelDetails();\n    if (lastDetails && this._streamEnded(bufferInfo, lastDetails)) {\n      const data = {};\n      if (this.altAudio) {\n        data.type = \"video\";\n      }\n      this.hls.trigger(Events.BUFFER_EOS, data);\n      this.state = State.ENDED;\n      return;\n    }\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    const levelDetails = levelInfo.details;\n    if (!levelDetails || this.state === State.WAITING_LEVEL || levelDetails.live && this.levelLastLoaded !== levelInfo) {\n      this.level = level;\n      this.state = State.WAITING_LEVEL;\n      return;\n    }\n    const bufferLen = bufferInfo.len;\n    const maxBufLen = this.getMaxBufferLength(levelInfo.maxBitrate);\n    if (bufferLen >= maxBufLen) {\n      return;\n    }\n    if (this.backtrackFragment && this.backtrackFragment.start > bufferInfo.end) {\n      this.backtrackFragment = null;\n    }\n    const targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;\n    let frag = this.getNextFragment(targetBufferTime, levelDetails);\n    if (this.couldBacktrack && !this.fragPrevious && frag && frag.sn !== \"initSegment\" && this.fragmentTracker.getState(frag) !== FragmentState.OK) {\n      var _this$backtrackFragme;\n      const backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;\n      const fragIdx = backtrackSn - levelDetails.startSN;\n      const backtrackFrag = levelDetails.fragments[fragIdx - 1];\n      if (backtrackFrag && 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    if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n      const gapStart = frag.gap;\n      if (!gapStart) {\n        const type = this.audioOnly && !this.altAudio ? ElementaryStreamTypes.AUDIO : ElementaryStreamTypes.VIDEO;\n        const mediaBuffer = (type === ElementaryStreamTypes.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n        if (mediaBuffer) {\n          this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n        }\n      }\n      frag = this.getNextFragmentLoopLoading(frag, levelDetails, bufferInfo, PlaylistLevelType.MAIN, maxBufLen);\n    }\n    if (!frag) {\n      return;\n    }\n    if (frag.initSegment && !frag.initSegment.data && !this.bitrateTest) {\n      frag = frag.initSegment;\n    }\n    this.loadFragment(frag, levelInfo, targetBufferTime);\n  }\n  loadFragment(frag, level, targetBufferTime) {\n    const fragState = this.fragmentTracker.getState(frag);\n    this.fragCurrent = frag;\n    if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {\n      if (frag.sn === \"initSegment\") {\n        this._loadInitSegment(frag, level);\n      } else if (this.bitrateTest) {\n        this.log(`Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered`);\n        this._loadBitrateTestFrag(frag, level);\n      } else {\n        this.startFragRequested = true;\n        super.loadFragment(frag, level, targetBufferTime);\n      }\n    } else {\n      this.clearTrackerIfNeeded(frag);\n    }\n  }\n  getBufferedFrag(position) {\n    return this.fragmentTracker.getBufferedFrag(position, PlaylistLevelType.MAIN);\n  }\n  followingBufferedFrag(frag) {\n    if (frag) {\n      return this.getBufferedFrag(frag.end + 0.5);\n    }\n    return null;\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  immediateLevelSwitch() {\n    this.abortCurrentFrag();\n    this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\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  nextLevelSwitch() {\n    const {\n      levels,\n      media\n    } = this;\n    if (media != null && media.readyState) {\n      let fetchdelay;\n      const fragPlayingCurrent = this.getAppendedFrag(media.currentTime);\n      if (fragPlayingCurrent && fragPlayingCurrent.start > 1) {\n        this.flushMainBuffer(0, fragPlayingCurrent.start - 1);\n      }\n      const levelDetails = this.getLevelDetails();\n      if (levelDetails != null && levelDetails.live) {\n        const bufferInfo = this.getMainFwdBufferInfo();\n        if (!bufferInfo || bufferInfo.len < levelDetails.targetduration * 2) {\n          return;\n        }\n      }\n      if (!media.paused && levels) {\n        const nextLevelId = this.hls.nextLoadLevel;\n        const nextLevel = levels[nextLevelId];\n        const fragLastKbps = this.fragLastKbps;\n        if (fragLastKbps && this.fragCurrent) {\n          fetchdelay = this.fragCurrent.duration * nextLevel.maxBitrate / (1e3 * fragLastKbps) + 1;\n        } else {\n          fetchdelay = 0;\n        }\n      } else {\n        fetchdelay = 0;\n      }\n      const bufferedFrag = this.getBufferedFrag(media.currentTime + fetchdelay);\n      if (bufferedFrag) {\n        const nextBufferedFrag = this.followingBufferedFrag(bufferedFrag);\n        if (nextBufferedFrag) {\n          this.abortCurrentFrag();\n          const maxStart = nextBufferedFrag.maxStartPTS ? nextBufferedFrag.maxStartPTS : nextBufferedFrag.start;\n          const fragDuration = nextBufferedFrag.duration;\n          const startPts = Math.max(bufferedFrag.end, maxStart + Math.min(Math.max(fragDuration - this.config.maxFragLookUpTolerance, fragDuration * (this.couldBacktrack ? 0.5 : 0.125)), fragDuration * (this.couldBacktrack ? 0.75 : 0.25)));\n          this.flushMainBuffer(startPts, Number.POSITIVE_INFINITY);\n        }\n      }\n    }\n  }\n  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  flushMainBuffer(startOffset, endOffset) {\n    super.flushMainBuffer(startOffset, endOffset, this.altAudio ? \"video\" : null);\n  }\n  onMediaAttached(event, data) {\n    super.onMediaAttached(event, data);\n    const media = data.media;\n    this.onvplaying = this.onMediaPlaying.bind(this);\n    this.onvseeked = this.onMediaSeeked.bind(this);\n    media.addEventListener(\"playing\", this.onvplaying);\n    media.addEventListener(\"seeked\", this.onvseeked);\n    this.gapController = new GapController(this.config, media, this.fragmentTracker, this.hls);\n  }\n  onMediaDetaching() {\n    const {\n      media\n    } = this;\n    if (media && this.onvplaying && this.onvseeked) {\n      media.removeEventListener(\"playing\", this.onvplaying);\n      media.removeEventListener(\"seeked\", this.onvseeked);\n      this.onvplaying = this.onvseeked = null;\n      this.videoBuffer = null;\n    }\n    this.fragPlaying = null;\n    if (this.gapController) {\n      this.gapController.destroy();\n      this.gapController = null;\n    }\n    super.onMediaDetaching();\n  }\n  onMediaPlaying() {\n    this.tick();\n  }\n  onMediaSeeked() {\n    const media = this.media;\n    const currentTime = media ? media.currentTime : null;\n    if (isFiniteNumber(currentTime)) {\n      this.log(`Media seeked to ${currentTime.toFixed(3)}`);\n    }\n    const bufferInfo = this.getMainFwdBufferInfo();\n    if (bufferInfo === null || bufferInfo.len === 0) {\n      this.warn(`Main forward buffer length on \"seeked\" event ${bufferInfo ? bufferInfo.len : \"empty\"})`);\n      return;\n    }\n    this.tick();\n  }\n  onManifestLoading() {\n    this.log(\"Trigger BUFFER_RESET\");\n    this.hls.trigger(Events.BUFFER_RESET, void 0);\n    this.fragmentTracker.removeAllFragments();\n    this.couldBacktrack = false;\n    this.startPosition = this.lastCurrentTime = this.fragLastKbps = 0;\n    this.levels = this.fragPlaying = this.backtrackFragment = this.levelLastLoaded = null;\n    this.altAudio = this.audioOnly = this.startFragRequested = false;\n  }\n  onManifestParsed(event, data) {\n    let aac = false;\n    let heaac = false;\n    data.levels.forEach((level) => {\n      const codec = level.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(\"Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC\");\n    }\n    this.levels = data.levels;\n    this.startFragRequested = false;\n  }\n  onLevelLoading(event, data) {\n    const {\n      levels\n    } = this;\n    if (!levels || this.state !== State.IDLE) {\n      return;\n    }\n    const level = levels[data.level];\n    if (!level.details || level.details.live && this.levelLastLoaded !== level || this.waitForCdnTuneIn(level.details)) {\n      this.state = State.WAITING_LEVEL;\n    }\n  }\n  onLevelLoaded(event, data) {\n    var _curLevel$details;\n    const {\n      levels\n    } = this;\n    const newLevelId = data.level;\n    const newDetails = data.details;\n    const duration = newDetails.totalduration;\n    if (!levels) {\n      this.warn(`Levels were reset while loading level ${newLevelId}`);\n      return;\n    }\n    this.log(`Level ${newLevelId} loaded [${newDetails.startSN},${newDetails.endSN}]${newDetails.lastPartSn ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]` : \"\"}, cc [${newDetails.startCC}, ${newDetails.endCC}] duration:${duration}`);\n    const curLevel = levels[newLevelId];\n    const fragCurrent = this.fragCurrent;\n    if (fragCurrent && (this.state === State.FRAG_LOADING || this.state === State.FRAG_LOADING_WAITING_RETRY)) {\n      if (fragCurrent.level !== data.level && fragCurrent.loader) {\n        this.abortCurrentFrag();\n      }\n    }\n    let sliding = 0;\n    if (newDetails.live || (_curLevel$details = curLevel.details) != null && _curLevel$details.live) {\n      var _this$levelLastLoaded;\n      this.checkLiveUpdate(newDetails);\n      if (newDetails.deltaUpdateFailed) {\n        return;\n      }\n      sliding = this.alignPlaylists(newDetails, curLevel.details, (_this$levelLastLoaded = this.levelLastLoaded) == null ? void 0 : _this$levelLastLoaded.details);\n    }\n    curLevel.details = newDetails;\n    this.levelLastLoaded = curLevel;\n    this.hls.trigger(Events.LEVEL_UPDATED, {\n      details: newDetails,\n      level: newLevelId\n    });\n    if (this.state === State.WAITING_LEVEL) {\n      if (this.waitForCdnTuneIn(newDetails)) {\n        return;\n      }\n      this.state = State.IDLE;\n    }\n    if (!this.startFragRequested) {\n      this.setStartPosition(newDetails, sliding);\n    } else if (newDetails.live) {\n      this.synchronizeToLiveEdge(newDetails);\n    }\n    this.tick();\n  }\n  _handleFragmentLoadProgress(data) {\n    var _frag$initSegment;\n    const {\n      frag,\n      part,\n      payload\n    } = data;\n    const {\n      levels\n    } = this;\n    if (!levels) {\n      this.warn(`Levels were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`);\n      return;\n    }\n    const currentLevel = levels[frag.level];\n    const details = currentLevel.details;\n    if (!details) {\n      this.warn(`Dropping fragment ${frag.sn} of level ${frag.level} after level details were reset`);\n      this.fragmentTracker.removeFragment(frag);\n      return;\n    }\n    const videoCodec = currentLevel.videoCodec;\n    const accurateTimeOffset = details.PTSKnown || !details.live;\n    const initSegmentData = (_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.data;\n    const audioCodec = this._getAudioCodec(currentLevel);\n    const transmuxer = this.transmuxer = this.transmuxer || new TransmuxerInterface(this.hls, PlaylistLevelType.MAIN, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this));\n    const partIndex = part ? part.index : -1;\n    const partial = partIndex !== -1;\n    const chunkMeta = new ChunkMetadata(frag.level, frag.sn, frag.stats.chunkCount, payload.byteLength, partIndex, partial);\n    const initPTS = this.initPTS[frag.cc];\n    transmuxer.push(payload, initSegmentData, audioCodec, videoCodec, frag, part, details.totalduration, accurateTimeOffset, chunkMeta, initPTS);\n  }\n  onAudioTrackSwitching(event, data) {\n    const fromAltAudio = this.altAudio;\n    const altAudio = !!data.url;\n    if (!altAudio) {\n      if (this.mediaBuffer !== this.media) {\n        this.log(\"Switching on main audio, use media.buffered to schedule main fragment loading\");\n        this.mediaBuffer = this.media;\n        const fragCurrent = this.fragCurrent;\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        this.resetTransmuxer();\n        this.resetLoadingState();\n      } else if (this.audioOnly) {\n        this.resetTransmuxer();\n      }\n      const hls = this.hls;\n      if (fromAltAudio) {\n        hls.trigger(Events.BUFFER_FLUSHING, {\n          startOffset: 0,\n          endOffset: Number.POSITIVE_INFINITY,\n          type: null\n        });\n        this.fragmentTracker.removeAllFragments();\n      }\n      hls.trigger(Events.AUDIO_TRACK_SWITCHED, data);\n    }\n  }\n  onAudioTrackSwitched(event, data) {\n    const trackId = data.id;\n    const altAudio = !!this.hls.audioTracks[trackId].url;\n    if (altAudio) {\n      const videoBuffer = this.videoBuffer;\n      if (videoBuffer && this.mediaBuffer !== videoBuffer) {\n        this.log(\"Switching on alternate audio, use video.buffered to schedule main fragment loading\");\n        this.mediaBuffer = videoBuffer;\n      }\n    }\n    this.altAudio = altAudio;\n    this.tick();\n  }\n  onBufferCreated(event, data) {\n    const tracks = data.tracks;\n    let mediaTrack;\n    let name;\n    let alternate = false;\n    for (const type in tracks) {\n      const track = tracks[type];\n      if (track.id === \"main\") {\n        name = type;\n        mediaTrack = track;\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(`Alternate track found, use ${name}.buffered to schedule main fragment loading`);\n      this.mediaBuffer = mediaTrack.buffer;\n    } else {\n      this.mediaBuffer = this.media;\n    }\n  }\n  onFragBuffered(event, data) {\n    const {\n      frag,\n      part\n    } = data;\n    if (frag && frag.type !== PlaylistLevelType.MAIN) {\n      return;\n    }\n    if (this.fragContextChanged(frag)) {\n      this.warn(`Fragment ${frag.sn}${part ? \" p: \" + part.index : \"\"} of level ${frag.level} finished buffering, but was aborted. state: ${this.state}`);\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(8 * stats.total / (stats.buffering.end - stats.loading.first));\n    if (frag.sn !== \"initSegment\") {\n      this.fragPrevious = frag;\n    }\n    this.fragBufferedComplete(frag, part);\n  }\n  onError(event, data) {\n    var _data$context;\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        if (!data.levelRetry && this.state === State.WAITING_LEVEL && ((_data$context = data.context) == null ? void 0 : _data$context.type) === PlaylistContextType.LEVEL) {\n          this.state = State.IDLE;\n        }\n        break;\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n      case ErrorDetails.BUFFER_FULL_ERROR:\n        if (!data.parent || data.parent !== \"main\") {\n          return;\n        }\n        if (data.details === ErrorDetails.BUFFER_APPEND_ERROR) {\n          this.resetLoadingState();\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n        }\n        break;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(data);\n        break;\n    }\n  }\n  // Checks the health of the buffer and attempts to resolve playback stalls.\n  checkBuffer() {\n    const {\n      media,\n      gapController\n    } = this;\n    if (!media || !gapController || !media.readyState) {\n      return;\n    }\n    if (this.loadedmetadata || !BufferHelper.getBuffered(media).length) {\n      const activeFrag = this.state !== State.IDLE ? this.fragCurrent : null;\n      gapController.poll(this.lastCurrentTime, activeFrag);\n    }\n    this.lastCurrentTime = media.currentTime;\n  }\n  onFragLoadEmergencyAborted() {\n    this.state = State.IDLE;\n    if (!this.loadedmetadata) {\n      this.startFragRequested = false;\n      this.nextLoadPosition = this.startPosition;\n    }\n    this.tickImmediate();\n  }\n  onBufferFlushed(event, {\n    type\n  }) {\n    if (type !== ElementaryStreamTypes.AUDIO || this.audioOnly && !this.altAudio) {\n      const mediaBuffer = (type === ElementaryStreamTypes.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n      this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n      this.tick();\n    }\n  }\n  onLevelsUpdated(event, data) {\n    if (this.level > -1 && this.fragCurrent) {\n      this.level = this.fragCurrent.level;\n    }\n    this.levels = data.levels;\n  }\n  swapAudioCodec() {\n    this.audioCodecSwap = !this.audioCodecSwap;\n  }\n  /**\n   * Seeks to the set startPosition if not equal to the mediaElement's current time.\n   */\n  seekToStartPos() {\n    const {\n      media\n    } = this;\n    if (!media) {\n      return;\n    }\n    const currentTime = media.currentTime;\n    let startPosition = this.startPosition;\n    if (startPosition >= 0 && currentTime < startPosition) {\n      if (media.seeking) {\n        this.log(`could not seek to ${startPosition}, already seeking at ${currentTime}`);\n        return;\n      }\n      const buffered = BufferHelper.getBuffered(media);\n      const bufferStart = buffered.length ? buffered.start(0) : 0;\n      const delta = bufferStart - startPosition;\n      if (delta > 0 && (delta < this.config.maxBufferHole || delta < this.config.maxFragLookUpTolerance)) {\n        this.log(`adjusting start position by ${delta} to match buffer start`);\n        startPosition += delta;\n        this.startPosition = startPosition;\n      }\n      this.log(`seek to target start position ${startPosition} from current time ${currentTime}`);\n      media.currentTime = startPosition;\n    }\n  }\n  _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    return audioCodec;\n  }\n  _loadBitrateTestFrag(frag, level) {\n    frag.bitrateTest = true;\n    this._doFragLoad(frag, level).then((data) => {\n      const {\n        hls\n      } = this;\n      if (!data || 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      stats.parsing.start = stats.parsing.end = stats.buffering.start = stats.buffering.end = self.performance.now();\n      hls.trigger(Events.FRAG_LOADED, data);\n      frag.bitrateTest = false;\n    });\n  }\n  _handleTransmuxComplete(transmuxResult) {\n    var _id3$samples;\n    const id = \"main\";\n    const {\n      hls\n    } = this;\n    const {\n      remuxResult,\n      chunkMeta\n    } = transmuxResult;\n    const context = this.getCurrentContext(chunkMeta);\n    if (!context) {\n      this.resetWhenMissingContext(chunkMeta);\n      return;\n    }\n    const {\n      frag,\n      part,\n      level\n    } = context;\n    const {\n      video,\n      text,\n      id3,\n      initSegment\n    } = remuxResult;\n    const {\n      details\n    } = level;\n    const audio = this.altAudio ? void 0 : remuxResult.audio;\n    if (this.fragContextChanged(frag)) {\n      this.fragmentTracker.removeFragment(frag);\n      return;\n    }\n    this.state = State.PARSING;\n    if (initSegment) {\n      if (initSegment != null && initSegment.tracks) {\n        const mapFragment = frag.initSegment || frag;\n        this._bufferInitSegment(level, initSegment.tracks, mapFragment, chunkMeta);\n        hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n          frag: mapFragment,\n          id,\n          tracks: initSegment.tracks\n        });\n      }\n      const initPTS = initSegment.initPTS;\n      const timescale = initSegment.timescale;\n      if (isFiniteNumber(initPTS)) {\n        this.initPTS[frag.cc] = {\n          baseTime: initPTS,\n          timescale\n        };\n        hls.trigger(Events.INIT_PTS_FOUND, {\n          frag,\n          id,\n          initPTS,\n          timescale\n        });\n      }\n    }\n    if (video && details && frag.sn !== \"initSegment\") {\n      const prevFrag = details.fragments[frag.sn - 1 - details.startSN];\n      const isFirstFragment = frag.sn === details.startSN;\n      const isFirstInDiscontinuity = !prevFrag || frag.cc > prevFrag.cc;\n      if (remuxResult.independent !== false) {\n        const {\n          startPTS,\n          endPTS,\n          startDTS,\n          endDTS\n        } = video;\n        if (part) {\n          part.elementaryStreams[video.type] = {\n            startPTS,\n            endPTS,\n            startDTS,\n            endDTS\n          };\n        } else {\n          if (video.firstKeyFrame && video.independent && chunkMeta.id === 1 && !isFirstInDiscontinuity) {\n            this.couldBacktrack = true;\n          }\n          if (video.dropped && video.independent) {\n            const bufferInfo = this.getMainFwdBufferInfo();\n            const targetBufferTime = (bufferInfo ? bufferInfo.end : this.getLoadPosition()) + this.config.maxBufferHole;\n            const startTime = video.firstKeyFramePTS ? video.firstKeyFramePTS : startPTS;\n            if (!isFirstFragment && targetBufferTime < startTime - this.config.maxBufferHole && !isFirstInDiscontinuity) {\n              this.backtrack(frag);\n              return;\n            } else if (isFirstInDiscontinuity) {\n              frag.gap = true;\n            }\n            frag.setElementaryStreamInfo(video.type, frag.start, endPTS, frag.start, endDTS, true);\n          } else if (isFirstFragment && startPTS > MAX_START_GAP_JUMP) {\n            frag.gap = true;\n          }\n        }\n        frag.setElementaryStreamInfo(video.type, startPTS, endPTS, startDTS, endDTS);\n        if (this.backtrackFragment) {\n          this.backtrackFragment = frag;\n        }\n        this.bufferFragmentData(video, frag, part, chunkMeta, isFirstFragment || isFirstInDiscontinuity);\n      } else if (isFirstFragment || isFirstInDiscontinuity) {\n        frag.gap = true;\n      } else {\n        this.backtrack(frag);\n        return;\n      }\n    }\n    if (audio) {\n      const {\n        startPTS,\n        endPTS,\n        startDTS,\n        endDTS\n      } = audio;\n      if (part) {\n        part.elementaryStreams[ElementaryStreamTypes.AUDIO] = {\n          startPTS,\n          endPTS,\n          startDTS,\n          endDTS\n        };\n      }\n      frag.setElementaryStreamInfo(ElementaryStreamTypes.AUDIO, startPTS, endPTS, startDTS, endDTS);\n      this.bufferFragmentData(audio, frag, part, chunkMeta);\n    }\n    if (details && id3 != null && (_id3$samples = id3.samples) != null && _id3$samples.length) {\n      const emittedID3 = {\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 = {\n        id,\n        frag,\n        details,\n        samples: text.samples\n      };\n      hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText);\n    }\n  }\n  _bufferInitSegment(currentLevel, tracks, frag, chunkMeta) {\n    if (this.state !== State.PARSING) {\n      return;\n    }\n    this.audioOnly = !!tracks.audio && !tracks.video;\n    if (this.altAudio && !this.audioOnly) {\n      delete tracks.audio;\n    }\n    const {\n      audio,\n      video,\n      audiovideo\n    } = tracks;\n    if (audio) {\n      let audioCodec = currentLevel.audioCodec;\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        if (audio.metadata.channelCount !== 1 && ua.indexOf(\"firefox\") === -1) {\n          audioCodec = \"mp4a.40.5\";\n        }\n      }\n      if (audioCodec && audioCodec.indexOf(\"mp4a.40.5\") !== -1 && ua.indexOf(\"android\") !== -1 && audio.container !== \"audio/mpeg\") {\n        audioCodec = \"mp4a.40.2\";\n        this.log(`Android: force audio codec to ${audioCodec}`);\n      }\n      if (currentLevel.audioCodec && currentLevel.audioCodec !== audioCodec) {\n        this.log(`Swapping manifest audio codec \"${currentLevel.audioCodec}\" for \"${audioCodec}\"`);\n      }\n      audio.levelCodec = audioCodec;\n      audio.id = \"main\";\n      this.log(`Init audio buffer, container:${audio.container}, codecs[selected/level/parsed]=[${audioCodec || \"\"}/${currentLevel.audioCodec || \"\"}/${audio.codec}]`);\n    }\n    if (video) {\n      video.levelCodec = currentLevel.videoCodec;\n      video.id = \"main\";\n      this.log(`Init video buffer, container:${video.container}, codecs[level/parsed]=[${currentLevel.videoCodec || \"\"}/${video.codec}]`);\n    }\n    if (audiovideo) {\n      this.log(`Init audiovideo buffer, container:${audiovideo.container}, codecs[level/parsed]=[${currentLevel.codecs}/${audiovideo.codec}]`);\n    }\n    this.hls.trigger(Events.BUFFER_CODECS, tracks);\n    Object.keys(tracks).forEach((trackName) => {\n      const track = tracks[trackName];\n      const initSegment = track.initSegment;\n      if (initSegment != null && initSegment.byteLength) {\n        this.hls.trigger(Events.BUFFER_APPENDING, {\n          type: trackName,\n          data: initSegment,\n          frag,\n          part: null,\n          chunkMeta,\n          parent: frag.type\n        });\n      }\n    });\n    this.tickImmediate();\n  }\n  getMainFwdBufferInfo() {\n    return this.getFwdBufferInfo(this.mediaBuffer ? this.mediaBuffer : this.media, PlaylistLevelType.MAIN);\n  }\n  backtrack(frag) {\n    this.couldBacktrack = true;\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  checkFragmentChanged() {\n    const video = this.media;\n    let fragPlayingCurrent = null;\n    if (video && video.readyState > 1 && video.seeking === false) {\n      const currentTime = video.currentTime;\n      if (BufferHelper.isBuffered(video, currentTime)) {\n        fragPlayingCurrent = this.getAppendedFrag(currentTime);\n      } else if (BufferHelper.isBuffered(video, currentTime + 0.1)) {\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 (!fragPlaying || fragPlayingCurrent.sn !== fragPlaying.sn || fragPlaying.level !== fragCurrentLevel) {\n          this.fragPlaying = fragPlayingCurrent;\n          this.hls.trigger(Events.FRAG_CHANGED, {\n            frag: fragPlayingCurrent\n          });\n          if (!fragPlaying || fragPlaying.level !== fragCurrentLevel) {\n            this.hls.trigger(Events.LEVEL_SWITCHED, {\n              level: fragCurrentLevel\n            });\n          }\n        }\n      }\n    }\n  }\n  get nextLevel() {\n    const frag = this.nextBufferedFrag;\n    if (frag) {\n      return frag.level;\n    }\n    return -1;\n  }\n  get currentFrag() {\n    const media = this.media;\n    if (media) {\n      return this.fragPlaying || this.getAppendedFrag(media.currentTime);\n    }\n    return null;\n  }\n  get currentProgramDateTime() {\n    const media = this.media;\n    if (media) {\n      const currentTime = media.currentTime;\n      const frag = this.currentFrag;\n      if (frag && isFiniteNumber(currentTime) && isFiniteNumber(frag.programDateTime)) {\n        const epocMs = frag.programDateTime + (currentTime - frag.start) * 1e3;\n        return new Date(epocMs);\n      }\n    }\n    return null;\n  }\n  get currentLevel() {\n    const frag = this.currentFrag;\n    if (frag) {\n      return frag.level;\n    }\n    return -1;\n  }\n  get nextBufferedFrag() {\n    const frag = this.currentFrag;\n    if (frag) {\n      return this.followingBufferedFrag(frag);\n    }\n    return null;\n  }\n  get forceStartLoad() {\n    return this._forceStartLoad;\n  }\n}\nclass Hls {\n  /**\n   * Get the video-dev/hls.js package version.\n   */\n  static get version() {\n    return \"1.5.7\";\n  }\n  /**\n   * Check if the required MediaSource Extensions are available.\n   */\n  static isMSESupported() {\n    return isMSESupported();\n  }\n  /**\n   * Check if MediaSource Extensions are available and isTypeSupported checks pass for any baseline codecs.\n   */\n  static isSupported() {\n    return isSupported();\n  }\n  /**\n   * Get the MediaSource global used for MSE playback (ManagedMediaSource, MediaSource, or WebKitMediaSource).\n   */\n  static getMediaSource() {\n    return getMediaSource();\n  }\n  static get Events() {\n    return Events;\n  }\n  static get ErrorTypes() {\n    return ErrorTypes;\n  }\n  static get ErrorDetails() {\n    return ErrorDetails;\n  }\n  /**\n   * Get the default configuration applied to new instances.\n   */\n  static get DefaultConfig() {\n    if (!Hls.defaultConfig) {\n      return hlsDefaultConfig;\n    }\n    return Hls.defaultConfig;\n  }\n  /**\n   * Replace the default configuration applied to new instances.\n   */\n  static set DefaultConfig(defaultConfig) {\n    Hls.defaultConfig = defaultConfig;\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 = {}) {\n    this.config = void 0;\n    this.userConfig = void 0;\n    this.coreComponents = void 0;\n    this.networkControllers = void 0;\n    this.started = false;\n    this._emitter = new EventEmitter();\n    this._autoLevelCapping = -1;\n    this._maxHdcpLevel = null;\n    this.abrController = void 0;\n    this.bufferController = void 0;\n    this.capLevelController = void 0;\n    this.latencyController = void 0;\n    this.levelController = void 0;\n    this.streamController = void 0;\n    this.audioTrackController = void 0;\n    this.subtitleTrackController = void 0;\n    this.emeController = void 0;\n    this.cmcdController = void 0;\n    this._media = null;\n    this.url = null;\n    this.triggeringException = void 0;\n    enableLogs(userConfig.debug || false, \"Hls instance\");\n    const config = this.config = mergeConfig(Hls.DefaultConfig, userConfig);\n    this.userConfig = userConfig;\n    if (config.progressive) {\n      enableStreamingMode(config);\n    }\n    const {\n      abrController: ConfigAbrController,\n      bufferController: ConfigBufferController,\n      capLevelController: ConfigCapLevelController,\n      errorController: ConfigErrorController,\n      fpsController: ConfigFpsController\n    } = config;\n    const errorController = new ConfigErrorController(this);\n    const abrController = this.abrController = new ConfigAbrController(this);\n    const bufferController = this.bufferController = new ConfigBufferController(this);\n    const capLevelController = this.capLevelController = new ConfigCapLevelController(this);\n    const fpsController = new ConfigFpsController(this);\n    const playListLoader = new PlaylistLoader(this);\n    const id3TrackController = new ID3TrackController(this);\n    const ConfigContentSteeringController = config.contentSteeringController;\n    const contentSteering = ConfigContentSteeringController ? new ConfigContentSteeringController(this) : null;\n    const levelController = this.levelController = new LevelController(this, contentSteering);\n    const fragmentTracker = new FragmentTracker(this);\n    const keyLoader = new KeyLoader(this.config);\n    const streamController = this.streamController = new StreamController(this, fragmentTracker, keyLoader);\n    capLevelController.setStreamController(streamController);\n    fpsController.setStreamController(streamController);\n    const networkControllers = [playListLoader, levelController, streamController];\n    if (contentSteering) {\n      networkControllers.splice(1, 0, contentSteering);\n    }\n    this.networkControllers = networkControllers;\n    const coreComponents = [abrController, bufferController, capLevelController, fpsController, id3TrackController, fragmentTracker];\n    this.audioTrackController = this.createController(config.audioTrackController, networkControllers);\n    const AudioStreamControllerClass = config.audioStreamController;\n    if (AudioStreamControllerClass) {\n      networkControllers.push(new AudioStreamControllerClass(this, fragmentTracker, keyLoader));\n    }\n    this.subtitleTrackController = this.createController(config.subtitleTrackController, networkControllers);\n    const SubtitleStreamControllerClass = config.subtitleStreamController;\n    if (SubtitleStreamControllerClass) {\n      networkControllers.push(new SubtitleStreamControllerClass(this, fragmentTracker, keyLoader));\n    }\n    this.createController(config.timelineController, coreComponents);\n    keyLoader.emeController = this.emeController = this.createController(config.emeController, coreComponents);\n    this.cmcdController = this.createController(config.cmcdController, coreComponents);\n    this.latencyController = this.createController(LatencyController, coreComponents);\n    this.coreComponents = coreComponents;\n    networkControllers.push(errorController);\n    const onErrorOut = errorController.onErrorOut;\n    if (typeof onErrorOut === \"function\") {\n      this.on(Events.ERROR, onErrorOut, errorController);\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  // Delegate the EventEmitter through the public API of Hls.js\n  on(event, listener, context = this) {\n    this._emitter.on(event, listener, context);\n  }\n  once(event, listener, context = this) {\n    this._emitter.once(event, listener, context);\n  }\n  removeAllListeners(event) {\n    this._emitter.removeAllListeners(event);\n  }\n  off(event, listener, context = this, once) {\n    this._emitter.off(event, listener, context, once);\n  }\n  listeners(event) {\n    return this._emitter.listeners(event);\n  }\n  emit(event, name, eventObject) {\n    return this._emitter.emit(event, name, eventObject);\n  }\n  trigger(event, eventObject) {\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        logger.error(\"An internal error happened while handling event \" + event + '. Error message: \"' + error.message + '\". Here is a stacktrace:', error);\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  listenerCount(event) {\n    return this._emitter.listenerCount(event);\n  }\n  /**\n   * Dispose of the instance\n   */\n  destroy() {\n    logger.log(\"destroy\");\n    this.trigger(Events.DESTROYING, void 0);\n    this.detachMedia();\n    this.removeAllListeners();\n    this._autoLevelCapping = -1;\n    this.url = null;\n    this.networkControllers.forEach((component) => component.destroy());\n    this.networkControllers.length = 0;\n    this.coreComponents.forEach((component) => component.destroy());\n    this.coreComponents.length = 0;\n    const config = this.config;\n    config.xhrSetup = config.fetchSetup = void 0;\n    this.userConfig = null;\n  }\n  /**\n   * Attaches Hls.js to a media element\n   */\n  attachMedia(media) {\n    logger.log(\"attachMedia\");\n    this._media = media;\n    this.trigger(Events.MEDIA_ATTACHING, {\n      media\n    });\n  }\n  /**\n   * Detach Hls.js from the media\n   */\n  detachMedia() {\n    logger.log(\"detachMedia\");\n    this.trigger(Events.MEDIA_DETACHING, void 0);\n    this._media = null;\n  }\n  /**\n   * Set the source URL. Can be relative or absolute.\n   */\n  loadSource(url) {\n    this.stopLoad();\n    const media = this.media;\n    const loadedSource = this.url;\n    const loadingSource = this.url = urlToolkitExports.buildAbsoluteURL(self.location.href, url, {\n      alwaysNormalize: true\n    });\n    this._autoLevelCapping = -1;\n    this._maxHdcpLevel = null;\n    logger.log(`loadSource:${loadingSource}`);\n    if (media && loadedSource && (loadedSource !== loadingSource || this.bufferController.hasSourceTypes())) {\n      this.detachMedia();\n      this.attachMedia(media);\n    }\n    this.trigger(Events.MANIFEST_LOADING, {\n      url\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 = -1) {\n    logger.log(`startLoad(${startPosition})`);\n    this.started = true;\n    this.networkControllers.forEach((controller) => {\n      controller.startLoad(startPosition);\n    });\n  }\n  /**\n   * Stop loading of any stream data.\n   */\n  stopLoad() {\n    logger.log(\"stopLoad\");\n    this.started = false;\n    this.networkControllers.forEach((controller) => {\n      controller.stopLoad();\n    });\n  }\n  /**\n   * Resumes stream controller segment loading if previously started.\n   */\n  resumeBuffering() {\n    if (this.started) {\n      this.networkControllers.forEach((controller) => {\n        if (\"fragmentLoader\" in controller) {\n          controller.startLoad(-1);\n        }\n      });\n    }\n  }\n  /**\n   * Stops stream controller segment loading without changing 'started' state like stopLoad().\n   * This allows for media buffering to be paused without interupting playlist loading.\n   */\n  pauseBuffering() {\n    this.networkControllers.forEach((controller) => {\n      if (\"fragmentLoader\" in controller) {\n        controller.stopLoad();\n      }\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    logger.log(\"swapAudioCodec\");\n    this.streamController.swapAudioCodec();\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    logger.log(\"recoverMediaError\");\n    const media = this._media;\n    this.detachMedia();\n    if (media) {\n      this.attachMedia(media);\n    }\n  }\n  removeLevel(levelIndex) {\n    this.levelController.removeLevel(levelIndex);\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() {\n    const levels = this.levelController.levels;\n    return levels ? levels : [];\n  }\n  /**\n   * Index of quality level (variant) currently played\n   */\n  get currentLevel() {\n    return this.streamController.currentLevel;\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) {\n    logger.log(`set currentLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n    this.streamController.immediateLevelSwitch();\n  }\n  /**\n   * Index of next quality level loaded as scheduled by stream controller.\n   */\n  get nextLevel() {\n    return this.streamController.nextLevel;\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) {\n    logger.log(`set nextLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n    this.streamController.nextLevelSwitch();\n  }\n  /**\n   * Return the quality level of the currently or last (of none is loaded currently) segment\n   */\n  get loadLevel() {\n    return this.levelController.level;\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) {\n    logger.log(`set loadLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n  }\n  /**\n   * get next quality level loaded\n   */\n  get nextLoadLevel() {\n    return this.levelController.nextLoadLevel;\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) {\n    this.levelController.nextLoadLevel = level;\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() {\n    return Math.max(this.levelController.firstLevel, this.minAutoLevel);\n  }\n  /**\n   * Sets \"first-level\", see getter.\n   */\n  set firstLevel(newLevel) {\n    logger.log(`set firstLevel:${newLevel}`);\n    this.levelController.firstLevel = newLevel;\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() {\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   * 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) {\n    logger.log(`set startLevel:${newLevel}`);\n    if (newLevel !== -1) {\n      newLevel = Math.max(newLevel, this.minAutoLevel);\n    }\n    this.levelController.startLevel = newLevel;\n  }\n  /**\n   * Whether level capping is enabled.\n   * Default value is set via `config.capLevelToPlayerSize`.\n   */\n  get capLevelToPlayerSize() {\n    return this.config.capLevelToPlayerSize;\n  }\n  /**\n   * Enables or disables level capping. If disabled after previously enabled, `nextLevelSwitch` will be immediately called.\n   */\n  set capLevelToPlayerSize(shouldStartCapping) {\n    const newCapLevelToPlayerSize = !!shouldStartCapping;\n    if (newCapLevelToPlayerSize !== this.config.capLevelToPlayerSize) {\n      if (newCapLevelToPlayerSize) {\n        this.capLevelController.startCapping();\n      } else {\n        this.capLevelController.stopCapping();\n        this.autoLevelCapping = -1;\n        this.streamController.nextLevelSwitch();\n      }\n      this.config.capLevelToPlayerSize = newCapLevelToPlayerSize;\n    }\n  }\n  /**\n   * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n   */\n  get autoLevelCapping() {\n    return this._autoLevelCapping;\n  }\n  /**\n   * Returns the current bandwidth estimate in bits per second, when available. Otherwise, `NaN` is returned.\n   */\n  get bandwidthEstimate() {\n    const {\n      bwEstimator\n    } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.getEstimate();\n  }\n  set bandwidthEstimate(abrEwmaDefaultEstimate) {\n    this.abrController.resetEstimator(abrEwmaDefaultEstimate);\n  }\n  /**\n   * get time to first byte estimate\n   * @type {number}\n   */\n  get ttfbEstimate() {\n    const {\n      bwEstimator\n    } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.getEstimateTTFB();\n  }\n  /**\n   * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n   */\n  set autoLevelCapping(newLevel) {\n    if (this._autoLevelCapping !== newLevel) {\n      logger.log(`set autoLevelCapping:${newLevel}`);\n      this._autoLevelCapping = newLevel;\n      this.levelController.checkMaxAutoUpdated();\n    }\n  }\n  get maxHdcpLevel() {\n    return this._maxHdcpLevel;\n  }\n  set maxHdcpLevel(value) {\n    if (isHdcpLevel(value) && this._maxHdcpLevel !== value) {\n      this._maxHdcpLevel = value;\n      this.levelController.checkMaxAutoUpdated();\n    }\n  }\n  /**\n   * True when automatic level selection enabled\n   */\n  get autoLevelEnabled() {\n    return this.levelController.manualLevel === -1;\n  }\n  /**\n   * Level set manually (if any)\n   */\n  get manualLevel() {\n    return this.levelController.manualLevel;\n  }\n  /**\n   * min level selectable in auto mode according to config.minAutoBitrate\n   */\n  get minAutoLevel() {\n    const {\n      levels,\n      config: {\n        minAutoBitrate\n      }\n    } = this;\n    if (!levels)\n      return 0;\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    return 0;\n  }\n  /**\n   * max level selectable in auto mode according to autoLevelCapping\n   */\n  get maxAutoLevel() {\n    const {\n      levels,\n      autoLevelCapping,\n      maxHdcpLevel\n    } = this;\n    let maxAutoLevel;\n    if (autoLevelCapping === -1 && levels != null && levels.length) {\n      maxAutoLevel = levels.length - 1;\n    } else {\n      maxAutoLevel = autoLevelCapping;\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    return maxAutoLevel;\n  }\n  get firstAutoLevel() {\n    return this.abrController.firstAutoLevel;\n  }\n  /**\n   * next automatically selected quality level\n   */\n  get nextAutoLevel() {\n    return this.abrController.nextAutoLevel;\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) {\n    this.abrController.nextAutoLevel = nextLevel;\n  }\n  /**\n   * get the datetime value relative to media.currentTime for the active level Program Date Time if present\n   */\n  get playingDate() {\n    return this.streamController.currentProgramDateTime;\n  }\n  get mainForwardBufferInfo() {\n    return this.streamController.getMainFwdBufferInfo();\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  setAudioOption(audioOption) {\n    var _this$audioTrackContr;\n    return (_this$audioTrackContr = this.audioTrackController) == null ? void 0 : _this$audioTrackContr.setAudioOption(audioOption);\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  setSubtitleOption(subtitleOption) {\n    var _this$subtitleTrackCo;\n    (_this$subtitleTrackCo = this.subtitleTrackController) == null ? void 0 : _this$subtitleTrackCo.setSubtitleOption(subtitleOption);\n    return null;\n  }\n  /**\n   * Get the complete list of audio tracks across all media groups\n   */\n  get allAudioTracks() {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.allAudioTracks : [];\n  }\n  /**\n   * Get the list of selectable audio tracks\n   */\n  get audioTracks() {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.audioTracks : [];\n  }\n  /**\n   * index of the selected audio track (index in audio track lists)\n   */\n  get audioTrack() {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.audioTrack : -1;\n  }\n  /**\n   * selects an audio track, based on its index in audio track lists\n   */\n  set audioTrack(audioTrackId) {\n    const audioTrackController = this.audioTrackController;\n    if (audioTrackController) {\n      audioTrackController.audioTrack = audioTrackId;\n    }\n  }\n  /**\n   * get the complete list of subtitle tracks across all media groups\n   */\n  get allSubtitleTracks() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.allSubtitleTracks : [];\n  }\n  /**\n   * get alternate subtitle tracks list from playlist\n   */\n  get subtitleTracks() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.subtitleTracks : [];\n  }\n  /**\n   * index of the selected subtitle track (index in subtitle track lists)\n   */\n  get subtitleTrack() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.subtitleTrack : -1;\n  }\n  get media() {\n    return this._media;\n  }\n  /**\n   * select an subtitle track, based on its index in subtitle track lists\n   */\n  set subtitleTrack(subtitleTrackId) {\n    const subtitleTrackController = this.subtitleTrackController;\n    if (subtitleTrackController) {\n      subtitleTrackController.subtitleTrack = subtitleTrackId;\n    }\n  }\n  /**\n   * Whether subtitle display is enabled or not\n   */\n  get subtitleDisplay() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.subtitleDisplay : false;\n  }\n  /**\n   * Enable/disable subtitle display rendering\n   */\n  set subtitleDisplay(value) {\n    const subtitleTrackController = this.subtitleTrackController;\n    if (subtitleTrackController) {\n      subtitleTrackController.subtitleDisplay = value;\n    }\n  }\n  /**\n   * get mode for Low-Latency HLS loading\n   */\n  get lowLatencyMode() {\n    return this.config.lowLatencyMode;\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) {\n    this.config.lowLatencyMode = mode;\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() {\n    return this.latencyController.liveSyncPosition;\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() {\n    return this.latencyController.latency;\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() {\n    return this.latencyController.maxLatency;\n  }\n  /**\n   * target distance from the edge as calculated by the latency controller\n   */\n  get targetLatency() {\n    return this.latencyController.targetLatency;\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() {\n    return this.latencyController.drift;\n  }\n  /**\n   * set to true when startLoad is called before MANIFEST_PARSED event\n   */\n  get forceStartLoad() {\n    return this.streamController.forceStartLoad;\n  }\n}\nHls.defaultConfig = void 0;\nexport {\n  AbrController,\n  AttrList,\n  AudioStreamController,\n  AudioTrackController,\n  BasePlaylistController,\n  BaseSegment,\n  BaseStreamController,\n  BufferController,\n  CMCDController,\n  CapLevelController,\n  ChunkMetadata,\n  ContentSteeringController,\n  DateRange,\n  EMEController,\n  ErrorActionFlags,\n  ErrorController,\n  ErrorDetails,\n  ErrorTypes,\n  Events,\n  FPSController,\n  Fragment,\n  Hls,\n  HlsSkip,\n  HlsUrlParameters,\n  KeySystemFormats,\n  KeySystems,\n  Level,\n  LevelDetails,\n  LevelKey,\n  LoadStats,\n  MetadataSchema,\n  NetworkErrorAction,\n  Part,\n  PlaylistLevelType,\n  SubtitleStreamController,\n  SubtitleTrackController,\n  TimelineController,\n  Hls as default,\n  getMediaSource,\n  isMSESupported,\n  isSupported\n};\n", "import { Hls } from \"../node_modules/hls.js/dist/hls.js\";\nconst hlsCompatibilityHelper = (video) => {\n  if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n    video.play();\n    return;\n  }\n  if (Hls.isSupported()) {\n    const videoUrl = video.src;\n    const hls = new Hls();\n    hls.loadSource(videoUrl || \"\");\n    hls.attachMedia(video);\n    if (video.getAttribute(\"autoplay\") !== null && video.getAttribute(\"autoplay\") !== \"false\") {\n      hls.on(Hls.Events.MANIFEST_PARSED, () => {\n        video.play();\n      });\n    }\n  }\n};\nexport {\n  hlsCompatibilityHelper\n};\n", "import { hlsCompatibilityHelper } from \"../../../utils/hls.js\";\nconst catchHlsPlaybackError = (event) => {\n  const video = event.target;\n  hlsCompatibilityHelper(video);\n};\nexport {\n  catchHlsPlaybackError\n};\n", "(function() {\n  \"use strict\";\n  try {\n    if (typeof document != \"undefined\") {\n      var elementStyle = document.createElement(\"style\");\n      elementStyle.appendChild(document.createTextNode(\"._wrapper_1mtar_1 {\\n  width: 100%;\\n  aspect-ratio: 13 / 21;\\n}\\n\\n@supports not (aspect-ratio: 13 / 21) {\\n  ._wrapper_1mtar_1::before {\\n    content: '';\\n    display: block;\\n    padding-top: calc(21 / 13 * 100%);\\n  }\\n}\\n\\n._video_1mtar_14 {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  object-fit: cover;\\n}\"));\n      document.head.appendChild(elementStyle);\n    }\n  } catch (e) {\n    console.error(\"vite-plugin-css-injected-by-js\", e);\n  }\n})();\nconst wrapper = \"_wrapper_1mtar_1\";\nconst video = \"_video_1mtar_14\";\nconst styles = {\n  wrapper,\n  video\n};\nexport {\n  styles as default,\n  video,\n  wrapper\n};\n", "const CONTENT_DOMAIN_HOSTNAME = \"https://content.29cm.co.kr\";\nconst useCreateAppSchemeLink = () => {\n  const createAppSchemeLink = (href, options = {}) => {\n    const fullPath = href.includes(\"https://\") ? href : `${CONTENT_DOMAIN_HOSTNAME}${href}`;\n    const params = [];\n    if (options.home !== void 0) {\n      params.push(`29cm_nav_home=${getOnOffValue(options.home)}`);\n    }\n    if (options.cart !== void 0) {\n      params.push(`29cm_nav_cart=${getOnOffValue(options.cart)}`);\n    }\n    if (options.search !== void 0) {\n      params.push(`29cm_nav_search=${getOnOffValue(options.search)}`);\n    }\n    if (options.title !== void 0) {\n      params.push(`29cm_title=${encodeURIComponent(options.title)}`);\n    }\n    const queryString = params.length ? `?${params.join(\"&\")}` : \"\";\n    return `app29cm://web/${encodeURIComponent(`${fullPath}${queryString}`)}`;\n  };\n  return {\n    createAppSchemeLink\n  };\n};\nconst getOnOffValue = (value) => value ? \"on\" : \"off\";\nexport {\n  useCreateAppSchemeLink\n};\n", "import { useCreateAppSchemeLink } from \"./useCreateAppSchemeLink.js\";\nconst useCreateOneLink = (href, webviewNavOptions) => {\n  const {\n    createAppSchemeLink\n  } = useCreateAppSchemeLink();\n  const webLink = encodeURIComponent(href);\n  const appLink = createAppSchemeLink(href, webviewNavOptions);\n  const oneLink = `https://29cm.onelink.me/1080201211?af_dp=${appLink}&deep_link_value=${appLink}&af_web_dp=${webLink}`;\n  return {\n    oneLink\n  };\n};\nexport {\n  useCreateOneLink\n};\n", "import { useState, useEffect } from \"react\";\nconst getMatches = (query) => {\n  if (typeof window !== \"undefined\") {\n    return window.matchMedia(query).matches;\n  }\n  return false;\n};\nfunction useMediaQuery(query, initial = false) {\n  const [matches, setMatches] = useState(initial);\n  const handleChange = () => {\n    setMatches(getMatches(query));\n  };\n  useEffect(() => {\n    const matchMedia = window.matchMedia(query);\n    handleChange();\n    if (matchMedia.addEventListener) {\n      matchMedia.addEventListener(\"change\", handleChange);\n      return () => {\n        matchMedia.removeEventListener(\"change\", handleChange);\n      };\n    }\n    matchMedia.addListener(handleChange);\n    return () => {\n      matchMedia.removeListener(handleChange);\n    };\n  }, [query]);\n  return matches;\n}\nexport {\n  useMediaQuery\n};\n", "import { isMobile } from \"../utils/device.js\";\nimport { useMediaQuery } from \"./useMediaQuery.js\";\nconst mobileMediaQuery = `screen and (max-width: 540px)`;\nconst useIsMobileDevice = () => {\n  const isMobileMediaQuery = useMediaQuery(mobileMediaQuery);\n  const isMobileDevice = isMobile() || isMobileMediaQuery;\n  return isMobileDevice;\n};\nexport {\n  useIsMobileDevice\n};\n", "import { isServer } from \"./context.js\";\nconst getCleanUrl = () => {\n  const urlObj = new URL(document.location.href);\n  urlObj.search = \"\";\n  return urlObj.toString();\n};\nconst getCurrentHref = ({\n  removeQueryParams\n} = {}) => {\n  if (isServer()) {\n    return \"\";\n  }\n  if (removeQueryParams) {\n    return getCleanUrl();\n  }\n  return document.location.href;\n};\nexport {\n  getCurrentHref\n};\n", "import React from \"react\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __objRest = (source, exclude) => {\n  var target = {};\n  for (var prop in source)\n    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n      target[prop] = source[prop];\n  if (source != null && __getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(source)) {\n      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n        target[prop] = source[prop];\n    }\n  return target;\n};\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n  const _QrCode = class {\n    constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n      this.version = version;\n      this.errorCorrectionLevel = errorCorrectionLevel;\n      this.modules = [];\n      this.isFunction = [];\n      if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n        throw new RangeError(\"Version value out of range\");\n      if (msk < -1 || msk > 7)\n        throw new RangeError(\"Mask value out of range\");\n      this.size = version * 4 + 17;\n      let row = [];\n      for (let i = 0; i < this.size; i++)\n        row.push(false);\n      for (let i = 0; i < this.size; i++) {\n        this.modules.push(row.slice());\n        this.isFunction.push(row.slice());\n      }\n      this.drawFunctionPatterns();\n      const allCodewords = this.addEccAndInterleave(dataCodewords);\n      this.drawCodewords(allCodewords);\n      if (msk == -1) {\n        let minPenalty = 1e9;\n        for (let i = 0; i < 8; i++) {\n          this.applyMask(i);\n          this.drawFormatBits(i);\n          const penalty = this.getPenaltyScore();\n          if (penalty < minPenalty) {\n            msk = i;\n            minPenalty = penalty;\n          }\n          this.applyMask(i);\n        }\n      }\n      assert(0 <= msk && msk <= 7);\n      this.mask = msk;\n      this.applyMask(msk);\n      this.drawFormatBits(msk);\n      this.isFunction = [];\n    }\n    static encodeText(text, ecl) {\n      const segs = qrcodegen2.QrSegment.makeSegments(text);\n      return _QrCode.encodeSegments(segs, ecl);\n    }\n    static encodeBinary(data, ecl) {\n      const seg = qrcodegen2.QrSegment.makeBytes(data);\n      return _QrCode.encodeSegments([seg], ecl);\n    }\n    static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n      if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n        throw new RangeError(\"Invalid value\");\n      let version;\n      let dataUsedBits;\n      for (version = minVersion; ; version++) {\n        const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n        const usedBits = QrSegment.getTotalBits(segs, version);\n        if (usedBits <= dataCapacityBits2) {\n          dataUsedBits = usedBits;\n          break;\n        }\n        if (version >= maxVersion)\n          throw new RangeError(\"Data too long\");\n      }\n      for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n        if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n          ecl = newEcl;\n      }\n      let bb = [];\n      for (const seg of segs) {\n        appendBits(seg.mode.modeBits, 4, bb);\n        appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n        for (const b of seg.getData())\n          bb.push(b);\n      }\n      assert(bb.length == dataUsedBits);\n      const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n      assert(bb.length <= dataCapacityBits);\n      appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n      appendBits(0, (8 - bb.length % 8) % 8, bb);\n      assert(bb.length % 8 == 0);\n      for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n        appendBits(padByte, 8, bb);\n      let dataCodewords = [];\n      while (dataCodewords.length * 8 < bb.length)\n        dataCodewords.push(0);\n      bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n      return new _QrCode(version, ecl, dataCodewords, mask);\n    }\n    getModule(x, y) {\n      return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n    }\n    getModules() {\n      return this.modules;\n    }\n    drawFunctionPatterns() {\n      for (let i = 0; i < this.size; i++) {\n        this.setFunctionModule(6, i, i % 2 == 0);\n        this.setFunctionModule(i, 6, i % 2 == 0);\n      }\n      this.drawFinderPattern(3, 3);\n      this.drawFinderPattern(this.size - 4, 3);\n      this.drawFinderPattern(3, this.size - 4);\n      const alignPatPos = this.getAlignmentPatternPositions();\n      const numAlign = alignPatPos.length;\n      for (let i = 0; i < numAlign; i++) {\n        for (let j = 0; j < numAlign; j++) {\n          if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n            this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n        }\n      }\n      this.drawFormatBits(0);\n      this.drawVersion();\n    }\n    drawFormatBits(mask) {\n      const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n      let rem = data;\n      for (let i = 0; i < 10; i++)\n        rem = rem << 1 ^ (rem >>> 9) * 1335;\n      const bits = (data << 10 | rem) ^ 21522;\n      assert(bits >>> 15 == 0);\n      for (let i = 0; i <= 5; i++)\n        this.setFunctionModule(8, i, getBit(bits, i));\n      this.setFunctionModule(8, 7, getBit(bits, 6));\n      this.setFunctionModule(8, 8, getBit(bits, 7));\n      this.setFunctionModule(7, 8, getBit(bits, 8));\n      for (let i = 9; i < 15; i++)\n        this.setFunctionModule(14 - i, 8, getBit(bits, i));\n      for (let i = 0; i < 8; i++)\n        this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n      for (let i = 8; i < 15; i++)\n        this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n      this.setFunctionModule(8, this.size - 8, true);\n    }\n    drawVersion() {\n      if (this.version < 7)\n        return;\n      let rem = this.version;\n      for (let i = 0; i < 12; i++)\n        rem = rem << 1 ^ (rem >>> 11) * 7973;\n      const bits = this.version << 12 | rem;\n      assert(bits >>> 18 == 0);\n      for (let i = 0; i < 18; i++) {\n        const color = getBit(bits, i);\n        const a = this.size - 11 + i % 3;\n        const b = Math.floor(i / 3);\n        this.setFunctionModule(a, b, color);\n        this.setFunctionModule(b, a, color);\n      }\n    }\n    drawFinderPattern(x, y) {\n      for (let dy = -4; dy <= 4; dy++) {\n        for (let dx = -4; dx <= 4; dx++) {\n          const dist = Math.max(Math.abs(dx), Math.abs(dy));\n          const xx = x + dx;\n          const yy = y + dy;\n          if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n            this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n        }\n      }\n    }\n    drawAlignmentPattern(x, y) {\n      for (let dy = -2; dy <= 2; dy++) {\n        for (let dx = -2; dx <= 2; dx++)\n          this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n      }\n    }\n    setFunctionModule(x, y, isDark) {\n      this.modules[y][x] = isDark;\n      this.isFunction[y][x] = true;\n    }\n    addEccAndInterleave(data) {\n      const ver = this.version;\n      const ecl = this.errorCorrectionLevel;\n      if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n        throw new RangeError(\"Invalid argument\");\n      const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n      const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n      const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n      const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n      const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n      let blocks = [];\n      const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n      for (let i = 0, k = 0; i < numBlocks; i++) {\n        let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n        k += dat.length;\n        const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n        if (i < numShortBlocks)\n          dat.push(0);\n        blocks.push(dat.concat(ecc));\n      }\n      let result = [];\n      for (let i = 0; i < blocks[0].length; i++) {\n        blocks.forEach((block, j) => {\n          if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n            result.push(block[i]);\n        });\n      }\n      assert(result.length == rawCodewords);\n      return result;\n    }\n    drawCodewords(data) {\n      if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n        throw new RangeError(\"Invalid argument\");\n      let i = 0;\n      for (let right = this.size - 1; right >= 1; right -= 2) {\n        if (right == 6)\n          right = 5;\n        for (let vert = 0; vert < this.size; vert++) {\n          for (let j = 0; j < 2; j++) {\n            const x = right - j;\n            const upward = (right + 1 & 2) == 0;\n            const y = upward ? this.size - 1 - vert : vert;\n            if (!this.isFunction[y][x] && i < data.length * 8) {\n              this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n              i++;\n            }\n          }\n        }\n      }\n      assert(i == data.length * 8);\n    }\n    applyMask(mask) {\n      if (mask < 0 || mask > 7)\n        throw new RangeError(\"Mask value out of range\");\n      for (let y = 0; y < this.size; y++) {\n        for (let x = 0; x < this.size; x++) {\n          let invert;\n          switch (mask) {\n            case 0:\n              invert = (x + y) % 2 == 0;\n              break;\n            case 1:\n              invert = y % 2 == 0;\n              break;\n            case 2:\n              invert = x % 3 == 0;\n              break;\n            case 3:\n              invert = (x + y) % 3 == 0;\n              break;\n            case 4:\n              invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n              break;\n            case 5:\n              invert = x * y % 2 + x * y % 3 == 0;\n              break;\n            case 6:\n              invert = (x * y % 2 + x * y % 3) % 2 == 0;\n              break;\n            case 7:\n              invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n              break;\n            default:\n              throw new Error(\"Unreachable\");\n          }\n          if (!this.isFunction[y][x] && invert)\n            this.modules[y][x] = !this.modules[y][x];\n        }\n      }\n    }\n    getPenaltyScore() {\n      let result = 0;\n      for (let y = 0; y < this.size; y++) {\n        let runColor = false;\n        let runX = 0;\n        let runHistory = [0, 0, 0, 0, 0, 0, 0];\n        for (let x = 0; x < this.size; x++) {\n          if (this.modules[y][x] == runColor) {\n            runX++;\n            if (runX == 5)\n              result += _QrCode.PENALTY_N1;\n            else if (runX > 5)\n              result++;\n          } else {\n            this.finderPenaltyAddHistory(runX, runHistory);\n            if (!runColor)\n              result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n            runColor = this.modules[y][x];\n            runX = 1;\n          }\n        }\n        result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n      }\n      for (let x = 0; x < this.size; x++) {\n        let runColor = false;\n        let runY = 0;\n        let runHistory = [0, 0, 0, 0, 0, 0, 0];\n        for (let y = 0; y < this.size; y++) {\n          if (this.modules[y][x] == runColor) {\n            runY++;\n            if (runY == 5)\n              result += _QrCode.PENALTY_N1;\n            else if (runY > 5)\n              result++;\n          } else {\n            this.finderPenaltyAddHistory(runY, runHistory);\n            if (!runColor)\n              result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n            runColor = this.modules[y][x];\n            runY = 1;\n          }\n        }\n        result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n      }\n      for (let y = 0; y < this.size - 1; y++) {\n        for (let x = 0; x < this.size - 1; x++) {\n          const color = this.modules[y][x];\n          if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n            result += _QrCode.PENALTY_N2;\n        }\n      }\n      let dark = 0;\n      for (const row of this.modules)\n        dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n      const total = this.size * this.size;\n      const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n      assert(0 <= k && k <= 9);\n      result += k * _QrCode.PENALTY_N4;\n      assert(0 <= result && result <= 2568888);\n      return result;\n    }\n    getAlignmentPatternPositions() {\n      if (this.version == 1)\n        return [];\n      else {\n        const numAlign = Math.floor(this.version / 7) + 2;\n        const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n        let result = [6];\n        for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n          result.splice(1, 0, pos);\n        return result;\n      }\n    }\n    static getNumRawDataModules(ver) {\n      if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n        throw new RangeError(\"Version number out of range\");\n      let result = (16 * ver + 128) * ver + 64;\n      if (ver >= 2) {\n        const numAlign = Math.floor(ver / 7) + 2;\n        result -= (25 * numAlign - 10) * numAlign - 55;\n        if (ver >= 7)\n          result -= 36;\n      }\n      assert(208 <= result && result <= 29648);\n      return result;\n    }\n    static getNumDataCodewords(ver, ecl) {\n      return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n    }\n    static reedSolomonComputeDivisor(degree) {\n      if (degree < 1 || degree > 255)\n        throw new RangeError(\"Degree out of range\");\n      let result = [];\n      for (let i = 0; i < degree - 1; i++)\n        result.push(0);\n      result.push(1);\n      let root = 1;\n      for (let i = 0; i < degree; i++) {\n        for (let j = 0; j < result.length; j++) {\n          result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n          if (j + 1 < result.length)\n            result[j] ^= result[j + 1];\n        }\n        root = _QrCode.reedSolomonMultiply(root, 2);\n      }\n      return result;\n    }\n    static reedSolomonComputeRemainder(data, divisor) {\n      let result = divisor.map((_) => 0);\n      for (const b of data) {\n        const factor = b ^ result.shift();\n        result.push(0);\n        divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n      }\n      return result;\n    }\n    static reedSolomonMultiply(x, y) {\n      if (x >>> 8 != 0 || y >>> 8 != 0)\n        throw new RangeError(\"Byte out of range\");\n      let z = 0;\n      for (let i = 7; i >= 0; i--) {\n        z = z << 1 ^ (z >>> 7) * 285;\n        z ^= (y >>> i & 1) * x;\n      }\n      assert(z >>> 8 == 0);\n      return z;\n    }\n    finderPenaltyCountPatterns(runHistory) {\n      const n = runHistory[1];\n      assert(n <= this.size * 3);\n      const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n      return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n    }\n    finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n      if (currentRunColor) {\n        this.finderPenaltyAddHistory(currentRunLength, runHistory);\n        currentRunLength = 0;\n      }\n      currentRunLength += this.size;\n      this.finderPenaltyAddHistory(currentRunLength, runHistory);\n      return this.finderPenaltyCountPatterns(runHistory);\n    }\n    finderPenaltyAddHistory(currentRunLength, runHistory) {\n      if (runHistory[0] == 0)\n        currentRunLength += this.size;\n      runHistory.pop();\n      runHistory.unshift(currentRunLength);\n    }\n  };\n  let QrCode = _QrCode;\n  QrCode.MIN_VERSION = 1;\n  QrCode.MAX_VERSION = 40;\n  QrCode.PENALTY_N1 = 3;\n  QrCode.PENALTY_N2 = 3;\n  QrCode.PENALTY_N3 = 40;\n  QrCode.PENALTY_N4 = 10;\n  QrCode.ECC_CODEWORDS_PER_BLOCK = [\n    [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n    [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n    [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n    [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n  ];\n  QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n    [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n    [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n    [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n    [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n  ];\n  qrcodegen2.QrCode = QrCode;\n  function appendBits(val, len, bb) {\n    if (len < 0 || len > 31 || val >>> len != 0)\n      throw new RangeError(\"Value out of range\");\n    for (let i = len - 1; i >= 0; i--)\n      bb.push(val >>> i & 1);\n  }\n  function getBit(x, i) {\n    return (x >>> i & 1) != 0;\n  }\n  function assert(cond) {\n    if (!cond)\n      throw new Error(\"Assertion error\");\n  }\n  const _QrSegment = class {\n    constructor(mode, numChars, bitData) {\n      this.mode = mode;\n      this.numChars = numChars;\n      this.bitData = bitData;\n      if (numChars < 0)\n        throw new RangeError(\"Invalid argument\");\n      this.bitData = bitData.slice();\n    }\n    static makeBytes(data) {\n      let bb = [];\n      for (const b of data)\n        appendBits(b, 8, bb);\n      return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n    }\n    static makeNumeric(digits) {\n      if (!_QrSegment.isNumeric(digits))\n        throw new RangeError(\"String contains non-numeric characters\");\n      let bb = [];\n      for (let i = 0; i < digits.length; ) {\n        const n = Math.min(digits.length - i, 3);\n        appendBits(parseInt(digits.substr(i, n), 10), n * 3 + 1, bb);\n        i += n;\n      }\n      return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n    }\n    static makeAlphanumeric(text) {\n      if (!_QrSegment.isAlphanumeric(text))\n        throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n      let bb = [];\n      let i;\n      for (i = 0; i + 2 <= text.length; i += 2) {\n        let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n        temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n        appendBits(temp, 11, bb);\n      }\n      if (i < text.length)\n        appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n      return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n    }\n    static makeSegments(text) {\n      if (text == \"\")\n        return [];\n      else if (_QrSegment.isNumeric(text))\n        return [_QrSegment.makeNumeric(text)];\n      else if (_QrSegment.isAlphanumeric(text))\n        return [_QrSegment.makeAlphanumeric(text)];\n      else\n        return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n    }\n    static makeEci(assignVal) {\n      let bb = [];\n      if (assignVal < 0)\n        throw new RangeError(\"ECI assignment value out of range\");\n      else if (assignVal < 1 << 7)\n        appendBits(assignVal, 8, bb);\n      else if (assignVal < 1 << 14) {\n        appendBits(2, 2, bb);\n        appendBits(assignVal, 14, bb);\n      } else if (assignVal < 1e6) {\n        appendBits(6, 3, bb);\n        appendBits(assignVal, 21, bb);\n      } else\n        throw new RangeError(\"ECI assignment value out of range\");\n      return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n    }\n    static isNumeric(text) {\n      return _QrSegment.NUMERIC_REGEX.test(text);\n    }\n    static isAlphanumeric(text) {\n      return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n    }\n    getData() {\n      return this.bitData.slice();\n    }\n    static getTotalBits(segs, version) {\n      let result = 0;\n      for (const seg of segs) {\n        const ccbits = seg.mode.numCharCountBits(version);\n        if (seg.numChars >= 1 << ccbits)\n          return Infinity;\n        result += 4 + ccbits + seg.bitData.length;\n      }\n      return result;\n    }\n    static toUtf8ByteArray(str) {\n      str = encodeURI(str);\n      let result = [];\n      for (let i = 0; i < str.length; i++) {\n        if (str.charAt(i) != \"%\")\n          result.push(str.charCodeAt(i));\n        else {\n          result.push(parseInt(str.substr(i + 1, 2), 16));\n          i += 2;\n        }\n      }\n      return result;\n    }\n  };\n  let QrSegment = _QrSegment;\n  QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n  QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n  QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n  qrcodegen2.QrSegment = QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n  ((QrCode2) => {\n    const _Ecc = class {\n      constructor(ordinal, formatBits) {\n        this.ordinal = ordinal;\n        this.formatBits = formatBits;\n      }\n    };\n    let Ecc = _Ecc;\n    Ecc.LOW = new _Ecc(0, 1);\n    Ecc.MEDIUM = new _Ecc(1, 0);\n    Ecc.QUARTILE = new _Ecc(2, 3);\n    Ecc.HIGH = new _Ecc(3, 2);\n    QrCode2.Ecc = Ecc;\n  })(qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n  ((QrSegment2) => {\n    const _Mode = class {\n      constructor(modeBits, numBitsCharCount) {\n        this.modeBits = modeBits;\n        this.numBitsCharCount = numBitsCharCount;\n      }\n      numCharCountBits(ver) {\n        return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n      }\n    };\n    let Mode = _Mode;\n    Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n    Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n    Mode.BYTE = new _Mode(4, [8, 16, 16]);\n    Mode.KANJI = new _Mode(8, [8, 10, 12]);\n    Mode.ECI = new _Mode(7, [0, 0, 0]);\n    QrSegment2.Mode = Mode;\n  })(qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n  L: qrcodegen_default.QrCode.Ecc.LOW,\n  M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n  Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n  H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar MARGIN_SIZE = 4;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n  const ops = [];\n  modules.forEach(function(row, y) {\n    let start = null;\n    row.forEach(function(cell, x) {\n      if (!cell && start !== null) {\n        ops.push(`M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`);\n        start = null;\n        return;\n      }\n      if (x === row.length - 1) {\n        if (!cell) {\n          return;\n        }\n        if (start === null) {\n          ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n        } else {\n          ops.push(`M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`);\n        }\n        return;\n      }\n      if (cell && start === null) {\n        start = x;\n      }\n    });\n  });\n  return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n  return modules.slice().map((row, y) => {\n    if (y < excavation.y || y >= excavation.y + excavation.h) {\n      return row;\n    }\n    return row.map((cell, x) => {\n      if (x < excavation.x || x >= excavation.x + excavation.w) {\n        return cell;\n      }\n      return false;\n    });\n  });\n}\nfunction getImageSettings(cells, size, includeMargin, imageSettings) {\n  if (imageSettings == null) {\n    return null;\n  }\n  const margin = includeMargin ? MARGIN_SIZE : 0;\n  const numCells = cells.length + margin * 2;\n  const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n  const scale = numCells / size;\n  const w = (imageSettings.width || defaultSize) * scale;\n  const h = (imageSettings.height || defaultSize) * scale;\n  const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n  const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n  let excavation = null;\n  if (imageSettings.excavate) {\n    let floorX = Math.floor(x);\n    let floorY = Math.floor(y);\n    let ceilW = Math.ceil(w + x - floorX);\n    let ceilH = Math.ceil(h + y - floorY);\n    excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n  }\n  return { x, y, h, w, excavation };\n}\n(function() {\n  try {\n    new Path2D().addPath(new Path2D());\n  } catch (e) {\n    return false;\n  }\n  return true;\n})();\nfunction QRCodeSVG(props) {\n  const _a = props, {\n    value,\n    size = DEFAULT_SIZE,\n    level = DEFAULT_LEVEL,\n    bgColor = DEFAULT_BGCOLOR,\n    fgColor = DEFAULT_FGCOLOR,\n    includeMargin = DEFAULT_INCLUDEMARGIN,\n    imageSettings\n  } = _a, otherProps = __objRest(_a, [\n    \"value\",\n    \"size\",\n    \"level\",\n    \"bgColor\",\n    \"fgColor\",\n    \"includeMargin\",\n    \"imageSettings\"\n  ]);\n  let cells = qrcodegen_default.QrCode.encodeText(value, ERROR_LEVEL_MAP[level]).getModules();\n  const margin = includeMargin ? MARGIN_SIZE : 0;\n  const numCells = cells.length + margin * 2;\n  const calculatedImageSettings = getImageSettings(cells, size, includeMargin, imageSettings);\n  let image = null;\n  if (imageSettings != null && calculatedImageSettings != null) {\n    if (calculatedImageSettings.excavation != null) {\n      cells = excavateModules(cells, calculatedImageSettings.excavation);\n    }\n    image = /* @__PURE__ */ React.createElement(\"image\", {\n      xlinkHref: imageSettings.src,\n      height: calculatedImageSettings.h,\n      width: calculatedImageSettings.w,\n      x: calculatedImageSettings.x + margin,\n      y: calculatedImageSettings.y + margin,\n      preserveAspectRatio: \"none\"\n    });\n  }\n  const fgPath = generatePath(cells, margin);\n  return /* @__PURE__ */ React.createElement(\"svg\", __spreadValues({\n    height: size,\n    width: size,\n    viewBox: `0 0 ${numCells} ${numCells}`\n  }, otherProps), /* @__PURE__ */ React.createElement(\"path\", {\n    fill: bgColor,\n    d: `M0,0 h${numCells}v${numCells}H0z`,\n    shapeRendering: \"crispEdges\"\n  }), /* @__PURE__ */ React.createElement(\"path\", {\n    fill: fgColor,\n    d: fgPath,\n    shapeRendering: \"crispEdges\"\n  }), image);\n}\nexport {\n  QRCodeSVG\n};\n", "import { jsxs, jsx } from \"react/jsx-runtime\";\nimport _JSXStyle from \"../../../../node_modules/styled-jsx/style.js\";\nimport { QRCodeSVG } from \"../../../../node_modules/qrcode.react/lib/esm/index.js\";\nimport { useIsMobileDevice } from \"../../../../hooks/useIsMobileDevice.js\";\nconst AppLinkDialog = ({\n  content,\n  oneLink,\n  displayDesktopQRCode = true\n}) => {\n  const isMobile = useIsMobileDevice();\n  if (isMobile || !displayDesktopQRCode) {\n    return /* @__PURE__ */ jsxs(\"span\", { className: text.className, children: [\n      content,\n      text.styles\n    ] });\n  }\n  return /* @__PURE__ */ jsxs(\"div\", { className: container.className, children: [\n    /* @__PURE__ */ jsx(QRCodeSVG, { value: oneLink, size: 150, bgColor: \"#ffffff\", fgColor: \"#000000\", includeMargin: false }),\n    /* @__PURE__ */ jsx(\"span\", { className: text.className, children: content }),\n    container.styles,\n    text.styles\n  ] });\n};\nconst container = {\n  styles: /* @__PURE__ */ jsx(_JSXStyle, { id: \"2940926304\", children: [\"div.jsx-2940926304{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:20px;}\"] }),\n  className: \"jsx-2940926304\"\n};\nconst text = {\n  styles: /* @__PURE__ */ jsx(_JSXStyle, { id: \"1263816186\", children: [\"span.jsx-1263816186{font-size:14px;font-weight:400;line-height:140%;color:#000;}\"] }),\n  className: \"jsx-1263816186\"\n};\nexport {\n  AppLinkDialog\n};\n", "import { jsx } from \"react/jsx-runtime\";\nimport { useCreateOneLink } from \"../../../../hooks/useCreateOneLink.js\";\nimport { useDialog } from \"../../../../hooks/useDialog.js\";\nimport { useIsMobileDevice } from \"../../../../hooks/useIsMobileDevice.js\";\nimport { getCurrentHref } from \"../../../../utils/getCurrentHref.js\";\nimport { AppLinkDialog } from \"./AppLinkDialog.js\";\nconst DIALOG_ID = \"app-link-dialog-id\";\nconst useAppLinkDialog = ({\n  webviewNavOptions,\n  href,\n  displayDesktopQRCode = true,\n  content\n}) => {\n  const dialog = useDialog();\n  const isMobile = useIsMobileDevice();\n  const {\n    oneLink\n  } = useCreateOneLink(href ?? getCurrentHref({\n    removeQueryParams: true\n  }), webviewNavOptions);\n  const redirectApp = () => {\n    if (!isMobile) {\n      return;\n    }\n    document.location.href = oneLink;\n  };\n  const show = () => {\n    dialog.show({\n      id: DIALOG_ID,\n      content: /* @__PURE__ */ jsx(AppLinkDialog, { content, oneLink, displayDesktopQRCode }),\n      primaryButtonText: isMobile ? \"\uC571\uC73C\uB85C \uC774\uB3D9\" : \"\uD655\uC778\",\n      secondaryButtonText: isMobile ? \"\uCDE8\uC18C\" : \"\",\n      onPrimaryButtonClick: redirectApp\n    });\n  };\n  const hide = () => {\n    dialog.hide(DIALOG_ID, true);\n  };\n  return {\n    show,\n    hide\n  };\n};\nexport {\n  useAppLinkDialog\n};\n", "import { env } from \"../../config/index.js\";\nclass LiveCampaignApiService {\n  getCampaign(campaignKey, resolutionLevel = \"4\") {\n    const params = {\n      resolutionLevel\n    };\n    const searchParams = new URLSearchParams(params).toString();\n    return fetch(`${env.api.content}/api/v4/framers/campaigns/${campaignKey}?${searchParams}`, {\n      headers: {\n        \"X-ShopLive-Access-Key\": env.sdk.shoplive.accessKey\n      }\n    }).then((res) => res.json());\n  }\n  getCampaigns(campaignKeys) {\n    const params = {\n      campaignKeys: campaignKeys.join(\",\")\n    };\n    const searchParams = new URLSearchParams(params).toString();\n    return fetch(`${env.api.content}/api/v4/framers/proxy/content-api/api/v4/campaigns?${searchParams}`, {\n      headers: {\n        \"X-ShopLive-Access-Key\": env.sdk.shoplive.accessKey\n      }\n    }).then((res) => res.json());\n  }\n}\nconst liveCampaignApi = new LiveCampaignApiService();\nexport {\n  liveCampaignApi\n};\n", "import useSWR from \"../../node_modules/swr/core/dist/index.js\";\nimport { liveCampaignApi } from \"../../apis/live-campaign/LiveCampaignApiService.js\";\nconst LIVE_CAMPAIGN_FETCHER_KEY = \"@live-campaign\";\nconst useFetchLiveCampaign = (campaignKey, enabled = true) => {\n  const {\n    isLoading,\n    ...rest\n  } = useSWR(enabled ? [LIVE_CAMPAIGN_FETCHER_KEY, campaignKey] : null, () => liveCampaignApi.getCampaign(campaignKey));\n  return {\n    ...rest,\n    isLoading: isLoading || !enabled\n  };\n};\nexport {\n  LIVE_CAMPAIGN_FETCHER_KEY,\n  useFetchLiveCampaign\n};\n", "import { createKRTimeZoneDate } from \"../createUTCDate.js\";\nimport { differenceInMilliseconds } from \"../../node_modules/date-fns/differenceInMilliseconds.js\";\nconst diffFromNowInMilliseconds = (date) => differenceInMilliseconds(createKRTimeZoneDate(date), createKRTimeZoneDate());\nexport {\n  diffFromNowInMilliseconds\n};\n", "import { useState, useRef, useMemo } from \"react\";\nimport { differenceInMilliseconds } from \"../node_modules/date-fns/differenceInMilliseconds.js\";\nimport { parseISO } from \"../node_modules/date-fns/parseISO.js\";\nimport { diffFromNowInMilliseconds } from \"../utils/date-helpers/diffFromNowInMilliseconds.js\";\nimport useInterval from \"../node_modules/react-use/esm/useInterval.js\";\nconst MS_IN_SECOND = 1e3;\nconst MS_IN_MINUTE = MS_IN_SECOND * 60;\nconst getCurrentCampaignStatus = (remaining, duration) => {\n  switch (true) {\n    case remaining < MS_IN_SECOND:\n      return \"CLOSED\";\n    case remaining - duration < MS_IN_SECOND:\n      return \"ONAIR\";\n    case remaining - duration - MS_IN_MINUTE * 10 < MS_IN_SECOND:\n      return \"REHEARSAL\";\n    default:\n      return \"READY\";\n  }\n};\nconst useLiveCampaignStatus = (campaign, teasingContent) => {\n  const [status, setStatus] = useState(\"NOT_EXIST\");\n  const initialRemaining = (campaign == null ? void 0 : campaign.scheduledEndAt) ? diffFromNowInMilliseconds(parseISO(campaign.scheduledEndAt)) : 0;\n  const remaining = useRef(initialRemaining);\n  const duration = useMemo(() => (campaign == null ? void 0 : campaign.scheduledAt) && (campaign == null ? void 0 : campaign.scheduledEndAt) ? differenceInMilliseconds(parseISO(campaign.scheduledEndAt), parseISO(campaign.scheduledAt)) : 0, [campaign]);\n  const intervalCallback = () => {\n    if (!(campaign == null ? void 0 : campaign.scheduledEndAt)) {\n      return;\n    }\n    const incoming = diffFromNowInMilliseconds(parseISO(campaign.scheduledEndAt));\n    const nextStatus = getCurrentCampaignStatus(incoming, duration);\n    const isReady = nextStatus === \"READY\";\n    const isTeasing = isReady && teasingContent;\n    setStatus(isTeasing ? \"TEASING\" : nextStatus);\n    remaining.current = nextStatus !== \"CLOSED\" ? incoming : 0;\n  };\n  useInterval(intervalCallback, status !== \"CLOSED\" ? MS_IN_SECOND : null);\n  return status;\n};\nexport {\n  useLiveCampaignStatus\n};\n", "import { useAnalytics } from \"../../../hooks/analytics/useAnalytics.js\";\nconst useTrackClickPlayLiveContent = () => {\n  const {\n    trackAmplitude\n  } = useAnalytics();\n  const trackClickPlayLiveContent = (campaignKey) => {\n    const properties = {\n      campaign_key: campaignKey\n    };\n    trackAmplitude(\"click_play_live_content\", properties);\n  };\n  return {\n    trackClickPlayLiveContent\n  };\n};\nexport {\n  useTrackClickPlayLiveContent\n};\n", "import { useAppLinkDialog } from \"../../@shared/dialogs/AppLinkDialog/AppLinkDialog.hooks.js\";\nimport { useFetchLiveCampaign } from \"../../../hooks/fetchers/useFetchLiveCampaign.js\";\nimport { useLiveCampaignStatus } from \"../../../hooks/useLiveStatus.js\";\nimport { useTrackClickPlayLiveContent } from \"./LiveCampaignVideo.hooks.event.js\";\nimport { isWebview } from \"../../../utils/device.js\";\nimport { useState, useEffect } from \"react\";\nimport { useInView } from \"framer-motion\";\nimport useInterval from \"../../../node_modules/react-use/esm/useInterval.js\";\nconst MS_IN_SECOND = 1e3;\nconst useIsEnabled = (ref) => {\n  return useInView(ref, {\n    margin: \"200px 0px\",\n    once: true\n  });\n};\nconst useIsImpressed = (ref) => {\n  return useInView(ref, {\n    margin: \"0px\",\n    amount: 0.5\n  });\n};\nconst useLiveCampaignVideo = ({\n  campaignKey,\n  playPreviewStatusList,\n  intervalEnabled,\n  enabled = true\n}) => {\n  const {\n    isLoading,\n    data,\n    mutate\n  } = useFetchLiveCampaign(campaignKey, enabled);\n  const campaign = data == null ? void 0 : data.data;\n  const status = useLiveCampaignStatus(campaign);\n  const shouldRenderPreview = playPreviewStatusList.includes(status);\n  const previewUrl = ((campaign == null ? void 0 : campaign.previewLiveUrl) || (campaign == null ? void 0 : campaign.previewReplayLiveUrl)) ?? void 0;\n  const posterUrl = (campaign == null ? void 0 : campaign.poster2Url) ?? void 0;\n  const isPending = isLoading || !campaign;\n  useInterval(() => {\n    mutate();\n  }, intervalEnabled && shouldRenderPreview && !previewUrl ? MS_IN_SECOND * 10 : null);\n  return {\n    isPending,\n    data,\n    status,\n    shouldRenderPreview,\n    previewUrl,\n    posterUrl\n  };\n};\nconst ACCESS_FROM_APP_MESSAGE = \"\uB77C\uC774\uBE0C \uBC29\uC1A1\uC740 APP \uC804\uC6A9 \uC11C\uBE44\uC2A4\uC608\uC694!\\nAPP\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.\";\nconst useLiveCampaignVideoAction = (campaignKey) => {\n  const dialog = useAppLinkDialog({\n    content: ACCESS_FROM_APP_MESSAGE,\n    displayDesktopQRCode: false\n  });\n  const {\n    trackClickPlayLiveContent\n  } = useTrackClickPlayLiveContent();\n  const handleVideoClick = () => {\n    if (!isWebview()) {\n      dialog.show();\n      return;\n    }\n    trackClickPlayLiveContent(campaignKey);\n    document.location.href = `app29cm://content/live/${campaignKey}`;\n  };\n  return {\n    handleVideoClick\n  };\n};\nconst usePlayInView = (isInView) => {\n  const [video, setVideo] = useState(null);\n  useEffect(() => {\n    if (video === null) {\n      return;\n    }\n    if (isInView) {\n      if (video.paused) {\n        video.play();\n      }\n    } else {\n      video.pause();\n    }\n  }, [video, isInView]);\n  return {\n    setVideo\n  };\n};\nexport {\n  useIsEnabled,\n  useIsImpressed,\n  useLiveCampaignVideo,\n  useLiveCampaignVideoAction,\n  usePlayInView\n};\n", "const CampaignStatus = {\n  READY: \"READY\",\n  ONAIR: \"ONAIR\",\n  CLOSED: \"CLOSED\",\n  NOT_EXIST: \"NOT_EXIST\"\n};\nexport {\n  CampaignStatus\n};\n", "import { CampaignStatus } from \"../apis/live-campaign/LiveCampaignApiService.types.js\";\nconst RichCampaignStatus = {\n  ...CampaignStatus,\n  TEASING: \"TEASING\",\n  REHEARSAL: \"REHEARSAL\"\n};\nexport {\n  RichCampaignStatus\n};\n", "import { RichCampaignStatus } from \"../../../types/live-campaign.js\";\nconst PREVIEW_ALLOWED_STATUS_LIST = [RichCampaignStatus.REHEARSAL, RichCampaignStatus.ONAIR, RichCampaignStatus.CLOSED];\nconst MINIMAL_PREVIEW_ALLOWED_STATUS_LIST = [RichCampaignStatus.REHEARSAL, RichCampaignStatus.ONAIR];\nexport {\n  MINIMAL_PREVIEW_ALLOWED_STATUS_LIST,\n  PREVIEW_ALLOWED_STATUS_LIST\n};\n", "import { jsx } from \"react/jsx-runtime\";\nimport { addPropertyControls, ControlType } from \"framer\";\nimport { catchHlsPlaybackError } from \"./LiveCampaignVideo.utils.js\";\nimport styles from \"./LiveCampaignVideo.module.css.js\";\nimport { useIsEnabled, useIsImpressed, useLiveCampaignVideo, useLiveCampaignVideoAction, usePlayInView } from \"./LiveCampaignVideo.hooks.js\";\nimport { useRef } from \"react\";\nimport { PREVIEW_ALLOWED_STATUS_LIST, MINIMAL_PREVIEW_ALLOWED_STATUS_LIST } from \"./LiveCampaignVideo.constants.js\";\nconst LiveCampaignVideo = ({\n  campaignKey,\n  playAfterCampaign\n}) => {\n  const ref = useRef(null);\n  const enabled = useIsEnabled(ref);\n  const isImpressed = useIsImpressed(ref);\n  const playPreviewStatusList = playAfterCampaign ? PREVIEW_ALLOWED_STATUS_LIST : MINIMAL_PREVIEW_ALLOWED_STATUS_LIST;\n  const {\n    isPending,\n    shouldRenderPreview,\n    previewUrl,\n    posterUrl\n  } = useLiveCampaignVideo({\n    campaignKey,\n    playPreviewStatusList,\n    intervalEnabled: isImpressed,\n    enabled\n  });\n  const {\n    handleVideoClick\n  } = useLiveCampaignVideoAction(campaignKey);\n  const {\n    setVideo\n  } = usePlayInView(isImpressed);\n  if (isPending) {\n    return /* @__PURE__ */ jsx(\"div\", { className: styles.wrapper, ref });\n  }\n  return /* @__PURE__ */ jsx(\"div\", { className: styles.wrapper, ref, children: shouldRenderPreview ? /* @__PURE__ */ jsx(\"video\", { ref: setVideo, className: styles.video, src: previewUrl, poster: posterUrl, onClick: handleVideoClick, onError: catchHlsPlaybackError, autoPlay: true, muted: true, playsInline: true }) : null });\n};\naddPropertyControls(LiveCampaignVideo, {\n  campaignKey: {\n    title: \"\uB77C\uC774\uBE0C \uCEA0\uD398\uC778 \uD0A4\",\n    type: ControlType.String,\n    defaultValue: \"745a9de22f66\"\n  },\n  playAfterCampaign: {\n    title: \"\uB2E4\uC2DC\uBCF4\uAE30 \uC7AC\uC0DD\",\n    type: ControlType.Boolean,\n    defaultValue: true,\n    description: \"\uC804\uC0AC \uAE30\uD68D\uC804 \uB4F1 \uC131\uB2A5 \uCD5C\uC801\uD654\uAC00 \uD544\uC694\uD55C \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C, \uB2E4\uC2DC\uBCF4\uAE30 \uBE44\uB514\uC624 \uC7AC\uC0DD \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.\"\n  }\n});\nexport {\n  LiveCampaignVideo\n};\n", "// import { LiveCampaignVideo } from \"https://localhost:4173/components/systems/LiveCampaignVideo/LiveCampaignVideo.js\"\nimport{LiveCampaignVideo}from\"https://asset.29cm.co.kr/contents/framer/components/systems/LiveCampaignVideo/LiveCampaignVideo.js\";LiveCampaignVideo.displayName=\"LiveCampaignVideo\";/**\n * @framerDisableUnlink\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default LiveCampaignVideo;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LiveCampaignVideo\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerDisableUnlink\":\"* @framerSupportedLayoutWidth auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TestLiveCampaignVideo.map"],
  "mappings": "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KAAM,CAAC,EACP,KAAM,CAAC,EACP,KAAM,CAAC,EACP,KAAM,CAAC,EACP,KAAM,CAAC,EACP,KAAM,CAAC,CACT,EACA,IAAIjgD,EACJ,IAAKA,KAAKigD,EAAI,MACRA,EAAI,MAAM,eAAejgD,CAAC,IAC5BigD,EAAI,MAAMjgD,CAAC,EAAI,CAACA,EAAE,WAAW,CAAC,EAAGA,EAAE,WAAW,CAAC,EAAGA,EAAE,WAAW,CAAC,EAAGA,EAAE,WAAW,CAAC,CAAC,GAGtF,IAAMkgD,EAAY,IAAI,WAAW,CAC/B,EAEA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,IACA,IACA,IACA,IAEA,EACA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,CAEF,CAAC,EACKC,EAAY,IAAI,WAAW,CAC/B,EAEA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,IACA,IACA,IACA,IAEA,EACA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,CAEF,CAAC,EACDF,EAAI,WAAa,CACf,MAAOC,EACP,MAAOC,CACT,EACA,IAAMC,EAAO,IAAI,WAAW,CAC1B,EAEA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,EACA,EACA,EACA,GAEA,IACA,IACA,IACA,GAEA,EAEA,EACA,EACA,CAEF,CAAC,EACKC,EAAO,IAAI,WAAW,CAC1B,EAEA,EACA,EACA,EAEA,EACA,EACA,EACA,CAEF,CAAC,EACDJ,EAAI,KAAOA,EAAI,KAAOA,EAAI,KAAOI,EACjCJ,EAAI,KAAO,IAAI,WAAW,CACxB,EAEA,EACA,EACA,EAEA,EACA,EACA,EACA,EAEA,EACA,EACA,EACA,CAEF,CAAC,EACDA,EAAI,KAAO,IAAI,WAAW,CACxB,EAEA,EACA,EACA,EAEA,EACA,EAEA,EACA,EACA,EACA,EACA,EACA,CAEF,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",
  "names": ["gtKx7cgl6_exports", "__export", "__FramerMetadata__", "gtKx7cgl6_default", "cycleOrder", "serializationHash", "variantClassNames", "addPropertyOverrides", "overrides", "variants", "nextOverrides", "variant", "transition1", "Transition", "value", "children", "config", "re", "MotionConfigContext", "transition", "contextValue", "se", "p", "Variants", "motion", "x", "humanReadableVariantMap", "getProps", "brandNameKor", "desc", "descVisible", "height", "id", "onTap", "url", "width", "props", "createLayoutDependency", "Component", "Y", "ref", "activeLocale", "setLocale", "useLocaleInfo", "style", "className", "layoutId", "oCwUau3q4", "AKriOw6Zk", "jTgPksek5", "iLD9hHMek", "h1eW_LV8X", "restProps", "baseVariant", "classNames", "clearLoadingGesture", "gestureHandlers", "gestureVariant", "isLoading", "setGestureState", "setVariant", "useVariantState", "layoutDependency", "activeVariantCallback", "delay", "useActiveVariantCallback", "onTapz62v8u", "args", "scopingClassNames", "cx", "ref1", "pe", "isDisplayed", "isDisplayed1", "defaultLayoutId", "ae", "componentViewport", "useComponentViewport", "LayoutGroup", "Link", "u", "RichText2", "SVG", "css", "FramergtKx7cgl6", "withCSS", "gtKx7cgl6_default", "addPropertyControls", "ControlType", "addFonts", "__FramerMetadata__", "getDefaultExportFromCjs", "x", "urlToolkit", "module", "exports", "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", "urlToolkitExports", "ownKeys", "e", "r", "o", "r2", "_objectSpread2", "_defineProperty", "_toPrimitive", "t", "_toPropertyKey", "i", "obj", "key", "value", "_extends", "target", "source", "isFiniteNumber", "isSafeInteger", "MAX_SAFE_INTEGER", "Events", "Events2", "ErrorTypes", "ErrorTypes2", "ErrorDetails", "ErrorDetails2", "noop", "fakeLogger", "exportedLogger", "consolePrintFn", "type", "func", "exportLoggerFunctions", "debugConfig", "functions", "enableLogs", "id", "logger", "DECIMAL_RESOLUTION_REGEX", "ATTR_LIST_REGEX", "AttrList", "attrs", "attr", "attrName", "intValue", "stringValue", "defaultValue", "res", "input", "match", "quote", "name", "isDateRangeCueAttribute", "isSCTE35Attribute", "DateRange", "dateRangeAttr", "dateRangeWithSameId", "previousAttr", "endDate", "duration", "LoadStats", "ElementaryStreamTypes", "BaseSegment", "baseurl", "previous", "params", "start", "Fragment", "levelkeys", "keyFormats", "_this$_decryptdata", "len", "keyFormat", "_this$loader", "_this$keyLoader", "startPTS", "endPTS", "startDTS", "endDTS", "partial", "elementaryStreams", "info", "Part", "partAttrs", "frag", "index", "byteRange", "DEFAULT_TARGET_DURATION", "LevelDetails", "baseUrl", "partSnDiff", "partIndexDiff", "runTime", "_this$partList", "_this$fragments", "_this$partList2", "_this$partList3", "base64Decode", "base64encodedStr", "c", "getKeyIdBytes", "str", "keyIdbytes", "strToUtf8array", "paddedkeyIdbytes", "changeEndianness", "keyId", "swap", "array", "from", "to", "cur", "convertDataUriToArrayBytes", "uri", "colonsplit", "keydata", "semicolonsplit", "commasplit", "isbase64", "data", "optionalSelf", "KeySystems", "KeySystemFormats", "keySystemFormatToKeySystemDomain", "format2", "KeySystemIds", "keySystemIdToKeySystemDomain", "systemId", "keySystemDomainToKeySystemFormat", "keySystem", "getKeySystemsForConfig", "config", "drmSystems", "widevineLicenseUrl", "keySystemsToAttempt", "requestMediaKeySystemAccess", "_optionalSelf$navigat", "getSupportedMediaKeySystemConfigurations", "audioCodecs", "videoCodecs", "drmSystemOptions", "initDataTypes", "createMediaKeySystemConfigurations", "codec", "sliceUint8", "end", "isHeader$2", "offset", "isFooter", "getID3Data", "front", "length", "size", "readSize", "canParse$2", "getTimeStamp", "frames", "getID3Frames", "frame", "isTimeStampFrame", "readTimeStamp", "getFrameData", "id3Data", "frameData", "decodeFrame", "decodePrivFrame", "decodeURLFrame", "decodeTextFrame", "owner", "utf8ArrayToStr", "privateData", "description", "text", "timeStampFrame", "pts33Bit", "timestamp", "exitOnNull", "decoder2", "getTextDecoder", "decoded", "idx", "char2", "char3", "out", "decoder", "navigator", "Hex", "h", "UINT32_MAX$1", "push", "RemuxerTrackIdConfig", "bin2str", "readUint16", "buffer", "val", "readUint32", "readSint32", "readUint64", "result", "writeUint32", "hasMoofData", "findBox", "results", "endbox", "subresults", "parseSegmentIndex", "sidx", "references", "version", "timescale", "earliestPresentationTime", "firstOffset", "startByte", "referencesCount", "referenceIndex", "referenceInfo", "referenceSize", "subsegmentDuration", "parseInitSegment", "initSegment", "traks", "trak", "tkhd", "trackId", "mdhd", "hdlr", "hdlrType", "stsd", "stsdData", "parseStsd", "trex2", "track", "sampleEntries", "sampleEntriesEnd", "fourCC", "encrypted", "encBoxChildren", "sinf", "schm", "scheme", "frma", "avcCBox", "toHex", "codecBox", "esdsBox", "skipBERInteger", "flags", "objectType", "firstByte", "audioObjectType", "hvcCBox", "profileByte", "profileSpace", "generalProfileIdc", "profileCompat", "tierFlag", "levelIDC", "constraintIndicator", "constraintString", "byte", "dvcCBox", "profile", "level", "addLeadingZero", "vpcCBox", "bitDepth", "av1CBox", "highBitDepth", "twelveBit", "monochrome", "chromaSubsamplingX", "chromaSubsamplingY", "chromaSamplePosition", "colorPrimaries", "transferCharacteristics", "matrixCoefficients", "videoFullRangeFlag", "bytes", "limit", "num", "patchEncyptionData", "decryptdata", "encBoxes", "isAudio", "enc", "tenc", "parseSinf", "tencKeyId", "b", "getStartDTS", "initData", "fmp4", "traf", "tfdt", "result2", "tfhd", "baseTime", "scale", "startTime", "getDuration", "rawDuration", "videoDuration", "audioDuration", "trafs", "trackDefault", "tfhdFlags", "sampleDuration", "truns", "j", "computeRawDurationFromSamples", "sampleCount", "sidxMinStart", "sidxMaxEnd", "sidxDuration", "sidxs", "subSegmentDuration", "dur", "ref", "trun", "offsetStartDTS", "timeOffset", "baseMediaDecodeTime", "upper", "lower", "segmentValidRange", "segmentedRange", "moofs", "last", "appendUint8Array", "data1", "data2", "temp", "parseSamples", "seiSamples", "videoData", "isHEVCFlavor", "moof", "moofOffset", "baseDataOffsetPresent", "sampleDescriptionIndexPresent", "defaultSampleDurationPresent", "defaultSampleDuration", "defaultSampleSizePresent", "defaultSampleSize", "defaultSampleFlagsPresent", "tfhdOffset", "isHEVC", "dataOffsetPresent", "dataOffset", "firstSampleFlagsPresent", "sampleDurationPresent", "sampleSizePresent", "sampleSize", "sampleFlagsPresent", "sampleCompositionOffsetsPresent", "compositionOffset", "trunOffset", "sampleOffset", "ix", "naluTotalSize", "naluSize", "isSEIMessage", "parseSEIMessageFromNALu", "delimit", "baseCodec", "naluHeader", "naluType", "unescapedData", "headerSize", "pts", "samples", "discardEPB", "seiPtr", "payloadType", "payloadSize", "leftOver", "payPtr", "providerCode", "userStructure", "userDataType", "totalCCs", "enabled", "totalBytes", "byteArray", "uuidStrArray", "_b", "userDataBytes", "EPBPositions", "newLength", "newData", "sourceIndex", "parseEmsg", "schemeIdUri", "timeScale", "presentationTimeDelta", "presentationTime", "eventDuration", "leftPresentationTime", "rightPresentationTime", "payload", "mp4Box", "mp4pssh", "keyids", "kids", "k", "kidCount", "dataSize", "parsePssh", "view", "boxSize", "dataSizeOrKidCount", "keyUriToKeyIdMap", "LevelKey", "method", "formatversions", "iv", "sn", "createInitializationVector", "keyBytes", "PlayReadyKeySystemUUID", "keyBytesUtf16", "keyByteStr", "xmlKeyBytes", "keyData", "keyIdArray", "padded", "segmentNumber", "uint8View", "VARIABLE_REPLACEMENT_REGEX", "hasVariableReferences", "substituteVariablesInAttributes", "parsed", "attributeNames", "substituteVariables", "variableList", "variableReference", "variableName", "variableValue", "addVariableDefinition", "parentUrl", "NAME", "VALUE", "searchParams", "error", "importVariableDefinition", "sourceVariableList", "IMPORT", "getMediaSource", "preferManagedMediaSource", "sampleEntryCodesISO", "isCodecType", "typeCodes", "areCodecsMediaSourceSupported", "codecs", "isCodecMediaSourceSupported", "_MediaSource$isTypeSu", "MediaSource", "mimeTypeForCodec", "videoCodecPreferenceValue", "videoCodec", "codecsSetSelectionPreferenceValue", "codecSet", "preferenceValue", "CODEC_COMPATIBLE_NAMES", "getCodecCompatibleNameLower", "lowerCaseCodec", "codecsToCheck", "AUDIO_CODEC_REGEXP", "getCodecCompatibleName", "m", "pickMostCompleteCodecName", "parsedCodec", "levelCodec", "convertAVC1ToAVCOTI", "avcdata", "MASTER_PLAYLIST_REGEX", "MASTER_PLAYLIST_MEDIA_REGEX", "IS_MEDIA_PLAYLIST", "LEVEL_PLAYLIST_REGEX_FAST", "LEVEL_PLAYLIST_REGEX_SLOW", "M3U8Parser", "groups", "mediaGroupId", "group", "string", "hasVariableRefs", "levelsWithKnownCodecs", "_level$unknownCodecs", "resolution", "setCodecs", "tag", "attributes", "sessionAttrs", "dataId", "sessionKey", "parseKey", "variableAttributes", "contentSteeringAttributes", "parseStartTimeOffset", "stripUnknownCodecLevels", "levels", "groupsByType", "medias", "lang", "assocLang", "channels", "characteristics", "instreamId", "media", "groupCodec", "assignCodec", "levelUrlId", "multivariantVariableList", "fragments", "currentInitSegment", "currentSN", "currentPart", "totalduration", "discontinuityCounter", "prevFrag", "firstPdtIndex", "createNextFrag", "nextByteRange", "title", "setFragLevelKeys", "assignProgramDateTime", "value1", "value2", "skipAttrs", "skippedSegments", "_i", "recentlyRemovedDateranges", "dateRange", "levelKey", "mapAttrs", "init", "setInitSegment", "serverControlAttrs", "partInfAttrs", "partList", "previousFragmentPart", "part", "preloadHintAttrs", "renditionReportAttrs", "fragmentLength", "firstFragment", "lastFragment", "lastSn", "backfillProgramDateTimes", "keyTagAttributes", "_keyAttrs$METHOD", "_keyAttrs$KEYFORMAT", "keyAttrs", "decryptmethod", "decrypturi", "decryptiv", "decryptkeyformatversions", "decryptkeyformat", "resolvedUri", "keyFormatVersions", "startAttributes", "startTimeOffset", "codecsAttributeValue", "filtered", "groupItem", "codecProperty", "codecValue", "fragPrev", "encryptedFragments", "PlaylistContextType", "PlaylistLevelType", "mapContextToLevelType", "context", "getResponseUrl", "response", "PlaylistLoader", "hls", "startPosition", "PLoader", "Loader", "InternalLoader", "loader", "contextType", "event", "pathwayId", "deliveryDirectives", "groupId", "_context$deliveryDire", "loaderContext", "loadPolicy", "levelDetails", "partTarget", "targetDuration", "maxLowLatencyPlaylistRefresh", "legacyRetryCompatibility", "loaderConfig", "loaderCallbacks", "stats", "context2", "networkDetails", "loader2", "parsedResult", "contentSteering", "sessionData", "sessionKeys", "audioTracks", "subtitles", "captions", "audioTrack", "levelId", "levelType", "singleLevel", "timeout", "message", "details", "fatal", "errorData", "parent", "levelIndex", "_error", "sendAddTrackEvent", "videoEl", "addCueToTrack", "cue", "mode", "err", "textTrackCue", "err2", "clearCurrentCues", "removeCuesInRange", "predicate", "cues", "getCuesInRange", "getFirstCueIndexAfterTime", "time", "left", "right", "mid", "cuesFound", "firstCueInRange", "filterSubtitleTracks", "textTrackList", "tracks", "MetadataSchema", "MIN_CUE_DURATION", "getCueClass", "createCueWithDataFields", "Cue", "endTime", "MAX_CUE_ENDTIME", "dateRangeDateToTimelineSeconds", "date", "hexToArrayBuffer", "ID3TrackController", "textTracks", "textTrack", "enableEmsgMetadataCues", "enableID3MetadataCues", "_this$id3Track", "startOffset", "endOffset", "id3Track", "dateRangeCuesAppended", "dateRanges", "ids", "idsToRemove", "dateTimeOffset", "appendedDateRangeCues", "durationKnown", "nextDateRangeWithSameClass", "candidateDateRange", "id2", "otherDateRange", "_cue", "LatencyController", "holdBack", "partHoldBack", "targetduration", "liveSyncDuration", "liveSyncDurationCount", "lowLatencyMode", "userConfig", "targetLatency", "maxLiveSyncOnStallIncrease", "liveSyncOnStallIncrease", "liveEdge", "edge", "syncPosition", "min", "max", "maxLevelUpdateAge", "bufferedRanges", "_this$levelDetails", "latency", "maxLiveSyncPlaybackRate", "distanceFromTarget", "liveMinLatencyDuration", "rate", "HdcpLevels", "isHdcpLevel", "VideoRangeValues", "isVideoRange", "HlsSkip", "getSkipValue", "msn", "canSkipUntil", "canSkipDateRanges", "endSN", "snChangeGoal", "HlsUrlParameters", "skip", "Level", "s", "hasGroup", "audioGroups", "subtitleGroups", "_this$audioGroups", "_this$subtitleGroups", "updateFromToPTS", "fragFrom", "fragTo", "fragToPTS", "updateFragPTSDTS", "maxStartPTS", "minEndPTS", "fragStartPts", "fragEndPts", "deltaPTS", "drift", "fragIdx", "mergeDetails", "oldDetails", "newDetails", "oldFragments", "oldInit", "ccOffset", "PTSFrag", "mapFragmentIntersection", "oldFrag", "newFrag", "_currentInitSegment", "mergeDateRanges", "newFragments", "mapPartIntersection", "oldPart", "newPart", "adjustSliding", "advancedDateTime", "oldDateRanges", "deltaDateRanges", "oldParts", "newParts", "intersectionFn", "delta", "newFrags", "oldFrags", "addSliding", "computeReloadInterval", "distanceToLiveEdgeMs", "reloadInterval", "liveEdgeMaxTargetDurations", "lastSegmentDuration", "getFragmentWithSN", "fragCurrent", "fragment", "getPartWith", "partIndex", "_level$details", "findPart", "reassignFragmentLevelIndexes", "isTimeoutError", "getRetryConfig", "isTimeout", "getRetryDelay", "retryConfig", "retryCount", "backoffFactor", "getLoaderConfigWithoutReties", "loderConfig", "shouldRetry", "loaderResponse", "httpStatus", "retry", "retryForHttpStatus", "BinarySearch", "list", "comparisonFn", "minIndex", "maxIndex", "currentIndex", "currentElement", "comparisonResult", "findFragmentByPDT", "PDTValue", "maxFragLookUpTolerance", "startPDT", "endPDT", "seg", "pdtWithinToleranceTest", "findFragmentByPTS", "fragPrevious", "bufferEnd", "fragNext", "bufferEdgeError", "fragmentWithinToleranceTest", "foundFragment", "candidate", "candidateLookupTolerance", "pdtBufferEnd", "findFragWithCC", "cc", "NetworkErrorAction", "ErrorActionFlags", "ErrorController", "_data$frag", "_data$level", "_data$context", "_data$context$levelDe", "restrictedHdcpLevel", "errorAction", "variantLevelIndex", "fragLoadPolicy", "keyLoadPolicy", "fragmentErrors", "acc", "level2", "_data$frag2", "_data$context2", "errorDetails", "nextLevel", "loadLevel", "minAutoLevel", "maxAutoLevel", "fragErrorType", "findAudioCodecAlternate", "audioCodec", "findVideoCodecAlternate", "playlistErrorType", "playlistErrorGroupId", "_level$audioGroups", "_level$subtitleGroups", "levelCandidate", "fragCandidate", "_data$errorAction", "hdcpLevel", "nextAutoLevel", "BasePlaylistController", "logPrefix", "playlistUri", "renditionReports", "foundIndex", "currentGoal", "hlsUrlParameters", "playlist", "previousDetails", "now2", "elapsed", "lastPartSn", "endSn", "lastPartIndex", "hasParts", "lastPart", "nextSnStartIndex", "lastAdvanced", "cdnAge", "segments", "bufferInfo", "position", "estimatedTimeUntilUpdate", "previousDeliveryDirectives", "errorEvent", "action", "_errorEvent$context", "delay", "EWMA", "halfLife", "estimate", "weight", "adjAlpha", "zeroFactor", "EwmaBandWidthEstimator", "slow", "fast", "defaultEstimate", "defaultTTFB", "slow_", "fast_", "ttfb_", "durationMs", "numBytes", "numBits", "durationS", "bandwidthInBps", "ttfb", "seconds", "SUPPORTED_INFO_DEFAULT", "SUPPORTED_INFO_CACHE", "requiresMediaCapabilitiesDecodingInfo", "audioTracksByGroup", "currentVideoRange", "currentFrameRate", "currentBw", "audioPreference", "audioCodecPreference", "channelsPreference", "maxChannels", "audioChannels", "audioTrackGroup", "getMediaDecodingInfoPromise", "mediaCapabilities", "baseVideoConfiguration", "videoRange", "configurations", "audioGroupId", "_audioTracksByGroup$g", "channelsNumber", "configuration", "decodingInfoKey", "getMediaDecodingInfoKey", "decodingInfoResults", "audio", "video", "mediaConfig", "isHdrSupported", "mediaQueryList", "badQuery", "getVideoSelectionOptions", "videoPreference", "preferHDR", "allowedVideoRanges", "range", "getStartCodecTier", "codecTiers", "codecSets", "preferStereo", "hasStereo", "hasCurrentVideoRange", "minHeight", "minFramerate", "minBitrate", "selectedScore", "videoRanges", "tier", "matchingVideoRanges", "maxHeight", "maxFramerate", "selected", "candidateTier", "logStartCodecCandidateIgnored", "codeSet", "reason", "getAudioTracksByGroup", "allAudioTracks", "trackGroup", "channelsKey", "getCodecTiers", "tiers", "lesserWidthOrHeight", "audioGroup", "findMatchingOption", "option", "matchPredicate", "matchesOption", "isDefault", "forced", "characteristicsMatch", "characteristicsA", "characteristicsB", "arrA", "arrB", "el", "audioMatchPredicate", "findClosestLevelWithAudioGroup", "searchIndex", "currentLevel", "renditions", "variantMap", "currentVideoCodec", "matchingVideo", "searchDownAndUpList", "arr", "AbrController", "_hls", "autoLevelEnabled", "timeLoading", "ttfbEstimate", "playbackRate", "bufferStarvationDelay", "loadedFirstByte", "bwEstimate", "expectedLen", "timeStreaming", "loadRate", "fragLoadedDelay", "bwe", "fragLevelNextLoadedDelay", "nextLoadLevel", "levelNextBitrate", "nextLoadLevelBitrate", "abrEwmaDefaultEstimate", "_data$part", "timeToFirstByteSec", "bandwidth", "fragSizeBits", "isSwitch", "fragLoadSec", "playlistLoadSec", "loading", "timeLoadingMs", "loadedBytes", "loadedDuration", "fragBufferedData", "processingMs", "maxStartDelay", "abrAutoLevel", "firstLevel", "clamped", "forcedAutoLevel", "useEstimate", "loadedFirstFrag", "nextABRAutoLevel", "partCurrent", "currentFragDuration", "avgbw", "bwFactor", "bwUpFactor", "_bestLevel", "maxStarvationDelay", "bitrateTestDelay", "bestLevel", "minLevel", "autoLevel", "maxFetchDuration", "lastLoadedFragLevel", "selectionBaseLevel", "live", "firstSelection", "currentCodecSet", "startTier", "ttfbEstimateSec", "levelsSkipped", "_levelInfo$supportedR", "levelInfo", "upSwitch", "decodingInfo", "levels2", "avgDuration", "adjustedbw", "bitrate", "fetchDuration", "TaskLoop", "millis", "FragmentState", "FragmentTracker", "activeParts", "activePart", "appendedPTS", "keys", "fragmentEntity", "elementaryStream", "timeRange", "playlistType", "appendedPart", "appendedPartSn", "esData", "isNotBuffered", "timeRanges", "fragKey", "getFragmentKey", "isFragHint", "streamInfo", "isPartial", "snToKeep", "force", "buffered", "bestFragment", "timePadding", "bestOverlap", "bufferPadding", "lastFragmentEntity", "loaded", "_this$activePartLists", "withGapOnly", "unbufferedOnly", "snToRemove", "_fragmentEntity$range", "_fragmentEntity$range2", "_fragmentEntity$range3", "noopBuffered", "BufferHelper", "pos", "maxHoleDuration", "vbuffered", "a", "diff", "buffered2", "buf2len", "buf2end", "bufferLen", "bufferStartNext", "bufferStart", "ChunkMetadata", "getNewPerformanceTiming", "findFirstFragWithCC", "_fragments$i", "shouldAlignOnDiscontinuities", "lastFrag", "switchDetails", "findDiscontinuousReferenceFrag", "prevDetails", "curDetails", "prevFrags", "curFrags", "prevStartFrag", "adjustFragmentStart", "sliding", "adjustSlidingStart", "alignStream", "alignDiscontinuities", "alignMediaPlaylistByPDT", "referenceFrag", "refDetails", "refFragments", "refFrag", "targetCC", "refPDT", "targetPDT", "MIN_CHUNK_SIZE", "FragmentLoader", "onProgress", "LoadError", "FragmentILoader", "DefaultILoader", "resolve", "reject", "tags", "createGapLoadError", "createLoaderContext", "partLoadedData", "fragStats", "partStats", "partTotal", "estTotalParts", "estLoadedParts", "estRemainingBytes", "fragLoading", "partLoading", "segment", "_frag$decryptdata", "byteRangeStart", "byteRangeEnd", "fragmentLen", "AESCrypto", "subtle", "FastAESKey", "removePadding", "outputBytes", "paddingBytes", "AESDecryptor", "arrayBuffer", "newArray", "sBox", "invSBox", "subMix", "subMix0", "subMix1", "subMix2", "subMix3", "invSubMix", "invSubMix0", "invSubMix1", "invSubMix2", "invSubMix3", "d", "xi", "sx", "x2", "x4", "x8", "keyBuffer", "sameKey", "keySize", "ksRows", "ksRow", "invKsRow", "keySchedule", "invKeySchedule", "sbox", "rcon", "prev", "word", "inputArrayBuffer", "aesIV", "nRounds", "invSBOX", "initVector", "initVector0", "initVector1", "initVector2", "initVector3", "inputInt32", "outputInt32", "t0", "t1", "t2", "t3", "s0", "s1", "s2", "s3", "inputWords0", "inputWords1", "inputWords2", "inputWords3", "swapWord", "CHUNK_SIZE", "Decrypter", "removePKCS7Padding", "browserCrypto", "currentResult", "remainderData", "decryptResult", "currentIV", "currentChunk", "softwareDecrypter", "aesKey", "splitPoint", "msg", "TimeRanges", "log", "State", "BaseStreamController", "fragmentTracker", "keyLoader", "_this$levelLastLoaded", "mediaBuffer", "state", "currentTime", "tolerance", "fragStartOffset", "fragEndOffset", "pastFragment", "targetBufferTime", "progressCallback", "_this$mediaBuffer", "bufferedInfo", "minForwardBufferLength", "flushScope", "decryptData", "decryptedData", "_frag$startPTS", "_frag$endPTS", "_this$fragCurrent", "_this$fragPrevious", "_this$levels", "fragLoadedEndData", "transmuxer", "partsLoaded", "complete", "fragLoaded", "chunkMeta", "keyLoadingPromise", "keyLoadedData", "_result", "dataOnProgress", "fragLoadedData", "fromPart", "initialPartList", "loadPart", "loadedPart", "nextPart", "noBacktracking", "_buffer", "fragDuration", "segmentFraction", "bufferable", "maxBufferHole", "bufferedFragAtPos", "levelBitrate", "maxBufLen", "threshold", "minLength", "fragOrPart", "fragLen", "initialLiveManifestSize", "trackerState", "gapStart", "nextFragment", "nextbufferInfo", "contiguous", "independentAttrOmitted", "targetSN", "liveStart", "fragmentHint", "loadingParts", "lookupTolerance", "curSNIdx", "fragState", "nextFrag", "liveSyncPosition", "withinSlidingWindow", "maxLatency", "slidingStart", "firstLevelLoad", "aligned", "alignedSlidingStart", "offsetInMultivariantPlaylist", "filterType", "_this$fragCurrent2", "gapTagEncountered", "flushBuffer", "bufferType", "bufferedTimeRanges", "_this$transmuxer", "parsedDuration", "nextState", "previousState", "ChunkCache", "chunk", "chunks", "dataLength", "concatUint8Arrays", "hasUMDWorker", "injectWorker", "blob", "objectURL", "loadWorker", "scriptURL", "dummyTrack", "inputTimeScale", "BaseAudioDemuxer", "trackDuration", "deaultTimestamp", "lastDataIndex", "initPTSFn", "partialData", "cachedData", "initPTS", "init90kHz", "getAudioConfig", "observer", "adtsObjectType", "adtsExtensionSamplingIndex", "adtsChannelConfig", "userAgent", "manifestCodec", "adtsSamplingRates", "adtsSamplingIndex", "isHeaderPattern$1", "getHeaderLength", "getFullFrameLength", "canGetFrameLength", "isHeader$1", "canParse$1", "probe$1", "headerLength", "frameLength", "newOffset", "initTrackConfig", "getFrameDuration", "samplerate", "parseFrameHeader", "appendFrame$2", "frameIndex", "frameDuration", "stamp", "header", "unit", "_length", "missing", "_sample", "chromeVersion$1", "BitratesMap", "SamplingRateMap", "SamplesCoefficients", "BytesInSlot", "appendFrame$1", "parseHeader", "sample", "mpegVersion", "mpegLayer", "bitRateIndex", "sampleRateIndex", "paddingBit", "channelMode", "columnInBitrates", "bitRate", "sampleRate", "channelCount", "sampleCoefficient", "bytesInSlot", "samplesPerFrame", "isHeaderPattern", "isHeader", "canParse", "probe", "AACDemuxer", "emsgSchemePattern", "MP4Demuxer", "videoTrack", "captionTrack", "videoSamples", "segmentedData", "emsgs", "emsgInfo", "getAudioBSID", "bsid", "mask", "bits", "shift", "AC3Demuxer", "appendFrame", "samplingRateCode", "frameSizeCode", "skipCount", "lfeon", "bsmod", "BaseVideoParser", "dts", "debug", "_VideoSample", "VideoSample", "lastUnit", "units", "nbSamples", "lastSample", "ExpGolomb", "bytesAvailable", "workingBytes", "availableBytes", "count", "skipBytes", "valu", "leadingZeroCount", "clz", "lastScale", "nextScale", "deltaScale", "frameCropLeftOffset", "frameCropRightOffset", "frameCropTopOffset", "frameCropBottomOffset", "numRefFramesInPicOrderCntCycle", "scalingListCount", "readUByte", "readBits", "readUEG", "readBoolean", "skipBits", "skipEG", "skipUEG", "skipScalingList", "profileIdc", "chromaFormatIdc", "picOrderCntType", "picWidthInMbsMinus1", "picHeightInMapUnitsMinus1", "frameMbsOnlyFlag", "pixelRatio", "AvcVideoParser", "pes", "push2", "spsfound", "_VideoSample2", "iskey", "sliceType", "_track$pixelRatio", "_track$pixelRatio2", "sps", "codecarray", "codecstring", "lastState", "overflow", "unitType", "lastUnitStart", "lastUnitType", "SampleAesDecrypter", "encryptedData", "sampleIndex", "callback", "curUnit", "encryptedBuffer", "decryptedBuffer", "decodedData", "encryptedDataLen", "outputPos", "inputPos", "uint8DecryptedData", "unitIndex", "curUnits", "PACKET_LENGTH", "TSDemuxer", "typeSupported", "syncOffset", "scanwindow", "foundPat", "packetStart", "tsPackets", "parsePID", "_audioTrack", "_videoTrack", "_id3Track", "isSampleAes", "flush", "videoPid", "audioPid", "id3Pid", "audioData", "unknownPID", "pmtParsed", "pmtId", "tsPacketErrors", "stt", "pid", "atf", "parsePES", "parsePAT", "parsedPIDs", "parsePMT", "demuxResult", "sampleAes", "aacOverFlow", "frameMissingBytes", "sampleLength", "frameOverflowBytes", "recoverable", "id3Sample", "sectionLength", "tableEnd", "programInfoLength", "esInfoLength", "logEncryptedSamplesFoundInUnencryptedStream", "parsePos", "remaining", "descriptorLen", "stream", "pesLen", "pesHdrLen", "pesPts", "pesDts", "pesFlags", "payloadStartOffset", "pesData", "dataLen", "MP3Demuxer", "AAC", "UINT32_MAX", "MP4", "videoHdlr", "audioHdlr", "dref", "stco", "majorBrand", "avc1Brand", "minorVersion", "upperWordDuration", "lowerWordDuration", "sequenceNumber", "boxes", "pps", "avcc", "width", "height", "hSpacing", "vSpacing", "configlen", "sampleDependencyTable", "upperWordBaseMediaDecodeTime", "lowerWordBaseMediaDecodeTime", "arraylen", "cts", "movie", "MPEG_TS_CLOCK_FREQ_HZ", "toTimescaleFromBase", "destScale", "srcBase", "round", "toTimescaleFromScale", "srcScale", "toMsFromMpegTsClock", "toMpegTsClockFromTimescale", "MAX_SILENT_FRAME_DURATION", "AAC_SAMPLES_PER_FRAME", "MPEG_AUDIO_SAMPLE_PER_FRAME", "AC3_SAMPLES_PER_FRAME", "chromeVersion", "safariWebkitVersion", "MP4Remuxer", "vendor", "defaultTimeStamp", "rolloverDetected", "minPTS", "normalizePts", "accurateTimeOffset", "id3", "independent", "audioTimeOffset", "videoTimeOffset", "hasAudio", "hasVideo", "enoughAudioSamples", "enoughVideoSamples", "_videoTrack$pixelRati", "_config$pixelRatio", "_videoTrack$pixelRati2", "_config$pixelRatio2", "isVideoContiguous", "firstKeyFrameIndex", "firstKeyFramePTS", "findKeyframeIndex", "audiovideoTimestampDelta", "audioTrackLength", "flushTextTrackMetadataCueSamples", "flushTextTrackUserdataCueSamples", "audioSamples", "_initPTS", "computePTSDTS", "container", "initDTS", "inputSamples", "outputSamples", "nextAvcDts", "mp4SampleDuration", "firstDTS", "lastDTS", "maxPTS", "sortSamples", "initTime", "deltadts", "deltapts", "inputDuration", "averageSampleDuration", "foundHole", "foundOverlap", "firstPTS", "nbNalu", "naluLen", "dtsStep", "nbUnits", "sampleLen", "mdatSize", "mdat", "stretchedLastFrame", "minDtsDelta", "minPtsDelta", "maxDtsDelta", "maxPtsDelta", "VideoSampleUnits", "mp4SampleLength", "unitData", "unitDataLen", "ptsDelta", "lastFrameDuration", "gapTolerance", "deltaToFrameEnd", "compositionTimeOffset", "Mp4Sample", "nextDts", "nextPts", "mp4timeScale", "scaleFactor", "inputSampleDuration", "rawMPEG", "alignedWithVideo", "nextAudioPts", "timeOffsetMpegTS", "maxAudioFramesDrift", "newStamp", "fillFrame", "lastPTS", "_nbSamples", "audioSample", "prevSample", "unitLen", "silentFrame", "reference", "isKeyframe", "PassThroughRemuxer", "defaultInitPTS", "getParsedTrackCodec", "_initData", "_initData2", "lastEndTime", "decodeTime", "isInvalidInitPts", "minDuration", "now", "muxConfig", "Transmuxer", "transmuxConfig", "uintData", "currentTransmuxState", "discontinuity", "trackSwitch", "initSegmentChange", "defaultInitPts", "initSegmentData", "getEncryptionType", "decrypter", "emptyResult", "resetMuxers", "currentState", "decryptionPromise", "transmuxResults", "demuxer", "remuxer", "demuxResultOrPromise", "isPromise", "remuxResult", "mux", "_muxConfig$i$demux", "Remuxer", "Demuxer", "encryptionType", "p", "TransmuxConfig", "TransmuxState", "eventemitter3", "has", "prefix", "EE", "fn", "once", "addListener", "emitter", "listener", "evt", "clearEvent", "EventEmitter2", "names", "events", "handlers", "l", "ee", "listeners", "a1", "a2", "a3", "a4", "a5", "args", "eventemitter3Exports", "EventEmitter", "TransmuxerInterface", "onTransmuxComplete", "onFlush", "forwardMessage", "ev", "m2tsTypeSupported", "worker", "_frag$initSegment", "_lastFrag$initSegment", "snDiff", "partDiff", "progressive", "transmuxResult", "_this$workerContext", "subtitleOptionsIdentical", "trackList1", "trackList2", "mediaAttributesIdentical", "attrs1", "attrs2", "customAttributes", "stableRenditionId", "subtitleAttribute", "subtitleTrackMatchesTextTrack", "subtitleTrack", "TICK_INTERVAL$2", "AudioStreamController", "lastCurrentTime", "_levels$trackId", "_this$media", "retryDate", "waitingData", "cache", "trackDetails", "bufferedTrack", "switchingTrack", "mainBufferInfo", "atGap", "atBufferSyncLimit", "mainFrag", "mainBufferLength", "maxConfigBuffer", "mediaPlaylist", "altAudio", "_track$details", "mainDetails", "_id3$samples", "mapFragment", "emittedID3", "emittedText", "variantAudioCodecs", "_track$details2", "bufferedAttributes", "switchAttributes", "AudioTrackController", "trackInActiveGroup", "currentGroups", "currentTrack", "groupIndex", "allIndex", "audioTracksUpdated", "selectedTrackId", "_this$groupIds", "newId", "audioOption", "switchIndex", "withoutCodecAndChannelsMatch", "lastTrack", "trackLoaded", "TICK_INTERVAL$1", "SubtitleStreamController", "success", "fragStart", "fragEnd", "endOffsetSubtitles", "subtitleTracks", "currentTrackId", "mainSlidingStartFragment", "foundFrag", "BufferableInstance", "timeranges", "getRange", "SubtitleTrackController", "subtitlePreference", "subtitleTracksUpdated", "selectDefault", "subtitleOption", "allSubtitleTracks", "nextTrack", "BufferOperationQueue", "sourceBufferReference", "operation", "pending", "queue", "execute", "promise", "sb", "VIDEO_CODEC_PROFILE_REPLACE", "BufferController", "mediaSource", "mediaSrc", "_objectUrl", "codecEvents", "_ms$constructor", "ms", "objectUrl", "MMS", "removeSourceChildren", "addSource", "_this$mediaSource", "sourceBufferCount", "trackNames", "trackName", "_trackCodec", "metadata", "currentCodecFull", "currentCodec", "trackCodec", "nextCodec", "mimeType", "bufferCodecEventsExpected", "operationQueue", "eventData", "chunkStats", "bufferAppendingStart", "fragBuffering", "partBuffering", "checkTimestampOffset", "sourceBuffer", "type2", "event2", "appendErrorCount", "flushOperation", "buffersAppendedTo", "onUnblocked", "backBufferLength", "maxBackBufferLength", "targetBackBufferPosition", "frontBufferLength", "maxFrontBufferLength", "targetFrontBufferPosition", "numBufferedRanges", "levelDuration", "mediaDuration", "msDuration", "pendingTracks", "pendingTracksCount", "buffers", "sbName", "removedRanges", "_this$mediaSource2", "_this$mediaSource3", "removeStart", "removeEnd", "blockingOperations", "node", "sourceChildren", "specialCea608CharsCodes", "getCharForByte", "charCode", "NR_ROWS", "NR_COLS", "rowsLowCh1", "rowsHighCh1", "rowsLowCh2", "rowsHighCh2", "backgroundColors", "CaptionsLogger", "severity", "numArrayToHexArray", "numArray", "hexArray", "PenState", "styles", "attribs", "style", "other", "newPenState", "StyledUnicodeChar", "uchar", "newChar", "Row", "logger2", "empty", "absPos", "relPos", "newPos", "char", "startPos", "chars", "CaptionScreen", "equal", "pacData", "newRow", "topRowIndex", "lastOutputScreen", "prevLineTime", "row", "indent", "prevPos", "bkgData", "nrRows", "topRow", "asOneRow", "displayText", "rowNr", "rowText", "Cea608Channel", "channelNumber", "outputFilter", "newHandler", "newMode", "screen", "tmp", "nrCols", "secondByte", "colorIndex", "colors", "dispatch", "Cea608Parser", "field", "out1", "out2", "createCmdHistory", "channel", "byteList", "cmdFound", "charsFound", "currChNr", "cmdHistory", "cond1", "cond2", "hasCmdRepeated", "setLastCmd", "chNr", "case1", "case2", "pacIndex", "channelNr", "charCodes", "charCode1", "oneCode", "hexCodes", "OutputFilter", "timelineController", "VTTCue", "AllowedDirections", "AllowedAlignments", "isAllowedValue", "allowed", "lcValue", "findDirectionSetting", "findAlignSetting", "extend", "rest", "cobj", "VTTCue2", "baseObj", "_id", "_pauseOnExit", "_startTime", "_endTime", "_text", "_region", "_vertical", "_snapToLines", "_line", "_lineAlign", "_position", "_positionAlign", "_size", "_align", "setting", "StringDecoder", "options", "parseTimeStamp", "computeSeconds", "m2", "f", "Settings", "v", "dflt", "defaultKey", "n", "percent", "parseOptions", "keyValueDelim", "groupDelim", "kv", "defaults", "center", "parseCue", "regionList", "oInput", "consumeTimeStamp", "ts", "consumeCueSettings", "input2", "cue2", "settings", "vals", "line", "skipWhitespace", "fixLineBreaks", "VTTParser", "_this", "collectNextLine", "parseHeader2", "alreadyCollectedLine", "hasSubstring", "LINEBREAKS", "startsWith", "inputString", "searchString", "cueString2millis", "timeString", "secs", "mins", "hours", "hash", "_hash", "generateCueId", "calculateOffset", "vttCCs", "currCC", "prevCC", "_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", "rateInfo", "trim", "styleElements", "collectionToDictionary", "getElementCollection", "regionElements", "cueElements", "cueElement", "cueText", "getTextContent", "parseTtmlTime", "timestampParsingError", "region", "getTtmlStyles", "textAlign", "lineAlign", "fromElement", "parentName", "childName", "elementsWithId", "dict", "element", "_node$childNodes", "ttsNs", "regionStyle", "styleAttributes", "regionStyleName", "getAttributeNS", "ns", "timeAttributeValue", "parseHoursMinutesSecondsFrames", "parseTimeUnits", "TimelineController", "newVTTCCs", "channel1", "channel2", "channel3", "channel4", "cueRanges", "merged", "cueRange", "overlap", "intersection", "unparsedVttFrags", "frag2", "label", "language", "canReuseVttTextTrack", "captionsProperties", "captionsTracks", "languageCode", "existingTrack", "trackProperties", "kind", "hasIMSC1", "inUseTracks", "inUseTrack", "textTrackKind", "captionsOrSubtitlesFromCharacteristics", "unusedTextTracks", "tracksList", "captionsTrack", "instreamIdMatch", "cea608Parser1", "cea608Parser2", "lastCc", "_data$part$index", "decrypted", "trackPlaylistMedia", "maxAvCC", "payloadWebVTT", "missingInitPTS", "fragLevel", "ccBytes", "ccdatas", "actualCCBytes", "tmpByte", "ccbyte1", "ccbyte2", "ccType", "manifestTrack", "x1", "y1", "y2", "CapLevelController", "streamController", "maxLevel", "capLevelIndex", "validLevels", "boundsRect", "clientRect", "restrictedLevel", "atGreatestBandwidth", "curLevel", "maxLevelIndex", "squareSize", "FPSController", "decodedFrames", "droppedFrames", "currentPeriod", "currentDropped", "currentDecoded", "droppedFPS", "videoPlaybackQuality", "LOGGER_PREFIX", "EMEController", "keySystemConfiguration", "uniqueCodec", "attempt", "keySystems", "mediaKeys", "EMEKeyError", "supportedConfigurations", "requestMediaKeySystemAccessFunc", "errMessage", "mediaKeySystemConfigs", "keySystemAccessPromises", "keySystemAccess", "_keySystemAccessPromises", "mediaKeySystemAccess", "certificateRequest", "certificate", "mediaKeysSession", "mediaKeySessionContext", "keySessionContext", "_mediaKeySessionConte", "keySession", "keySystemsInConfig", "keySystemFormat", "keyDetails", "keySessionContextPromise", "initDataType", "keySystemDomain", "json", "psshInfo", "keyIdHex", "keyIdToKeySessionPromise", "mediaKeySessions", "keyContext", "oldKeyIdHex", "_keySystemToKeySystem", "setMediaKeysPromise", "_this$config$drmSyste", "_this$config$drmSyste2", "generateRequestFilter", "mappedInitData", "_this$hls", "licenseStatus", "onmessage", "messageType", "onkeystatuseschange", "keyStatus", "keyUsablePromise", "_context$mediaKeysSes", "status2", "certLoader", "contex", "cert", "keyMessage", "xhr", "licenseChallenge", "xmlString", "keyMessageXml", "headers", "_header$querySelector", "_header$querySelector2", "challengeElement", "challengeText", "keysListItem", "licenseXhrSetup", "licenseXhrSetupResult", "licenseResponseCallback", "maxNumRetry", "attemptsLeft", "xhr2", "licenseChallenge2", "mediaKeysList", "keySessionCount", "formats", "licenseXhr", "CmObjectType", "CmObjectType2", "CmStreamingFormat", "CmStreamingFormat2", "CmcdHeaderField", "CmcdHeaderField2", "CmcdHeaderMap", "SfItem", "SfToken", "DICT", "format", "throwError", "src", "cause", "BARE_ITEM", "BOOLEAN", "BYTES", "DECIMAL", "INTEGER", "isInvalidInt", "STRING_REGEX", "TOKEN", "KEY", "serializeError", "serializeBoolean", "base64encode", "binary", "serializeByteSequence", "serializeInteger", "serializeDate", "roundToEven", "precision", "decimalShift", "flooredValue", "serializeDecimal", "roundedValue", "STRING", "serializeString", "symbolToStr", "symbol", "serializeToken", "token", "serializeBareItem", "serializeKey", "serializeParams", "serializeItem", "serializeInnerList", "serializeDict", "entries", "optionalWhiteSpace", "item", "output", "encodeSfDict", "isTokenField", "isValid", "urlToRelativePath", "base", "toPath", "fromPath", "uuid", "uuid2", "dt", "toRounded", "toUrlSafe", "toHundred", "CmcdFormatters", "processCmcd", "formatters", "filter", "formatter", "encodeCmcd", "cmcd", "toCmcdHeaders", "headerMap", "shards", "entry", "_headerMap$find", "_acc$field", "entry2", "appendCmcdHeaders", "CMCD_PARAM", "toCmcdQuery", "REGEX", "appendCmcdQuery", "query", "separator", "CMCDController", "ot", "_data$tracks$audio", "_data$tracks$video", "isVideo", "includeKeys", "pLoader", "apply", "Ctor", "callbacks", "fLoader", "PATHWAY_PENALTY_DURATION_MS", "ContentSteeringController", "ttl", "levelToRemove", "pathwayPriority", "errorPathway", "pathways", "pathwayLevels", "penalizedPathways", "selectedIndex", "selectedLevel", "levelAfterChange", "defaultPathway", "pathwayClones", "audioGroupCloneMap", "subtitleGroupCloneMap", "pathwayClone", "cloneId", "baseId", "uriReplacement", "clonedVariants", "baseLevel", "clonedAudioGroupId", "clonedSubtitleGroupId", "performUriReplacement", "clonedLevel", "cloneRenditionGroups", "throughput", "steeringData", "reloadUri", "loadedSteeringData", "retryAfter", "ttlMs", "groupCloneMap", "clonedTracks", "clonedTrack", "stableId", "perOptionKey", "host", "perOptionUris", "perVariantUri", "AGE_HEADER_LINE_REGEX", "XhrLoader", "_this$callbacks", "xhrSetup", "maxTimeToFirstByteMs", "maxLoadTimeMs", "readyState", "useResponse", "_this$config", "_this$context", "ageHeader", "fetchSupported", "BYTERANGE", "FetchLoader", "getRequest", "initParams", "getRequestParameters", "isArrayBuffer", "LENGTH", "first", "statusText", "FetchError", "getContentLength", "responseData", "total", "code", "highWaterMark", "chunkCache", "reader", "pump", "signal", "getByteRangeLength", "byteRangeHeader", "contentRange", "byteRangeLength", "contentLength", "WHITESPACE_CHAR", "Cues", "captionScreen", "indenting", "_track$cues", "cueA", "cueB", "defaultLoadPolicy", "hlsDefaultConfig", "timelineConfig", "mergeConfig", "defaultConfig", "defaultsCopy", "deepCpy", "deprecatedSettingTypes", "deprecatedSettings", "policyName", "policyNotSet", "report", "deprecatedSetting", "enableStreamingMode", "currentLoader", "chromeOrFirefox", "LevelController", "contentSteeringController", "redundantSet", "generatePathwaySet", "resolutionFound", "videoCodecFound", "audioCodecFound", "levelParsed", "_audioCodec", "_videoCodec", "unknownCodecs", "CODECS", "FRAMERATE", "HDCP", "PATHWAY", "RESOLUTION", "VIDEO_RANGE", "pathwayCount", "filteredLevels", "assignTrackIdsByGroup", "unsortedLevels", "valueA", "valueB", "firstLevelInPlaylist", "_this$hls$userConfig", "firstLevelBitrate", "bandwidthEstimate", "startingBwEstimate", "audioOnly", "edata", "newLevel", "lastLevelIndex", "lastLevel", "lastPathwayId", "levelSwitchingData", "configStartLevel", "_data$deliveryDirecti2", "_data$deliveryDirecti", "currentLevelIndex", "_this$currentLevel", "autoLevelCapping", "maxHdcpLevel", "KeyLoader", "_loader$context", "keyInfo", "loadingFrag", "_keyInfo", "_keyInfo2", "_keyInfo$mediaKeySess", "keyInfo2", "getSourceBuffer", "isMSESupported", "isSupported", "codecsForVideoContainer", "codecForAudioContainer", "changeTypeSupported", "_sourceBuffer$prototy", "STALL_MINIMUM_DURATION_MS", "MAX_START_GAP_JUMP", "SKIP_BUFFER_HOLE_STEP_SECONDS", "SKIP_BUFFER_RANGE_START", "GapController", "activeFrag", "stalled", "seeking", "seeked", "beginSeek", "_stalledDuration", "nextStart", "hasEnoughBuffer", "noBufferGap", "startJump", "maxStartGapJump", "partialOrGap", "tnow", "stalledDuration", "bufferedWithHoles", "stalledDurationMs", "stallReported", "bufferStarved", "waiting", "gapLength", "startGap", "startFrag", "startProvisioned", "moreToLoad", "provisioned", "targetTime", "nudgeRetry", "TICK_INTERVAL", "StreamController", "startLevel", "levelLastLoaded", "lastDetails", "_this$backtrackFragme", "backtrackFrag", "fetchdelay", "fragPlayingCurrent", "nextLevelId", "fragLastKbps", "bufferedFrag", "nextBufferedFrag", "maxStart", "startPts", "aac", "heaac", "_curLevel$details", "newLevelId", "fromAltAudio", "videoBuffer", "mediaTrack", "alternate", "gapController", "isFirstFragment", "isFirstInDiscontinuity", "audiovideo", "ua", "fragPlaying", "fragCurrentLevel", "epocMs", "Hls", "ConfigAbrController", "ConfigBufferController", "ConfigCapLevelController", "ConfigErrorController", "ConfigFpsController", "errorController", "abrController", "bufferController", "capLevelController", "fpsController", "playListLoader", "id3TrackController", "ConfigContentSteeringController", "levelController", "networkControllers", "coreComponents", "AudioStreamControllerClass", "SubtitleStreamControllerClass", "onErrorOut", "ControllerClass", "components", "controllerInstance", "eventObject", "component", "loadedSource", "loadingSource", "controller", "shouldStartCapping", "newCapLevelToPlayerSize", "bwEstimator", "minAutoBitrate", "_this$audioTrackContr", "_this$subtitleTrackCo", "audioTrackController", "audioTrackId", "subtitleTrackController", "subtitleTrackId", "hlsCompatibilityHelper", "video", "Hls", "videoUrl", "hls", "catchHlsPlaybackError", "event", "video", "hlsCompatibilityHelper", "elementStyle", "wrapper", "video", "styles", "CONTENT_DOMAIN_HOSTNAME", "useCreateAppSchemeLink", "href", "options", "fullPath", "params", "getOnOffValue", "queryString", "value", "useCreateOneLink", "href", "webviewNavOptions", "createAppSchemeLink", "useCreateAppSchemeLink", "webLink", "appLink", "getMatches", "query", "window", "useMediaQuery", "initial", "matches", "setMatches", "ye", "handleChange", "ue", "matchMedia", "mobileMediaQuery", "useIsMobileDevice", "isMobileMediaQuery", "useMediaQuery", "isMobile", "getCleanUrl", "urlObj", "getCurrentHref", "removeQueryParams", "isServer", "__defProp", "__getOwnPropSymbols", "__hasOwnProp", "__propIsEnum", "__defNormalProp", "obj", "key", "value", "__spreadValues", "a", "b", "prop", "__objRest", "source", "exclude", "target", "qrcodegen", "qrcodegen2", "_QrCode", "version", "errorCorrectionLevel", "dataCodewords", "msk", "row", "i", "allCodewords", "minPenalty", "penalty", "assert", "text", "ecl", "segs", "data", "seg", "minVersion", "maxVersion", "mask", "boostEcl", "dataUsedBits", "dataCapacityBits2", "usedBits", "QrSegment", "newEcl", "bb", "appendBits", "dataCapacityBits", "padByte", "x", "y", "alignPatPos", "numAlign", "j", "rem", "bits", "getBit", "color", "dy", "dx", "dist", "xx", "yy", "isDark", "ver", "numBlocks", "blockEccLen", "rawCodewords", "numShortBlocks", "shortBlockLen", "blocks", "rsDiv", "k", "dat", "ecc", "result", "block", "right", "vert", "invert", "runColor", "runX", "runHistory", "runY", "dark", "sum", "total", "step", "pos", "degree", "root", "divisor", "_", "factor", "coef", "z", "n", "core", "currentRunColor", "currentRunLength", "QrCode", "val", "len", "cond", "_QrSegment", "mode", "numChars", "bitData", "digits", "temp", "assignVal", "ccbits", "str", "QrCode2", "_Ecc", "ordinal", "formatBits", "Ecc", "QrSegment2", "_Mode", "modeBits", "numBitsCharCount", "Mode", "qrcodegen_default", "ERROR_LEVEL_MAP", "DEFAULT_SIZE", "DEFAULT_LEVEL", "DEFAULT_BGCOLOR", "DEFAULT_FGCOLOR", "DEFAULT_INCLUDEMARGIN", "MARGIN_SIZE", "DEFAULT_IMG_SCALE", "generatePath", "modules", "margin", "ops", "start", "cell", "excavateModules", "excavation", "getImageSettings", "cells", "size", "includeMargin", "imageSettings", "numCells", "defaultSize", "scale", "w", "h", "floorX", "floorY", "ceilW", "ceilH", "QRCodeSVG", "props", "_a", "level", "bgColor", "fgColor", "otherProps", "calculatedImageSettings", "image", "e", "fgPath", "AppLinkDialog", "content", "oneLink", "displayDesktopQRCode", "useIsMobileDevice", "u", "text", "container", "p", "QRCodeSVG", "_JSXStyle", "DIALOG_ID", "useAppLinkDialog", "webviewNavOptions", "href", "displayDesktopQRCode", "content", "dialog", "useDialog", "isMobile", "useIsMobileDevice", "oneLink", "useCreateOneLink", "getCurrentHref", "redirectApp", "p", "AppLinkDialog", "LiveCampaignApiService", "campaignKey", "resolutionLevel", "params", "searchParams", "env", "res", "campaignKeys", "liveCampaignApi", "LIVE_CAMPAIGN_FETCHER_KEY", "useFetchLiveCampaign", "campaignKey", "enabled", "isLoading", "rest", "useSWR", "liveCampaignApi", "diffFromNowInMilliseconds", "date", "differenceInMilliseconds", "createKRTimeZoneDate", "MS_IN_SECOND", "MS_IN_MINUTE", "getCurrentCampaignStatus", "remaining", "duration", "useLiveCampaignStatus", "campaign", "teasingContent", "status", "setStatus", "ye", "initialRemaining", "diffFromNowInMilliseconds", "parseISO", "pe", "se", "differenceInMilliseconds", "useInterval", "incoming", "nextStatus", "useTrackClickPlayLiveContent", "trackAmplitude", "useAnalytics", "campaignKey", "MS_IN_SECOND", "useIsEnabled", "ref", "useInView", "useIsImpressed", "useLiveCampaignVideo", "campaignKey", "playPreviewStatusList", "intervalEnabled", "enabled", "isLoading", "data", "mutate", "useFetchLiveCampaign", "campaign", "status", "useLiveCampaignStatus", "shouldRenderPreview", "previewUrl", "posterUrl", "isPending", "useInterval", "ACCESS_FROM_APP_MESSAGE", "useLiveCampaignVideoAction", "dialog", "useAppLinkDialog", "trackClickPlayLiveContent", "useTrackClickPlayLiveContent", "isWebview", "usePlayInView", "isInView", "video", "setVideo", "ye", "ue", "CampaignStatus", "RichCampaignStatus", "CampaignStatus", "PREVIEW_ALLOWED_STATUS_LIST", "RichCampaignStatus", "MINIMAL_PREVIEW_ALLOWED_STATUS_LIST", "LiveCampaignVideo", "campaignKey", "playAfterCampaign", "ref", "pe", "enabled", "useIsEnabled", "isImpressed", "useIsImpressed", "playPreviewStatusList", "PREVIEW_ALLOWED_STATUS_LIST", "MINIMAL_PREVIEW_ALLOWED_STATUS_LIST", "isPending", "shouldRenderPreview", "previewUrl", "posterUrl", "useLiveCampaignVideo", "handleVideoClick", "useLiveCampaignVideoAction", "setVideo", "usePlayInView", "p", "styles", "catchHlsPlaybackError", "addPropertyControls", "ControlType", "LiveCampaignVideo", "TestLiveCampaignVideo_default"]
}
