{"version":3,"file":"hls.BU-eLCwf.mjs","names":["__exportAll","init_ssg_sandbox_shims","navigator","_defineProperty","_toPropertyKey","r","t","_extends","e","n","ownKeys","o","r2","_objectSpread2","_toPrimitive","i","createLogger","fakeLogger","consolePrintFn","func","type","id","noop","getLoggerFn","debugConfig","key","enableLogs","newLogger","keys","context","exportedLogger","getMediaSource","preferManagedMediaSource","isManagedMediaSource","source","isCompatibleTrackChange","trackNames","currentTracks","requiredTrackNames","requiredTracks","trackCount","requiredTrackCount","name","utf8ArrayToStr","decoded","array","exitOnNull","idx","len","c","char2","char3","out","arrayToHex","str","h","hexToArrayBuffer","getDefaultExportFromCjs","x","\"default\"","requireUrlToolkit","hasRequiredUrlToolkit","URL_REGEX","FIRST_SEGMENT_REGEX","SLASH_DOT_REGEX","SLASH_DOT_DOT_REGEX","URLToolkit","baseURL","relativeURL","opts","basePartsForNormalise","relativeParts","baseParts","pathParts","builtParts","baseURLPath","newPath","parts","url","path","urlToolkit","isMediaFragment","frag","getOwnPropertyDescriptorFromPrototypeChain","prototype","object","property","makeEnumerable","d","bin2str","data","readUint16","val","buffer","offset","readUint32","readSint32","readUint64","result","hasMoofData","end","size","findBox","results","endbox","subresults","push","parseSegmentIndex","references","version2","sidx","index","timescale","earliestPresentationTime","firstOffset","startByte","referencesCount","referenceIndex","referenceInfo","referenceSize","logger","subsegmentDuration","parseInitSegment","traks","initSegment","trak","tkhd","trackId","mdhd","hdlr","hdlrType","ElementaryStreamTypes","stsdBox","stsd","parseStsd","trex2","track","sampleEntries","sampleEntriesEnd","fourCC","codec","supplemental","encrypted","schm","sinf","scheme","frma","codecFourCC","avcCBox","toHex","parseSupplementalDoViCodec","codecBox","esdsBox","skipBERInteger","flags","objectType","firstByte","audioObjectType","hvcCBox","profileByte","profileSpace","generalProfileIdc","profileCompat","tierFlag","levelIDC","constraintIndicator","reverse32BitInt","constraintString","byte","vpcCBox","profile","level","bitDepth","addLeadingZero","av1CBox","highBitDepth","twelveBit","monochrome","chromaSubsamplingX","chromaSubsamplingY","chromaSamplePosition","dvvCResult","dvXCBox","doViProfile","doViLevel","limit","bytes","num","patchEncyptionData","decryptdata","keyId","applyToTencBoxes","tencKeyId","tenc","b","isAudio","parseKeyIdsFromTenc","keyIds","encBoxes","enc","parseSinf","predicate","getSampleData","tracks","trafs","traf","tfhd","initData","trackTimes","tfdt","baseTime","UINT32_MAX$1","logger2","isFiniteNumber","trackDefault","tfhdFlags","defaultSampleDuration","truns","sampleDTS","rawDuration","sampleDuration","j","trun","sampleCount","sampleIndex","dataOffsetPresent","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetPresent","remaining","sidxMinStart","sidxMaxEnd","sidxs","subSegmentDuration","dur","ref","segmentValidRange","segmentedRange","moofs","last","appendUint8Array","temp","data1","data2","parseSamples","seiSamples","videoData","isHEVCFlavor","moofOffset","moof","baseDataOffsetPresent","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleSize","defaultSampleFlagsPresent","tfhdOffset","isHEVC","dataOffset","sampleSize","sampleCompositionOffsetsPresent","compositionOffset","trunOffset","sampleOffset","ix","naluTotalSize","naluSize","isSEIMessage","parseSEIMessageFromNALu","timeOffset","baseCodec","naluType","naluHeader","discardEPB","unescapedData","seiPtr","headerSize","payloadType","payloadSize","leftOver","payPtr","providerCode","userStructure","userDataType","totalCCs","enabled","totalBytes","byteArray","samples","uuidStrArray","_b","length","userDataBytes","EPBPositions","newLength","newData","sourceIndex","parseEmsg","schemeIdUri","value","timeScale","presentationTimeDelta","presentationTime","eventDuration","leftPresentationTime","rightPresentationTime","isSafeInteger","payload","mp4Box","mp4pssh","systemId","kids","kidCount","keyids","dataSize","parseMultiPssh","pssh","parsePssh","view2","dataSizeOffset","kidCounts","dataSizeOrKidCount","isCodecType","typeCodes","sampleEntryCodesISO","areCodecsMediaSourceSupported","codecs","isCodecMediaSourceSupported","mimeTypeForCodec","videoCodecPreferenceValue","videoCodec","codecsSetSelectionPreferenceValue","limitedHevcSupport","userAgentHevcSupportIsInaccurate","codecSet","preferenceValue","getCodecCompatibleNameLower","CODEC_COMPATIBLE_NAMES","lowerCaseCodec","codecsToCheck","_getMediaSource","getCodecCompatibleName","AUDIO_CODEC_REGEXP","m","replaceVideoCodec","originalCodecs","allCodecs","newVideoCodec","pickMostCompleteCodecName","parsedCodec","isCodecSupportedAsType","levelCodec","levelCodecs","convertAVC1ToAVCOTI","videoCodecs","avcdata","fillInMissingAV01Params","av1params","placeholders","getM2TSSupportedAudioTypes","MediaSource","getCodecsForMimeType","mimeType","getUnsupportedResult","unsupportedResult","requiresMediaCapabilitiesDecodingInfo","audioGroups","audioCodecPreference","audioPreference","channelsPreference","maxChannels","audioChannels","audioTracksByGroup","groupId","audioTrackGroup","acc","currentFrameRate","currentVideoRange","currentBw","channels","getMediaDecodingInfoPromise","mediaCapabilities","SUPPORTED_INFO_DEFAULT","configurations","videoDecodeList","makeVideoConfigurations","videoCount","audioDecodeList","makeAudioConfigurations","audioCount","configuration","audioBitrate","ua","decodingInfoKey","getMediaDecodingInfoKey","cache","decodingInfoResults","info","bitrate","getVariantDecodingBitrate","width","height","framerate","videoRange","videoConfiguration","audioCodecs","combinedBitrate","audioGroupId","audioTrack","channelsNumber","audioConfiguration","audioCodec","hasVideo","estimatedAudioBitrate","configs","levelBitrate","config","video","audio","isHdcpLevel","HdcpLevels","isVideoRange","VideoRangeValues","getSkipValue","details","playlistRecentEnough","age","canSkipUntil","canSkipDateRanges","HlsSkip","hasGroup","groups","isHdrSupported","mediaQueryList","badQuery","getVideoSelectionOptions","preferHDR","allowedVideoRanges","videoPreference","allowAutoPreferHDR","getStartCodecTier","codecSets","codecTiers","videoCodecPreference","preferStereo","hasStereo","hasCurrentVideoRange","minHeight","minFramerate","minBitrate","minIndex","selectedScore","videoRanges","tier","range","maxHeight","maxFramerate","hasMultipleSets","candidateTier","candidate","selected","logStartCodecCandidateIgnored","stringify","codeSet","reason","getAudioTracksByGroup","allAudioTracks","trackGroup","channelsKey","getCodecTiers","levels","minAutoLevel","maxAutoLevel","tiers","lesserWidthOrHeight","audioGroup","getBasicSelectionOption","option","findMatchingOption","matchesOption","matchPredicate","isDefault","forced","lang","languagesMatch","assocLang","characteristicsMatch","languageA","languageB","arrA","characteristicsA","arrB","characteristicsB","el","audioMatchPredicate","findClosestLevelWithAudioGroup","currentLevel","searchIndex","renditions","uri","variantMap","currentVideoCodec","matchingVideo","searchDownAndUpList","arr","useAlternateAudio","audioTrackUrl","hls","findFragmentByPDT","PDTValue","fragments","seg","pdtWithinToleranceTest","maxFragLookUpTolerance","findFragmentByPTS","fragNext","fragPrevious","bufferEdgeError","bufferEnd","fragmentWithinToleranceTest","fragmentWithinFastStartSwitch","nextFragLookupTolerance","foundFragment","BinarySearch","firstDuration","tag","duration","candidateLookupTolerance","pdtBufferEnd","findNearestWithCC","cc","fragmentHint","closest","pos","isTimeoutError","error","ErrorDetails","isKeyError","isUnusableKeyError","getRetryConfig","isTimeout","loadPolicy","getRetryDelay","backoffFactor","retryConfig","retryCount","getLoaderConfigWithoutReties","loderConfig","shouldRetry","httpStatus","loaderResponse","retry","retryForHttpStatus","offlineHttpStatus","createDoNothingErrorAction","errorAction","NetworkErrorAction","ErrorActionFlags","resolved","isPartial","_fragmentEntity$range","_fragmentEntity$range2","_fragmentEntity$range3","fragmentEntity","getFragmentKey","fragment","filterParts","partList","keep","part","removePadding","outputBytes","paddingBytes","getSubtleAlgoName","aesMode","DecrypterAesMode","createLoaderContext","segment","loaderContext","start","byteRangeStart","byteRangeEnd","isMethodFullSegmentAesCbc","fragmentLen","createGapLoadError","errorData","ErrorTypes","LoadError","method","getNewPerformanceTiming","hasVariableReferences","VARIABLE_REPLACEMENT_REGEX","substituteVariables","parsed","variableList","variableName","variableReference","variableValue","addVariableDefinition","NAME","VALUE","attr","searchParams","parentUrl","importVariableDefinition","IMPORT","sourceVariableList","isDateRangeCueAttribute","attrName","isSCTE35Attribute","arrayValuesMatch","a","optionalArrayValuesMatch","isFullSegmentEncryption","getAesModeFromFullSegmentMethod","base64Decode","base64encodedStr","strToUtf8array","getKeyIdBytes","keyIdbytes","paddedkeyIdbytes","changeEndianness","swap","cur","from","to","convertDataUriToArrayBytes","colonsplit","keydata","semicolonsplit","commasplit","isbase64","keySystemFormatToKeySystemDomain","format2","KeySystemFormats","KeySystems","keySystemDomainToKeySystemFormat","keySystem","getKeySystemsForConfig","keySystemsToAttempt","drmSystems","widevineLicenseUrl","getSupportedMediaKeySystemConfigurations","initDataTypes","createMediaKeySystemConfigurations","drmSystemOptions","isPersistentSessionType","_drmSystemOptions$ses","parsePlayReadyWRM","keyBytesUtf16","keyBytes","keyByteStr","xmlKeyBytes","keyData","keyIdArray","getKeyIdFromWidevineKey","widevineKey","levelKeys","getKeyIdFromPlayReadyKey","playReadyKey","playReadyKeyBytes","createInitializationVector","uint8View","segmentNumber","mapDateRanges","programDateTimeCount","programDateTimes","lastFragment","lastProgramDateTime","playlistEnd","dateRangeIds","dateRange","startDateTime","fragIndex","findFragmentWithStartDate","pdtFragment","pdtStart","endTime","startIndex","endIndex","fragStartDateTime","parseKey","keyAttrs","AttrList","keyTagAttributes","decryptmethod","decrypturi","decryptiv","decryptkeyformatversions","decryptkeyformat","resolvedUri","M3U8Parser","baseurl","keyFormatVersions","LevelKey","parseStartTimeOffset","startTimeOffset","startAttributes","setCodecs","codecsAttributeValue","filtered","assignCodec","codecValue","groupItem","codecProperty","backfillProgramDateTimes","fragPrev","firstPdtIndex","assignProgramDateTime","prevFrag","setInitSegment","mapAttrs","levelkeys","setFragLevelKeys","encryptedFragments","assignMultipleMediaPlaylistTagOccuranceError","assignMustAppearBeforeSegmentsError","updateFromToPTS","fragToPTS","fragTo","fragFrom","updateFragPTSDTS","endPTS","startPTS","startDTS","maxStartPTS","minEndPTS","fragStartPts","fragEndPts","deltaPTS","endDTS","drift","sn","fragIdx","mergeDetails","oldDetails","newDetails","currentInitSegment","oldFragments","oldInit","PTSFrag","mapFragmentIntersection","newFrag","oldFrag","ccOffset","newFragIndex","newFragments2","newFragments","fragmentsToCheck","mergeDateRanges","getFragmentWithSN","mapPartIntersection","oldPart","adjustSliding","advancedDateTime","edge","deltaDateRanges","dateRanges","oldDateRanges","recentlyRemovedDateranges","mergeCount","mergedDateRange","DateRange","oldParts","newParts","delta","newPart","intersectionFn","skippedSegments","newFrags","oldFrags","uriBefore","uriAfter","notEqualAfterStrippingQueries","getSequenceError","message","advancedOrStable","sliding","matchingStableVariantOrRendition","addSliding","computeReloadInterval","reloadInterval","distanceToLiveEdgeMs","lastSegmentDuration","fragCurrent","getPartWith","findPart","partIndex","reassignFragmentLevelIndexes","_level$details","stripQuery","findFirstFragWithCC","shouldAlignOnDiscontinuities","refDetails","adjustFragmentStart","adjustSlidingStart","alignStream","switchDetails","alignDiscontinuities","alignMediaPlaylistByPDT","targetCC","refFrag","refFragments","refPDT","targetPDT","addEventListener","removeEventListener","listener","interstitialsEnabled","concatUint8Arrays","dataLength","chunks","chunk","requireEventemitter3","hasRequiredEventemitter3","has","prefix","Events2","EE","fn","once","addListener","emitter","evt","event","clearEvent","EventEmitter2","names","events","handlers","l","ee","listeners","args","a1","a2","a3","a4","a5","eventemitter3","hasUMDWorker","injectWorker","workerContext","workerStore","version","blob","objectURL","loadWorker","scriptURL","removeWorkerFromStore","worker","isId3Footer","isId3Header","readId3Size","getId3Data","front","getAudioConfig","adtsSamplingRates","byte2","adtsSamplingIndex","observer","Events","adtsObjectType","channelCount","samplerate","aacSampleIndex","manifestCodec","isHeaderPattern$1","getHeaderLength","getFullFrameLength","canGetFrameLength","isHeader$1","canParse$1","probe$1","headerLength","frameLength","newOffset","initTrackConfig","getFrameDuration","parseFrameHeader","appendFrame$2","stamp","pts","frameIndex","header","unit","_length","missing","_sample","canParseId3","toArrayBuffer","toUint8","view","unsafeGetArrayBuffer","bytesPerElement","Type","isArrayBufferView","dataEnd","rawStart","obj","decodeId3ImageFrame","metadataFrame","frame","mimeTypeEndIndex","pictureType","descriptionEndIndex","description","decodeId3PrivFrame","owner","privateData","decodeId3TextFrame","text","decodeId3UrlFrame","decodeId3Frame","getId3FrameData","getId3Frames","frames","id3Data","HEADER_FOOTER_SIZE","FRAME_SIZE","frameData","isId3TimestampFrame","readId3Timestamp","timeStampFrame","pts33Bit","timestamp","getId3Timestamp","dummyTrack","appendFrame$1","parseHeader","sample","mpegVersion","mpegLayer","bitRateIndex","sampleRateIndex","paddingBit","channelMode","columnInBitrates","bitRate","BitratesMap","sampleRate","SamplingRateMap","sampleCoefficient","SamplesCoefficients","bytesInSlot","BytesInSlot","samplesPerFrame","chromeVersion$1","isHeaderPattern","isHeader","canParse","probe","appendFrame","samplingRateCode","frameSizeCode","skipCount","lfeon","bsid","bsmod","getEmsgStartTime","emsgInfo","parsePID","parsePAT","parsePMT","sectionLength","tableEnd","programInfoLength","pid","esInfoLength","isSampleAes","logEncryptedSamplesFoundInUnencryptedStream","typeSupported","parsePos","descriptorLen","emitParsingError","parsePES","pesLen","pesHdrLen","pesPts","pesDts","stream","pesFlags","payloadStartOffset","pesData","dataLen","toTimescaleFromBase","destScale","srcBase","round","toTimescaleFromScale","srcScale","toMsFromMpegTsClock","MPEG_TS_CLOCK_FREQ_HZ","toMpegTsClockFromTimescale","timestampToString","createMp4Sample","isKeyframe","normalizePts","reference","findKeyframeIndex","flushTextTrackMetadataCueSamples","inputTimeScale","initPTS","initDTS","flushTextTrackUserdataCueSamples","toStartEndOrDefault","defaultValue","isInvalidInitPts","minDuration","startTime","getParsedTrackCodec","getEncryptionType","encryptionType","decryptData","isPromise","p","subtitleOptionsIdentical","trackList1","trackList2","mediaAttributesIdentical","stableRenditionId","attrs1","customAttributes","attrs2","subtitleAttribute","subtitleTrackMatchesTextTrack","textTrack","subtitleTrack","removeSourceChildren","sourceChildren","node","addSource","media","sourceBufferNameToIndex","format","throwError","action","src","serializeError","cause","serializeBoolean","BOOLEAN","encodeBase64","binary","serializeByteSequence","BYTES","isInvalidInt","serializeInteger","INTEGER","serializeDate","roundToEven","precision","decimalShift","flooredValue","serializeDecimal","roundedValue","DECIMAL","stringValue","serializeString","STRING_REGEX","STRING","symbolToStr","symbol","serializeToken","token","TOKEN","serializeBareItem","BARE_ITEM","SfToken","serializeKey","KEY","serializeParams","params","serializeItem","SfItem","serializeInnerList","serializeDict","dict","DICT","entries","optionalWhiteSpace","options","item","output","encodeSfDict","createHeaderMap","headerMap","_a","field","groupCmcdHeaders","cmcd","custom","customHeaderMap","CMCD_HEADER_MAP","CmcdHeaderField","isTokenField","isValid","urlToRelativePath","base","toPath","fromPath","isCmcdCustomKey","CUSTOM_KEY_REGEX","isCmcdEventKey","CMCD_COMMON_KEYS","CMCD_EVENT_KEYS","isCmcdRequestKey","CMCD_REQUEST_KEYS","isCmcdResponseKey","CMCD_RESPONSE_KEYS","isCmcdV1Key","CMCD_V1_KEYS","prepareCmcdData","\"v\"","reportingMode","CMCD_REQUEST_MODE","keyFilter","filterMap","filter","needsTimestamp","CMCD_RESPONSE_MODE","CMCD_EVENT_MODE","formatters","CMCD_FORMATTER_MAP","formatterOptions","formatter","toCmcdHeaders","shards","shard","appendCmcdHeaders","headers","encodeCmcd","toCmcdUrl","toCmcdQuery","CMCD_PARAM","appendCmcdQuery","query","REGEX","cloneRenditionGroups","groupCloneMap","clonedTracks","clonedTrack","performUriReplacement","uriReplacement","cloneId","host","perOptionKey","perOptionUris","perVariantUri","stableId","getKeyIdString","getKeyStatus","keyContext","getKeyStatusError","outputRestricted","keyStatus","EMEKeyError","sendAddTrackEvent","videoEl","addCueToTrack","mode","cue","err","textTrackCue","err2","clearCurrentCues","enterHandler","removeCuesInRange","cues","getCuesInRange","getFirstCueIndexFromTime","time","left","right","mid","cuesFound","firstCueInRange","filterSubtitleTracks","textTrackList","uuid","uuid2","dt","hash","hash2","generateAssetIdentifier","interstitial","assetListIndex","getSnapToFragmentTime","ALIGNED_END_THRESHOLD_SECONDS","getInterstitialUrl","baseUrl","sessionId","getNextAssetIndex","_interstitial$assetLi","eventToString","eventAssetToString","asset","segmentToString","playWithCatch","_media$play","timelineMessage","label","setLastCmd","hasCmdRepeated","cmdHistory","createCmdHistory","parseTimeStamp","computeSeconds","m2","s","f","input","parseOptions","groupDelim","kv","keyValueDelim","k","v","callback","parseCue","oInput","consumeTimeStamp","ts","consumeCueSettings","settings","Settings","input2","vals","regionList","center","line","defaults","position","cue2","skipWhitespace","fixLineBreaks","generateCueId","parseWebVTT","parser","VTTParser","vttLines","vttByteArray","LINEBREAKS","init90kHz","cueTime","timestampMapMPEGTS","timestampMapLOCAL","parsingError","inHeader","currCC","vttCCs","cueOffset","webVttMpegTsMapOffset","calculateOffset","errorCallBack","callBack","startsWith","cueString2millis","parseIMSC1","ttmlList","mdat","syncTime","parseTTML","ttml","tt","defaultRateInfo","rateInfo","trim","styleElements","collectionToDictionary","getElementCollection","regionElements","cueElements","cueText","getTextContent","cueElement","parseTtmlTime","timestampParsingError","VTTCue","region","style","styles","getTtmlStyles","textAlign","lineAlign","textAlignToLineAlign","parent","fromElement","parentName","childName","elementsWithId","element","_node$childNodes","ttsNs","regionStyle","styleAttributes","regionStyleName","getAttributeNS","ns","timeAttributeValue","seconds","HMSF_REGEX","parseHoursMinutesSecondsFrames","TIME_UNIT_REGEX","parseTimeUnits","captionsOrSubtitlesFromCharacteristics","canReuseVttTextTrack","inUseTrack","manifestTrack","intersection","x2","y2","x1","y1","newVTTCCs","fetchSupported","getRequestParameters","initParams","getByteRangeLength","BYTERANGE","byteRangeHeader","getContentLength","contentRange","byteRangeLength","contentLength","getRequest","timelineConfig","Cues","mergeConfig","userConfig","defaultsCopy","deepCpy","defaultConfig","deprecatedSettingTypes","deprecatedSettings","policyName","policyNotSet","report","deprecatedSetting","setting","enableStreamingMode","currentLoader","FetchLoader","XhrLoader","getInFlightDependency","main","inFlight","inFlightFragments","currentTime","inFlightData","State","appendedFragAtPosition","fragmentTracker","PlaylistLevelType","getCueClass","createCueWithDataFields","Cue","assignTrackIdsByGroup","getSourceBuffer","isMSESupported","sourceBuffer","isSupported","mediaSource","codecsForVideoContainer","codecForAudioContainer","changeTypeSupported","_sourceBuffer$prototy","getKeyId","mapContextToLevelType","PlaylistContextType","getResponseUrl","response","MAX_SAFE_INTEGER","EWMA","EwmaBandWidthEstimator","Logger","urlToolkitExports","LoadStats","BaseSegment","Fragment","Part","RemuxerTrackIdConfig","supportedResult","HlsUrlParameters","Level","omitCircularRefsReplacer","AbrController","ErrorController","FragmentState","FragmentTracker","AESCrypto","AESDecryptor","FastAESKey","CHUNK_SIZE","Decrypter","MIN_CHUNK_SIZE","FragmentLoader","TaskLoop","ChunkMetadata","noopBuffered","BufferHelper","DECIMAL_RESOLUTION_REGEX","ATTR_LIST_REGEX","CLASS_INTERSTITIAL","DEFAULT_TARGET_DURATION","LevelDetails","optionalSelf","requestMediaKeySystemAccess","keyUriToKeyIdMap","MASTER_PLAYLIST_REGEX","MASTER_PLAYLIST_MEDIA_REGEX","IS_MEDIA_PLAYLIST","LEVEL_PLAYLIST_REGEX_FAST","LEVEL_PLAYLIST_REGEX_SLOW","TimeRanges","BaseStreamController","ChunkCache","EventEmitter","MetadataSchema","BaseAudioDemuxer","initPTSFn","AACDemuxer","getAudioBSID","AC3Demuxer","MP3Demuxer","emsgSchemePattern","MP4Demuxer","SampleAesDecrypter","BaseVideoParser","ExpGolomb","AvcVideoParser","HevcVideoParser","PACKET_LENGTH","TSDemuxer","AAC","UINT32_MAX","MP4","MAX_SILENT_FRAME_DURATION","AAC_SAMPLES_PER_FRAME","MPEG_AUDIO_SAMPLE_PER_FRAME","AC3_SAMPLES_PER_FRAME","chromeVersion","safariWebkitVersion","MP4Remuxer","PassThroughRemuxer","now","muxConfig","Transmuxer","emptyResult","TransmuxConfig","TransmuxState","transmuxerInstanceCount","TransmuxerInterface","TICK_INTERVAL$3","AudioStreamController","BasePlaylistController","AudioTrackController","BufferOperationQueue","VIDEO_CODEC_PROFILE_REPLACE","TRACK_REMOVED_ERROR_NAME","HlsJsTrackRemovedError","BufferController","CapLevelController","CmcdObjectType","CmcdStreamingFormat","CMCD_OBJECT","CMCD_REQUEST","CMCD_SESSION","CMCD_STATUS","toRounded","toUrlSafe","toHundred","nor","CMCDController","PATHWAY_PENALTY_DURATION_MS","ContentSteeringController","EMEController","FPSController","SubtitleTrackController","TimelineOccupancy","InterstitialEvent","HlsAssetPlayer","ABUTTING_THRESHOLD_SECONDS","InterstitialsSchedule","AssetListLoader","InterstitialsController","TICK_INTERVAL$2","SubtitleStreamController","BufferableInstance","specialCea608CharsCodes","getCharForByte","NR_ROWS","NR_COLS","rowsLowCh1","rowsHighCh1","rowsLowCh2","rowsHighCh2","backgroundColors","CaptionsLogger","numArrayToHexArray","PenState","StyledUnicodeChar","Row","CaptionScreen","Cea608Channel","Cea608Parser","StringDecoder","IMSC1_CODEC","OutputFilter","TimelineController","WHITESPACE_CHAR","FetchError","AGE_HEADER_LINE_REGEX","hlsDefaultConfig","MAX_START_GAP_JUMP","SKIP_BUFFER_HOLE_STEP_SECONDS","SKIP_BUFFER_RANGE_START","TICK_INTERVAL$1","GapController","MIN_CUE_DURATION","MAX_CUE_ENDTIME","ID3TrackController","LatencyController","LevelController","TICK_INTERVAL","StreamController","KeyLoader","PlaylistLoader","Hls","init_hlsjs","__esmMin","\"NETWORK_ERROR\"","\"MEDIA_ERROR\"","\"KEY_SYSTEM_ERROR\"","\"MUX_ERROR\"","\"OTHER_ERROR\"","ErrorTypes2","\"KEY_SYSTEM_NO_KEYS\"","\"KEY_SYSTEM_NO_ACCESS\"","\"KEY_SYSTEM_NO_SESSION\"","\"KEY_SYSTEM_NO_CONFIGURED_LICENSE\"","\"KEY_SYSTEM_LICENSE_REQUEST_FAILED\"","\"KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED\"","\"KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED\"","\"KEY_SYSTEM_SESSION_UPDATE_FAILED\"","\"KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED\"","\"KEY_SYSTEM_STATUS_INTERNAL_ERROR\"","\"KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR\"","\"KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR\"","\"KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR\"","\"MANIFEST_LOAD_ERROR\"","\"MANIFEST_LOAD_TIMEOUT\"","\"MANIFEST_PARSING_ERROR\"","\"MANIFEST_INCOMPATIBLE_CODECS_ERROR\"","\"LEVEL_EMPTY_ERROR\"","\"LEVEL_LOAD_ERROR\"","\"LEVEL_LOAD_TIMEOUT\"","\"LEVEL_PARSING_ERROR\"","\"LEVEL_SWITCH_ERROR\"","\"AUDIO_TRACK_LOAD_ERROR\"","\"AUDIO_TRACK_LOAD_TIMEOUT\"","\"SUBTITLE_LOAD_ERROR\"","\"SUBTITLE_TRACK_LOAD_TIMEOUT\"","\"FRAG_LOAD_ERROR\"","\"FRAG_LOAD_TIMEOUT\"","\"FRAG_DECRYPT_ERROR\"","\"FRAG_PARSING_ERROR\"","\"FRAG_GAP\"","\"REMUX_ALLOC_ERROR\"","\"KEY_LOAD_ERROR\"","\"KEY_LOAD_TIMEOUT\"","\"BUFFER_ADD_CODEC_ERROR\"","\"BUFFER_INCOMPATIBLE_CODECS_ERROR\"","\"BUFFER_APPEND_ERROR\"","\"BUFFER_APPENDING_ERROR\"","\"BUFFER_STALLED_ERROR\"","\"BUFFER_FULL_ERROR\"","\"BUFFER_SEEK_OVER_HOLE\"","\"BUFFER_NUDGE_ON_STALL\"","\"ASSET_LIST_LOAD_ERROR\"","\"ASSET_LIST_LOAD_TIMEOUT\"","\"ASSET_LIST_PARSING_ERROR\"","\"INTERSTITIAL_ASSET_ITEM_ERROR\"","\"INTERNAL_EXCEPTION\"","\"INTERNAL_ABORTED\"","\"ATTACH_MEDIA_ERROR\"","\"UNKNOWN\"","ErrorDetails2","\"MEDIA_ATTACHING\"","\"MEDIA_ATTACHED\"","\"MEDIA_DETACHING\"","\"MEDIA_DETACHED\"","\"MEDIA_ENDED\"","\"STALL_RESOLVED\"","\"BUFFER_RESET\"","\"BUFFER_CODECS\"","\"BUFFER_CREATED\"","\"BUFFER_APPENDING\"","\"BUFFER_APPENDED\"","\"BUFFER_EOS\"","\"BUFFERED_TO_END\"","\"BUFFER_FLUSHING\"","\"BUFFER_FLUSHED\"","\"MANIFEST_LOADING\"","\"MANIFEST_LOADED\"","\"MANIFEST_PARSED\"","\"LEVEL_SWITCHING\"","\"LEVEL_SWITCHED\"","\"LEVEL_LOADING\"","\"LEVEL_LOADED\"","\"LEVEL_UPDATED\"","\"LEVEL_PTS_UPDATED\"","\"LEVELS_UPDATED\"","\"AUDIO_TRACKS_UPDATED\"","\"AUDIO_TRACK_SWITCHING\"","\"AUDIO_TRACK_SWITCHED\"","\"AUDIO_TRACK_LOADING\"","\"AUDIO_TRACK_LOADED\"","\"AUDIO_TRACK_UPDATED\"","\"SUBTITLE_TRACKS_UPDATED\"","\"SUBTITLE_TRACKS_CLEARED\"","\"SUBTITLE_TRACK_SWITCH\"","\"SUBTITLE_TRACK_LOADING\"","\"SUBTITLE_TRACK_LOADED\"","\"SUBTITLE_TRACK_UPDATED\"","\"SUBTITLE_FRAG_PROCESSED\"","\"CUES_PARSED\"","\"NON_NATIVE_TEXT_TRACKS_FOUND\"","\"INIT_PTS_FOUND\"","\"FRAG_LOADING\"","\"FRAG_LOAD_EMERGENCY_ABORTED\"","\"FRAG_LOADED\"","\"FRAG_DECRYPTED\"","\"FRAG_PARSING_INIT_SEGMENT\"","\"FRAG_PARSING_USERDATA\"","\"FRAG_PARSING_METADATA\"","\"FRAG_PARSED\"","\"FRAG_BUFFERED\"","\"FRAG_CHANGED\"","\"FPS_DROP\"","\"FPS_DROP_LEVEL_CAPPING\"","\"MAX_AUTO_LEVEL_UPDATED\"","\"ERROR\"","\"DESTROYING\"","\"KEY_LOADING\"","\"KEY_LOADED\"","\"LIVE_BACK_BUFFER_REACHED\"","\"BACK_BUFFER_REACHED\"","\"STEERING_MANIFEST_LOADED\"","\"ASSET_LIST_LOADING\"","\"ASSET_LIST_LOADED\"","\"INTERSTITIALS_UPDATED\"","\"INTERSTITIALS_BUFFERED_TO_BOUNDARY\"","\"INTERSTITIAL_ASSET_PLAYER_CREATED\"","\"INTERSTITIAL_STARTED\"","\"INTERSTITIAL_ASSET_STARTED\"","\"INTERSTITIAL_ASSET_ENDED\"","\"INTERSTITIAL_ASSET_ERROR\"","\"INTERSTITIAL_ENDED\"","\"INTERSTITIALS_PRIMARY_RESUMED\"","\"PLAYOUT_LIMIT_REACHED\"","\"EVENT_CUE_ENTER\"","halfLife","estimate","weight","adjAlpha","zeroFactor","defaultEstimate","slow","fast","defaultTTFB","slow_","fast_","ttfb_","durationMs","numBits","numBytes","durationS","bandwidthInBps","ttfb","lb","previous","total","_this$_decryptdata","keyFormats","levelKey","_this$_decryptdata2","_this$levelkeys$keyFo","_this$_decryptdata3","keyFormat","_this$loader","_this$keyLoader","elementaryStreams","partAttrs","byteRange","msn","skip","supplementalVideo","subtitleGroups","known","replacer","_","_hls","now2","stats","timeLoading","loadingFragForLevel","currentAutoLevel","autoLevelEnabled","fragBlockingSwitch","levelChange","levelLoaded","bufferInfo","ttfbEstimate","playbackRate","bufferStarvationDelay","loadedFirstByte","bwEstimate","expectedLen","timeStreaming","loadRate","ttfbSeconds","fragLoadedDelay","bwe","live","abrBandWidthUpFactor","fragLevelNextLoadedDelay","nextLoadLevel","levelNextBitrate","requiresLevelLoad","nextLoadLevelBitrate","bestSwitchLevel","abortAndSwitch","bufferStarvationDelay2","lowestSwitchLevel","abrEwmaDefaultEstimate","timeToFirstByteSec","fragSizeBits","bandwidth","isSwitch","timeLoadingMs","loading","loadedBytes","loadedDuration","fragBufferedData","processingMs","maxStartDelay","abrAutoLevel","firstLevel","clamped","forcedAutoLevel","useEstimate","loadedFirstFrag","nextABRAutoLevel","currentFragDuration","partCurrent","avgbw","bwFactor","bwUpFactor","_bestLevel","maxStarvationDelay","bitrateTestDelay","bestLevel","minLevel","autoLevel","_this$hls$latestLevel","maxFetchDuration","lastLoadedFragLevel","selectionBaseLevel","firstSelection","loadLevel","currentCodecSet","minStartIndex","startTier","ttfbEstimateSec","levelsSkipped","_levelInfo$supportedR","levelInfo","upSwitch","decodingInfo","levels2","levelDetails","avgDuration","adjustedbw","fetchDuration","nextLevel","maxIndex","list","currentIndex","currentElement","comparisonResult","comparisonFn","_hls$loadLevelObj","keyInError","audioGroupsIds","_data$frag","_data$context","levelIndex","variantLevelIndex","keyLoadPolicy","fragLoadPolicy","fragmentErrors","level2","errorDetails","fragErrorType","findAudioCodecAlternate","findVideoCodecAlternate","playlistErrorType","playlistErrorGroupId","_level$audioGroups","_level$subtitleGroups","levelCandidate","fragCandidate","nextAutoLevel","restrictedHdcpLevel","levelCountWithError","fragLevelKey","activeParts","levelType","activePart","buffered","elementaryStream","timeRange","appendedPartSn","appendedPart","removeAppending","playlistType","esData","isNotBuffered","timeRanges","fragKey","isFragHint","streamInfo","partial","snToKeep","force","bestFragment","timePadding","bestOverlap","bufferPadding","lastFragmentEntity","loaded","_this$activePartLists","withGapOnly","unbufferedOnly","snToRemove","_this$hls","partlist","subtle","iv","arrayBuffer","newArray","sBox","invSBox","subMix","subMix0","subMix1","subMix2","subMix3","invSubMix","invSubMix0","invSubMix1","invSubMix2","invSubMix3","xi","sx","x4","x8","keyBuffer","sameKey","keySize","ksRows","ksRow","invKsRow","keySchedule","invKeySchedule","sbox","rcon","prev","word","nRounds","invSBOX","initVector","aesIV","initVector0","initVector1","initVector2","initVector3","inputInt32","inputArrayBuffer","outputInt32","t0","t1","t2","t3","s0","s1","s2","s3","inputWords0","inputWords1","inputWords2","inputWords3","swapWord","subtleAlgoName","removePKCS7Padding","browserCrypto","currentResult","remainderData","dataView","decryptResult","resolve","reject","currentChunk","currentIV","softwareDecrypter","aesKey","enableSoftwareAES","splitPoint","msg","FragmentILoader","DefaultILoader","tags","loader","loaderConfig","callbacks","onProgress","partLoadedData","fragStats","partStats","partTotal","estTotalParts","estLoadedParts","estRemainingBytes","fragLoading","partLoading","millis","maxHoleDuration","bufferedIndex","buffered2","buf2len","buf2end","bufferLen","nextStart","bufferStart","attrs","intValue","attrValue","identifier","res","match","quotedString","hexadecimalSequence","dateRangeWithSameId","tagCount","previousAttr","dateRangeAttr","endDate","_cue","tagAnchor","dateAtEnd","partSnDiff","partIndexDiff","runTime","_this$partList","_this$partList2","lastIndex","_this$partList3","playlistWindowDuration","_optionalSelf$navigat","formatversions","assignedKeyId","_psshData$kids","psshData","PlayReadyKeySystemUUID","padded","group","mediaGroupId","string","levelsWithKnownCodecs","_level$unknownCodecs","resolution","supplementalCodecs","attributes","sessionAttrs","dataId","sessionKey","contentSteeringAttributes","groupsByType","medias","characteristics","instreamId","groupCodec","currentSN","currentPart","totalduration","discontinuityCounter","currentBitrate","createNextFrag","nextByteRange","serverControlAttrs","title","value1","value2","skipAttrs","_i","variableAttributes","multivariantVariableList","currentKey","init","previousFragmentPart","renditionReportAttrs","fragmentLength","firstFragment","lastSn","log","logPrefix","mediaBuffer","noFowardBuffer","state","tolerance","fragStartOffset","fragEndOffset","pastFragment","shouldLoadParts","keyLoader","startPosition","nextLoadPosition","timelineStart","bufferedRanges","lastPart","configuredTimelineOffset","transferringMedia","targetBufferTime","bufferedInfo","minForwardBufferLength","backtrackFragment","startOffset","endOffset","flushScope","decryptedData","_tracks$audio","_tracks$video","transmuxer","fragLoadedEndData","complete","partsLoaded","fragLoaded","chunkMeta","_frag$decryptdata","keyLoadingPromise","keyLoadedData","progressCallback","_result","dataOnProgress","fragLoadedData","initialPartList","loadPart","loadedPart","nextPart","fromPart","firstPart","offsetTimestamp","noBacktracking","fragDuration","segmentFraction","_this$media2","maxBufferHole","bufferable","bufferedFragAtPos","gapDuration","maxBufLen","minLength","threshold","reducedLength","fragOrPart","fragLen","canLoadParts","initialLiveManifestSize","mainStart","liveSyncPosition","programFrag","curSNIdx","trackerState","nextFragment","nextbufferInfo","_this$hls$interstitia","interstitials","bufferingItem","bufferingInterstitial","playerQueue","contiguous","independentAttrOmitted","targetSN","liveStart","loadingParts","_this$media3","lookupTolerance","fragState","nextFrag","endSN","slidingStart","firstLevelLoad","previousDetails","aligned","alignedSlidingStart","timelineOffset","offsetInMultivariantPlaylist","filterType","gapTagEncountered","couldRetry","noAlternate","offlineStatus","delay","retryDate","waitingForConnection","flushBuffer","bufferedTimeRanges","bufferType","parsedDuration","mediaNotFound","_this$transmuxer2","previousState","nextState","\"audioId3\"","\"dateRange\"","\"emsg\"","\"misbklv\"","MetadataSchema2","deaultTimestamp","lastDataIndex","id3Track","partialData","cachedData","trackDuration","mask","bits","shift","videoTrack","captionTrack","videoSamples","segmentedData","emsgs","encryptedData","curUnit","encryptedBuffer","decryptedBuffer","encryptedDataLen","decodedData","outputPos","inputPos","uint8DecryptedData","unitIndex","curUnits","_VideoSample","VideoSample","lastUnit","units","nbSamples","lastSample","lastState","overflow","unitType","lastUnitStart","lastUnitType","bytesAvailable","workingBytes","availableBytes","skipBytes","count","valu","leadingZeroCount","clz","pes","endOfSegment","push2","spsfound","_VideoSample2","_VideoSample3","iskey","sliceType","sps","codecarray","codecstring","eg","lastScale","nextScale","deltaScale","reader","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","numRefFramesInPicOrderCntCycle","scalingListCount","readUByte","readBits","readUEG","readBoolean","skipBits","skipEG","skipUEG","skipScalingList","profileIdc","chromaFormatIdc","picOrderCntType","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","pixelRatio","prop","vps","parameterSets","dst","dstIdx","max_sub_layers_minus1","temporal_id_nesting_flag","general_profile_space","general_tier_flag","general_profile_idc","general_profile_compatibility_flags_1","general_profile_compatibility_flags_2","general_profile_compatibility_flags_3","general_profile_compatibility_flags_4","general_constraint_indicator_flags_1","general_constraint_indicator_flags_2","general_constraint_indicator_flags_3","general_constraint_indicator_flags_4","general_constraint_indicator_flags_5","general_constraint_indicator_flags_6","general_level_idc","sub_layer_profile_present_flags","sub_layer_level_present_flags","chroma_format_idc","pic_width_in_luma_samples","pic_height_in_luma_samples","conformance_window_flag","pic_left_offset","pic_right_offset","pic_top_offset","pic_bottom_offset","bit_depth_luma_minus8","bit_depth_chroma_minus8","log2_max_pic_order_cnt_lsb_minus4","sub_layer_ordering_info_present_flag","sizeId","matrixId","coefNum","num_short_term_ref_pic_sets","num_delta_pocs","inter_ref_pic_set_prediction_flag","next_num_delta_pocs","used_by_curr_pic_flag","use_delta_flag","num_negative_pics","num_positive_pics","num_long_term_ref_pics_sps","min_spatial_segmentation_idc","sar_width","sar_height","fps_fixed","fps_den","fps_num","default_display_window_flag","aspect_ratio_idc","nal_hrd_parameters_present_flag","vcl_hrd_parameters_present_flag","sub_pic_hrd_params_present_flag","fixed_pic_rate_within_cvs_flag","low_delay_hrd_flag","cpb_cnt","chroma_scale_w","chroma_scale_h","profile_space_string","profile_compatibility_buf","profile_compatibility_rev","profile_compatibility_flags_string","pps","tiles_enabled_flag","entropy_coding_sync_enabled_flag","parallelismType","sps1","sps2","syncOffset","scanwindow","foundPat","packetStart","tsPackets","_audioTrack","_videoTrack","_id3Track","videoPid","audioPid","id3Pid","audioData","unknownPID","pmtParsed","pmtId","flush","tsPacketErrors","stt","atf","parsedPIDs","demuxResult","sampleAes","aacOverFlow","frameMissingBytes","sampleLength","frameOverflowBytes","recoverable","frameDuration","id3Sample","videoHdlr","audioHdlr","dref","stco","majorBrand","avc1Brand","minorVersion","upperWordDuration","lowerWordDuration","sequenceNumber","baseMediaDecodeTime","boxes","avcc","hSpacing","vSpacing","segmentCodec","sampleDependencyTable","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","arraylen","cts","movie","ps","hvcC","iMax","hvcc","defaultTimeStamp","rolloverDetected","firstPts","minPTS","id3","independent","audioTimeOffset","videoTimeOffset","hasAudio","enoughAudioSamples","enoughVideoSamples","accurateTimeOffset","isVideoContiguous","firstKeyFrameIndex","firstKeyFramePTS","audiovideoTimestampDelta","audioTrackLength","basetime","audioSamples","_initPTS","computePTSDTS","container","basePTS","baseDTS","videoInitDTS","videoInitPTS","inputSamples","outputSamples","initTime","nextVideoTs","mp4SampleDuration","firstDTS","lastDTS","maxPTS","sortSamples","nextVideoPts","deltadts","deltapts","inputDuration","averageSampleDuration","foundHole","foundOverlap","firstPTS","isPTSOrderRetained","prevPTS","nextSamplePTS","nbNalu","naluLen","dtsStep","nbUnits","sampleLen","mdatSize","stretchedLastFrame","minDtsDelta","minPtsDelta","maxDtsDelta","maxPtsDelta","VideoSampleUnits","mp4SampleLength","unitData","unitDataLen","ptsDelta","lastFrameDuration","gapTolerance","deltaToFrameEnd","compositionTimeOffset","dts","nextDts","nextPts","scaleFactor","inputSampleDuration","rawMPEG","alignedWithVideo","nextAudioTs","timeOffsetMpegTS","maxAudioFramesDrift","fillFrame","lastPTS","_nbSamples","audioSample","prevSample","unitLen","defaultInitPTS","eitherTrack","_initData","_initData2","lastEndTime","trackSampleData","audioSampleTimestamps","videoSampleTimestamps","videoStartTime","audioStartTime","videoEndTime","audioEndTime","decodeTime","syncOnAudio","baseOffsetSamples","videoSampleCount","firstKeyFrame","transmuxConfig","uintData","currentTransmuxState","decrypter","_data","result2","resetMuxers","discontinuity","trackSwitch","initSegmentChange","initSegmentData","defaultInitPts","currentState","decryptionPromise","transmuxResults","demuxer","remuxer","emptyResults","demuxResultOrPromise","remuxResult","mux","_muxConfig$i$demux","Remuxer","Demuxer","onTransmuxComplete","onFlush","forwardMessage","ev","m2tsTypeSupported","instanceNo","lastFrag","snDiff","partDiff","progressive","transmuxResult","inFlightFrag","waitingData","mainFragLoading","waitingToAppend","targetDiscontinuity","mainAnchor","syncFrag","lastCurrentTime","skipSeekToStartPosition","currenTrack","trackDetails","loadPosition","mainFragAtPos","audioTracks","mediaPlaylist","altAudio","cachedTrackLoadedData","_trackLevel$details","mainDetails","trackLevel","_id3$samples","mapFragment","emittedID3","emittedText","variantAudioCodecs","_track$details","switchingTrack","renditionReports","foundIndex","playlistUri","currentGoal","current","playlist","hlsUrlParameters","elapsed","levelOrTrack","deliveryDirectives","lowLatencyMode","lastPartSn","endSn","lastPartIndex","hasParts","atLastPartOfSegment","lastAdvanced","cdnAge","segments","updatedDetails","requestScheduled","estimatedTimeUntilUpdate","previousDeliveryDirectives","errorEvent","_errorEvent$context","trackInActiveGroup","curDetails","currentGroups","currentTrack","groupIndex","allIndex","audioTracksUpdated","selectedTrackId","newId","audioOption","switchIndex","withoutCodecAndChannelsMatch","lastTrack","trackLoaded","sourceBufferReference","queue","operation","pending","op","sb","queues","_this$queues2","_this$tracks","mediaSrc","_objectUrl","updating","queued","transferData","tuple","_this$transferData","codecEvents","ms","objectUrl","MMS","transferredTracks","mediaSourceOpenCallback","trackName","sbIndex","sbTuple","readyState","open","sourceBuffers","_this$mediaSource3","unmuxedToMuxed","muxedToUnmuxed","sbName","_this$transferData3","transferredTrack","sbTrack","sbCodec","trackLevelCodec","currentCodecFull","currentCodec","trackCodec","nextCodec","baseTracks","pStart","partOrFrag","pTime","blockedAudioAppend","operationQueue","eventData","chunkStats","bufferAppendingStart","fragBuffering","partBuffering","checkTimestampOffset","videoSb","vbuffered","vappending","videoAppendEnd","audioStart","fragStart","type2","event2","mediaError","appendErrorCount","buffersAppendedTo","allowEndOfStream","_this$tracks$type3","durationAndRange","targetDuration","backBufferLength","maxBackBufferLength","targetBackBufferPosition","frontBufferFlushThreshold","frontBufferLength","maxFrontBufferLength","targetFrontBufferPosition","_this$details","numBufferedRanges","overrideDuration","mediaDuration","pendingTrackCount","bufferCodecEventsTotal","_this$operationQueue","supplementalCodec","removedRanges","_this$media2$querySel","timestampOffset","msDuration","removeStart","removeEnd","bufferNames","onUnblocked","blockingOperations","streamController","maxLevel","validLevels","capLevelIndex","boundsRect","clientRect","restrictedLevel","atGreatestBandwidth","curLevel","maxLevelIndex","squareSize","norValue","ot","next","isVideo","includeKeys","_this$hls$levels$frag2","max","apply","Ctor","pLoader","fLoader","pathways","pathwayPriority","ttl","levelToRemove","contentSteering","errorPathway","pathwayId","pathwayLevels","penalizedPathways","selectedIndex","selectedLevel","levelAfterChange","defaultPathway","audioGroupCloneMap","subtitleGroupCloneMap","pathwayClones","baseId","pathwayClone","clonedVariants","baseLevel","clonedAudioGroupId","clonedSubtitleGroupId","clonedLevel","Loader","throughput","legacyRetryCompatibility","steeringData","reloadUri","context2","loadedSteeringData","retryAfter","ttlMs","logMessage","initDataType","keySystems","keySystemFormat","json","keyIdHex","keySessionContextPromise","keyIdToKeySessionPromise","mediaKeySessions","oldKeyIdHex","keySystemConfiguration","uniqueCodec","attempt","requestMediaKeySystemAccessFunc","errMessage","supportedConfigurations","mediaKeySystemConfigs","keySystemAccessPromises","keySystemAccess","keySystemAccessPromisesNew","mediaKeySystemAccess","certificateRequest","mediaKeys","certificate","mediaKeys2","mediaKeySessionContext","keySessionContext","keySession","hasMediaKeys","keySystemsInConfig","status2","badStatus","keyDetails","keyContextPromise","clonedError","setMediaKeysPromise","_this$config$drmSyste","generateRequestFilter","mappedInitData","keyUri","licenseStatus","onmessage","messageType","handleKeyStatus","keyError","onkeystatuseschange","keyStatuses","_context$keyStatusTim","timeout","sessionKeyStatus","keyUsablePromise","originKeyIdWithStatusChange","keyIdWithStatusChange","certLoader","cert","success","keyMessage","xmlString","licenseChallenge","xhr","keyMessageXml","challengeText","licenseXhrSetup","keysListItem","licenseXhrSetupResult","licenseResponseCallback","maxNumRetry","attemptsLeft","xhr2","licenseChallenge2","mediaResolved","_media$setMediaKeys","mediaKeysList","keySessionCount","sessionKeys","formats","mediaKeysSession","licenseXhr","keyStatusTimeouts","decodedFrames","currentPeriod","currentDropped","droppedFrames","currentDecoded","droppedFPS","videoPlaybackQuality","subtitleTracks","subtitlePreference","subtitleTracksUpdated","selectDefault","subtitleOption","allSubtitleTracks","textTracks","nextTrack","\"Point\"","\"Range\"","TimelineOccupancy2","_this$assetListLoader","assetIndex","playoutLimit","resumeOffset","resumeTime","HlsPlayerClass","assetItem","detailsLoaded","bufferedEnd","_this$hls2","assetPlayout","diff","_this$hls5","_this$hls6","_this$hls7","_this$hls8","_this$hls9","deleteDetails","_this$hls1","_this$hls10","_this$hls11","onScheduleUpdate","items","_items$index","timelineType","timelinePos","assetList","_this$items","interstitialAtEnd","assetAtEnd","mediaSelection","previousInterstitialEvents","interstitialEvents","enableAppendInPlace","ids","removedInterstitials","aPre","aPost","bPre","bPost","startA","startB","currentItems","updatedItems","forceUpdate","baseData","schedule","primaryDuration","playoutDuration","primaryPosition","integratedTime","preroll","postroll","previousEvent","appendInPlace","eventStart","interstitialDuration","timelineDuration","resumptionOffset","inSameStartTimeSequence","integratedStart","playoutStart","segmentDuration","_integratedStart","_playoutStart","primarySegment","cumulativeDuration","lastScheduledStart","resumesInPlaceAt","startFragment","allowance","sumDuration","hasUnknownDuration","hasErrors","assetListUrl","hlsStartOffset","assetListResponse","assets","networkDetails","backwardSeek","playingItem","_this$media","playingIndex","scheduleIndex","jumpIndex","playingAsset","restartAsset","_playingItem$event","scheduleItems","durations","removedIds","interstitialsUpdated","previousItems","updatedPlayingItem","updatedBufferingItem","player","_this$getBufferingPla","_this$getBufferingPla2","detachedMedia","effectiveBufferingItem","getAssetPlayer","getMappedTime","assetPlayer","assetPlayerField","controllerField","getBufferedEnd","findMappedTime","_c$schedule","primaryTime","getMappedDuration","_c$primaryDetails","seekTo","_item$event","targetIndex","targetItem","bufferingPlayer","seekInItem","seekToTime","targetIsPrimary","eventTime","getActiveInterstitial","interstitialPlayer","interstitialItem","_c$schedule3","_c$schedule4","_this$bufferingItem","queuedForPlayback","assetId","toSegment","playerMedia","attachMediaSourceData","primaryPlayer","isAssetPlayer","detachedMediaSource","logFromSource","queuedPlayer","transferring","dataToAttach","isAssetAtEndOfSchedule","effectivePlayingItem","nextAssetIndex","nextItem","nextIndex","resumptionTime","parentIdentifier","itemIndex","scheduledItem","currentItem","playingLastItem","_this$detachedData3","playingAssetListIndex","updatedScheduleItems","updatedIndex","queuedIndex","assetIndexCandidate","waitingItem","assetListLength","playedLastItem","_this$primaryDetails","_this$detachedData4","fromItem","itemStart","_this$schedule5","currentSelection","previousSelection","subtitles","previousItem","updatedItem","itemBeforeUpdate","flushStart","_this$schedule7","starved","bufferEndIndex","_nextItemToBuffer$eve","bufferingIndex","nextToBufferIndex","nextItemToBuffer","bufferIsEmpty","bufferingLast","isInterstitial","timeRemaining","bufferIndex","detachedData","neverLoaded","playOnce","_playingItem$nextEven","liveStartPosition","assetListLoader","_asset","playerIndex","primaryMedia","primary","selectedAudio","selectedSubtitle","timePastStart","playerConfig","initialDuration","updateAssetPlayerDetails","currentAssetDuration","onBufferCodecs","inQueuPlayer","endedWithAssetIndex","appendInPlaceNext","activeTracks","foundAssetIndex","stallingAsset","assetCurrentTime","distanceFromEnd","interstitialAssetError","bufferingAsset","errorMessage","newPlayingItem","_this$schedule0","interstitialId","previousDuration","waitingForItem","bufferingEvent","stallingItem","fragEnd","endOffsetSubtitles","_this$levels","mainSlidingStartFragment","currentTrackId","foundFrag","fragToLoad","getRange","timeranges","severity","hexArray","numArray","attribs","other","newPenState","uchar","newChar","empty","absPos","newPos","relPos","char","startPos","chars","equal","pacData","newRow","topRowIndex","lastOutputScreen","prevLineTime","row","indent","prevPos","bkgData","nrRows","topRow","displayText","rowNr","rowText","asOneRow","channelNumber","outputFilter","newHandler","newMode","screen","tmp","nrCols","secondByte","dispatch","out1","out2","channel","byteList","cmdFound","charsFound","currChNr","chNr","pacIndex","channelNr","charCodes","charCode1","oneCode","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","defaultKey","dflt","percent","_this","collectNextLine","parseHeader2","alreadyCollectedLine","hasSubstring","inputString","searchString","timeString","secs","mins","hours","prevCC","_prevCC","timelineController","channel1","channel2","channel3","channel4","merged","cueRanges","cueRange","overlap","unparsedVttFrags","language","captionsProperties","existingTrack","languageCode","captionsTracks","trackProperties","kind","hasIMSC1","inUseTracks","textTrackKind","unusedTextTracks","tracksList","instreamIdMatch","captionsTrack","cea608Parser1","cea608Parser2","decrypted","trackPlaylistMedia","_frag$initSegment","maxAvCC","missingInitPTS","fragLevel","ccBytes","ccdatas","actualCCBytes","tmpByte","ccbyte1","ccbyte2","ccType","indenting","captionScreen","_track$cues","cueA","cueB","_this$callbacks","isArrayBuffer","LENGTH","maxTimeToFirstByteMs","maxLoadTimeMs","first","statusText","_this$callbacks4","responseData","_this$callbacks5","code","ageHeader","chunkCache","pump","highWaterMark","xhrSetup","_this$callbacks2","useResponseText","_response","seeked","seeking","beginSeek","pausedEndedOrHalted","inFlightDependency","hasEnoughBuffer","noBufferHole","startJump","maxStartGapJump","appended","detectStallWithCurrentTimeMs","tnow","tWaiting","stalled","stalledDuration","bufferedWithHoles","_this$buffered$audio","videoSourceBuffered","audioBufferInfo","videoTimes","lastBufferedIndex","holeStart","holeEnd","adjacentTraversal","stalledDurationMs","stallReported","bufferStarved","waiting","gapLength","startGap","startFrag","_this$hls$loadLevelOb","moreToLoad","provisioned","targetTime","nudgeRetry","enableEmsgMetadataCues","enableID3MetadataCues","enableDateRangeMetadataCues","assetPlayerId","interstitialsController","fragmentStart","fragmentEnd","dateRangeCuesAppended","removeOldCues","_id3Track$cues","idsToRemove","appendedDateRangeCues","durationKnown","nextDateRangeWithSameClass","id2","otherDateRange","candidateDateRange","latency","maxLiveSyncPlaybackRate","targetLatency","distanceFromTarget","rate","partHoldBack","holdBack","liveSyncDuration","liveSyncDurationCount","targetduration","maxLiveSyncOnStallIncrease","liveEdge","syncPosition","min","maxLevelUpdateAge","_this$levelDetails","contentSteeringController","redundantSet","generatePathwaySet","resolutionFound","videoCodecFound","audioCodecFound","levelParsed","unknownUnsupportedCodecCount","unknownCodecs","FRAMERATE","HDCP","PATHWAY","VIDEO_RANGE","RESOLUTION","CODECS","pathwayCount","filteredLevels","statsParsing","unsortedLevels","valueA","valueB","firstLevelInPlaylist","firstLevelBitrate","bandwidthEstimate","startingBwEstimate","audioOnly","altAudioEnabled","edata","newLevel","fatal","lastLevelIndex","lastLevel","lastPathwayId","levelSwitchingData","configStartLevel","pathwaysList","filteredPathwayPriority","_data$deliveryDirecti2","_data$deliveryDirecti","currentLevelIndex","_this$currentLevel","startLevel","levelLastLoaded","lastDetails","backtrackFrag","fetchdelay","fragPlayingCurrent","fragLastKbps","bufferedFrag","nextBufferedFrag","maxStart","startPts","aac","heaac","_curLevel$details","newLevelId","startFragRequested","withinSlidingWindow","maxLatency","_bufferInfo$buffered","fromAltAudio","videoBuffer","mediaTrack","alternate","bufferedMainFragment","skipTolerance","isFirstFragment","isFirstInDiscontinuity","audioMetadata","parsedVideoCodec","audiovideo","trackTypes","bufferOutput","fragPlaying","fragCurrentLevel","programDateTime","epocMs","keyInfo","loadingFrag","_keyInfo","_keyInfo2","keyInfo2","frag2","PLoader","contextType","lvl","partTarget","maxLowLatencyPlaylistRefresh","loader2","autoStartLoad","forceStartLoad","parsedResult","unknownCodec","captions","levelId","singleLevel","_error","_AbrController","_BufferController","_CapLevelController","_ErrorController","_FpsController","errorController","abrController","_InterstitialsController","bufferController","capLevelController","fpsController","playListLoader","_ContentSteeringController","levelController","id3TrackController","gapController","networkControllers","coreComponents","AudioStreamControllerClass","SubtitleStreamControllerClass","onErrorOut","ControllerClass","controllerInstance","components","eventObject","component","attachMediaSource","attachingData","transferMedia","loadedSource","loadingSource","controller","_sessionId","newCapLevelToPlayerSize","shouldStartCapping","bwEstimator","minAutoBitrate","autoLevelCapping","maxHdcpLevel","hdcpLevel","audioTrackController","audioTrackId","subtitleTrackController","subtitleTrackId","_this$bufferControlle","hls_exports","init_hls"],"sources":["https:/cdn.skypack.dev/-/hls.js@v1.6.15-ccKNDzX7weyANgSOjMNp/dist=es2019,mode=imports/optimized/hlsjs.js","https:/cdn.skypack.dev/hls.js"],"sourcesContent":["const 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 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[\"KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR\"] = \"keySystemDestroyMediaKeysError\";\n  ErrorDetails2[\"KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR\"] = \"keySystemDestroyCloseSessionError\";\n  ErrorDetails2[\"KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR\"] = \"keySystemDestroyRemoveSessionError\";\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[\"ASSET_LIST_LOAD_ERROR\"] = \"assetListLoadError\";\n  ErrorDetails2[\"ASSET_LIST_LOAD_TIMEOUT\"] = \"assetListLoadTimeout\";\n  ErrorDetails2[\"ASSET_LIST_PARSING_ERROR\"] = \"assetListParsingError\";\n  ErrorDetails2[\"INTERSTITIAL_ASSET_ITEM_ERROR\"] = \"interstitialAssetItemError\";\n  ErrorDetails2[\"INTERNAL_EXCEPTION\"] = \"internalException\";\n  ErrorDetails2[\"INTERNAL_ABORTED\"] = \"aborted\";\n  ErrorDetails2[\"ATTACH_MEDIA_ERROR\"] = \"attachMediaError\";\n  ErrorDetails2[\"UNKNOWN\"] = \"unknown\";\n  return ErrorDetails2;\n}({});\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[\"MEDIA_ENDED\"] = \"hlsMediaEnded\";\n  Events2[\"STALL_RESOLVED\"] = \"hlsStallResolved\";\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[\"BUFFERED_TO_END\"] = \"hlsBufferedToEnd\";\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[\"AUDIO_TRACK_UPDATED\"] = \"hlsAudioTrackUpdated\";\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_TRACK_UPDATED\"] = \"hlsSubtitleTrackUpdated\";\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  Events2[\"ASSET_LIST_LOADING\"] = \"hlsAssetListLoading\";\n  Events2[\"ASSET_LIST_LOADED\"] = \"hlsAssetListLoaded\";\n  Events2[\"INTERSTITIALS_UPDATED\"] = \"hlsInterstitialsUpdated\";\n  Events2[\"INTERSTITIALS_BUFFERED_TO_BOUNDARY\"] = \"hlsInterstitialsBufferedToBoundary\";\n  Events2[\"INTERSTITIAL_ASSET_PLAYER_CREATED\"] = \"hlsInterstitialAssetPlayerCreated\";\n  Events2[\"INTERSTITIAL_STARTED\"] = \"hlsInterstitialStarted\";\n  Events2[\"INTERSTITIAL_ASSET_STARTED\"] = \"hlsInterstitialAssetStarted\";\n  Events2[\"INTERSTITIAL_ASSET_ENDED\"] = \"hlsInterstitialAssetEnded\";\n  Events2[\"INTERSTITIAL_ASSET_ERROR\"] = \"hlsInterstitialAssetError\";\n  Events2[\"INTERSTITIAL_ENDED\"] = \"hlsInterstitialEnded\";\n  Events2[\"INTERSTITIALS_PRIMARY_RESUMED\"] = \"hlsInterstitialsPrimaryResumed\";\n  Events2[\"PLAYOUT_LIMIT_REACHED\"] = \"hlsPlayoutLimitReached\";\n  Events2[\"EVENT_CUE_ENTER\"] = \"hlsEventCueEnter\";\n  return Events2;\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};\nclass EWMA {\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  get defaultEstimate() {\n    return this.defaultEstimate_;\n  }\n  destroy() {\n  }\n}\nfunction _defineProperty(e, r, t) {\n  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: true,\n    configurable: true,\n    writable: true\n  }) : e[r] = t, e;\n}\nfunction _extends() {\n  return _extends = Object.assign ? Object.assign.bind() : function(n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t)\n        ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, _extends.apply(null, arguments);\n}\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 = arguments[r] != null ? 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 (typeof t != \"object\" || !t)\n    return t;\n  var e = t[Symbol.toPrimitive];\n  if (e !== void 0) {\n    var i = e.call(t, r);\n    if (typeof i != \"object\")\n      return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (r === \"string\" ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n  var i = _toPrimitive(t, \"string\");\n  return typeof i == \"symbol\" ? i : i + \"\";\n}\nclass Logger {\n  constructor(label, logger2) {\n    this.trace = void 0;\n    this.debug = void 0;\n    this.log = void 0;\n    this.warn = void 0;\n    this.info = void 0;\n    this.error = void 0;\n    const lb = `[${label}]:`;\n    this.trace = noop;\n    this.debug = logger2.debug.bind(null, lb);\n    this.log = logger2.log.bind(null, lb);\n    this.warn = logger2.warn.bind(null, lb);\n    this.info = logger2.info.bind(null, lb);\n    this.error = logger2.error.bind(null, lb);\n  }\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};\nfunction createLogger() {\n  return _extends({}, fakeLogger);\n}\nfunction consolePrintFn(type, id) {\n  const func = self.console[type];\n  return func ? func.bind(self.console, `${id ? \"[\" + id + \"] \" : \"\"}[${type}] >`) : noop;\n}\nfunction getLoggerFn(key, debugConfig, id) {\n  return debugConfig[key] ? debugConfig[key].bind(debugConfig) : consolePrintFn(key, id);\n}\nconst exportedLogger = createLogger();\nfunction enableLogs(debugConfig, context, id) {\n  const newLogger = createLogger();\n  if (typeof console === \"object\" && debugConfig === true || typeof debugConfig === \"object\") {\n    const keys = [\n      \"debug\",\n      \"log\",\n      \"info\",\n      \"warn\",\n      \"error\"\n    ];\n    keys.forEach((key) => {\n      newLogger[key] = getLoggerFn(key, debugConfig, id);\n    });\n    try {\n      newLogger.log(`Debug logs enabled for \"${context}\" in hls.js version ${\"1.6.15\"}`);\n    } catch (e) {\n      return createLogger();\n    }\n    keys.forEach((key) => {\n      exportedLogger[key] = getLoggerFn(key, debugConfig);\n    });\n  } else {\n    _extends(exportedLogger, newLogger);\n  }\n  return newLogger;\n}\nconst logger = exportedLogger;\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}\nfunction isManagedMediaSource(source) {\n  return typeof self !== \"undefined\" && source === self.ManagedMediaSource;\n}\nfunction isCompatibleTrackChange(currentTracks, requiredTracks) {\n  const trackNames = Object.keys(currentTracks);\n  const requiredTrackNames = Object.keys(requiredTracks);\n  const trackCount = trackNames.length;\n  const requiredTrackCount = requiredTrackNames.length;\n  return !trackCount || !requiredTrackCount || trackCount === requiredTrackCount && !trackNames.some((name) => requiredTrackNames.indexOf(name) === -1);\n}\nfunction utf8ArrayToStr(array, exitOnNull = false) {\n  if (typeof TextDecoder !== \"undefined\") {\n    const decoder = new TextDecoder(\"utf-8\");\n    const decoded = decoder.decode(array);\n    if (exitOnNull) {\n      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}\nfunction arrayToHex(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}\nfunction hexToArrayBuffer(str) {\n  return Uint8Array.from(str.replace(/^0x/, \"\").replace(/([\\da-fA-F]{2}) ?/g, \"0x$1 \").replace(/ +$/, \"\").split(\" \")).buffer;\n}\nfunction getDefaultExportFromCjs(x) {\n  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, \"default\") ? x[\"default\"] : x;\n}\nvar urlToolkit = {exports: {}};\nvar hasRequiredUrlToolkit;\nfunction requireUrlToolkit() {\n  if (hasRequiredUrlToolkit)\n    return urlToolkit.exports;\n  hasRequiredUrlToolkit = 1;\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        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(basePartsForNormalise.path);\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            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);\n  return urlToolkit.exports;\n}\nvar urlToolkitExports = requireUrlToolkit();\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(base) {\n    this._byteRange = null;\n    this._url = null;\n    this._stats = null;\n    this._streams = null;\n    this.base = void 0;\n    this.relurl = void 0;\n    if (typeof base === \"string\") {\n      base = {\n        url: base\n      };\n    }\n    this.base = base;\n    makeEnumerable(this, \"stats\");\n  }\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 baseurl() {\n    return this.base.url;\n  }\n  get byteRange() {\n    if (this._byteRange === null) {\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 elementaryStreams() {\n    if (this._streams === null) {\n      this._streams = {\n        [ElementaryStreamTypes.AUDIO]: null,\n        [ElementaryStreamTypes.VIDEO]: null,\n        [ElementaryStreamTypes.AUDIOVIDEO]: null\n      };\n    }\n    return this._streams;\n  }\n  set elementaryStreams(value) {\n    this._streams = value;\n  }\n  get hasStats() {\n    return this._stats !== null;\n  }\n  get hasStreams() {\n    return this._streams !== null;\n  }\n  get stats() {\n    if (this._stats === null) {\n      this._stats = new LoadStats();\n    }\n    return this._stats;\n  }\n  set stats(value) {\n    this._stats = value;\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  clearElementaryStreamInfo() {\n    const {\n      elementaryStreams\n    } = this;\n    elementaryStreams[ElementaryStreamTypes.AUDIO] = null;\n    elementaryStreams[ElementaryStreamTypes.VIDEO] = null;\n    elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;\n  }\n}\nfunction isMediaFragment(frag) {\n  return frag.sn !== \"initSegment\";\n}\nclass Fragment extends BaseSegment {\n  constructor(type, base) {\n    super(base);\n    this._decryptdata = null;\n    this._programDateTime = null;\n    this._ref = null;\n    this._bitrate = void 0;\n    this.rawProgramDateTime = 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.playlistOffset = 0;\n    this.deltaPTS = void 0;\n    this.maxStartPTS = void 0;\n    this.minEndPTS = void 0;\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 byteLength() {\n    if (this.hasStats) {\n      const total = this.stats.total;\n      if (total) {\n        return total;\n      }\n    }\n    if (this.byteRange.length) {\n      const start = this.byteRange[0];\n      const end = this.byteRange[1];\n      if (isFiniteNumber(start) && isFiniteNumber(end)) {\n        return end - start;\n      }\n    }\n    return null;\n  }\n  get bitrate() {\n    if (this.byteLength) {\n      return this.byteLength * 8 / this.duration;\n    }\n    if (this._bitrate) {\n      return this._bitrate;\n    }\n    return null;\n  }\n  set bitrate(value) {\n    this._bitrate = value;\n  }\n  get decryptdata() {\n    var _this$_decryptdata;\n    const {\n      levelkeys\n    } = this;\n    if (!levelkeys || levelkeys.NONE) {\n      return null;\n    }\n    if (levelkeys.identity) {\n      if (!this._decryptdata) {\n        this._decryptdata = levelkeys.identity.getDecryptData(this.sn);\n      }\n    } else if (!((_this$_decryptdata = this._decryptdata) != null && _this$_decryptdata.keyId)) {\n      const keyFormats = Object.keys(levelkeys);\n      if (keyFormats.length === 1) {\n        const levelKey = this._decryptdata = levelkeys[keyFormats[0]] || null;\n        if (levelKey) {\n          this._decryptdata = levelKey.getDecryptData(this.sn, levelkeys);\n        }\n      }\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    const duration = !isFiniteNumber(this.duration) ? 0 : this.duration;\n    return this.programDateTime + duration * 1e3;\n  }\n  get encrypted() {\n    var _this$_decryptdata2;\n    if ((_this$_decryptdata2 = this._decryptdata) != null && _this$_decryptdata2.encrypted) {\n      return true;\n    } else if (this.levelkeys) {\n      var _this$levelkeys$keyFo;\n      const keyFormats = Object.keys(this.levelkeys);\n      const len = keyFormats.length;\n      if (len > 1 || len === 1 && (_this$levelkeys$keyFo = this.levelkeys[keyFormats[0]]) != null && _this$levelkeys$keyFo.encrypted) {\n        return true;\n      }\n    }\n    return false;\n  }\n  get programDateTime() {\n    if (this._programDateTime === null && this.rawProgramDateTime) {\n      this.programDateTime = Date.parse(this.rawProgramDateTime);\n    }\n    return this._programDateTime;\n  }\n  set programDateTime(value) {\n    if (!isFiniteNumber(value)) {\n      this._programDateTime = this.rawProgramDateTime = null;\n      return;\n    }\n    this._programDateTime = value;\n  }\n  get ref() {\n    if (!isMediaFragment(this)) {\n      return null;\n    }\n    if (!this._ref) {\n      this._ref = {\n        base: this.base,\n        start: this.start,\n        duration: this.duration,\n        sn: this.sn,\n        programDateTime: this.programDateTime\n      };\n    }\n    return this._ref;\n  }\n  addStart(value) {\n    this.setStart(this.start + value);\n  }\n  setStart(value) {\n    this.start = value;\n    if (this._ref) {\n      this._ref.start = value;\n    }\n  }\n  setDuration(value) {\n    this.duration = value;\n    if (this._ref) {\n      this._ref.duration = value;\n    }\n  }\n  setKeyFormat(keyFormat) {\n    const levelkeys = this.levelkeys;\n    if (levelkeys) {\n      var _this$_decryptdata3;\n      const key = levelkeys[keyFormat];\n      if (key && !((_this$_decryptdata3 = this._decryptdata) != null && _this$_decryptdata3.keyId)) {\n        this._decryptdata = key.getDecryptData(this.sn, levelkeys);\n      }\n    }\n  }\n  abortRequests() {\n    var _this$loader, _this$keyLoader;\n    (_this$loader = this.loader) == null || _this$loader.abort();\n    (_this$keyLoader = this.keyLoader) == null || _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}\nclass Part extends BaseSegment {\n  constructor(partAttrs, frag, base, index, previous) {\n    super(base);\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.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}\nfunction getOwnPropertyDescriptorFromPrototypeChain(object, property) {\n  const prototype = Object.getPrototypeOf(object);\n  if (prototype) {\n    const propertyDescriptor = Object.getOwnPropertyDescriptor(prototype, property);\n    if (propertyDescriptor) {\n      return propertyDescriptor;\n    }\n    return getOwnPropertyDescriptorFromPrototypeChain(prototype, property);\n  }\n}\nfunction makeEnumerable(object, property) {\n  const d = getOwnPropertyDescriptorFromPrototypeChain(object, property);\n  if (d) {\n    d.enumerable = true;\n    Object.defineProperty(object, property, d);\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 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 version2 = 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 (version2 === 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      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: version2,\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 version2 = tkhd[0];\n      const trackId = readUint32(tkhd, version2 === 0 ? 12 : 20);\n      const mdhd = findBox(trak, [\"mdia\", \"mdhd\"])[0];\n      if (mdhd) {\n        version2 = mdhd[0];\n        const timescale = readUint32(mdhd, version2 === 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          const stsdBox = findBox(trak, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0];\n          const stsd = parseStsd(stsdBox);\n          if (type) {\n            result[trackId] = {\n              timescale,\n              type,\n              stsd\n            };\n            result[type] = _objectSpread2({\n              timescale,\n              id: trackId\n            }, stsd);\n          } else {\n            result[trackId] = {\n              timescale,\n              type: hdlrType,\n              stsd\n            };\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  let supplemental;\n  const encrypted = fourCC === \"enca\" || fourCC === \"encv\";\n  if (encrypted) {\n    const encBox = findBox(sampleEntries, [fourCC])[0];\n    const encBoxChildren = encBox.subarray(fourCC === \"enca\" ? 28 : 78);\n    const sinfs = findBox(encBoxChildren, [\"sinf\"]);\n    sinfs.forEach((sinf) => {\n      const schm = findBox(sinf, [\"schm\"])[0];\n      if (schm) {\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  const codecFourCC = codec;\n  switch (codec) {\n    case \"avc1\":\n    case \"avc2\":\n    case \"avc3\":\n    case \"avc4\": {\n      const avcCBox = findBox(sampleEntriesEnd, [\"avcC\"])[0];\n      if (avcCBox && avcCBox.length > 3) {\n        codec += \".\" + toHex(avcCBox[1]) + toHex(avcCBox[2]) + toHex(avcCBox[3]);\n        supplemental = parseSupplementalDoViCodec(codecFourCC === \"avc1\" ? \"dva1\" : \"dvav\", sampleEntriesEnd);\n      }\n      break;\n    }\n    case \"mp4a\": {\n      const codecBox = findBox(sampleEntries, [fourCC])[0];\n      const esdsBox = findBox(codecBox.subarray(28), [\"esds\"])[0];\n      if (esdsBox && esdsBox.length > 7) {\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      if (hvcCBox && hvcCBox.length > 12) {\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 += \".\" + reverse32BitInt(profileCompat).toString(16).toUpperCase();\n        codec += \".\" + tierFlag + levelIDC;\n        let constraintString = \"\";\n        for (let i = constraintIndicator.length; i--; ) {\n          const byte = constraintIndicator[i];\n          if (byte || constraintString) {\n            const encodedByte = byte.toString(16).toUpperCase();\n            constraintString = \".\" + encodedByte + constraintString;\n          }\n        }\n        codec += constraintString;\n      }\n      supplemental = parseSupplementalDoViCodec(codecFourCC == \"hev1\" ? \"dvhe\" : \"dvh1\", sampleEntriesEnd);\n      break;\n    }\n    case \"dvh1\":\n    case \"dvhe\":\n    case \"dvav\":\n    case \"dva1\":\n    case \"dav1\": {\n      codec = parseSupplementalDoViCodec(codec, sampleEntriesEnd) || codec;\n      break;\n    }\n    case \"vp09\": {\n      const vpcCBox = findBox(sampleEntriesEnd, [\"vpcC\"])[0];\n      if (vpcCBox && vpcCBox.length > 6) {\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      }\n      break;\n    }\n    case \"av01\": {\n      const av1CBox = findBox(sampleEntriesEnd, [\"av1C\"])[0];\n      if (av1CBox && av1CBox.length > 2) {\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        supplemental = parseSupplementalDoViCodec(\"dav1\", sampleEntriesEnd);\n      }\n      break;\n    }\n  }\n  return {\n    codec,\n    encrypted,\n    supplemental\n  };\n}\nfunction parseSupplementalDoViCodec(fourCC, sampleEntriesEnd) {\n  const dvvCResult = findBox(sampleEntriesEnd, [\"dvvC\"]);\n  const dvXCBox = dvvCResult.length ? dvvCResult[0] : findBox(sampleEntriesEnd, [\"dvcC\"])[0];\n  if (dvXCBox) {\n    const doViProfile = dvXCBox[2] >> 1 & 127;\n    const doViLevel = dvXCBox[2] << 5 & 32 | dvXCBox[3] >> 3 & 31;\n    return fourCC + \".\" + addLeadingZero(doViProfile) + \".\" + addLeadingZero(doViLevel);\n  }\n}\nfunction reverse32BitInt(val) {\n  let result = 0;\n  for (let i = 0; i < 32; i++) {\n    result |= (val >> i & 1) << 32 - 1 - i;\n  }\n  return result >>> 0;\n}\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;\n  }\n  const keyId = decryptdata.keyId;\n  if (keyId && decryptdata.isCommonEncryption) {\n    applyToTencBoxes(initSegment, (tenc, isAudio) => {\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: ${arrayToHex(tencKeyId)} -> ${arrayToHex(keyId)}`);\n        tenc.set(keyId, 8);\n      }\n    });\n  }\n}\nfunction parseKeyIdsFromTenc(initSegment) {\n  const keyIds = [];\n  applyToTencBoxes(initSegment, (tenc) => keyIds.push(tenc.subarray(8, 24)));\n  return keyIds;\n}\nfunction applyToTencBoxes(initSegment, predicate) {\n  const traks = findBox(initSegment, [\"moov\", \"trak\"]);\n  traks.forEach((trak) => {\n    const stsd = findBox(trak, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0];\n    if (!stsd)\n      return;\n    const sampleEntries = stsd.subarray(8);\n    let encBoxes = findBox(sampleEntries, [\"enca\"]);\n    const isAudio = encBoxes.length > 0;\n    if (!isAudio) {\n      encBoxes = findBox(sampleEntries, [\"encv\"]);\n    }\n    encBoxes.forEach((enc) => {\n      const encBoxChildren = isAudio ? enc.subarray(28) : enc.subarray(78);\n      const sinfBoxes = findBox(encBoxChildren, [\"sinf\"]);\n      sinfBoxes.forEach((sinf) => {\n        const tenc = parseSinf(sinf);\n        if (tenc) {\n          predicate(tenc, isAudio);\n        }\n      });\n    });\n  });\n}\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      const tenc = findBox(sinf, [\"schi\", \"tenc\"])[0];\n      if (tenc) {\n        return tenc;\n      }\n    }\n  }\n}\nfunction getSampleData(data, initData, logger2) {\n  const tracks = {};\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    tracks[id] || (tracks[id] = {\n      start: NaN,\n      duration: 0,\n      sampleCount: 0,\n      timescale: track.timescale,\n      type: track.type\n    });\n    const trackTimes = tracks[id];\n    const tfdt = findBox(traf, [\"tfdt\"])[0];\n    if (tfdt) {\n      const version2 = tfdt[0];\n      let baseTime = readUint32(tfdt, 4);\n      if (version2 === 1) {\n        if (baseTime === UINT32_MAX$1) {\n          logger2.warn(`[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time`);\n        } else {\n          baseTime *= UINT32_MAX$1 + 1;\n          baseTime += readUint32(tfdt, 8);\n        }\n      }\n      if (isFiniteNumber(baseTime) && (!isFiniteNumber(trackTimes.start) || baseTime < trackTimes.start)) {\n        trackTimes.start = baseTime;\n      }\n    }\n    const trackDefault = track.default;\n    const tfhdFlags = readUint32(tfhd, 0) | (trackDefault == null ? void 0 : trackDefault.flags);\n    let defaultSampleDuration = (trackDefault == null ? void 0 : trackDefault.duration) || 0;\n    if (tfhdFlags & 8) {\n      if (tfhdFlags & 2) {\n        defaultSampleDuration = readUint32(tfhd, 12);\n      } else {\n        defaultSampleDuration = readUint32(tfhd, 8);\n      }\n    }\n    const truns = findBox(traf, [\"trun\"]);\n    let sampleDTS = trackTimes.start || 0;\n    let rawDuration = 0;\n    let sampleDuration = defaultSampleDuration;\n    for (let j = 0; j < truns.length; j++) {\n      const trun = truns[j];\n      const sampleCount = readUint32(trun, 4);\n      const sampleIndex = trackTimes.sampleCount;\n      trackTimes.sampleCount += sampleCount;\n      const dataOffsetPresent = trun[3] & 1;\n      const firstSampleFlagsPresent = trun[3] & 4;\n      const sampleDurationPresent = trun[2] & 1;\n      const sampleSizePresent = trun[2] & 2;\n      const sampleFlagsPresent = trun[2] & 4;\n      const sampleCompositionTimeOffsetPresent = trun[2] & 8;\n      let offset = 8;\n      let remaining = sampleCount;\n      if (dataOffsetPresent) {\n        offset += 4;\n      }\n      if (firstSampleFlagsPresent && sampleCount) {\n        const isNonSyncSample = trun[offset + 1] & 1;\n        if (!isNonSyncSample && trackTimes.keyFrameIndex === void 0) {\n          trackTimes.keyFrameIndex = sampleIndex;\n        }\n        offset += 4;\n        if (sampleDurationPresent) {\n          sampleDuration = readUint32(trun, offset);\n          offset += 4;\n        } else {\n          sampleDuration = defaultSampleDuration;\n        }\n        if (sampleSizePresent) {\n          offset += 4;\n        }\n        if (sampleCompositionTimeOffsetPresent) {\n          offset += 4;\n        }\n        sampleDTS += sampleDuration;\n        rawDuration += sampleDuration;\n        remaining--;\n      }\n      while (remaining--) {\n        if (sampleDurationPresent) {\n          sampleDuration = readUint32(trun, offset);\n          offset += 4;\n        } else {\n          sampleDuration = defaultSampleDuration;\n        }\n        if (sampleSizePresent) {\n          offset += 4;\n        }\n        if (sampleFlagsPresent) {\n          const isNonSyncSample = trun[offset + 1] & 1;\n          if (!isNonSyncSample) {\n            if (trackTimes.keyFrameIndex === void 0) {\n              trackTimes.keyFrameIndex = trackTimes.sampleCount - (remaining + 1);\n              trackTimes.keyFrameStart = sampleDTS;\n            }\n          }\n          offset += 4;\n        }\n        if (sampleCompositionTimeOffsetPresent) {\n          offset += 4;\n        }\n        sampleDTS += sampleDuration;\n        rawDuration += sampleDuration;\n      }\n      if (!rawDuration && defaultSampleDuration) {\n        rawDuration += defaultSampleDuration * sampleCount;\n      }\n    }\n    trackTimes.duration += rawDuration;\n  }\n  if (!Object.keys(tracks).some((trackId) => tracks[trackId].duration)) {\n    let sidxMinStart = Infinity;\n    let sidxMaxEnd = 0;\n    const sidxs = findBox(data, [\"sidx\"]);\n    for (let i = 0; i < sidxs.length; i++) {\n      const sidx = parseSegmentIndex(sidxs[i]);\n      if (sidx != 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      }\n    }\n    if (sidxMaxEnd && isFiniteNumber(sidxMaxEnd)) {\n      Object.keys(tracks).forEach((trackId) => {\n        if (!tracks[trackId].duration) {\n          tracks[trackId].duration = sidxMaxEnd * tracks[trackId].timescale - tracks[trackId].start;\n        }\n      });\n    }\n  }\n  return tracks;\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 = data.slice(0, last.byteOffset - 8);\n  segmentedRange.remainder = data.slice(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 version2 = tfdt[0];\n        let result = readUint32(tfdt, 4);\n        if (version2 === 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 version2 = 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 (version2 === 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 baseCodec = codec.substring(0, 4);\n  return baseCodec === \"hvc1\" || baseCodec === \"hev1\" || 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 version2 = 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 (version2 === 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 (version2 === 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 version2;\n  let kids;\n  {\n    version2 = 0;\n    kids = new Uint8Array();\n  }\n  let kidCount;\n  if (version2 > 0) {\n    kidCount = new Uint8Array(4);\n    if (keyids.length > 0) {\n      new DataView(kidCount.buffer).setUint32(0, keyids.length, false);\n    }\n  } else {\n    kidCount = new Uint8Array();\n  }\n  const dataSize = new Uint8Array(4);\n  if (data.byteLength > 0) {\n    new DataView(dataSize.buffer).setUint32(0, data.byteLength, false);\n  }\n  return mp4Box([112, 115, 115, 104], new Uint8Array([\n    version2,\n    0,\n    0,\n    0\n  ]), systemId, kidCount, kids, dataSize, data);\n}\nfunction parseMultiPssh(initData) {\n  const results = [];\n  if (initData instanceof ArrayBuffer) {\n    const length = initData.byteLength;\n    let offset = 0;\n    while (offset + 32 < length) {\n      const view2 = new DataView(initData, offset);\n      const pssh = parsePssh(view2);\n      results.push(pssh);\n      offset += pssh.size;\n    }\n  }\n  return results;\n}\nfunction parsePssh(view2) {\n  const size = view2.getUint32(0);\n  const offset = view2.byteOffset;\n  const length = view2.byteLength;\n  if (length < size) {\n    return {\n      offset,\n      size: length\n    };\n  }\n  const type = view2.getUint32(4);\n  if (type !== 1886614376) {\n    return {\n      offset,\n      size\n    };\n  }\n  const version2 = view2.getUint32(8) >>> 24;\n  if (version2 !== 0 && version2 !== 1) {\n    return {\n      offset,\n      size\n    };\n  }\n  const buffer = view2.buffer;\n  const systemId = arrayToHex(new Uint8Array(buffer, offset + 12, 16));\n  let kids = null;\n  let data = null;\n  let dataSizeOffset = 0;\n  if (version2 === 0) {\n    dataSizeOffset = 28;\n  } else {\n    const kidCounts = view2.getUint32(28);\n    if (!kidCounts || length < 32 + kidCounts * 16) {\n      return {\n        offset,\n        size\n      };\n    }\n    kids = [];\n    for (let i = 0; i < kidCounts; i++) {\n      kids.push(new Uint8Array(buffer, offset + 32 + i * 16, 16));\n    }\n    dataSizeOffset = 32 + kidCounts * 16;\n  }\n  if (!dataSizeOffset) {\n    return {\n      offset,\n      size\n    };\n  }\n  const dataSizeOrKidCount = view2.getUint32(dataSizeOffset);\n  if (size - 32 < dataSizeOrKidCount) {\n    return {\n      offset,\n      size\n    };\n  }\n  data = new Uint8Array(buffer, offset + dataSizeOffset + 4, dataSizeOrKidCount);\n  return {\n    version: version2,\n    systemId,\n    kids,\n    data,\n    offset,\n    size\n  };\n}\nconst userAgentHevcSupportIsInaccurate = () => {\n  return /\\(Windows.+Firefox\\//i.test(navigator.userAgent);\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    flac: 0.9,\n    FLAC: 0.9,\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    samr: 1,\n    sawb: 1,\n    sawp: 1,\n    sevc: 1,\n    sqcp: 1,\n    ssmv: 1,\n    twos: 1,\n    ulaw: 1\n  },\n  video: {\n    avc1: 1,\n    avc2: 1,\n    avc3: 1,\n    avc4: 1,\n    avcp: 1,\n    av01: 0.8,\n    dav1: 0.8,\n    drac: 1,\n    dva1: 1,\n    dvav: 1,\n    dvh1: 0.7,\n    dvhe: 0.7,\n    encv: 1,\n    hev1: 0.75,\n    hvc1: 0.75,\n    mjp2: 1,\n    mp4v: 1,\n    mvc1: 1,\n    mvc2: 1,\n    mvc3: 1,\n    mvc4: 1,\n    resv: 1,\n    rv60: 1,\n    s263: 1,\n    svc1: 1,\n    svc2: 1,\n    \"vc-1\": 1,\n    vp08: 1,\n    vp09: 0.9\n  },\n  text: {\n    stpp: 1,\n    wvtt: 1\n  }\n};\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  const limitedHevcSupport = userAgentHevcSupportIsInaccurate();\n  return codecSet.split(\",\").reduce((num, fourCC) => {\n    const lowerPriority = limitedHevcSupport && isHEVC(fourCC);\n    const preferenceValue = lowerPriority ? 9 : 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    \"mp4a.40.34\": [\"mp3\"]\n  }[lowerCaseCodec];\n  for (let i = 0; i < codecsToCheck.length; i++) {\n    var _getMediaSource;\n    if (isCodecMediaSourceSupported(codecsToCheck[i], \"audio\", preferManagedMediaSource)) {\n      CODEC_COMPATIBLE_NAMES[lowerCaseCodec] = codecsToCheck[i];\n      return codecsToCheck[i];\n    } else if (codecsToCheck[i] === \"mp3\" && (_getMediaSource = getMediaSource(preferManagedMediaSource)) != null && _getMediaSource.isTypeSupported(\"audio/mpeg\")) {\n      return \"\";\n    }\n  }\n  return lowerCaseCodec;\n}\nconst AUDIO_CODEC_REGEXP = /flac|opus|mp4a\\.40\\.34/i;\nfunction getCodecCompatibleName(codec, preferManagedMediaSource = true) {\n  return codec.replace(AUDIO_CODEC_REGEXP, (m) => getCodecCompatibleNameLower(m.toLowerCase(), preferManagedMediaSource));\n}\nfunction replaceVideoCodec(originalCodecs, newVideoCodec) {\n  const codecs = [];\n  if (originalCodecs) {\n    const allCodecs = originalCodecs.split(\",\");\n    for (let i = 0; i < allCodecs.length; i++) {\n      if (!isCodecType(allCodecs[i], \"video\")) {\n        codecs.push(allCodecs[i]);\n      }\n    }\n  }\n  if (newVideoCodec) {\n    codecs.push(newVideoCodec);\n  }\n  return codecs.join(\",\");\n}\nfunction pickMostCompleteCodecName(parsedCodec, levelCodec) {\n  if (parsedCodec && (parsedCodec.length > 4 || [\"ac-3\", \"ec-3\", \"alac\", \"fLaC\", \"Opus\"].indexOf(parsedCodec) !== -1)) {\n    if (isCodecSupportedAsType(parsedCodec, \"audio\") || isCodecSupportedAsType(parsedCodec, \"video\")) {\n      return parsedCodec;\n    }\n  }\n  if (levelCodec) {\n    const levelCodecs = levelCodec.split(\",\");\n    if (levelCodecs.length > 1) {\n      if (parsedCodec) {\n        for (let i = levelCodecs.length; i--; ) {\n          if (levelCodecs[i].substring(0, 4) === parsedCodec.substring(0, 4)) {\n            return levelCodecs[i];\n          }\n        }\n      }\n      return levelCodecs[0];\n    }\n  }\n  return levelCodec || parsedCodec;\n}\nfunction isCodecSupportedAsType(codec, type) {\n  return isCodecType(codec, type) && isCodecMediaSourceSupported(codec, type);\n}\nfunction convertAVC1ToAVCOTI(videoCodecs) {\n  const codecs = videoCodecs.split(\",\");\n  for (let i = 0; i < codecs.length; i++) {\n    const avcdata = codecs[i].split(\".\");\n    if (avcdata.length > 2 && avcdata[0] === \"avc1\") {\n      codecs[i] = `avc1.${parseInt(avcdata[1]).toString(16)}${(\"000\" + parseInt(avcdata[2]).toString(16)).slice(-4)}`;\n    }\n  }\n  return codecs.join(\",\");\n}\nfunction fillInMissingAV01Params(videoCodec) {\n  if (videoCodec.startsWith(\"av01.\")) {\n    const av1params = videoCodec.split(\".\");\n    const placeholders = [\"0\", \"111\", \"01\", \"01\", \"01\", \"0\"];\n    for (let i = av1params.length; i > 4 && i < 10; i++) {\n      av1params[i] = placeholders[i - 4];\n    }\n    return av1params.join(\".\");\n  }\n  return videoCodec;\n}\nfunction getM2TSSupportedAudioTypes(preferManagedMediaSource) {\n  const MediaSource = getMediaSource(preferManagedMediaSource) || {\n    isTypeSupported: () => false\n  };\n  return {\n    mpeg: MediaSource.isTypeSupported(\"audio/mpeg\"),\n    mp3: MediaSource.isTypeSupported('audio/mp4; codecs=\"mp3\"'),\n    ac3: MediaSource.isTypeSupported('audio/mp4; codecs=\"ac-3\"')\n  };\n}\nfunction getCodecsForMimeType(mimeType) {\n  return mimeType.replace(/^.+codecs=[\"']?([^\"']+).*$/, \"$1\");\n}\nconst supportedResult = {\n  supported: true,\n  powerEfficient: true,\n  smooth: true\n};\nconst unsupportedResult = {\n  supported: false,\n  smooth: false,\n  powerEfficient: false\n};\nconst SUPPORTED_INFO_DEFAULT = {\n  supported: true,\n  configurations: [],\n  decodingInfoResults: [supportedResult]\n};\nfunction getUnsupportedResult(error, configurations) {\n  return {\n    supported: false,\n    configurations,\n    decodingInfoResults: [unsupportedResult],\n    error\n  };\n}\nfunction requiresMediaCapabilitiesDecodingInfo(level, audioTracksByGroup, currentVideoRange, currentFrameRate, currentBw, audioPreference) {\n  const videoCodecs = level.videoCodec;\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 videoCodecs !== void 0 && (videoCodecs.split(\",\").some((videoCodec) => isHEVC(videoCodec)) || 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, cache = {}) {\n  const videoCodecs = level.videoCodec;\n  if (!videoCodecs && !level.audioCodec || !mediaCapabilities) {\n    return Promise.resolve(SUPPORTED_INFO_DEFAULT);\n  }\n  const configurations = [];\n  const videoDecodeList = makeVideoConfigurations(level);\n  const videoCount = videoDecodeList.length;\n  const audioDecodeList = makeAudioConfigurations(level, audioTracksByGroup, videoCount > 0);\n  const audioCount = audioDecodeList.length;\n  for (let i = videoCount || 1 * audioCount || 1; i--; ) {\n    const configuration = {\n      type: \"media-source\"\n    };\n    if (videoCount) {\n      configuration.video = videoDecodeList[i % videoCount];\n    }\n    if (audioCount) {\n      configuration.audio = audioDecodeList[i % audioCount];\n      const audioBitrate = configuration.audio.bitrate;\n      if (configuration.video && audioBitrate) {\n        configuration.video.bitrate -= audioBitrate;\n      }\n    }\n    configurations.push(configuration);\n  }\n  if (videoCodecs) {\n    const ua = navigator.userAgent;\n    if (videoCodecs.split(\",\").some((videoCodec) => isHEVC(videoCodec)) && userAgentHevcSupportIsInaccurate()) {\n      return Promise.resolve(getUnsupportedResult(new Error(`Overriding Windows Firefox HEVC MediaCapabilities result based on user-agent string: (${ua})`), configurations));\n    }\n  }\n  return Promise.all(configurations.map((configuration) => {\n    const decodingInfoKey = getMediaDecodingInfoKey(configuration);\n    return cache[decodingInfoKey] || (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 makeVideoConfigurations(level) {\n  var _level$videoCodec;\n  const videoCodecs = (_level$videoCodec = level.videoCodec) == null ? void 0 : _level$videoCodec.split(\",\");\n  const bitrate = getVariantDecodingBitrate(level);\n  const width = level.width || 640;\n  const height = level.height || 480;\n  const framerate = level.frameRate || 30;\n  const videoRange = level.videoRange.toLowerCase();\n  return videoCodecs ? videoCodecs.map((videoCodec) => {\n    const videoConfiguration = {\n      contentType: mimeTypeForCodec(fillInMissingAV01Params(videoCodec), \"video\"),\n      width,\n      height,\n      bitrate,\n      framerate\n    };\n    if (videoRange !== \"sdr\") {\n      videoConfiguration.transferFunction = videoRange;\n    }\n    return videoConfiguration;\n  }) : [];\n}\nfunction makeAudioConfigurations(level, audioTracksByGroup, hasVideo) {\n  var _level$audioCodec;\n  const audioCodecs = (_level$audioCodec = level.audioCodec) == null ? void 0 : _level$audioCodec.split(\",\");\n  const combinedBitrate = getVariantDecodingBitrate(level);\n  if (audioCodecs && level.audioGroups) {\n    return level.audioGroups.reduce((configurations, audioGroupId) => {\n      var _audioTracksByGroup$g;\n      const tracks = audioGroupId ? (_audioTracksByGroup$g = audioTracksByGroup.groups[audioGroupId]) == null ? void 0 : _audioTracksByGroup$g.tracks : null;\n      if (tracks) {\n        return tracks.reduce((configs, audioTrack) => {\n          if (audioTrack.groupId === audioGroupId) {\n            const channelsNumber = parseFloat(audioTrack.channels || \"\");\n            audioCodecs.forEach((audioCodec) => {\n              const audioConfiguration = {\n                contentType: mimeTypeForCodec(audioCodec, \"audio\"),\n                bitrate: hasVideo ? estimatedAudioBitrate(audioCodec, combinedBitrate) : combinedBitrate\n              };\n              if (channelsNumber) {\n                audioConfiguration.channels = \"\" + channelsNumber;\n              }\n              configs.push(audioConfiguration);\n            });\n          }\n          return configs;\n        }, configurations);\n      }\n      return configurations;\n    }, []);\n  }\n  return [];\n}\nfunction estimatedAudioBitrate(audioCodec, levelBitrate) {\n  if (levelBitrate <= 1) {\n    return 1;\n  }\n  let audioBitrate = 128e3;\n  if (audioCodec === \"ec-3\") {\n    audioBitrate = 768e3;\n  } else if (audioCodec === \"ac-3\") {\n    audioBitrate = 64e4;\n  }\n  return Math.min(levelBitrate / 2, audioBitrate);\n}\nfunction getVariantDecodingBitrate(level) {\n  return Math.ceil(Math.max(level.bitrate * 0.9, level.averageBitrate) / 1e3) * 1e3 || 1;\n}\nfunction getMediaDecodingInfoKey(config) {\n  let key = \"\";\n  const {\n    audio,\n    video\n  } = config;\n  if (video) {\n    const codec = getCodecsForMimeType(video.contentType);\n    key += `${codec}_r${video.height}x${video.width}f${Math.ceil(video.framerate)}${video.transferFunction || \"sd\"}_${Math.ceil(video.bitrate / 1e5)}`;\n  }\n  if (audio) {\n    const codec = getCodecsForMimeType(audio.contentType);\n    key += `${video ? \"_\" : \"\"}${codec}_c${audio.channels}`;\n  }\n  return key;\n}\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) {\n  const {\n    canSkipUntil,\n    canSkipDateRanges,\n    age\n  } = details;\n  const playlistRecentEnough = age < canSkipUntil / 2;\n  if (canSkipUntil && playlistRecentEnough) {\n    if (canSkipDateRanges) {\n      return HlsSkip.v2;\n    }\n    return HlsSkip.Yes;\n  }\n  return HlsSkip.No;\n}\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.supplemental = 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    if (\"supplemental\" in data) {\n      var _data$supplemental;\n      this.supplemental = data.supplemental;\n      const supplementalVideo = (_data$supplemental = data.supplemental) == null ? void 0 : _data$supplemental.videoCodec;\n      if (supplementalVideo && supplementalVideo !== data.videoCodec) {\n        this.codecSet += `,${supplementalVideo.substring(0, 4)}`;\n      }\n    }\n    this.addGroupId(\"audio\", data.attrs.AUDIO);\n    this.addGroupId(\"text\", data.attrs.SUBTITLES);\n  }\n  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  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 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    const allowAutoPreferHDR = allowedVideoRanges.join(\"\") !== \"SDR\" && !videoPreference.videoCodec;\n    preferHDR = videoPreference.preferHDR !== void 0 ? videoPreference.preferHDR : allowAutoPreferHDR && isHdrSupported();\n    if (!preferHDR) {\n      allowedVideoRanges = [\"SDR\"];\n    }\n  }\n  return {\n    preferHDR,\n    allowedVideoRanges\n  };\n}\nconst omitCircularRefsReplacer = (replacer) => {\n  const known = new WeakSet();\n  return (_, value) => {\n    if (replacer) {\n      value = replacer(_, value);\n    }\n    if (typeof value === \"object\" && value !== null) {\n      if (known.has(value)) {\n        return;\n      }\n      known.add(value);\n    }\n    return value;\n  };\n};\nconst stringify = (object, replacer) => JSON.stringify(object, omitCircularRefsReplacer(replacer));\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 videoCodecPreference = videoPreference == null ? void 0 : videoPreference.videoCodec;\n  const preferStereo = channelsPreference && parseInt(channelsPreference) === 2;\n  let hasStereo = false;\n  let hasCurrentVideoRange = false;\n  let minHeight = Infinity;\n  let minFramerate = Infinity;\n  let minBitrate = Infinity;\n  let minIndex = Infinity;\n  let selectedScore = 0;\n  let videoRanges = [];\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 || (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    }\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  }\n  const hasMultipleSets = codecSets.length > 1;\n  const codecSet = codecSets.reduce((selected, candidate) => {\n    const candidateTier = codecTiers[candidate];\n    if (candidate === selected) {\n      return selected;\n    }\n    videoRanges = hasCurrentVideoRange ? allowedVideoRanges.filter((range) => candidateTier.videoRanges[range] > 0) : [];\n    if (hasMultipleSets) {\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 ${stringify(videoRanges)} found`);\n        return selected;\n      }\n      if (videoCodecPreference && candidate.indexOf(videoCodecPreference.substring(0, 4)) % 5 !== 0) {\n        logStartCodecCandidateIgnored(candidate, `video codec preference \"${videoCodecPreference}\" not 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    }\n    if (selected && (codecsSetSelectionPreferenceValue(candidate) >= codecsSetSelectionPreferenceValue(selected) || candidateTier.fragmentError > codecTiers[selected].fragmentError)) {\n      return selected;\n    }\n    minIndex = candidateTier.minIndex;\n    selectedScore = candidateTier.maxScore;\n    return candidate;\n  }, void 0);\n  return {\n    codecSet,\n    videoRanges,\n    preferHDR,\n    minFramerate,\n    minBitrate,\n    minIndex\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, index) => {\n    if (!level.codecSet) {\n      return tiers;\n    }\n    const audioGroups = level.audioGroups;\n    let tier = tiers[level.codecSet];\n    if (!tier) {\n      tiers[level.codecSet] = tier = {\n        minBitrate: Infinity,\n        minHeight: Infinity,\n        minFramerate: Infinity,\n        minIndex: index,\n        maxScore: 0,\n        videoRanges: {\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.minIndex = Math.min(tier.minIndex, index);\n    tier.maxScore = Math.max(tier.maxScore, level.score);\n    tier.fragmentError += level.fragmentError;\n    tier.videoRanges[level.videoRange] = (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        if (!audioGroup) {\n          return;\n        }\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 getBasicSelectionOption(option) {\n  if (!option) {\n    return option;\n  }\n  const {\n    lang,\n    assocLang,\n    characteristics,\n    channels,\n    audioCodec\n  } = option;\n  return {\n    lang,\n    assocLang,\n    characteristics,\n    channels,\n    audioCodec\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    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 || languagesMatch(lang, track.lang)) && (lang === void 0 || track.assocLang === assocLang) && (isDefault === void 0 || track.default === isDefault) && (forced === void 0 || track.forced === forced) && (!(\"characteristics\" in option) || characteristicsMatch(option.characteristics || \"\", track.characteristics)) && (matchPredicate === void 0 || matchPredicate(option, track));\n}\nfunction languagesMatch(languageA, languageB = \"--\") {\n  if (languageA.length === languageB.length) {\n    return languageA === languageB;\n  }\n  return languageA.startsWith(languageB) || languageB.startsWith(languageA);\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 > -1; i--) {\n    if (predicate(arr[i])) {\n      return i;\n    }\n  }\n  for (let i = searchIndex + 1; i < arr.length; i++) {\n    if (predicate(arr[i])) {\n      return i;\n    }\n  }\n  return -1;\n}\nfunction useAlternateAudio(audioTrackUrl, hls) {\n  var _hls$loadLevelObj;\n  return !!audioTrackUrl && audioTrackUrl !== ((_hls$loadLevelObj = hls.loadLevelObj) == null ? void 0 : _hls$loadLevelObj.uri);\n}\nclass AbrController extends Logger {\n  constructor(_hls) {\n    super(\"abr\", _hls.logger);\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.rebufferNotice = -1;\n    this.supportedCache = {};\n    this.bwEstimator = void 0;\n    this._abandonRulesCheck = (levelLoaded) => {\n      var _ref;\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      const loadingFragForLevel = frag.level;\n      const currentAutoLevel = this._nextAutoLevel;\n      if (stats.aborted || stats.loaded && stats.loaded === stats.total || loadingFragForLevel <= minAutoLevel) {\n        this.clearTimer();\n        this._nextAutoLevel = -1;\n        return;\n      }\n      if (!autoLevelEnabled) {\n        return;\n      }\n      const fragBlockingSwitch = currentAutoLevel > -1 && currentAutoLevel !== loadingFragForLevel;\n      const levelChange = !!levelLoaded || fragBlockingSwitch;\n      if (!levelChange && (media.paused || !media.playbackRate || !media.readyState)) {\n        return;\n      }\n      const bufferInfo = hls.mainForwardBufferInfo;\n      if (!levelChange && 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 ? bufferInfo.len / playbackRate : 0;\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[loadingFragForLevel];\n      const expectedLen = Math.max(stats.loaded, Math.round(duration * (frag.bitrate || 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 ttfbSeconds = ttfbEstimate / 1e3;\n      const fragLoadedDelay = loadRate ? (expectedLen - stats.loaded) / loadRate : expectedLen * 8 / bwEstimate + ttfbSeconds;\n      if (fragLoadedDelay <= bufferStarvationDelay) {\n        return;\n      }\n      const bwe = loadRate ? loadRate * 8 : bwEstimate;\n      const live = ((_ref = (levelLoaded == null ? void 0 : levelLoaded.details) || this.hls.latestLevelDetails) == null ? void 0 : _ref.live) === true;\n      const abrBandWidthUpFactor = this.hls.config.abrBandWidthUpFactor;\n      let fragLevelNextLoadedDelay = Number.POSITIVE_INFINITY;\n      let nextLoadLevel;\n      for (nextLoadLevel = loadingFragForLevel - 1; nextLoadLevel > minAutoLevel; nextLoadLevel--) {\n        const levelNextBitrate = levels[nextLoadLevel].maxBitrate;\n        const requiresLevelLoad = !levels[nextLoadLevel].details || live;\n        fragLevelNextLoadedDelay = this.getTimeToLoadFrag(ttfbSeconds, bwe, duration * levelNextBitrate, requiresLevelLoad);\n        if (fragLevelNextLoadedDelay < Math.min(bufferStarvationDelay, duration + ttfbSeconds)) {\n          break;\n        }\n      }\n      if (fragLevelNextLoadedDelay >= fragLoadedDelay) {\n        return;\n      }\n      if (fragLevelNextLoadedDelay > duration * 10) {\n        return;\n      }\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() * abrBandWidthUpFactor > nextLoadLevelBitrate) {\n        this.resetEstimator(nextLoadLevelBitrate);\n      }\n      const bestSwitchLevel = this.findBestLevel(nextLoadLevelBitrate, minAutoLevel, nextLoadLevel, 0, bufferStarvationDelay, 1, 1);\n      if (bestSwitchLevel > -1) {\n        nextLoadLevel = bestSwitchLevel;\n      }\n      this.warn(`Fragment ${frag.sn}${part ? \" part \" + part.index : \"\"} of level ${loadingFragForLevel} is loading too slowly;\n      Fragment duration: ${frag.duration.toFixed(3)}\n      Time to underbuffer: ${bufferStarvationDelay.toFixed(3)} s\n      Estimated load time for current fragment: ${fragLoadedDelay.toFixed(3)} s\n      Estimated load time for down switch fragment: ${fragLevelNextLoadedDelay.toFixed(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.nextLoadLevel = hls.nextAutoLevel = nextLoadLevel;\n      this.clearTimer();\n      const abortAndSwitch = () => {\n        this.clearTimer();\n        if (this.fragCurrent === frag && this.hls.loadLevel === nextLoadLevel && nextLoadLevel > 0) {\n          const bufferStarvationDelay2 = this.getStarvationDelay();\n          this.warn(`Aborting inflight request ${nextLoadLevel > 0 ? \"and switching down\" : \"\"}\n      Fragment duration: ${frag.duration.toFixed(3)} s\n      Time to underbuffer: ${bufferStarvationDelay2.toFixed(3)} s`);\n          frag.abortRequests();\n          this.fragCurrent = this.partCurrent = null;\n          if (nextLoadLevel > minAutoLevel) {\n            let lowestSwitchLevel = this.findBestLevel(this.hls.levels[minAutoLevel].bitrate, minAutoLevel, nextLoadLevel, 0, bufferStarvationDelay2, 1, 1);\n            if (lowestSwitchLevel === -1) {\n              lowestSwitchLevel = minAutoLevel;\n            }\n            this.hls.nextLoadLevel = this.hls.nextAutoLevel = lowestSwitchLevel;\n            this.resetEstimator(this.hls.levels[lowestSwitchLevel].bitrate);\n          }\n        }\n      };\n      if (fragBlockingSwitch || fragLoadedDelay > fragLevelNextLoadedDelay * 2) {\n        abortAndSwitch();\n      } else {\n        this.timer = self.setInterval(abortAndSwitch, fragLevelNextLoadedDelay * 1e3);\n      }\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      this.log(`setting initial bwe to ${abrEwmaDefaultEstimate}`);\n      this.hls.config.abrEwmaDefaultEstimate = abrEwmaDefaultEstimate;\n    }\n    this.firstSelection = -1;\n    this.bwEstimator = this.initEstimator();\n  }\n  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 = this.supportedCache = 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.supportedCache = {};\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 ? timeToFirstByteSec + 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.first;\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    if (this.timer > -1) {\n      this._abandonRulesCheck(data.levelInfo);\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    this.warn(`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  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    if (hls.levels.length <= 1) {\n      return hls.loadLevel;\n    }\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        this.rebufferNotice = -1;\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        this.info(`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    if (this.rebufferNotice !== bestLevel) {\n      this.rebufferNotice = bestLevel;\n      this.info(`${bufferStarvationDelay ? \"rebuffering expected\" : \"buffer is empty\"}, optimal quality level ${bestLevel}`);\n    }\n    if (bestLevel > -1) {\n      return bestLevel;\n    }\n    const minLevel = hls.levels[minAutoLevel];\n    const autoLevel = hls.loadLevelObj;\n    if (autoLevel && (minLevel == null ? void 0 : minLevel.bitrate) < 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 _this$hls$latestLevel;\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 = !!((_this$hls$latestLevel = this.hls.latestLevelDetails) != null && _this$hls$latestLevel.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    let minStartIndex = -1;\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        minIndex,\n        preferHDR\n      } = startTier;\n      minStartIndex = minIndex;\n      currentCodecSet = codecSet;\n      currentVideoRange = preferHDR ? videoRanges[videoRanges.length - 1] : videoRanges[0];\n      currentFrameRate = minFramerate;\n      currentBw = Math.max(currentBw, minBitrate);\n      this.log(`picked start tier ${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, this.supportedCache);\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              this.warn(`MediaCapabilities decodingInfo error: \"${decodingInfo.error}\" for level ${index} ${stringify(decodingInfo)}`);\n            } else if (!decodingInfo.supported) {\n              this.warn(`Unsupported MediaCapabilities decodingInfo result for level ${index} ${stringify(decodingInfo)}`);\n              if (index > -1 && levels2.length > 1) {\n                this.log(`Removing unsupported level ${index}`);\n                this.hls.removeLevel(index);\n                if (this.hls.loadLevel === -1) {\n                  this.hls.nextLoadLevel = 0;\n                }\n              }\n            } else if (decodingInfo.decodingInfoResults.some((info) => info.smooth === false || info.powerEfficient === false)) {\n              this.log(`MediaCapabilities decodingInfo for level ${index} not smooth or powerEfficient: ${stringify(decodingInfo)}`);\n            }\n          }).catch((error) => {\n            this.warn(`Error handling MediaCapabilities decodingInfo: ${error}`);\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$supportedR = levelInfo.supportedResult) != null && (_levelInfo$supportedR = _levelInfo$supportedR.decodingInfoResults) != null && _levelInfo$supportedR.some((info) => info.smooth === false)) {\n        if (!firstSelection || i !== minStartIndex) {\n          levelsSkipped.push(i);\n          continue;\n        }\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 ? levelInfo.averageBitrate : levelInfo.maxBitrate;\n      const fetchDuration = this.getTimeToLoadFrag(ttfbEstimateSec, adjustedbw, bitrate * avgDuration, levelDetails === void 0);\n      const canSwitchWithinTolerance = adjustedbw >= bitrate && (i === lastLoadedFragLevel || levelInfo.loadError === 0 && levelInfo.fragmentError === 0) && (fetchDuration <= ttfbEstimateSec || !isFiniteNumber(fetchDuration) || live && !this.bitrateTestDelay || fetchDuration < maxFetchDuration);\n      if (canSwitchWithinTolerance) {\n        const forcedAutoLevel = this.forcedAutoLevel;\n        if (i !== loadLevel && (forcedAutoLevel === -1 || forcedAutoLevel !== loadLevel)) {\n          if (levelsSkipped.length) {\n            this.trace(`Skipped level(s) ${levelsSkipped.join(\",\")} of ${maxAutoLevel} max with CODECS and VIDEO-RANGE:\"${levels[levelsSkipped[0]].codecs}\" ${levels[levelsSkipped[0]].videoRange}; not compatible with \"${currentCodecSet}\" ${currentVideoRange}`);\n          }\n          this.info(`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:${levelInfo.codecSet} videoRange:${levelInfo.videoRange} 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 value = this.deriveNextAutoLevel(nextLevel);\n    if (this._nextAutoLevel !== value) {\n      this.nextAutoLevelKey = \"\";\n      this._nextAutoLevel = value;\n    }\n  }\n  deriveNextAutoLevel(nextLevel) {\n    const {\n      maxAutoLevel,\n      minAutoLevel\n    } = this.hls;\n    return Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);\n  }\n}\nconst BinarySearch = {\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  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, nextFragLookupTolerance = 5e-3) {\n  let fragNext = null;\n  if (fragPrevious) {\n    fragNext = fragments[1 + fragPrevious.sn - fragments[0].sn] || null;\n    const bufferEdgeError = fragPrevious.endDTS - bufferEnd;\n    if (bufferEdgeError > 0 && bufferEdgeError < 15e-7) {\n      bufferEnd += 15e-7;\n    }\n    if (fragNext && fragPrevious.level !== fragNext.level && fragNext.end <= fragPrevious.end) {\n      fragNext = fragments[2 + fragPrevious.sn - fragments[0].sn] || null;\n    }\n  } else if (bufferEnd === 0 && fragments[0].start === 0) {\n    fragNext = fragments[0];\n  }\n  if (fragNext && ((!fragPrevious || fragPrevious.level === fragNext.level) && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0 || fragmentWithinFastStartSwitch(fragNext, fragPrevious, Math.min(nextFragLookupTolerance, maxFragLookUpTolerance)))) {\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 fragmentWithinFastStartSwitch(fragNext, fragPrevious, nextFragLookupTolerance) {\n  if (fragPrevious && fragPrevious.start === 0 && fragPrevious.level < fragNext.level && (fragPrevious.endPTS || 0) > 0) {\n    const firstDuration = fragPrevious.tagList.reduce((duration, tag) => {\n      if (tag[0] === \"INF\") {\n        duration += parseFloat(tag[1]);\n      }\n      return duration;\n    }, nextFragLookupTolerance);\n    return fragNext.start <= firstDuration;\n  }\n  return false;\n}\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 findNearestWithCC(details, cc, pos) {\n  if (details) {\n    if (details.startCC <= cc && details.endCC >= cc) {\n      let fragments = details.fragments;\n      const {\n        fragmentHint\n      } = details;\n      if (fragmentHint) {\n        fragments = fragments.concat(fragmentHint);\n      }\n      let closest;\n      BinarySearch.search(fragments, (candidate) => {\n        if (candidate.cc < cc) {\n          return 1;\n        }\n        if (candidate.cc > cc) {\n          return -1;\n        }\n        closest = candidate;\n        if (candidate.end <= pos) {\n          return 1;\n        }\n        if (candidate.start > pos) {\n          return -1;\n        }\n        return 0;\n      });\n      return closest || null;\n    }\n  }\n  return null;\n}\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 isKeyError(error) {\n  return error.details.startsWith(\"key\");\n}\nfunction isUnusableKeyError(error) {\n  return isKeyError(error) && !!error.frag && !error.frag.decryptdata;\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 offlineHttpStatus(httpStatus) || !!httpStatus && (httpStatus < 400 || httpStatus > 499);\n}\nfunction offlineHttpStatus(httpStatus) {\n  return httpStatus === 0 && navigator.onLine === false;\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  MoveAllAlternatesMatchingKey: 4,\n  SwitchToSDR: 8\n};\nclass ErrorController extends Logger {\n  constructor(hls) {\n    super(\"error-controller\", hls.logger);\n    this.hls = void 0;\n    this.playlistError = 0;\n    this.hls = hls;\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  }\n  startLoad(startPosition) {\n  }\n  stopLoad() {\n    this.playlistError = 0;\n  }\n  getVariantLevelIndex(frag) {\n    if ((frag == null ? void 0 : frag.type) === PlaylistLevelType.MAIN) {\n      return frag.level;\n    }\n    return this.getVariantIndex();\n  }\n  getVariantIndex() {\n    var _hls$loadLevelObj;\n    const hls = this.hls;\n    const currentLevel = hls.currentLevel;\n    if ((_hls$loadLevelObj = hls.loadLevelObj) != null && _hls$loadLevelObj.details || currentLevel === -1) {\n      return hls.loadLevel;\n    }\n    return currentLevel;\n  }\n  variantHasKey(level, keyInError) {\n    if (level) {\n      var _level$details;\n      if ((_level$details = level.details) != null && _level$details.hasKey(keyInError)) {\n        return true;\n      }\n      const audioGroupsIds = level.audioGroups;\n      if (audioGroupsIds) {\n        const audioTracks = this.hls.allAudioTracks.filter((track) => audioGroupsIds.indexOf(track.groupId) >= 0);\n        return audioTracks.some((track) => {\n          var _track$details;\n          return (_track$details = track.details) == null ? void 0 : _track$details.hasKey(keyInError);\n        });\n      }\n    }\n    return false;\n  }\n  onManifestLoading() {\n    this.playlistError = 0;\n  }\n  onLevelUpdated() {\n    this.playlistError = 0;\n  }\n  onError(event, data) {\n    var _data$frag;\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 = createDoNothingErrorAction();\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;\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 = _data$context.levelDetails) != null && _data$context.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.loadLevelObj;\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          data.errorAction = {\n            action: NetworkErrorAction.SendAlternateToPenaltyBox,\n            flags: ErrorActionFlags.MoveAllAlternatesMatchingHDCP\n          };\n        }\n        return;\n      case ErrorDetails.KEY_SYSTEM_SESSION_UPDATE_FAILED:\n      case ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR:\n      case ErrorDetails.KEY_SYSTEM_NO_SESSION:\n        {\n          data.errorAction = {\n            action: NetworkErrorAction.SendAlternateToPenaltyBox,\n            flags: ErrorActionFlags.MoveAllAlternatesMatchingKey\n          };\n        }\n        return;\n      case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n      case ErrorDetails.REMUX_ALLOC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        if (!data.errorAction) {\n          var _data$level;\n          data.errorAction = this.getLevelSwitchAction(data, (_data$level = data.level) != null ? _data$level : hls.loadLevel);\n        }\n        return;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n      case ErrorDetails.BUFFER_APPENDING_ERROR:\n      case ErrorDetails.BUFFER_FULL_ERROR:\n      case ErrorDetails.LEVEL_SWITCH_ERROR:\n      case ErrorDetails.BUFFER_STALLED_ERROR:\n      case ErrorDetails.BUFFER_SEEK_OVER_HOLE:\n      case ErrorDetails.BUFFER_NUDGE_ON_STALL:\n        data.errorAction = createDoNothingErrorAction();\n        return;\n    }\n    if (data.type === ErrorTypes.KEY_SYSTEM_ERROR) {\n      data.levelRetry = false;\n      data.errorAction = createDoNothingErrorAction();\n    }\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(isKeyError(data) ? 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      if (!isUnusableKeyError(data)) {\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    }\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 && !hls.config.preserveManualLevelOnError) {\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 && fragErrorType === PlaylistLevelType.MAIN && 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 || findVideoCodecAlternate && level.codecSet === levelCandidate.codecSet || !findAudioCodecAlternate && 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    } = errorAction;\n    const nextAutoLevel = errorAction.nextAutoLevel;\n    switch (flags) {\n      case ErrorActionFlags.None:\n        this.switchLevel(data, nextAutoLevel);\n        break;\n      case ErrorActionFlags.MoveAllAlternatesMatchingHDCP: {\n        const levelIndex = this.getVariantLevelIndex(data.frag);\n        const level = hls.levels[levelIndex];\n        const restrictedHdcpLevel = level == null ? void 0 : level.attrs[\"HDCP-LEVEL\"];\n        errorAction.hdcpLevel = restrictedHdcpLevel;\n        if (restrictedHdcpLevel === \"NONE\") {\n          this.warn(`HDCP policy resticted output with HDCP-LEVEL=NONE`);\n        } else if (restrictedHdcpLevel) {\n          hls.maxHdcpLevel = HdcpLevels[HdcpLevels.indexOf(restrictedHdcpLevel) - 1];\n          errorAction.resolved = true;\n          this.warn(`Restricting playback to HDCP-LEVEL of \"${hls.maxHdcpLevel}\" or lower`);\n          break;\n        }\n      }\n      case ErrorActionFlags.MoveAllAlternatesMatchingKey: {\n        const levelKey = data.decryptdata;\n        if (levelKey) {\n          const levels = this.hls.levels;\n          const levelCountWithError = levels.length;\n          for (let i = levelCountWithError; i--; ) {\n            if (this.variantHasKey(levels[i], levelKey)) {\n              var _levels$i$audioGroups, _data$frag3;\n              this.log(`Banned key found in level ${i} (${levels[i].bitrate}bps) or audio group \"${(_levels$i$audioGroups = levels[i].audioGroups) == null ? void 0 : _levels$i$audioGroups.join(\",\")}\" (${(_data$frag3 = data.frag) == null ? void 0 : _data$frag3.type} fragment) ${arrayToHex(levelKey.keyId || [])}`);\n              levels[i].fragmentError++;\n              levels[i].loadError++;\n              this.log(`Removing level ${i} with key error (${data.error})`);\n              this.hls.removeLevel(i);\n            }\n          }\n          const frag = data.frag;\n          if (this.hls.levels.length < levelCountWithError) {\n            errorAction.resolved = true;\n          } else if (frag && frag.type !== PlaylistLevelType.MAIN) {\n            const fragLevelKey = frag.decryptdata;\n            if (fragLevelKey && !levelKey.matches(fragLevelKey)) {\n              errorAction.resolved = true;\n            }\n          }\n        }\n        break;\n      }\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      if (data.details === ErrorDetails.BUFFER_ADD_CODEC_ERROR && data.mimeType && data.sourceBufferName !== \"audiovideo\") {\n        const codec = getCodecsForMimeType(data.mimeType);\n        const levels = this.hls.levels;\n        for (let i = levels.length; i--; ) {\n          if (levels[i][`${data.sourceBufferName}Codec`] === codec) {\n            this.log(`Removing level ${i} for ${data.details} (\"${codec}\" not supported)`);\n            this.hls.removeLevel(i);\n          }\n        }\n      }\n    }\n  }\n}\nfunction createDoNothingErrorAction(resolved) {\n  const errorAction = {\n    action: NetworkErrorAction.DoNothing,\n    flags: ErrorActionFlags.None\n  };\n  if (resolved) {\n    errorAction.resolved = true;\n  }\n  return errorAction;\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 = Object.create(null);\n    this.endListFragments = Object.create(null);\n    this.fragments = Object.create(null);\n    this.timeRanges = 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    if (hls) {\n      hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n      hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n    }\n  }\n  _unregisterListeners() {\n    const {\n      hls\n    } = this;\n    if (hls) {\n      hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n      hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n    }\n  }\n  destroy() {\n    this._unregisterListeners();\n    this.hls = this.fragments = this.activePartLists = this.endListFragments = this.timeRanges = 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        if (activePart.start <= position && position <= activePart.end && activePart.loaded) {\n          return activePart;\n        }\n      }\n    }\n    return this.getBufferedFrag(position, levelType);\n  }\n  getBufferedFrag(position, levelType) {\n    return this.getFragAtPos(position, levelType, true);\n  }\n  getFragAtPos(position, levelType, buffered) {\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 && (!buffered || 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  detectEvictedFragments(elementaryStream, timeRange, playlistType, appendedPart, removeAppending) {\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 || removeAppending)) {\n        if (fragmentEntity.body.type === playlistType) {\n          this.removeFragment(fragmentEntity.body);\n        }\n        return;\n      }\n      const esData = fragmentEntity.range[elementaryStream];\n      if (!esData) {\n        return;\n      }\n      if (esData.time.length === 0) {\n        this.removeFragment(fragmentEntity.body);\n        return;\n      }\n      esData.time.some((time) => {\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  detectPartialFragments(data) {\n    const timeRanges = this.timeRanges;\n    if (!timeRanges || data.frag.sn === \"initSegment\") {\n      return;\n    }\n    const frag = data.frag;\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, data.part, partial, timeRange);\n    });\n    fragmentEntity.loaded = null;\n    if (Object.keys(fragmentEntity.range).length) {\n      this.bufferedEnd(fragmentEntity, frag);\n      if (!isPartial(fragmentEntity)) {\n        this.removeParts(frag.sn - 1, frag.type);\n      }\n    } else {\n      this.removeFragment(fragmentEntity.body);\n    }\n  }\n  bufferedEnd(fragmentEntity, frag) {\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  }\n  removeParts(snToKeep, levelType) {\n    const activeParts = this.activePartLists[levelType];\n    if (!activeParts) {\n      return;\n    }\n    this.activePartLists[levelType] = filterParts(activeParts, (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: Object.create(null)\n      };\n      if (frag.gap) {\n        this.hasGaps = true;\n      }\n    }\n    if (fragmentEntity) {\n      fragmentEntity.loaded = null;\n      this.bufferedEnd(fragmentEntity, frag);\n    }\n  }\n  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  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  onManifestLoading() {\n    this.removeAllFragments();\n  }\n  onFragLoaded(event, data) {\n    if (data.frag.sn === \"initSegment\" || data.frag.bitrateTest) {\n      return;\n    }\n    const frag = data.frag;\n    const loaded = data.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: Object.create(null)\n    };\n  }\n  onBufferAppended(event, data) {\n    const {\n      frag,\n      part,\n      timeRanges,\n      type\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    const timeRange = timeRanges[type];\n    this.detectEvictedFragments(type, timeRange, playlistType, part);\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  hasFragments(type) {\n    const {\n      fragments\n    } = this;\n    const keys = Object.keys(fragments);\n    if (!type) {\n      return keys.length > 0;\n    }\n    for (let i = keys.length; i--; ) {\n      const fragmentEntity = fragments[keys[i]];\n      if ((fragmentEntity == null ? void 0 : fragmentEntity.body.type) === type) {\n        return true;\n      }\n    }\n    return false;\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.clearElementaryStreamInfo();\n    const activeParts = this.activePartLists[fragment.type];\n    if (activeParts) {\n      const snToRemove = fragment.sn;\n      this.activePartLists[fragment.type] = filterParts(activeParts, (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    var _this$hls;\n    this.fragments = Object.create(null);\n    this.endListFragments = Object.create(null);\n    this.activePartLists = Object.create(null);\n    this.hasGaps = false;\n    const partlist = (_this$hls = this.hls) == null || (_this$hls = _this$hls.latestLevelDetails) == null ? void 0 : _this$hls.partList;\n    if (partlist) {\n      partlist.forEach((part) => part.clearElementaryStreamInfo());\n    }\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 && _fragmentEntity$range.partial || (_fragmentEntity$range2 = fragmentEntity.range.audio) != null && _fragmentEntity$range2.partial || (_fragmentEntity$range3 = fragmentEntity.range.audiovideo) != null && _fragmentEntity$range3.partial);\n}\nfunction getFragmentKey(fragment) {\n  return `${fragment.type}_${fragment.level}_${fragment.sn}`;\n}\nfunction filterParts(partList, predicate) {\n  return partList.filter((part) => {\n    const keep = predicate(part);\n    if (!keep) {\n      part.clearElementaryStreamInfo();\n    }\n    return keep;\n  });\n}\nvar DecrypterAesMode = {\n  cbc: 0,\n  ctr: 1\n};\nclass AESCrypto {\n  constructor(subtle, iv, aesMode) {\n    this.subtle = void 0;\n    this.aesIV = void 0;\n    this.aesMode = void 0;\n    this.subtle = subtle;\n    this.aesIV = iv;\n    this.aesMode = aesMode;\n  }\n  decrypt(data, key) {\n    switch (this.aesMode) {\n      case DecrypterAesMode.cbc:\n        return this.subtle.decrypt({\n          name: \"AES-CBC\",\n          iv: this.aesIV\n        }, key, data);\n      case DecrypterAesMode.ctr:\n        return this.subtle.decrypt({\n          name: \"AES-CTR\",\n          counter: this.aesIV,\n          length: 64\n        }, key, data);\n      default:\n        throw new Error(`[AESCrypto] invalid aes mode ${this.aesMode}`);\n    }\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 array.slice(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  uint8ArrayToUint32Array_(arrayBuffer) {\n    const view2 = new DataView(arrayBuffer);\n    const newArray = new Uint32Array(4);\n    for (let i = 0; i < 4; i++) {\n      newArray[i] = view2.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  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}\nclass FastAESKey {\n  constructor(subtle, key, aesMode) {\n    this.subtle = void 0;\n    this.key = void 0;\n    this.aesMode = void 0;\n    this.subtle = subtle;\n    this.key = key;\n    this.aesMode = aesMode;\n  }\n  expandKey() {\n    const subtleAlgoName = getSubtleAlgoName(this.aesMode);\n    return this.subtle.importKey(\"raw\", this.key, {\n      name: subtleAlgoName\n    }, false, [\"encrypt\", \"decrypt\"]);\n  }\n}\nfunction getSubtleAlgoName(aesMode) {\n  switch (aesMode) {\n    case DecrypterAesMode.cbc:\n      return \"AES-CBC\";\n    case DecrypterAesMode.ctr:\n      return \"AES-CTR\";\n    default:\n      throw new Error(`[FastAESKey] invalid aes mode ${aesMode}`);\n  }\n}\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.enableSoftwareAES = void 0;\n    this.enableSoftwareAES = 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    this.useSoftware = !this.subtle;\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, aesMode) {\n    if (this.useSoftware) {\n      return new Promise((resolve, reject) => {\n        const dataView = ArrayBuffer.isView(data) ? data : new Uint8Array(data);\n        this.softwareDecrypt(dataView, key, iv, aesMode);\n        const decryptResult = this.flush();\n        if (decryptResult) {\n          resolve(decryptResult.buffer);\n        } else {\n          reject(new Error(\"[softwareDecrypt] Failed to decrypt data\"));\n        }\n      });\n    }\n    return this.webCryptoDecrypt(new Uint8Array(data), key, iv, aesMode);\n  }\n  softwareDecrypt(data, key, iv, aesMode) {\n    const {\n      currentIV,\n      currentResult,\n      remainderData\n    } = this;\n    if (aesMode !== DecrypterAesMode.cbc || key.byteLength !== 16) {\n      logger.warn(\"SoftwareDecrypt: can only handle AES-128-CBC\");\n      return null;\n    }\n    this.logOnce(\"JS AES decrypt\");\n    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 = currentChunk.slice(-16).buffer;\n    if (!result) {\n      return null;\n    }\n    return result;\n  }\n  webCryptoDecrypt(data, key, iv, aesMode) {\n    if (this.key !== key || !this.fastAesKey) {\n      if (!this.subtle) {\n        return Promise.resolve(this.onWebCryptoError(data, key, iv, aesMode));\n      }\n      this.key = key;\n      this.fastAesKey = new FastAESKey(this.subtle, key, aesMode);\n    }\n    return this.fastAesKey.expandKey().then((aesKey) => {\n      if (!this.subtle) {\n        return Promise.reject(new Error(\"web crypto not initialized\"));\n      }\n      this.logOnce(\"WebCrypto AES decrypt\");\n      const crypto2 = new AESCrypto(this.subtle, new Uint8Array(iv), aesMode);\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, aesMode);\n    });\n  }\n  onWebCryptoError(data, key, iv, aesMode) {\n    const enableSoftwareAES = this.enableSoftwareAES;\n    if (enableSoftwareAES) {\n      this.useSoftware = true;\n      this.logEnabled = true;\n      this.softwareDecrypt(data, key, iv, aesMode);\n      const decryptResult = this.flush();\n      if (decryptResult) {\n        return decryptResult.buffer;\n      }\n    }\n    throw new Error(\"WebCrypto\" + (enableSoftwareAES ? \" 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 = data.slice(0, splitPoint);\n      this.remainderData = data.slice(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 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 = FragmentILoader ? new FragmentILoader(config) : new DefaultILoader(config);\n      const loaderContext = createLoaderContext(frag);\n      frag.loader = loader;\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      const callbacks = {\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      };\n      if (onProgress) {\n        callbacks.onProgress = (stats, context, data, networkDetails) => onProgress({\n          frag,\n          part: null,\n          payload: data,\n          networkDetails\n        });\n      }\n      loader.load(loaderContext, loaderConfig, callbacks);\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 = FragmentILoader ? new FragmentILoader(config) : new DefaultILoader(config);\n      const loaderContext = createLoaderContext(frag, part);\n      frag.loader = loader;\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\" && isMethodFullSegmentAesCbc((_frag$decryptdata = frag.decryptdata) == null ? void 0 : _frag$decryptdata.method)) {\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}\nfunction isMethodFullSegmentAesCbc(method) {\n  return method === \"AES-128\" || method === \"AES-256\";\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 TaskLoop extends Logger {\n  constructor(label, logger2) {\n    super(label, logger2);\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  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  clearInterval() {\n    if (this._tickInterval) {\n      self.clearInterval(this._tickInterval);\n      this._tickInterval = null;\n      return true;\n    }\n    return false;\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  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  doTick() {\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}\nconst noopBuffered = {\n  length: 0,\n  start: () => 0,\n  end: () => 0\n};\nclass BufferHelper {\n  static isBuffered(media, position) {\n    if (media) {\n      const buffered = BufferHelper.getBuffered(media);\n      for (let i = buffered.length; i--; ) {\n        if (position >= buffered.start(i) && position <= buffered.end(i)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  static bufferedRanges(media) {\n    if (media) {\n      const timeRanges = BufferHelper.getBuffered(media);\n      return BufferHelper.timeRangesToArray(timeRanges);\n    }\n    return [];\n  }\n  static timeRangesToArray(timeRanges) {\n    const buffered = [];\n    for (let i = 0; i < timeRanges.length; i++) {\n      buffered.push({\n        start: timeRanges.start(i),\n        end: timeRanges.end(i)\n      });\n    }\n    return buffered;\n  }\n  static bufferInfo(media, pos, maxHoleDuration) {\n    if (media) {\n      const buffered = BufferHelper.bufferedRanges(media);\n      if (buffered.length) {\n        return BufferHelper.bufferedInfo(buffered, pos, maxHoleDuration);\n      }\n    }\n    return {\n      len: 0,\n      start: pos,\n      end: pos,\n      bufferedIndex: -1\n    };\n  }\n  static bufferedInfo(buffered, pos, maxHoleDuration) {\n    pos = Math.max(0, pos);\n    if (buffered.length > 1) {\n      buffered.sort((a, b) => a.start - b.start || b.end - a.end);\n    }\n    let bufferedIndex = -1;\n    let buffered2 = [];\n    if (maxHoleDuration) {\n      for (let i = 0; i < buffered.length; i++) {\n        if (pos >= buffered[i].start && pos <= buffered[i].end) {\n          bufferedIndex = i;\n        }\n        const buf2len = buffered2.length;\n        if (buf2len) {\n          const buf2end = buffered2[buf2len - 1].end;\n          if (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 nextStart;\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 (bufferedIndex === -1 && pos >= start && pos <= end) {\n        bufferedIndex = i;\n      }\n      if (pos + maxHoleDuration >= start && pos < end) {\n        bufferStart = start;\n        bufferEnd = end;\n        bufferLen = bufferEnd - pos;\n      } else if (pos + maxHoleDuration < start) {\n        nextStart = start;\n        break;\n      }\n    }\n    return {\n      len: bufferLen,\n      start: bufferStart || 0,\n      end: bufferEnd || 0,\n      nextStart,\n      buffered,\n      bufferedIndex\n    };\n  }\n  static getBuffered(media) {\n    try {\n      return media.buffered || noopBuffered;\n    } catch (e) {\n      logger.log(\"failed to get media.buffered\", e);\n      return noopBuffered;\n    }\n  }\n}\nconst VARIABLE_REPLACEMENT_REGEX = /\\{\\$([a-zA-Z0-9-_]+)\\}/g;\nfunction hasVariableReferences(str) {\n  return VARIABLE_REPLACEMENT_REGEX.test(str);\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}\nconst DECIMAL_RESOLUTION_REGEX = /^(\\d+)x(\\d+)$/;\nconst ATTR_LIST_REGEX = /(.+?)=(\".*?\"|.*?)(?:,|$)/g;\nclass AttrList {\n  constructor(attrs, parsed) {\n    if (typeof attrs === \"string\") {\n      attrs = AttrList.parseAttrList(attrs, parsed);\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    }\n    return null;\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  enumeratedStringList(attrName, dict) {\n    const attrValue = this[attrName];\n    return (attrValue ? attrValue.split(/[ ,]+/) : []).reduce((result, identifier) => {\n      result[identifier.toLowerCase()] = true;\n      return result;\n    }, dict);\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, parsed) {\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      const name = match[1].trim();\n      let value = match[2];\n      const quotedString = value.indexOf(quote) === 0 && value.lastIndexOf(quote) === value.length - 1;\n      let hexadecimalSequence = false;\n      if (quotedString) {\n        value = value.slice(1, -1);\n      } else {\n        switch (name) {\n          case \"IV\":\n          case \"SCTE35-CMD\":\n          case \"SCTE35-IN\":\n          case \"SCTE35-OUT\":\n            hexadecimalSequence = true;\n        }\n      }\n      if (parsed && (quotedString || hexadecimalSequence)) {\n        {\n          value = substituteVariables(parsed, value);\n        }\n      } else if (!hexadecimalSequence && !quotedString) {\n        switch (name) {\n          case \"CLOSED-CAPTIONS\":\n            if (value === \"NONE\") {\n              break;\n            }\n          case \"ALLOWED-CPC\":\n          case \"CLASS\":\n          case \"ASSOC-LANGUAGE\":\n          case \"AUDIO\":\n          case \"BYTERANGE\":\n          case \"CHANNELS\":\n          case \"CHARACTERISTICS\":\n          case \"CODECS\":\n          case \"DATA-ID\":\n          case \"END-DATE\":\n          case \"GROUP-ID\":\n          case \"ID\":\n          case \"IMPORT\":\n          case \"INSTREAM-ID\":\n          case \"KEYFORMAT\":\n          case \"KEYFORMATVERSIONS\":\n          case \"LANGUAGE\":\n          case \"NAME\":\n          case \"PATHWAY-ID\":\n          case \"QUERYPARAM\":\n          case \"RECENTLY-REMOVED-DATERANGES\":\n          case \"SERVER-URI\":\n          case \"STABLE-RENDITION-ID\":\n          case \"STABLE-VARIANT-ID\":\n          case \"START-DATE\":\n          case \"SUBTITLES\":\n          case \"SUPPLEMENTAL-CODECS\":\n          case \"URI\":\n          case \"VALUE\":\n          case \"VIDEO\":\n          case \"X-ASSET-LIST\":\n          case \"X-ASSET-URI\":\n            logger.warn(`${input}: attribute ${name} is missing quotes`);\n        }\n      }\n      attrs[name] = value;\n    }\n    return attrs;\n  }\n}\nconst CLASS_INTERSTITIAL = \"com.apple.hls.interstitial\";\nfunction isDateRangeCueAttribute(attrName) {\n  return attrName !== \"ID\" && attrName !== \"CLASS\" && attrName !== \"CUE\" && attrName !== \"START-DATE\" && attrName !== \"DURATION\" && attrName !== \"END-DATE\" && attrName !== \"END-ON-NEXT\";\n}\nfunction isSCTE35Attribute(attrName) {\n  return attrName === \"SCTE35-OUT\" || attrName === \"SCTE35-IN\" || attrName === \"SCTE35-CMD\";\n}\nclass DateRange {\n  constructor(dateRangeAttr, dateRangeWithSameId, tagCount = 0) {\n    var _dateRangeWithSameId$;\n    this.attr = void 0;\n    this.tagAnchor = void 0;\n    this.tagOrder = void 0;\n    this._startDate = void 0;\n    this._endDate = void 0;\n    this._dateAtEnd = void 0;\n    this._cue = void 0;\n    this._badValueForSameId = void 0;\n    this.tagAnchor = (dateRangeWithSameId == null ? void 0 : dateRangeWithSameId.tagAnchor) || null;\n    this.tagOrder = (_dateRangeWithSameId$ = dateRangeWithSameId == null ? void 0 : dateRangeWithSameId.tagOrder) != null ? _dateRangeWithSameId$ : tagCount;\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    if (dateRangeWithSameId) {\n      this._startDate = dateRangeWithSameId._startDate;\n      this._cue = dateRangeWithSameId._cue;\n      this._endDate = dateRangeWithSameId._endDate;\n      this._dateAtEnd = dateRangeWithSameId._dateAtEnd;\n    } else {\n      this._startDate = new Date(dateRangeAttr[\"START-DATE\"]);\n    }\n    if (\"END-DATE\" in this.attr) {\n      const endDate = (dateRangeWithSameId == null ? void 0 : dateRangeWithSameId.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 cue() {\n    const _cue = this._cue;\n    if (_cue === void 0) {\n      return this._cue = this.attr.enumeratedStringList(this.attr.CUE ? \"CUE\" : \"X-CUE\", {\n        pre: false,\n        post: false,\n        once: false\n      });\n    }\n    return _cue;\n  }\n  get startTime() {\n    const {\n      tagAnchor\n    } = this;\n    if (tagAnchor === null || tagAnchor.programDateTime === null) {\n      logger.warn(`Expected tagAnchor Fragment with PDT set for DateRange \"${this.id}\": ${tagAnchor}`);\n      return NaN;\n    }\n    return tagAnchor.start + (this.startDate.getTime() - tagAnchor.programDateTime) / 1e3;\n  }\n  get startDate() {\n    return this._startDate;\n  }\n  get endDate() {\n    const dateAtEnd = this._endDate || this._dateAtEnd;\n    if (dateAtEnd) {\n      return dateAtEnd;\n    }\n    const duration = this.duration;\n    if (duration !== null) {\n      return this._dateAtEnd = new Date(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 isInterstitial() {\n    return this.class === CLASS_INTERSTITIAL;\n  }\n  get isValid() {\n    return !!this.id && !this._badValueForSameId && isFiniteNumber(this.startDate.getTime()) && (this.duration === null || this.duration >= 0) && (!this.endOnNext || !!this.class) && (!this.attr.CUE || !this.cue.pre && !this.cue.post || this.cue.pre !== this.cue.post) && (!this.isInterstitial || \"X-ASSET-URI\" in this.attr || \"X-ASSET-LIST\" in this.attr);\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.dateRangeTagCount = 0;\n    this.live = true;\n    this.requestScheduled = -1;\n    this.ageHeader = 0;\n    this.advancedDateTime = void 0;\n    this.updated = true;\n    this.advanced = true;\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.appliedTimelineOffset = void 0;\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  }\n  hasKey(levelKey) {\n    return this.encryptedFragments.some((frag) => {\n      let decryptdata = frag.decryptdata;\n      if (!decryptdata) {\n        frag.setKeyFormat(levelKey.keyFormat);\n        decryptdata = frag.decryptdata;\n      }\n      return !!decryptdata && levelKey.matches(decryptdata);\n    });\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    if (this.fragments.length) {\n      return this.fragments[this.fragments.length - 1].end;\n    }\n    return 0;\n  }\n  get fragmentStart() {\n    if (this.fragments.length) {\n      return this.fragments[0].start;\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 maxPartIndex() {\n    const partList = this.partList;\n    if (partList) {\n      const lastIndex = this.lastPartIndex;\n      if (lastIndex !== -1) {\n        for (let i = partList.length; i--; ) {\n          if (partList[i].index > lastIndex) {\n            return partList[i].index;\n          }\n        }\n        return lastIndex;\n      }\n    }\n    return 0;\n  }\n  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  get expired() {\n    if (this.live && this.age && this.misses < 3) {\n      const playlistWindowDuration = this.partEnd - this.fragmentStart;\n      return this.age > Math.max(playlistWindowDuration, this.totalduration) + this.levelTargetDuration;\n    }\n    return false;\n  }\n}\nfunction arrayValuesMatch(a, b) {\n  if (a.length === b.length) {\n    return !a.some((value, i) => value !== b[i]);\n  }\n  return false;\n}\nfunction optionalArrayValuesMatch(a, b) {\n  if (!a && !b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return arrayValuesMatch(a, b);\n}\nfunction isFullSegmentEncryption(method) {\n  return method === \"AES-128\" || method === \"AES-256\" || method === \"AES-256-CTR\";\n}\nfunction getAesModeFromFullSegmentMethod(method) {\n  switch (method) {\n    case \"AES-128\":\n    case \"AES-256\":\n      return DecrypterAesMode.cbc;\n    case \"AES-256-CTR\":\n      return DecrypterAesMode.ctr;\n    default:\n      throw new Error(`invalid full segment method ${method}`);\n  }\n}\nfunction base64Decode(base64encodedStr) {\n  return Uint8Array.from(atob(base64encodedStr), (c) => c.charCodeAt(0));\n}\nfunction strToUtf8array(str) {\n  return Uint8Array.from(unescape(encodeURIComponent(str)), (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}\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}\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 isPersistentSessionType(drmSystemOptions) {\n  var _drmSystemOptions$ses;\n  return !!drmSystemOptions && (drmSystemOptions.sessionType === \"persistent-license\" || !!((_drmSystemOptions$ses = drmSystemOptions.sessionTypes) != null && _drmSystemOptions$ses.some((type) => type === \"persistent-license\")));\n}\nfunction parsePlayReadyWRM(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      return keyIdArray;\n    }\n  }\n  return null;\n}\nlet keyUriToKeyIdMap = {};\nclass LevelKey {\n  static clearKeyUriToKeyIdMap() {\n    keyUriToKeyIdMap = {};\n  }\n  static setKeyIdForUri(uri, keyId) {\n    keyUriToKeyIdMap[uri] = keyId;\n  }\n  static addKeyIdForUri(uri) {\n    const val = Object.keys(keyUriToKeyIdMap).length % Number.MAX_SAFE_INTEGER;\n    const keyId = new Uint8Array(16);\n    const dv = new DataView(keyId.buffer, 12, 4);\n    dv.setUint32(0, val);\n    keyUriToKeyIdMap[uri] = keyId;\n    return keyId;\n  }\n  constructor(method, uri, format2, formatversions = [1], iv = null, keyId) {\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 && !isFullSegmentEncryption(method);\n    if (keyId != null && keyId.startsWith(\"0x\")) {\n      this.keyId = new Uint8Array(hexToArrayBuffer(keyId));\n    }\n  }\n  matches(key) {\n    return key.uri === this.uri && key.method === this.method && key.encrypted === this.encrypted && key.keyFormat === this.keyFormat && arrayValuesMatch(key.keyFormatVersions, this.keyFormatVersions) && optionalArrayValuesMatch(key.iv, this.iv) && optionalArrayValuesMatch(key.keyId, this.keyId);\n  }\n  isSupported() {\n    if (this.method) {\n      if (isFullSegmentEncryption(this.method) || 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 [\"SAMPLE-AES\", \"SAMPLE-AES-CENC\", \"SAMPLE-AES-CTR\"].indexOf(this.method) !== -1;\n        }\n      }\n    }\n    return false;\n  }\n  getDecryptData(sn, levelKeys) {\n    if (!this.encrypted || !this.uri) {\n      return null;\n    }\n    if (isFullSegmentEncryption(this.method)) {\n      let iv = this.iv;\n      if (!iv) {\n        if (typeof sn !== \"number\") {\n          logger.warn(`missing IV for initialization segment with method=\"${this.method}\" - compliance issue`);\n          sn = 0;\n        }\n        iv = createInitializationVector(sn);\n      }\n      const decryptdata = new LevelKey(this.method, this.uri, \"identity\", this.keyFormatVersions, iv);\n      return decryptdata;\n    }\n    if (this.keyId) {\n      const assignedKeyId = keyUriToKeyIdMap[this.uri];\n      if (assignedKeyId && !arrayValuesMatch(this.keyId, assignedKeyId)) {\n        LevelKey.setKeyIdForUri(this.uri, this.keyId);\n      }\n      if (this.pssh) {\n        return this;\n      }\n    }\n    const keyBytes = convertDataUriToArrayBytes(this.uri);\n    if (keyBytes) {\n      switch (this.keyFormat) {\n        case KeySystemFormats.WIDEVINE:\n          this.pssh = keyBytes;\n          if (!this.keyId) {\n            const results = parseMultiPssh(keyBytes.buffer);\n            if (results.length) {\n              var _psshData$kids;\n              const psshData = results[0];\n              this.keyId = (_psshData$kids = psshData.kids) != null && _psshData$kids.length ? psshData.kids[0] : null;\n            }\n          }\n          if (!this.keyId) {\n            this.keyId = getKeyIdFromPlayReadyKey(levelKeys);\n          }\n          break;\n        case KeySystemFormats.PLAYREADY: {\n          const PlayReadyKeySystemUUID = new Uint8Array([154, 4, 240, 121, 152, 64, 66, 134, 171, 146, 230, 91, 224, 136, 95, 149]);\n          this.pssh = mp4pssh(PlayReadyKeySystemUUID, null, keyBytes);\n          this.keyId = parsePlayReadyWRM(keyBytes);\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;\n      keyId = getKeyIdFromWidevineKey(levelKeys);\n      if (!keyId) {\n        keyId = getKeyIdFromPlayReadyKey(levelKeys);\n        if (!keyId) {\n          keyId = keyUriToKeyIdMap[this.uri];\n        }\n      }\n      if (keyId) {\n        this.keyId = keyId;\n        LevelKey.setKeyIdForUri(this.uri, keyId);\n      }\n    }\n    return this;\n  }\n}\nfunction getKeyIdFromWidevineKey(levelKeys) {\n  const widevineKey = levelKeys == null ? void 0 : levelKeys[KeySystemFormats.WIDEVINE];\n  if (widevineKey) {\n    return widevineKey.keyId;\n  }\n  return null;\n}\nfunction getKeyIdFromPlayReadyKey(levelKeys) {\n  const playReadyKey = levelKeys == null ? void 0 : levelKeys[KeySystemFormats.PLAYREADY];\n  if (playReadyKey) {\n    const playReadyKeyBytes = convertDataUriToArrayBytes(playReadyKey.uri);\n    if (playReadyKeyBytes) {\n      return parsePlayReadyWRM(playReadyKeyBytes);\n    }\n  }\n  return null;\n}\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 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  /(?!#) *(\\S[^\\r\\n]*)/.source,\n  /#.*/.source\n].join(\"|\"), \"g\");\nconst LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|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    if (!string.startsWith(\"#EXTM3U\")) {\n      parsed.playlistParsingError = new Error(\"no EXTM3U delimiter\");\n      return parsed;\n    }\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], parsed);\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        const supplementalCodecs = attrs[\"SUPPLEMENTAL-CODECS\"];\n        if (supplementalCodecs) {\n          level.supplemental = {};\n          setCodecs(supplementalCodecs, level.supplemental);\n        }\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, parsed);\n            const dataId = sessionAttrs[\"DATA-ID\"];\n            if (dataId) {\n              if (parsed.sessionData === null) {\n                parsed.sessionData = {};\n              }\n              parsed.sessionData[dataId] = sessionAttrs;\n            }\n            break;\n          }\n          case \"SESSION-KEY\": {\n            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, parsed);\n              addVariableDefinition(parsed, variableAttributes, baseurl);\n            }\n            break;\n          }\n          case \"CONTENT-STEERING\": {\n            const contentSteeringAttributes = new AttrList(attributes, parsed);\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], parsed);\n      const type = attrs.TYPE;\n      if (type) {\n        const groups = groupsByType[type];\n        const medias = results[type] || [];\n        results[type] = medias;\n        const lang = attrs.LANGUAGE;\n        const assocLang = attrs[\"ASSOC-LANGUAGE\"];\n        const channels = attrs.CHANNELS;\n        const characteristics = attrs.CHARACTERISTICS;\n        const instreamId = attrs[\"INSTREAM-ID\"];\n        const media = {\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    var _LEVEL_PLAYLIST_REGEX;\n    const base = {\n      url: baseurl\n    };\n    const level = new LevelDetails(baseurl);\n    const fragments = level.fragments;\n    const programDateTimes = [];\n    let currentInitSegment = null;\n    let currentSN = 0;\n    let currentPart = 0;\n    let totalduration = 0;\n    let discontinuityCounter = 0;\n    let currentBitrate = 0;\n    let prevFrag = null;\n    let frag = new Fragment(type, base);\n    let result;\n    let i;\n    let levelkeys;\n    let firstPdtIndex = -1;\n    let createNextFrag = false;\n    let nextByteRange = null;\n    let serverControlAttrs;\n    LEVEL_PLAYLIST_REGEX_FAST.lastIndex = 0;\n    level.m3u8 = string;\n    level.hasVariableRefs = hasVariableReferences(string);\n    if (((_LEVEL_PLAYLIST_REGEX = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) == null ? void 0 : _LEVEL_PLAYLIST_REGEX[0]) !== \"#EXTM3U\") {\n      level.playlistParsingError = new Error(\"Missing format identifier #EXTM3U\");\n      return level;\n    }\n    while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {\n      if (createNextFrag) {\n        createNextFrag = false;\n        frag = new Fragment(type, base);\n        frag.playlistOffset = totalduration;\n        frag.setStart(totalduration);\n        frag.sn = currentSN;\n        frag.cc = discontinuityCounter;\n        if (currentBitrate) {\n          frag.bitrate = currentBitrate;\n        }\n        frag.level = id;\n        if (currentInitSegment) {\n          frag.initSegment = currentInitSegment;\n          if (currentInitSegment.rawProgramDateTime) {\n            frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n            currentInitSegment.rawProgramDateTime = null;\n          }\n          if (nextByteRange) {\n            frag.setByteRange(nextByteRange);\n            nextByteRange = null;\n          }\n        }\n      }\n      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.playlistOffset = totalduration;\n          frag.setStart(totalduration);\n          if (levelkeys) {\n            setFragLevelKeys(frag, levelkeys, level);\n          }\n          frag.sn = currentSN;\n          frag.level = id;\n          frag.cc = discontinuityCounter;\n          fragments.push(frag);\n          const uri = (\" \" + result[3]).slice(1);\n          frag.relurl = substituteVariables(level, uri);\n          assignProgramDateTime(frag, prevFrag, programDateTimes);\n          prevFrag = frag;\n          totalduration += frag.duration;\n          currentSN++;\n          currentPart = 0;\n          createNextFrag = true;\n        }\n      } else {\n        result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW);\n        if (!result) {\n          logger.warn(\"No matches on slow regex match for level playlist!\");\n          continue;\n        }\n        for (i = 1; i < result.length; i++) {\n          if (result[i] !== void 0) {\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) : null;\n        switch (tag) {\n          case \"BYTERANGE\":\n            if (prevFrag) {\n              frag.setByteRange(value1, prevFrag);\n            } else {\n              frag.setByteRange(value1);\n            }\n            break;\n          case \"PROGRAM-DATE-TIME\":\n            frag.rawProgramDateTime = value1;\n            frag.tagList.push([\"PROGRAM-DATE-TIME\", value1]);\n            if (firstPdtIndex === -1) {\n              firstPdtIndex = fragments.length;\n            }\n            break;\n          case \"PLAYLIST-TYPE\":\n            if (level.type) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.type = value1.toUpperCase();\n            break;\n          case \"MEDIA-SEQUENCE\":\n            if (level.startSN !== 0) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            } else if (fragments.length > 0) {\n              assignMustAppearBeforeSegmentsError(level, tag, result);\n            }\n            currentSN = level.startSN = parseInt(value1);\n            break;\n          case \"SKIP\": {\n            if (level.skippedSegments) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            const skipAttrs = new AttrList(value1, level);\n            const skippedSegments = skipAttrs.decimalInteger(\"SKIPPED-SEGMENTS\");\n            if (isFiniteNumber(skippedSegments)) {\n              level.skippedSegments += skippedSegments;\n              for (let _i = skippedSegments; _i--; ) {\n                fragments.push(null);\n              }\n              currentSN += skippedSegments;\n            }\n            const recentlyRemovedDateranges = skipAttrs.enumeratedString(\"RECENTLY-REMOVED-DATERANGES\");\n            if (recentlyRemovedDateranges) {\n              level.recentlyRemovedDateranges = (level.recentlyRemovedDateranges || []).concat(recentlyRemovedDateranges.split(\"\t\"));\n            }\n            break;\n          }\n          case \"TARGETDURATION\":\n            if (level.targetduration !== 0) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.targetduration = Math.max(parseInt(value1), 1);\n            break;\n          case \"VERSION\":\n            if (level.version !== null) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.version = parseInt(value1);\n            break;\n          case \"INDEPENDENT-SEGMENTS\":\n            break;\n          case \"ENDLIST\":\n            if (!level.live) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            level.live = false;\n            break;\n          case \"#\":\n            if (value1 || value2) {\n              frag.tagList.push(value2 ? [value1, value2] : [value1]);\n            }\n            break;\n          case \"DISCONTINUITY\":\n            discontinuityCounter++;\n            frag.tagList.push([\"DIS\"]);\n            break;\n          case \"GAP\":\n            frag.gap = true;\n            frag.tagList.push([tag]);\n            break;\n          case \"BITRATE\":\n            frag.tagList.push([tag, value1]);\n            currentBitrate = parseInt(value1) * 1e3;\n            if (isFiniteNumber(currentBitrate)) {\n              frag.bitrate = currentBitrate;\n            } else {\n              currentBitrate = 0;\n            }\n            break;\n          case \"DATERANGE\": {\n            const dateRangeAttr = new AttrList(value1, level);\n            const dateRange = new DateRange(dateRangeAttr, level.dateRanges[dateRangeAttr.ID], level.dateRangeTagCount);\n            level.dateRangeTagCount++;\n            if (dateRange.isValid || level.skippedSegments) {\n              level.dateRanges[dateRange.id] = dateRange;\n            } else {\n              logger.warn(`Ignoring invalid DATERANGE tag: \"${value1}\"`);\n            }\n            frag.tagList.push([\"EXT-X-DATERANGE\", value1]);\n            break;\n          }\n          case \"DEFINE\": {\n            {\n              const variableAttributes = new AttrList(value1, level);\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            if (level.startCC !== 0) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            } else if (fragments.length > 0) {\n              assignMustAppearBeforeSegmentsError(level, tag, result);\n            }\n            level.startCC = discontinuityCounter = parseInt(value1);\n            break;\n          case \"KEY\": {\n            const levelKey = parseKey(value1, baseurl, level);\n            if (levelKey.isSupported()) {\n              if (levelKey.method === \"NONE\") {\n                levelkeys = void 0;\n                break;\n              }\n              if (!levelkeys) {\n                levelkeys = {};\n              }\n              const currentKey = levelkeys[levelKey.keyFormat];\n              if (!(currentKey != null && currentKey.matches(levelKey))) {\n                if (currentKey) {\n                  levelkeys = _extends({}, levelkeys);\n                }\n                levelkeys[levelKey.keyFormat] = levelKey;\n              }\n            } else {\n              logger.warn(`[Keys] Ignoring unsupported 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, level);\n            if (frag.duration) {\n              const init = new Fragment(type, base);\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            currentInitSegment.cc = discontinuityCounter;\n            break;\n          }\n          case \"SERVER-CONTROL\": {\n            if (serverControlAttrs) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            serverControlAttrs = new AttrList(value1);\n            level.canBlockReload = serverControlAttrs.bool(\"CAN-BLOCK-RELOAD\");\n            level.canSkipUntil = serverControlAttrs.optionalFloat(\"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            if (level.partTarget) {\n              assignMultipleMediaPlaylistTagOccuranceError(level, tag, result);\n            }\n            const partInfAttrs = new AttrList(value1);\n            level.partTarget = partInfAttrs.decimalFloatingPoint(\"PART-TARGET\");\n            break;\n          }\n          case \"PART\": {\n            let partList = level.partList;\n            if (!partList) {\n              partList = level.partList = [];\n            }\n            const previousFragmentPart = currentPart > 0 ? partList[partList.length - 1] : void 0;\n            const index = currentPart++;\n            const partAttrs = new AttrList(value1, level);\n            const part = new Part(partAttrs, frag, base, index, previousFragmentPart);\n            partList.push(part);\n            frag.duration += part.duration;\n            break;\n          }\n          case \"PRELOAD-HINT\": {\n            const preloadHintAttrs = new AttrList(value1, level);\n            level.preloadHint = preloadHintAttrs;\n            break;\n          }\n          case \"RENDITION-REPORT\": {\n            const renditionReportAttrs = new AttrList(value1, level);\n            level.renditionReports = level.renditionReports || [];\n            level.renditionReports.push(renditionReportAttrs);\n            break;\n          }\n          default:\n            logger.warn(`line parsed but not handled: ${result}`);\n            break;\n        }\n      }\n    }\n    if (prevFrag && !prevFrag.relurl) {\n      fragments.pop();\n      totalduration -= prevFrag.duration;\n      if (level.partList) {\n        level.fragmentHint = prevFrag;\n      }\n    } else if (level.partList) {\n      assignProgramDateTime(frag, prevFrag, programDateTimes);\n      frag.cc = discontinuityCounter;\n      level.fragmentHint = frag;\n      if (levelkeys) {\n        setFragLevelKeys(frag, levelkeys, level);\n      }\n    }\n    if (!level.targetduration) {\n      level.playlistParsingError = new Error(`Missing Target Duration`);\n    }\n    const fragmentLength = fragments.length;\n    const firstFragment = fragments[0];\n    const lastFragment = fragments[fragmentLength - 1];\n    totalduration += level.skippedSegments * level.targetduration;\n    if (totalduration > 0 && fragmentLength && lastFragment) {\n      level.averagetargetduration = totalduration / fragmentLength;\n      const lastSn = lastFragment.sn;\n      level.endSN = lastSn !== \"initSegment\" ? lastSn : 0;\n      if (!level.live) {\n        lastFragment.endList = true;\n      }\n      if (firstPdtIndex > 0) {\n        backfillProgramDateTimes(fragments, firstPdtIndex);\n        if (firstFragment) {\n          programDateTimes.unshift(firstFragment);\n        }\n      }\n    }\n    if (level.fragmentHint) {\n      totalduration += level.fragmentHint.duration;\n    }\n    level.totalduration = totalduration;\n    if (programDateTimes.length && level.dateRangeTagCount && firstFragment) {\n      mapDateRanges(programDateTimes, level);\n    }\n    level.endCC = discontinuityCounter;\n    return level;\n  }\n}\nfunction mapDateRanges(programDateTimes, details) {\n  let programDateTimeCount = programDateTimes.length;\n  if (!programDateTimeCount) {\n    if (details.hasProgramDateTime) {\n      const lastFragment = details.fragments[details.fragments.length - 1];\n      programDateTimes.push(lastFragment);\n      programDateTimeCount++;\n    } else {\n      return;\n    }\n  }\n  const lastProgramDateTime = programDateTimes[programDateTimeCount - 1];\n  const playlistEnd = details.live ? Infinity : details.totalduration;\n  const dateRangeIds = Object.keys(details.dateRanges);\n  for (let i = dateRangeIds.length; i--; ) {\n    const dateRange = details.dateRanges[dateRangeIds[i]];\n    const startDateTime = dateRange.startDate.getTime();\n    dateRange.tagAnchor = lastProgramDateTime.ref;\n    for (let j = programDateTimeCount; j--; ) {\n      var _programDateTimes$j;\n      if (((_programDateTimes$j = programDateTimes[j]) == null ? void 0 : _programDateTimes$j.sn) < details.startSN) {\n        break;\n      }\n      const fragIndex = findFragmentWithStartDate(details, startDateTime, programDateTimes, j, playlistEnd);\n      if (fragIndex !== -1) {\n        dateRange.tagAnchor = details.fragments[fragIndex].ref;\n        break;\n      }\n    }\n  }\n}\nfunction findFragmentWithStartDate(details, startDateTime, programDateTimes, index, endTime) {\n  const pdtFragment = programDateTimes[index];\n  if (pdtFragment) {\n    const pdtStart = pdtFragment.programDateTime;\n    if (startDateTime >= pdtStart || index === 0) {\n      var _programDateTimes;\n      const durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;\n      if (startDateTime <= pdtStart + durationBetweenPdt * 1e3) {\n        const startIndex = programDateTimes[index].sn - details.startSN;\n        if (startIndex < 0) {\n          return -1;\n        }\n        const fragments = details.fragments;\n        if (fragments.length > programDateTimes.length) {\n          const endSegment = programDateTimes[index + 1] || fragments[fragments.length - 1];\n          const endIndex = endSegment.sn - details.startSN;\n          for (let i = endIndex; i > startIndex; i--) {\n            const fragStartDateTime = fragments[i].programDateTime;\n            if (startDateTime >= fragStartDateTime && startDateTime < fragStartDateTime + fragments[i].duration * 1e3) {\n              return i;\n            }\n          }\n        }\n        return startIndex;\n      }\n    }\n  }\n  return -1;\n}\nfunction parseKey(keyTagAttributes, baseurl, parsed) {\n  var _keyAttrs$METHOD, _keyAttrs$KEYFORMAT;\n  const keyAttrs = new AttrList(keyTagAttributes, parsed);\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, keyAttrs.KEYID);\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.map((c) => c.split(\"/\")[0]).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, programDateTimes) {\n  if (frag.rawProgramDateTime) {\n    programDateTimes.push(frag);\n  } else if (prevFrag != null && prevFrag.programDateTime) {\n    frag.programDateTime = prevFrag.endProgramDateTime;\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}\nfunction assignMultipleMediaPlaylistTagOccuranceError(level, tag, result) {\n  level.playlistParsingError = new Error(`#EXT-X-${tag} must not appear more than once (${result[0]})`);\n}\nfunction assignMustAppearBeforeSegmentsError(level, tag, result) {\n  level.playlistParsingError = new Error(`#EXT-X-${tag} must appear before the first Media Segment (${result[0]})`);\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.setDuration(duration);\n    }\n  } else if (fragTo.sn > fragFrom.sn) {\n    const contiguous = fragFrom.cc === fragTo.cc;\n    if (contiguous && fragFrom.minEndPTS) {\n      fragTo.setStart(fragFrom.start + (fragFrom.minEndPTS - fragFrom.start));\n    } else {\n      fragTo.setStart(fragFrom.start + fragFrom.duration);\n    }\n  } else {\n    fragTo.setStart(Math.max(fragFrom.start - fragTo.duration, 0));\n  }\n}\nfunction updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS, logger2) {\n  const parsedMediaDuration = endPTS - startPTS;\n  if (parsedMediaDuration <= 0) {\n    logger2.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 (details && deltaPTS > details.totalduration) {\n      logger2.warn(`media timestamps and playlist times differ by ${deltaPTS}s for level ${frag.level} ${details.url}`);\n    } else 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 = frag.startDTS !== void 0 ? Math.min(startDTS, frag.startDTS) : startDTS;\n    minEndPTS = Math.min(endPTS, fragEndPts);\n    endPTS = Math.max(endPTS, fragEndPts);\n    endDTS = frag.endDTS !== void 0 ? Math.max(endDTS, frag.endDTS) : endDTS;\n  }\n  const drift = startPTS - frag.start;\n  if (frag.start !== 0) {\n    frag.setStart(startPTS);\n  }\n  frag.setDuration(endPTS - frag.start);\n  frag.startPTS = startPTS;\n  frag.maxStartPTS = maxStartPTS;\n  frag.startDTS = startDTS;\n  frag.endPTS = endPTS;\n  frag.minEndPTS = minEndPTS;\n  frag.endDTS = endDTS;\n  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, logger2) {\n  if (oldDetails === newDetails) {\n    return;\n  }\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 PTSFrag;\n  mapFragmentIntersection(oldDetails, newDetails, (oldFrag, newFrag, newFragIndex, newFragments2) => {\n    if ((!newDetails.startCC || newDetails.skippedSegments) && newFrag.cc !== oldFrag.cc) {\n      const ccOffset = oldFrag.cc - newFrag.cc;\n      for (let i = newFragIndex; i < newFragments2.length; i++) {\n        newFragments2[i].cc += ccOffset;\n      }\n      newDetails.endCC = newFragments2[newFragments2.length - 1].cc;\n    }\n    if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {\n      newFrag.setStart(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.setDuration(oldFrag.endPTS - oldFrag.startPTS);\n      if (newFrag.duration) {\n        PTSFrag = newFrag;\n      }\n      newDetails.PTSKnown = newDetails.alignedSliding = true;\n    }\n    if (oldFrag.hasStreams) {\n      newFrag.elementaryStreams = oldFrag.elementaryStreams;\n    }\n    newFrag.loader = oldFrag.loader;\n    if (oldFrag.hasStats) {\n      newFrag.stats = oldFrag.stats;\n    }\n    if (oldFrag.initSegment) {\n      newFrag.initSegment = oldFrag.initSegment;\n      currentInitSegment = oldFrag.initSegment;\n    }\n  });\n  const newFragments = newDetails.fragments;\n  const fragmentsToCheck = newDetails.fragmentHint ? newFragments.concat(newDetails.fragmentHint) : newFragments;\n  if (currentInitSegment) {\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 = newFragments.some((frag) => !frag);\n    if (newDetails.deltaUpdateFailed) {\n      logger2.warn(\"[level-helper] Previous playlist missing segments skipped in delta playlist\");\n      for (let i = newDetails.skippedSegments; i--; ) {\n        newFragments.shift();\n      }\n      newDetails.startSN = newFragments[0].sn;\n    } else {\n      if (newDetails.canSkipDateRanges) {\n        newDetails.dateRanges = mergeDateRanges(oldDetails.dateRanges, newDetails, logger2);\n      }\n      const programDateTimes = oldDetails.fragments.filter((frag) => frag.rawProgramDateTime);\n      if (oldDetails.hasProgramDateTime && !newDetails.hasProgramDateTime) {\n        for (let i = 1; i < fragmentsToCheck.length; i++) {\n          if (fragmentsToCheck[i].programDateTime === null) {\n            assignProgramDateTime(fragmentsToCheck[i], fragmentsToCheck[i - 1], programDateTimes);\n          }\n        }\n      }\n      mapDateRanges(programDateTimes, newDetails);\n    }\n    newDetails.endCC = newFragments[newFragments.length - 1].cc;\n  }\n  if (!newDetails.startCC) {\n    var _fragPriorToNewStart$;\n    const fragPriorToNewStart = getFragmentWithSN(oldDetails, newDetails.startSN - 1);\n    newDetails.startCC = (_fragPriorToNewStart$ = fragPriorToNewStart == null ? void 0 : fragPriorToNewStart.cc) != null ? _fragPriorToNewStart$ : newFragments[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, logger2);\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  if (newDetails.requestScheduled === -1) {\n    newDetails.requestScheduled = oldDetails.requestScheduled;\n  }\n}\nfunction mergeDateRanges(oldDateRanges, newDetails, logger2) {\n  const {\n    dateRanges: deltaDateRanges,\n    recentlyRemovedDateranges\n  } = newDetails;\n  const dateRanges = _extends({}, oldDateRanges);\n  if (recentlyRemovedDateranges) {\n    recentlyRemovedDateranges.forEach((id) => {\n      delete dateRanges[id];\n    });\n  }\n  const mergeIds = Object.keys(dateRanges);\n  const mergeCount = mergeIds.length;\n  if (!mergeCount) {\n    return deltaDateRanges;\n  }\n  Object.keys(deltaDateRanges).forEach((id) => {\n    const mergedDateRange = dateRanges[id];\n    const dateRange = new DateRange(deltaDateRanges[id].attr, mergedDateRange);\n    if (dateRange.isValid) {\n      dateRanges[id] = dateRange;\n      if (!mergedDateRange) {\n        dateRange.tagOrder += mergeCount;\n      }\n    } else {\n      logger2.warn(`Ignoring invalid Playlist Delta Update DATERANGE tag: \"${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 && oldFrag) {\n      newFrag = newDetails.fragments[i] = oldFrag;\n    }\n    if (oldFrag && newFrag) {\n      intersectionFn(oldFrag, newFrag, i, newFrags);\n      const uriBefore = oldFrag.relurl;\n      const uriAfter = newFrag.relurl;\n      if (uriBefore && notEqualAfterStrippingQueries(uriBefore, uriAfter)) {\n        newDetails.playlistParsingError = getSequenceError(`media sequence mismatch ${newFrag.sn}:`, oldDetails, newDetails, oldFrag, newFrag);\n        return;\n      } else if (oldFrag.cc !== newFrag.cc) {\n        newDetails.playlistParsingError = getSequenceError(`discontinuity sequence mismatch (${oldFrag.cc}!=${newFrag.cc})`, oldDetails, newDetails, oldFrag, newFrag);\n        return;\n      }\n    }\n  }\n}\nfunction getSequenceError(message, oldDetails, newDetails, oldFrag, newFrag) {\n  return new Error(`${message} ${newFrag.url}\nPlaylist starting @${oldDetails.startSN}\n${oldDetails.m3u8}\n\nPlaylist starting @${newDetails.startSN}\n${newDetails.m3u8}`);\n}\nfunction adjustSliding(oldDetails, newDetails, matchingStableVariantOrRendition = true) {\n  const delta = newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN;\n  const oldFragments = oldDetails.fragments;\n  const advancedOrStable = delta >= 0;\n  let sliding = 0;\n  if (advancedOrStable && delta < oldFragments.length) {\n    sliding = oldFragments[delta].start;\n  } else if (advancedOrStable && newDetails.startSN === oldDetails.endSN + 1) {\n    sliding = oldDetails.fragmentEnd;\n  } else if (advancedOrStable && matchingStableVariantOrRendition) {\n    sliding = oldDetails.fragmentStart + delta * newDetails.levelTargetDuration;\n  } else if (!newDetails.skippedSegments && newDetails.fragmentStart === 0) {\n    sliding = oldDetails.fragmentStart;\n  } else {\n    return;\n  }\n  addSliding(newDetails, sliding);\n}\nfunction addSliding(details, sliding) {\n  if (sliding) {\n    const fragments = details.fragments;\n    for (let i = details.skippedSegments; i < fragments.length; i++) {\n      fragments[i].addStart(sliding);\n    }\n    if (details.fragmentHint) {\n      details.fragmentHint.addStart(sliding);\n    }\n  }\n}\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(details, sn, fragCurrent) {\n  if (!details) {\n    return null;\n  }\n  let fragment = details.fragments[sn - details.startSN];\n  if (fragment) {\n    return fragment;\n  }\n  fragment = details.fragmentHint;\n  if (fragment && fragment.sn === sn) {\n    return fragment;\n  }\n  if (sn < details.startSN && fragCurrent && fragCurrent.sn === sn) {\n    return fragCurrent;\n  }\n  return null;\n}\nfunction getPartWith(details, sn, partIndex) {\n  if (!details) {\n    return null;\n  }\n  return findPart(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    var _level$details;\n    (_level$details = level.details) == null || _level$details.fragments.forEach((fragment) => {\n      fragment.level = index;\n      if (fragment.initSegment) {\n        fragment.initSegment.level = index;\n      }\n    });\n  });\n}\nfunction notEqualAfterStrippingQueries(uriBefore, uriAfter) {\n  if (uriBefore !== uriAfter && uriAfter) {\n    return stripQuery(uriBefore) !== stripQuery(uriAfter);\n  }\n  return false;\n}\nfunction stripQuery(uri) {\n  return uri.replace(/\\?[^?]*$/, \"\");\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(refDetails, details) {\n  if (refDetails) {\n    if (details.startCC < refDetails.endCC && details.endCC > refDetails.startCC) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction adjustFragmentStart(frag, sliding) {\n  const start = frag.start + sliding;\n  frag.startPTS = start;\n  frag.setStart(start);\n  frag.endPTS = start + frag.duration;\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(switchDetails, details) {\n  if (!switchDetails) {\n    return;\n  }\n  alignDiscontinuities(details, switchDetails);\n  if (!details.alignedSliding) {\n    alignMediaPlaylistByPDT(details, switchDetails);\n  }\n  if (!details.alignedSliding && !details.skippedSegments) {\n    adjustSliding(switchDetails, details, false);\n  }\n}\nfunction alignDiscontinuities(details, refDetails) {\n  if (!shouldAlignOnDiscontinuities(refDetails, details)) {\n    return;\n  }\n  const targetCC = Math.min(refDetails.endCC, details.endCC);\n  const refFrag = findFirstFragWithCC(refDetails.fragments, targetCC);\n  const frag = findFirstFragWithCC(details.fragments, targetCC);\n  if (!refFrag || !frag) {\n    return;\n  }\n  logger.log(`Aligning playlist at start of dicontinuity sequence ${targetCC}`);\n  const delta = refFrag.start - frag.start;\n  adjustSlidingStart(delta, details);\n}\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}\nfunction addEventListener(el, type, listener) {\n  removeEventListener(el, type, listener);\n  el.addEventListener(type, listener);\n}\nfunction removeEventListener(el, type, listener) {\n  el.removeEventListener(type, listener);\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(logPrefix, hls.logger);\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.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.buffering = true;\n    this.loadingParts = false;\n    this.loopSn = void 0;\n    this.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      const noFowardBuffer = !bufferInfo.len;\n      this.log(`Media seeking to ${isFiniteNumber(currentTime) ? currentTime.toFixed(3) : currentTime}, state: ${state}, ${noFowardBuffer ? \"out of\" : \"in\"} buffer`);\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 (noFowardBuffer || fragEndOffset < bufferInfo.start || fragStartOffset > bufferInfo.end) {\n          const pastFragment = currentTime > fragEndOffset;\n          if (currentTime < fragStartOffset || pastFragment) {\n            if (pastFragment && fragCurrent.loader) {\n              this.log(`Cancelling fragment load for seek (sn: ${fragCurrent.sn})`);\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        const lastCurrentTime = this.lastCurrentTime;\n        if (currentTime > lastCurrentTime) {\n          this.lastCurrentTime = currentTime;\n        }\n        if (!this.loadingParts) {\n          const bufferEnd = Math.max(bufferInfo.end, currentTime);\n          const shouldLoadParts = this.shouldLoadParts(this.getLevelDetails(), bufferEnd);\n          if (shouldLoadParts) {\n            this.log(`LL-Part loading ON after seeking to ${currentTime.toFixed(2)} with buffer @${bufferEnd.toFixed(2)}`);\n            this.loadingParts = shouldLoadParts;\n          }\n        }\n      }\n      if (!this.hls.hasEnoughToStart) {\n        this.log(`Setting ${noFowardBuffer ? \"startPosition\" : \"nextLoadPosition\"} to ${currentTime} for seek without enough to start`);\n        this.nextLoadPosition = currentTime;\n        if (noFowardBuffer) {\n          this.startPosition = currentTime;\n        }\n      }\n      if (noFowardBuffer && this.state === State.IDLE) {\n        this.tickImmediate();\n      }\n    };\n    this.onMediaEnded = () => {\n      this.log(`setting startPosition to 0 because media ended`);\n      this.startPosition = this.lastCurrentTime = 0;\n    };\n    this.playlistType = playlistType;\n    this.hls = hls;\n    this.fragmentLoader = new FragmentLoader(hls.config);\n    this.keyLoader = keyLoader;\n    this.fragmentTracker = fragmentTracker;\n    this.config = hls.config;\n    this.decrypter = new Decrypter(hls.config);\n  }\n  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_LOADED, this.onManifestLoaded, 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_LOADED, this.onManifestLoaded, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n  doTick() {\n    this.onTickEnd();\n  }\n  onTickEnd() {\n  }\n  startLoad(startPosition) {\n  }\n  stopLoad() {\n    if (this.state === State.STOPPED) {\n      return;\n    }\n    this.fragmentLoader.abort();\n    this.keyLoader.abort(this.playlistType);\n    const frag = this.fragCurrent;\n    if (frag != 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  get startPositionValue() {\n    const {\n      nextLoadPosition,\n      startPosition\n    } = this;\n    if (startPosition === -1 && nextLoadPosition) {\n      return nextLoadPosition;\n    }\n    return startPosition;\n  }\n  get bufferingEnabled() {\n    return this.buffering;\n  }\n  pauseBuffering() {\n    this.buffering = false;\n  }\n  resumeBuffering() {\n    this.buffering = true;\n  }\n  get inFlightFrag() {\n    return {\n      frag: this.fragCurrent,\n      state: this.state\n    };\n  }\n  _streamEnded(bufferInfo, levelDetails) {\n    if (levelDetails.live || !this.media) {\n      return false;\n    }\n    const bufferEnd = bufferInfo.end || 0;\n    const timelineStart = this.config.timelineOffset || 0;\n    if (bufferEnd <= timelineStart) {\n      return false;\n    }\n    const bufferedRanges = bufferInfo.buffered;\n    if (this.config.maxBufferHole && bufferedRanges && bufferedRanges.length > 1) {\n      bufferInfo = BufferHelper.bufferedInfo(bufferedRanges, bufferInfo.start, 0);\n    }\n    const nextStart = bufferInfo.nextStart;\n    const hasSecondBufferedRange = nextStart && nextStart > timelineStart && nextStart < levelDetails.edge;\n    if (hasSecondBufferedRange) {\n      return false;\n    }\n    if (this.media.currentTime < bufferInfo.start) {\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      return this.levelLastLoaded.details;\n    }\n  }\n  get timelineOffset() {\n    const configuredTimelineOffset = this.config.timelineOffset;\n    if (configuredTimelineOffset) {\n      var _this$getLevelDetails;\n      return ((_this$getLevelDetails = this.getLevelDetails()) == null ? void 0 : _this$getLevelDetails.appliedTimelineOffset) || configuredTimelineOffset;\n    }\n    return 0;\n  }\n  onMediaAttached(event, data) {\n    const media = this.media = this.mediaBuffer = data.media;\n    addEventListener(media, \"seeking\", this.onMediaSeeking);\n    addEventListener(media, \"ended\", this.onMediaEnded);\n    const config = this.config;\n    if (this.levels && config.autoStartLoad && this.state === State.STOPPED) {\n      this.startLoad(config.startPosition);\n    }\n  }\n  onMediaDetaching(event, data) {\n    const transferringMedia = !!data.transferMedia;\n    const media = this.media;\n    if (media === null) {\n      return;\n    }\n    if (media.ended) {\n      this.log(\"MSE detaching and video ended, reset startPosition\");\n      this.startPosition = this.lastCurrentTime = 0;\n    }\n    removeEventListener(media, \"seeking\", this.onMediaSeeking);\n    removeEventListener(media, \"ended\", this.onMediaEnded);\n    if (this.keyLoader && !transferringMedia) {\n      this.keyLoader.detach();\n    }\n    this.media = this.mediaBuffer = null;\n    this.loopSn = void 0;\n    if (transferringMedia) {\n      this.resetLoadingState();\n      this.resetTransmuxer();\n      return;\n    }\n    this.loadingParts = false;\n    this.fragmentTracker.removeAllFragments();\n    this.stopLoad();\n  }\n  onManifestLoading() {\n    this.initPTS = [];\n    this.levels = this.levelLastLoaded = this.fragCurrent = null;\n    this.lastCurrentTime = this.startPosition = 0;\n    this.startFragRequested = false;\n  }\n  onError(event, data) {\n  }\n  onManifestLoaded(event, data) {\n    this.startTimeOffset = data.startTimeOffset;\n  }\n  onHandlerDestroying() {\n    this.stopLoad();\n    if (this.transmuxer) {\n      this.transmuxer.destroy();\n      this.transmuxer = null;\n    }\n    super.onHandlerDestroying();\n    this.hls = this.onMediaSeeking = this.onMediaEnded = 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.startFragRequested = true;\n    this._loadFragForPlayback(frag, level, targetBufferTime);\n  }\n  _loadFragForPlayback(fragment, level, targetBufferTime) {\n    const progressCallback = (data) => {\n      const frag = data.frag;\n      if (this.fragContextChanged(frag)) {\n        this.warn(`${frag.type} sn: ${frag.sn}${data.part ? \" part: \" + data.part.index : \"\"} of ${this.fragInfo(frag, false, data.part)}) was dropped during download.`);\n        this.fragmentTracker.removeFragment(frag);\n        return;\n      }\n      frag.stats.chunkCount++;\n      this._handleFragmentLoadProgress(data);\n    };\n    this._doFragLoad(fragment, level, targetBufferTime, progressCallback).then((data) => {\n      if (!data) {\n        return;\n      }\n      const state = this.state;\n      const frag = data.frag;\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 ${frag.type} sn: ${frag.sn} of ${this.playlistLabel()} ${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(`Frag error: ${(reason == null ? void 0 : reason.message) || reason}`);\n      this.resetFragmentLoading(fragment);\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      const backtrackFragment = this.backtrackFragment;\n      const backtracked = backtrackFragment ? frag.sn - backtrackFragment.sn : 0;\n      if (backtracked === 1 || this.reduceMaxBufferLength(minForwardBufferLength, frag.duration)) {\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  waitForLive(levelInfo) {\n    const details = levelInfo.details;\n    return (details == null ? void 0 : details.live) && details.type !== \"EVENT\" && (this.levelLastLoaded !== levelInfo || details.expired);\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(fragment, level) {\n    this._doFragLoad(fragment, level).then((data) => {\n      const frag = data == null ? void 0 : data.frag;\n      if (!frag || 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        frag,\n        payload\n      } = data;\n      const decryptData = frag.decryptdata;\n      if (payload && payload.byteLength > 0 && decryptData != null && decryptData.key && decryptData.iv && isFullSegmentEncryption(decryptData.method)) {\n        const startTime = self.performance.now();\n        return this.decrypter.decrypt(new Uint8Array(payload), decryptData.key.buffer, decryptData.iv.buffer, getAesModeFromFullSegmentMethod(decryptData.method)).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(fragment);\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    if (this.state !== State.STOPPED) {\n      this.state = State.IDLE;\n    }\n    data.frag.data = new Uint8Array(data.payload);\n    stats.parsing.start = stats.buffering.start = self.performance.now();\n    stats.parsing.end = stats.buffering.end = self.performance.now();\n    this.tick();\n  }\n  unhandledEncryptionError(initSegment, frag) {\n    var _tracks$audio, _tracks$video;\n    const tracks = initSegment.tracks;\n    if (tracks && !frag.encrypted && ((_tracks$audio = tracks.audio) != null && _tracks$audio.encrypted || (_tracks$video = tracks.video) != null && _tracks$video.encrypted) && (!this.config.emeEnabled || !this.keyLoader.emeController)) {\n      const media = this.media;\n      const error = new Error(`Encrypted track with no key in ${this.fragInfo(frag)} (media ${media ? \"attached mediaKeys: \" + media.mediaKeys : \"detached\"})`);\n      this.warn(error.message);\n      if (!media || media.mediaKeys) {\n        return false;\n      }\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_KEYS,\n        fatal: false,\n        error,\n        frag\n      });\n      this.resetTransmuxer();\n      return true;\n    }\n    return false;\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    const media = this.mediaBuffer ? this.mediaBuffer : this.media;\n    this.log(`Buffered ${frag.type} sn: ${frag.sn}${part ? \" part: \" + part.index : \"\"} of ${this.fragInfo(frag, false, part)} > buffer:${media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : \"(detached)\"})`);\n    if (isMediaFragment(frag)) {\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  }\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  _handleFragmentLoadProgress(frag) {\n  }\n  _doFragLoad(frag, level, targetBufferTime = null, progressCallback) {\n    var _frag$decryptdata;\n    this.fragCurrent = frag;\n    const details = 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.playlistLabel()} ${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        this.log(`context changed in KEY_LOADING`);\n        return Promise.resolve(null);\n      }\n    } else if (!frag.encrypted) {\n      keyLoadingPromise = this.keyLoader.loadClear(frag, details.encryptedFragments, this.startFragRequested);\n      if (keyLoadingPromise) {\n        this.log(`[eme] blocking frag load until media-keys acquired`);\n      }\n    }\n    const fragPrevious = this.fragPrevious;\n    if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {\n      const shouldLoadParts = this.shouldLoadParts(level.details, frag.end);\n      if (shouldLoadParts !== this.loadingParts) {\n        this.log(`LL-Part loading ${shouldLoadParts ? \"ON\" : \"OFF\"} loading sn ${fragPrevious == null ? void 0 : fragPrevious.sn}->${frag.sn}`);\n        this.loadingParts = shouldLoadParts;\n      }\n    }\n    targetBufferTime = Math.max(frag.start, targetBufferTime || 0);\n    if (this.loadingParts && isMediaFragment(frag)) {\n      const partList = details.partList;\n      if (partList && progressCallback) {\n        if (targetBufferTime > details.fragmentEnd && details.fragmentHint) {\n          frag = details.fragmentHint;\n        }\n        const partIndex = this.getNextPart(partList, frag, targetBufferTime);\n        if (partIndex > -1) {\n          const part = partList[partIndex];\n          frag = this.fragCurrent = part.fragment;\n          this.log(`Loading ${frag.type} sn: ${frag.sn} part: ${part.index} (${partIndex}/${partList.length - 1}) of ${this.fragInfo(frag, false, part)}) cc: ${frag.cc} [${details.startSN}-${details.endSN}], 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    if (isMediaFragment(frag) && this.loadingParts) {\n      var _details$partList;\n      this.log(`LL-Part loading OFF after next part miss @${targetBufferTime.toFixed(2)} Check buffer at sn: ${frag.sn} loaded parts: ${(_details$partList = details.partList) == null ? void 0 : _details$partList.filter((p) => p.loaded).map((p) => `[${p.start}-${p.end}]`)}`);\n      this.loadingParts = false;\n    } else if (!frag.url) {\n      return Promise.resolve(null);\n    }\n    this.log(`Loading ${frag.type} sn: ${frag.sn} of ${this.fragInfo(frag, false)}) cc: ${frag.cc} ${\"[\" + details.startSN + \"-\" + details.endSN + \"]\"}, 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 && frag.type !== PlaylistLevelType.SUBTITLE;\n    let result;\n    if (dataOnProgress && keyLoadingPromise) {\n      result = keyLoadingPromise.then((keyLoadedData) => {\n        if (!keyLoadedData || this.fragContextChanged(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 && 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.details, 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 (data.frag && data.details === ErrorDetails.INTERNAL_ABORTED) {\n        this.handleFragLoadAborted(data.frag, data.part);\n      } else if (data.frag && data.type === ErrorTypes.KEY_SYSTEM_ERROR) {\n        data.frag.abortRequests();\n        this.resetStartWhenNotLoaded();\n        this.resetFragmentLoading(data.frag);\n      } else {\n        this.hls.trigger(Events.ERROR, data);\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    const levelDetails = this.getLevelDetails();\n    const loadingPartsAtEdge = levelDetails && frag.sn > levelDetails.endSN;\n    const shouldLoadParts = loadingPartsAtEdge || this.shouldLoadParts(levelDetails, frag.end);\n    if (shouldLoadParts !== this.loadingParts) {\n      this.log(`LL-Part loading ${shouldLoadParts ? \"ON\" : \"OFF\"} after parsing segment ending @${frag.end.toFixed(2)}`);\n      this.loadingParts = shouldLoadParts;\n    }\n    this.updateLevelTiming(frag, part, level, chunkMeta.partial);\n  }\n  shouldLoadParts(details, bufferEnd) {\n    if (this.config.lowLatencyMode) {\n      if (!details) {\n        return this.loadingParts;\n      }\n      if (details.partList) {\n        var _details$fragmentHint;\n        const firstPart = details.partList[0];\n        if (firstPart.fragment.type === PlaylistLevelType.SUBTITLE) {\n          return false;\n        }\n        const safePartStart = firstPart.end + (((_details$fragmentHint = details.fragmentHint) == null ? void 0 : _details$fragmentHint.duration) || 0);\n        if (bufferEnd >= safePartStart) {\n          var _this$media;\n          const playhead = this.hls.hasEnoughToStart ? ((_this$media = this.media) == null ? void 0 : _this$media.currentTime) || this.lastCurrentTime : this.getLoadPosition();\n          if (playhead > firstPart.start - firstPart.fragment.duration) {\n            return true;\n          }\n        }\n      }\n    }\n    return false;\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 ${this.playlistLabel()} ${levelIndex}. The current chunk will not be buffered.`);\n      return null;\n    }\n    const level = levels[levelIndex];\n    const levelDetails = level.details;\n    const part = partIndex > -1 ? getPartWith(levelDetails, sn, partIndex) : null;\n    const frag = part ? part.fragment : getFragmentWithSN(levelDetails, 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    if (this.state !== State.PARSING) {\n      return;\n    }\n    const {\n      data1,\n      data2\n    } = data;\n    let buffer = data1;\n    if (data2) {\n      buffer = appendUint8Array(data1, data2);\n    }\n    if (!buffer.length) {\n      return;\n    }\n    const offsetTimestamp = this.initPTS[frag.cc];\n    const offset = offsetTimestamp ? -offsetTimestamp.baseTime / offsetTimestamp.timescale : void 0;\n    const segment = {\n      type: data.type,\n      frag,\n      part,\n      chunkMeta,\n      offset,\n      parent: frag.type,\n      data: buffer\n    };\n    this.hls.trigger(Events.BUFFER_APPENDING, segment);\n    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    var _this$media2;\n    const pos = this.getLoadPosition();\n    if (!isFiniteNumber(pos)) {\n      return null;\n    }\n    const backwardSeek = this.lastCurrentTime > pos;\n    const maxBufferHole = backwardSeek || (_this$media2 = this.media) != null && _this$media2.paused ? 0 : this.config.maxBufferHole;\n    return this.getFwdBufferInfoAtPos(bufferable, pos, type, maxBufferHole);\n  }\n  getFwdBufferInfoAtPos(bufferable, pos, type, maxBufferHole) {\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 || bufferedFragAtPos.gap)) {\n        const gapDuration = Math.max(Math.min(bufferInfo.nextStart, bufferedFragAtPos.end) - pos, maxBufferHole);\n        return BufferHelper.bufferInfo(bufferable, pos, gapDuration);\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, fragDuration) {\n    const config = this.config;\n    const minLength = Math.max(Math.min(threshold - fragDuration, config.maxBufferLength), fragDuration);\n    const reducedLength = Math.max(threshold - fragDuration * 3, config.maxMaxBufferLength / 2, minLength);\n    if (reducedLength >= minLength) {\n      config.maxMaxBufferLength = reducedLength;\n      this.warn(`Reduce max buffer length to ${reducedLength}s`);\n      return true;\n    }\n    return false;\n  }\n  getAppendedFrag(position, playlistType = PlaylistLevelType.MAIN) {\n    const fragOrPart = this.fragmentTracker ? this.fragmentTracker.getAppendedFrag(position, playlistType) : null;\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    const canLoadParts = config.lowLatencyMode && !!levelDetails.partList;\n    let frag = null;\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        var _frag;\n        if (canLoadParts && !this.loadingParts) {\n          this.log(`LL-Part loading ON for initial live fragment`);\n          this.loadingParts = true;\n        }\n        frag = this.getInitialLiveFragment(levelDetails);\n        const mainStart = this.hls.startPosition;\n        const liveSyncPosition = this.hls.liveSyncPosition;\n        const startPosition = frag ? (mainStart !== -1 && mainStart >= start ? mainStart : liveSyncPosition) || frag.start : pos;\n        this.log(`Setting startPosition to ${startPosition} to match start frag at live edge. mainStart: ${mainStart} liveSyncPosition: ${liveSyncPosition} frag.start: ${(_frag = frag) == null ? void 0 : _frag.start}`);\n        this.startPosition = this.nextLoadPosition = startPosition;\n      }\n    } else if (pos <= start) {\n      frag = fragments[0];\n    }\n    if (!frag) {\n      const end = this.loadingParts ? levelDetails.partEnd : levelDetails.fragmentEnd;\n      frag = this.getFragmentAtPosition(pos, end, levelDetails);\n    }\n    let programFrag = this.filterReplacedPrimary(frag, levelDetails);\n    if (!programFrag && frag) {\n      const curSNIdx = frag.sn - levelDetails.startSN;\n      programFrag = this.filterReplacedPrimary(fragments[curSNIdx + 1] || null, levelDetails);\n    }\n    return this.mapToInitFragWhenRequired(programFrag);\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    let nextFragment = null;\n    if (frag.gap) {\n      nextFragment = this.getNextFragment(this.nextLoadPosition, levelDetails);\n      if (nextFragment && !nextFragment.gap && bufferInfo.nextStart) {\n        const nextbufferInfo = this.getFwdBufferInfoAtPos(this.mediaBuffer ? this.mediaBuffer : this.media, bufferInfo.nextStart, playlistType, 0);\n        if (nextbufferInfo !== null && bufferInfo.len + nextbufferInfo.len >= maxBufLen) {\n          const sn = nextFragment.sn;\n          if (this.loopSn !== sn) {\n            this.log(`buffer full after gaps in \"${playlistType}\" playlist starting at sn: ${sn}`);\n            this.loopSn = sn;\n          }\n          return null;\n        }\n      }\n    }\n    this.loopSn = void 0;\n    return nextFragment;\n  }\n  get primaryPrefetch() {\n    if (interstitialsEnabled(this.config)) {\n      var _this$hls$interstitia;\n      const playingInterstitial = (_this$hls$interstitia = this.hls.interstitialsManager) == null || (_this$hls$interstitia = _this$hls$interstitia.playingItem) == null ? void 0 : _this$hls$interstitia.event;\n      if (playingInterstitial) {\n        return true;\n      }\n    }\n    return false;\n  }\n  filterReplacedPrimary(frag, details) {\n    if (!frag) {\n      return frag;\n    }\n    if (interstitialsEnabled(this.config) && frag.type !== PlaylistLevelType.SUBTITLE) {\n      const interstitials = this.hls.interstitialsManager;\n      const bufferingItem = interstitials == null ? void 0 : interstitials.bufferingItem;\n      if (bufferingItem) {\n        const bufferingInterstitial = bufferingItem.event;\n        if (bufferingInterstitial) {\n          if (bufferingInterstitial.appendInPlace || Math.abs(frag.start - bufferingItem.start) > 1 || bufferingItem.start === 0) {\n            return null;\n          }\n        } else {\n          if (frag.end <= bufferingItem.start && (details == null ? void 0 : details.live) === false) {\n            return null;\n          }\n          if (frag.start > bufferingItem.end && bufferingItem.nextEvent) {\n            if (bufferingItem.nextEvent.appendInPlace || frag.start - bufferingItem.end > 1) {\n              return null;\n            }\n          }\n        }\n      }\n      const playerQueue = interstitials == null ? void 0 : interstitials.playerQueue;\n      if (playerQueue) {\n        for (let i = playerQueue.length; i--; ) {\n          const interstitial = playerQueue[i].interstitial;\n          if (interstitial.appendInPlace && frag.start >= interstitial.startTime && frag.end <= interstitial.resumeTime) {\n            return null;\n          }\n        }\n      }\n    }\n    return frag;\n  }\n  mapToInitFragWhenRequired(frag) {\n    if (frag != null && frag.initSegment && !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        if (part.fragment !== frag) {\n          this.warn(`Need buffer at ${targetBufferTime} but next unloaded part starts at ${part.start}`);\n        }\n        nextPart = i;\n      }\n      contiguous = loaded;\n    }\n    return nextPart;\n  }\n  loadedEndOfParts(partList, targetBufferTime) {\n    let part;\n    for (let i = partList.length; i--; ) {\n      part = partList[i];\n      if (!part.loaded) {\n        return false;\n      }\n      if (targetBufferTime > part.start) {\n        return true;\n      }\n    }\n    return false;\n  }\n  getInitialLiveFragment(levelDetails) {\n    const fragments = 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 = findNearestWithCC(levelDetails, fragPrevious.cc, fragPrevious.end);\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  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 {\n      maxFragLookUpTolerance\n    } = config;\n    const partList = levelDetails.partList;\n    const loadingParts = !!(this.loadingParts && partList != null && partList.length && fragmentHint);\n    if (loadingParts && !this.bitrateTest && partList[partList.length - 1].fragment.sn === fragmentHint.sn) {\n      fragments = fragments.concat(fragmentHint);\n      endSN = fragmentHint.sn;\n    }\n    let frag;\n    if (bufferEnd < end) {\n      var _this$media3;\n      const backwardSeek = bufferEnd < this.lastCurrentTime;\n      const lookupTolerance = backwardSeek || bufferEnd > end - maxFragLookUpTolerance || (_this$media3 = this.media) != null && _this$media3.paused || !this.startFragRequested ? 0 : maxFragLookUpTolerance;\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 || !levelDetails.live)) {\n        const sameLevel = 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  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.fragmentStart;\n    const firstLevelLoad = !previousDetails;\n    const aligned = details.alignedSliding && isFiniteNumber(slidingStart);\n    if (firstLevelLoad || !aligned && !slidingStart) {\n      alignStream(switchDetails, details);\n      const alignedSlidingStart = details.fragmentStart;\n      this.log(`Live playlist sliding: ${alignedSlidingStart.toFixed(2)} start-sn: ${previousDetails ? previousDetails.startSN : \"na\"}->${details.startSN} 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    const timelineOffset = this.timelineOffset;\n    if (startPosition === -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.edge;\n        }\n        startPosition = Math.min(Math.max(sliding, startPosition), sliding + details.totalduration);\n        this.log(`Setting startPosition to ${startPosition} for start time offset ${startTimeOffset} found in ${offsetInMultivariantPlaylist ? \"multivariant\" : \"media\"} playlist`);\n        this.startPosition = startPosition;\n      } else if (details.live) {\n        startPosition = this.hls.liveSyncPosition || sliding;\n        this.log(`Setting startPosition to -1 to start at live edge ${startPosition}`);\n        this.startPosition = -1;\n      } else {\n        this.log(`setting startPosition to 0 by default`);\n        this.startPosition = startPosition = 0;\n      }\n      this.lastCurrentTime = startPosition + timelineOffset;\n    }\n    this.nextLoadPosition = startPosition + timelineOffset;\n  }\n  getLoadPosition() {\n    var _this$hls;\n    const {\n      media\n    } = this;\n    let pos = 0;\n    if ((_this$hls = this.hls) != null && _this$hls.hasEnoughToStart && media) {\n      pos = media.currentTime;\n    } else if (this.nextLoadPosition >= 0) {\n      pos = this.nextLoadPosition;\n    }\n    return pos;\n  }\n  handleFragLoadAborted(frag, part) {\n    if (this.transmuxer && frag.type === this.playlistType && isMediaFragment(frag) && frag.stats.aborted) {\n      this.log(`Fragment ${frag.sn}${part ? \" part \" + part.index : \"\"} of ${this.playlistLabel()} ${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    var _this$hls$latestLevel;\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$fragCurrent;\n      this.warn(`Frag load error must match current frag to retry ${frag.url} > ${(_this$fragCurrent = this.fragCurrent) == null ? void 0 : _this$fragCurrent.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    if (!errorAction) {\n      this.state = State.ERROR;\n      return;\n    }\n    const {\n      action,\n      flags,\n      retryCount = 0,\n      retryConfig\n    } = errorAction;\n    const couldRetry = !!retryConfig;\n    const retry = couldRetry && action === NetworkErrorAction.RetryRequest;\n    const noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;\n    const live = (_this$hls$latestLevel = this.hls.latestLevelDetails) == null ? void 0 : _this$hls$latestLevel.live;\n    if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList && live && !isUnusableKeyError(data)) {\n      this.resetFragmentErrors(filterType);\n      this.treatAsGap(frag);\n      errorAction.resolved = true;\n    } else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {\n      var _data$response;\n      const offlineStatus = offlineHttpStatus((_data$response = data.response) == null ? void 0 : _data$response.code);\n      const delay = getRetryDelay(retryConfig, retryCount);\n      this.resetStartWhenNotLoaded();\n      this.retryDate = self.performance.now() + delay;\n      this.state = State.FRAG_LOADING_WAITING_RETRY;\n      errorAction.resolved = true;\n      if (offlineStatus) {\n        this.log(`Waiting for connection (offline)`);\n        this.retryDate = Infinity;\n        data.reason = \"offline\";\n        return;\n      }\n      this.warn(`Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${data.details}, retrying loading ${retryCount + 1}/${retryConfig.maxNumRetry} in ${delay}ms`);\n    } else if (retryConfig) {\n      this.resetFragmentErrors(filterType);\n      if (retryCount < retryConfig.maxNumRetry) {\n        if (!gapTagEncountered && action !== NetworkErrorAction.RemoveAlternatePermanently) {\n          errorAction.resolved = true;\n        }\n      } else {\n        this.warn(`${data.details} reached or exceeded max retry (${retryCount})`);\n        return;\n      }\n    } else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {\n      this.state = State.WAITING_LEVEL;\n    } else {\n      this.state = State.ERROR;\n    }\n    this.tickImmediate();\n  }\n  checkRetryDate() {\n    const now2 = self.performance.now();\n    const retryDate = this.retryDate;\n    const waitingForConnection = retryDate === Infinity;\n    if (!retryDate || now2 >= retryDate || waitingForConnection && !offlineHttpStatus(0)) {\n      if (waitingForConnection) {\n        this.log(`Connection restored (online)`);\n      }\n      this.resetStartWhenNotLoaded();\n      this.state = State.IDLE;\n    }\n  }\n  reduceLengthAndFlushBuffer(data) {\n    if (this.state === State.PARSING || this.state === State.PARSED) {\n      const frag = data.frag;\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, (frag == null ? void 0 : frag.duration) || 10);\n      }\n      const flushBuffer = !buffered;\n      if (flushBuffer) {\n        this.warn(`Buffer full error while media.currentTime (${this.getLoadPosition()}) is not buffered, flush ${playlistType} buffer`);\n      }\n      if (frag) {\n        this.fragmentTracker.removeFragment(frag);\n        this.nextLoadPosition = frag.start;\n      }\n      this.resetLoadingState();\n      return flushBuffer;\n    }\n    return false;\n  }\n  resetFragmentErrors(filterType) {\n    if (filterType === PlaylistLevelType.AUDIO) {\n      this.fragCurrent = null;\n    }\n    if (!this.hls.hasEnoughToStart) {\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    if (this.state !== State.STOPPED) {\n      this.state = State.IDLE;\n    }\n  }\n  resetStartWhenNotLoaded() {\n    if (!this.hls.hasEnoughToStart) {\n      this.startFragRequested = false;\n      const level = this.levelLastLoaded;\n      const details = level ? level.details : null;\n      if (details != null && details.live) {\n        this.log(`resetting startPosition for live start`);\n        this.startPosition = -1;\n        this.setStartPosition(details, details.fragmentStart);\n        this.resetLoadingState();\n      } else {\n        this.nextLoadPosition = this.startPosition;\n      }\n    }\n  }\n  resetWhenMissingContext(chunkMeta) {\n    this.log(`Loading context changed while buffering sn ${chunkMeta.sn} of ${this.playlistLabel()} ${chunkMeta.level === -1 ? \"<removed>\" : chunkMeta.level}. This chunk will not be buffered.`);\n    this.removeUnbufferedFrags();\n    this.resetStartWhenNotLoaded();\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    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, this);\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) {\n      var _this$transmuxer;\n      const mediaNotFound = ((_this$transmuxer = this.transmuxer) == null ? void 0 : _this$transmuxer.error) === null;\n      if (level.fragmentError === 0 || mediaNotFound && (level.fragmentError < 2 || frag.endList)) {\n        this.treatAsGap(frag, level);\n      }\n      if (mediaNotFound) {\n        const error = new Error(`Found no media in fragment ${frag.sn} of ${this.playlistLabel()} ${frag.level} resetting transmuxer to fallback to playlist timing`);\n        this.warn(error.message);\n        this.hls.trigger(Events.ERROR, {\n          type: ErrorTypes.MEDIA_ERROR,\n          details: ErrorDetails.FRAG_PARSING_ERROR,\n          fatal: false,\n          error,\n          frag,\n          reason: `Found no media in msn ${frag.sn} of ${this.playlistLabel()} \"${level.url}\"`\n        });\n        if (!this.hls) {\n          return;\n        }\n        this.resetTransmuxer();\n      }\n    }\n    this.state = State.PARSED;\n    this.log(`Parsed ${frag.type} sn: ${frag.sn}${part ? \" part: \" + part.index : \"\"} of ${this.fragInfo(frag, false, part)})`);\n    this.hls.trigger(Events.FRAG_PARSED, {\n      frag,\n      part\n    });\n  }\n  playlistLabel() {\n    return this.playlistType === PlaylistLevelType.MAIN ? \"level\" : \"track\";\n  }\n  fragInfo(frag, pts = true, part) {\n    var _ref, _ref2;\n    return `${this.playlistLabel()} ${frag.level} (${part ? \"part\" : \"frag\"}:[${((_ref = pts && !part ? frag.startPTS : (part || frag).start) != null ? _ref : NaN).toFixed(3)}-${((_ref2 = pts && !part ? frag.endPTS : (part || frag).end) != null ? _ref2 : NaN).toFixed(3)}]${part && frag.type === \"main\" ? \"INDEPENDENT=\" + (part.independent ? \"YES\" : \"NO\") : \"\"}`;\n  }\n  treatAsGap(frag, level) {\n    if (level) {\n      level.fragmentError++;\n    }\n    frag.gap = true;\n    this.fragmentTracker.removeFragment(frag);\n    this.fragmentTracker.fragBuffered(frag, true);\n  }\n  resetTransmuxer() {\n    var _this$transmuxer2;\n    (_this$transmuxer2 = this.transmuxer) == null || _this$transmuxer2.reset();\n  }\n  recoverWorkerError(data) {\n    if (data.event === \"demuxerWorker\") {\n      this.fragmentTracker.removeAllFragments();\n      if (this.transmuxer) {\n        this.transmuxer.destroy();\n        this.transmuxer = null;\n      }\n      this.resetStartWhenNotLoaded();\n      this.resetLoadingState();\n    }\n  }\n  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}\nfunction interstitialsEnabled(config) {\n  return !!config.interstitialsController && config.enableInterstitialPlayback !== false;\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}\nvar eventemitter3 = {exports: {}};\nvar hasRequiredEventemitter3;\nfunction requireEventemitter3() {\n  if (hasRequiredEventemitter3)\n    return eventemitter3.exports;\n  hasRequiredEventemitter3 = 1;\n  (function(module) {\n    var has = Object.prototype.hasOwnProperty, prefix = \"~\";\n    function Events2() {\n    }\n    if (Object.create) {\n      Events2.prototype = 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);\n  return eventemitter3.exports;\n}\nvar eventemitter3Exports = requireEventemitter3();\nvar EventEmitter = /* @__PURE__ */ getDefaultExportFromCjs(eventemitter3Exports);\nconst version = \"1.6.15\";\nconst workerStore = {};\nfunction hasUMDWorker() {\n  return typeof __HLS_WORKER_BUNDLE__ === \"function\";\n}\nfunction injectWorker() {\n  const workerContext = workerStore[version];\n  if (workerContext) {\n    workerContext.clientCount++;\n    return workerContext;\n  }\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  const result = {\n    worker,\n    objectURL,\n    clientCount: 1\n  };\n  workerStore[version] = result;\n  return result;\n}\nfunction loadWorker(path) {\n  const workerContext = workerStore[path];\n  if (workerContext) {\n    workerContext.clientCount++;\n    return workerContext;\n  }\n  const scriptURL = new self.URL(path, self.location.href).href;\n  const worker = new self.Worker(scriptURL);\n  const result = {\n    worker,\n    scriptURL,\n    clientCount: 1\n  };\n  workerStore[path] = result;\n  return result;\n}\nfunction removeWorkerFromStore(path) {\n  const workerContext = workerStore[path || version];\n  if (workerContext) {\n    const clientCount = workerContext.clientCount--;\n    if (clientCount === 1) {\n      const {\n        worker,\n        objectURL\n      } = workerContext;\n      delete workerStore[path || version];\n      if (objectURL) {\n        self.URL.revokeObjectURL(objectURL);\n      }\n      worker.terminate();\n    }\n  }\n}\nfunction isId3Footer(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}\nfunction isId3Header(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}\nfunction readId3Size(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}\nfunction getId3Data(data, offset) {\n  const front = offset;\n  let length = 0;\n  while (isId3Header(data, offset)) {\n    length += 10;\n    const size = readId3Size(data, offset + 6);\n    length += size;\n    if (isId3Footer(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}\nfunction getAudioConfig(observer, data, offset, manifestCodec) {\n  const adtsSamplingRates = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n  const byte2 = data[offset + 2];\n  const adtsSamplingIndex = byte2 >> 2 & 15;\n  if (adtsSamplingIndex > 12) {\n    const error = new Error(`invalid ADTS sampling index:${adtsSamplingIndex}`);\n    observer.emit(Events.ERROR, Events.ERROR, {\n      type: ErrorTypes.MEDIA_ERROR,\n      details: ErrorDetails.FRAG_PARSING_ERROR,\n      fatal: true,\n      error,\n      reason: error.message\n    });\n    return;\n  }\n  const adtsObjectType = (byte2 >> 6 & 3) + 1;\n  const channelCount = data[offset + 3] >> 6 & 3 | (byte2 & 1) << 2;\n  const codec = \"mp4a.40.\" + adtsObjectType;\n  const samplerate = adtsSamplingRates[adtsSamplingIndex];\n  let aacSampleIndex = adtsSamplingIndex;\n  if (adtsObjectType === 5 || adtsObjectType === 29) {\n    aacSampleIndex -= 3;\n  }\n  const config = [adtsObjectType << 3 | (aacSampleIndex & 14) >> 1, (aacSampleIndex & 1) << 7 | channelCount << 3];\n  logger.log(`manifest codec:${manifestCodec}, parsed codec:${codec}, channels:${channelCount}, rate:${samplerate} (ADTS object type:${adtsObjectType} sampling index:${adtsSamplingIndex})`);\n  return {\n    config,\n    samplerate,\n    channelCount,\n    codec,\n    parsedCodec: codec,\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    _extends(track, config);\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}\nfunction canParseId3(data, offset) {\n  return isId3Header(data, offset) && readId3Size(data, offset + 6) + 10 <= data.length - offset;\n}\nfunction toArrayBuffer(view2) {\n  if (view2 instanceof ArrayBuffer) {\n    return view2;\n  } else {\n    if (view2.byteOffset == 0 && view2.byteLength == view2.buffer.byteLength) {\n      return view2.buffer;\n    }\n    return new Uint8Array(view2).buffer;\n  }\n}\nfunction toUint8(data, offset = 0, length = Infinity) {\n  return view(data, offset, length, Uint8Array);\n}\nfunction view(data, offset, length, Type) {\n  const buffer = unsafeGetArrayBuffer(data);\n  let bytesPerElement = 1;\n  if (\"BYTES_PER_ELEMENT\" in Type) {\n    bytesPerElement = Type.BYTES_PER_ELEMENT;\n  }\n  const dataOffset = isArrayBufferView(data) ? data.byteOffset : 0;\n  const dataEnd = (dataOffset + data.byteLength) / bytesPerElement;\n  const rawStart = (dataOffset + offset) / bytesPerElement;\n  const start = Math.floor(Math.max(0, Math.min(rawStart, dataEnd)));\n  const end = Math.floor(Math.min(start + Math.max(length, 0), dataEnd));\n  return new Type(buffer, start, end - start);\n}\nfunction unsafeGetArrayBuffer(view2) {\n  if (view2 instanceof ArrayBuffer) {\n    return view2;\n  } else {\n    return view2.buffer;\n  }\n}\nfunction isArrayBufferView(obj) {\n  return obj && obj.buffer instanceof ArrayBuffer && obj.byteLength !== void 0 && obj.byteOffset !== void 0;\n}\nfunction decodeId3ImageFrame(frame) {\n  const metadataFrame = {\n    key: frame.type,\n    description: \"\",\n    data: \"\",\n    mimeType: null,\n    pictureType: null\n  };\n  const utf8Encoding = 3;\n  if (frame.size < 2) {\n    return void 0;\n  }\n  if (frame.data[0] !== utf8Encoding) {\n    console.log(\"Ignore frame with unrecognized character encoding\");\n    return void 0;\n  }\n  const mimeTypeEndIndex = frame.data.subarray(1).indexOf(0);\n  if (mimeTypeEndIndex === -1) {\n    return void 0;\n  }\n  const mimeType = utf8ArrayToStr(toUint8(frame.data, 1, mimeTypeEndIndex));\n  const pictureType = frame.data[2 + mimeTypeEndIndex];\n  const descriptionEndIndex = frame.data.subarray(3 + mimeTypeEndIndex).indexOf(0);\n  if (descriptionEndIndex === -1) {\n    return void 0;\n  }\n  const description = utf8ArrayToStr(toUint8(frame.data, 3 + mimeTypeEndIndex, descriptionEndIndex));\n  let data;\n  if (mimeType === \"-->\") {\n    data = utf8ArrayToStr(toUint8(frame.data, 4 + mimeTypeEndIndex + descriptionEndIndex));\n  } else {\n    data = toArrayBuffer(frame.data.subarray(4 + mimeTypeEndIndex + descriptionEndIndex));\n  }\n  metadataFrame.mimeType = mimeType;\n  metadataFrame.pictureType = pictureType;\n  metadataFrame.description = description;\n  metadataFrame.data = data;\n  return metadataFrame;\n}\nfunction decodeId3PrivFrame(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}\nfunction decodeId3TextFrame(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    info: \"\",\n    data: text\n  };\n}\nfunction decodeId3UrlFrame(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    info: \"\",\n    data: url\n  };\n}\nfunction decodeId3Frame(frame) {\n  if (frame.type === \"PRIV\") {\n    return decodeId3PrivFrame(frame);\n  } else if (frame.type[0] === \"W\") {\n    return decodeId3UrlFrame(frame);\n  } else if (frame.type === \"APIC\") {\n    return decodeId3ImageFrame(frame);\n  }\n  return decodeId3TextFrame(frame);\n}\nfunction getId3FrameData(data) {\n  const type = String.fromCharCode(data[0], data[1], data[2], data[3]);\n  const size = readId3Size(data, 4);\n  const offset = 10;\n  return {\n    type,\n    size,\n    data: data.subarray(offset, offset + size)\n  };\n}\nconst HEADER_FOOTER_SIZE = 10;\nconst FRAME_SIZE = 10;\nfunction getId3Frames(id3Data) {\n  let offset = 0;\n  const frames = [];\n  while (isId3Header(id3Data, offset)) {\n    const size = readId3Size(id3Data, offset + 6);\n    if (id3Data[offset + 5] >> 6 & 1) {\n      offset += HEADER_FOOTER_SIZE;\n    }\n    offset += HEADER_FOOTER_SIZE;\n    const end = offset + size;\n    while (offset + FRAME_SIZE < end) {\n      const frameData = getId3FrameData(id3Data.subarray(offset));\n      const frame = decodeId3Frame(frameData);\n      if (frame) {\n        frames.push(frame);\n      }\n      offset += frameData.size + HEADER_FOOTER_SIZE;\n    }\n    if (isId3Footer(id3Data, offset)) {\n      offset += HEADER_FOOTER_SIZE;\n    }\n  }\n  return frames;\n}\nfunction isId3TimestampFrame(frame) {\n  return frame && frame.key === \"PRIV\" && frame.info === \"com.apple.streaming.transportStreamTimestamp\";\n}\nfunction readId3Timestamp(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}\nfunction getId3Timestamp(data) {\n  const frames = getId3Frames(data);\n  for (let i = 0; i < frames.length; i++) {\n    const frame = frames[i];\n    if (isId3TimestampFrame(frame)) {\n      return readId3Timestamp(frame);\n    }\n  }\n  return void 0;\n}\nlet MetadataSchema = /* @__PURE__ */ function(MetadataSchema2) {\n  MetadataSchema2[\"audioId3\"] = \"org.id3\";\n  MetadataSchema2[\"dateRange\"] = \"com.apple.quicktime.HLS\";\n  MetadataSchema2[\"emsg\"] = \"https://aomedia.org/emsg/ID3\";\n  MetadataSchema2[\"misbklv\"] = \"urn:misb:KLV:bin:1910.1\";\n  return MetadataSchema2;\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  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 ? getId3Timestamp(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 (canParseId3(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 = data.slice(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    this.cachedData = null;\n    this._audioTrack = this._id3Track = void 0;\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};\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  [\n    0,\n    72,\n    144,\n    12\n  ],\n  [\n    0,\n    0,\n    0,\n    0\n  ],\n  [\n    0,\n    72,\n    144,\n    12\n  ],\n  [\n    0,\n    144,\n    144,\n    12\n  ]\n];\nconst BytesInSlot = [\n  0,\n  1,\n  1,\n  4\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  static probe(data, logger2) {\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        logger2.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 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 && getId3Timestamp(id3Data) !== void 0 && 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 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 && getId3Timestamp(id3Data) !== void 0 && 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}\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        supplemental\n      } = initData.video;\n      videoTrack.id = id;\n      videoTrack.timescale = captionTrack.timescale = timescale;\n      videoTrack.codec = codec;\n      videoTrack.supplemental = supplemental;\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 = getEmsgStartTime(emsgInfo, timeOffset);\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          } else if (this.config.enableEmsgKLVMetadata && emsgInfo.schemeIdUri.startsWith(\"urn:misb:KLV:bin:1910.1\")) {\n            const pts = getEmsgStartTime(emsgInfo, timeOffset);\n            id3Track.samples.push({\n              data: emsgInfo.payload,\n              len: emsgInfo.payload.byteLength,\n              dts: pts,\n              pts,\n              type: MetadataSchema.misbklv,\n              duration: Number.POSITIVE_INFINITY\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    this.config = null;\n    this.remainderData = null;\n    this.videoTrack = this.audioTrack = this.id3Track = this.txtTrack = void 0;\n  }\n}\nfunction getEmsgStartTime(emsgInfo, timeOffset) {\n  return isFiniteNumber(emsgInfo.presentationTime) ? emsgInfo.presentationTime / emsgInfo.timeScale : timeOffset + emsgInfo.presentationTimeDelta / emsgInfo.timeScale;\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, DecrypterAesMode.cbc);\n  }\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    }).catch(callback);\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  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    }).catch(callback);\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}\nclass BaseVideoParser {\n  constructor() {\n    this.VideoSample = null;\n  }\n  createVideoSample(key, pts, dts) {\n    return {\n      key,\n      frame: false,\n      pts,\n      dts,\n      units: [],\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  }\n  parseNALu(track, array, endOfSegment) {\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 = this.getNALuType(array, 0);\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 = this.getNALuType(array, i);\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 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  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  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  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  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  skipUEG() {\n    this.skipBits(1 + this.skipLZ());\n  }\n  skipEG() {\n    this.skipBits(1 + this.skipLZ());\n  }\n  readUEG() {\n    const clz = this.skipLZ();\n    return this.readBits(clz + 1) - 1;\n  }\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  readBoolean() {\n    return this.readBits(1) === 1;\n  }\n  readUByte() {\n    return this.readBits(8);\n  }\n  readUShort() {\n    return this.readBits(16);\n  }\n  readUInt() {\n    return this.readBits(32);\n  }\n}\nclass AvcVideoParser extends BaseVideoParser {\n  parsePES(track, textTrack, pes, endOfSegment) {\n    const units = this.parseNALu(track, pes.data, endOfSegment);\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, _VideoSample3;\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 = this.readSliceType(data);\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 config = this.readSPS(sps);\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            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 ((_VideoSample3 = VideoSample) != null && _VideoSample3.frame) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(false, pes.pts, pes.dts);\n          }\n          break;\n        case 12:\n          push2 = true;\n          break;\n        default:\n          push2 = false;\n          break;\n      }\n      if (VideoSample && push2) {\n        const units2 = VideoSample.units;\n        units2.push(unit);\n      }\n    });\n    if (endOfSegment && VideoSample) {\n      this.pushAccessUnit(VideoSample, track);\n      this.VideoSample = null;\n    }\n  }\n  getNALuType(data, offset) {\n    return data[offset] & 31;\n  }\n  readSliceType(data) {\n    const eg = new ExpGolomb(data);\n    eg.readUByte();\n    eg.readUEG();\n    return eg.readUEG();\n  }\n  skipScalingList(count, reader) {\n    let lastScale = 8;\n    let nextScale = 8;\n    let deltaScale;\n    for (let j = 0; j < count; j++) {\n      if (nextScale !== 0) {\n        deltaScale = reader.readEG();\n        nextScale = (lastScale + deltaScale + 256) % 256;\n      }\n      lastScale = nextScale === 0 ? lastScale : nextScale;\n    }\n  }\n  readSPS(sps) {\n    const eg = new ExpGolomb(sps);\n    let frameCropLeftOffset = 0;\n    let frameCropRightOffset = 0;\n    let frameCropTopOffset = 0;\n    let frameCropBottomOffset = 0;\n    let numRefFramesInPicOrderCntCycle;\n    let scalingListCount;\n    let i;\n    const readUByte = eg.readUByte.bind(eg);\n    const readBits = eg.readBits.bind(eg);\n    const readUEG = eg.readUEG.bind(eg);\n    const readBoolean = eg.readBoolean.bind(eg);\n    const skipBits = eg.skipBits.bind(eg);\n    const skipEG = eg.skipEG.bind(eg);\n    const skipUEG = eg.skipUEG.bind(eg);\n    const skipScalingList = this.skipScalingList.bind(this);\n    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, eg);\n            } else {\n              skipScalingList(64, eg);\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}\nclass HevcVideoParser extends BaseVideoParser {\n  constructor(...args) {\n    super(...args);\n    this.initVPS = null;\n  }\n  parsePES(track, textTrack, pes, endOfSegment) {\n    const units = this.parseNALu(track, pes.data, endOfSegment);\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, _VideoSample3;\n      switch (unit.type) {\n        case 0:\n        case 1:\n        case 2:\n        case 3:\n        case 4:\n        case 5:\n        case 6:\n        case 7:\n        case 8:\n        case 9:\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(false, pes.pts, pes.dts);\n          }\n          VideoSample.frame = true;\n          push2 = true;\n          break;\n        case 16:\n        case 17:\n        case 18:\n        case 21:\n          push2 = true;\n          if (spsfound) {\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.key = true;\n          VideoSample.frame = true;\n          break;\n        case 19:\n        case 20:\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 39:\n          push2 = true;\n          parseSEIMessageFromNALu(unit.data, 2, pes.pts, textTrack.samples);\n          break;\n        case 32:\n          push2 = true;\n          if (!track.vps) {\n            if (typeof track.params !== \"object\") {\n              track.params = {};\n            }\n            track.params = _extends(track.params, this.readVPS(unit.data));\n            this.initVPS = unit.data;\n          }\n          track.vps = [unit.data];\n          break;\n        case 33:\n          push2 = true;\n          spsfound = true;\n          if (track.vps !== void 0 && track.vps[0] !== this.initVPS && track.sps !== void 0 && !this.matchSPS(track.sps[0], unit.data)) {\n            this.initVPS = track.vps[0];\n            track.sps = track.pps = void 0;\n          }\n          if (!track.sps) {\n            const config = this.readSPS(unit.data);\n            track.width = config.width;\n            track.height = config.height;\n            track.pixelRatio = config.pixelRatio;\n            track.codec = config.codecString;\n            track.sps = [];\n            if (typeof track.params !== \"object\") {\n              track.params = {};\n            }\n            for (const prop in config.params) {\n              track.params[prop] = config.params[prop];\n            }\n          }\n          this.pushParameterSet(track.sps, unit.data, track.vps);\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(true, pes.pts, pes.dts);\n          }\n          VideoSample.key = true;\n          break;\n        case 34:\n          push2 = true;\n          if (typeof track.params === \"object\") {\n            if (!track.pps) {\n              track.pps = [];\n              const config = this.readPPS(unit.data);\n              for (const prop in config) {\n                track.params[prop] = config[prop];\n              }\n            }\n            this.pushParameterSet(track.pps, unit.data, track.vps);\n          }\n          break;\n        case 35:\n          push2 = true;\n          track.audFound = true;\n          if ((_VideoSample3 = VideoSample) != null && _VideoSample3.frame) {\n            this.pushAccessUnit(VideoSample, track);\n            VideoSample = null;\n          }\n          if (!VideoSample) {\n            VideoSample = this.VideoSample = this.createVideoSample(false, pes.pts, pes.dts);\n          }\n          break;\n        default:\n          push2 = false;\n          break;\n      }\n      if (VideoSample && push2) {\n        const units2 = VideoSample.units;\n        units2.push(unit);\n      }\n    });\n    if (endOfSegment && VideoSample) {\n      this.pushAccessUnit(VideoSample, track);\n      this.VideoSample = null;\n    }\n  }\n  pushParameterSet(parameterSets, data, vps) {\n    if (vps && vps[0] === this.initVPS || !vps && !parameterSets.length) {\n      parameterSets.push(data);\n    }\n  }\n  getNALuType(data, offset) {\n    return (data[offset] & 126) >>> 1;\n  }\n  ebsp2rbsp(arr) {\n    const dst = new Uint8Array(arr.byteLength);\n    let dstIdx = 0;\n    for (let i = 0; i < arr.byteLength; i++) {\n      if (i >= 2) {\n        if (arr[i] === 3 && arr[i - 1] === 0 && arr[i - 2] === 0) {\n          continue;\n        }\n      }\n      dst[dstIdx] = arr[i];\n      dstIdx++;\n    }\n    return new Uint8Array(dst.buffer, 0, dstIdx);\n  }\n  pushAccessUnit(VideoSample, videoTrack) {\n    super.pushAccessUnit(VideoSample, videoTrack);\n    if (this.initVPS) {\n      this.initVPS = null;\n    }\n  }\n  readVPS(vps) {\n    const eg = new ExpGolomb(vps);\n    eg.readUByte();\n    eg.readUByte();\n    eg.readBits(4);\n    eg.skipBits(2);\n    eg.readBits(6);\n    const max_sub_layers_minus1 = eg.readBits(3);\n    const temporal_id_nesting_flag = eg.readBoolean();\n    return {\n      numTemporalLayers: max_sub_layers_minus1 + 1,\n      temporalIdNested: temporal_id_nesting_flag\n    };\n  }\n  readSPS(sps) {\n    const eg = new ExpGolomb(this.ebsp2rbsp(sps));\n    eg.readUByte();\n    eg.readUByte();\n    eg.readBits(4);\n    const max_sub_layers_minus1 = eg.readBits(3);\n    eg.readBoolean();\n    const general_profile_space = eg.readBits(2);\n    const general_tier_flag = eg.readBoolean();\n    const general_profile_idc = eg.readBits(5);\n    const general_profile_compatibility_flags_1 = eg.readUByte();\n    const general_profile_compatibility_flags_2 = eg.readUByte();\n    const general_profile_compatibility_flags_3 = eg.readUByte();\n    const general_profile_compatibility_flags_4 = eg.readUByte();\n    const general_constraint_indicator_flags_1 = eg.readUByte();\n    const general_constraint_indicator_flags_2 = eg.readUByte();\n    const general_constraint_indicator_flags_3 = eg.readUByte();\n    const general_constraint_indicator_flags_4 = eg.readUByte();\n    const general_constraint_indicator_flags_5 = eg.readUByte();\n    const general_constraint_indicator_flags_6 = eg.readUByte();\n    const general_level_idc = eg.readUByte();\n    const sub_layer_profile_present_flags = [];\n    const sub_layer_level_present_flags = [];\n    for (let i = 0; i < max_sub_layers_minus1; i++) {\n      sub_layer_profile_present_flags.push(eg.readBoolean());\n      sub_layer_level_present_flags.push(eg.readBoolean());\n    }\n    if (max_sub_layers_minus1 > 0) {\n      for (let i = max_sub_layers_minus1; i < 8; i++) {\n        eg.readBits(2);\n      }\n    }\n    for (let i = 0; i < max_sub_layers_minus1; i++) {\n      if (sub_layer_profile_present_flags[i]) {\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n        eg.readUByte();\n      }\n      if (sub_layer_level_present_flags[i]) {\n        eg.readUByte();\n      }\n    }\n    eg.readUEG();\n    const chroma_format_idc = eg.readUEG();\n    if (chroma_format_idc == 3) {\n      eg.skipBits(1);\n    }\n    const pic_width_in_luma_samples = eg.readUEG();\n    const pic_height_in_luma_samples = eg.readUEG();\n    const conformance_window_flag = eg.readBoolean();\n    let pic_left_offset = 0, pic_right_offset = 0, pic_top_offset = 0, pic_bottom_offset = 0;\n    if (conformance_window_flag) {\n      pic_left_offset += eg.readUEG();\n      pic_right_offset += eg.readUEG();\n      pic_top_offset += eg.readUEG();\n      pic_bottom_offset += eg.readUEG();\n    }\n    const bit_depth_luma_minus8 = eg.readUEG();\n    const bit_depth_chroma_minus8 = eg.readUEG();\n    const log2_max_pic_order_cnt_lsb_minus4 = eg.readUEG();\n    const sub_layer_ordering_info_present_flag = eg.readBoolean();\n    for (let i = sub_layer_ordering_info_present_flag ? 0 : max_sub_layers_minus1; i <= max_sub_layers_minus1; i++) {\n      eg.skipUEG();\n      eg.skipUEG();\n      eg.skipUEG();\n    }\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipUEG();\n    const scaling_list_enabled_flag = eg.readBoolean();\n    if (scaling_list_enabled_flag) {\n      const sps_scaling_list_data_present_flag = eg.readBoolean();\n      if (sps_scaling_list_data_present_flag) {\n        for (let sizeId = 0; sizeId < 4; sizeId++) {\n          for (let matrixId = 0; matrixId < (sizeId === 3 ? 2 : 6); matrixId++) {\n            const scaling_list_pred_mode_flag = eg.readBoolean();\n            if (!scaling_list_pred_mode_flag) {\n              eg.readUEG();\n            } else {\n              const coefNum = Math.min(64, 1 << 4 + (sizeId << 1));\n              if (sizeId > 1) {\n                eg.readEG();\n              }\n              for (let i = 0; i < coefNum; i++) {\n                eg.readEG();\n              }\n            }\n          }\n        }\n      }\n    }\n    eg.readBoolean();\n    eg.readBoolean();\n    const pcm_enabled_flag = eg.readBoolean();\n    if (pcm_enabled_flag) {\n      eg.readUByte();\n      eg.skipUEG();\n      eg.skipUEG();\n      eg.readBoolean();\n    }\n    const num_short_term_ref_pic_sets = eg.readUEG();\n    let num_delta_pocs = 0;\n    for (let i = 0; i < num_short_term_ref_pic_sets; i++) {\n      let inter_ref_pic_set_prediction_flag = false;\n      if (i !== 0) {\n        inter_ref_pic_set_prediction_flag = eg.readBoolean();\n      }\n      if (inter_ref_pic_set_prediction_flag) {\n        if (i === num_short_term_ref_pic_sets) {\n          eg.readUEG();\n        }\n        eg.readBoolean();\n        eg.readUEG();\n        let next_num_delta_pocs = 0;\n        for (let j = 0; j <= num_delta_pocs; j++) {\n          const used_by_curr_pic_flag = eg.readBoolean();\n          let use_delta_flag = false;\n          if (!used_by_curr_pic_flag) {\n            use_delta_flag = eg.readBoolean();\n          }\n          if (used_by_curr_pic_flag || use_delta_flag) {\n            next_num_delta_pocs++;\n          }\n        }\n        num_delta_pocs = next_num_delta_pocs;\n      } else {\n        const num_negative_pics = eg.readUEG();\n        const num_positive_pics = eg.readUEG();\n        num_delta_pocs = num_negative_pics + num_positive_pics;\n        for (let j = 0; j < num_negative_pics; j++) {\n          eg.readUEG();\n          eg.readBoolean();\n        }\n        for (let j = 0; j < num_positive_pics; j++) {\n          eg.readUEG();\n          eg.readBoolean();\n        }\n      }\n    }\n    const long_term_ref_pics_present_flag = eg.readBoolean();\n    if (long_term_ref_pics_present_flag) {\n      const num_long_term_ref_pics_sps = eg.readUEG();\n      for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n        for (let j = 0; j < log2_max_pic_order_cnt_lsb_minus4 + 4; j++) {\n          eg.readBits(1);\n        }\n        eg.readBits(1);\n      }\n    }\n    let min_spatial_segmentation_idc = 0;\n    let sar_width = 1, sar_height = 1;\n    let fps_fixed = true, fps_den = 1, fps_num = 0;\n    eg.readBoolean();\n    eg.readBoolean();\n    let default_display_window_flag = false;\n    const vui_parameters_present_flag = eg.readBoolean();\n    if (vui_parameters_present_flag) {\n      const aspect_ratio_info_present_flag = eg.readBoolean();\n      if (aspect_ratio_info_present_flag) {\n        const aspect_ratio_idc = eg.readUByte();\n        const sar_width_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n        const sar_height_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n        if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n          sar_width = sar_width_table[aspect_ratio_idc - 1];\n          sar_height = sar_height_table[aspect_ratio_idc - 1];\n        } else if (aspect_ratio_idc === 255) {\n          sar_width = eg.readBits(16);\n          sar_height = eg.readBits(16);\n        }\n      }\n      const overscan_info_present_flag = eg.readBoolean();\n      if (overscan_info_present_flag) {\n        eg.readBoolean();\n      }\n      const video_signal_type_present_flag = eg.readBoolean();\n      if (video_signal_type_present_flag) {\n        eg.readBits(3);\n        eg.readBoolean();\n        const colour_description_present_flag = eg.readBoolean();\n        if (colour_description_present_flag) {\n          eg.readUByte();\n          eg.readUByte();\n          eg.readUByte();\n        }\n      }\n      const chroma_loc_info_present_flag = eg.readBoolean();\n      if (chroma_loc_info_present_flag) {\n        eg.readUEG();\n        eg.readUEG();\n      }\n      eg.readBoolean();\n      eg.readBoolean();\n      eg.readBoolean();\n      default_display_window_flag = eg.readBoolean();\n      if (default_display_window_flag) {\n        eg.skipUEG();\n        eg.skipUEG();\n        eg.skipUEG();\n        eg.skipUEG();\n      }\n      const vui_timing_info_present_flag = eg.readBoolean();\n      if (vui_timing_info_present_flag) {\n        fps_den = eg.readBits(32);\n        fps_num = eg.readBits(32);\n        const vui_poc_proportional_to_timing_flag = eg.readBoolean();\n        if (vui_poc_proportional_to_timing_flag) {\n          eg.readUEG();\n        }\n        const vui_hrd_parameters_present_flag = eg.readBoolean();\n        if (vui_hrd_parameters_present_flag) {\n          const nal_hrd_parameters_present_flag = eg.readBoolean();\n          const vcl_hrd_parameters_present_flag = eg.readBoolean();\n          let sub_pic_hrd_params_present_flag = false;\n          if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {\n            sub_pic_hrd_params_present_flag = eg.readBoolean();\n            if (sub_pic_hrd_params_present_flag) {\n              eg.readUByte();\n              eg.readBits(5);\n              eg.readBoolean();\n              eg.readBits(5);\n            }\n            eg.readBits(4);\n            eg.readBits(4);\n            if (sub_pic_hrd_params_present_flag) {\n              eg.readBits(4);\n            }\n            eg.readBits(5);\n            eg.readBits(5);\n            eg.readBits(5);\n          }\n          for (let i = 0; i <= max_sub_layers_minus1; i++) {\n            fps_fixed = eg.readBoolean();\n            const fixed_pic_rate_within_cvs_flag = fps_fixed || eg.readBoolean();\n            let low_delay_hrd_flag = false;\n            if (fixed_pic_rate_within_cvs_flag) {\n              eg.readEG();\n            } else {\n              low_delay_hrd_flag = eg.readBoolean();\n            }\n            const cpb_cnt = low_delay_hrd_flag ? 1 : eg.readUEG() + 1;\n            if (nal_hrd_parameters_present_flag) {\n              for (let j = 0; j < cpb_cnt; j++) {\n                eg.readUEG();\n                eg.readUEG();\n                if (sub_pic_hrd_params_present_flag) {\n                  eg.readUEG();\n                  eg.readUEG();\n                }\n                eg.skipBits(1);\n              }\n            }\n            if (vcl_hrd_parameters_present_flag) {\n              for (let j = 0; j < cpb_cnt; j++) {\n                eg.readUEG();\n                eg.readUEG();\n                if (sub_pic_hrd_params_present_flag) {\n                  eg.readUEG();\n                  eg.readUEG();\n                }\n                eg.skipBits(1);\n              }\n            }\n          }\n        }\n      }\n      const bitstream_restriction_flag = eg.readBoolean();\n      if (bitstream_restriction_flag) {\n        eg.readBoolean();\n        eg.readBoolean();\n        eg.readBoolean();\n        min_spatial_segmentation_idc = eg.readUEG();\n      }\n    }\n    let width = pic_width_in_luma_samples, height = pic_height_in_luma_samples;\n    if (conformance_window_flag) {\n      let chroma_scale_w = 1, chroma_scale_h = 1;\n      if (chroma_format_idc === 1) {\n        chroma_scale_w = chroma_scale_h = 2;\n      } else if (chroma_format_idc == 2) {\n        chroma_scale_w = 2;\n      }\n      width = pic_width_in_luma_samples - chroma_scale_w * pic_right_offset - chroma_scale_w * pic_left_offset;\n      height = pic_height_in_luma_samples - chroma_scale_h * pic_bottom_offset - chroma_scale_h * pic_top_offset;\n    }\n    const profile_space_string = general_profile_space ? [\"A\", \"B\", \"C\"][general_profile_space] : \"\";\n    const profile_compatibility_buf = general_profile_compatibility_flags_1 << 24 | general_profile_compatibility_flags_2 << 16 | general_profile_compatibility_flags_3 << 8 | general_profile_compatibility_flags_4;\n    let profile_compatibility_rev = 0;\n    for (let i = 0; i < 32; i++) {\n      profile_compatibility_rev = (profile_compatibility_rev | (profile_compatibility_buf >> i & 1) << 31 - i) >>> 0;\n    }\n    let profile_compatibility_flags_string = profile_compatibility_rev.toString(16);\n    if (general_profile_idc === 1 && profile_compatibility_flags_string === \"2\") {\n      profile_compatibility_flags_string = \"6\";\n    }\n    const tier_flag_string = general_tier_flag ? \"H\" : \"L\";\n    return {\n      codecString: `hvc1.${profile_space_string}${general_profile_idc}.${profile_compatibility_flags_string}.${tier_flag_string}${general_level_idc}.B0`,\n      params: {\n        general_tier_flag,\n        general_profile_idc,\n        general_profile_space,\n        general_profile_compatibility_flags: [general_profile_compatibility_flags_1, general_profile_compatibility_flags_2, general_profile_compatibility_flags_3, general_profile_compatibility_flags_4],\n        general_constraint_indicator_flags: [general_constraint_indicator_flags_1, general_constraint_indicator_flags_2, general_constraint_indicator_flags_3, general_constraint_indicator_flags_4, general_constraint_indicator_flags_5, general_constraint_indicator_flags_6],\n        general_level_idc,\n        bit_depth: bit_depth_luma_minus8 + 8,\n        bit_depth_luma_minus8,\n        bit_depth_chroma_minus8,\n        min_spatial_segmentation_idc,\n        chroma_format_idc,\n        frame_rate: {\n          fixed: fps_fixed,\n          fps: fps_num / fps_den\n        }\n      },\n      width,\n      height,\n      pixelRatio: [sar_width, sar_height]\n    };\n  }\n  readPPS(pps) {\n    const eg = new ExpGolomb(this.ebsp2rbsp(pps));\n    eg.readUByte();\n    eg.readUByte();\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipBits(2);\n    eg.skipBits(3);\n    eg.skipBits(2);\n    eg.skipUEG();\n    eg.skipUEG();\n    eg.skipEG();\n    eg.skipBits(2);\n    const cu_qp_delta_enabled_flag = eg.readBoolean();\n    if (cu_qp_delta_enabled_flag) {\n      eg.skipUEG();\n    }\n    eg.skipEG();\n    eg.skipEG();\n    eg.skipBits(4);\n    const tiles_enabled_flag = eg.readBoolean();\n    const entropy_coding_sync_enabled_flag = eg.readBoolean();\n    let parallelismType = 1;\n    if (entropy_coding_sync_enabled_flag && tiles_enabled_flag) {\n      parallelismType = 0;\n    } else if (entropy_coding_sync_enabled_flag) {\n      parallelismType = 3;\n    } else if (tiles_enabled_flag) {\n      parallelismType = 2;\n    }\n    return {\n      parallelismType\n    };\n  }\n  matchSPS(sps1, sps2) {\n    return String.fromCharCode.apply(null, sps1).substr(3) === String.fromCharCode.apply(null, sps2).substr(3);\n  }\n}\nconst PACKET_LENGTH = 188;\nclass TSDemuxer {\n  constructor(observer, config, typeSupported, logger2) {\n    this.logger = void 0;\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._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.logger = logger2;\n    this.videoParser = null;\n  }\n  static probe(data, logger2) {\n    const syncOffset = TSDemuxer.syncOffset(data);\n    if (syncOffset > 0) {\n      logger2.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  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  resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration) {\n    this.pmtParsed = false;\n    this._pmtId = -1;\n    this._videoTrack = TSDemuxer.createTrack(\"video\");\n    this._videoTrack.duration = trackDuration;\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.videoParser = null;\n    this.aacOverFlow = null;\n    this.remainderData = null;\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\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, this.logger))) {\n                this.readyVideoParser(videoTrack.segmentCodec);\n                if (this.videoParser !== null) {\n                  this.videoParser.parsePES(videoTrack, textTrack, pes, false);\n                }\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, this.logger))) {\n                switch (audioTrack.segmentCodec) {\n                  case \"aac\":\n                    this.parseAACPES(audioTrack, pes);\n                    break;\n                  case \"mp3\":\n                    this.parseMPEGPES(audioTrack, pes);\n                    break;\n                  case \"ac3\":\n                    {\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, this.logger))) {\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, this.observer, this.logger);\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              this.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      emitParsingError(this.observer, new Error(`Found ${tsPacketErrors} TS packet/s that do not start with 0x47`), void 0, this.logger);\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, this.logger))) {\n      this.readyVideoParser(videoTrack.segmentCodec);\n      if (this.videoParser !== null) {\n        this.videoParser.parsePES(videoTrack, textTrack, pes, true);\n        videoTrack.pesData = null;\n      }\n    } else {\n      videoTrack.pesData = videoData;\n    }\n    if (audioData && (pes = parsePES(audioData, this.logger))) {\n      switch (audioTrack.segmentCodec) {\n        case \"aac\":\n          this.parseAACPES(audioTrack, pes);\n          break;\n        case \"mp3\":\n          this.parseMPEGPES(audioTrack, pes);\n          break;\n        case \"ac3\":\n          {\n            this.parseAC3PES(audioTrack, pes);\n          }\n          break;\n      }\n      audioTrack.pesData = null;\n    } else {\n      if (audioData != null && audioData.size) {\n        this.logger.log(\"last AAC PES packet truncated,might overlap between fragments\");\n      }\n      audioTrack.pesData = audioData;\n    }\n    if (id3Data && (pes = parsePES(id3Data, this.logger))) {\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  readyVideoParser(codec) {\n    if (this.videoParser === null) {\n      if (codec === \"avc\") {\n        this.videoParser = new AvcVideoParser();\n      } else if (codec === \"hevc\") {\n        this.videoParser = new HevcVideoParser();\n      }\n    }\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    if (this.observer) {\n      this.observer.removeAllListeners();\n    }\n    this.config = this.logger = this.observer = null;\n    this.aacOverFlow = this.videoParser = this.remainderData = this.sampleAes = null;\n    this._videoTrack = this._audioTrack = this._id3Track = this._txtTrack = void 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      emitParsingError(this.observer, new Error(reason), recoverable, this.logger);\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      this.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      this.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        this.logger.warn(\"[tsdemuxer]: AC3 PES unknown PTS\");\n        return;\n      }\n      const length = data.length;\n      let frameIndex = 0;\n      let offset = 0;\n      let parsed;\n      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      this.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, observer, logger2) {\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\", logger2);\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\", logger2);\n          break;\n        }\n      case 27:\n        if (result.videoPid === -1) {\n          result.videoPid = pid;\n        }\n        break;\n      case 3:\n      case 4:\n        if (!typeSupported.mpeg && !typeSupported.mp3) {\n          logger2.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\", logger2);\n          break;\n        }\n      case 129:\n        {\n          if (!typeSupported.ac3) {\n            logger2.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                    logger2.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        emitParsingError(observer, new Error(\"Unsupported EC-3 in M2TS found\"), void 0, logger2);\n        return result;\n      case 36:\n        {\n          if (result.videoPid === -1) {\n            result.videoPid = pid;\n            result.segmentVideoCodec = \"hevc\";\n            logger2.log(\"HEVC in M2TS found\");\n          }\n        }\n        break;\n    }\n    offset += esInfoLength + 5;\n  }\n  return result;\n}\nfunction emitParsingError(observer, error, levelRetry, logger2) {\n  logger2.warn(`parsing error: ${error.message}`);\n  observer.emit(Events.ERROR, Events.ERROR, {\n    type: ErrorTypes.MEDIA_ERROR,\n    details: ErrorDetails.FRAG_PARSING_ERROR,\n    fatal: false,\n    levelRetry,\n    error,\n    reason: error.message\n  });\n}\nfunction logEncryptedSamplesFoundInUnencryptedStream(type, logger2) {\n  logger2.log(`${type} with AES-128-CBC encryption found in unencrypted stream`);\n}\nfunction parsePES(stream, logger2) {\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 + (frag[10] & 255) * 4194304 + (frag[11] & 254) * 16384 + (frag[12] & 255) * 128 + (frag[13] & 254) / 2;\n      if (pesFlags & 64) {\n        pesDts = (frag[14] & 14) * 536870912 + (frag[15] & 255) * 4194304 + (frag[16] & 254) * 16384 + (frag[17] & 255) * 128 + (frag[18] & 254) / 2;\n        if (pesPts - pesDts > 60 * 9e4) {\n          logger2.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 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      avcC: [],\n      hvc1: [],\n      hvcC: [],\n      btrt: [],\n      dinf: [],\n      dref: [],\n      esds: [],\n      ftyp: [],\n      hdlr: [],\n      mdat: [],\n      mdhd: [],\n      mdia: [],\n      mfhd: [],\n      minf: [],\n      moof: [],\n      moov: [],\n      mp4a: [],\n      \".mp3\": [],\n      dac3: [],\n      \"ac-3\": [],\n      mvex: [],\n      mvhd: [],\n      pasp: [],\n      sdtp: [],\n      stbl: [],\n      stco: [],\n      stsc: [],\n      stsd: [],\n      stsz: [],\n      stts: [],\n      tfdt: [],\n      tfhd: [],\n      traf: [],\n      trak: [],\n      trun: [],\n      trex: [],\n      tkhd: [],\n      vmhd: [],\n      smhd: []\n    };\n    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      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      118,\n      105,\n      100,\n      101,\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      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    ]);\n    const audioHdlr = new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      115,\n      111,\n      117,\n      110,\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      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    ]);\n    MP4.HDLR_TYPES = {\n      video: videoHdlr,\n      audio: audioHdlr\n    };\n    const dref = new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      12,\n      117,\n      114,\n      108,\n      32,\n      0,\n      0,\n      0,\n      1\n    ]);\n    const stco = new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0\n    ]);\n    MP4.STTS = MP4.STSC = MP4.STCO = stco;\n    MP4.STSZ = new Uint8Array([\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    ]);\n    MP4.VMHD = new Uint8Array([\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    ]);\n    MP4.SMHD = new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0\n    ]);\n    MP4.STSD = new Uint8Array([\n      0,\n      0,\n      0,\n      0,\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      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      timescale >> 24 & 255,\n      timescale >> 16 & 255,\n      timescale >> 8 & 255,\n      timescale & 255,\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      0,\n      0\n    ]));\n  }\n  static mdia(track) {\n    return MP4.box(MP4.types.mdia, MP4.mdhd(track.timescale || 0, track.duration || 0), 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      sequenceNumber >> 24,\n      sequenceNumber >> 16 & 255,\n      sequenceNumber >> 8 & 255,\n      sequenceNumber & 255\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 || 0, tracks[0].duration || 0)].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      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      timescale >> 24 & 255,\n      timescale >> 16 & 255,\n      timescale >> 8 & 255,\n      timescale & 255,\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,\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      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      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      255,\n      255,\n      255,\n      255\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      sps[3],\n      sps[4],\n      sps[5],\n      252 | 3,\n      224 | track.sps.length\n    ].concat(sps).concat([\n      track.pps.length\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(MP4.types.avc1, new Uint8Array([\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      0,\n      0,\n      width >> 8 & 255,\n      width & 255,\n      height >> 8 & 255,\n      height & 255,\n      0,\n      72,\n      0,\n      0,\n      0,\n      72,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      18,\n      100,\n      97,\n      105,\n      108,\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      0,\n      24,\n      17,\n      17\n    ]), avcc, MP4.box(MP4.types.btrt, new Uint8Array([\n      0,\n      28,\n      156,\n      128,\n      0,\n      45,\n      198,\n      192,\n      0,\n      45,\n      198,\n      192\n    ])), MP4.box(MP4.types.pasp, new Uint8Array([\n      hSpacing >> 24,\n      hSpacing >> 16 & 255,\n      hSpacing >> 8 & 255,\n      hSpacing & 255,\n      vSpacing >> 24,\n      vSpacing >> 16 & 255,\n      vSpacing >> 8 & 255,\n      vSpacing & 255\n    ])));\n  }\n  static esds(track) {\n    const config = track.config;\n    return new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      3,\n      25,\n      0,\n      1,\n      0,\n      4,\n      17,\n      64,\n      21,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      5,\n      2,\n      ...config,\n      6,\n      1,\n      2\n    ]);\n  }\n  static audioStsd(track) {\n    const samplerate = track.samplerate || 0;\n    return new Uint8Array([\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      track.channelCount || 0,\n      0,\n      16,\n      0,\n      0,\n      0,\n      0,\n      samplerate >> 8 & 255,\n      samplerate & 255,\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    const {\n      segmentCodec\n    } = track;\n    if (track.type === \"audio\") {\n      if (segmentCodec === \"aac\") {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp4a(track));\n      }\n      if (segmentCodec === \"ac3\" && track.config) {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.ac3(track));\n      }\n      if (segmentCodec === \"mp3\" && track.codec === \"mp3\") {\n        return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp3(track));\n      }\n    } else {\n      if (track.pps && track.sps) {\n        if (segmentCodec === \"avc\") {\n          return MP4.box(MP4.types.stsd, MP4.STSD, MP4.avc1(track));\n        }\n        if (segmentCodec === \"hevc\" && track.vps) {\n          return MP4.box(MP4.types.stsd, MP4.STSD, MP4.hvc1(track));\n        }\n      } else {\n        throw new Error(`video track missing pps or sps`);\n      }\n    }\n    throw new Error(`unsupported ${track.type} segment codec (${segmentCodec}/${track.codec})`);\n  }\n  static tkhd(track) {\n    const id = track.id;\n    const duration = (track.duration || 0) * (track.timescale || 0);\n    const width = track.width || 0;\n    const height = track.height || 0;\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      0,\n      0,\n      7,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      id >> 24 & 255,\n      id >> 16 & 255,\n      id >> 8 & 255,\n      id & 255,\n      0,\n      0,\n      0,\n      0,\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      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      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      width >> 8 & 255,\n      width & 255,\n      0,\n      0,\n      height >> 8 & 255,\n      height & 255,\n      0,\n      0\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(MP4.types.traf, MP4.box(MP4.types.tfhd, new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      id >> 24,\n      id >> 16 & 255,\n      id >> 8 & 255,\n      id & 255\n    ])), MP4.box(MP4.types.tfdt, new Uint8Array([\n      1,\n      0,\n      0,\n      0,\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    ])), MP4.trun(track, sampleDependencyTable.length + 16 + 20 + 8 + 16 + 8 + 8), sampleDependencyTable);\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      0,\n      0,\n      0,\n      id >> 24,\n      id >> 16 & 255,\n      id >> 8 & 255,\n      id & 255,\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      1,\n      0,\n      1\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      0,\n      15,\n      1,\n      len >>> 24 & 255,\n      len >>> 16 & 255,\n      len >>> 8 & 255,\n      len & 255,\n      offset >>> 24 & 255,\n      offset >>> 16 & 255,\n      offset >>> 8 & 255,\n      offset & 255\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        size >>> 24 & 255,\n        size >>> 16 & 255,\n        size >>> 8 & 255,\n        size & 255,\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        cts >>> 24 & 255,\n        cts >>> 16 & 255,\n        cts >>> 8 & 255,\n        cts & 255\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  static hvc1(track) {\n    const ps = track.params;\n    const units = [track.vps, track.sps, track.pps];\n    const NALuLengthSize = 4;\n    const config = new Uint8Array([1, ps.general_profile_space << 6 | (ps.general_tier_flag ? 32 : 0) | ps.general_profile_idc, ps.general_profile_compatibility_flags[0], ps.general_profile_compatibility_flags[1], ps.general_profile_compatibility_flags[2], ps.general_profile_compatibility_flags[3], ps.general_constraint_indicator_flags[0], ps.general_constraint_indicator_flags[1], ps.general_constraint_indicator_flags[2], ps.general_constraint_indicator_flags[3], ps.general_constraint_indicator_flags[4], ps.general_constraint_indicator_flags[5], ps.general_level_idc, 240 | ps.min_spatial_segmentation_idc >> 8, 255 & ps.min_spatial_segmentation_idc, 252 | ps.parallelismType, 252 | ps.chroma_format_idc, 248 | ps.bit_depth_luma_minus8, 248 | ps.bit_depth_chroma_minus8, 0, parseInt(ps.frame_rate.fps), NALuLengthSize - 1 | ps.temporal_id_nested << 2 | ps.num_temporal_layers << 3 | (ps.frame_rate.fixed ? 64 : 0), units.length]);\n    let length = config.length;\n    for (let i = 0; i < units.length; i += 1) {\n      length += 3;\n      for (let j = 0; j < units[i].length; j += 1) {\n        length += 2 + units[i][j].length;\n      }\n    }\n    const hvcC = new Uint8Array(length);\n    hvcC.set(config, 0);\n    length = config.length;\n    const iMax = units.length - 1;\n    for (let i = 0; i < units.length; i += 1) {\n      hvcC.set(new Uint8Array([32 + i | (i === iMax ? 128 : 0), 0, units[i].length]), length);\n      length += 3;\n      for (let j = 0; j < units[i].length; j += 1) {\n        hvcC.set(new Uint8Array([units[i][j].length >> 8, units[i][j].length & 255]), length);\n        length += 2;\n        hvcC.set(units[i][j], length);\n        length += units[i][j].length;\n      }\n    }\n    const hvcc = MP4.box(MP4.types.hvcC, hvcC);\n    const width = track.width;\n    const height = track.height;\n    const hSpacing = track.pixelRatio[0];\n    const vSpacing = track.pixelRatio[1];\n    return MP4.box(MP4.types.hvc1, new Uint8Array([\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      0,\n      0,\n      width >> 8 & 255,\n      width & 255,\n      height >> 8 & 255,\n      height & 255,\n      0,\n      72,\n      0,\n      0,\n      0,\n      72,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      18,\n      100,\n      97,\n      105,\n      108,\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      0,\n      24,\n      17,\n      17\n    ]), hvcc, MP4.box(MP4.types.btrt, new Uint8Array([\n      0,\n      28,\n      156,\n      128,\n      0,\n      45,\n      198,\n      192,\n      0,\n      45,\n      198,\n      192\n    ])), MP4.box(MP4.types.pasp, new Uint8Array([\n      hSpacing >> 24,\n      hSpacing >> 16 & 255,\n      hSpacing >> 8 & 255,\n      hSpacing & 255,\n      vSpacing >> 24,\n      vSpacing >> 16 & 255,\n      vSpacing >> 8 & 255,\n      vSpacing & 255\n    ])));\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}\nfunction timestampToString(timestamp) {\n  const {\n    baseTime,\n    timescale,\n    trackId\n  } = timestamp;\n  return `${baseTime / timescale} (${baseTime}/${timescale}) trackId: ${trackId}`;\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;\nfunction createMp4Sample(isKeyframe, duration, size, cts) {\n  return {\n    duration,\n    size,\n    cts,\n    flags: {\n      isLeading: 0,\n      isDependedOn: 0,\n      hasRedundancy: 0,\n      degradPrio: 0,\n      dependsOn: isKeyframe ? 2 : 1,\n      isNonSync: isKeyframe ? 0 : 1\n    }\n  };\n}\nclass MP4Remuxer extends Logger {\n  constructor(observer, config, typeSupported, logger2) {\n    super(\"mp4-remuxer\", logger2);\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.nextVideoTs = null;\n    this.nextAudioTs = 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    const initPTS = this._initPTS;\n    if (!initPTS || !defaultTimeStamp || defaultTimeStamp.trackId !== initPTS.trackId || defaultTimeStamp.baseTime !== initPTS.baseTime || defaultTimeStamp.timescale !== initPTS.timescale) {\n      this.log(`Reset initPTS: ${initPTS ? timestampToString(initPTS) : initPTS} > ${defaultTimeStamp ? timestampToString(defaultTimeStamp) : defaultTimeStamp}`);\n    }\n    this._initPTS = this._initDTS = defaultTimeStamp;\n  }\n  resetNextTimestamp() {\n    this.log(\"reset next timestamp\");\n    this.isVideoContiguous = false;\n    this.isAudioContiguous = false;\n  }\n  resetInitSegment() {\n    this.log(\"ISGenerated flag reset\");\n    this.ISGenerated = false;\n    this.videoTrackConfig = void 0;\n  }\n  getVideoStartPts(videoSamples) {\n    let rolloverDetected = false;\n    const firstPts = videoSamples[0].pts;\n    const startPTS = videoSamples.reduce((minPTS, sample) => {\n      let pts = sample.pts;\n      let delta = pts - minPTS;\n      if (delta < -4294967296) {\n        rolloverDetected = true;\n        pts = normalizePts(pts, firstPts);\n        delta = pts - minPTS;\n      }\n      if (delta > 0) {\n        return minPTS;\n      }\n      return pts;\n    }, firstPts);\n    if (rolloverDetected) {\n      this.debug(\"PTS rollover detected\");\n    }\n    return startPTS;\n  }\n  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])) || !config && enoughVideoSamples || this.nextAudioTs === null && enoughAudioSamples) {\n          this.resetInitSegment();\n        }\n      }\n      if (!this.ISGenerated) {\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            this.warn(`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            this.warn(`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            this.warn(\"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              this.warn(\"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  computeInitPts(basetime, timescale, presentationTime, type) {\n    const offset = Math.round(presentationTime * timescale);\n    let timestamp = normalizePts(basetime, offset);\n    if (timestamp < offset + timescale) {\n      this.log(`Adjusting PTS for rollover in timeline near ${(offset - timestamp) / timescale} ${type}`);\n      while (timestamp < offset + timescale) {\n        timestamp += 8589934592;\n      }\n    }\n    return timestamp - offset;\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    let trackId = -1;\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        trackId = audioTrack.id;\n        timescale = audioTrack.inputTimeScale;\n        if (!_initPTS || timescale !== _initPTS.timescale) {\n          initPTS = initDTS = this.computeInitPts(audioSamples[0].pts, timescale, timeOffset, \"audio\");\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        trackId = videoTrack.id;\n        timescale = videoTrack.inputTimeScale;\n        if (!_initPTS || timescale !== _initPTS.timescale) {\n          const basePTS = this.getVideoStartPts(videoSamples);\n          const baseDTS = normalizePts(videoSamples[0].dts, basePTS);\n          const videoInitDTS = this.computeInitPts(baseDTS, timescale, timeOffset, \"video\");\n          const videoInitPTS = this.computeInitPts(basePTS, timescale, timeOffset, \"video\");\n          initDTS = Math.min(initDTS, videoInitDTS);\n          initPTS = Math.min(initPTS, videoInitPTS);\n        } else {\n          computePTSDTS = false;\n        }\n      }\n      this.videoTrackConfig = {\n        width: videoTrack.width,\n        height: videoTrack.height,\n        pixelRatio: videoTrack.pixelRatio\n      };\n    }\n    if (Object.keys(tracks).length) {\n      this.ISGenerated = true;\n      if (computePTSDTS) {\n        if (_initPTS) {\n          this.warn(`Timestamps at playlist time: ${accurateTimeOffset ? \"\" : \"~\"}${timeOffset} ${initPTS / timescale} != initPTS: ${_initPTS.baseTime / _initPTS.timescale} (${_initPTS.baseTime}/${_initPTS.timescale}) trackId: ${_initPTS.trackId}`);\n        }\n        this.log(`Found initPTS at playlist time: ${timeOffset} offset: ${initPTS / timescale} (${initPTS}/${timescale}) trackId: ${trackId}`);\n        this._initPTS = {\n          baseTime: initPTS,\n          timescale,\n          trackId\n        };\n        this._initDTS = {\n          baseTime: initDTS,\n          timescale,\n          trackId\n        };\n      } else {\n        initPTS = timescale = void 0;\n      }\n      return {\n        tracks,\n        initPTS,\n        timescale,\n        trackId\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    const initTime = initPTS.baseTime * timeScale / initPTS.timescale;\n    let nextVideoTs = this.nextVideoTs;\n    let offset = 8;\n    let mp4SampleDuration = this.videoSampleDuration;\n    let firstDTS;\n    let lastDTS;\n    let minPTS = Number.POSITIVE_INFINITY;\n    let maxPTS = Number.NEGATIVE_INFINITY;\n    let sortSamples = false;\n    if (!contiguous || nextVideoTs === null) {\n      const pts = initTime + timeOffset * timeScale;\n      const cts = inputSamples[0].pts - normalizePts(inputSamples[0].dts, inputSamples[0].pts);\n      if (chromeVersion && nextVideoTs !== null && Math.abs(pts - cts - (nextVideoTs + initTime)) < 15e3) {\n        contiguous = true;\n      } else {\n        nextVideoTs = pts - cts - initTime;\n      }\n    }\n    const nextVideoPts = nextVideoTs + initTime;\n    for (let i = 0; i < nbSamples; i++) {\n      const sample = inputSamples[i];\n      sample.pts = normalizePts(sample.pts, nextVideoPts);\n      sample.dts = normalizePts(sample.dts, nextVideoPts);\n      if (sample.dts < inputSamples[i > 0 ? i - 1 : i].dts) {\n        sortSamples = true;\n      }\n    }\n    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 - nextVideoPts;\n      const foundHole = delta > averageSampleDuration;\n      const foundOverlap = delta < -1;\n      if (foundHole || foundOverlap) {\n        if (foundHole) {\n          this.warn(`${(track.segmentCodec || \"\").toUpperCase()}: ${toMsFromMpegTsClock(delta, true)} ms (${delta}dts) hole between fragments detected at ${timeOffset.toFixed(3)}`);\n        } else {\n          this.warn(`${(track.segmentCodec || \"\").toUpperCase()}: ${toMsFromMpegTsClock(-delta, true)} ms (${delta}dts) overlapping between fragments detected at ${timeOffset.toFixed(3)}`);\n        }\n        if (!foundOverlap || nextVideoPts >= inputSamples[0].pts || chromeVersion) {\n          firstDTS = nextVideoPts;\n          const firstPTS = inputSamples[0].pts - delta;\n          if (foundHole) {\n            inputSamples[0].dts = firstDTS;\n            inputSamples[0].pts = firstPTS;\n          } else {\n            let isPTSOrderRetained = true;\n            for (let i = 0; i < inputSamples.length; i++) {\n              if (inputSamples[i].dts > firstPTS && isPTSOrderRetained) {\n                break;\n              }\n              const prevPTS = inputSamples[i].pts;\n              inputSamples[i].dts -= delta;\n              inputSamples[i].pts -= delta;\n              if (i < inputSamples.length - 1) {\n                const nextSamplePTS = inputSamples[i + 1].pts;\n                const currentSamplePTS = inputSamples[i].pts;\n                const currentOrder = nextSamplePTS <= currentSamplePTS;\n                const prevOrder = nextSamplePTS <= prevPTS;\n                isPTSOrderRetained = currentOrder == prevOrder;\n              }\n            }\n          }\n          this.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 view2 = new DataView(mdat.buffer);\n    view2.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        view2.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.nextAudioTs !== null) {\n          const gapTolerance = Math.floor(config.maxBufferHole * timeScale);\n          const deltaToFrameEnd = (audioTrackLength ? minPTS + audioTrackLength * timeScale : this.nextAudioTs + initTime) - VideoSample.pts;\n          if (deltaToFrameEnd > gapTolerance) {\n            mp4SampleDuration = deltaToFrameEnd - lastFrameDuration;\n            if (mp4SampleDuration < 0) {\n              mp4SampleDuration = lastFrameDuration;\n            } else {\n              stretchedLastFrame = true;\n            }\n            this.log(`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(createMp4Sample(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          this.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    const endDTS = lastDTS + mp4SampleDuration;\n    this.nextVideoTs = nextVideoTs = endDTS - initTime;\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 - initTime) / timeScale,\n      endPTS: (maxPTS + mp4SampleDuration - initTime) / timeScale,\n      startDTS: (firstDTS - initTime) / timeScale,\n      endDTS: nextVideoTs / timeScale,\n      type,\n      hasAudio: false,\n      hasVideo: true,\n      nb: outputSamples.length,\n      dropped: track.dropped\n    };\n    track.samples = [];\n    track.dropped = 0;\n    return data;\n  }\n  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 nextAudioTs = this.nextAudioTs || -1;\n    const initTime = initPTS.baseTime * inputTimeScale / initPTS.timescale;\n    const timeOffsetMpegTS = initTime + timeOffset * inputTimeScale;\n    this.isAudioContiguous = contiguous = contiguous || inputSamples.length && nextAudioTs > 0 && (accurateTimeOffset && Math.abs(timeOffsetMpegTS - (nextAudioTs + initTime)) < 9e3 || Math.abs(normalizePts(inputSamples[0].pts, timeOffsetMpegTS) - (nextAudioTs + initTime)) < 20 * inputSampleDuration);\n    inputSamples.forEach(function(sample) {\n      sample.pts = normalizePts(sample.pts, timeOffsetMpegTS);\n    });\n    if (!contiguous || nextAudioTs < 0) {\n      const sampleCount = inputSamples.length;\n      inputSamples = inputSamples.filter((sample) => sample.pts >= 0);\n      if (sampleCount !== inputSamples.length) {\n        this.warn(`Removed ${inputSamples.length - sampleCount} of ${sampleCount} samples (initPTS ${initTime} / ${inputTimeScale})`);\n      }\n      if (!inputSamples.length) {\n        return;\n      }\n      if (videoTimeOffset === 0) {\n        nextAudioTs = 0;\n      } else if (accurateTimeOffset && !alignedWithVideo) {\n        nextAudioTs = Math.max(0, timeOffsetMpegTS - initTime);\n      } else {\n        nextAudioTs = inputSamples[0].pts - initTime;\n      }\n    }\n    if (track.segmentCodec === \"aac\") {\n      const maxAudioFramesDrift = this.config.maxAudioFramesDrift;\n      for (let i = 0, nextPts = nextAudioTs + initTime; 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            this.warn(`Audio frame @ ${(pts / inputTimeScale).toFixed(3)}s overlaps marker by ${Math.round(1e3 * delta / inputTimeScale)} ms.`);\n            this.nextAudioTs = nextAudioTs = pts - initTime;\n            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          while (nextPts < 0 && missing && inputSampleDuration) {\n            missing--;\n            nextPts += inputSampleDuration;\n          }\n          if (i === 0) {\n            this.nextAudioTs = nextAudioTs = nextPts - initTime;\n          }\n          this.warn(`Injecting ${missing} audio frames @ ${((nextPts - initTime) / inputTimeScale).toFixed(3)}s due to ${Math.round(1e3 * delta / inputTimeScale)} ms gap.`);\n          for (let j = 0; j < missing; j++) {\n            let fillFrame = AAC.getSilentFrame(track.parsedCodec || track.manifestCodec || track.codec, track.channelCount);\n            if (!fillFrame) {\n              this.log(\"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: nextPts\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 = nextAudioTs + initTime;\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 view2 = new DataView(mdat.buffer);\n            view2.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(createMp4Sample(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    nextAudioTs = lastPTS - initTime;\n    this.nextAudioTs = nextAudioTs + 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 - initTime) / inputTimeScale;\n    const end = this.nextAudioTs / 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}\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 PassThroughRemuxer extends Logger {\n  constructor(observer, config, typeSupported, logger2) {\n    super(\"passthrough-remuxer\", logger2);\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    this.isVideoContiguous = false;\n  }\n  destroy() {\n  }\n  resetTimeStamp(defaultInitPTS) {\n    this.lastEndTime = null;\n    const initPTS = this.initPTS;\n    if (initPTS && defaultInitPTS) {\n      if (initPTS.baseTime === defaultInitPTS.baseTime && initPTS.timescale === defaultInitPTS.timescale) {\n        return;\n      }\n    }\n    this.initPTS = defaultInitPTS;\n  }\n  resetNextTimestamp() {\n    this.isVideoContiguous = false;\n    this.lastEndTime = null;\n  }\n  resetInitSegment(initSegment, audioCodec, videoCodec, decryptdata) {\n    this.audioCodec = audioCodec;\n    this.videoCodec = videoCodec;\n    this.generateInitSegment(initSegment, decryptdata);\n    this.emitInitSegment = true;\n  }\n  generateInitSegment(initSegment, decryptdata) {\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 {\n      audio,\n      video\n    } = this.initData = parseInitSegment(initSegment);\n    if (decryptdata) {\n      patchEncyptionData(initSegment, decryptdata);\n    } else {\n      const eitherTrack = audio || video;\n      if (eitherTrack != null && eitherTrack.encrypted) {\n        this.warn(`Init segment with encrypted track with has no key (\"${eitherTrack.codec}\")!`);\n      }\n    }\n    if (audio) {\n      audioCodec = getParsedTrackCodec(audio, ElementaryStreamTypes.AUDIO, this);\n    }\n    if (video) {\n      videoCodec = getParsedTrackCodec(video, ElementaryStreamTypes.VIDEO, this);\n    }\n    const tracks = {};\n    if (audio && video) {\n      tracks.audiovideo = {\n        container: \"video/mp4\",\n        codec: audioCodec + \",\" + videoCodec,\n        supplemental: video.supplemental,\n        encrypted: video.encrypted,\n        initSegment,\n        id: \"main\"\n      };\n    } else if (audio) {\n      tracks.audio = {\n        container: \"audio/mp4\",\n        codec: audioCodec,\n        encrypted: audio.encrypted,\n        initSegment,\n        id: \"audio\"\n      };\n    } else if (video) {\n      tracks.video = {\n        container: \"video/mp4\",\n        codec: videoCodec,\n        supplemental: video.supplemental,\n        encrypted: video.encrypted,\n        initSegment,\n        id: \"main\"\n      };\n    } else {\n      this.warn(\"initSegment does not contain moov or trak boxes.\");\n    }\n    this.initTracks = tracks;\n  }\n  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.length) {\n      return result;\n    }\n    const initSegment = {\n      initPTS: void 0,\n      timescale: void 0,\n      trackId: void 0\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      this.warn(\"Failed to generate initSegment.\");\n      return result;\n    }\n    if (this.emitInitSegment) {\n      initSegment.tracks = this.initTracks;\n      this.emitInitSegment = false;\n    }\n    const trackSampleData = getSampleData(data, initData, this);\n    const audioSampleTimestamps = initData.audio ? trackSampleData[initData.audio.id] : null;\n    const videoSampleTimestamps = initData.video ? trackSampleData[initData.video.id] : null;\n    const videoStartTime = toStartEndOrDefault(videoSampleTimestamps, Infinity);\n    const audioStartTime = toStartEndOrDefault(audioSampleTimestamps, Infinity);\n    const videoEndTime = toStartEndOrDefault(videoSampleTimestamps, 0, true);\n    const audioEndTime = toStartEndOrDefault(audioSampleTimestamps, 0, true);\n    let decodeTime = timeOffset;\n    let duration = 0;\n    const syncOnAudio = audioSampleTimestamps && (!videoSampleTimestamps || !initPTS && audioStartTime < videoStartTime || initPTS && initPTS.trackId === initData.audio.id);\n    const baseOffsetSamples = syncOnAudio ? audioSampleTimestamps : videoSampleTimestamps;\n    if (baseOffsetSamples) {\n      const timescale = baseOffsetSamples.timescale;\n      const baseTime = baseOffsetSamples.start - timeOffset * timescale;\n      const trackId = syncOnAudio ? initData.audio.id : initData.video.id;\n      decodeTime = baseOffsetSamples.start / timescale;\n      duration = syncOnAudio ? audioEndTime - audioStartTime : videoEndTime - videoStartTime;\n      if ((accurateTimeOffset || !initPTS) && (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || timescale !== initPTS.timescale)) {\n        if (initPTS) {\n          this.warn(`Timestamps at playlist time: ${accurateTimeOffset ? \"\" : \"~\"}${timeOffset} ${baseTime / timescale} != initPTS: ${initPTS.baseTime / initPTS.timescale} (${initPTS.baseTime}/${initPTS.timescale}) trackId: ${initPTS.trackId}`);\n        }\n        this.log(`Found initPTS at playlist time: ${timeOffset} offset: ${decodeTime - timeOffset} (${baseTime}/${timescale}) trackId: ${trackId}`);\n        initPTS = null;\n        initSegment.initPTS = baseTime;\n        initSegment.timescale = timescale;\n        initSegment.trackId = trackId;\n      }\n    } else {\n      this.warn(`No audio or video samples found for initPTS at playlist time: ${timeOffset}`);\n    }\n    if (!initPTS) {\n      if (!initSegment.timescale || initSegment.trackId === void 0 || initSegment.initPTS === void 0) {\n        this.warn(\"Could not set initPTS\");\n        initSegment.initPTS = decodeTime;\n        initSegment.timescale = 1;\n        initSegment.trackId = -1;\n      }\n      this.initPTS = initPTS = {\n        baseTime: initSegment.initPTS,\n        timescale: initSegment.timescale,\n        trackId: initSegment.trackId\n      };\n    } else {\n      initSegment.initPTS = initPTS.baseTime;\n      initSegment.timescale = initPTS.timescale;\n      initSegment.trackId = initPTS.trackId;\n    }\n    const startTime = decodeTime - initPTS.baseTime / initPTS.timescale;\n    const endTime = startTime + duration;\n    if (duration > 0) {\n      this.lastEndTime = endTime;\n    } else {\n      this.warn(\"Duration parsed from mp4 should be greater than zero\");\n      this.resetNextTimestamp();\n    }\n    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 encrypted = (initData.audio ? initData.audio.encrypted : false) || (initData.video ? initData.video.encrypted : false);\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      encrypted\n    };\n    result.audio = hasAudio && !hasVideo ? track : void 0;\n    result.video = hasVideo ? track : void 0;\n    const videoSampleCount = videoSampleTimestamps == null ? void 0 : videoSampleTimestamps.sampleCount;\n    if (videoSampleCount) {\n      const firstKeyFrame = videoSampleTimestamps.keyFrameIndex;\n      const independent = firstKeyFrame !== -1;\n      track.nb = videoSampleCount;\n      track.dropped = firstKeyFrame === 0 || this.isVideoContiguous ? 0 : independent ? firstKeyFrame : videoSampleCount;\n      track.independent = independent;\n      track.firstKeyFrame = firstKeyFrame;\n      if (independent && videoSampleTimestamps.keyFrameStart) {\n        track.firstKeyFramePTS = (videoSampleTimestamps.keyFrameStart - initPTS.baseTime) / initPTS.timescale;\n      }\n      if (!this.isVideoContiguous) {\n        result.independent = independent;\n      }\n      this.isVideoContiguous || (this.isVideoContiguous = independent);\n      if (track.dropped) {\n        this.warn(`fmp4 does not start with IDR: firstIDR ${firstKeyFrame}/${videoSampleCount} dropped: ${track.dropped} start: ${track.firstKeyFramePTS || \"NA\"}`);\n      }\n    }\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 toStartEndOrDefault(trackTimes, defaultValue, end = false) {\n  return (trackTimes == null ? void 0 : trackTimes.start) !== void 0 ? (trackTimes.start + (end ? trackTimes.duration : 0)) / trackTimes.timescale : defaultValue;\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, logger2) {\n  const parsedCodec = 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    logger2.warn(`Unhandled audio codec \"${parsedCodec}\" in mp4 MAP`);\n    return parsedCodec || \"mp4a\";\n  }\n  logger2.warn(`Unhandled video codec \"${parsedCodec}\" in mp4 MAP`);\n  return parsedCodec || \"avc1\";\n}\nlet now;\ntry {\n  now = self.performance.now.bind(self.performance);\n} catch (err) {\n  now = 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, logger2) {\n    this.asyncResult = false;\n    this.logger = void 0;\n    this.observer = void 0;\n    this.typeSupported = void 0;\n    this.config = 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.id = id;\n    this.logger = logger2;\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 && isFullSegmentEncryption(keyData.method)) {\n      const decrypter = this.getDecrypter();\n      const aesMode = getAesModeFromFullSegmentMethod(keyData.method);\n      if (decrypter.isSync()) {\n        let decryptedData = decrypter.softwareDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode);\n        const loadingParts = chunkMeta.part > -1;\n        if (loadingParts) {\n          const _data = decrypter.flush();\n          decryptedData = _data ? _data.buffer : _data;\n        }\n        if (!decryptedData) {\n          stats.executeEnd = now();\n          return emptyResult(chunkMeta);\n        }\n        uintData = new Uint8Array(decryptedData);\n      } else {\n        this.asyncResult = true;\n        this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode).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        this.logger.warn(`[transmuxer] ${error.message}`);\n        this.observer.emit(Events.ERROR, Events.ERROR, {\n          type: ErrorTypes.MEDIA_ERROR,\n          details: ErrorDetails.FRAG_PARSING_ERROR,\n          fatal: false,\n          error,\n          reason: error.message\n        });\n        stats.executeEnd = now();\n        return emptyResult(chunkMeta);\n      }\n    }\n    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    this.asyncResult = isPromise(result);\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  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      this.asyncResult = true;\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.buffer, null, chunkMeta));\n      }\n    }\n    const {\n      demuxer,\n      remuxer\n    } = this;\n    if (!demuxer || !remuxer) {\n      stats.executeEnd = now();\n      const emptyResults = [emptyResult(chunkMeta)];\n      if (this.asyncResult) {\n        return Promise.resolve(emptyResults);\n      }\n      return emptyResults;\n    }\n    const demuxResultOrPromise = demuxer.flush(timeOffset);\n    if (isPromise(demuxResultOrPromise)) {\n      this.asyncResult = true;\n      return demuxResultOrPromise.then((demuxResult) => {\n        this.flushRemux(transmuxResults, demuxResult, chunkMeta);\n        return transmuxResults;\n      });\n    }\n    this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);\n    if (this.asyncResult) {\n      return Promise.resolve(transmuxResults);\n    }\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    this.logger.log(`[transmuxer.ts]: Flushed ${this.id} sn: ${chunkMeta.sn}${chunkMeta.part > -1 ? \" part: \" + chunkMeta.part : \"\"} of ${this.id === PlaylistLevelType.MAIN ? \"level\" : \"track\"} ${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    } = 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, this.logger)) {\n        mux = muxConfig[i];\n        break;\n      }\n    }\n    if (!mux) {\n      return new Error(\"Failed to find demuxer by probing fragment data\");\n    }\n    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, this.logger);\n    }\n    if (!demuxer || !(demuxer instanceof Demuxer)) {\n      this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);\n      this.probe = Demuxer.probe;\n    }\n  }\n  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}\nlet transmuxerInstanceCount = 0;\nclass TransmuxerInterface {\n  constructor(_hls, id, onTransmuxComplete, onFlush) {\n    this.error = null;\n    this.hls = void 0;\n    this.id = void 0;\n    this.instanceNo = transmuxerInstanceCount++;\n    this.observer = void 0;\n    this.frag = null;\n    this.part = null;\n    this.useWorker = void 0;\n    this.workerContext = null;\n    this.transmuxer = null;\n    this.onTransmuxComplete = void 0;\n    this.onFlush = void 0;\n    this.onWorkerMessage = (event) => {\n      const data = event.data;\n      const hls = this.hls;\n      if (!hls || !(data != null && data.event) || data.instanceNo !== this.instanceNo) {\n        return;\n      }\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 (hls.logger[data.data.logType]) {\n            hls.logger[data.data.logType](data.data.message);\n          }\n          break;\n        }\n        default: {\n          data.data = data.data || {};\n          data.data.frag = this.frag;\n          data.data.part = this.part;\n          data.data.id = this.id;\n          hls.trigger(data.event, data.data);\n          break;\n        }\n      }\n    };\n    this.onWorkerError = (event) => {\n      if (!this.hls) {\n        return;\n      }\n      const error = new Error(`${event.message}  (${event.filename}:${event.lineno})`);\n      this.hls.config.enableWorker = false;\n      this.hls.logger.warn(`Error in \"${this.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    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 || void 0;\n      if (ev === Events.ERROR) {\n        data = data;\n        data.parent = this.id;\n        data.part = this.part;\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 m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);\n    if (this.useWorker && typeof Worker !== \"undefined\") {\n      const logger2 = this.hls.logger;\n      const canCreateWorker = config.workerPath || hasUMDWorker();\n      if (canCreateWorker) {\n        try {\n          if (config.workerPath) {\n            logger2.log(`loading Web Worker ${config.workerPath} for \"${id}\"`);\n            this.workerContext = loadWorker(config.workerPath);\n          } else {\n            logger2.log(`injecting Web Worker for \"${id}\"`);\n            this.workerContext = injectWorker();\n          }\n          const {\n            worker\n          } = this.workerContext;\n          worker.addEventListener(\"message\", this.onWorkerMessage);\n          worker.addEventListener(\"error\", this.onWorkerError);\n          worker.postMessage({\n            instanceNo: this.instanceNo,\n            cmd: \"init\",\n            typeSupported: m2tsTypeSupported,\n            id,\n            config: stringify(config)\n          });\n        } catch (err) {\n          logger2.warn(`Error setting up \"${id}\" Web Worker, fallback to inline`, err);\n          this.terminateWorker();\n          this.error = null;\n          this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, \"\", id, _hls.logger);\n        }\n        return;\n      }\n    }\n    this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, \"\", id, _hls.logger);\n  }\n  reset() {\n    this.frag = null;\n    this.part = null;\n    if (this.workerContext) {\n      const instanceNo = this.instanceNo;\n      this.instanceNo = transmuxerInstanceCount++;\n      const config = this.hls.config;\n      const m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);\n      this.workerContext.worker.postMessage({\n        instanceNo: this.instanceNo,\n        cmd: \"reset\",\n        resetNo: instanceNo,\n        typeSupported: m2tsTypeSupported,\n        id: this.id,\n        config: stringify(config)\n      });\n    }\n  }\n  terminateWorker() {\n    if (this.workerContext) {\n      const {\n        worker\n      } = this.workerContext;\n      this.workerContext = null;\n      worker.removeEventListener(\"message\", this.onWorkerMessage);\n      worker.removeEventListener(\"error\", this.onWorkerError);\n      removeWorkerFromStore(this.hls.config.workerPath);\n    }\n  }\n  destroy() {\n    if (this.workerContext) {\n      this.terminateWorker();\n      this.onWorkerMessage = this.onWorkerError = null;\n    } else {\n      const transmuxer = this.transmuxer;\n      if (transmuxer) {\n        transmuxer.destroy();\n        this.transmuxer = null;\n      }\n    }\n    const observer = this.observer;\n    if (observer) {\n      observer.removeAllListeners();\n    }\n    this.frag = null;\n    this.part = null;\n    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      instanceNo,\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      this.hls.logger.log(`[transmuxer-interface]: Starting new transmux session for ${frag.type} sn: ${chunkMeta.sn}${chunkMeta.part > -1 ? \" part: \" + chunkMeta.part : \"\"} ${this.id === PlaylistLevelType.MAIN ? \"level\" : \"track\"}: ${chunkMeta.level} id: ${chunkMeta.id}\n        discontinuity: ${discontinuity}\n        trackSwitch: ${trackSwitch}\n        contiguous: ${contiguous}\n        accurateTimeOffset: ${accurateTimeOffset}\n        timeOffset: ${timeOffset}\n        initSegmentChange: ${initSegmentChange}`);\n      const config = new TransmuxConfig(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        instanceNo,\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        transmuxResult.then((data2) => {\n          this.handleTransmuxComplete(data2);\n        }).catch((error) => {\n          this.transmuxerError(error, chunkMeta, \"transmuxer-interface push error\");\n        });\n      } else {\n        this.handleTransmuxComplete(transmuxResult);\n      }\n    }\n  }\n  flush(chunkMeta) {\n    chunkMeta.transmuxing.start = self.performance.now();\n    const {\n      instanceNo,\n      transmuxer\n    } = this;\n    if (this.workerContext) {\n      this.workerContext.worker.postMessage({\n        instanceNo,\n        cmd: \"flush\",\n        chunkMeta\n      });\n    } else if (transmuxer) {\n      const transmuxResult = transmuxer.flush(chunkMeta);\n      if (isPromise(transmuxResult)) {\n        transmuxResult.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      frag: this.frag || void 0,\n      part: this.part || void 0,\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  configureTransmuxer(config) {\n    const {\n      instanceNo,\n      transmuxer\n    } = this;\n    if (this.workerContext) {\n      this.workerContext.worker.postMessage({\n        instanceNo,\n        cmd: \"configure\",\n        config\n      });\n    } else if (transmuxer) {\n      transmuxer.configure(config);\n    }\n  }\n  handleTransmuxComplete(result) {\n    result.chunkMeta.transmuxing.end = self.performance.now();\n    this.onTransmuxComplete(result);\n  }\n}\nconst TICK_INTERVAL$3 = 100;\nclass AudioStreamController extends BaseStreamController {\n  constructor(hls, fragmentTracker, keyLoader) {\n    super(hls, fragmentTracker, keyLoader, \"audio-stream-controller\", PlaylistLevelType.AUDIO);\n    this.mainAnchor = null;\n    this.mainFragLoading = null;\n    this.audioOnly = false;\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.resetItem();\n  }\n  resetItem() {\n    this.mainDetails = this.mainAnchor = this.mainFragLoading = this.bufferedTrack = this.switchingTrack = this.waitingData = this.cachedTrackLoadedData = null;\n  }\n  registerListeners() {\n    super.registerListeners();\n    const {\n      hls\n    } = this;\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this);\n    hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n    hls.on(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n    hls.on(Events.BUFFER_RESET, this.onBufferReset, this);\n    hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n    hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n    hls.on(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n    hls.on(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  unregisterListeners() {\n    const {\n      hls\n    } = this;\n    if (!hls) {\n      return;\n    }\n    super.unregisterListeners();\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this);\n    hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n    hls.off(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n    hls.off(Events.BUFFER_RESET, this.onBufferReset, this);\n    hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n    hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n    hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n    hls.off(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n    hls.off(Events.FRAG_LOADING, this.onFragLoading, this);\n    hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  onInitPtsFound(event, {\n    frag,\n    id,\n    initPTS,\n    timescale,\n    trackId\n  }) {\n    if (id === PlaylistLevelType.MAIN) {\n      const cc = frag.cc;\n      const inFlightFrag = this.fragCurrent;\n      this.initPTS[cc] = {\n        baseTime: initPTS,\n        timescale,\n        trackId\n      };\n      this.log(`InitPTS for cc: ${cc} found from main: ${initPTS / timescale} (${initPTS}/${timescale}) trackId: ${trackId}`);\n      this.mainAnchor = frag;\n      if (this.state === State.WAITING_INIT_PTS) {\n        const waitingData = this.waitingData;\n        if (!waitingData && !this.loadingParts || waitingData && waitingData.frag.cc !== cc) {\n          this.syncWithAnchor(frag, waitingData == null ? void 0 : waitingData.frag);\n        }\n      } else if (!this.hls.hasEnoughToStart && inFlightFrag && inFlightFrag.cc !== cc) {\n        inFlightFrag.abortRequests();\n        this.syncWithAnchor(frag, inFlightFrag);\n      } else if (this.state === State.IDLE) {\n        this.tick();\n      }\n    }\n  }\n  getLoadPosition() {\n    if (!this.startFragRequested && this.nextLoadPosition >= 0) {\n      return this.nextLoadPosition;\n    }\n    return super.getLoadPosition();\n  }\n  syncWithAnchor(mainAnchor, waitingToAppend) {\n    var _this$mainFragLoading;\n    const mainFragLoading = ((_this$mainFragLoading = this.mainFragLoading) == null ? void 0 : _this$mainFragLoading.frag) || null;\n    if (waitingToAppend) {\n      if ((mainFragLoading == null ? void 0 : mainFragLoading.cc) === waitingToAppend.cc) {\n        return;\n      }\n    }\n    const targetDiscontinuity = (mainFragLoading || mainAnchor).cc;\n    const trackDetails = this.getLevelDetails();\n    const pos = this.getLoadPosition();\n    const syncFrag = findNearestWithCC(trackDetails, targetDiscontinuity, pos);\n    if (syncFrag) {\n      this.log(`Syncing with main frag at ${syncFrag.start} cc ${syncFrag.cc}`);\n      this.startFragRequested = false;\n      this.nextLoadPosition = syncFrag.start;\n      this.resetLoadingState();\n      if (this.state === State.IDLE) {\n        this.doTickIdle();\n      }\n    }\n  }\n  startLoad(startPosition, skipSeekToStartPosition) {\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$3);\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.state = State.WAITING_TRACK;\n    }\n    this.nextLoadPosition = this.lastCurrentTime = startPosition + this.timelineOffset;\n    this.startPosition = skipSeekToStartPosition ? -1 : 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        const {\n          levels,\n          trackId\n        } = this;\n        const currenTrack = levels == null ? void 0 : levels[trackId];\n        const details = currenTrack == null ? void 0 : currenTrack.details;\n        if (details && !this.waitForLive(currenTrack)) {\n          if (this.waitForCdnTuneIn(details)) {\n            break;\n          }\n          this.state = State.WAITING_INIT_PTS;\n        }\n        break;\n      }\n      case State.FRAG_LOADING_WAITING_RETRY: {\n        this.checkRetryDate();\n        break;\n      }\n      case State.WAITING_INIT_PTS: {\n        const waitingData = this.waitingData;\n        if (waitingData) {\n          const {\n            frag,\n            part,\n            cache,\n            complete\n          } = waitingData;\n          const mainAnchor = this.mainAnchor;\n          if (this.initPTS[frag.cc] !== void 0) {\n            this.waitingData = null;\n            this.state = State.FRAG_LOADING;\n            const payload = cache.flush().buffer;\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 (mainAnchor && mainAnchor.cc !== waitingData.frag.cc) {\n            this.syncWithAnchor(mainAnchor, waitingData.frag);\n          }\n        } else {\n          this.state = State.IDLE;\n        }\n      }\n    }\n    this.onTickEnd();\n  }\n  resetLoadingState() {\n    const waitingData = this.waitingData;\n    if (waitingData) {\n      this.fragmentTracker.removeFragment(waitingData.frag);\n      this.waitingData = null;\n    }\n    super.resetLoadingState();\n  }\n  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    var _this$mainFragLoading2;\n    const {\n      hls,\n      levels,\n      media,\n      trackId\n    } = this;\n    const config = hls.config;\n    if (!this.buffering || !media && !this.primaryPrefetch && (this.startFragRequested || !config.startFragPrefetch) || !(levels != null && levels[trackId])) {\n      return;\n    }\n    const levelInfo = levels[trackId];\n    const trackDetails = levelInfo.details;\n    if (!trackDetails || this.waitForLive(levelInfo) || this.waitForCdnTuneIn(trackDetails)) {\n      this.state = State.WAITING_TRACK;\n      this.startFragRequested = false;\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    if (!this.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 bufferLen = bufferInfo.len;\n    const maxBufLen = hls.maxBufferLength;\n    const fragments = trackDetails.fragments;\n    const start = fragments[0].start;\n    const loadPosition = this.getLoadPosition();\n    const targetBufferTime = this.flushing ? loadPosition : bufferInfo.end;\n    if (this.switchingTrack && media) {\n      const pos = loadPosition;\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 && !this.switchingTrack && targetBufferTime < fragments[fragments.length - 1].start) {\n      return;\n    }\n    let frag = this.getNextFragment(targetBufferTime, trackDetails);\n    if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n      frag = this.getNextFragmentLoopLoading(frag, trackDetails, bufferInfo, PlaylistLevelType.MAIN, maxBufLen);\n    }\n    if (!frag) {\n      this.bufferFlushed = true;\n      return;\n    }\n    let mainFragLoading = ((_this$mainFragLoading2 = this.mainFragLoading) == null ? void 0 : _this$mainFragLoading2.frag) || null;\n    if (!this.audioOnly && this.startFragRequested && mainFragLoading && isMediaFragment(frag) && !frag.endList && (!trackDetails.live || !this.loadingParts && targetBufferTime < this.hls.liveSyncPosition)) {\n      if (this.fragmentTracker.getState(mainFragLoading) === FragmentState.OK) {\n        this.mainFragLoading = mainFragLoading = null;\n      }\n      if (mainFragLoading && isMediaFragment(mainFragLoading)) {\n        if (frag.start > mainFragLoading.end) {\n          const mainFragAtPos = this.fragmentTracker.getFragAtPos(targetBufferTime, PlaylistLevelType.MAIN);\n          if (mainFragAtPos && mainFragAtPos.end > mainFragLoading.end) {\n            mainFragLoading = mainFragAtPos;\n            this.mainFragLoading = {\n              frag: mainFragAtPos,\n              targetBufferTime: null\n            };\n          }\n        }\n        const atBufferSyncLimit = frag.start > mainFragLoading.end;\n        if (atBufferSyncLimit) {\n          return;\n        }\n      }\n    }\n    this.loadFragment(frag, levelInfo, targetBufferTime);\n  }\n  onMediaDetaching(event, data) {\n    this.bufferFlushed = this.flushing = false;\n    super.onMediaDetaching(event, data);\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.switchingTrack = data;\n      this.flushAudioIfNeeded(data);\n      if (this.state !== State.STOPPED) {\n        this.setInterval(TICK_INTERVAL$3);\n        this.state = State.IDLE;\n        this.tick();\n      }\n    } else {\n      this.resetTransmuxer();\n      this.switchingTrack = null;\n      this.bufferedTrack = data;\n      this.clearInterval();\n    }\n  }\n  onManifestLoading() {\n    super.onManifestLoading();\n    this.bufferFlushed = this.flushing = this.audioOnly = false;\n    this.resetItem();\n    this.trackId = -1;\n  }\n  onLevelLoaded(event, data) {\n    this.mainDetails = data.details;\n    const cachedTrackLoadedData = this.cachedTrackLoadedData;\n    if (cachedTrackLoadedData) {\n      this.cachedTrackLoadedData = null;\n      this.onAudioTrackLoaded(Events.AUDIO_TRACK_LOADED, cachedTrackLoadedData);\n    }\n  }\n  onAudioTrackLoaded(event, data) {\n    var _trackLevel$details;\n    const {\n      levels\n    } = this;\n    const {\n      details: newDetails,\n      id: trackId,\n      groupId,\n      track\n    } = data;\n    if (!levels) {\n      this.warn(`Audio tracks reset while loading track ${trackId} \"${track.name}\" of \"${groupId}\"`);\n      return;\n    }\n    const mainDetails = this.mainDetails;\n    if (!mainDetails || newDetails.endCC > mainDetails.endCC || mainDetails.expired) {\n      this.cachedTrackLoadedData = data;\n      if (this.state !== State.STOPPED) {\n        this.state = State.WAITING_TRACK;\n      }\n      return;\n    }\n    this.cachedTrackLoadedData = null;\n    this.log(`Audio track ${trackId} \"${track.name}\" of \"${groupId}\" loaded [${newDetails.startSN},${newDetails.endSN}]${newDetails.lastPartSn ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]` : \"\"},duration:${newDetails.totalduration}`);\n    const trackLevel = levels[trackId];\n    let sliding = 0;\n    if (newDetails.live || (_trackLevel$details = trackLevel.details) != null && _trackLevel$details.live) {\n      this.checkLiveUpdate(newDetails);\n      if (newDetails.deltaUpdateFailed) {\n        return;\n      }\n      if (trackLevel.details) {\n        var _this$levelLastLoaded;\n        sliding = this.alignPlaylists(newDetails, trackLevel.details, (_this$levelLastLoaded = this.levelLastLoaded) == null ? void 0 : _this$levelLastLoaded.details);\n      }\n      if (!newDetails.alignedSliding) {\n        alignDiscontinuities(newDetails, mainDetails);\n        if (!newDetails.alignedSliding) {\n          alignMediaPlaylistByPDT(newDetails, mainDetails);\n        }\n        sliding = newDetails.fragmentStart;\n      }\n    }\n    trackLevel.details = newDetails;\n    this.levelLastLoaded = trackLevel;\n    if (!this.startFragRequested) {\n      this.setStartPosition(mainDetails, sliding);\n    }\n    this.hls.trigger(Events.AUDIO_TRACK_UPDATED, {\n      details: newDetails,\n      id: trackId,\n      groupId: data.groupId\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 frag = data.frag;\n    const {\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      if (this.state !== State.STOPPED) {\n        this.state = State.WAITING_INIT_PTS;\n      }\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 = null;\n  }\n  onBufferCreated(event, data) {\n    this.bufferFlushed = this.flushing = false;\n    const audioTrack = data.tracks.audio;\n    if (audioTrack) {\n      this.mediaBuffer = audioTrack.buffer || null;\n    }\n  }\n  onFragLoading(event, data) {\n    if (!this.audioOnly && data.frag.type === PlaylistLevelType.MAIN && isMediaFragment(data.frag)) {\n      this.mainFragLoading = data;\n      if (this.state === State.IDLE) {\n        this.tick();\n      }\n    }\n  }\n  onFragBuffered(event, data) {\n    const {\n      frag,\n      part\n    } = data;\n    if (frag.type !== PlaylistLevelType.AUDIO) {\n      if (!this.audioOnly && frag.type === PlaylistLevelType.MAIN && !frag.elementaryStreams.video && !frag.elementaryStreams.audiovideo) {\n        this.audioOnly = true;\n        this.mainFragLoading = null;\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 (isMediaFragment(frag)) {\n      this.fragPrevious = frag;\n      const track = this.switchingTrack;\n      if (track) {\n        this.bufferedTrack = track;\n        this.switchingTrack = null;\n        this.hls.trigger(Events.AUDIO_TRACK_SWITCHED, _objectSpread2({}, track));\n      }\n    }\n    this.fragBufferedComplete(frag, part);\n    if (this.media) {\n      this.tick();\n    }\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_ADD_CODEC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        if (data.parent !== \"audio\") {\n          return;\n        }\n        if (!this.reduceLengthAndFlushBuffer(data)) {\n          this.resetLoadingState();\n        }\n        break;\n      case ErrorDetails.BUFFER_FULL_ERROR:\n        if (data.parent !== \"audio\") {\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          this.bufferedTrack = null;\n          super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\");\n        }\n        break;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(data);\n        break;\n    }\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      if (this.unhandledEncryptionError(initSegment, frag)) {\n        return;\n      }\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    if (tracks.audiovideo) {\n      delete tracks.audiovideo;\n    }\n    if (!tracks.audio) {\n      return;\n    }\n    const track = tracks.audio;\n    track.id = PlaylistLevelType.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    if (this.switchingTrack || fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {\n      var _track$details;\n      if (!isMediaFragment(frag)) {\n        this._loadInitSegment(frag, track);\n      } else if ((_track$details = track.details) != null && _track$details.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.fragmentStart !== track.details.fragmentStart) {\n          alignMediaPlaylistByPDT(track.details, mainDetails);\n        }\n      } else {\n        super.loadFragment(frag, track, targetBufferTime);\n      }\n    } else {\n      this.clearTrackerIfNeeded(frag);\n    }\n  }\n  flushAudioIfNeeded(switchingTrack) {\n    if (this.media && this.bufferedTrack) {\n      const {\n        name,\n        lang,\n        assocLang,\n        characteristics,\n        audioCodec,\n        channels\n      } = this.bufferedTrack;\n      if (!matchesOption({\n        name,\n        lang,\n        assocLang,\n        characteristics,\n        audioCodec,\n        channels\n      }, switchingTrack, audioMatchPredicate)) {\n        if (useAlternateAudio(switchingTrack.url, this.hls)) {\n          this.log(\"Switching audio track : flushing all audio\");\n          super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\");\n          this.bufferedTrack = null;\n        } else {\n          this.bufferedTrack = switchingTrack;\n        }\n      }\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 BasePlaylistController extends Logger {\n  constructor(hls, logPrefix) {\n    super(logPrefix, hls.logger);\n    this.hls = void 0;\n    this.canLoad = false;\n    this.timer = -1;\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.loadPlaylist();\n  }\n  stopLoad() {\n    this.canLoad = false;\n    this.clearTimer();\n  }\n  switchParams(playlistUri, previous, current) {\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          this.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.lastPartSn;\n        let part = parseInt(attr[\"LAST-PART\"]) || 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        const skip = current && getSkipValue(current);\n        return new HlsUrlParameters(msn, part >= 0 ? part : void 0, skip);\n      }\n    }\n  }\n  loadPlaylist(hlsUrlParameters) {\n    this.clearTimer();\n  }\n  loadingPlaylist(playlist, hlsUrlParameters) {\n    this.clearTimer();\n  }\n  shouldLoadPlaylist(playlist) {\n    return this.canLoad && !!playlist && !!playlist.url && (!playlist.details || playlist.details.live);\n  }\n  getUrlWithDirectives(uri, hlsUrlParameters) {\n    if (hlsUrlParameters) {\n      try {\n        return hlsUrlParameters.addDirectives(uri);\n      } catch (error) {\n        this.warn(`Could not construct new URL with HLS Delivery Directives: ${error}`);\n      }\n    }\n    return uri;\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    const timelineOffset = this.hls.config.timelineOffset;\n    if (timelineOffset !== details.appliedTimelineOffset) {\n      const offset = Math.max(timelineOffset || 0, 0);\n      details.appliedTimelineOffset = offset;\n      details.fragments.forEach((frag) => {\n        frag.setStart(frag.playlistOffset + offset);\n      });\n    }\n    if (details.live || previousDetails != null && previousDetails.live) {\n      const levelOrTrack = \"levelInfo\" in data ? data.levelInfo : data.track;\n      details.reloaded(previousDetails);\n      if (previousDetails && details.fragments.length > 0) {\n        mergeDetails(previousDetails, details, this);\n        const error = details.playlistParsingError;\n        if (error) {\n          this.warn(error);\n          const hls = this.hls;\n          if (!hls.config.ignorePlaylistParsingErrors) {\n            var _details$fragments$;\n            const {\n              networkDetails\n            } = data;\n            hls.trigger(Events.ERROR, {\n              type: ErrorTypes.NETWORK_ERROR,\n              details: ErrorDetails.LEVEL_PARSING_ERROR,\n              fatal: false,\n              url: details.url,\n              error,\n              reason: error.message,\n              level: data.level || void 0,\n              parent: (_details$fragments$ = details.fragments[0]) == null ? void 0 : _details$fragments$.type,\n              networkDetails,\n              stats\n            });\n            return;\n          }\n          details.playlistParsingError = null;\n        }\n      }\n      if (details.requestScheduled === -1) {\n        details.requestScheduled = stats.loading.start;\n      }\n      const bufferInfo = this.hls.mainForwardBufferInfo;\n      const position = bufferInfo ? bufferInfo.end - bufferInfo.len : 0;\n      const distanceToLiveEdgeMs = (details.edge - position) * 1e3;\n      const reloadInterval = computeReloadInterval(details, distanceToLiveEdgeMs);\n      if (details.requestScheduled + reloadInterval < now2) {\n        details.requestScheduled = now2;\n      } else {\n        details.requestScheduled += reloadInterval;\n      }\n      this.log(`live playlist ${index} ${details.advanced ? \"REFRESHED \" + details.lastPartSn + \"-\" + details.lastPartIndex : details.updated ? \"UPDATED\" : \"MISSED\"}`);\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 atLastPartOfSegment = lastPartSn === endSn;\n        if (hasParts) {\n          if (atLastPartOfSegment) {\n            msn = endSn + 1;\n            part = lowLatencyMode ? 0 : lastPartIndex;\n          } else {\n            msn = lastPartSn;\n            part = lowLatencyMode ? lastPartIndex + 1 : details.maxPartIndex;\n          }\n        } else {\n          msn = endSn + 1;\n        }\n        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 (cdnAge > details.targetduration * 3) {\n            this.log(`Playlist last advanced ${lastAdvanced.toFixed(2)}s ago. Omitting segment and part directives.`);\n            msn = void 0;\n            part = void 0;\n          } else if (previousDetails != null && previousDetails.tuneInGoal && cdnAge - details.partTarget > 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 || !atLastPartOfSegment) {\n          details.requestScheduled = now2;\n          this.loadingPlaylist(levelOrTrack, deliveryDirectives);\n          return;\n        }\n      } else if (details.canBlockReload || details.canSkipUntil) {\n        deliveryDirectives = this.getDeliveryDirectives(details, data.deliveryDirectives, msn, part);\n      }\n      if (deliveryDirectives && msn !== void 0 && details.canBlockReload) {\n        details.requestScheduled = stats.loading.first + Math.max(reloadInterval - elapsed * 2, reloadInterval / 2);\n      }\n      this.scheduleLoading(levelOrTrack, deliveryDirectives, details);\n    } else {\n      this.clearTimer();\n    }\n  }\n  scheduleLoading(levelOrTrack, deliveryDirectives, updatedDetails) {\n    const details = updatedDetails || levelOrTrack.details;\n    if (!details) {\n      this.loadingPlaylist(levelOrTrack, deliveryDirectives);\n      return;\n    }\n    const now2 = self.performance.now();\n    const requestScheduled = details.requestScheduled;\n    if (now2 >= requestScheduled) {\n      this.loadingPlaylist(levelOrTrack, deliveryDirectives);\n      return;\n    }\n    const estimatedTimeUntilUpdate = requestScheduled - now2;\n    this.log(`reload live playlist ${levelOrTrack.name || levelOrTrack.bitrate + \"bps\"} in ${Math.round(estimatedTimeUntilUpdate)} ms`);\n    this.clearTimer();\n    this.timer = self.setTimeout(() => this.loadingPlaylist(levelOrTrack, deliveryDirectives), estimatedTimeUntilUpdate);\n  }\n  getDeliveryDirectives(details, previousDeliveryDirectives, msn, part) {\n    let skip = getSkipValue(details);\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      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.clearTimer();\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}\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}\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    }\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.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.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, track.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    super.loadPlaylist();\n    const audioTrack = this.currentTrack;\n    if (!this.shouldLoadPlaylist(audioTrack)) {\n      return;\n    }\n    if (useAlternateAudio(audioTrack.url, this.hls)) {\n      this.scheduleLoading(audioTrack, hlsUrlParameters);\n    }\n  }\n  loadingPlaylist(audioTrack, hlsUrlParameters) {\n    super.loadingPlaylist(audioTrack, hlsUrlParameters);\n    const id = audioTrack.id;\n    const groupId = audioTrack.groupId;\n    const url = this.getUrlWithDirectives(audioTrack.url, hlsUrlParameters);\n    const details = audioTrack.details;\n    const age = details == null ? void 0 : details.age;\n    this.log(`Loading audio-track ${id} \"${audioTrack.name}\" lang:${audioTrack.lang} group:${groupId}${(hlsUrlParameters == null ? void 0 : hlsUrlParameters.msn) !== void 0 ? \" at sn \" + hlsUrlParameters.msn + \" part \" + hlsUrlParameters.part : \"\"}${age && details.live ? \" age \" + age.toFixed(1) + (details.type ? \" \" + details.type || \"\" : \"\") : \"\"} ${url}`);\n    this.hls.trigger(Events.AUDIO_TRACK_LOADING, {\n      url,\n      id,\n      groupId,\n      deliveryDirectives: hlsUrlParameters || null,\n      track: audioTrack\n    });\n  }\n}\nclass BufferOperationQueue {\n  constructor(sourceBufferReference) {\n    this.tracks = void 0;\n    this.queues = {\n      video: [],\n      audio: [],\n      audiovideo: []\n    };\n    this.tracks = sourceBufferReference;\n  }\n  destroy() {\n    this.tracks = this.queues = null;\n  }\n  append(operation, type, pending) {\n    if (this.queues === null || this.tracks === null) {\n      return;\n    }\n    const queue = this.queues[type];\n    queue.push(operation);\n    if (queue.length === 1 && !pending) {\n      this.executeNext(type);\n    }\n  }\n  appendBlocker(type) {\n    return new Promise((resolve) => {\n      const operation = {\n        label: \"async-blocker\",\n        execute: resolve,\n        onStart: () => {\n        },\n        onComplete: () => {\n        },\n        onError: () => {\n        }\n      };\n      this.append(operation, type);\n    });\n  }\n  prependBlocker(type) {\n    return new Promise((resolve) => {\n      if (this.queues) {\n        const operation = {\n          label: \"async-blocker-prepend\",\n          execute: resolve,\n          onStart: () => {\n          },\n          onComplete: () => {\n          },\n          onError: () => {\n          }\n        };\n        this.queues[type].unshift(operation);\n      }\n    });\n  }\n  removeBlockers() {\n    if (this.queues === null) {\n      return;\n    }\n    [this.queues.video, this.queues.audio, this.queues.audiovideo].forEach((queue) => {\n      var _queue$;\n      const label = (_queue$ = queue[0]) == null ? void 0 : _queue$.label;\n      if (label === \"async-blocker\" || label === \"async-blocker-prepend\") {\n        queue[0].execute();\n        queue.splice(0, 1);\n      }\n    });\n  }\n  unblockAudio(op) {\n    if (this.queues === null) {\n      return;\n    }\n    const queue = this.queues.audio;\n    if (queue[0] === op) {\n      this.shiftAndExecuteNext(\"audio\");\n    }\n  }\n  executeNext(type) {\n    if (this.queues === null || this.tracks === null) {\n      return;\n    }\n    const queue = this.queues[type];\n    if (queue.length) {\n      const operation = queue[0];\n      try {\n        operation.execute();\n      } catch (error) {\n        var _this$tracks$type;\n        operation.onError(error);\n        if (this.queues === null || this.tracks === null) {\n          return;\n        }\n        const sb = (_this$tracks$type = this.tracks[type]) == null ? void 0 : _this$tracks$type.buffer;\n        if (!(sb != null && sb.updating)) {\n          this.shiftAndExecuteNext(type);\n        }\n      }\n    }\n  }\n  shiftAndExecuteNext(type) {\n    if (this.queues === null) {\n      return;\n    }\n    this.queues[type].shift();\n    this.executeNext(type);\n  }\n  current(type) {\n    var _this$queues;\n    return ((_this$queues = this.queues) == null ? void 0 : _this$queues[type][0]) || null;\n  }\n  toString() {\n    const {\n      queues,\n      tracks\n    } = this;\n    if (queues === null || tracks === null) {\n      return `<destroyed>`;\n    }\n    return `\n${this.list(\"video\")}\n${this.list(\"audio\")}\n${this.list(\"audiovideo\")}}`;\n  }\n  list(type) {\n    var _this$queues2, _this$tracks;\n    return (_this$queues2 = this.queues) != null && _this$queues2[type] || (_this$tracks = this.tracks) != null && _this$tracks[type] ? `${type}: (${this.listSbInfo(type)}) ${this.listOps(type)}` : \"\";\n  }\n  listSbInfo(type) {\n    var _this$tracks2;\n    const track = (_this$tracks2 = this.tracks) == null ? void 0 : _this$tracks2[type];\n    const sb = track == null ? void 0 : track.buffer;\n    if (!sb) {\n      return \"none\";\n    }\n    return `SourceBuffer${sb.updating ? \" updating\" : \"\"}${track.ended ? \" ended\" : \"\"}${track.ending ? \" ending\" : \"\"}`;\n  }\n  listOps(type) {\n    var _this$queues3;\n    return ((_this$queues3 = this.queues) == null ? void 0 : _this$queues3[type].map((op) => op.label).join(\", \")) || \"\";\n  }\n}\nconst VIDEO_CODEC_PROFILE_REPLACE = /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\\.[^.,]+)+/;\nconst TRACK_REMOVED_ERROR_NAME = \"HlsJsTrackRemovedError\";\nclass HlsJsTrackRemovedError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = TRACK_REMOVED_ERROR_NAME;\n  }\n}\nclass BufferController extends Logger {\n  constructor(hls, fragmentTracker) {\n    super(\"buffer-controller\", hls.logger);\n    this.hls = void 0;\n    this.fragmentTracker = void 0;\n    this.details = null;\n    this._objectUrl = null;\n    this.operationQueue = null;\n    this.bufferCodecEventsTotal = 0;\n    this.media = null;\n    this.mediaSource = null;\n    this.lastMpegAudioChunk = null;\n    this.blockedAudioAppend = null;\n    this.lastVideoAppendEnd = 0;\n    this.appendSource = void 0;\n    this.transferData = void 0;\n    this.overrides = void 0;\n    this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0\n    };\n    this.tracks = {};\n    this.sourceBuffers = [[null, null], [null, null]];\n    this._onEndStreaming = (event) => {\n      var _this$mediaSource;\n      if (!this.hls) {\n        return;\n      }\n      if (((_this$mediaSource = this.mediaSource) == null ? void 0 : _this$mediaSource.readyState) !== \"open\") {\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 = (e) => {\n      const {\n        media,\n        mediaSource\n      } = this;\n      if (e) {\n        this.log(\"Media source opened\");\n      }\n      if (!media || !mediaSource) {\n        return;\n      }\n      mediaSource.removeEventListener(\"sourceopen\", this._onMediaSourceOpen);\n      media.removeEventListener(\"emptied\", this._onMediaEmptied);\n      this.updateDuration();\n      this.hls.trigger(Events.MEDIA_ATTACHED, {\n        media,\n        mediaSource\n      });\n      if (this.mediaSource !== null) {\n        this.checkPendingTracks();\n      }\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        this.error(`Media element src was set while attaching MediaSource (${_objectUrl} > ${mediaSrc})`);\n      }\n    };\n    this.hls = hls;\n    this.fragmentTracker = fragmentTracker;\n    this.appendSource = isManagedMediaSource(getMediaSource(hls.config.preferManagedMediaSource));\n    this.initTracks();\n    this.registerListeners();\n  }\n  hasSourceTypes() {\n    return Object.keys(this.tracks).length > 0;\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.details = null;\n    this.lastMpegAudioChunk = this.blockedAudioAppend = null;\n    this.transferData = this.overrides = void 0;\n    if (this.operationQueue) {\n      this.operationQueue.destroy();\n      this.operationQueue = null;\n    }\n    this.hls = this.fragmentTracker = null;\n    this._onMediaSourceOpen = this._onMediaSourceClose = null;\n    this._onMediaSourceEnded = null;\n    this._onStartStreaming = this._onEndStreaming = 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    hls.on(Events.ERROR, this.onError, 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    hls.off(Events.ERROR, this.onError, this);\n  }\n  transferMedia() {\n    const {\n      media,\n      mediaSource\n    } = this;\n    if (!media) {\n      return null;\n    }\n    const tracks = {};\n    if (this.operationQueue) {\n      const updating = this.isUpdating();\n      if (!updating) {\n        this.operationQueue.removeBlockers();\n      }\n      const queued = this.isQueued();\n      if (updating || queued) {\n        this.warn(`Transfering MediaSource with${queued ? \" operations in queue\" : \"\"}${updating ? \" updating SourceBuffer(s)\" : \"\"} ${this.operationQueue}`);\n      }\n      this.operationQueue.destroy();\n    }\n    const transferData = this.transferData;\n    if (!this.sourceBufferCount && transferData && transferData.mediaSource === mediaSource) {\n      _extends(tracks, transferData.tracks);\n    } else {\n      this.sourceBuffers.forEach((tuple) => {\n        const [type] = tuple;\n        if (type) {\n          tracks[type] = _extends({}, this.tracks[type]);\n          this.removeBuffer(type);\n        }\n        tuple[0] = tuple[1] = null;\n      });\n    }\n    return {\n      media,\n      mediaSource,\n      tracks\n    };\n  }\n  initTracks() {\n    const tracks = {};\n    this.sourceBuffers = [[null, null], [null, null]];\n    this.tracks = tracks;\n    this.resetQueue();\n    this.resetAppendErrors();\n    this.lastMpegAudioChunk = this.blockedAudioAppend = null;\n    this.lastVideoAppendEnd = 0;\n  }\n  onManifestLoading() {\n    this.bufferCodecEventsTotal = 0;\n    this.details = null;\n  }\n  onManifestParsed(event, data) {\n    var _this$transferData;\n    let codecEvents = 2;\n    if (data.audio && !data.video || !data.altAudio) {\n      codecEvents = 1;\n    }\n    this.bufferCodecEventsTotal = codecEvents;\n    this.log(`${codecEvents} bufferCodec event(s) expected.`);\n    if ((_this$transferData = this.transferData) != null && _this$transferData.mediaSource && this.sourceBufferCount && codecEvents) {\n      this.bufferCreated();\n    }\n  }\n  onMediaAttaching(event, data) {\n    const media = this.media = data.media;\n    this.transferData = this.overrides = void 0;\n    const MediaSource = getMediaSource(this.appendSource);\n    if (MediaSource) {\n      const transferringMedia = !!data.mediaSource;\n      if (transferringMedia || data.overrides) {\n        this.transferData = data;\n        this.overrides = data.overrides;\n      }\n      const ms = this.mediaSource = data.mediaSource || new MediaSource();\n      this.assignMediaSource(ms);\n      if (transferringMedia) {\n        this._objectUrl = media.src;\n        this.attachTransferred();\n      } else {\n        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      }\n      media.addEventListener(\"emptied\", this._onMediaEmptied);\n    }\n  }\n  assignMediaSource(ms) {\n    var _this$transferData2, _ms$constructor;\n    this.log(`${((_this$transferData2 = this.transferData) == null ? void 0 : _this$transferData2.mediaSource) === ms ? \"transferred\" : \"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  }\n  attachTransferred() {\n    const media = this.media;\n    const data = this.transferData;\n    if (!data || !media) {\n      return;\n    }\n    const requiredTracks = this.tracks;\n    const transferredTracks = data.tracks;\n    const trackNames = transferredTracks ? Object.keys(transferredTracks) : null;\n    const trackCount = trackNames ? trackNames.length : 0;\n    const mediaSourceOpenCallback = () => {\n      Promise.resolve().then(() => {\n        if (this.media && this.mediaSourceOpenOrEnded) {\n          this._onMediaSourceOpen();\n        }\n      });\n    };\n    if (transferredTracks && trackNames && trackCount) {\n      if (!this.tracksReady) {\n        this.hls.config.startFragPrefetch = true;\n        this.log(`attachTransferred: waiting for SourceBuffer track info`);\n        return;\n      }\n      this.log(`attachTransferred: (bufferCodecEventsTotal ${this.bufferCodecEventsTotal})\nrequired tracks: ${stringify(requiredTracks, (key, value) => key === \"initSegment\" ? void 0 : value)};\ntransfer tracks: ${stringify(transferredTracks, (key, value) => key === \"initSegment\" ? void 0 : value)}}`);\n      if (!isCompatibleTrackChange(transferredTracks, requiredTracks)) {\n        data.mediaSource = null;\n        data.tracks = void 0;\n        const currentTime = media.currentTime;\n        const details = this.details;\n        const startTime = Math.max(currentTime, (details == null ? void 0 : details.fragments[0].start) || 0);\n        if (startTime - currentTime > 1) {\n          this.log(`attachTransferred: waiting for playback to reach new tracks start time ${currentTime} -> ${startTime}`);\n          return;\n        }\n        this.warn(`attachTransferred: resetting MediaSource for incompatible tracks (\"${Object.keys(transferredTracks)}\"->\"${Object.keys(requiredTracks)}\") start time: ${startTime} currentTime: ${currentTime}`);\n        this.onMediaDetaching(Events.MEDIA_DETACHING, {});\n        this.onMediaAttaching(Events.MEDIA_ATTACHING, data);\n        media.currentTime = startTime;\n        return;\n      }\n      this.transferData = void 0;\n      trackNames.forEach((trackName) => {\n        const type = trackName;\n        const track = transferredTracks[type];\n        if (track) {\n          const sb = track.buffer;\n          if (sb) {\n            const fragmentTracker = this.fragmentTracker;\n            const playlistType = track.id;\n            if (fragmentTracker.hasFragments(playlistType) || fragmentTracker.hasParts(playlistType)) {\n              const bufferedTimeRanges = BufferHelper.getBuffered(sb);\n              fragmentTracker.detectEvictedFragments(type, bufferedTimeRanges, playlistType, null, true);\n            }\n            const sbIndex = sourceBufferNameToIndex(type);\n            const sbTuple = [type, sb];\n            this.sourceBuffers[sbIndex] = sbTuple;\n            if (sb.updating && this.operationQueue) {\n              this.operationQueue.prependBlocker(type);\n            }\n            this.trackSourceBuffer(type, track);\n          }\n        }\n      });\n      mediaSourceOpenCallback();\n      this.bufferCreated();\n    } else {\n      this.log(`attachTransferred: MediaSource w/o SourceBuffers`);\n      mediaSourceOpenCallback();\n    }\n  }\n  get mediaSourceOpenOrEnded() {\n    var _this$mediaSource2;\n    const readyState = (_this$mediaSource2 = this.mediaSource) == null ? void 0 : _this$mediaSource2.readyState;\n    return readyState === \"open\" || readyState === \"ended\";\n  }\n  onMediaDetaching(event, data) {\n    const transferringMedia = !!data.transferMedia;\n    this.transferData = this.overrides = void 0;\n    const {\n      media,\n      mediaSource,\n      _objectUrl\n    } = this;\n    if (mediaSource) {\n      this.log(`media source ${transferringMedia ? \"transferring\" : \"detaching\"}`);\n      if (transferringMedia) {\n        this.sourceBuffers.forEach(([type]) => {\n          if (type) {\n            this.removeBuffer(type);\n          }\n        });\n        this.resetQueue();\n      } else {\n        if (this.mediaSourceOpenOrEnded) {\n          const open = mediaSource.readyState === \"open\";\n          try {\n            const sourceBuffers = mediaSource.sourceBuffers;\n            for (let i = sourceBuffers.length; i--; ) {\n              if (open) {\n                sourceBuffers[i].abort();\n              }\n              mediaSource.removeSourceBuffer(sourceBuffers[i]);\n            }\n            if (open) {\n              mediaSource.endOfStream();\n            }\n          } catch (err) {\n            this.warn(`onMediaDetaching: ${err.message} while calling endOfStream`);\n          }\n        }\n        if (this.sourceBufferCount) {\n          this.onBufferReset();\n        }\n      }\n      mediaSource.removeEventListener(\"sourceopen\", this._onMediaSourceOpen);\n      mediaSource.removeEventListener(\"sourceended\", this._onMediaSourceEnded);\n      mediaSource.removeEventListener(\"sourceclose\", this._onMediaSourceClose);\n      if (this.appendSource) {\n        mediaSource.removeEventListener(\"startstreaming\", this._onStartStreaming);\n        mediaSource.removeEventListener(\"endstreaming\", this._onEndStreaming);\n      }\n      this.mediaSource = null;\n      this._objectUrl = null;\n    }\n    if (media) {\n      media.removeEventListener(\"emptied\", this._onMediaEmptied);\n      if (!transferringMedia) {\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.media = null;\n    }\n    this.hls.trigger(Events.MEDIA_DETACHED, data);\n  }\n  onBufferReset() {\n    this.sourceBuffers.forEach(([type]) => {\n      if (type) {\n        this.resetBuffer(type);\n      }\n    });\n    this.initTracks();\n  }\n  resetBuffer(type) {\n    var _this$tracks$type;\n    const sb = (_this$tracks$type = this.tracks[type]) == null ? void 0 : _this$tracks$type.buffer;\n    this.removeBuffer(type);\n    if (sb) {\n      try {\n        var _this$mediaSource3;\n        if ((_this$mediaSource3 = this.mediaSource) != null && _this$mediaSource3.sourceBuffers.length) {\n          this.mediaSource.removeSourceBuffer(sb);\n        }\n      } catch (err) {\n        this.warn(`onBufferReset ${type}`, err);\n      }\n    }\n    delete this.tracks[type];\n  }\n  removeBuffer(type) {\n    this.removeBufferListeners(type);\n    this.sourceBuffers[sourceBufferNameToIndex(type)] = [null, null];\n    const track = this.tracks[type];\n    if (track) {\n      track.buffer = void 0;\n    }\n  }\n  resetQueue() {\n    if (this.operationQueue) {\n      this.operationQueue.destroy();\n    }\n    this.operationQueue = new BufferOperationQueue(this.tracks);\n  }\n  onBufferCodecs(event, data) {\n    var _data$audio;\n    const tracks = this.tracks;\n    const trackNames = Object.keys(data);\n    this.log(`BUFFER_CODECS: \"${trackNames}\" (current SB count ${this.sourceBufferCount})`);\n    const unmuxedToMuxed = \"audiovideo\" in data && (tracks.audio || tracks.video) || tracks.audiovideo && (\"audio\" in data || \"video\" in data);\n    const muxedToUnmuxed = !unmuxedToMuxed && this.sourceBufferCount && this.media && trackNames.some((sbName) => !tracks[sbName]);\n    if (unmuxedToMuxed || muxedToUnmuxed) {\n      this.warn(`Unsupported transition between \"${Object.keys(tracks)}\" and \"${trackNames}\" SourceBuffers`);\n      return;\n    }\n    trackNames.forEach((trackName) => {\n      var _this$transferData3, _trackCodec;\n      const parsedTrack = data[trackName];\n      const {\n        id,\n        codec,\n        levelCodec,\n        container,\n        metadata,\n        supplemental\n      } = parsedTrack;\n      let track = tracks[trackName];\n      const transferredTrack = (_this$transferData3 = this.transferData) == null || (_this$transferData3 = _this$transferData3.tracks) == null ? void 0 : _this$transferData3[trackName];\n      const sbTrack = transferredTrack != null && transferredTrack.buffer ? transferredTrack : track;\n      const sbCodec = (sbTrack == null ? void 0 : sbTrack.pendingCodec) || (sbTrack == null ? void 0 : sbTrack.codec);\n      const trackLevelCodec = sbTrack == null ? void 0 : sbTrack.levelCodec;\n      if (!track) {\n        track = tracks[trackName] = {\n          buffer: void 0,\n          listeners: [],\n          codec,\n          supplemental,\n          container,\n          levelCodec,\n          metadata,\n          id\n        };\n      }\n      const currentCodecFull = pickMostCompleteCodecName(sbCodec, trackLevelCodec);\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 && currentCodecFull && currentCodec !== nextCodec) {\n        if (trackName.slice(0, 5) === \"audio\") {\n          trackCodec = getCodecCompatibleName(trackCodec, this.appendSource);\n        }\n        this.log(`switching codec ${sbCodec} to ${trackCodec}`);\n        if (trackCodec !== (track.pendingCodec || track.codec)) {\n          track.pendingCodec = trackCodec;\n        }\n        track.container = container;\n        this.appendChangeType(trackName, container, trackCodec);\n      }\n    });\n    if (this.tracksReady || this.sourceBufferCount) {\n      data.tracks = this.sourceBufferTracks;\n    }\n    if (this.sourceBufferCount) {\n      return;\n    }\n    if (this.bufferCodecEventsTotal > 1 && !this.tracks.video && !data.video && ((_data$audio = data.audio) == null ? void 0 : _data$audio.id) === \"main\") {\n      this.log(`Main audio-only`);\n      this.bufferCodecEventsTotal = 1;\n    }\n    if (this.mediaSourceOpenOrEnded) {\n      this.checkPendingTracks();\n    }\n  }\n  get sourceBufferTracks() {\n    return Object.keys(this.tracks).reduce((baseTracks, type) => {\n      const track = this.tracks[type];\n      baseTracks[type] = {\n        id: track.id,\n        container: track.container,\n        codec: track.codec,\n        levelCodec: track.levelCodec\n      };\n      return baseTracks;\n    }, {});\n  }\n  appendChangeType(type, container, codec) {\n    const mimeType = `${container};codecs=${codec}`;\n    const operation = {\n      label: `change-type=${mimeType}`,\n      execute: () => {\n        const track = this.tracks[type];\n        if (track) {\n          const sb = track.buffer;\n          if (sb != null && sb.changeType) {\n            this.log(`changing ${type} sourceBuffer type to ${mimeType}`);\n            sb.changeType(mimeType);\n            track.codec = codec;\n            track.container = container;\n          }\n        }\n        this.shiftAndExecuteNext(type);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n      },\n      onError: (error) => {\n        this.warn(`Failed to change ${type} SourceBuffer type`, error);\n      }\n    };\n    this.append(operation, type, this.isPending(this.tracks[type]));\n  }\n  blockAudio(partOrFrag) {\n    var _this$fragmentTracker;\n    const pStart = partOrFrag.start;\n    const pTime = pStart + partOrFrag.duration * 0.05;\n    const atGap = ((_this$fragmentTracker = this.fragmentTracker.getAppendedFrag(pStart, PlaylistLevelType.MAIN)) == null ? void 0 : _this$fragmentTracker.gap) === true;\n    if (atGap) {\n      return;\n    }\n    const op = {\n      label: \"block-audio\",\n      execute: () => {\n        var _this$fragmentTracker2;\n        const videoTrack = this.tracks.video;\n        if (this.lastVideoAppendEnd > pTime || videoTrack != null && videoTrack.buffer && BufferHelper.isBuffered(videoTrack.buffer, pTime) || ((_this$fragmentTracker2 = this.fragmentTracker.getAppendedFrag(pTime, PlaylistLevelType.MAIN)) == null ? void 0 : _this$fragmentTracker2.gap) === true) {\n          this.blockedAudioAppend = null;\n          this.shiftAndExecuteNext(\"audio\");\n        }\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n      },\n      onError: (error) => {\n        this.warn(\"Error executing block-audio operation\", error);\n      }\n    };\n    this.blockedAudioAppend = {\n      op,\n      frag: partOrFrag\n    };\n    this.append(op, \"audio\", true);\n  }\n  unblockAudio() {\n    const {\n      blockedAudioAppend,\n      operationQueue\n    } = this;\n    if (blockedAudioAppend && operationQueue) {\n      this.blockedAudioAppend = null;\n      operationQueue.unblockAudio(blockedAudioAppend.op);\n    }\n  }\n  onBufferAppending(event, eventData) {\n    const {\n      tracks\n    } = this;\n    const {\n      data,\n      type,\n      parent,\n      frag,\n      part,\n      chunkMeta,\n      offset\n    } = eventData;\n    const chunkStats = chunkMeta.buffering[type];\n    const {\n      sn,\n      cc\n    } = frag;\n    const bufferAppendingStart = self.performance.now();\n    chunkStats.start = bufferAppendingStart;\n    const fragBuffering = frag.stats.buffering;\n    const partBuffering = part ? part.stats.buffering : null;\n    if (fragBuffering.start === 0) {\n      fragBuffering.start = bufferAppendingStart;\n    }\n    if (partBuffering && partBuffering.start === 0) {\n      partBuffering.start = bufferAppendingStart;\n    }\n    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 videoTrack = tracks.video;\n    const videoSb = videoTrack == null ? void 0 : videoTrack.buffer;\n    if (videoSb && sn !== \"initSegment\") {\n      const partOrFrag = part || frag;\n      const blockedAudioAppend = this.blockedAudioAppend;\n      if (type === \"audio\" && parent !== \"main\" && !this.blockedAudioAppend && !(videoTrack.ending || videoTrack.ended)) {\n        const pStart = partOrFrag.start;\n        const pTime = pStart + partOrFrag.duration * 0.05;\n        const vbuffered = videoSb.buffered;\n        const vappending = this.currentOp(\"video\");\n        if (!vbuffered.length && !vappending) {\n          this.blockAudio(partOrFrag);\n        } else if (!vappending && !BufferHelper.isBuffered(videoSb, pTime) && this.lastVideoAppendEnd < pTime) {\n          this.blockAudio(partOrFrag);\n        }\n      } else if (type === \"video\") {\n        const videoAppendEnd = partOrFrag.end;\n        if (blockedAudioAppend) {\n          const audioStart = blockedAudioAppend.frag.start;\n          if (videoAppendEnd > audioStart || videoAppendEnd < this.lastVideoAppendEnd || BufferHelper.isBuffered(videoSb, audioStart)) {\n            this.unblockAudio();\n          }\n        }\n        this.lastVideoAppendEnd = videoAppendEnd;\n      }\n    }\n    const fragStart = (part || frag).start;\n    const operation = {\n      label: `append-${type}`,\n      execute: () => {\n        var _this$tracks$type2;\n        chunkStats.executeStart = self.performance.now();\n        const sb = (_this$tracks$type2 = this.tracks[type]) == null ? void 0 : _this$tracks$type2.buffer;\n        if (sb) {\n          if (checkTimestampOffset) {\n            this.updateTimestampOffset(sb, fragStart, 0.1, type, sn, cc);\n          } else if (offset !== void 0 && isFiniteNumber(offset)) {\n            this.updateTimestampOffset(sb, offset, 1e-6, type, sn, cc);\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 timeRanges = {};\n        this.sourceBuffers.forEach(([type2, sb]) => {\n          if (type2) {\n            timeRanges[type2] = BufferHelper.getBuffered(sb);\n          }\n        });\n        this.appendErrors[type] = 0;\n        if (type === \"audio\" || type === \"video\") {\n          this.appendErrors.audiovideo = 0;\n        } else {\n          this.appendErrors.audio = 0;\n          this.appendErrors.video = 0;\n        }\n        this.hls.trigger(Events.BUFFER_APPENDED, {\n          type,\n          frag,\n          part,\n          chunkMeta,\n          parent: frag.type,\n          timeRanges\n        });\n      },\n      onError: (error) => {\n        var _this$media;\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        const mediaError = (_this$media = this.media) == null ? void 0 : _this$media.error;\n        if (error.code === DOMException.QUOTA_EXCEEDED_ERR || error.name == \"QuotaExceededError\" || `quota` in error) {\n          event2.details = ErrorDetails.BUFFER_FULL_ERROR;\n        } else if (error.code === DOMException.INVALID_STATE_ERR && this.mediaSourceOpenOrEnded && !mediaError) {\n          event2.errorAction = createDoNothingErrorAction(true);\n        } else if (error.name === TRACK_REMOVED_ERROR_NAME && this.sourceBufferCount === 0) {\n          event2.errorAction = createDoNothingErrorAction(true);\n        } else {\n          const appendErrorCount = ++this.appendErrors[type];\n          this.warn(`Failed ${appendErrorCount}/${this.hls.config.appendErrorMaxRetry} times to append segment in \"${type}\" sourceBuffer (${mediaError ? mediaError : \"no media error\"})`);\n          if (appendErrorCount >= this.hls.config.appendErrorMaxRetry || !!mediaError) {\n            event2.fatal = true;\n          }\n        }\n        this.hls.trigger(Events.ERROR, event2);\n      }\n    };\n    this.log(`queuing \"${type}\" append sn: ${sn}${part ? \" p: \" + part.index : \"\"} of ${frag.type === PlaylistLevelType.MAIN ? \"level\" : \"track\"} ${frag.level} cc: ${cc}`);\n    this.append(operation, type, this.isPending(this.tracks[type]));\n  }\n  getFlushOp(type, start, end) {\n    this.log(`queuing \"${type}\" remove ${start}-${end}`);\n    return {\n      label: \"remove\",\n      execute: () => {\n        this.removeExecutor(type, start, end);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n        this.hls.trigger(Events.BUFFER_FLUSHED, {\n          type\n        });\n      },\n      onError: (error) => {\n        this.warn(`Failed to remove ${start}-${end} from \"${type}\" SourceBuffer`, error);\n      }\n    };\n  }\n  onBufferFlushing(event, data) {\n    const {\n      type,\n      startOffset,\n      endOffset\n    } = data;\n    if (type) {\n      this.append(this.getFlushOp(type, startOffset, endOffset), type);\n    } else {\n      this.sourceBuffers.forEach(([type2]) => {\n        if (type2) {\n          this.append(this.getFlushOp(type2, startOffset, endOffset), type2);\n        }\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).catch((error) => {\n      this.warn(`Fragment buffered callback ${error}`);\n      this.stepOperationQueue(this.sourceBufferTypes);\n    });\n  }\n  onFragChanged(event, data) {\n    this.trimBuffers();\n  }\n  get bufferedToEnd() {\n    return this.sourceBufferCount > 0 && !this.sourceBuffers.some(([type]) => {\n      if (type) {\n        const track = this.tracks[type];\n        if (track) {\n          return !track.ended || track.ending;\n        }\n      }\n      return false;\n    });\n  }\n  onBufferEos(event, data) {\n    var _this$overrides;\n    this.sourceBuffers.forEach(([type]) => {\n      if (type) {\n        const track = this.tracks[type];\n        if (!data.type || data.type === type) {\n          track.ending = true;\n          if (!track.ended) {\n            track.ended = true;\n            this.log(`${type} buffer reached EOS`);\n          }\n        }\n      }\n    });\n    const allowEndOfStream = ((_this$overrides = this.overrides) == null ? void 0 : _this$overrides.endOfStream) !== false;\n    const allTracksEnding = this.sourceBufferCount > 0 && !this.sourceBuffers.some(([type]) => {\n      var _this$tracks$type3;\n      return type && !((_this$tracks$type3 = this.tracks[type]) != null && _this$tracks$type3.ended);\n    });\n    if (allTracksEnding) {\n      if (allowEndOfStream) {\n        this.log(`Queueing EOS`);\n        this.blockUntilOpen(() => {\n          this.tracksEnded();\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          this.hls.trigger(Events.BUFFERED_TO_END, void 0);\n        });\n      } else {\n        this.tracksEnded();\n        this.hls.trigger(Events.BUFFERED_TO_END, void 0);\n      }\n    } else if (data.type === \"video\") {\n      this.unblockAudio();\n    }\n  }\n  tracksEnded() {\n    this.sourceBuffers.forEach(([type]) => {\n      if (type !== null) {\n        const track = this.tracks[type];\n        if (track) {\n          track.ending = false;\n        }\n      }\n    });\n  }\n  onLevelUpdated(event, {\n    details\n  }) {\n    if (!details.fragments.length) {\n      return;\n    }\n    this.details = details;\n    this.updateDuration();\n  }\n  updateDuration() {\n    this.blockUntilOpen(() => {\n      const durationAndRange = this.getDurationAndRange();\n      if (!durationAndRange) {\n        return;\n      }\n      this.updateMediaSource(durationAndRange);\n    });\n  }\n  onError(event, data) {\n    if (data.details === ErrorDetails.BUFFER_APPEND_ERROR && data.frag) {\n      var _data$errorAction;\n      const nextAutoLevel = (_data$errorAction = data.errorAction) == null ? void 0 : _data$errorAction.nextAutoLevel;\n      if (isFiniteNumber(nextAutoLevel) && nextAutoLevel !== data.frag.level) {\n        this.resetAppendErrors();\n      }\n    }\n  }\n  resetAppendErrors() {\n    this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0\n    };\n  }\n  trimBuffers() {\n    const {\n      hls,\n      details,\n      media\n    } = this;\n    if (!media || details === null) {\n      return;\n    }\n    if (!this.sourceBufferCount) {\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    const frontBufferFlushThreshold = config.frontBufferFlushThreshold;\n    if (isFiniteNumber(frontBufferFlushThreshold) && frontBufferFlushThreshold > 0) {\n      const frontBufferLength = Math.max(config.maxBufferLength, 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    this.sourceBuffers.forEach(([type, sb]) => {\n      if (sb) {\n        const buffered = BufferHelper.getBuffered(sb);\n        if (buffered.length > 0 && targetBackBufferPosition > buffered.start(0)) {\n          var _this$details;\n          this.hls.trigger(Events.BACK_BUFFER_REACHED, {\n            bufferEnd: targetBackBufferPosition\n          });\n          const track = this.tracks[type];\n          if ((_this$details = this.details) != null && _this$details.live) {\n            this.hls.trigger(Events.LIVE_BACK_BUFFER_REACHED, {\n              bufferEnd: targetBackBufferPosition\n            });\n          } else if (track != null && track.ended) {\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    this.sourceBuffers.forEach(([type, sb]) => {\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        }\n        this.hls.trigger(Events.BUFFER_FLUSHING, {\n          startOffset: bufferStart,\n          endOffset: Infinity,\n          type\n        });\n      }\n    });\n  }\n  getDurationAndRange() {\n    var _this$overrides2;\n    const {\n      details,\n      mediaSource\n    } = this;\n    if (!details || !this.media || (mediaSource == null ? void 0 : mediaSource.readyState) !== \"open\") {\n      return null;\n    }\n    const playlistEnd = details.edge;\n    if (details.live && this.hls.config.liveDurationInfinity) {\n      const len = details.fragments.length;\n      if (len && !!mediaSource.setLiveSeekableRange) {\n        const start = Math.max(0, details.fragmentStart);\n        const end = Math.max(start, playlistEnd);\n        return {\n          duration: Infinity,\n          start,\n          end\n        };\n      }\n      return {\n        duration: Infinity\n      };\n    }\n    const overrideDuration = (_this$overrides2 = this.overrides) == null ? void 0 : _this$overrides2.duration;\n    if (overrideDuration) {\n      if (!isFiniteNumber(overrideDuration)) {\n        return null;\n      }\n      return {\n        duration: overrideDuration\n      };\n    }\n    const mediaDuration = this.media.duration;\n    const msDuration = isFiniteNumber(mediaSource.duration) ? mediaSource.duration : 0;\n    if (playlistEnd > msDuration && playlistEnd > mediaDuration || !isFiniteNumber(mediaDuration)) {\n      return {\n        duration: playlistEnd\n      };\n    }\n    return null;\n  }\n  updateMediaSource({\n    duration,\n    start,\n    end\n  }) {\n    const mediaSource = this.mediaSource;\n    if (!this.media || !mediaSource || mediaSource.readyState !== \"open\") {\n      return;\n    }\n    if (mediaSource.duration !== duration) {\n      if (isFiniteNumber(duration)) {\n        this.log(`Updating MediaSource duration to ${duration.toFixed(3)}`);\n      }\n      mediaSource.duration = duration;\n    }\n    if (start !== void 0 && end !== void 0) {\n      this.log(`MediaSource duration is set to ${mediaSource.duration}. Setting seekable range to ${start}-${end}.`);\n      mediaSource.setLiveSeekableRange(start, end);\n    }\n  }\n  get tracksReady() {\n    const pendingTrackCount = this.pendingTrackCount;\n    return pendingTrackCount > 0 && (pendingTrackCount >= this.bufferCodecEventsTotal || this.isPending(this.tracks.audiovideo));\n  }\n  checkPendingTracks() {\n    const {\n      bufferCodecEventsTotal,\n      pendingTrackCount,\n      tracks\n    } = this;\n    this.log(`checkPendingTracks (pending: ${pendingTrackCount} codec events expected: ${bufferCodecEventsTotal}) ${stringify(tracks)}`);\n    if (this.tracksReady) {\n      var _this$transferData4;\n      const transferredTracks = (_this$transferData4 = this.transferData) == null ? void 0 : _this$transferData4.tracks;\n      if (transferredTracks && Object.keys(transferredTracks).length) {\n        this.attachTransferred();\n      } else {\n        this.createSourceBuffers();\n      }\n    }\n  }\n  bufferCreated() {\n    if (this.sourceBufferCount) {\n      const tracks = {};\n      this.sourceBuffers.forEach(([type, buffer]) => {\n        if (type) {\n          const track = this.tracks[type];\n          tracks[type] = {\n            buffer,\n            container: track.container,\n            codec: track.codec,\n            supplemental: track.supplemental,\n            levelCodec: track.levelCodec,\n            id: track.id,\n            metadata: track.metadata\n          };\n        }\n      });\n      this.hls.trigger(Events.BUFFER_CREATED, {\n        tracks\n      });\n      this.log(`SourceBuffers created. Running queue: ${this.operationQueue}`);\n      this.sourceBuffers.forEach(([type]) => {\n        this.executeNext(type);\n      });\n    } else {\n      const error = new Error(\"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  createSourceBuffers() {\n    const {\n      tracks,\n      sourceBuffers,\n      mediaSource\n    } = this;\n    if (!mediaSource) {\n      throw new Error(\"createSourceBuffers called when mediaSource was null\");\n    }\n    for (const trackName in tracks) {\n      const type = trackName;\n      const track = tracks[type];\n      if (this.isPending(track)) {\n        const codec = this.getTrackCodec(track, type);\n        const mimeType = `${track.container};codecs=${codec}`;\n        track.codec = codec;\n        this.log(`creating sourceBuffer(${mimeType})${this.currentOp(type) ? \" Queued\" : \"\"} ${stringify(track)}`);\n        try {\n          const sb = mediaSource.addSourceBuffer(mimeType);\n          const sbIndex = sourceBufferNameToIndex(type);\n          const sbTuple = [type, sb];\n          sourceBuffers[sbIndex] = sbTuple;\n          track.buffer = sb;\n        } catch (error) {\n          var _this$operationQueue;\n          this.error(`error while trying to add sourceBuffer: ${error.message}`);\n          this.shiftAndExecuteNext(type);\n          (_this$operationQueue = this.operationQueue) == null || _this$operationQueue.removeBlockers();\n          delete this.tracks[type];\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.BUFFER_ADD_CODEC_ERROR,\n            fatal: false,\n            error,\n            sourceBufferName: type,\n            mimeType,\n            parent: track.id\n          });\n          return;\n        }\n        this.trackSourceBuffer(type, track);\n      }\n    }\n    this.bufferCreated();\n  }\n  getTrackCodec(track, trackName) {\n    const supplementalCodec = track.supplemental;\n    let trackCodec = track.codec;\n    if (supplementalCodec && (trackName === \"video\" || trackName === \"audiovideo\") && areCodecsMediaSourceSupported(supplementalCodec, \"video\")) {\n      trackCodec = replaceVideoCodec(trackCodec, supplementalCodec);\n    }\n    const codec = pickMostCompleteCodecName(trackCodec, track.levelCodec);\n    if (codec) {\n      if (trackName.slice(0, 5) === \"audio\") {\n        return getCodecCompatibleName(codec, this.appendSource);\n      }\n      return codec;\n    }\n    return \"\";\n  }\n  trackSourceBuffer(type, track) {\n    const buffer = track.buffer;\n    if (!buffer) {\n      return;\n    }\n    const codec = this.getTrackCodec(track, type);\n    this.tracks[type] = {\n      buffer,\n      codec,\n      container: track.container,\n      levelCodec: track.levelCodec,\n      supplemental: track.supplemental,\n      metadata: track.metadata,\n      id: track.id,\n      listeners: []\n    };\n    this.removeBufferListeners(type);\n    this.addBufferListener(type, \"updatestart\", this.onSBUpdateStart);\n    this.addBufferListener(type, \"updateend\", this.onSBUpdateEnd);\n    this.addBufferListener(type, \"error\", this.onSBUpdateError);\n    if (this.appendSource) {\n      this.addBufferListener(type, \"bufferedchange\", (type2, event) => {\n        const removedRanges = event.removedRanges;\n        if (removedRanges != null && removedRanges.length) {\n          this.hls.trigger(Events.BUFFER_FLUSHED, {\n            type: type2\n          });\n        }\n      });\n    }\n  }\n  get mediaSrc() {\n    var _this$media2, _this$media2$querySel;\n    const media = ((_this$media2 = this.media) == null || (_this$media2$querySel = _this$media2.querySelector) == null ? void 0 : _this$media2$querySel.call(_this$media2, \"source\")) || this.media;\n    return media == null ? void 0 : media.src;\n  }\n  onSBUpdateStart(type) {\n    const operation = this.currentOp(type);\n    if (!operation) {\n      return;\n    }\n    operation.onStart();\n  }\n  onSBUpdateEnd(type) {\n    var _this$mediaSource4;\n    if (((_this$mediaSource4 = this.mediaSource) == null ? void 0 : _this$mediaSource4.readyState) === \"closed\") {\n      this.resetBuffer(type);\n      return;\n    }\n    const operation = this.currentOp(type);\n    if (!operation) {\n      return;\n    }\n    operation.onComplete();\n    this.shiftAndExecuteNext(type);\n  }\n  onSBUpdateError(type, event) {\n    var _this$mediaSource5;\n    const error = new Error(`${type} SourceBuffer error. MediaSource readyState: ${(_this$mediaSource5 = this.mediaSource) == null ? void 0 : _this$mediaSource5.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.currentOp(type);\n    if (operation) {\n      operation.onError(error);\n    }\n  }\n  updateTimestampOffset(sb, timestampOffset, tolerance, type, sn, cc) {\n    const delta = timestampOffset - sb.timestampOffset;\n    if (Math.abs(delta) >= tolerance) {\n      this.log(`Updating ${type} SourceBuffer timestampOffset to ${timestampOffset} (sn: ${sn} cc: ${cc})`);\n      sb.timestampOffset = timestampOffset;\n    }\n  }\n  removeExecutor(type, startOffset, endOffset) {\n    const {\n      media,\n      mediaSource\n    } = this;\n    const track = this.tracks[type];\n    const sb = track == null ? void 0 : track.buffer;\n    if (!media || !mediaSource || !sb) {\n      this.warn(`Attempting to remove from the ${type} SourceBuffer, but it does not exist`);\n      this.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 && (!track.ending || track.ended)) {\n      track.ended = false;\n      this.log(`Removing [${removeStart},${removeEnd}] from the ${type} SourceBuffer`);\n      sb.remove(removeStart, removeEnd);\n    } else {\n      this.shiftAndExecuteNext(type);\n    }\n  }\n  appendExecutor(data, type) {\n    const track = this.tracks[type];\n    const sb = track == null ? void 0 : track.buffer;\n    if (!sb) {\n      throw new HlsJsTrackRemovedError(`Attempting to append to the ${type} SourceBuffer, but it does not exist`);\n    }\n    track.ending = false;\n    track.ended = false;\n    sb.appendBuffer(data);\n  }\n  blockUntilOpen(callback) {\n    if (this.isUpdating() || this.isQueued()) {\n      this.blockBuffers(callback).catch((error) => {\n        this.warn(`SourceBuffer blocked callback ${error}`);\n        this.stepOperationQueue(this.sourceBufferTypes);\n      });\n    } else {\n      try {\n        callback();\n      } catch (error) {\n        this.warn(`Callback run without blocking ${this.operationQueue} ${error}`);\n      }\n    }\n  }\n  isUpdating() {\n    return this.sourceBuffers.some(([type, sb]) => type && sb.updating);\n  }\n  isQueued() {\n    return this.sourceBuffers.some(([type]) => type && !!this.currentOp(type));\n  }\n  isPending(track) {\n    return !!track && !track.buffer;\n  }\n  blockBuffers(onUnblocked, bufferNames = this.sourceBufferTypes) {\n    if (!bufferNames.length) {\n      this.log(\"Blocking operation requested, but no SourceBuffers exist\");\n      return Promise.resolve().then(onUnblocked);\n    }\n    const {\n      operationQueue\n    } = this;\n    const blockingOperations = bufferNames.map((type) => this.appendBlocker(type));\n    const audioBlocked = bufferNames.length > 1 && !!this.blockedAudioAppend;\n    if (audioBlocked) {\n      this.unblockAudio();\n    }\n    return Promise.all(blockingOperations).then((result) => {\n      if (operationQueue !== this.operationQueue) {\n        return;\n      }\n      onUnblocked();\n      this.stepOperationQueue(this.sourceBufferTypes);\n    });\n  }\n  stepOperationQueue(bufferNames) {\n    bufferNames.forEach((type) => {\n      var _this$tracks$type4;\n      const sb = (_this$tracks$type4 = this.tracks[type]) == null ? void 0 : _this$tracks$type4.buffer;\n      if (!sb || sb.updating) {\n        return;\n      }\n      this.shiftAndExecuteNext(type);\n    });\n  }\n  append(operation, type, pending) {\n    if (this.operationQueue) {\n      this.operationQueue.append(operation, type, pending);\n    }\n  }\n  appendBlocker(type) {\n    if (this.operationQueue) {\n      return this.operationQueue.appendBlocker(type);\n    }\n  }\n  currentOp(type) {\n    if (this.operationQueue) {\n      return this.operationQueue.current(type);\n    }\n    return null;\n  }\n  executeNext(type) {\n    if (type && this.operationQueue) {\n      this.operationQueue.executeNext(type);\n    }\n  }\n  shiftAndExecuteNext(type) {\n    if (this.operationQueue) {\n      this.operationQueue.shiftAndExecuteNext(type);\n    }\n  }\n  get pendingTrackCount() {\n    return Object.keys(this.tracks).reduce((acc, type) => acc + (this.isPending(this.tracks[type]) ? 1 : 0), 0);\n  }\n  get sourceBufferCount() {\n    return this.sourceBuffers.reduce((acc, [type]) => acc + (type ? 1 : 0), 0);\n  }\n  get sourceBufferTypes() {\n    return this.sourceBuffers.map(([type]) => type).filter((type) => !!type);\n  }\n  addBufferListener(type, event, fn) {\n    const track = this.tracks[type];\n    if (!track) {\n      return;\n    }\n    const buffer = track.buffer;\n    if (!buffer) {\n      return;\n    }\n    const listener = fn.bind(this, type);\n    track.listeners.push({\n      event,\n      listener\n    });\n    buffer.addEventListener(event, listener);\n  }\n  removeBufferListeners(type) {\n    const track = this.tracks[type];\n    if (!track) {\n      return;\n    }\n    const buffer = track.buffer;\n    if (!buffer) {\n      return;\n    }\n    track.listeners.forEach((l) => {\n      buffer.removeEventListener(l.event, l.listener);\n    });\n    track.listeners.length = 0;\n  }\n}\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}\nfunction sourceBufferNameToIndex(type) {\n  return type === \"audio\" ? 1 : 0;\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  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    this.media = null;\n  }\n  detectPlayerSize() {\n    if (this.media) {\n      if (this.mediaHeight <= 0 || this.mediaWidth <= 0) {\n        this.clientRect = null;\n        return;\n      }\n      const levels = this.hls.levels;\n      if (levels.length) {\n        const hls = this.hls;\n        const maxLevel = this.getMaxLevel(levels.length - 1);\n        if (maxLevel !== this.autoLevelCapping) {\n          hls.logger.log(`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.autoLevelEnabled && hls.autoLevelCapping > this.autoLevelCapping && this.streamController) {\n          this.streamController.nextLevelSwitch();\n        }\n        this.autoLevelCapping = hls.autoLevelCapping;\n      }\n    }\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 Math.min(pixelRatio, this.hls.config.maxDevicePixelRatio);\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}\nconst CmObjectType = {\n  MANIFEST: \"m\",\n  AUDIO: \"a\",\n  VIDEO: \"v\",\n  MUXED: \"av\",\n  INIT: \"i\",\n  CAPTION: \"c\",\n  TIMED_TEXT: \"tt\",\n  KEY: \"k\",\n  OTHER: \"o\"\n};\nconst CmcdObjectType = CmObjectType;\nconst CmStreamingFormat = {\n  HLS: \"h\"\n};\nconst CmcdStreamingFormat = CmStreamingFormat;\nclass SfItem {\n  constructor(value, params) {\n    if (Array.isArray(value)) {\n      value = value.map((v) => v instanceof SfItem ? v : new SfItem(v));\n    }\n    this.value = value;\n    this.params = params;\n  }\n}\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}\nfunction serializeError(src, type, cause) {\n  return throwError(\"serialize\", src, type, cause);\n}\nclass SfToken {\n  constructor(description) {\n    this.description = description;\n  }\n}\nconst BARE_ITEM = \"Bare Item\";\nconst BOOLEAN = \"Boolean\";\nfunction serializeBoolean(value) {\n  if (typeof value !== \"boolean\") {\n    throw serializeError(value, BOOLEAN);\n  }\n  return value ? \"?1\" : \"?0\";\n}\nfunction encodeBase64(binary) {\n  return btoa(String.fromCharCode(...binary));\n}\nconst BYTES = \"Byte Sequence\";\nfunction serializeByteSequence(value) {\n  if (ArrayBuffer.isView(value) === false) {\n    throw serializeError(value, BYTES);\n  }\n  return `:${encodeBase64(value)}:`;\n}\nconst INTEGER = \"Integer\";\nfunction isInvalidInt(value) {\n  return value < -999999999999999 || 999999999999999 < 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}\nconst DECIMAL = \"Decimal\";\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\";\nconst STRING_REGEX = /[\\x00-\\x1f\\x7f]+/;\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}\nconst TOKEN = \"Token\";\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}\nconst KEY = \"Key\";\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\" || dict == null) {\n    throw serializeError(dict, DICT);\n  }\n  const entries = dict instanceof Map ? dict.entries() : Object.entries(dict);\n  const optionalWhiteSpace = (options === null || options === void 0 ? void 0 : options.whitespace) ? \" \" : \"\";\n  return Array.from(entries).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 CMCD_OBJECT = \"CMCD-Object\";\nconst CMCD_REQUEST = \"CMCD-Request\";\nconst CMCD_SESSION = \"CMCD-Session\";\nconst CMCD_STATUS = \"CMCD-Status\";\nconst CMCD_HEADER_MAP = {\n  br: CMCD_OBJECT,\n  ab: CMCD_OBJECT,\n  d: CMCD_OBJECT,\n  ot: CMCD_OBJECT,\n  tb: CMCD_OBJECT,\n  tpb: CMCD_OBJECT,\n  lb: CMCD_OBJECT,\n  tab: CMCD_OBJECT,\n  lab: CMCD_OBJECT,\n  url: CMCD_OBJECT,\n  pb: CMCD_REQUEST,\n  bl: CMCD_REQUEST,\n  tbl: CMCD_REQUEST,\n  dl: CMCD_REQUEST,\n  ltc: CMCD_REQUEST,\n  mtp: CMCD_REQUEST,\n  nor: CMCD_REQUEST,\n  nrr: CMCD_REQUEST,\n  rc: CMCD_REQUEST,\n  sn: CMCD_REQUEST,\n  sta: CMCD_REQUEST,\n  su: CMCD_REQUEST,\n  ttfb: CMCD_REQUEST,\n  ttfbb: CMCD_REQUEST,\n  ttlb: CMCD_REQUEST,\n  cmsdd: CMCD_REQUEST,\n  cmsds: CMCD_REQUEST,\n  smrt: CMCD_REQUEST,\n  df: CMCD_REQUEST,\n  cs: CMCD_REQUEST,\n  ts: CMCD_REQUEST,\n  cid: CMCD_SESSION,\n  pr: CMCD_SESSION,\n  sf: CMCD_SESSION,\n  sid: CMCD_SESSION,\n  st: CMCD_SESSION,\n  v: CMCD_SESSION,\n  msd: CMCD_SESSION,\n  bs: CMCD_STATUS,\n  bsd: CMCD_STATUS,\n  cdn: CMCD_STATUS,\n  rtp: CMCD_STATUS,\n  bg: CMCD_STATUS,\n  pt: CMCD_STATUS,\n  ec: CMCD_STATUS,\n  e: CMCD_STATUS\n};\nconst CmcdHeaderField = {\n  REQUEST: CMCD_REQUEST\n};\nfunction createHeaderMap(headerMap) {\n  return Object.keys(headerMap).reduce((acc, field) => {\n    var _a;\n    (_a = headerMap[field]) === null || _a === void 0 ? void 0 : _a.forEach((key) => acc[key] = field);\n    return acc;\n  }, {});\n}\nfunction groupCmcdHeaders(cmcd, customHeaderMap) {\n  const result = {};\n  if (!cmcd) {\n    return result;\n  }\n  const keys = Object.keys(cmcd);\n  const custom = customHeaderMap ? createHeaderMap(customHeaderMap) : {};\n  return keys.reduce((acc, key) => {\n    var _a;\n    const field = CMCD_HEADER_MAP[key] || custom[key] || CmcdHeaderField.REQUEST;\n    const data = (_a = acc[field]) !== null && _a !== void 0 ? _a : acc[field] = {};\n    data[key] = cmcd[key];\n    return acc;\n  }, result);\n}\nfunction isTokenField(key) {\n  return [\"ot\", \"sf\", \"st\", \"e\", \"sta\"].includes(key);\n}\nfunction isValid(value) {\n  if (typeof value === \"number\") {\n    return isFiniteNumber(value);\n  }\n  return value != null && value !== \"\" && value !== false;\n}\nconst CMCD_EVENT_MODE = \"event\";\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  const relativePath = toPath.join(\"/\");\n  return relativePath + to.search + to.hash;\n}\nconst toRounded = (value) => Math.round(value);\nconst toUrlSafe = (value, options) => {\n  if (Array.isArray(value)) {\n    return value.map((item) => toUrlSafe(item, options));\n  }\n  if (value instanceof SfItem && typeof value.value === \"string\") {\n    return new SfItem(toUrlSafe(value.value, options), value.params);\n  } else {\n    if (options.baseUrl) {\n      value = urlToRelativePath(value, options.baseUrl);\n    }\n    return options.version === 1 ? encodeURIComponent(value) : value;\n  }\n};\nconst toHundred = (value) => toRounded(value / 100) * 100;\nconst nor = (value, options) => {\n  let norValue = value;\n  if (options.version >= 2) {\n    if (value instanceof SfItem && typeof value.value === \"string\") {\n      norValue = new SfItem([value]);\n    } else if (typeof value === \"string\") {\n      norValue = [value];\n    }\n  }\n  return toUrlSafe(norValue, options);\n};\nconst CMCD_FORMATTER_MAP = {\n  br: toRounded,\n  d: toRounded,\n  bl: toHundred,\n  dl: toHundred,\n  mtp: toHundred,\n  nor,\n  rtp: toHundred,\n  tb: toRounded\n};\nconst CMCD_REQUEST_MODE = \"request\";\nconst CMCD_RESPONSE_MODE = \"response\";\nconst CMCD_COMMON_KEYS = [\"ab\", \"bg\", \"bl\", \"br\", \"bs\", \"bsd\", \"cdn\", \"cid\", \"cs\", \"df\", \"ec\", \"lab\", \"lb\", \"ltc\", \"msd\", \"mtp\", \"pb\", \"pr\", \"pt\", \"sf\", \"sid\", \"sn\", \"st\", \"sta\", \"tab\", \"tb\", \"tbl\", \"tpb\", \"ts\", \"v\"];\nconst CMCD_EVENT_KEYS = [\"e\"];\nconst CUSTOM_KEY_REGEX = /^[a-zA-Z0-9-.]+-[a-zA-Z0-9-.]+$/;\nfunction isCmcdCustomKey(key) {\n  return CUSTOM_KEY_REGEX.test(key);\n}\nfunction isCmcdEventKey(key) {\n  return CMCD_COMMON_KEYS.includes(key) || CMCD_EVENT_KEYS.includes(key) || isCmcdCustomKey(key);\n}\nconst CMCD_REQUEST_KEYS = [\"d\", \"dl\", \"nor\", \"ot\", \"rtp\", \"su\"];\nfunction isCmcdRequestKey(key) {\n  return CMCD_COMMON_KEYS.includes(key) || CMCD_REQUEST_KEYS.includes(key) || isCmcdCustomKey(key);\n}\nconst CMCD_RESPONSE_KEYS = [\"cmsdd\", \"cmsds\", \"rc\", \"smrt\", \"ttfb\", \"ttfbb\", \"ttlb\", \"url\"];\nfunction isCmcdResponseKey(key) {\n  return CMCD_COMMON_KEYS.includes(key) || CMCD_REQUEST_KEYS.includes(key) || CMCD_RESPONSE_KEYS.includes(key) || isCmcdCustomKey(key);\n}\nconst CMCD_V1_KEYS = [\"bl\", \"br\", \"bs\", \"cid\", \"d\", \"dl\", \"mtp\", \"nor\", \"nrr\", \"ot\", \"pr\", \"rtp\", \"sf\", \"sid\", \"st\", \"su\", \"tb\", \"v\"];\nfunction isCmcdV1Key(key) {\n  return CMCD_V1_KEYS.includes(key) || isCmcdCustomKey(key);\n}\nconst filterMap = {\n  [CMCD_RESPONSE_MODE]: isCmcdResponseKey,\n  [CMCD_EVENT_MODE]: isCmcdEventKey,\n  [CMCD_REQUEST_MODE]: isCmcdRequestKey\n};\nfunction prepareCmcdData(obj, options = {}) {\n  const results = {};\n  if (obj == null || typeof obj !== \"object\") {\n    return results;\n  }\n  const version2 = options.version || obj[\"v\"] || 1;\n  const reportingMode = options.reportingMode || CMCD_REQUEST_MODE;\n  const keyFilter = version2 === 1 ? isCmcdV1Key : filterMap[reportingMode];\n  let keys = Object.keys(obj).filter(keyFilter);\n  const filter = options.filter;\n  if (typeof filter === \"function\") {\n    keys = keys.filter(filter);\n  }\n  const needsTimestamp = reportingMode === CMCD_RESPONSE_MODE || reportingMode === CMCD_EVENT_MODE;\n  if (needsTimestamp && !keys.includes(\"ts\")) {\n    keys.push(\"ts\");\n  }\n  if (version2 > 1 && !keys.includes(\"v\")) {\n    keys.push(\"v\");\n  }\n  const formatters = _extends({}, CMCD_FORMATTER_MAP, options.formatters);\n  const formatterOptions = {\n    version: version2,\n    reportingMode,\n    baseUrl: options.baseUrl\n  };\n  keys.sort().forEach((key) => {\n    let value = obj[key];\n    const formatter = formatters[key];\n    if (typeof formatter === \"function\") {\n      value = formatter(value, formatterOptions);\n    }\n    if (key === \"v\") {\n      if (version2 === 1) {\n        return;\n      } else {\n        value = version2;\n      }\n    }\n    if (key == \"pr\" && value === 1) {\n      return;\n    }\n    if (needsTimestamp && key === \"ts\" && !isFiniteNumber(value)) {\n      value = Date.now();\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 toCmcdHeaders(cmcd, options = {}) {\n  const result = {};\n  if (!cmcd) {\n    return result;\n  }\n  const data = prepareCmcdData(cmcd, options);\n  const shards = groupCmcdHeaders(data, options === null || options === void 0 ? void 0 : options.customHeaderMap);\n  return Object.entries(shards).reduce((acc, [field, value]) => {\n    const shard = encodeSfDict(value, {\n      whitespace: false\n    });\n    if (shard) {\n      acc[field] = shard;\n    }\n    return acc;\n  }, result);\n}\nfunction appendCmcdHeaders(headers, cmcd, options) {\n  return _extends(headers, toCmcdHeaders(cmcd, options));\n}\nconst CMCD_PARAM = \"CMCD\";\nfunction encodeCmcd(cmcd, options = {}) {\n  if (!cmcd) {\n    return \"\";\n  }\n  return encodeSfDict(prepareCmcdData(cmcd, options), {\n    whitespace: false\n  });\n}\nfunction toCmcdUrl(cmcd, options = {}) {\n  if (!cmcd) {\n    return \"\";\n  }\n  const params = encodeCmcd(cmcd, options);\n  return encodeURIComponent(params);\n}\nfunction toCmcdQuery(cmcd, options = {}) {\n  if (!cmcd) {\n    return \"\";\n  }\n  const value = toCmcdUrl(cmcd, options);\n  return `${CMCD_PARAM}=${value}`;\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  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: CmcdObjectType.MANIFEST,\n          su: !this.initialized\n        });\n      } catch (error) {\n        this.hls.logger.warn(\"Could not generate manifest CMCD data.\", error);\n      }\n    };\n    this.applyFragmentData = (context) => {\n      try {\n        const {\n          frag,\n          part\n        } = context;\n        const level = this.hls.levels[frag.level];\n        const ot = this.getObjectType(frag);\n        const data = {\n          d: (part || frag).duration * 1e3,\n          ot\n        };\n        if (ot === CmcdObjectType.VIDEO || ot === CmcdObjectType.AUDIO || ot == CmcdObjectType.MUXED) {\n          data.br = level.bitrate / 1e3;\n          data.tb = this.getTopBandwidth(ot) / 1e3;\n          data.bl = this.getBufferLength(ot);\n        }\n        const next = part ? this.getNextPart(part) : this.getNextFrag(frag);\n        if (next != null && next.url && next.url !== frag.url) {\n          data.nor = next.url;\n        }\n        this.apply(context, data);\n      } catch (error) {\n        this.hls.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 || hls.sessionId;\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 = this.media = 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  createData() {\n    var _this$media;\n    return {\n      v: 1,\n      sf: CmcdStreamingFormat.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  apply(context, data = {}) {\n    _extends(data, this.createData());\n    const isVideo = data.ot === CmcdObjectType.INIT || data.ot === CmcdObjectType.VIDEO || data.ot === CmcdObjectType.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    const options = {\n      baseUrl: context.url\n    };\n    if (this.useHeaders) {\n      if (!context.headers) {\n        context.headers = {};\n      }\n      appendCmcdHeaders(context.headers, data, options);\n    } else {\n      context.url = appendCmcdQuery(context.url, data, options);\n    }\n  }\n  getNextFrag(fragment) {\n    var _this$hls$levels$frag;\n    const levelDetails = (_this$hls$levels$frag = this.hls.levels[fragment.level]) == null ? void 0 : _this$hls$levels$frag.details;\n    if (levelDetails) {\n      const index = fragment.sn - levelDetails.startSN;\n      return levelDetails.fragments[index + 1];\n    }\n    return void 0;\n  }\n  getNextPart(part) {\n    var _this$hls$levels$frag2;\n    const {\n      index,\n      fragment\n    } = part;\n    const partList = (_this$hls$levels$frag2 = this.hls.levels[fragment.level]) == null || (_this$hls$levels$frag2 = _this$hls$levels$frag2.details) == null ? void 0 : _this$hls$levels$frag2.partList;\n    if (partList) {\n      const {\n        sn\n      } = fragment;\n      for (let i = partList.length - 1; i >= 0; i--) {\n        const p = partList[i];\n        if (p.index === index && p.fragment.sn === sn) {\n          return partList[i + 1];\n        }\n      }\n    }\n    return void 0;\n  }\n  getObjectType(fragment) {\n    const {\n      type\n    } = fragment;\n    if (type === \"subtitle\") {\n      return CmcdObjectType.TIMED_TEXT;\n    }\n    if (fragment.sn === \"initSegment\") {\n      return CmcdObjectType.INIT;\n    }\n    if (type === \"audio\") {\n      return CmcdObjectType.AUDIO;\n    }\n    if (type === \"main\") {\n      if (!this.hls.audioTracks.length) {\n        return CmcdObjectType.MUXED;\n      }\n      return CmcdObjectType.VIDEO;\n    }\n    return void 0;\n  }\n  getTopBandwidth(type) {\n    let bitrate = 0;\n    let levels;\n    const hls = this.hls;\n    if (type === CmcdObjectType.AUDIO) {\n      levels = hls.audioTracks;\n    } else {\n      const max = hls.maxAutoLevel;\n      const len = max > -1 ? max + 1 : hls.levels.length;\n      levels = hls.levels.slice(0, len);\n    }\n    levels.forEach((level) => {\n      if (level.bitrate > bitrate) {\n        bitrate = level.bitrate;\n      }\n    });\n    return bitrate > 0 ? bitrate : NaN;\n  }\n  getBufferLength(type) {\n    const media = this.media;\n    const buffer = type === CmcdObjectType.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  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  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 extends Logger {\n  constructor(hls) {\n    super(\"content-steering\", hls.logger);\n    this.hls = 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.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  pathways() {\n    return (this.levels || []).reduce((pathways, level) => {\n      if (pathways.indexOf(level.pathwayId) === -1) {\n        pathways.push(level.pathwayId);\n      }\n      return pathways;\n    }, []);\n  }\n  get pathwayPriority() {\n    return this._pathwayPriority;\n  }\n  set pathwayPriority(pathwayPriority) {\n    this.updatePathwayPriority(pathwayPriority);\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 = this.pathways();\n      }\n      if (pathwayPriority && pathwayPriority.length > 1) {\n        this.updatePathwayPriority(pathwayPriority);\n        errorAction.resolved = this.pathwayId !== errorPathway;\n      }\n      if (data.details === ErrorDetails.BUFFER_APPEND_ERROR && !data.fatal) {\n        errorAction.resolved = true;\n      } else if (!errorAction.resolved) {\n        this.warn(`Could not resolve ${data.details} (\"${data.error.message}\") with content-steering for Pathway: ${errorPathway} levels: ${levels ? levels.length : levels} priorities: ${stringify(pathwayPriority)} penalized: ${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    }\n    return pathwayLevels;\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 == null ? void 0 : 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}\nclass EMEController extends Logger {\n  constructor(hls) {\n    super(\"eme\", hls.logger);\n    this.hls = void 0;\n    this.config = void 0;\n    this.media = null;\n    this.mediaResolved = void 0;\n    this.keyFormatPromise = null;\n    this.keySystemAccessPromises = {};\n    this._requestLicenseFailureCount = 0;\n    this.mediaKeySessions = [];\n    this.keyIdToKeySessionPromise = {};\n    this.mediaKeys = null;\n    this.setMediaKeysQueue = EMEController.CDMCleanupPromise ? [EMEController.CDMCleanupPromise] : [];\n    this.bannedKeyIds = {};\n    this.onMediaEncrypted = (event) => {\n      const {\n        initDataType,\n        initData\n      } = event;\n      const logMessage = `\"${event.type}\" event: init data type: \"${initDataType}\"`;\n      this.debug(logMessage);\n      if (initData === null) {\n        return;\n      }\n      if (!this.keyFormatPromise) {\n        let keySystems = Object.keys(this.keySystemAccessPromises);\n        if (!keySystems.length) {\n          keySystems = getKeySystemsForConfig(this.config);\n        }\n        const keyFormats = keySystems.map(keySystemDomainToKeySystemFormat).filter((k) => !!k);\n        this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n      }\n      this.keyFormatPromise.then((keySystemFormat) => {\n        const keySystem = keySystemFormatToKeySystemDomain(keySystemFormat);\n        if (initDataType !== \"sinf\" || keySystem !== KeySystems.FAIRPLAY) {\n          this.log(`Ignoring \"${event.type}\" event with init data type: \"${initDataType}\" for selected key-system ${keySystem}`);\n          return;\n        }\n        let keyId;\n        try {\n          const json = bin2str(new Uint8Array(initData));\n          const sinf = base64Decode(JSON.parse(json).sinf);\n          const tenc = parseSinf(sinf);\n          if (!tenc) {\n            throw new Error(`'schm' box missing or not cbcs/cenc with schi > tenc`);\n          }\n          keyId = new Uint8Array(tenc.subarray(8, 24));\n        } catch (error) {\n          this.warn(`${logMessage} Failed to parse sinf: ${error}`);\n          return;\n        }\n        const keyIdHex = arrayToHex(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.keyId) {\n            continue;\n          }\n          const oldKeyIdHex = arrayToHex(decryptdata.keyId);\n          if (arrayValuesMatch(keyId, decryptdata.keyId) || decryptdata.uri.replace(/-/g, \"\").indexOf(keyIdHex) !== -1) {\n            keySessionContextPromise = keyIdToKeySessionPromise[oldKeyIdHex];\n            if (!keySessionContextPromise) {\n              continue;\n            }\n            if (decryptdata.pssh) {\n              break;\n            }\n            delete keyIdToKeySessionPromise[oldKeyIdHex];\n            decryptdata.pssh = new Uint8Array(initData);\n            decryptdata.keyId = keyId;\n            keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex] = keySessionContextPromise.then(() => {\n              return this.generateRequestWithPreferredKeySession(keyContext, initDataType, initData, \"encrypted-event-key-match\");\n            });\n            keySessionContextPromise.catch((error) => this.handleError(error));\n            break;\n          }\n        }\n        if (!keySessionContextPromise) {\n          this.handleError(new Error(`Key ID ${keyIdHex} not encountered in playlist. Key-system sessions ${mediaKeySessions.length}.`));\n        }\n      }).catch((error) => this.handleError(error));\n    };\n    this.onWaitingForKey = (event) => {\n      this.log(`\"${event.type}\" event`);\n    };\n    this.hls = hls;\n    this.config = hls.config;\n    this.registerListeners();\n  }\n  destroy() {\n    this.onDestroying();\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.config = this.keyIdToKeySessionPromise = null;\n    this.onMediaEncrypted = this.onWaitingForKey = 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    this.hls.on(Events.DESTROYING, this.onDestroying, 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    this.hls.off(Events.DESTROYING, this.onDestroying, this);\n  }\n  getLicenseServerUrl(keySystem) {\n    const {\n      drmSystems,\n      widevineLicenseUrl\n    } = this.config;\n    const keySystemConfiguration = drmSystems == null ? void 0 : drmSystems[keySystem];\n    if (keySystemConfiguration) {\n      return keySystemConfiguration.licenseUrl;\n    }\n    if (keySystem === KeySystems.WIDEVINE && widevineLicenseUrl) {\n      return widevineLicenseUrl;\n    }\n  }\n  getLicenseServerUrlOrThrow(keySystem) {\n    const url = this.getLicenseServerUrl(keySystem);\n    if (url === void 0) {\n      throw new Error(`no license server URL configured for key-system \"${keySystem}\"`);\n    }\n    return url;\n  }\n  getServerCertificateUrl(keySystem) {\n    const {\n      drmSystems\n    } = this.config;\n    const keySystemConfiguration = drmSystems == null ? void 0 : 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    var _keySystemAccessPromi;\n    const mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations(keySystem, audioCodecs, videoCodecs, this.config.drmSystemOptions || {});\n    let keySystemAccessPromises = this.keySystemAccessPromises[keySystem];\n    let keySystemAccess = (_keySystemAccessPromi = keySystemAccessPromises) == null ? void 0 : _keySystemAccessPromi.keySystemAccess;\n    if (!keySystemAccess) {\n      this.log(`Requesting encrypted media \"${keySystem}\" key-system access with config: ${stringify(mediaKeySystemConfigs)}`);\n      keySystemAccess = this.requestMediaKeySystemAccess(keySystem, mediaKeySystemConfigs);\n      const keySystemAccessPromisesNew = 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        const mediaKeys = keySystemAccessPromisesNew.mediaKeys = mediaKeySystemAccess.createMediaKeys().then((mediaKeys2) => {\n          this.log(`Media-keys created for \"${keySystem}\"`);\n          keySystemAccessPromisesNew.hasMediaKeys = true;\n          return certificateRequest.then((certificate) => {\n            if (certificate) {\n              return this.setMediaKeysServerCertificate(mediaKeys2, keySystem, certificate);\n            }\n            return mediaKeys2;\n          });\n        });\n        mediaKeys.catch((error) => {\n          this.error(`Failed to create media-keys for \"${keySystem}\"}: ${error}`);\n        });\n        return 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: ${arrayToHex(decryptdata.keyId || [])} keyUri: ${decryptdata.uri}`);\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 = getKeyIdString(decryptdata);\n      const scheme = \"cenc\";\n      this.keyIdToKeySessionPromise[keyId] = this.generateRequestWithPreferredKeySession(keySessionContext, scheme, decryptdata.pssh.buffer, \"expired\");\n    } else {\n      this.warn(`Could not renew expired session. Missing pssh initData.`);\n    }\n    this.removeSession(mediaKeySessionContext);\n  }\n  updateKeySession(mediaKeySessionContext, data) {\n    const keySession = mediaKeySessionContext.mediaKeysSession;\n    this.log(`Updating key-session \"${keySession.sessionId}\" for keyId ${arrayToHex(mediaKeySessionContext.decryptdata.keyId || [])}\n      } (data length: ${data.byteLength})`);\n    return keySession.update(data);\n  }\n  getSelectedKeySystemFormats() {\n    return Object.keys(this.keySystemAccessPromises).map((keySystem) => ({\n      keySystem,\n      hasMediaKeys: this.keySystemAccessPromises[keySystem].hasMediaKeys\n    })).filter(({\n      hasMediaKeys\n    }) => !!hasMediaKeys).map(({\n      keySystem\n    }) => keySystemDomainToKeySystemFormat(keySystem)).filter((keySystem) => !!keySystem);\n  }\n  getKeySystemAccess(keySystemsToAttempt) {\n    return this.getKeySystemSelectionPromise(keySystemsToAttempt).then(({\n      keySystem,\n      mediaKeys\n    }) => {\n      return this.attemptSetMediaKeys(keySystem, mediaKeys);\n    });\n  }\n  selectKeySystem(keySystemsToAttempt) {\n    return new Promise((resolve, reject) => {\n      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  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    const keySystemsInConfig = getKeySystemsForConfig(this.config);\n    const keySystemsToAttempt = keyFormats.map(keySystemFormatToKeySystemDomain).filter((value) => !!value && keySystemsInConfig.indexOf(value) !== -1);\n    return this.selectKeySystem(keySystemsToAttempt);\n  }\n  getKeyStatus(decryptdata) {\n    const {\n      mediaKeySessions\n    } = this;\n    for (let i = 0; i < mediaKeySessions.length; i++) {\n      const status2 = getKeyStatus(decryptdata, mediaKeySessions[i]);\n      if (status2) {\n        return status2;\n      }\n    }\n    return void 0;\n  }\n  loadKey(data) {\n    const decryptdata = data.keyInfo.decryptdata;\n    const keyId = getKeyIdString(decryptdata);\n    const badStatus = this.bannedKeyIds[keyId];\n    if (badStatus || this.getKeyStatus(decryptdata) === \"internal-error\") {\n      const error = getKeyStatusError(badStatus || \"internal-error\", decryptdata);\n      this.handleError(error, data.frag);\n      return Promise.reject(error);\n    }\n    const keyDetails = `(keyId: ${keyId} format: \"${decryptdata.keyFormat}\" method: ${decryptdata.method} uri: ${decryptdata.uri})`;\n    this.log(`Starting session for key ${keyDetails}`);\n    const keyContextPromise = this.keyIdToKeySessionPromise[keyId];\n    if (!keyContextPromise) {\n      const keySessionContextPromise = 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          return this.createMediaKeySessionContext({\n            keySystem,\n            mediaKeys,\n            decryptdata\n          });\n        });\n      }).then((keySessionContext) => {\n        const scheme = \"cenc\";\n        const initData = decryptdata.pssh ? decryptdata.pssh.buffer : null;\n        return this.generateRequestWithPreferredKeySession(keySessionContext, scheme, initData, \"playlist-key\");\n      });\n      keySessionContextPromise.catch((error) => this.handleError(error, data.frag));\n      this.keyIdToKeySessionPromise[keyId] = keySessionContextPromise;\n      return keySessionContextPromise;\n    }\n    keyContextPromise.catch((error) => {\n      if (error instanceof EMEKeyError) {\n        const errorData = _objectSpread2({}, error.data);\n        if (this.getKeyStatus(decryptdata) === \"internal-error\") {\n          errorData.decryptdata = decryptdata;\n        }\n        const clonedError = new EMEKeyError(errorData, error.message);\n        this.handleError(clonedError, data.frag);\n      }\n    });\n    return keyContextPromise;\n  }\n  throwIfDestroyed(message = \"Invalid state\") {\n    if (!this.hls) {\n      throw new Error(\"invalid state\");\n    }\n  }\n  handleError(error, frag) {\n    if (!this.hls) {\n      return;\n    }\n    if (error instanceof EMEKeyError) {\n      if (frag) {\n        error.data.frag = frag;\n      }\n      const levelKey = error.data.decryptdata;\n      this.error(`${error.message}${levelKey ? ` (${arrayToHex(levelKey.keyId || [])})` : \"\"}`);\n      this.hls.trigger(Events.ERROR, error.data);\n    } else {\n      this.error(error.message);\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_KEYS,\n        error,\n        fatal: true\n      });\n    }\n  }\n  getKeySystemForKeyPromise(decryptdata) {\n    const keyId = 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 ${stringify({\n        drmSystems: this.config.drmSystems\n      })}`);\n    }\n    return this.attemptKeySystemAccess(keySystemsToAttempt);\n  }\n  attemptSetMediaKeys(keySystem, mediaKeys) {\n    this.mediaResolved = void 0;\n    if (this.mediaKeys === mediaKeys) {\n      return Promise.resolve();\n    }\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        return new Promise((resolve, reject) => {\n          this.mediaResolved = () => {\n            this.mediaResolved = void 0;\n            if (!this.media) {\n              return reject(new Error(\"Attempted to set mediaKeys without media element attached\"));\n            }\n            this.mediaKeys = mediaKeys;\n            this.media.setMediaKeys(mediaKeys).then(resolve).catch(reject);\n          };\n        });\n      }\n      return this.media.setMediaKeys(mediaKeys);\n    });\n    this.mediaKeys = mediaKeys;\n    this.setMediaKeysQueue.push(setMediaKeysPromise);\n    return setMediaKeysPromise.then(() => {\n      this.log(`Media-keys set for \"${keySystem}\"`);\n      queue.push(setMediaKeysPromise);\n      this.setMediaKeysQueue = this.setMediaKeysQueue.filter((p) => queue.indexOf(p) === -1);\n    });\n  }\n  generateRequestWithPreferredKeySession(context, initDataType, initData, reason) {\n    var _this$config$drmSyste;\n    const generateRequestFilter = (_this$config$drmSyste = this.config.drmSystems) == null || (_this$config$drmSyste = _this$config$drmSyste[context.keySystem]) == null ? void 0 : _this$config$drmSyste.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 = mappedInitData.initData ? mappedInitData.initData : null;\n        context.decryptdata.pssh = initData ? new Uint8Array(initData) : null;\n      } catch (error) {\n        this.warn(error.message);\n        if (this.hls && 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 = getKeyIdString(context.decryptdata);\n    const keyUri = context.decryptdata.uri;\n    this.log(`Generating key-session request for \"${reason}\" keyId: ${keyId} URI: ${keyUri} (init data type: ${initDataType} length: ${initData.byteLength})`);\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          if (licenseStatus.eventNames().length) {\n            licenseStatus.emit(\"error\", error);\n          } else {\n            this.handleError(error);\n          }\n        });\n      } else if (messageType === \"license-release\") {\n        if (context.keySystem === KeySystems.FAIRPLAY) {\n          this.updateKeySession(context, strToUtf8array(\"acknowledged\")).then(() => this.removeSession(context)).catch((error) => this.handleError(error));\n        }\n      } else {\n        this.warn(`unhandled media key message type \"${messageType}\"`);\n      }\n    };\n    const handleKeyStatus = (keyStatus, context2) => {\n      context2.keyStatus = keyStatus;\n      let keyError;\n      if (keyStatus.startsWith(\"usable\")) {\n        licenseStatus.emit(\"resolved\");\n      } else if (keyStatus === \"internal-error\" || keyStatus === \"output-restricted\" || keyStatus === \"output-downscaled\") {\n        keyError = getKeyStatusError(keyStatus, context2.decryptdata);\n      } else if (keyStatus === \"expired\") {\n        keyError = new Error(`key expired (keyId: ${keyId})`);\n      } else if (keyStatus === \"released\") {\n        keyError = new Error(`key released`);\n      } else if (keyStatus === \"status-pending\")\n        ;\n      else {\n        this.warn(`unhandled key status change \"${keyStatus}\" (keyId: ${keyId})`);\n      }\n      if (keyError) {\n        if (licenseStatus.eventNames().length) {\n          licenseStatus.emit(\"error\", keyError);\n        } else {\n          this.handleError(keyError);\n        }\n      }\n    };\n    const onkeystatuseschange = context._onkeystatuseschange = (event) => {\n      const keySession = context.mediaKeysSession;\n      if (!keySession) {\n        licenseStatus.emit(\"error\", new Error(\"invalid state\"));\n        return;\n      }\n      const keyStatuses = this.getKeyStatuses(context);\n      const keyIds = Object.keys(keyStatuses);\n      if (!keyIds.some((id) => keyStatuses[id] !== \"status-pending\")) {\n        return;\n      }\n      if (keyStatuses[keyId] === \"expired\") {\n        this.log(`Expired key ${stringify(keyStatuses)} in key-session \"${context.mediaKeysSession.sessionId}\"`);\n        this.renewKeySession(context);\n        return;\n      }\n      let keyStatus = keyStatuses[keyId];\n      if (keyStatus) {\n        handleKeyStatus(keyStatus, context);\n      } else {\n        var _context$keyStatusTim;\n        const timeout = 1e3;\n        context.keyStatusTimeouts || (context.keyStatusTimeouts = {});\n        (_context$keyStatusTim = context.keyStatusTimeouts)[keyId] || (_context$keyStatusTim[keyId] = self.setTimeout(() => {\n          if (!context.mediaKeysSession || !this.mediaKeys) {\n            return;\n          }\n          const sessionKeyStatus = this.getKeyStatus(context.decryptdata);\n          if (sessionKeyStatus && sessionKeyStatus !== \"status-pending\") {\n            this.log(`No status for keyId ${keyId} in key-session \"${context.mediaKeysSession.sessionId}\". Using session key-status ${sessionKeyStatus} from other session.`);\n            return handleKeyStatus(sessionKeyStatus, context);\n          }\n          this.log(`key status for ${keyId} in key-session \"${context.mediaKeysSession.sessionId}\" timed out after ${timeout}ms`);\n          keyStatus = \"internal-error\";\n          handleKeyStatus(keyStatus, context);\n        }, timeout));\n        this.log(`No status for keyId ${keyId} (${stringify(keyStatuses)}).`);\n      }\n    };\n    addEventListener(context.mediaKeysSession, \"message\", onmessage);\n    addEventListener(context.mediaKeysSession, \"keystatuseschange\", onkeystatuseschange);\n    const keyUsablePromise = new Promise((resolve, reject) => {\n      licenseStatus.on(\"error\", reject);\n      licenseStatus.on(\"resolved\", resolve);\n    });\n    return context.mediaKeysSession.generateRequest(initDataType, initData).then(() => {\n      this.log(`Request generated for key-session \"${context.mediaKeysSession.sessionId}\" keyId: ${keyId} URI: ${keyUri}`);\n    }).catch((error) => {\n      throw new EMEKeyError({\n        type: ErrorTypes.KEY_SYSTEM_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_NO_SESSION,\n        error,\n        decryptdata: context.decryptdata,\n        fatal: false\n      }, `Error generating key-session request: ${error}`);\n    }).then(() => keyUsablePromise).catch((error) => {\n      licenseStatus.removeAllListeners();\n      return this.removeSession(context).then(() => {\n        throw error;\n      });\n    }).then(() => {\n      licenseStatus.removeAllListeners();\n      return context;\n    });\n  }\n  getKeyStatuses(mediaKeySessionContext) {\n    const keyStatuses = {};\n    mediaKeySessionContext.mediaKeysSession.keyStatuses.forEach((status2, keyId) => {\n      if (typeof keyId === \"string\" && typeof status2 === \"object\") {\n        const temp = keyId;\n        keyId = status2;\n        status2 = temp;\n      }\n      const keyIdArray = \"buffer\" in keyId ? new Uint8Array(keyId.buffer, keyId.byteOffset, keyId.byteLength) : new Uint8Array(keyId);\n      if (mediaKeySessionContext.keySystem === KeySystems.PLAYREADY && keyIdArray.length === 16) {\n        const originKeyIdWithStatusChange = arrayToHex(keyIdArray);\n        keyStatuses[originKeyIdWithStatusChange] = status2;\n        changeEndianness(keyIdArray);\n      }\n      const keyIdWithStatusChange = arrayToHex(keyIdArray);\n      if (status2 === \"internal-error\") {\n        this.bannedKeyIds[keyIdWithStatusChange] = status2;\n      }\n      this.log(`key status change \"${status2}\" for keyStatuses keyId: ${keyIdWithStatusChange} key-session \"${mediaKeySessionContext.mediaKeysSession.sessionId}\"`);\n      keyStatuses[keyIdWithStatusChange] = status2;\n    });\n    return keyStatuses;\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.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          decryptdata: context.decryptdata,\n          error,\n          fatal: false\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.getLicenseServerUrlOrThrow(keySessionContext.keySystem);\n      this.log(`Sending license request to URL: ${url}`);\n      const xhr = new XMLHttpRequest();\n      xhr.responseType = \"arraybuffer\";\n      xhr.onreadystatechange = () => {\n        if (!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                decryptdata: keySessionContext.decryptdata,\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      }).catch(reject);\n    });\n  }\n  onDestroying() {\n    this.unregisterListeners();\n    this._clear();\n  }\n  onMediaAttached(event, data) {\n    if (!this.config.emeEnabled) {\n      return;\n    }\n    const media = data.media;\n    this.media = media;\n    addEventListener(media, \"encrypted\", this.onMediaEncrypted);\n    addEventListener(media, \"waitingforkey\", this.onWaitingForKey);\n    const mediaResolved = this.mediaResolved;\n    if (mediaResolved) {\n      mediaResolved();\n    } else {\n      this.mediaKeys = media.mediaKeys;\n    }\n  }\n  onMediaDetached() {\n    const media = this.media;\n    if (media) {\n      removeEventListener(media, \"encrypted\", this.onMediaEncrypted);\n      removeEventListener(media, \"waitingforkey\", this.onWaitingForKey);\n      this.media = null;\n      this.mediaKeys = null;\n    }\n  }\n  _clear() {\n    var _media$setMediaKeys;\n    this._requestLicenseFailureCount = 0;\n    this.keyIdToKeySessionPromise = {};\n    this.bannedKeyIds = {};\n    const mediaResolved = this.mediaResolved;\n    if (mediaResolved) {\n      mediaResolved();\n    }\n    if (!this.mediaKeys && !this.mediaKeySessions.length) {\n      return;\n    }\n    const media = this.media;\n    const mediaKeysList = this.mediaKeySessions.slice();\n    this.mediaKeySessions = [];\n    this.mediaKeys = null;\n    LevelKey.clearKeyUriToKeyIdMap();\n    const keySessionCount = mediaKeysList.length;\n    EMEController.CDMCleanupPromise = Promise.all(mediaKeysList.map((mediaKeySessionContext) => this.removeSession(mediaKeySessionContext)).concat((media == null || (_media$setMediaKeys = media.setMediaKeys(null)) == null ? void 0 : _media$setMediaKeys.catch((error) => {\n      this.log(`Could not clear media keys: ${error}`);\n      if (!this.hls)\n        return;\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR,\n        fatal: false,\n        error: new Error(`Could not clear media keys: ${error}`)\n      });\n    })) || Promise.resolve())).catch((error) => {\n      this.log(`Could not close sessions and clear media keys: ${error}`);\n      if (!this.hls)\n        return;\n      this.hls.trigger(Events.ERROR, {\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n        fatal: false,\n        error: new Error(`Could not close sessions and clear media keys: ${error}`)\n      });\n    }).then(() => {\n      if (keySessionCount) {\n        this.log(\"finished closing key sessions and clearing media keys\");\n      }\n    });\n  }\n  onManifestLoading() {\n    this._clear();\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      decryptdata\n    } = mediaKeySessionContext;\n    if (mediaKeysSession) {\n      this.log(`Remove licenses and keys and close session \"${mediaKeysSession.sessionId}\" keyId: ${arrayToHex((decryptdata == null ? void 0 : decryptdata.keyId) || [])}`);\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      const {\n        keyStatusTimeouts\n      } = mediaKeySessionContext;\n      if (keyStatusTimeouts) {\n        Object.keys(keyStatusTimeouts).forEach((keyId) => self.clearTimeout(keyStatusTimeouts[keyId]));\n      }\n      const {\n        drmSystemOptions\n      } = this.config;\n      const removePromise = isPersistentSessionType(drmSystemOptions) ? new Promise((resolve, reject) => {\n        self.setTimeout(() => reject(new Error(`MediaKeySession.remove() timeout`)), 8e3);\n        mediaKeysSession.remove().then(resolve).catch(reject);\n      }) : Promise.resolve();\n      return removePromise.catch((error) => {\n        this.log(`Could not remove session: ${error}`);\n        if (!this.hls)\n          return;\n        this.hls.trigger(Events.ERROR, {\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR,\n          fatal: false,\n          error: new Error(`Could not remove session: ${error}`)\n        });\n      }).then(() => {\n        return mediaKeysSession.close();\n      }).catch((error) => {\n        this.log(`Could not close session: ${error}`);\n        if (!this.hls)\n          return;\n        this.hls.trigger(Events.ERROR, {\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n          fatal: false,\n          error: new Error(`Could not close session: ${error}`)\n        });\n      });\n    }\n    return Promise.resolve();\n  }\n}\nEMEController.CDMCleanupPromise = void 0;\nfunction 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 arrayToHex(decryptdata.keyId);\n}\nfunction getKeyStatus(decryptdata, keyContext) {\n  if (decryptdata.keyId && keyContext.mediaKeysSession.keyStatuses.has(decryptdata.keyId)) {\n    return keyContext.mediaKeysSession.keyStatuses.get(decryptdata.keyId);\n  }\n  if (decryptdata.matches(keyContext.decryptdata)) {\n    return keyContext.keyStatus;\n  }\n  return void 0;\n}\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}\nfunction getKeyStatusError(keyStatus, decryptdata) {\n  const outputRestricted = keyStatus === \"output-restricted\";\n  const details = outputRestricted ? ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED : ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR;\n  return new EMEKeyError({\n    type: ErrorTypes.KEY_SYSTEM_ERROR,\n    details,\n    fatal: false,\n    decryptdata\n  }, outputRestricted ? \"HDCP level output restricted\" : `key status changed to \"${keyStatus}\"`);\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    this.hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n  unregisterListeners() {\n    this.hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n    this.hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, 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  onMediaDetaching() {\n    this.media = null;\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            hls.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}\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, enterHandler) {\n  const mode = track.mode;\n  if (mode === \"disabled\") {\n    track.mode = \"hidden\";\n  }\n  if (track.cues) {\n    for (let i = track.cues.length; i--; ) {\n      if (enterHandler) {\n        track.cues[i].removeEventListener(\"enter\", enterHandler);\n      }\n      track.removeCue(track.cues[i]);\n    }\n  }\n  if (mode === \"disabled\") {\n    track.mode = mode;\n  }\n}\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 getFirstCueIndexFromTime(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  let mid;\n  while (left <= right) {\n    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 = getFirstCueIndexFromTime(cues, start);\n  if (firstCueInRange > -1) {\n    for (let i = firstCueInRange, len = cues.length; i < len; i++) {\n      const cue = cues[i];\n      if (cue.startTime >= start && cue.endTime <= end) {\n        cuesFound.push(cue);\n      } else if (cue.startTime > end) {\n        return cuesFound;\n      }\n    }\n  }\n  return cuesFound;\n}\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}\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.useTextTrackPolling = false;\n    this.subtitlePollingInterval = -1;\n    this._subtitleDisplay = true;\n    this.asyncPollTrackChange = () => this.pollTrackChange(0);\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  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(event, data) {\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    const transferringMedia = !!data.transferMedia;\n    self.clearInterval(this.subtitlePollingInterval);\n    if (!this.useTextTrackPolling) {\n      media.textTracks.removeEventListener(\"change\", this.asyncPollTrackChange);\n    }\n    if (this.trackId > -1) {\n      this.queuedDefaultTrack = this.trackId;\n    }\n    this.subtitleTrack = -1;\n    this.media = null;\n    if (transferringMedia) {\n      return;\n    }\n    const textTracks = filterSubtitleTracks(media.textTracks);\n    textTracks.forEach((track) => {\n      clearCurrentCues(track);\n    });\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  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    }\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 subtitleTracks() {\n    return this.tracksInGroup;\n  }\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      if (subtitleOption.id === -1) {\n        this.setSubtitleTrack(-1);\n        return null;\n      }\n      const allSubtitleTracks = this.allSubtitleTracks;\n      this.selectDefaultTrack = false;\n      if (allSubtitleTracks.length) {\n        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    if (this.shouldLoadPlaylist(this.currentTrack)) {\n      this.scheduleLoading(this.currentTrack, hlsUrlParameters);\n    }\n  }\n  loadingPlaylist(currentTrack, hlsUrlParameters) {\n    super.loadingPlaylist(currentTrack, hlsUrlParameters);\n    const id = currentTrack.id;\n    const groupId = currentTrack.groupId;\n    const url = this.getUrlWithDirectives(currentTrack.url, hlsUrlParameters);\n    const details = currentTrack.details;\n    const age = details == null ? void 0 : details.age;\n    this.log(`Loading subtitle ${id} \"${currentTrack.name}\" lang:${currentTrack.lang} group:${groupId}${(hlsUrlParameters == null ? void 0 : hlsUrlParameters.msn) !== void 0 ? \" at sn \" + hlsUrlParameters.msn + \" part \" + hlsUrlParameters.part : \"\"}${age && details.live ? \" age \" + age.toFixed(1) + (details.type ? \" \" + details.type || \"\" : \"\") : \"\"} ${url}`);\n    this.hls.trigger(Events.SUBTITLE_TRACK_LOADING, {\n      url,\n      id,\n      groupId,\n      deliveryDirectives: hlsUrlParameters || null,\n      track: currentTrack\n    });\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  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.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, track.details);\n    this.loadPlaylist(hlsUrlParameters);\n  }\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 = 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}\nfunction hash(text) {\n  let hash2 = 5381;\n  let i = text.length;\n  while (i) {\n    hash2 = hash2 * 33 ^ text.charCodeAt(--i);\n  }\n  return (hash2 >>> 0).toString();\n}\nconst ALIGNED_END_THRESHOLD_SECONDS = 0.025;\nlet TimelineOccupancy = /* @__PURE__ */ function(TimelineOccupancy2) {\n  TimelineOccupancy2[TimelineOccupancy2[\"Point\"] = 0] = \"Point\";\n  TimelineOccupancy2[TimelineOccupancy2[\"Range\"] = 1] = \"Range\";\n  return TimelineOccupancy2;\n}({});\nfunction generateAssetIdentifier(interstitial, uri, assetListIndex) {\n  return `${interstitial.identifier}-${assetListIndex + 1}-${hash(uri)}`;\n}\nclass InterstitialEvent {\n  constructor(dateRange, base) {\n    this.base = void 0;\n    this._duration = null;\n    this._timelineStart = null;\n    this.appendInPlaceDisabled = void 0;\n    this.appendInPlaceStarted = void 0;\n    this.dateRange = void 0;\n    this.hasPlayed = false;\n    this.cumulativeDuration = 0;\n    this.resumeOffset = NaN;\n    this.playoutLimit = NaN;\n    this.restrictions = {\n      skip: false,\n      jump: false\n    };\n    this.snapOptions = {\n      out: false,\n      in: false\n    };\n    this.assetList = [];\n    this.assetListLoader = void 0;\n    this.assetListResponse = null;\n    this.resumeAnchor = void 0;\n    this.error = void 0;\n    this.resetOnResume = void 0;\n    this.base = base;\n    this.dateRange = dateRange;\n    this.setDateRange(dateRange);\n  }\n  setDateRange(dateRange) {\n    this.dateRange = dateRange;\n    this.resumeOffset = dateRange.attr.optionalFloat(\"X-RESUME-OFFSET\", this.resumeOffset);\n    this.playoutLimit = dateRange.attr.optionalFloat(\"X-PLAYOUT-LIMIT\", this.playoutLimit);\n    this.restrictions = dateRange.attr.enumeratedStringList(\"X-RESTRICT\", this.restrictions);\n    this.snapOptions = dateRange.attr.enumeratedStringList(\"X-SNAP\", this.snapOptions);\n  }\n  reset() {\n    var _this$assetListLoader;\n    this.appendInPlaceStarted = false;\n    (_this$assetListLoader = this.assetListLoader) == null || _this$assetListLoader.destroy();\n    this.assetListLoader = void 0;\n    if (!this.supplementsPrimary) {\n      this.assetListResponse = null;\n      this.assetList = [];\n      this._duration = null;\n    }\n  }\n  isAssetPastPlayoutLimit(assetIndex) {\n    var _this$assetList$asset;\n    if (assetIndex > 0 && assetIndex >= this.assetList.length) {\n      return true;\n    }\n    const playoutLimit = this.playoutLimit;\n    if (assetIndex <= 0 || isNaN(playoutLimit)) {\n      return false;\n    }\n    if (playoutLimit === 0) {\n      return true;\n    }\n    const assetOffset = ((_this$assetList$asset = this.assetList[assetIndex]) == null ? void 0 : _this$assetList$asset.startOffset) || 0;\n    return assetOffset > playoutLimit;\n  }\n  findAssetIndex(asset) {\n    const index = this.assetList.indexOf(asset);\n    return index;\n  }\n  get identifier() {\n    return this.dateRange.id;\n  }\n  get startDate() {\n    return this.dateRange.startDate;\n  }\n  get startTime() {\n    const startTime = this.dateRange.startTime;\n    if (this.snapOptions.out) {\n      const frag = this.dateRange.tagAnchor;\n      if (frag) {\n        return getSnapToFragmentTime(startTime, frag);\n      }\n    }\n    return startTime;\n  }\n  get startOffset() {\n    return this.cue.pre ? 0 : this.startTime;\n  }\n  get startIsAligned() {\n    if (this.startTime === 0 || this.snapOptions.out) {\n      return true;\n    }\n    const frag = this.dateRange.tagAnchor;\n    if (frag) {\n      const startTime = this.dateRange.startTime;\n      const snappedStart = getSnapToFragmentTime(startTime, frag);\n      return startTime - snappedStart < 0.1;\n    }\n    return false;\n  }\n  get resumptionOffset() {\n    const resumeOffset = this.resumeOffset;\n    const offset = isFiniteNumber(resumeOffset) ? resumeOffset : this.duration;\n    return this.cumulativeDuration + offset;\n  }\n  get resumeTime() {\n    const resumeTime = this.startOffset + this.resumptionOffset;\n    if (this.snapOptions.in) {\n      const frag = this.resumeAnchor;\n      if (frag) {\n        return getSnapToFragmentTime(resumeTime, frag);\n      }\n    }\n    return resumeTime;\n  }\n  get appendInPlace() {\n    if (this.appendInPlaceStarted) {\n      return true;\n    }\n    if (this.appendInPlaceDisabled) {\n      return false;\n    }\n    if (!this.cue.once && !this.cue.pre && this.startIsAligned && (isNaN(this.playoutLimit) && isNaN(this.resumeOffset) || this.resumeOffset && this.duration && Math.abs(this.resumeOffset - this.duration) < ALIGNED_END_THRESHOLD_SECONDS)) {\n      return true;\n    }\n    return false;\n  }\n  set appendInPlace(value) {\n    if (this.appendInPlaceStarted) {\n      this.resetOnResume = !value;\n      return;\n    }\n    this.appendInPlaceDisabled = !value;\n  }\n  get timelineStart() {\n    if (this._timelineStart !== null) {\n      return this._timelineStart;\n    }\n    return this.startTime;\n  }\n  set timelineStart(value) {\n    this._timelineStart = value;\n  }\n  get duration() {\n    const playoutLimit = this.playoutLimit;\n    let duration;\n    if (this._duration !== null) {\n      duration = this._duration;\n    } else if (this.dateRange.duration) {\n      duration = this.dateRange.duration;\n    } else {\n      duration = this.dateRange.plannedDuration || 0;\n    }\n    if (!isNaN(playoutLimit) && playoutLimit < duration) {\n      duration = playoutLimit;\n    }\n    return duration;\n  }\n  set duration(value) {\n    this._duration = value;\n  }\n  get cue() {\n    return this.dateRange.cue;\n  }\n  get timelineOccupancy() {\n    if (this.dateRange.attr[\"X-TIMELINE-OCCUPIES\"] === \"RANGE\") {\n      return TimelineOccupancy.Range;\n    }\n    return TimelineOccupancy.Point;\n  }\n  get supplementsPrimary() {\n    return this.dateRange.attr[\"X-TIMELINE-STYLE\"] === \"PRIMARY\";\n  }\n  get contentMayVary() {\n    return this.dateRange.attr[\"X-CONTENT-MAY-VARY\"] !== \"NO\";\n  }\n  get assetUrl() {\n    return this.dateRange.attr[\"X-ASSET-URI\"];\n  }\n  get assetListUrl() {\n    return this.dateRange.attr[\"X-ASSET-LIST\"];\n  }\n  get baseUrl() {\n    return this.base.url;\n  }\n  get assetListLoaded() {\n    return this.assetList.length > 0 || this.assetListResponse !== null;\n  }\n  toString() {\n    return eventToString(this);\n  }\n}\nfunction getSnapToFragmentTime(time, frag) {\n  return time - frag.start < frag.duration / 2 && !(Math.abs(time - (frag.start + frag.duration)) < ALIGNED_END_THRESHOLD_SECONDS) ? frag.start : frag.start + frag.duration;\n}\nfunction getInterstitialUrl(uri, sessionId, baseUrl) {\n  const url = new self.URL(uri, baseUrl);\n  if (url.protocol !== \"data:\") {\n    url.searchParams.set(\"_HLS_primary_id\", sessionId);\n  }\n  return url;\n}\nfunction getNextAssetIndex(interstitial, assetListIndex) {\n  while ((_interstitial$assetLi = interstitial.assetList[++assetListIndex]) != null && _interstitial$assetLi.error) {\n    var _interstitial$assetLi;\n  }\n  return assetListIndex;\n}\nfunction eventToString(interstitial) {\n  return `[\"${interstitial.identifier}\" ${interstitial.cue.pre ? \"<pre>\" : interstitial.cue.post ? \"<post>\" : \"\"}${interstitial.timelineStart.toFixed(2)}-${interstitial.resumeTime.toFixed(2)}]`;\n}\nfunction eventAssetToString(asset) {\n  const start = asset.timelineStart;\n  const duration = asset.duration || 0;\n  return `[\"${asset.identifier}\" ${start.toFixed(2)}-${(start + duration).toFixed(2)}]`;\n}\nclass HlsAssetPlayer {\n  constructor(HlsPlayerClass, userConfig, interstitial, assetItem) {\n    this.hls = void 0;\n    this.interstitial = void 0;\n    this.assetItem = void 0;\n    this.tracks = null;\n    this.hasDetails = false;\n    this.mediaAttached = null;\n    this._currentTime = void 0;\n    this._bufferedEosTime = void 0;\n    this.checkPlayout = () => {\n      if (this.reachedPlayout(this.currentTime) && this.hls) {\n        this.hls.trigger(Events.PLAYOUT_LIMIT_REACHED, {});\n      }\n    };\n    const hls = this.hls = new HlsPlayerClass(userConfig);\n    this.interstitial = interstitial;\n    this.assetItem = assetItem;\n    const detailsLoaded = () => {\n      this.hasDetails = true;\n    };\n    hls.once(Events.LEVEL_LOADED, detailsLoaded);\n    hls.once(Events.AUDIO_TRACK_LOADED, detailsLoaded);\n    hls.once(Events.SUBTITLE_TRACK_LOADED, detailsLoaded);\n    hls.on(Events.MEDIA_ATTACHING, (name, {\n      media\n    }) => {\n      this.removeMediaListeners();\n      this.mediaAttached = media;\n      const event = this.interstitial;\n      if (event.playoutLimit) {\n        media.addEventListener(\"timeupdate\", this.checkPlayout);\n        if (this.appendInPlace) {\n          hls.on(Events.BUFFER_APPENDED, () => {\n            const bufferedEnd = this.bufferedEnd;\n            if (this.reachedPlayout(bufferedEnd)) {\n              this._bufferedEosTime = bufferedEnd;\n              hls.trigger(Events.BUFFERED_TO_END, void 0);\n            }\n          });\n        }\n      }\n    });\n  }\n  get appendInPlace() {\n    return this.interstitial.appendInPlace;\n  }\n  loadSource() {\n    const hls = this.hls;\n    if (!hls) {\n      return;\n    }\n    if (!hls.url) {\n      let uri = this.assetItem.uri;\n      try {\n        uri = getInterstitialUrl(uri, hls.config.primarySessionId || \"\").href;\n      } catch (error) {\n      }\n      hls.loadSource(uri);\n    } else if (hls.levels.length && !hls.started) {\n      hls.startLoad(-1, true);\n    }\n  }\n  bufferedInPlaceToEnd(media) {\n    var _this$hls;\n    if (!this.appendInPlace) {\n      return false;\n    }\n    if ((_this$hls = this.hls) != null && _this$hls.bufferedToEnd) {\n      return true;\n    }\n    if (!media) {\n      return false;\n    }\n    const duration = Math.min(this._bufferedEosTime || Infinity, this.duration);\n    const start = this.timelineOffset;\n    const bufferInfo = BufferHelper.bufferInfo(media, start, 0);\n    const bufferedEnd = this.getAssetTime(bufferInfo.end);\n    return bufferedEnd >= duration - 0.02;\n  }\n  reachedPlayout(time) {\n    const interstitial = this.interstitial;\n    const playoutLimit = interstitial.playoutLimit;\n    return this.startOffset + time >= playoutLimit;\n  }\n  get destroyed() {\n    var _this$hls2;\n    return !((_this$hls2 = this.hls) != null && _this$hls2.userConfig);\n  }\n  get assetId() {\n    return this.assetItem.identifier;\n  }\n  get interstitialId() {\n    return this.assetItem.parentIdentifier;\n  }\n  get media() {\n    var _this$hls3;\n    return ((_this$hls3 = this.hls) == null ? void 0 : _this$hls3.media) || null;\n  }\n  get bufferedEnd() {\n    const media = this.media || this.mediaAttached;\n    if (!media) {\n      if (this._bufferedEosTime) {\n        return this._bufferedEosTime;\n      }\n      return this.currentTime;\n    }\n    const bufferInfo = BufferHelper.bufferInfo(media, media.currentTime, 1e-3);\n    return this.getAssetTime(bufferInfo.end);\n  }\n  get currentTime() {\n    const media = this.media || this.mediaAttached;\n    if (!media) {\n      return this._currentTime || 0;\n    }\n    return this.getAssetTime(media.currentTime);\n  }\n  get duration() {\n    const duration = this.assetItem.duration;\n    if (!duration) {\n      return 0;\n    }\n    const playoutLimit = this.interstitial.playoutLimit;\n    if (playoutLimit) {\n      const assetPlayout = playoutLimit - this.startOffset;\n      if (assetPlayout > 0 && assetPlayout < duration) {\n        return assetPlayout;\n      }\n    }\n    return duration;\n  }\n  get remaining() {\n    const duration = this.duration;\n    if (!duration) {\n      return 0;\n    }\n    return Math.max(0, duration - this.currentTime);\n  }\n  get startOffset() {\n    return this.assetItem.startOffset;\n  }\n  get timelineOffset() {\n    var _this$hls4;\n    return ((_this$hls4 = this.hls) == null ? void 0 : _this$hls4.config.timelineOffset) || 0;\n  }\n  set timelineOffset(value) {\n    const timelineOffset = this.timelineOffset;\n    if (value !== timelineOffset) {\n      const diff = value - timelineOffset;\n      if (Math.abs(diff) > 1 / 9e4 && this.hls) {\n        if (this.hasDetails) {\n          throw new Error(`Cannot set timelineOffset after playlists are loaded`);\n        }\n        this.hls.config.timelineOffset = value;\n      }\n    }\n  }\n  getAssetTime(time) {\n    const timelineOffset = this.timelineOffset;\n    const duration = this.duration;\n    return Math.min(Math.max(0, time - timelineOffset), duration);\n  }\n  removeMediaListeners() {\n    const media = this.mediaAttached;\n    if (media) {\n      this._currentTime = media.currentTime;\n      this.bufferSnapShot();\n      media.removeEventListener(\"timeupdate\", this.checkPlayout);\n    }\n  }\n  bufferSnapShot() {\n    if (this.mediaAttached) {\n      var _this$hls5;\n      if ((_this$hls5 = this.hls) != null && _this$hls5.bufferedToEnd) {\n        this._bufferedEosTime = this.bufferedEnd;\n      }\n    }\n  }\n  destroy() {\n    this.removeMediaListeners();\n    if (this.hls) {\n      this.hls.destroy();\n    }\n    this.hls = null;\n    this.tracks = this.mediaAttached = this.checkPlayout = null;\n  }\n  attachMedia(data) {\n    var _this$hls6;\n    this.loadSource();\n    (_this$hls6 = this.hls) == null || _this$hls6.attachMedia(data);\n  }\n  detachMedia() {\n    var _this$hls7;\n    this.removeMediaListeners();\n    this.mediaAttached = null;\n    (_this$hls7 = this.hls) == null || _this$hls7.detachMedia();\n  }\n  resumeBuffering() {\n    var _this$hls8;\n    (_this$hls8 = this.hls) == null || _this$hls8.resumeBuffering();\n  }\n  pauseBuffering() {\n    var _this$hls9;\n    (_this$hls9 = this.hls) == null || _this$hls9.pauseBuffering();\n  }\n  transferMedia() {\n    var _this$hls0;\n    this.bufferSnapShot();\n    return ((_this$hls0 = this.hls) == null ? void 0 : _this$hls0.transferMedia()) || null;\n  }\n  resetDetails() {\n    const hls = this.hls;\n    if (hls && this.hasDetails) {\n      hls.stopLoad();\n      const deleteDetails = (obj) => delete obj.details;\n      hls.levels.forEach(deleteDetails);\n      hls.allAudioTracks.forEach(deleteDetails);\n      hls.allSubtitleTracks.forEach(deleteDetails);\n      this.hasDetails = false;\n    }\n  }\n  on(event, listener, context) {\n    var _this$hls1;\n    (_this$hls1 = this.hls) == null || _this$hls1.on(event, listener);\n  }\n  once(event, listener, context) {\n    var _this$hls10;\n    (_this$hls10 = this.hls) == null || _this$hls10.once(event, listener);\n  }\n  off(event, listener, context) {\n    var _this$hls11;\n    (_this$hls11 = this.hls) == null || _this$hls11.off(event, listener);\n  }\n  toString() {\n    var _this$hls12;\n    return `HlsAssetPlayer: ${eventAssetToString(this.assetItem)} ${(_this$hls12 = this.hls) == null ? void 0 : _this$hls12.sessionId} ${this.appendInPlace ? \"append-in-place\" : \"\"}`;\n  }\n}\nconst ABUTTING_THRESHOLD_SECONDS = 0.033;\nclass InterstitialsSchedule extends Logger {\n  constructor(onScheduleUpdate, logger2) {\n    super(\"interstitials-sched\", logger2);\n    this.onScheduleUpdate = void 0;\n    this.eventMap = {};\n    this.events = null;\n    this.items = null;\n    this.durations = {\n      primary: 0,\n      playout: 0,\n      integrated: 0\n    };\n    this.onScheduleUpdate = onScheduleUpdate;\n  }\n  destroy() {\n    this.reset();\n    this.onScheduleUpdate = null;\n  }\n  reset() {\n    this.eventMap = {};\n    this.setDurations(0, 0, 0);\n    if (this.events) {\n      this.events.forEach((interstitial) => interstitial.reset());\n    }\n    this.events = this.items = null;\n  }\n  resetErrorsInRange(start, end) {\n    if (this.events) {\n      return this.events.reduce((count, interstitial) => {\n        if (start <= interstitial.startOffset && end > interstitial.startOffset) {\n          delete interstitial.error;\n          return count + 1;\n        }\n        return count;\n      }, 0);\n    }\n    return 0;\n  }\n  get duration() {\n    const items = this.items;\n    return items ? items[items.length - 1].end : 0;\n  }\n  get length() {\n    return this.items ? this.items.length : 0;\n  }\n  getEvent(identifier) {\n    return identifier ? this.eventMap[identifier] || null : null;\n  }\n  hasEvent(identifier) {\n    return identifier in this.eventMap;\n  }\n  findItemIndex(item, time) {\n    if (item.event) {\n      return this.findEventIndex(item.event.identifier);\n    }\n    let index = -1;\n    if (item.nextEvent) {\n      index = this.findEventIndex(item.nextEvent.identifier) - 1;\n    } else if (item.previousEvent) {\n      index = this.findEventIndex(item.previousEvent.identifier) + 1;\n    }\n    const items = this.items;\n    if (items) {\n      if (!items[index]) {\n        if (time === void 0) {\n          time = item.start;\n        }\n        index = this.findItemIndexAtTime(time);\n      }\n      while (index >= 0 && (_items$index = items[index]) != null && _items$index.event) {\n        var _items$index;\n        index--;\n      }\n    }\n    return index;\n  }\n  findItemIndexAtTime(timelinePos, timelineType) {\n    const items = this.items;\n    if (items) {\n      for (let i = 0; i < items.length; i++) {\n        let timeRange = items[i];\n        if (timelineType && timelineType !== \"primary\") {\n          timeRange = timeRange[timelineType];\n        }\n        if (timelinePos === timeRange.start || timelinePos > timeRange.start && timelinePos < timeRange.end) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n  findJumpRestrictedIndex(startIndex, endIndex) {\n    const items = this.items;\n    if (items) {\n      for (let i = startIndex; i <= endIndex; i++) {\n        if (!items[i]) {\n          break;\n        }\n        const event = items[i].event;\n        if (event != null && event.restrictions.jump && !event.appendInPlace) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n  findEventIndex(identifier) {\n    const items = this.items;\n    if (items) {\n      for (let i = items.length; i--; ) {\n        var _items$i$event;\n        if (((_items$i$event = items[i].event) == null ? void 0 : _items$i$event.identifier) === identifier) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n  findAssetIndex(event, timelinePos) {\n    const assetList = event.assetList;\n    const length = assetList.length;\n    if (length > 1) {\n      for (let i = 0; i < length; i++) {\n        const asset = assetList[i];\n        if (!asset.error) {\n          const timelineStart = asset.timelineStart;\n          if (timelinePos === timelineStart || timelinePos > timelineStart && (timelinePos < timelineStart + (asset.duration || 0) || i === length - 1)) {\n            return i;\n          }\n        }\n      }\n    }\n    return 0;\n  }\n  get assetIdAtEnd() {\n    var _this$items;\n    const interstitialAtEnd = (_this$items = this.items) == null || (_this$items = _this$items[this.length - 1]) == null ? void 0 : _this$items.event;\n    if (interstitialAtEnd) {\n      const assetList = interstitialAtEnd.assetList;\n      const assetAtEnd = assetList[assetList.length - 1];\n      if (assetAtEnd) {\n        return assetAtEnd.identifier;\n      }\n    }\n    return null;\n  }\n  parseInterstitialDateRanges(mediaSelection, enableAppendInPlace) {\n    const details = mediaSelection.main.details;\n    const {\n      dateRanges\n    } = details;\n    const previousInterstitialEvents = this.events;\n    const interstitialEvents = this.parseDateRanges(dateRanges, {\n      url: details.url\n    }, enableAppendInPlace);\n    const ids = Object.keys(dateRanges);\n    const removedInterstitials = previousInterstitialEvents ? previousInterstitialEvents.filter((event) => !ids.includes(event.identifier)) : [];\n    if (interstitialEvents.length) {\n      interstitialEvents.sort((a, b) => {\n        const aPre = a.cue.pre;\n        const aPost = a.cue.post;\n        const bPre = b.cue.pre;\n        const bPost = b.cue.post;\n        if (aPre && !bPre) {\n          return -1;\n        }\n        if (bPre && !aPre) {\n          return 1;\n        }\n        if (aPost && !bPost) {\n          return 1;\n        }\n        if (bPost && !aPost) {\n          return -1;\n        }\n        if (!aPre && !bPre && !aPost && !bPost) {\n          const startA = a.startTime;\n          const startB = b.startTime;\n          if (startA !== startB) {\n            return startA - startB;\n          }\n        }\n        return a.dateRange.tagOrder - b.dateRange.tagOrder;\n      });\n    }\n    this.events = interstitialEvents;\n    removedInterstitials.forEach((interstitial) => {\n      this.removeEvent(interstitial);\n    });\n    this.updateSchedule(mediaSelection, removedInterstitials);\n  }\n  updateSchedule(mediaSelection, removedInterstitials = [], forceUpdate = false) {\n    const events = this.events || [];\n    if (events.length || removedInterstitials.length || this.length < 2) {\n      const currentItems = this.items;\n      const updatedItems = this.parseSchedule(events, mediaSelection);\n      const updated = forceUpdate || removedInterstitials.length || (currentItems == null ? void 0 : currentItems.length) !== updatedItems.length || updatedItems.some((item, i) => {\n        return Math.abs(item.playout.start - currentItems[i].playout.start) > 5e-3 || Math.abs(item.playout.end - currentItems[i].playout.end) > 5e-3;\n      });\n      if (updated) {\n        this.items = updatedItems;\n        this.onScheduleUpdate(removedInterstitials, currentItems);\n      }\n    }\n  }\n  parseDateRanges(dateRanges, baseData, enableAppendInPlace) {\n    const interstitialEvents = [];\n    const ids = Object.keys(dateRanges);\n    for (let i = 0; i < ids.length; i++) {\n      const id = ids[i];\n      const dateRange = dateRanges[id];\n      if (dateRange.isInterstitial) {\n        let interstitial = this.eventMap[id];\n        if (interstitial) {\n          interstitial.setDateRange(dateRange);\n        } else {\n          interstitial = new InterstitialEvent(dateRange, baseData);\n          this.eventMap[id] = interstitial;\n          if (enableAppendInPlace === false) {\n            interstitial.appendInPlace = enableAppendInPlace;\n          }\n        }\n        interstitialEvents.push(interstitial);\n      }\n    }\n    return interstitialEvents;\n  }\n  parseSchedule(interstitialEvents, mediaSelection) {\n    const schedule = [];\n    const details = mediaSelection.main.details;\n    const primaryDuration = details.live ? Infinity : details.edge;\n    let playoutDuration = 0;\n    interstitialEvents = interstitialEvents.filter((event) => !event.error && !(event.cue.once && event.hasPlayed));\n    if (interstitialEvents.length) {\n      this.resolveOffsets(interstitialEvents, mediaSelection);\n      let primaryPosition = 0;\n      let integratedTime = 0;\n      interstitialEvents.forEach((interstitial, i) => {\n        const preroll = interstitial.cue.pre;\n        const postroll = interstitial.cue.post;\n        const previousEvent = interstitialEvents[i - 1] || null;\n        const appendInPlace = interstitial.appendInPlace;\n        const eventStart = postroll ? primaryDuration : interstitial.startOffset;\n        const interstitialDuration = interstitial.duration;\n        const timelineDuration = interstitial.timelineOccupancy === TimelineOccupancy.Range ? interstitialDuration : 0;\n        const resumptionOffset = interstitial.resumptionOffset;\n        const inSameStartTimeSequence = (previousEvent == null ? void 0 : previousEvent.startTime) === eventStart;\n        const start = eventStart + interstitial.cumulativeDuration;\n        let end = appendInPlace ? start + interstitialDuration : eventStart + resumptionOffset;\n        if (preroll || !postroll && eventStart <= 0) {\n          const integratedStart = integratedTime;\n          integratedTime += timelineDuration;\n          interstitial.timelineStart = start;\n          const playoutStart = playoutDuration;\n          playoutDuration += interstitialDuration;\n          schedule.push({\n            event: interstitial,\n            start,\n            end,\n            playout: {\n              start: playoutStart,\n              end: playoutDuration\n            },\n            integrated: {\n              start: integratedStart,\n              end: integratedTime\n            }\n          });\n        } else if (eventStart <= primaryDuration) {\n          if (!inSameStartTimeSequence) {\n            const segmentDuration = eventStart - primaryPosition;\n            if (segmentDuration > ABUTTING_THRESHOLD_SECONDS) {\n              const timelineStart = primaryPosition;\n              const _integratedStart = integratedTime;\n              integratedTime += segmentDuration;\n              const _playoutStart = playoutDuration;\n              playoutDuration += segmentDuration;\n              const primarySegment = {\n                previousEvent: interstitialEvents[i - 1] || null,\n                nextEvent: interstitial,\n                start: timelineStart,\n                end: timelineStart + segmentDuration,\n                playout: {\n                  start: _playoutStart,\n                  end: playoutDuration\n                },\n                integrated: {\n                  start: _integratedStart,\n                  end: integratedTime\n                }\n              };\n              schedule.push(primarySegment);\n            } else if (segmentDuration > 0 && previousEvent) {\n              previousEvent.cumulativeDuration += segmentDuration;\n              schedule[schedule.length - 1].end = eventStart;\n            }\n          }\n          if (postroll) {\n            end = start;\n          }\n          interstitial.timelineStart = start;\n          const integratedStart = integratedTime;\n          integratedTime += timelineDuration;\n          const playoutStart = playoutDuration;\n          playoutDuration += interstitialDuration;\n          schedule.push({\n            event: interstitial,\n            start,\n            end,\n            playout: {\n              start: playoutStart,\n              end: playoutDuration\n            },\n            integrated: {\n              start: integratedStart,\n              end: integratedTime\n            }\n          });\n        } else {\n          return;\n        }\n        const resumeTime = interstitial.resumeTime;\n        if (postroll || resumeTime > primaryDuration) {\n          primaryPosition = primaryDuration;\n        } else {\n          primaryPosition = resumeTime;\n        }\n      });\n      if (primaryPosition < primaryDuration) {\n        var _schedule;\n        const timelineStart = primaryPosition;\n        const integratedStart = integratedTime;\n        const segmentDuration = primaryDuration - primaryPosition;\n        integratedTime += segmentDuration;\n        const playoutStart = playoutDuration;\n        playoutDuration += segmentDuration;\n        schedule.push({\n          previousEvent: ((_schedule = schedule[schedule.length - 1]) == null ? void 0 : _schedule.event) || null,\n          nextEvent: null,\n          start: primaryPosition,\n          end: timelineStart + segmentDuration,\n          playout: {\n            start: playoutStart,\n            end: playoutDuration\n          },\n          integrated: {\n            start: integratedStart,\n            end: integratedTime\n          }\n        });\n      }\n      this.setDurations(primaryDuration, playoutDuration, integratedTime);\n    } else {\n      const start = 0;\n      schedule.push({\n        previousEvent: null,\n        nextEvent: null,\n        start,\n        end: primaryDuration,\n        playout: {\n          start,\n          end: primaryDuration\n        },\n        integrated: {\n          start,\n          end: primaryDuration\n        }\n      });\n      this.setDurations(primaryDuration, primaryDuration, primaryDuration);\n    }\n    return schedule;\n  }\n  setDurations(primary, playout, integrated) {\n    this.durations = {\n      primary,\n      playout,\n      integrated\n    };\n  }\n  resolveOffsets(interstitialEvents, mediaSelection) {\n    const details = mediaSelection.main.details;\n    const primaryDuration = details.live ? Infinity : details.edge;\n    let cumulativeDuration = 0;\n    let lastScheduledStart = -1;\n    interstitialEvents.forEach((interstitial, i) => {\n      const preroll = interstitial.cue.pre;\n      const postroll = interstitial.cue.post;\n      const eventStart = preroll ? 0 : postroll ? primaryDuration : interstitial.startTime;\n      this.updateAssetDurations(interstitial);\n      const inSameStartTimeSequence = lastScheduledStart === eventStart;\n      if (inSameStartTimeSequence) {\n        interstitial.cumulativeDuration = cumulativeDuration;\n      } else {\n        cumulativeDuration = 0;\n        lastScheduledStart = eventStart;\n      }\n      if (!postroll && interstitial.snapOptions.in) {\n        interstitial.resumeAnchor = findFragmentByPTS(null, details.fragments, interstitial.startOffset + interstitial.resumptionOffset, 0, 0) || void 0;\n      }\n      if (interstitial.appendInPlace && !interstitial.appendInPlaceStarted) {\n        const alignedSegmentStart = this.primaryCanResumeInPlaceAt(interstitial, mediaSelection);\n        if (!alignedSegmentStart) {\n          interstitial.appendInPlace = false;\n        }\n      }\n      if (!interstitial.appendInPlace && i + 1 < interstitialEvents.length) {\n        const timeBetween = interstitialEvents[i + 1].startTime - interstitialEvents[i].resumeTime;\n        if (timeBetween < ABUTTING_THRESHOLD_SECONDS) {\n          interstitialEvents[i + 1].appendInPlace = false;\n          if (interstitialEvents[i + 1].appendInPlace) {\n            this.warn(`Could not change append strategy for abutting event ${interstitial}`);\n          }\n        }\n      }\n      const resumeOffset = isFiniteNumber(interstitial.resumeOffset) ? interstitial.resumeOffset : interstitial.duration;\n      cumulativeDuration += resumeOffset;\n    });\n  }\n  primaryCanResumeInPlaceAt(interstitial, mediaSelection) {\n    const resumeTime = interstitial.resumeTime;\n    const resumesInPlaceAt = interstitial.startTime + interstitial.resumptionOffset;\n    if (Math.abs(resumeTime - resumesInPlaceAt) > ALIGNED_END_THRESHOLD_SECONDS) {\n      this.log(`\"${interstitial.identifier}\" resumption ${resumeTime} not aligned with estimated timeline end ${resumesInPlaceAt}`);\n      return false;\n    }\n    const playlists = Object.keys(mediaSelection);\n    return !playlists.some((playlistType) => {\n      const details = mediaSelection[playlistType].details;\n      const playlistEnd = details.edge;\n      if (resumeTime >= playlistEnd) {\n        this.log(`\"${interstitial.identifier}\" resumption ${resumeTime} past ${playlistType} playlist end ${playlistEnd}`);\n        return false;\n      }\n      const startFragment = findFragmentByPTS(null, details.fragments, resumeTime);\n      if (!startFragment) {\n        this.log(`\"${interstitial.identifier}\" resumption ${resumeTime} does not align with any fragments in ${playlistType} playlist (${details.fragStart}-${details.fragmentEnd})`);\n        return true;\n      }\n      const allowance = playlistType === \"audio\" ? 0.175 : 0;\n      const alignedWithSegment = Math.abs(startFragment.start - resumeTime) < ALIGNED_END_THRESHOLD_SECONDS + allowance || Math.abs(startFragment.end - resumeTime) < ALIGNED_END_THRESHOLD_SECONDS + allowance;\n      if (!alignedWithSegment) {\n        this.log(`\"${interstitial.identifier}\" resumption ${resumeTime} not aligned with ${playlistType} fragment bounds (${startFragment.start}-${startFragment.end} sn: ${startFragment.sn} cc: ${startFragment.cc})`);\n        return true;\n      }\n      return false;\n    });\n  }\n  updateAssetDurations(interstitial) {\n    if (!interstitial.assetListLoaded) {\n      return;\n    }\n    const eventStart = interstitial.timelineStart;\n    let sumDuration = 0;\n    let hasUnknownDuration = false;\n    let hasErrors = false;\n    for (let i = 0; i < interstitial.assetList.length; i++) {\n      const asset = interstitial.assetList[i];\n      const timelineStart = eventStart + sumDuration;\n      asset.startOffset = sumDuration;\n      asset.timelineStart = timelineStart;\n      hasUnknownDuration || (hasUnknownDuration = asset.duration === null);\n      hasErrors || (hasErrors = !!asset.error);\n      const duration = asset.error ? 0 : asset.duration || 0;\n      sumDuration += duration;\n    }\n    if (hasUnknownDuration && !hasErrors) {\n      interstitial.duration = Math.max(sumDuration, interstitial.duration);\n    } else {\n      interstitial.duration = sumDuration;\n    }\n  }\n  removeEvent(interstitial) {\n    interstitial.reset();\n    delete this.eventMap[interstitial.identifier];\n  }\n}\nfunction segmentToString(segment) {\n  return `[${segment.event ? '\"' + segment.event.identifier + '\"' : \"primary\"}: ${segment.start.toFixed(2)}-${segment.end.toFixed(2)}]`;\n}\nclass AssetListLoader {\n  constructor(hls) {\n    this.hls = void 0;\n    this.hls = hls;\n  }\n  destroy() {\n    this.hls = null;\n  }\n  loadAssetList(interstitial, hlsStartOffset) {\n    const assetListUrl = interstitial.assetListUrl;\n    let url;\n    try {\n      url = getInterstitialUrl(assetListUrl, this.hls.sessionId, interstitial.baseUrl);\n    } catch (error) {\n      const errorData = this.assignAssetListError(interstitial, ErrorDetails.ASSET_LIST_LOAD_ERROR, error, assetListUrl);\n      this.hls.trigger(Events.ERROR, errorData);\n      return;\n    }\n    if (hlsStartOffset && url.protocol !== \"data:\") {\n      url.searchParams.set(\"_HLS_start_offset\", \"\" + hlsStartOffset);\n    }\n    const config = this.hls.config;\n    const Loader = config.loader;\n    const loader = new Loader(config);\n    const context = {\n      responseType: \"json\",\n      url: url.href\n    };\n    const loadPolicy = config.interstitialAssetListLoadPolicy.default;\n    const loaderConfig = {\n      loadPolicy,\n      timeout: loadPolicy.maxLoadTimeMs,\n      maxRetry: 0,\n      retryDelay: 0,\n      maxRetryDelay: 0\n    };\n    const callbacks = {\n      onSuccess: (response, stats, context2, networkDetails) => {\n        const assetListResponse = response.data;\n        const assets = assetListResponse == null ? void 0 : assetListResponse.ASSETS;\n        if (!Array.isArray(assets)) {\n          const errorData = this.assignAssetListError(interstitial, ErrorDetails.ASSET_LIST_PARSING_ERROR, new Error(`Invalid interstitial asset list`), context2.url, stats, networkDetails);\n          this.hls.trigger(Events.ERROR, errorData);\n          return;\n        }\n        interstitial.assetListResponse = assetListResponse;\n        this.hls.trigger(Events.ASSET_LIST_LOADED, {\n          event: interstitial,\n          assetListResponse,\n          networkDetails\n        });\n      },\n      onError: (error, context2, networkDetails, stats) => {\n        const errorData = this.assignAssetListError(interstitial, ErrorDetails.ASSET_LIST_LOAD_ERROR, new Error(`Error loading X-ASSET-LIST: HTTP status ${error.code} ${error.text} (${context2.url})`), context2.url, stats, networkDetails);\n        this.hls.trigger(Events.ERROR, errorData);\n      },\n      onTimeout: (stats, context2, networkDetails) => {\n        const errorData = this.assignAssetListError(interstitial, ErrorDetails.ASSET_LIST_LOAD_TIMEOUT, new Error(`Timeout loading X-ASSET-LIST (${context2.url})`), context2.url, stats, networkDetails);\n        this.hls.trigger(Events.ERROR, errorData);\n      }\n    };\n    loader.load(context, loaderConfig, callbacks);\n    this.hls.trigger(Events.ASSET_LIST_LOADING, {\n      event: interstitial\n    });\n    return loader;\n  }\n  assignAssetListError(interstitial, details, error, url, stats, networkDetails) {\n    interstitial.error = error;\n    return {\n      type: ErrorTypes.NETWORK_ERROR,\n      details,\n      fatal: false,\n      interstitial,\n      url,\n      error,\n      networkDetails,\n      stats\n    };\n  }\n}\nfunction playWithCatch(media) {\n  var _media$play;\n  media == null || (_media$play = media.play()) == null || _media$play.catch(() => {\n  });\n}\nfunction timelineMessage(label, time) {\n  return `[${label}] Advancing timeline position to ${time}`;\n}\nclass InterstitialsController extends Logger {\n  constructor(hls, HlsPlayerClass) {\n    super(\"interstitials\", hls.logger);\n    this.HlsPlayerClass = void 0;\n    this.hls = void 0;\n    this.assetListLoader = void 0;\n    this.mediaSelection = null;\n    this.altSelection = null;\n    this.media = null;\n    this.detachedData = null;\n    this.requiredTracks = null;\n    this.manager = null;\n    this.playerQueue = [];\n    this.bufferedPos = -1;\n    this.timelinePos = -1;\n    this.schedule = void 0;\n    this.playingItem = null;\n    this.bufferingItem = null;\n    this.waitingItem = null;\n    this.endedItem = null;\n    this.playingAsset = null;\n    this.endedAsset = null;\n    this.bufferingAsset = null;\n    this.shouldPlay = false;\n    this.onPlay = () => {\n      this.shouldPlay = true;\n    };\n    this.onPause = () => {\n      this.shouldPlay = false;\n    };\n    this.onSeeking = () => {\n      const currentTime = this.currentTime;\n      if (currentTime === void 0 || this.playbackDisabled || !this.schedule) {\n        return;\n      }\n      const diff = currentTime - this.timelinePos;\n      const roundingError = Math.abs(diff) < 1 / 7056e5;\n      if (roundingError) {\n        return;\n      }\n      const backwardSeek = diff <= -0.01;\n      this.timelinePos = currentTime;\n      this.bufferedPos = currentTime;\n      const playingItem = this.playingItem;\n      if (!playingItem) {\n        this.checkBuffer();\n        return;\n      }\n      if (backwardSeek) {\n        const resetCount = this.schedule.resetErrorsInRange(currentTime, currentTime - diff);\n        if (resetCount) {\n          this.updateSchedule(true);\n        }\n      }\n      this.checkBuffer();\n      if (backwardSeek && currentTime < playingItem.start || currentTime >= playingItem.end) {\n        var _this$media;\n        const playingIndex = this.findItemIndex(playingItem);\n        let scheduleIndex = this.schedule.findItemIndexAtTime(currentTime);\n        if (scheduleIndex === -1) {\n          scheduleIndex = playingIndex + (backwardSeek ? -1 : 1);\n          this.log(`seeked ${backwardSeek ? \"back \" : \"\"}to position not covered by schedule ${currentTime} (resolving from ${playingIndex} to ${scheduleIndex})`);\n        }\n        if (!this.isInterstitial(playingItem) && (_this$media = this.media) != null && _this$media.paused) {\n          this.shouldPlay = false;\n        }\n        if (!backwardSeek) {\n          if (scheduleIndex > playingIndex) {\n            const jumpIndex = this.schedule.findJumpRestrictedIndex(playingIndex + 1, scheduleIndex);\n            if (jumpIndex > playingIndex) {\n              this.setSchedulePosition(jumpIndex);\n              return;\n            }\n          }\n        }\n        this.setSchedulePosition(scheduleIndex);\n        return;\n      }\n      const playingAsset = this.playingAsset;\n      if (!playingAsset) {\n        if (this.playingLastItem && this.isInterstitial(playingItem)) {\n          const restartAsset = playingItem.event.assetList[0];\n          if (restartAsset) {\n            this.endedItem = this.playingItem;\n            this.playingItem = null;\n            this.setScheduleToAssetAtTime(currentTime, restartAsset);\n          }\n        }\n        return;\n      }\n      const start = playingAsset.timelineStart;\n      const duration = playingAsset.duration || 0;\n      if (backwardSeek && currentTime < start || currentTime >= start + duration) {\n        var _playingItem$event;\n        if ((_playingItem$event = playingItem.event) != null && _playingItem$event.appendInPlace) {\n          this.clearAssetPlayers(playingItem.event, playingItem);\n          this.flushFrontBuffer(currentTime);\n        }\n        this.setScheduleToAssetAtTime(currentTime, playingAsset);\n      }\n    };\n    this.onTimeupdate = () => {\n      const currentTime = this.currentTime;\n      if (currentTime === void 0 || this.playbackDisabled) {\n        return;\n      }\n      if (currentTime > this.timelinePos) {\n        this.timelinePos = currentTime;\n        if (currentTime > this.bufferedPos) {\n          this.checkBuffer();\n        }\n      } else {\n        return;\n      }\n      const playingItem = this.playingItem;\n      if (!playingItem || this.playingLastItem) {\n        return;\n      }\n      if (currentTime >= playingItem.end) {\n        this.timelinePos = playingItem.end;\n        const playingIndex = this.findItemIndex(playingItem);\n        this.setSchedulePosition(playingIndex + 1);\n      }\n      const playingAsset = this.playingAsset;\n      if (!playingAsset) {\n        return;\n      }\n      const end = playingAsset.timelineStart + (playingAsset.duration || 0);\n      if (currentTime >= end) {\n        this.setScheduleToAssetAtTime(currentTime, playingAsset);\n      }\n    };\n    this.onScheduleUpdate = (removedInterstitials, previousItems) => {\n      const schedule = this.schedule;\n      if (!schedule) {\n        return;\n      }\n      const playingItem = this.playingItem;\n      const interstitialEvents = schedule.events || [];\n      const scheduleItems = schedule.items || [];\n      const durations = schedule.durations;\n      const removedIds = removedInterstitials.map((interstitial) => interstitial.identifier);\n      const interstitialsUpdated = !!(interstitialEvents.length || removedIds.length);\n      if (interstitialsUpdated || previousItems) {\n        this.log(`INTERSTITIALS_UPDATED (${interstitialEvents.length}): ${interstitialEvents}\nSchedule: ${scheduleItems.map((seg) => segmentToString(seg))} pos: ${this.timelinePos}`);\n      }\n      if (removedIds.length) {\n        this.log(`Removed events ${removedIds}`);\n      }\n      let updatedPlayingItem = null;\n      let updatedBufferingItem = null;\n      if (playingItem) {\n        updatedPlayingItem = this.updateItem(playingItem, this.timelinePos);\n        if (this.itemsMatch(playingItem, updatedPlayingItem)) {\n          this.playingItem = updatedPlayingItem;\n        } else {\n          this.waitingItem = this.endedItem = null;\n        }\n      }\n      this.waitingItem = this.updateItem(this.waitingItem);\n      this.endedItem = this.updateItem(this.endedItem);\n      const bufferingItem = this.bufferingItem;\n      if (bufferingItem) {\n        updatedBufferingItem = this.updateItem(bufferingItem, this.bufferedPos);\n        if (this.itemsMatch(bufferingItem, updatedBufferingItem)) {\n          this.bufferingItem = updatedBufferingItem;\n        } else if (bufferingItem.event) {\n          this.bufferingItem = this.playingItem;\n          this.clearInterstitial(bufferingItem.event, null);\n        }\n      }\n      removedInterstitials.forEach((interstitial) => {\n        interstitial.assetList.forEach((asset) => {\n          this.clearAssetPlayer(asset.identifier, null);\n        });\n      });\n      this.playerQueue.forEach((player) => {\n        if (player.interstitial.appendInPlace) {\n          const timelineStart = player.assetItem.timelineStart;\n          const diff = player.timelineOffset - timelineStart;\n          if (diff) {\n            try {\n              player.timelineOffset = timelineStart;\n            } catch (e) {\n              if (Math.abs(diff) > ALIGNED_END_THRESHOLD_SECONDS) {\n                this.warn(`${e} (\"${player.assetId}\" ${player.timelineOffset}->${timelineStart})`);\n              }\n            }\n          }\n        }\n      });\n      if (interstitialsUpdated || previousItems) {\n        this.hls.trigger(Events.INTERSTITIALS_UPDATED, {\n          events: interstitialEvents.slice(0),\n          schedule: scheduleItems.slice(0),\n          durations,\n          removedIds\n        });\n        if (this.isInterstitial(playingItem) && removedIds.includes(playingItem.event.identifier)) {\n          this.warn(`Interstitial \"${playingItem.event.identifier}\" removed while playing`);\n          this.primaryFallback(playingItem.event);\n          return;\n        }\n        if (playingItem) {\n          this.trimInPlace(updatedPlayingItem, playingItem);\n        }\n        if (bufferingItem && updatedBufferingItem !== updatedPlayingItem) {\n          this.trimInPlace(updatedBufferingItem, bufferingItem);\n        }\n        this.checkBuffer();\n      }\n    };\n    this.hls = hls;\n    this.HlsPlayerClass = HlsPlayerClass;\n    this.assetListLoader = new AssetListLoader(hls);\n    this.schedule = new InterstitialsSchedule(this.onScheduleUpdate, hls.logger);\n    this.registerListeners();\n  }\n  registerListeners() {\n    const hls = this.hls;\n    if (hls) {\n      hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n      hls.on(Events.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this);\n      hls.on(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n      hls.on(Events.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this);\n      hls.on(Events.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this);\n      hls.on(Events.ASSET_LIST_LOADED, this.onAssetListLoaded, this);\n      hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n      hls.on(Events.BUFFERED_TO_END, this.onBufferedToEnd, this);\n      hls.on(Events.MEDIA_ENDED, this.onMediaEnded, this);\n      hls.on(Events.ERROR, this.onError, this);\n      hls.on(Events.DESTROYING, this.onDestroying, this);\n    }\n  }\n  unregisterListeners() {\n    const hls = this.hls;\n    if (hls) {\n      hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n      hls.off(Events.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this);\n      hls.off(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n      hls.off(Events.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this);\n      hls.off(Events.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this);\n      hls.off(Events.ASSET_LIST_LOADED, this.onAssetListLoaded, this);\n      hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n      hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n      hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n      hls.off(Events.BUFFERED_TO_END, this.onBufferedToEnd, this);\n      hls.off(Events.MEDIA_ENDED, this.onMediaEnded, this);\n      hls.off(Events.ERROR, this.onError, this);\n      hls.off(Events.DESTROYING, this.onDestroying, this);\n    }\n  }\n  startLoad() {\n    this.resumeBuffering();\n  }\n  stopLoad() {\n    this.pauseBuffering();\n  }\n  resumeBuffering() {\n    var _this$getBufferingPla;\n    (_this$getBufferingPla = this.getBufferingPlayer()) == null || _this$getBufferingPla.resumeBuffering();\n  }\n  pauseBuffering() {\n    var _this$getBufferingPla2;\n    (_this$getBufferingPla2 = this.getBufferingPlayer()) == null || _this$getBufferingPla2.pauseBuffering();\n  }\n  destroy() {\n    this.unregisterListeners();\n    this.stopLoad();\n    if (this.assetListLoader) {\n      this.assetListLoader.destroy();\n    }\n    this.emptyPlayerQueue();\n    this.clearScheduleState();\n    if (this.schedule) {\n      this.schedule.destroy();\n    }\n    this.media = this.detachedData = this.mediaSelection = this.requiredTracks = this.altSelection = this.schedule = this.manager = null;\n    this.hls = this.HlsPlayerClass = this.log = null;\n    this.assetListLoader = null;\n    this.onPlay = this.onPause = this.onSeeking = this.onTimeupdate = null;\n    this.onScheduleUpdate = null;\n  }\n  onDestroying() {\n    const media = this.primaryMedia || this.media;\n    if (media) {\n      this.removeMediaListeners(media);\n    }\n  }\n  removeMediaListeners(media) {\n    removeEventListener(media, \"play\", this.onPlay);\n    removeEventListener(media, \"pause\", this.onPause);\n    removeEventListener(media, \"seeking\", this.onSeeking);\n    removeEventListener(media, \"timeupdate\", this.onTimeupdate);\n  }\n  onMediaAttaching(event, data) {\n    const media = this.media = data.media;\n    addEventListener(media, \"seeking\", this.onSeeking);\n    addEventListener(media, \"timeupdate\", this.onTimeupdate);\n    addEventListener(media, \"play\", this.onPlay);\n    addEventListener(media, \"pause\", this.onPause);\n  }\n  onMediaAttached(event, data) {\n    const playingItem = this.effectivePlayingItem;\n    const detachedMedia = this.detachedData;\n    this.detachedData = null;\n    if (playingItem === null) {\n      this.checkStart();\n    } else if (!detachedMedia) {\n      this.clearScheduleState();\n      const playingIndex = this.findItemIndex(playingItem);\n      this.setSchedulePosition(playingIndex);\n    }\n  }\n  clearScheduleState() {\n    this.log(`clear schedule state`);\n    this.playingItem = this.bufferingItem = this.waitingItem = this.endedItem = this.playingAsset = this.endedAsset = this.bufferingAsset = null;\n  }\n  onMediaDetaching(event, data) {\n    const transferringMedia = !!data.transferMedia;\n    const media = this.media;\n    this.media = null;\n    if (transferringMedia) {\n      return;\n    }\n    if (media) {\n      this.removeMediaListeners(media);\n    }\n    if (this.detachedData) {\n      const player = this.getBufferingPlayer();\n      if (player) {\n        this.log(`Removing schedule state for detachedData and ${player}`);\n        this.playingAsset = this.endedAsset = this.bufferingAsset = this.bufferingItem = this.waitingItem = this.detachedData = null;\n        player.detachMedia();\n      }\n      this.shouldPlay = false;\n    }\n  }\n  get interstitialsManager() {\n    if (!this.hls) {\n      return null;\n    }\n    if (this.manager) {\n      return this.manager;\n    }\n    const c = this;\n    const effectiveBufferingItem = () => c.bufferingItem || c.waitingItem;\n    const getAssetPlayer = (asset) => asset ? c.getAssetPlayer(asset.identifier) : asset;\n    const getMappedTime = (item, timelineType, asset, controllerField, assetPlayerField) => {\n      if (item) {\n        let time = item[timelineType].start;\n        const interstitial = item.event;\n        if (interstitial) {\n          if (timelineType === \"playout\" || interstitial.timelineOccupancy !== TimelineOccupancy.Point) {\n            const assetPlayer = getAssetPlayer(asset);\n            if ((assetPlayer == null ? void 0 : assetPlayer.interstitial) === interstitial) {\n              time += assetPlayer.assetItem.startOffset + assetPlayer[assetPlayerField];\n            }\n          }\n        } else {\n          const value = controllerField === \"bufferedPos\" ? getBufferedEnd() : c[controllerField];\n          time += value - item.start;\n        }\n        return time;\n      }\n      return 0;\n    };\n    const findMappedTime = (primaryTime, timelineType) => {\n      var _c$schedule;\n      if (primaryTime !== 0 && timelineType !== \"primary\" && (_c$schedule = c.schedule) != null && _c$schedule.length) {\n        var _c$schedule$items;\n        const index = c.schedule.findItemIndexAtTime(primaryTime);\n        const item = (_c$schedule$items = c.schedule.items) == null ? void 0 : _c$schedule$items[index];\n        if (item) {\n          const diff = item[timelineType].start - item.start;\n          return primaryTime + diff;\n        }\n      }\n      return primaryTime;\n    };\n    const getBufferedEnd = () => {\n      const value = c.bufferedPos;\n      if (value === Number.MAX_VALUE) {\n        return getMappedDuration(\"primary\");\n      }\n      return Math.max(value, 0);\n    };\n    const getMappedDuration = (timelineType) => {\n      var _c$primaryDetails, _c$schedule2;\n      if ((_c$primaryDetails = c.primaryDetails) != null && _c$primaryDetails.live) {\n        return c.primaryDetails.edge;\n      }\n      return ((_c$schedule2 = c.schedule) == null ? void 0 : _c$schedule2.durations[timelineType]) || 0;\n    };\n    const seekTo = (time, timelineType) => {\n      var _item$event, _c$schedule$items2;\n      const item = c.effectivePlayingItem;\n      if (item != null && (_item$event = item.event) != null && _item$event.restrictions.skip || !c.schedule) {\n        return;\n      }\n      c.log(`seek to ${time} \"${timelineType}\"`);\n      const playingItem = c.effectivePlayingItem;\n      const targetIndex = c.schedule.findItemIndexAtTime(time, timelineType);\n      const targetItem = (_c$schedule$items2 = c.schedule.items) == null ? void 0 : _c$schedule$items2[targetIndex];\n      const bufferingPlayer = c.getBufferingPlayer();\n      const bufferingInterstitial = bufferingPlayer == null ? void 0 : bufferingPlayer.interstitial;\n      const appendInPlace = bufferingInterstitial == null ? void 0 : bufferingInterstitial.appendInPlace;\n      const seekInItem = playingItem && c.itemsMatch(playingItem, targetItem);\n      if (playingItem && (appendInPlace || seekInItem)) {\n        const assetPlayer = getAssetPlayer(c.playingAsset);\n        const media = (assetPlayer == null ? void 0 : assetPlayer.media) || c.primaryMedia;\n        if (media) {\n          const currentTime = timelineType === \"primary\" ? media.currentTime : getMappedTime(playingItem, timelineType, c.playingAsset, \"timelinePos\", \"currentTime\");\n          const diff = time - currentTime;\n          const seekToTime = (appendInPlace ? currentTime : media.currentTime) + diff;\n          if (seekToTime >= 0 && (!assetPlayer || appendInPlace || seekToTime <= assetPlayer.duration)) {\n            media.currentTime = seekToTime;\n            return;\n          }\n        }\n      }\n      if (targetItem) {\n        let seekToTime = time;\n        if (timelineType !== \"primary\") {\n          const primarySegmentStart = targetItem[timelineType].start;\n          const diff = time - primarySegmentStart;\n          seekToTime = targetItem.start + diff;\n        }\n        const targetIsPrimary = !c.isInterstitial(targetItem);\n        if ((!c.isInterstitial(playingItem) || playingItem.event.appendInPlace) && (targetIsPrimary || targetItem.event.appendInPlace)) {\n          const media = c.media || (appendInPlace ? bufferingPlayer == null ? void 0 : bufferingPlayer.media : null);\n          if (media) {\n            media.currentTime = seekToTime;\n          }\n        } else if (playingItem) {\n          const playingIndex = c.findItemIndex(playingItem);\n          if (targetIndex > playingIndex) {\n            const jumpIndex = c.schedule.findJumpRestrictedIndex(playingIndex + 1, targetIndex);\n            if (jumpIndex > playingIndex) {\n              c.setSchedulePosition(jumpIndex);\n              return;\n            }\n          }\n          let assetIndex = 0;\n          if (targetIsPrimary) {\n            c.timelinePos = seekToTime;\n            c.checkBuffer();\n          } else {\n            const assetList = targetItem.event.assetList;\n            const eventTime = time - (targetItem[timelineType] || targetItem).start;\n            for (let i = assetList.length; i--; ) {\n              const asset = assetList[i];\n              if (asset.duration && eventTime >= asset.startOffset && eventTime < asset.startOffset + asset.duration) {\n                assetIndex = i;\n                break;\n              }\n            }\n          }\n          c.setSchedulePosition(targetIndex, assetIndex);\n        }\n      }\n    };\n    const getActiveInterstitial = () => {\n      const playingItem = c.effectivePlayingItem;\n      if (c.isInterstitial(playingItem)) {\n        return playingItem;\n      }\n      const bufferingItem = effectiveBufferingItem();\n      if (c.isInterstitial(bufferingItem)) {\n        return bufferingItem;\n      }\n      return null;\n    };\n    const interstitialPlayer = {\n      get bufferedEnd() {\n        const interstitialItem = effectiveBufferingItem();\n        const bufferingItem = c.bufferingItem;\n        if (bufferingItem && bufferingItem === interstitialItem) {\n          var _c$bufferingAsset;\n          return getMappedTime(bufferingItem, \"playout\", c.bufferingAsset, \"bufferedPos\", \"bufferedEnd\") - bufferingItem.playout.start || ((_c$bufferingAsset = c.bufferingAsset) == null ? void 0 : _c$bufferingAsset.startOffset) || 0;\n        }\n        return 0;\n      },\n      get currentTime() {\n        const interstitialItem = getActiveInterstitial();\n        const playingItem = c.effectivePlayingItem;\n        if (playingItem && playingItem === interstitialItem) {\n          return getMappedTime(playingItem, \"playout\", c.effectivePlayingAsset, \"timelinePos\", \"currentTime\") - playingItem.playout.start;\n        }\n        return 0;\n      },\n      set currentTime(time) {\n        const interstitialItem = getActiveInterstitial();\n        const playingItem = c.effectivePlayingItem;\n        if (playingItem && playingItem === interstitialItem) {\n          seekTo(time + playingItem.playout.start, \"playout\");\n        }\n      },\n      get duration() {\n        const interstitialItem = getActiveInterstitial();\n        if (interstitialItem) {\n          return interstitialItem.playout.end - interstitialItem.playout.start;\n        }\n        return 0;\n      },\n      get assetPlayers() {\n        var _getActiveInterstitia;\n        const assetList = (_getActiveInterstitia = getActiveInterstitial()) == null ? void 0 : _getActiveInterstitia.event.assetList;\n        if (assetList) {\n          return assetList.map((asset) => c.getAssetPlayer(asset.identifier));\n        }\n        return [];\n      },\n      get playingIndex() {\n        var _getActiveInterstitia2;\n        const interstitial = (_getActiveInterstitia2 = getActiveInterstitial()) == null ? void 0 : _getActiveInterstitia2.event;\n        if (interstitial && c.effectivePlayingAsset) {\n          return interstitial.findAssetIndex(c.effectivePlayingAsset);\n        }\n        return -1;\n      },\n      get scheduleItem() {\n        return getActiveInterstitial();\n      }\n    };\n    return this.manager = {\n      get events() {\n        var _c$schedule3;\n        return ((_c$schedule3 = c.schedule) == null || (_c$schedule3 = _c$schedule3.events) == null ? void 0 : _c$schedule3.slice(0)) || [];\n      },\n      get schedule() {\n        var _c$schedule4;\n        return ((_c$schedule4 = c.schedule) == null || (_c$schedule4 = _c$schedule4.items) == null ? void 0 : _c$schedule4.slice(0)) || [];\n      },\n      get interstitialPlayer() {\n        if (getActiveInterstitial()) {\n          return interstitialPlayer;\n        }\n        return null;\n      },\n      get playerQueue() {\n        return c.playerQueue.slice(0);\n      },\n      get bufferingAsset() {\n        return c.bufferingAsset;\n      },\n      get bufferingItem() {\n        return effectiveBufferingItem();\n      },\n      get bufferingIndex() {\n        const item = effectiveBufferingItem();\n        return c.findItemIndex(item);\n      },\n      get playingAsset() {\n        return c.effectivePlayingAsset;\n      },\n      get playingItem() {\n        return c.effectivePlayingItem;\n      },\n      get playingIndex() {\n        const item = c.effectivePlayingItem;\n        return c.findItemIndex(item);\n      },\n      primary: {\n        get bufferedEnd() {\n          return getBufferedEnd();\n        },\n        get currentTime() {\n          const timelinePos = c.timelinePos;\n          return timelinePos > 0 ? timelinePos : 0;\n        },\n        set currentTime(time) {\n          seekTo(time, \"primary\");\n        },\n        get duration() {\n          return getMappedDuration(\"primary\");\n        },\n        get seekableStart() {\n          var _c$primaryDetails2;\n          return ((_c$primaryDetails2 = c.primaryDetails) == null ? void 0 : _c$primaryDetails2.fragmentStart) || 0;\n        }\n      },\n      integrated: {\n        get bufferedEnd() {\n          return getMappedTime(effectiveBufferingItem(), \"integrated\", c.bufferingAsset, \"bufferedPos\", \"bufferedEnd\");\n        },\n        get currentTime() {\n          return getMappedTime(c.effectivePlayingItem, \"integrated\", c.effectivePlayingAsset, \"timelinePos\", \"currentTime\");\n        },\n        set currentTime(time) {\n          seekTo(time, \"integrated\");\n        },\n        get duration() {\n          return getMappedDuration(\"integrated\");\n        },\n        get seekableStart() {\n          var _c$primaryDetails3;\n          return findMappedTime(((_c$primaryDetails3 = c.primaryDetails) == null ? void 0 : _c$primaryDetails3.fragmentStart) || 0, \"integrated\");\n        }\n      },\n      skip: () => {\n        const item = c.effectivePlayingItem;\n        const event = item == null ? void 0 : item.event;\n        if (event && !event.restrictions.skip) {\n          const index = c.findItemIndex(item);\n          if (event.appendInPlace) {\n            const time = item.playout.start + item.event.duration;\n            seekTo(time + 1e-3, \"playout\");\n          } else {\n            c.advanceAfterAssetEnded(event, index, Infinity);\n          }\n        }\n      }\n    };\n  }\n  get effectivePlayingItem() {\n    return this.waitingItem || this.playingItem || this.endedItem;\n  }\n  get effectivePlayingAsset() {\n    return this.playingAsset || this.endedAsset;\n  }\n  get playingLastItem() {\n    var _this$schedule;\n    const playingItem = this.playingItem;\n    const items = (_this$schedule = this.schedule) == null ? void 0 : _this$schedule.items;\n    if (!this.playbackStarted || !playingItem || !items) {\n      return false;\n    }\n    return this.findItemIndex(playingItem) === items.length - 1;\n  }\n  get playbackStarted() {\n    return this.effectivePlayingItem !== null;\n  }\n  get currentTime() {\n    var _this$bufferingItem, _media;\n    if (this.mediaSelection === null) {\n      return void 0;\n    }\n    const queuedForPlayback = this.waitingItem || this.playingItem;\n    if (this.isInterstitial(queuedForPlayback) && !queuedForPlayback.event.appendInPlace) {\n      return void 0;\n    }\n    let media = this.media;\n    if (!media && (_this$bufferingItem = this.bufferingItem) != null && (_this$bufferingItem = _this$bufferingItem.event) != null && _this$bufferingItem.appendInPlace) {\n      media = this.primaryMedia;\n    }\n    const currentTime = (_media = media) == null ? void 0 : _media.currentTime;\n    if (currentTime === void 0 || !isFiniteNumber(currentTime)) {\n      return void 0;\n    }\n    return currentTime;\n  }\n  get primaryMedia() {\n    var _this$detachedData;\n    return this.media || ((_this$detachedData = this.detachedData) == null ? void 0 : _this$detachedData.media) || null;\n  }\n  isInterstitial(item) {\n    return !!(item != null && item.event);\n  }\n  retreiveMediaSource(assetId, toSegment) {\n    const player = this.getAssetPlayer(assetId);\n    if (player) {\n      this.transferMediaFromPlayer(player, toSegment);\n    }\n  }\n  transferMediaFromPlayer(player, toSegment) {\n    const appendInPlace = player.interstitial.appendInPlace;\n    const playerMedia = player.media;\n    if (appendInPlace && playerMedia === this.primaryMedia) {\n      this.bufferingAsset = null;\n      if (!toSegment || this.isInterstitial(toSegment) && !toSegment.event.appendInPlace) {\n        if (toSegment && playerMedia) {\n          this.detachedData = {\n            media: playerMedia\n          };\n          return;\n        }\n      }\n      const attachMediaSourceData = player.transferMedia();\n      this.log(`transfer MediaSource from ${player} ${stringify(attachMediaSourceData)}`);\n      this.detachedData = attachMediaSourceData;\n    } else if (toSegment && playerMedia) {\n      this.shouldPlay || (this.shouldPlay = !playerMedia.paused);\n    }\n  }\n  transferMediaTo(player, media) {\n    var _this$detachedData2, _attachMediaSourceDat;\n    if (player.media === media) {\n      return;\n    }\n    let attachMediaSourceData = null;\n    const primaryPlayer = this.hls;\n    const isAssetPlayer = player !== primaryPlayer;\n    const appendInPlace = isAssetPlayer && player.interstitial.appendInPlace;\n    const detachedMediaSource = (_this$detachedData2 = this.detachedData) == null ? void 0 : _this$detachedData2.mediaSource;\n    let logFromSource;\n    if (primaryPlayer.media) {\n      if (appendInPlace) {\n        attachMediaSourceData = primaryPlayer.transferMedia();\n        this.detachedData = attachMediaSourceData;\n      }\n      logFromSource = `Primary`;\n    } else if (detachedMediaSource) {\n      const bufferingPlayer = this.getBufferingPlayer();\n      if (bufferingPlayer) {\n        attachMediaSourceData = bufferingPlayer.transferMedia();\n        logFromSource = `${bufferingPlayer}`;\n      } else {\n        logFromSource = `detached MediaSource`;\n      }\n    } else {\n      logFromSource = `detached media`;\n    }\n    if (!attachMediaSourceData) {\n      if (detachedMediaSource) {\n        attachMediaSourceData = this.detachedData;\n        this.log(`using detachedData: MediaSource ${stringify(attachMediaSourceData)}`);\n      } else if (!this.detachedData || primaryPlayer.media === media) {\n        const playerQueue = this.playerQueue;\n        if (playerQueue.length > 1) {\n          playerQueue.forEach((queuedPlayer) => {\n            if (isAssetPlayer && queuedPlayer.interstitial.appendInPlace !== appendInPlace) {\n              const interstitial = queuedPlayer.interstitial;\n              this.clearInterstitial(queuedPlayer.interstitial, null);\n              interstitial.appendInPlace = false;\n              if (interstitial.appendInPlace) {\n                this.warn(`Could not change append strategy for queued assets ${interstitial}`);\n              }\n            }\n          });\n        }\n        this.hls.detachMedia();\n        this.detachedData = {\n          media\n        };\n      }\n    }\n    const transferring = attachMediaSourceData && \"mediaSource\" in attachMediaSourceData && ((_attachMediaSourceDat = attachMediaSourceData.mediaSource) == null ? void 0 : _attachMediaSourceDat.readyState) !== \"closed\";\n    const dataToAttach = transferring && attachMediaSourceData ? attachMediaSourceData : media;\n    this.log(`${transferring ? \"transfering MediaSource\" : \"attaching media\"} to ${isAssetPlayer ? player : \"Primary\"} from ${logFromSource} (media.currentTime: ${media.currentTime})`);\n    const schedule = this.schedule;\n    if (dataToAttach === attachMediaSourceData && schedule) {\n      const isAssetAtEndOfSchedule = isAssetPlayer && player.assetId === schedule.assetIdAtEnd;\n      dataToAttach.overrides = {\n        duration: schedule.duration,\n        endOfStream: !isAssetPlayer || isAssetAtEndOfSchedule,\n        cueRemoval: !isAssetPlayer\n      };\n    }\n    player.attachMedia(dataToAttach);\n  }\n  onInterstitialCueEnter() {\n    this.onTimeupdate();\n  }\n  checkStart() {\n    const schedule = this.schedule;\n    const interstitialEvents = schedule == null ? void 0 : schedule.events;\n    if (!interstitialEvents || this.playbackDisabled || !this.media) {\n      return;\n    }\n    if (this.bufferedPos === -1) {\n      this.bufferedPos = 0;\n    }\n    const timelinePos = this.timelinePos;\n    const effectivePlayingItem = this.effectivePlayingItem;\n    if (timelinePos === -1) {\n      const startPosition = this.hls.startPosition;\n      this.log(timelineMessage(\"checkStart\", startPosition));\n      this.timelinePos = startPosition;\n      if (interstitialEvents.length && interstitialEvents[0].cue.pre) {\n        const index = schedule.findEventIndex(interstitialEvents[0].identifier);\n        this.setSchedulePosition(index);\n      } else if (startPosition >= 0 || !this.primaryLive) {\n        const start = this.timelinePos = startPosition > 0 ? startPosition : 0;\n        const index = schedule.findItemIndexAtTime(start);\n        this.setSchedulePosition(index);\n      }\n    } else if (effectivePlayingItem && !this.playingItem) {\n      const index = schedule.findItemIndex(effectivePlayingItem);\n      this.setSchedulePosition(index);\n    }\n  }\n  advanceAssetBuffering(item, assetItem) {\n    const interstitial = item.event;\n    const assetListIndex = interstitial.findAssetIndex(assetItem);\n    const nextAssetIndex = getNextAssetIndex(interstitial, assetListIndex);\n    if (!interstitial.isAssetPastPlayoutLimit(nextAssetIndex)) {\n      this.bufferedToEvent(item, nextAssetIndex);\n    } else if (this.schedule) {\n      var _this$schedule$items;\n      const nextItem = (_this$schedule$items = this.schedule.items) == null ? void 0 : _this$schedule$items[this.findItemIndex(item) + 1];\n      if (nextItem) {\n        this.bufferedToItem(nextItem);\n      }\n    }\n  }\n  advanceAfterAssetEnded(interstitial, index, assetListIndex) {\n    const nextAssetIndex = getNextAssetIndex(interstitial, assetListIndex);\n    if (!interstitial.isAssetPastPlayoutLimit(nextAssetIndex)) {\n      if (interstitial.appendInPlace) {\n        const assetItem = interstitial.assetList[nextAssetIndex];\n        if (assetItem) {\n          this.advanceInPlace(assetItem.timelineStart);\n        }\n      }\n      this.setSchedulePosition(index, nextAssetIndex);\n    } else if (this.schedule) {\n      const scheduleItems = this.schedule.items;\n      if (scheduleItems) {\n        const nextIndex = index + 1;\n        const scheduleLength = scheduleItems.length;\n        if (nextIndex >= scheduleLength) {\n          this.setSchedulePosition(-1);\n          return;\n        }\n        const resumptionTime = interstitial.resumeTime;\n        if (this.timelinePos < resumptionTime) {\n          this.log(timelineMessage(\"advanceAfterAssetEnded\", resumptionTime));\n          this.timelinePos = resumptionTime;\n          if (interstitial.appendInPlace) {\n            this.advanceInPlace(resumptionTime);\n          }\n          this.checkBuffer(this.bufferedPos < resumptionTime);\n        }\n        this.setSchedulePosition(nextIndex);\n      }\n    }\n  }\n  setScheduleToAssetAtTime(time, playingAsset) {\n    const schedule = this.schedule;\n    if (!schedule) {\n      return;\n    }\n    const parentIdentifier = playingAsset.parentIdentifier;\n    const interstitial = schedule.getEvent(parentIdentifier);\n    if (interstitial) {\n      const itemIndex = schedule.findEventIndex(parentIdentifier);\n      const assetListIndex = schedule.findAssetIndex(interstitial, time);\n      this.advanceAfterAssetEnded(interstitial, itemIndex, assetListIndex - 1);\n    }\n  }\n  setSchedulePosition(index, assetListIndex) {\n    var _this$schedule2;\n    const scheduleItems = (_this$schedule2 = this.schedule) == null ? void 0 : _this$schedule2.items;\n    if (!scheduleItems || this.playbackDisabled) {\n      return;\n    }\n    const scheduledItem = index >= 0 ? scheduleItems[index] : null;\n    this.log(`setSchedulePosition ${index}, ${assetListIndex} (${scheduledItem ? segmentToString(scheduledItem) : scheduledItem}) pos: ${this.timelinePos}`);\n    const currentItem = this.waitingItem || this.playingItem;\n    const playingLastItem = this.playingLastItem;\n    if (this.isInterstitial(currentItem)) {\n      const interstitial = currentItem.event;\n      const playingAsset = this.playingAsset;\n      const assetId = playingAsset == null ? void 0 : playingAsset.identifier;\n      const player = assetId ? this.getAssetPlayer(assetId) : null;\n      if (player && assetId && (!this.eventItemsMatch(currentItem, scheduledItem) || assetListIndex !== void 0 && assetId !== interstitial.assetList[assetListIndex].identifier)) {\n        var _this$detachedData3;\n        const playingAssetListIndex = interstitial.findAssetIndex(playingAsset);\n        this.log(`INTERSTITIAL_ASSET_ENDED ${playingAssetListIndex + 1}/${interstitial.assetList.length} ${eventAssetToString(playingAsset)}`);\n        this.endedAsset = playingAsset;\n        this.playingAsset = null;\n        this.hls.trigger(Events.INTERSTITIAL_ASSET_ENDED, {\n          asset: playingAsset,\n          assetListIndex: playingAssetListIndex,\n          event: interstitial,\n          schedule: scheduleItems.slice(0),\n          scheduleIndex: index,\n          player\n        });\n        if (currentItem !== this.playingItem) {\n          if (this.itemsMatch(currentItem, this.playingItem) && !this.playingAsset) {\n            this.advanceAfterAssetEnded(interstitial, this.findItemIndex(this.playingItem), playingAssetListIndex);\n          }\n          return;\n        }\n        this.retreiveMediaSource(assetId, scheduledItem);\n        if (player.media && !((_this$detachedData3 = this.detachedData) != null && _this$detachedData3.mediaSource)) {\n          player.detachMedia();\n        }\n      }\n      if (!this.eventItemsMatch(currentItem, scheduledItem)) {\n        this.endedItem = currentItem;\n        this.playingItem = null;\n        this.log(`INTERSTITIAL_ENDED ${interstitial} ${segmentToString(currentItem)}`);\n        interstitial.hasPlayed = true;\n        this.hls.trigger(Events.INTERSTITIAL_ENDED, {\n          event: interstitial,\n          schedule: scheduleItems.slice(0),\n          scheduleIndex: index\n        });\n        if (interstitial.cue.once) {\n          var _this$schedule3;\n          this.updateSchedule();\n          const updatedScheduleItems = (_this$schedule3 = this.schedule) == null ? void 0 : _this$schedule3.items;\n          if (scheduledItem && updatedScheduleItems) {\n            const updatedIndex = this.findItemIndex(scheduledItem);\n            this.advanceSchedule(updatedIndex, updatedScheduleItems, assetListIndex, currentItem, playingLastItem);\n          }\n          return;\n        }\n      }\n    }\n    this.advanceSchedule(index, scheduleItems, assetListIndex, currentItem, playingLastItem);\n  }\n  advanceSchedule(index, scheduleItems, assetListIndex, currentItem, playedLastItem) {\n    const schedule = this.schedule;\n    if (!schedule) {\n      return;\n    }\n    const scheduledItem = scheduleItems[index] || null;\n    const media = this.primaryMedia;\n    const playerQueue = this.playerQueue;\n    if (playerQueue.length) {\n      playerQueue.forEach((player) => {\n        const interstitial = player.interstitial;\n        const queuedIndex = schedule.findEventIndex(interstitial.identifier);\n        if (queuedIndex < index || queuedIndex > index + 1) {\n          this.clearInterstitial(interstitial, scheduledItem);\n        }\n      });\n    }\n    if (this.isInterstitial(scheduledItem)) {\n      this.timelinePos = Math.min(Math.max(this.timelinePos, scheduledItem.start), scheduledItem.end);\n      const interstitial = scheduledItem.event;\n      if (assetListIndex === void 0) {\n        assetListIndex = schedule.findAssetIndex(interstitial, this.timelinePos);\n        const assetIndexCandidate = getNextAssetIndex(interstitial, assetListIndex - 1);\n        if (interstitial.isAssetPastPlayoutLimit(assetIndexCandidate) || interstitial.appendInPlace && this.timelinePos === scheduledItem.end) {\n          this.advanceAfterAssetEnded(interstitial, index, assetListIndex);\n          return;\n        }\n        assetListIndex = assetIndexCandidate;\n      }\n      const waitingItem = this.waitingItem;\n      if (!this.assetsBuffered(scheduledItem, media)) {\n        this.setBufferingItem(scheduledItem);\n      }\n      let player = this.preloadAssets(interstitial, assetListIndex);\n      if (!this.eventItemsMatch(scheduledItem, waitingItem || currentItem)) {\n        this.waitingItem = scheduledItem;\n        this.log(`INTERSTITIAL_STARTED ${segmentToString(scheduledItem)} ${interstitial.appendInPlace ? \"append in place\" : \"\"}`);\n        this.hls.trigger(Events.INTERSTITIAL_STARTED, {\n          event: interstitial,\n          schedule: scheduleItems.slice(0),\n          scheduleIndex: index\n        });\n      }\n      if (!interstitial.assetListLoaded) {\n        this.log(`Waiting for ASSET-LIST to complete loading ${interstitial}`);\n        return;\n      }\n      if (interstitial.assetListLoader) {\n        interstitial.assetListLoader.destroy();\n        interstitial.assetListLoader = void 0;\n      }\n      if (!media) {\n        this.log(`Waiting for attachMedia to start Interstitial ${interstitial}`);\n        return;\n      }\n      this.waitingItem = this.endedItem = null;\n      this.playingItem = scheduledItem;\n      const assetItem = interstitial.assetList[assetListIndex];\n      if (!assetItem) {\n        this.advanceAfterAssetEnded(interstitial, index, assetListIndex || 0);\n        return;\n      }\n      if (!player) {\n        player = this.getAssetPlayer(assetItem.identifier);\n      }\n      if (player === null || player.destroyed) {\n        const assetListLength = interstitial.assetList.length;\n        this.warn(`asset ${assetListIndex + 1}/${assetListLength} player destroyed ${interstitial}`);\n        player = this.createAssetPlayer(interstitial, assetItem, assetListIndex);\n        player.loadSource();\n      }\n      if (!this.eventItemsMatch(scheduledItem, this.bufferingItem)) {\n        if (interstitial.appendInPlace && this.isAssetBuffered(assetItem)) {\n          return;\n        }\n      }\n      this.startAssetPlayer(player, assetListIndex, scheduleItems, index, media);\n      if (this.shouldPlay) {\n        playWithCatch(player.media);\n      }\n    } else if (scheduledItem) {\n      this.resumePrimary(scheduledItem, index, currentItem);\n      if (this.shouldPlay) {\n        playWithCatch(this.hls.media);\n      }\n    } else if (playedLastItem && this.isInterstitial(currentItem)) {\n      this.endedItem = null;\n      this.playingItem = currentItem;\n      if (!currentItem.event.appendInPlace) {\n        this.attachPrimary(schedule.durations.primary, null);\n      }\n    }\n  }\n  get playbackDisabled() {\n    return this.hls.config.enableInterstitialPlayback === false;\n  }\n  get primaryDetails() {\n    var _this$mediaSelection;\n    return (_this$mediaSelection = this.mediaSelection) == null ? void 0 : _this$mediaSelection.main.details;\n  }\n  get primaryLive() {\n    var _this$primaryDetails;\n    return !!((_this$primaryDetails = this.primaryDetails) != null && _this$primaryDetails.live);\n  }\n  resumePrimary(scheduledItem, index, fromItem) {\n    var _this$detachedData4, _this$schedule4;\n    this.playingItem = scheduledItem;\n    this.playingAsset = this.endedAsset = null;\n    this.waitingItem = this.endedItem = null;\n    this.bufferedToItem(scheduledItem);\n    this.log(`resuming ${segmentToString(scheduledItem)}`);\n    if (!((_this$detachedData4 = this.detachedData) != null && _this$detachedData4.mediaSource)) {\n      let timelinePos = this.timelinePos;\n      if (timelinePos < scheduledItem.start || timelinePos >= scheduledItem.end) {\n        timelinePos = this.getPrimaryResumption(scheduledItem, index);\n        this.log(timelineMessage(\"resumePrimary\", timelinePos));\n        this.timelinePos = timelinePos;\n      }\n      this.attachPrimary(timelinePos, scheduledItem);\n    }\n    if (!fromItem) {\n      return;\n    }\n    const scheduleItems = (_this$schedule4 = this.schedule) == null ? void 0 : _this$schedule4.items;\n    if (!scheduleItems) {\n      return;\n    }\n    this.log(`INTERSTITIALS_PRIMARY_RESUMED ${segmentToString(scheduledItem)}`);\n    this.hls.trigger(Events.INTERSTITIALS_PRIMARY_RESUMED, {\n      schedule: scheduleItems.slice(0),\n      scheduleIndex: index\n    });\n    this.checkBuffer();\n  }\n  getPrimaryResumption(scheduledItem, index) {\n    const itemStart = scheduledItem.start;\n    if (this.primaryLive) {\n      const details = this.primaryDetails;\n      if (index === 0) {\n        return this.hls.startPosition;\n      } else if (details && (itemStart < details.fragmentStart || itemStart > details.edge)) {\n        return this.hls.liveSyncPosition || -1;\n      }\n    }\n    return itemStart;\n  }\n  isAssetBuffered(asset) {\n    const player = this.getAssetPlayer(asset.identifier);\n    if (player != null && player.hls) {\n      return player.hls.bufferedToEnd;\n    }\n    const bufferInfo = BufferHelper.bufferInfo(this.primaryMedia, this.timelinePos, 0);\n    return bufferInfo.end + 1 >= asset.timelineStart + (asset.duration || 0);\n  }\n  attachPrimary(timelinePos, item, skipSeekToStartPosition) {\n    if (item) {\n      this.setBufferingItem(item);\n    } else {\n      this.bufferingItem = this.playingItem;\n    }\n    this.bufferingAsset = null;\n    const media = this.primaryMedia;\n    if (!media) {\n      return;\n    }\n    const hls = this.hls;\n    if (hls.media) {\n      this.checkBuffer();\n    } else {\n      this.transferMediaTo(hls, media);\n      if (skipSeekToStartPosition) {\n        this.startLoadingPrimaryAt(timelinePos, skipSeekToStartPosition);\n      }\n    }\n    if (!skipSeekToStartPosition) {\n      this.log(timelineMessage(\"attachPrimary\", timelinePos));\n      this.timelinePos = timelinePos;\n      this.startLoadingPrimaryAt(timelinePos, skipSeekToStartPosition);\n    }\n  }\n  startLoadingPrimaryAt(timelinePos, skipSeekToStartPosition) {\n    var _hls$mainForwardBuffe;\n    const hls = this.hls;\n    if (!hls.loadingEnabled || !hls.media || Math.abs((((_hls$mainForwardBuffe = hls.mainForwardBufferInfo) == null ? void 0 : _hls$mainForwardBuffe.start) || hls.media.currentTime) - timelinePos) > 0.5) {\n      hls.startLoad(timelinePos, skipSeekToStartPosition);\n    } else if (!hls.bufferingEnabled) {\n      hls.resumeBuffering();\n    }\n  }\n  onManifestLoading() {\n    var _this$schedule5;\n    this.stopLoad();\n    (_this$schedule5 = this.schedule) == null || _this$schedule5.reset();\n    this.emptyPlayerQueue();\n    this.clearScheduleState();\n    this.shouldPlay = false;\n    this.bufferedPos = this.timelinePos = -1;\n    this.mediaSelection = this.altSelection = this.manager = this.requiredTracks = null;\n    this.hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n    this.hls.on(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n  }\n  onLevelUpdated(event, data) {\n    if (data.level === -1 || !this.schedule) {\n      return;\n    }\n    const main = this.hls.levels[data.level];\n    if (!main.details) {\n      return;\n    }\n    const currentSelection = _objectSpread2(_objectSpread2({}, this.mediaSelection || this.altSelection), {}, {\n      main\n    });\n    this.mediaSelection = currentSelection;\n    this.schedule.parseInterstitialDateRanges(currentSelection, this.hls.config.interstitialAppendInPlace);\n    if (!this.effectivePlayingItem && this.schedule.items) {\n      this.checkStart();\n    }\n  }\n  onAudioTrackUpdated(event, data) {\n    const audio = this.hls.audioTracks[data.id];\n    const previousSelection = this.mediaSelection;\n    if (!previousSelection) {\n      this.altSelection = _objectSpread2(_objectSpread2({}, this.altSelection), {}, {\n        audio\n      });\n      return;\n    }\n    const currentSelection = _objectSpread2(_objectSpread2({}, previousSelection), {}, {\n      audio\n    });\n    this.mediaSelection = currentSelection;\n  }\n  onSubtitleTrackUpdated(event, data) {\n    const subtitles = this.hls.subtitleTracks[data.id];\n    const previousSelection = this.mediaSelection;\n    if (!previousSelection) {\n      this.altSelection = _objectSpread2(_objectSpread2({}, this.altSelection), {}, {\n        subtitles\n      });\n      return;\n    }\n    const currentSelection = _objectSpread2(_objectSpread2({}, previousSelection), {}, {\n      subtitles\n    });\n    this.mediaSelection = currentSelection;\n  }\n  onAudioTrackSwitching(event, data) {\n    const audioOption = getBasicSelectionOption(data);\n    this.playerQueue.forEach(({\n      hls\n    }) => hls && (hls.setAudioOption(data) || hls.setAudioOption(audioOption)));\n  }\n  onSubtitleTrackSwitch(event, data) {\n    const subtitleOption = getBasicSelectionOption(data);\n    this.playerQueue.forEach(({\n      hls\n    }) => hls && (hls.setSubtitleOption(data) || data.id !== -1 && hls.setSubtitleOption(subtitleOption)));\n  }\n  onBufferCodecs(event, data) {\n    const requiredTracks = data.tracks;\n    if (requiredTracks) {\n      this.requiredTracks = requiredTracks;\n    }\n  }\n  onBufferAppended(event, data) {\n    this.checkBuffer();\n  }\n  onBufferFlushed(event, data) {\n    const playingItem = this.playingItem;\n    if (playingItem && !this.itemsMatch(playingItem, this.bufferingItem) && !this.isInterstitial(playingItem)) {\n      const timelinePos = this.timelinePos;\n      this.bufferedPos = timelinePos;\n      this.checkBuffer();\n    }\n  }\n  onBufferedToEnd(event) {\n    if (!this.schedule) {\n      return;\n    }\n    const interstitialEvents = this.schedule.events;\n    if (this.bufferedPos < Number.MAX_VALUE && interstitialEvents) {\n      for (let i = 0; i < interstitialEvents.length; i++) {\n        const interstitial = interstitialEvents[i];\n        if (interstitial.cue.post) {\n          var _this$schedule$items2;\n          const scheduleIndex = this.schedule.findEventIndex(interstitial.identifier);\n          const item = (_this$schedule$items2 = this.schedule.items) == null ? void 0 : _this$schedule$items2[scheduleIndex];\n          if (this.isInterstitial(item) && this.eventItemsMatch(item, this.bufferingItem)) {\n            this.bufferedToItem(item, 0);\n          }\n          break;\n        }\n      }\n      this.bufferedPos = Number.MAX_VALUE;\n    }\n  }\n  onMediaEnded(event) {\n    const playingItem = this.playingItem;\n    if (!this.playingLastItem && playingItem) {\n      const playingIndex = this.findItemIndex(playingItem);\n      this.setSchedulePosition(playingIndex + 1);\n    } else {\n      this.shouldPlay = false;\n    }\n  }\n  updateItem(previousItem, time) {\n    var _this$schedule6;\n    const items = (_this$schedule6 = this.schedule) == null ? void 0 : _this$schedule6.items;\n    if (previousItem && items) {\n      const index = this.findItemIndex(previousItem, time);\n      return items[index] || null;\n    }\n    return null;\n  }\n  trimInPlace(updatedItem, itemBeforeUpdate) {\n    if (this.isInterstitial(updatedItem) && updatedItem.event.appendInPlace && itemBeforeUpdate.end - updatedItem.end > 0.25) {\n      updatedItem.event.assetList.forEach((asset, index) => {\n        if (updatedItem.event.isAssetPastPlayoutLimit(index)) {\n          this.clearAssetPlayer(asset.identifier, null);\n        }\n      });\n      const flushStart = updatedItem.end + 0.25;\n      const bufferInfo = BufferHelper.bufferInfo(this.primaryMedia, flushStart, 0);\n      if (bufferInfo.end > flushStart || (bufferInfo.nextStart || 0) > flushStart) {\n        this.log(`trim buffered interstitial ${segmentToString(updatedItem)} (was ${segmentToString(itemBeforeUpdate)})`);\n        const skipSeekToStartPosition = true;\n        this.attachPrimary(flushStart, null, skipSeekToStartPosition);\n        this.flushFrontBuffer(flushStart);\n      }\n    }\n  }\n  itemsMatch(a, b) {\n    return !!b && (a === b || a.event && b.event && this.eventItemsMatch(a, b) || !a.event && !b.event && this.findItemIndex(a) === this.findItemIndex(b));\n  }\n  eventItemsMatch(a, b) {\n    var _b$event;\n    return !!b && (a === b || a.event.identifier === ((_b$event = b.event) == null ? void 0 : _b$event.identifier));\n  }\n  findItemIndex(item, time) {\n    return item && this.schedule ? this.schedule.findItemIndex(item, time) : -1;\n  }\n  updateSchedule(forceUpdate = false) {\n    var _this$schedule7;\n    const mediaSelection = this.mediaSelection;\n    if (!mediaSelection) {\n      return;\n    }\n    (_this$schedule7 = this.schedule) == null || _this$schedule7.updateSchedule(mediaSelection, [], forceUpdate);\n  }\n  checkBuffer(starved) {\n    var _this$schedule8;\n    const items = (_this$schedule8 = this.schedule) == null ? void 0 : _this$schedule8.items;\n    if (!items) {\n      return;\n    }\n    const bufferInfo = BufferHelper.bufferInfo(this.primaryMedia, this.timelinePos, 0);\n    if (starved) {\n      this.bufferedPos = this.timelinePos;\n    }\n    starved || (starved = bufferInfo.len < 1);\n    this.updateBufferedPos(bufferInfo.end, items, starved);\n  }\n  updateBufferedPos(bufferEnd, items, bufferIsEmpty) {\n    const schedule = this.schedule;\n    const bufferingItem = this.bufferingItem;\n    if (this.bufferedPos > bufferEnd || !schedule) {\n      return;\n    }\n    if (items.length === 1 && this.itemsMatch(items[0], bufferingItem)) {\n      this.bufferedPos = bufferEnd;\n      return;\n    }\n    const playingItem = this.playingItem;\n    const playingIndex = this.findItemIndex(playingItem);\n    let bufferEndIndex = schedule.findItemIndexAtTime(bufferEnd);\n    if (this.bufferedPos < bufferEnd) {\n      var _nextItemToBuffer$eve;\n      const bufferingIndex = this.findItemIndex(bufferingItem);\n      const nextToBufferIndex = Math.min(bufferingIndex + 1, items.length - 1);\n      const nextItemToBuffer = items[nextToBufferIndex];\n      if (bufferEndIndex === -1 && bufferingItem && bufferEnd >= bufferingItem.end || (_nextItemToBuffer$eve = nextItemToBuffer.event) != null && _nextItemToBuffer$eve.appendInPlace && bufferEnd + 0.01 >= nextItemToBuffer.start) {\n        bufferEndIndex = nextToBufferIndex;\n      }\n      if (this.isInterstitial(bufferingItem)) {\n        const interstitial = bufferingItem.event;\n        if (nextToBufferIndex - playingIndex > 1 && interstitial.appendInPlace === false) {\n          return;\n        }\n        if (interstitial.assetList.length === 0 && interstitial.assetListLoader) {\n          return;\n        }\n      }\n      this.bufferedPos = bufferEnd;\n      if (bufferEndIndex > bufferingIndex && bufferEndIndex > playingIndex) {\n        this.bufferedToItem(nextItemToBuffer);\n      } else {\n        const details = this.primaryDetails;\n        if (this.primaryLive && details && bufferEnd > details.edge - details.targetduration && nextItemToBuffer.start < details.edge + this.hls.config.interstitialLiveLookAhead && this.isInterstitial(nextItemToBuffer)) {\n          this.preloadAssets(nextItemToBuffer.event, 0);\n        }\n      }\n    } else if (bufferIsEmpty && playingItem && !this.itemsMatch(playingItem, bufferingItem)) {\n      if (bufferEndIndex === playingIndex) {\n        this.bufferedToItem(playingItem);\n      } else if (bufferEndIndex === playingIndex + 1) {\n        this.bufferedToItem(items[bufferEndIndex]);\n      }\n    }\n  }\n  assetsBuffered(item, media) {\n    const assetList = item.event.assetList;\n    if (assetList.length === 0) {\n      return false;\n    }\n    return !item.event.assetList.some((asset) => {\n      const player = this.getAssetPlayer(asset.identifier);\n      return !(player != null && player.bufferedInPlaceToEnd(media));\n    });\n  }\n  setBufferingItem(item) {\n    const bufferingLast = this.bufferingItem;\n    const schedule = this.schedule;\n    if (!this.itemsMatch(item, bufferingLast) && schedule) {\n      const {\n        items,\n        events\n      } = schedule;\n      if (!items || !events) {\n        return bufferingLast;\n      }\n      const isInterstitial = this.isInterstitial(item);\n      const bufferingPlayer = this.getBufferingPlayer();\n      this.bufferingItem = item;\n      this.bufferedPos = Math.max(item.start, Math.min(item.end, this.timelinePos));\n      const timeRemaining = bufferingPlayer ? bufferingPlayer.remaining : bufferingLast ? bufferingLast.end - this.timelinePos : 0;\n      this.log(`INTERSTITIALS_BUFFERED_TO_BOUNDARY ${segmentToString(item)}` + (bufferingLast ? ` (${timeRemaining.toFixed(2)} remaining)` : \"\"));\n      if (!this.playbackDisabled) {\n        if (isInterstitial) {\n          const bufferIndex = schedule.findAssetIndex(item.event, this.bufferedPos);\n          item.event.assetList.forEach((asset, i) => {\n            const player = this.getAssetPlayer(asset.identifier);\n            if (player) {\n              if (i === bufferIndex) {\n                player.loadSource();\n              }\n              player.resumeBuffering();\n            }\n          });\n        } else {\n          this.hls.resumeBuffering();\n          this.playerQueue.forEach((player) => player.pauseBuffering());\n        }\n      }\n      this.hls.trigger(Events.INTERSTITIALS_BUFFERED_TO_BOUNDARY, {\n        events: events.slice(0),\n        schedule: items.slice(0),\n        bufferingIndex: this.findItemIndex(item),\n        playingIndex: this.findItemIndex(this.playingItem)\n      });\n    } else if (this.bufferingItem !== item) {\n      this.bufferingItem = item;\n    }\n    return bufferingLast;\n  }\n  bufferedToItem(item, assetListIndex = 0) {\n    const bufferingLast = this.setBufferingItem(item);\n    if (this.playbackDisabled) {\n      return;\n    }\n    if (this.isInterstitial(item)) {\n      this.bufferedToEvent(item, assetListIndex);\n    } else if (bufferingLast !== null) {\n      this.bufferingAsset = null;\n      const detachedData = this.detachedData;\n      if (detachedData) {\n        if (detachedData.mediaSource) {\n          const skipSeekToStartPosition = true;\n          this.attachPrimary(item.start, item, skipSeekToStartPosition);\n        } else {\n          this.preloadPrimary(item);\n        }\n      } else {\n        this.preloadPrimary(item);\n      }\n    }\n  }\n  preloadPrimary(item) {\n    const index = this.findItemIndex(item);\n    const timelinePos = this.getPrimaryResumption(item, index);\n    this.startLoadingPrimaryAt(timelinePos);\n  }\n  bufferedToEvent(item, assetListIndex) {\n    const interstitial = item.event;\n    const neverLoaded = interstitial.assetList.length === 0 && !interstitial.assetListLoader;\n    const playOnce = interstitial.cue.once;\n    if (neverLoaded || !playOnce) {\n      const player = this.preloadAssets(interstitial, assetListIndex);\n      if (player != null && player.interstitial.appendInPlace) {\n        const media = this.primaryMedia;\n        if (media) {\n          this.bufferAssetPlayer(player, media);\n        }\n      }\n    }\n  }\n  preloadAssets(interstitial, assetListIndex) {\n    const uri = interstitial.assetUrl;\n    const assetListLength = interstitial.assetList.length;\n    const neverLoaded = assetListLength === 0 && !interstitial.assetListLoader;\n    const playOnce = interstitial.cue.once;\n    if (neverLoaded) {\n      const timelineStart = interstitial.timelineStart;\n      if (interstitial.appendInPlace) {\n        var _playingItem$nextEven;\n        const playingItem = this.playingItem;\n        if (!this.isInterstitial(playingItem) && (playingItem == null || (_playingItem$nextEven = playingItem.nextEvent) == null ? void 0 : _playingItem$nextEven.identifier) === interstitial.identifier) {\n          this.flushFrontBuffer(timelineStart + 0.25);\n        }\n      }\n      let hlsStartOffset;\n      let liveStartPosition = 0;\n      if (!this.playingItem && this.primaryLive) {\n        liveStartPosition = this.hls.startPosition;\n        if (liveStartPosition === -1) {\n          liveStartPosition = this.hls.liveSyncPosition || 0;\n        }\n      }\n      if (liveStartPosition && !(interstitial.cue.pre || interstitial.cue.post)) {\n        const startOffset = liveStartPosition - timelineStart;\n        if (startOffset > 0) {\n          hlsStartOffset = Math.round(startOffset * 1e3) / 1e3;\n        }\n      }\n      this.log(`Load interstitial asset ${assetListIndex + 1}/${uri ? 1 : assetListLength} ${interstitial}${hlsStartOffset ? ` live-start: ${liveStartPosition} start-offset: ${hlsStartOffset}` : \"\"}`);\n      if (uri) {\n        return this.createAsset(interstitial, 0, 0, timelineStart, interstitial.duration, uri);\n      }\n      const assetListLoader = this.assetListLoader.loadAssetList(interstitial, hlsStartOffset);\n      if (assetListLoader) {\n        interstitial.assetListLoader = assetListLoader;\n      }\n    } else if (!playOnce && assetListLength) {\n      for (let i = assetListIndex; i < assetListLength; i++) {\n        const _asset = interstitial.assetList[i];\n        const playerIndex = this.getAssetPlayerQueueIndex(_asset.identifier);\n        if ((playerIndex === -1 || this.playerQueue[playerIndex].destroyed) && !_asset.error) {\n          this.createAssetPlayer(interstitial, _asset, i);\n        }\n      }\n      const asset = interstitial.assetList[assetListIndex];\n      if (asset) {\n        const player = this.getAssetPlayer(asset.identifier);\n        if (player) {\n          player.loadSource();\n        }\n        return player;\n      }\n    }\n    return null;\n  }\n  flushFrontBuffer(startOffset) {\n    const requiredTracks = this.requiredTracks;\n    if (!requiredTracks) {\n      return;\n    }\n    this.log(`Removing front buffer starting at ${startOffset}`);\n    const sourceBufferNames = Object.keys(requiredTracks);\n    sourceBufferNames.forEach((type) => {\n      this.hls.trigger(Events.BUFFER_FLUSHING, {\n        startOffset,\n        endOffset: Infinity,\n        type\n      });\n    });\n  }\n  getAssetPlayerQueueIndex(assetId) {\n    const playerQueue = this.playerQueue;\n    for (let i = 0; i < playerQueue.length; i++) {\n      if (assetId === playerQueue[i].assetId) {\n        return i;\n      }\n    }\n    return -1;\n  }\n  getAssetPlayer(assetId) {\n    const index = this.getAssetPlayerQueueIndex(assetId);\n    return this.playerQueue[index] || null;\n  }\n  getBufferingPlayer() {\n    const {\n      playerQueue,\n      primaryMedia\n    } = this;\n    if (primaryMedia) {\n      for (let i = 0; i < playerQueue.length; i++) {\n        if (playerQueue[i].media === primaryMedia) {\n          return playerQueue[i];\n        }\n      }\n    }\n    return null;\n  }\n  createAsset(interstitial, assetListIndex, startOffset, timelineStart, duration, uri) {\n    const assetItem = {\n      parentIdentifier: interstitial.identifier,\n      identifier: generateAssetIdentifier(interstitial, uri, assetListIndex),\n      duration,\n      startOffset,\n      timelineStart,\n      uri\n    };\n    return this.createAssetPlayer(interstitial, assetItem, assetListIndex);\n  }\n  createAssetPlayer(interstitial, assetItem, assetListIndex) {\n    const primary = this.hls;\n    const userConfig = primary.userConfig;\n    let videoPreference = userConfig.videoPreference;\n    const currentLevel = primary.loadLevelObj || primary.levels[primary.currentLevel];\n    if (videoPreference || currentLevel) {\n      videoPreference = _extends({}, videoPreference);\n      if (currentLevel.videoCodec) {\n        videoPreference.videoCodec = currentLevel.videoCodec;\n      }\n      if (currentLevel.videoRange) {\n        videoPreference.allowedVideoRanges = [currentLevel.videoRange];\n      }\n    }\n    const selectedAudio = primary.audioTracks[primary.audioTrack];\n    const selectedSubtitle = primary.subtitleTracks[primary.subtitleTrack];\n    let startPosition = 0;\n    if (this.primaryLive || interstitial.appendInPlace) {\n      const timePastStart = this.timelinePos - assetItem.timelineStart;\n      if (timePastStart > 1) {\n        const duration = assetItem.duration;\n        if (duration && timePastStart < duration) {\n          startPosition = timePastStart;\n        }\n      }\n    }\n    const assetId = assetItem.identifier;\n    const playerConfig = _objectSpread2(_objectSpread2({}, userConfig), {}, {\n      maxMaxBufferLength: Math.min(180, primary.config.maxMaxBufferLength),\n      autoStartLoad: true,\n      startFragPrefetch: true,\n      primarySessionId: primary.sessionId,\n      assetPlayerId: assetId,\n      abrEwmaDefaultEstimate: primary.bandwidthEstimate,\n      interstitialsController: void 0,\n      startPosition,\n      liveDurationInfinity: false,\n      testBandwidth: false,\n      videoPreference,\n      audioPreference: selectedAudio || userConfig.audioPreference,\n      subtitlePreference: selectedSubtitle || userConfig.subtitlePreference\n    });\n    if (interstitial.appendInPlace) {\n      interstitial.appendInPlaceStarted = true;\n      if (assetItem.timelineStart) {\n        playerConfig.timelineOffset = assetItem.timelineStart;\n      }\n    }\n    const cmcd = playerConfig.cmcd;\n    if (cmcd != null && cmcd.sessionId && cmcd.contentId) {\n      playerConfig.cmcd = _extends({}, cmcd, {\n        contentId: hash(assetItem.uri)\n      });\n    }\n    if (this.getAssetPlayer(assetId)) {\n      this.warn(`Duplicate date range identifier ${interstitial} and asset ${assetId}`);\n    }\n    const player = new HlsAssetPlayer(this.HlsPlayerClass, playerConfig, interstitial, assetItem);\n    this.playerQueue.push(player);\n    interstitial.assetList[assetListIndex] = assetItem;\n    let initialDuration = true;\n    const updateAssetPlayerDetails = (details) => {\n      if (details.live) {\n        var _this$schedule9;\n        const error = new Error(`Interstitials MUST be VOD assets ${interstitial}`);\n        const errorData = {\n          fatal: true,\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.INTERSTITIAL_ASSET_ITEM_ERROR,\n          error\n        };\n        const scheduleIndex = ((_this$schedule9 = this.schedule) == null ? void 0 : _this$schedule9.findEventIndex(interstitial.identifier)) || -1;\n        this.handleAssetItemError(errorData, interstitial, scheduleIndex, assetListIndex, error.message);\n        return;\n      }\n      const duration = details.edge - details.fragmentStart;\n      const currentAssetDuration = assetItem.duration;\n      if (initialDuration || currentAssetDuration === null || duration > currentAssetDuration) {\n        initialDuration = false;\n        this.log(`Interstitial asset \"${assetId}\" duration change ${currentAssetDuration} > ${duration}`);\n        assetItem.duration = duration;\n        this.updateSchedule();\n      }\n    };\n    player.on(Events.LEVEL_UPDATED, (event, {\n      details\n    }) => updateAssetPlayerDetails(details));\n    player.on(Events.LEVEL_PTS_UPDATED, (event, {\n      details\n    }) => updateAssetPlayerDetails(details));\n    player.on(Events.EVENT_CUE_ENTER, () => this.onInterstitialCueEnter());\n    const onBufferCodecs = (event, data) => {\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      if (inQueuPlayer && data.tracks) {\n        inQueuPlayer.off(Events.BUFFER_CODECS, onBufferCodecs);\n        inQueuPlayer.tracks = data.tracks;\n        const media = this.primaryMedia;\n        if (this.bufferingAsset === inQueuPlayer.assetItem && media && !inQueuPlayer.media) {\n          this.bufferAssetPlayer(inQueuPlayer, media);\n        }\n      }\n    };\n    player.on(Events.BUFFER_CODECS, onBufferCodecs);\n    const bufferedToEnd = () => {\n      var _this$schedule$items3;\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      this.log(`buffered to end of asset ${inQueuPlayer}`);\n      if (!inQueuPlayer || !this.schedule) {\n        return;\n      }\n      const scheduleIndex = this.schedule.findEventIndex(interstitial.identifier);\n      const item = (_this$schedule$items3 = this.schedule.items) == null ? void 0 : _this$schedule$items3[scheduleIndex];\n      if (this.isInterstitial(item)) {\n        this.advanceAssetBuffering(item, assetItem);\n      }\n    };\n    player.on(Events.BUFFERED_TO_END, bufferedToEnd);\n    const endedWithAssetIndex = (assetIndex) => {\n      return () => {\n        const inQueuPlayer = this.getAssetPlayer(assetId);\n        if (!inQueuPlayer || !this.schedule) {\n          return;\n        }\n        this.shouldPlay = true;\n        const scheduleIndex = this.schedule.findEventIndex(interstitial.identifier);\n        this.advanceAfterAssetEnded(interstitial, scheduleIndex, assetIndex);\n      };\n    };\n    player.once(Events.MEDIA_ENDED, endedWithAssetIndex(assetListIndex));\n    player.once(Events.PLAYOUT_LIMIT_REACHED, endedWithAssetIndex(Infinity));\n    player.on(Events.ERROR, (event, data) => {\n      if (!this.schedule) {\n        return;\n      }\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      if (data.details === ErrorDetails.BUFFER_STALLED_ERROR) {\n        if (inQueuPlayer != null && inQueuPlayer.appendInPlace) {\n          this.handleInPlaceStall(interstitial);\n          return;\n        }\n        this.onTimeupdate();\n        this.checkBuffer(true);\n        return;\n      }\n      this.handleAssetItemError(data, interstitial, this.schedule.findEventIndex(interstitial.identifier), assetListIndex, `Asset player error ${data.error} ${interstitial}`);\n    });\n    player.on(Events.DESTROYING, () => {\n      const inQueuPlayer = this.getAssetPlayer(assetId);\n      if (!inQueuPlayer || !this.schedule) {\n        return;\n      }\n      const error = new Error(`Asset player destroyed unexpectedly ${assetId}`);\n      const errorData = {\n        fatal: true,\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.INTERSTITIAL_ASSET_ITEM_ERROR,\n        error\n      };\n      this.handleAssetItemError(errorData, interstitial, this.schedule.findEventIndex(interstitial.identifier), assetListIndex, error.message);\n    });\n    this.log(`INTERSTITIAL_ASSET_PLAYER_CREATED ${eventAssetToString(assetItem)}`);\n    this.hls.trigger(Events.INTERSTITIAL_ASSET_PLAYER_CREATED, {\n      asset: assetItem,\n      assetListIndex,\n      event: interstitial,\n      player\n    });\n    return player;\n  }\n  clearInterstitial(interstitial, toSegment) {\n    this.clearAssetPlayers(interstitial, toSegment);\n    interstitial.reset();\n  }\n  clearAssetPlayers(interstitial, toSegment) {\n    interstitial.assetList.forEach((asset) => {\n      this.clearAssetPlayer(asset.identifier, toSegment);\n    });\n  }\n  resetAssetPlayer(assetId) {\n    const playerIndex = this.getAssetPlayerQueueIndex(assetId);\n    if (playerIndex !== -1) {\n      this.log(`reset asset player \"${assetId}\" after error`);\n      const player = this.playerQueue[playerIndex];\n      this.transferMediaFromPlayer(player, null);\n      player.resetDetails();\n    }\n  }\n  clearAssetPlayer(assetId, toSegment) {\n    const playerIndex = this.getAssetPlayerQueueIndex(assetId);\n    if (playerIndex !== -1) {\n      const player = this.playerQueue[playerIndex];\n      this.log(`clear ${player} toSegment: ${toSegment ? segmentToString(toSegment) : toSegment}`);\n      this.transferMediaFromPlayer(player, toSegment);\n      this.playerQueue.splice(playerIndex, 1);\n      player.destroy();\n    }\n  }\n  emptyPlayerQueue() {\n    let player;\n    while (player = this.playerQueue.pop()) {\n      player.destroy();\n    }\n    this.playerQueue = [];\n  }\n  startAssetPlayer(player, assetListIndex, scheduleItems, scheduleIndex, media) {\n    const {\n      interstitial,\n      assetItem,\n      assetId\n    } = player;\n    const assetListLength = interstitial.assetList.length;\n    const playingAsset = this.playingAsset;\n    this.endedAsset = null;\n    this.playingAsset = assetItem;\n    if (!playingAsset || playingAsset.identifier !== assetId) {\n      if (playingAsset) {\n        this.clearAssetPlayer(playingAsset.identifier, scheduleItems[scheduleIndex]);\n        delete playingAsset.error;\n      }\n      this.log(`INTERSTITIAL_ASSET_STARTED ${assetListIndex + 1}/${assetListLength} ${eventAssetToString(assetItem)}`);\n      this.hls.trigger(Events.INTERSTITIAL_ASSET_STARTED, {\n        asset: assetItem,\n        assetListIndex,\n        event: interstitial,\n        schedule: scheduleItems.slice(0),\n        scheduleIndex,\n        player\n      });\n    }\n    this.bufferAssetPlayer(player, media);\n  }\n  bufferAssetPlayer(player, media) {\n    var _this$schedule$items4, _this$detachedData5;\n    if (!this.schedule) {\n      return;\n    }\n    const {\n      interstitial,\n      assetItem\n    } = player;\n    const scheduleIndex = this.schedule.findEventIndex(interstitial.identifier);\n    const item = (_this$schedule$items4 = this.schedule.items) == null ? void 0 : _this$schedule$items4[scheduleIndex];\n    if (!item) {\n      return;\n    }\n    player.loadSource();\n    this.setBufferingItem(item);\n    this.bufferingAsset = assetItem;\n    const bufferingPlayer = this.getBufferingPlayer();\n    if (bufferingPlayer === player) {\n      return;\n    }\n    const appendInPlaceNext = interstitial.appendInPlace;\n    if (appendInPlaceNext && (bufferingPlayer == null ? void 0 : bufferingPlayer.interstitial.appendInPlace) === false) {\n      return;\n    }\n    const activeTracks = (bufferingPlayer == null ? void 0 : bufferingPlayer.tracks) || ((_this$detachedData5 = this.detachedData) == null ? void 0 : _this$detachedData5.tracks) || this.requiredTracks;\n    if (appendInPlaceNext && assetItem !== this.playingAsset) {\n      if (!player.tracks) {\n        this.log(`Waiting for track info before buffering ${player}`);\n        return;\n      }\n      if (activeTracks && !isCompatibleTrackChange(activeTracks, player.tracks)) {\n        const error = new Error(`Asset ${eventAssetToString(assetItem)} SourceBuffer tracks ('${Object.keys(player.tracks)}') are not compatible with primary content tracks ('${Object.keys(activeTracks)}')`);\n        const errorData = {\n          fatal: true,\n          type: ErrorTypes.OTHER_ERROR,\n          details: ErrorDetails.INTERSTITIAL_ASSET_ITEM_ERROR,\n          error\n        };\n        const assetListIndex = interstitial.findAssetIndex(assetItem);\n        this.handleAssetItemError(errorData, interstitial, scheduleIndex, assetListIndex, error.message);\n        return;\n      }\n    }\n    this.transferMediaTo(player, media);\n  }\n  handleInPlaceStall(interstitial) {\n    const schedule = this.schedule;\n    const media = this.primaryMedia;\n    if (!schedule || !media) {\n      return;\n    }\n    const currentTime = media.currentTime;\n    const foundAssetIndex = schedule.findAssetIndex(interstitial, currentTime);\n    const stallingAsset = interstitial.assetList[foundAssetIndex];\n    if (stallingAsset) {\n      const player = this.getAssetPlayer(stallingAsset.identifier);\n      if (player) {\n        const assetCurrentTime = player.currentTime || currentTime - stallingAsset.timelineStart;\n        const distanceFromEnd = player.duration - assetCurrentTime;\n        this.warn(`Stalled at ${assetCurrentTime} of ${assetCurrentTime + distanceFromEnd} in ${player} ${interstitial} (media.currentTime: ${currentTime})`);\n        if (assetCurrentTime && (distanceFromEnd / media.playbackRate < 0.5 || player.bufferedInPlaceToEnd(media)) && player.hls) {\n          const scheduleIndex = schedule.findEventIndex(interstitial.identifier);\n          this.advanceAfterAssetEnded(interstitial, scheduleIndex, foundAssetIndex);\n        }\n      }\n    }\n  }\n  advanceInPlace(time) {\n    const media = this.primaryMedia;\n    if (media && media.currentTime < time) {\n      media.currentTime = time;\n    }\n  }\n  handleAssetItemError(data, interstitial, scheduleIndex, assetListIndex, errorMessage) {\n    if (data.details === ErrorDetails.BUFFER_STALLED_ERROR) {\n      return;\n    }\n    const assetItem = interstitial.assetList[assetListIndex] || null;\n    this.warn(`INTERSTITIAL_ASSET_ERROR ${assetItem ? eventAssetToString(assetItem) : assetItem} ${data.error}`);\n    if (!this.schedule) {\n      return;\n    }\n    const assetId = (assetItem == null ? void 0 : assetItem.identifier) || \"\";\n    const playerIndex = this.getAssetPlayerQueueIndex(assetId);\n    const player = this.playerQueue[playerIndex] || null;\n    const items = this.schedule.items;\n    const interstitialAssetError = _extends({}, data, {\n      fatal: false,\n      errorAction: createDoNothingErrorAction(true),\n      asset: assetItem,\n      assetListIndex,\n      event: interstitial,\n      schedule: items,\n      scheduleIndex,\n      player\n    });\n    this.hls.trigger(Events.INTERSTITIAL_ASSET_ERROR, interstitialAssetError);\n    if (!data.fatal) {\n      return;\n    }\n    const playingAsset = this.playingAsset;\n    const bufferingAsset = this.bufferingAsset;\n    const error = new Error(errorMessage);\n    if (assetItem) {\n      this.clearAssetPlayer(assetId, null);\n      assetItem.error = error;\n    }\n    if (!interstitial.assetList.some((asset) => !asset.error)) {\n      interstitial.error = error;\n    } else {\n      for (let i = assetListIndex; i < interstitial.assetList.length; i++) {\n        this.resetAssetPlayer(interstitial.assetList[i].identifier);\n      }\n    }\n    this.updateSchedule(true);\n    if (interstitial.error) {\n      this.primaryFallback(interstitial);\n    } else if (playingAsset && playingAsset.identifier === assetId) {\n      this.advanceAfterAssetEnded(interstitial, scheduleIndex, assetListIndex);\n    } else if (bufferingAsset && bufferingAsset.identifier === assetId && this.isInterstitial(this.bufferingItem)) {\n      this.advanceAssetBuffering(this.bufferingItem, bufferingAsset);\n    }\n  }\n  primaryFallback(interstitial) {\n    const flushStart = interstitial.timelineStart;\n    const playingItem = this.effectivePlayingItem;\n    let timelinePos = this.timelinePos;\n    if (playingItem) {\n      this.log(`Fallback to primary from event \"${interstitial.identifier}\" start: ${flushStart} pos: ${timelinePos} playing: ${segmentToString(playingItem)} error: ${interstitial.error}`);\n      if (timelinePos === -1) {\n        timelinePos = this.hls.startPosition;\n      }\n      const newPlayingItem = this.updateItem(playingItem, timelinePos);\n      if (this.itemsMatch(playingItem, newPlayingItem)) {\n        this.clearInterstitial(interstitial, null);\n      }\n      if (interstitial.appendInPlace) {\n        this.attachPrimary(flushStart, null);\n        this.flushFrontBuffer(flushStart);\n      }\n    } else if (timelinePos === -1) {\n      this.checkStart();\n      return;\n    }\n    if (!this.schedule) {\n      return;\n    }\n    const scheduleIndex = this.schedule.findItemIndexAtTime(timelinePos);\n    this.setSchedulePosition(scheduleIndex);\n  }\n  onAssetListLoaded(event, data) {\n    var _this$schedule0, _this$bufferingItem2;\n    const interstitial = data.event;\n    const interstitialId = interstitial.identifier;\n    const assets = data.assetListResponse.ASSETS;\n    if (!((_this$schedule0 = this.schedule) != null && _this$schedule0.hasEvent(interstitialId))) {\n      return;\n    }\n    const eventStart = interstitial.timelineStart;\n    const previousDuration = interstitial.duration;\n    let sumDuration = 0;\n    assets.forEach((asset, assetListIndex) => {\n      const duration = parseFloat(asset.DURATION);\n      this.createAsset(interstitial, assetListIndex, sumDuration, eventStart + sumDuration, duration, asset.URI);\n      sumDuration += duration;\n    });\n    interstitial.duration = sumDuration;\n    this.log(`Loaded asset-list with duration: ${sumDuration} (was: ${previousDuration}) ${interstitial}`);\n    const waitingItem = this.waitingItem;\n    const waitingForItem = (waitingItem == null ? void 0 : waitingItem.event.identifier) === interstitialId;\n    this.updateSchedule();\n    const bufferingEvent = (_this$bufferingItem2 = this.bufferingItem) == null ? void 0 : _this$bufferingItem2.event;\n    if (waitingForItem) {\n      var _this$schedule$items5;\n      const scheduleIndex = this.schedule.findEventIndex(interstitialId);\n      const item = (_this$schedule$items5 = this.schedule.items) == null ? void 0 : _this$schedule$items5[scheduleIndex];\n      if (item) {\n        if (!this.playingItem && this.timelinePos > item.end) {\n          const index = this.schedule.findItemIndexAtTime(this.timelinePos);\n          if (index !== scheduleIndex) {\n            interstitial.error = new Error(`Interstitial ${assets.length ? \"no longer within playback range\" : \"asset-list is empty\"} ${this.timelinePos} ${interstitial}`);\n            this.log(interstitial.error.message);\n            this.updateSchedule(true);\n            this.primaryFallback(interstitial);\n            return;\n          }\n        }\n        this.setBufferingItem(item);\n      }\n      this.setSchedulePosition(scheduleIndex);\n    } else if ((bufferingEvent == null ? void 0 : bufferingEvent.identifier) === interstitialId) {\n      const assetItem = interstitial.assetList[0];\n      if (assetItem) {\n        const player = this.getAssetPlayer(assetItem.identifier);\n        if (bufferingEvent.appendInPlace) {\n          const media = this.primaryMedia;\n          if (player && media) {\n            this.bufferAssetPlayer(player, media);\n          }\n        } else if (player) {\n          player.loadSource();\n        }\n      }\n    }\n  }\n  onError(event, data) {\n    if (!this.schedule) {\n      return;\n    }\n    switch (data.details) {\n      case ErrorDetails.ASSET_LIST_PARSING_ERROR:\n      case ErrorDetails.ASSET_LIST_LOAD_ERROR:\n      case ErrorDetails.ASSET_LIST_LOAD_TIMEOUT: {\n        const interstitial = data.interstitial;\n        if (interstitial) {\n          this.updateSchedule(true);\n          this.primaryFallback(interstitial);\n        }\n        break;\n      }\n      case ErrorDetails.BUFFER_STALLED_ERROR: {\n        const stallingItem = this.endedItem || this.waitingItem || this.playingItem;\n        if (this.isInterstitial(stallingItem) && stallingItem.event.appendInPlace) {\n          this.handleInPlaceStall(stallingItem.event);\n          return;\n        }\n        this.log(`Primary player stall @${this.timelinePos} bufferedPos: ${this.bufferedPos}`);\n        this.onTimeupdate();\n        this.checkBuffer(true);\n        break;\n      }\n    }\n  }\n}\nconst TICK_INTERVAL$2 = 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    super.registerListeners();\n    const {\n      hls\n    } = this;\n    hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.on(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n    hls.on(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n    hls.on(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n    hls.on(Events.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this);\n    hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n  unregisterListeners() {\n    super.unregisterListeners();\n    const {\n      hls\n    } = this;\n    hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n    hls.off(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n    hls.off(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n    hls.off(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n    hls.off(Events.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this);\n    hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n  startLoad(startPosition, skipSeekToStartPosition) {\n    this.stopLoad();\n    this.state = State.IDLE;\n    this.setInterval(TICK_INTERVAL$2);\n    this.nextLoadPosition = this.lastCurrentTime = startPosition + this.timelineOffset;\n    this.startPosition = skipSeekToStartPosition ? -1 : startPosition;\n    this.tick();\n  }\n  onManifestLoading() {\n    super.onManifestLoading();\n    this.mainDetails = null;\n  }\n  onMediaDetaching(event, data) {\n    this.tracksBuffered = [];\n    super.onMediaDetaching(event, data);\n  }\n  onLevelLoaded(event, data) {\n    this.mainDetails = data.details;\n  }\n  onSubtitleFragProcessed(event, data) {\n    const {\n      frag,\n      success\n    } = data;\n    if (!this.fragContextChanged(frag)) {\n      if (isMediaFragment(frag)) {\n        this.fragPrevious = frag;\n      }\n      this.state = State.IDLE;\n    }\n    if (!success) {\n      return;\n    }\n    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    if (this.media) {\n      this.tick();\n    }\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  onError(event, data) {\n    const frag = data.frag;\n    if ((frag == null ? void 0 : frag.type) === PlaylistLevelType.SUBTITLE) {\n      if (data.details === ErrorDetails.FRAG_GAP) {\n        this.fragmentTracker.fragBuffered(frag, true);\n      }\n      if (this.fragCurrent) {\n        this.fragCurrent.abortRequests();\n      }\n      if (this.state !== State.STOPPED) {\n        this.state = State.IDLE;\n      }\n    }\n  }\n  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 && this.state !== State.STOPPED) {\n      this.setInterval(TICK_INTERVAL$2);\n    }\n  }\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[trackId];\n    if (trackId >= levels.length || !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      if (newDetails.deltaUpdateFailed) {\n        return;\n      }\n      const mainDetails = this.mainDetails;\n      if (!mainDetails) {\n        this.startFragRequested = false;\n        return;\n      }\n      const mainSlidingStartFragment = mainDetails.fragments[0];\n      if (!track.details) {\n        if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {\n          alignMediaPlaylistByPDT(newDetails, mainDetails);\n          sliding = newDetails.fragmentStart;\n        } else if (mainSlidingStartFragment) {\n          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      if (mainDetails && !this.startFragRequested) {\n        this.setStartPosition(mainDetails, sliding);\n      }\n    }\n    track.details = newDetails;\n    this.levelLastLoaded = track;\n    if (trackId !== currentTrackId) {\n      return;\n    }\n    this.hls.trigger(Events.SUBTITLE_TRACK_UPDATED, {\n      details: newDetails,\n      id: trackId,\n      groupId: data.groupId\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 && isFullSegmentEncryption(decryptData.method)) {\n      const startTime = performance.now();\n      this.decrypter.decrypt(new Uint8Array(payload), decryptData.key.buffer, decryptData.iv.buffer, getAesModeFromFullSegmentMethod(decryptData.method)).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      if (this.waitForLive(track)) {\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 trackDetails = track.details;\n      const maxBufLen = this.hls.maxBufferLength + 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      foundFrag = this.filterReplacedPrimary(foundFrag, track.details);\n      if (!foundFrag) {\n        return;\n      }\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      if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {\n        const fragToLoad = this.mapToInitFragWhenRequired(foundFrag);\n        if (fragToLoad) {\n          this.loadFragment(fragToLoad, track, targetBufferTime);\n        }\n      }\n    }\n  }\n  loadFragment(frag, level, targetBufferTime) {\n    if (!isMediaFragment(frag)) {\n      this._loadInitSegment(frag, level);\n    } else {\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}\nconst specialCea608CharsCodes = {\n  42: 225,\n  92: 233,\n  94: 237,\n  95: 243,\n  96: 250,\n  123: 231,\n  124: 247,\n  125: 209,\n  126: 241,\n  127: 9608,\n  128: 174,\n  129: 176,\n  130: 189,\n  131: 191,\n  132: 8482,\n  133: 162,\n  134: 163,\n  135: 9834,\n  136: 224,\n  137: 32,\n  138: 232,\n  139: 226,\n  140: 234,\n  141: 238,\n  142: 244,\n  143: 251,\n  144: 193,\n  145: 201,\n  146: 211,\n  147: 218,\n  148: 220,\n  149: 252,\n  150: 8216,\n  151: 161,\n  152: 42,\n  153: 8217,\n  154: 9473,\n  155: 169,\n  156: 8480,\n  157: 8226,\n  158: 8220,\n  159: 8221,\n  160: 192,\n  161: 194,\n  162: 199,\n  163: 200,\n  164: 202,\n  165: 203,\n  166: 235,\n  167: 206,\n  168: 207,\n  169: 239,\n  170: 212,\n  171: 217,\n  172: 249,\n  173: 219,\n  174: 171,\n  175: 187,\n  176: 195,\n  177: 227,\n  178: 205,\n  179: 204,\n  180: 236,\n  181: 210,\n  182: 242,\n  183: 213,\n  184: 245,\n  185: 123,\n  186: 125,\n  187: 92,\n  188: 94,\n  189: 95,\n  190: 124,\n  191: 8764,\n  192: 196,\n  193: 228,\n  194: 214,\n  195: 246,\n  196: 223,\n  197: 165,\n  198: 164,\n  199: 9475,\n  200: 197,\n  201: 229,\n  202: 216,\n  203: 248,\n  204: 9487,\n  205: 9491,\n  206: 9495,\n  207: 9499\n};\nconst getCharForByte = (byte) => String.fromCharCode(specialCea608CharsCodes[byte] || byte);\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  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  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  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  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 = \" + 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  setBkgData(bkgData) {\n    this.logger.log(2, () => \"bkgData = \" + 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  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: \" + 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  addData(time, byteList) {\n    this.logger.time = time;\n    for (let i = 0; i < byteList.length; i += 2) {\n      const a = byteList[i] & 127;\n      const b = byteList[i + 1] & 127;\n      let cmdFound = false;\n      let charsFound = null;\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      const cmdHistory = this.cmdHistory;\n      const isControlCode = a >= 16 && a <= 31;\n      if (isControlCode) {\n        if (hasCmdRepeated(a, b, cmdHistory)) {\n          setLastCmd(null, null, cmdHistory);\n          this.logger.log(3, () => \"Repeated command (\" + numArrayToHexArray([a, b]) + \") is dropped\");\n          continue;\n        }\n        setLastCmd(a, b, this.cmdHistory);\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      } else {\n        setLastCmd(null, null, cmdHistory);\n      }\n      if (!cmdFound) {\n        charsFound = this.parseChars(a, b);\n        if (charsFound) {\n          const currChNr = this.currentChannel;\n          if (currChNr && currChNr > 0) {\n            const channel = this.channels[currChNr];\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  parseCmd(a, b) {\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    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    this.currentChannel = chNr;\n    return true;\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  parsePAC(a, b) {\n    let row;\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    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    this.currentChannel = chNr;\n    return true;\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  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      this.logger.log(3, () => \"Char codes =  \" + numArrayToHexArray(charCodes).join(\",\"));\n    }\n    return charCodes;\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    return true;\n  }\n  reset() {\n    for (let i = 0; i < Object.keys(this.channels).length; i++) {\n      const channel = this.channels[i];\n      if (channel) {\n        channel.reset();\n      }\n    }\n    setLastCmd(null, null, this.cmdHistory);\n  }\n  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}\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  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 = Object.create(null);\n  }\n  set(k, v) {\n    if (!this.get(k) && v !== \"\") {\n      this.values[k] = v;\n    }\n  }\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  has(k) {\n    return k in this.values;\n  }\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  integer(k, v) {\n    if (/^-?\\d+$/.test(v)) {\n      this.set(k, parseInt(v, 10));\n    }\n  }\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(/^(ï»¿)?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};\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  ];\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 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}\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 = this.media = null;\n    this.cea608Parser1 = this.cea608Parser2 = void 0;\n  }\n  initCea608Parsers() {\n    const channel1 = new OutputFilter(this, \"textTrack1\");\n    const channel2 = new OutputFilter(this, \"textTrack2\");\n    const channel3 = new OutputFilter(this, \"textTrack3\");\n    const channel4 = new OutputFilter(this, \"textTrack4\");\n    this.cea608Parser1 = new Cea608Parser(1, channel1, channel2);\n    this.cea608Parser2 = new Cea608Parser(3, channel3, channel4);\n  }\n  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  onInitPtsFound(event, {\n    frag,\n    id,\n    initPTS,\n    timescale,\n    trackId\n  }) {\n    const {\n      unparsedVttFrags\n    } = this;\n    if (id === PlaylistLevelType.MAIN) {\n      this.initPTS[frag.cc] = {\n        baseTime: initPTS,\n        timescale,\n        trackId\n      };\n    }\n    if (unparsedVttFrags.length) {\n      this.unparsedVttFrags = [];\n      unparsedVttFrags.forEach((data) => {\n        if (this.initPTS[data.frag.cc]) {\n          this.onFragLoaded(Events.FRAG_LOADED, data);\n        } else {\n          this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n            success: false,\n            frag: data.frag,\n            error: new Error(\"Subtitle discontinuity domain does not match main\")\n          });\n        }\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          characteristics: \"transcribes-spoken-dialog,describes-music-and-sound\"\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    if (!data.mediaSource) {\n      this._cleanTracks();\n    }\n  }\n  onMediaDetaching(event, data) {\n    const transferringMedia = !!data.transferMedia;\n    this.media = null;\n    if (transferringMedia) {\n      return;\n    }\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            this.hls.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    if (this.enabled && data.frag.type === PlaylistLevelType.MAIN) {\n      var _data$part$index, _data$part;\n      const {\n        cea608Parser1,\n        cea608Parser2,\n        lastSn\n      } = this;\n      const {\n        cc,\n        sn\n      } = data.frag;\n      const partIndex = (_data$part$index = (_data$part = data.part) == null ? void 0 : _data$part.index) != null ? _data$part$index : -1;\n      if (cea608Parser1 && cea608Parser2) {\n        if (sn !== lastSn + 1 || sn === lastSn && partIndex !== this.lastPartIndex + 1 || cc !== this.lastCc) {\n          cea608Parser1.reset();\n          cea608Parser2.reset();\n        }\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      hls.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)).buffer : 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      hls.logger.log(`Failed to parse VTT cue: ${error}`);\n      if (missingInitPTS && maxAvCC > frag.cc) {\n        return;\n      }\n      hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n        success: false,\n        frag,\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    if (!this.enabled || !this.config.enableCEA708Captions) {\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        if (!this.cea608Parser1) {\n          this.initCea608Parsers();\n        }\n        const ccdatas = this.extractCea608Data(ccBytes);\n        this.cea608Parser1.addData(samples[i].pts, ccdatas[0]);\n        this.cea608Parser2.addData(samples[i].pts, ccdatas[1]);\n      }\n    }\n  }\n  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 (ccType === 0 || ccType === 1) {\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}\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};\nfunction fetchSupported() {\n  if (self.fetch && self.AbortController && self.ReadableStream && self.Request) {\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 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      if (this.callbacks) {\n        this.abortInternal();\n        this.callbacks.onTimeout(stats, context, this.response);\n      }\n    }, config.timeout);\n    const fetchPromise = isPromise(this.request) ? this.request.then(self.fetch) : self.fetch(this.request);\n    fetchPromise.then((response) => {\n      var _this$callbacks2;\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        if (this.callbacks) {\n          this.abortInternal();\n          this.callbacks.onTimeout(stats, context, this.response);\n        }\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      const onProgress = (_this$callbacks2 = this.callbacks) == null ? void 0 : _this$callbacks2.onProgress;\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      var _this$callbacks3, _this$callbacks4;\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      const onProgress = (_this$callbacks3 = this.callbacks) == null ? void 0 : _this$callbacks3.onProgress;\n      if (onProgress && !isFiniteNumber(config.highWaterMark)) {\n        onProgress(stats, context, responseData, response);\n      }\n      (_this$callbacks4 = this.callbacks) == null || _this$callbacks4.onSuccess(loaderResponse, stats, context, response);\n    }).catch((error) => {\n      var _this$callbacks5;\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      (_this$callbacks5 = this.callbacks) == null || _this$callbacks5.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().buffer, 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().buffer, response);\n          }\n        } else {\n          onProgress(stats, context, chunk.buffer, 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 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  }\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.loader !== xhr || this.stats.aborted)\n          return;\n        return xhrSetup(xhr, context.url);\n      }).catch((error) => {\n        if (this.loader !== xhr || this.stats.aborted)\n          return;\n        xhr.open(\"GET\", context.url, true);\n        return xhrSetup(xhr, context.url);\n      }).then(() => {\n        if (this.loader !== xhr || this.stats.aborted)\n          return;\n        this.openAndSendXhr(xhr, context, config);\n      }).catch((error) => {\n        var _this$callbacks2;\n        (_this$callbacks2 = this.callbacks) == null || _this$callbacks2.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 useResponseText = xhr.responseType === \"text\" ? xhr.responseText : null;\n        if (status2 >= 200 && status2 < 300) {\n          const data = useResponseText != null ? useResponseText : xhr.response;\n          if (data != null) {\n            var _this$callbacks3, _this$callbacks4;\n            stats.loading.end = Math.max(self.performance.now(), stats.loading.first);\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            const onProgress = (_this$callbacks3 = this.callbacks) == null ? void 0 : _this$callbacks3.onProgress;\n            if (onProgress) {\n              onProgress(stats, context, data, xhr);\n            }\n            const _response = {\n              url: xhr.responseURL,\n              data,\n              code: status2\n            };\n            (_this$callbacks4 = this.callbacks) == null || _this$callbacks4.onSuccess(_response, stats, context, xhr);\n            return;\n          }\n        }\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          var _this$callbacks5;\n          logger.error(`${status2} while loading ${context.url}`);\n          (_this$callbacks5 = this.callbacks) == null || _this$callbacks5.onError({\n            code: status2,\n            text: xhr.statusText\n          }, context, xhr, stats);\n        }\n      }\n    }\n  }\n  loadtimeout() {\n    if (!this.config)\n      return;\n    const retryConfig = this.config.loadPolicy.timeoutRetry;\n    const retryCount = this.stats.retry;\n    if (shouldRetry(retryConfig, retryCount, true)) {\n      this.retry(retryConfig);\n    } else {\n      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}\nconst defaultLoadPolicy = {\n  maxTimeToFirstByteMs: 8e3,\n  maxLoadTimeMs: 2e4,\n  timeoutRetry: null,\n  errorRetry: null\n};\nconst hlsDefaultConfig = _objectSpread2(_objectSpread2({\n  autoStartLoad: true,\n  startPosition: -1,\n  defaultAudioCodec: void 0,\n  debug: false,\n  capLevelOnFPSDrop: false,\n  capLevelToPlayerSize: false,\n  ignoreDevicePixelRatio: false,\n  maxDevicePixelRatio: Number.POSITIVE_INFINITY,\n  preferManagedMediaSource: true,\n  initialLiveManifestSize: 1,\n  maxBufferLength: 30,\n  backBufferLength: Infinity,\n  frontBufferFlushThreshold: Infinity,\n  startOnSegmentBoundary: false,\n  maxBufferSize: 60 * 1e3 * 1e3,\n  maxFragLookUpTolerance: 0.25,\n  maxBufferHole: 0.1,\n  detectStallWithCurrentTimeMs: 1250,\n  highBufferWatchdogPeriod: 2,\n  nudgeOffset: 0.1,\n  nudgeMaxRetry: 3,\n  nudgeOnVideoHole: true,\n  liveSyncMode: \"edge\",\n  liveSyncDurationCount: 3,\n  liveSyncOnStallIncrease: 1,\n  liveMaxLatencyDurationCount: Infinity,\n  liveSyncDuration: void 0,\n  liveMaxLatencyDuration: void 0,\n  maxLiveSyncPlaybackRate: 1,\n  liveDurationInfinity: false,\n  liveBackBufferLength: null,\n  maxMaxBufferLength: 600,\n  enableWorker: true,\n  workerPath: null,\n  enableSoftwareAES: true,\n  startLevel: void 0,\n  startFragPrefetch: false,\n  fpsDroppedMonitoringPeriod: 5e3,\n  fpsDroppedMonitoringThreshold: 0.2,\n  appendErrorMaxRetry: 3,\n  ignorePlaylistParsingErrors: false,\n  loader: XhrLoader,\n  fLoader: void 0,\n  pLoader: void 0,\n  xhrSetup: void 0,\n  licenseXhrSetup: void 0,\n  licenseResponseCallback: void 0,\n  abrController: AbrController,\n  bufferController: BufferController,\n  capLevelController: CapLevelController,\n  errorController: ErrorController,\n  fpsController: FPSController,\n  stretchShortVideoTrack: false,\n  maxAudioFramesDrift: 1,\n  forceKeyFrameOnDiscontinuity: true,\n  abrEwmaFastLive: 3,\n  abrEwmaSlowLive: 9,\n  abrEwmaFastVoD: 3,\n  abrEwmaSlowVoD: 9,\n  abrEwmaDefaultEstimate: 5e5,\n  abrEwmaDefaultEstimateMax: 5e6,\n  abrBandWidthFactor: 0.95,\n  abrBandWidthUpFactor: 0.7,\n  abrMaxWithRealBitrate: false,\n  maxStarvationDelay: 4,\n  maxLoadingDelay: 4,\n  minAutoBitrate: 0,\n  emeEnabled: false,\n  widevineLicenseUrl: void 0,\n  drmSystems: {},\n  drmSystemOptions: {},\n  requestMediaKeySystemAccessFunc: requestMediaKeySystemAccess,\n  requireKeySystemAccessOnStart: false,\n  testBandwidth: true,\n  progressive: false,\n  lowLatencyMode: true,\n  cmcd: void 0,\n  enableDateRangeMetadataCues: true,\n  enableEmsgMetadataCues: true,\n  enableEmsgKLVMetadata: false,\n  enableID3MetadataCues: true,\n  enableInterstitialPlayback: true,\n  interstitialAppendInPlace: true,\n  interstitialLiveLookAhead: 10,\n  useMediaCapabilities: true,\n  preserveManualLevelOnError: false,\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  interstitialAssetListLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 3e4,\n      timeoutRetry: {\n        maxNumRetry: 0,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 0,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\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  interstitialsController: InterstitialsController\n});\nfunction timelineConfig() {\n  return {\n    cueHandler: Cues,\n    enableWebVTT: true,\n    enableIMSC1: true,\n    enableCEA708Captions: true,\n    captionsTextTrack1Label: \"English\",\n    captionsTextTrack1LanguageCode: \"en\",\n    captionsTextTrack2Label: \"Spanish\",\n    captionsTextTrack2LanguageCode: \"es\",\n    captionsTextTrack3Label: \"Unknown CC\",\n    captionsTextTrack3LanguageCode: \"\",\n    captionsTextTrack4Label: \"Unknown CC\",\n    captionsTextTrack4LanguageCode: \"\",\n    renderTextTracksNatively: true\n  };\n}\nfunction mergeConfig(defaultConfig, userConfig, logger2) {\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      logger2.warn(`hls.js config: \"${report.join('\", \"')}\" setting(s) are deprecated, use \"${policyName}\": ${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, logger2) {\n  const currentLoader = config.loader;\n  if (currentLoader !== FetchLoader && currentLoader !== XhrLoader) {\n    logger2.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      logger2.log(\"[config]: Progressive streaming enabled, using FetchLoader\");\n    }\n  }\n}\nconst MAX_START_GAP_JUMP = 2;\nconst SKIP_BUFFER_HOLE_STEP_SECONDS = 0.1;\nconst SKIP_BUFFER_RANGE_START = 0.05;\nconst TICK_INTERVAL$1 = 100;\nclass GapController extends TaskLoop {\n  constructor(hls, fragmentTracker) {\n    super(\"gap-controller\", hls.logger);\n    this.hls = void 0;\n    this.fragmentTracker = void 0;\n    this.media = null;\n    this.mediaSource = void 0;\n    this.nudgeRetry = 0;\n    this.stallReported = false;\n    this.stalled = null;\n    this.moved = false;\n    this.seeking = false;\n    this.buffered = {};\n    this.lastCurrentTime = 0;\n    this.ended = 0;\n    this.waiting = 0;\n    this.onMediaPlaying = () => {\n      this.ended = 0;\n      this.waiting = 0;\n    };\n    this.onMediaWaiting = () => {\n      var _this$media;\n      if ((_this$media = this.media) != null && _this$media.seeking) {\n        return;\n      }\n      this.waiting = self.performance.now();\n      this.tick();\n    };\n    this.onMediaEnded = () => {\n      if (this.hls) {\n        var _this$media2;\n        this.ended = ((_this$media2 = this.media) == null ? void 0 : _this$media2.currentTime) || 1;\n        this.hls.trigger(Events.MEDIA_ENDED, {\n          stalled: false\n        });\n      }\n    };\n    this.hls = hls;\n    this.fragmentTracker = fragmentTracker;\n    this.registerListeners();\n  }\n  registerListeners() {\n    const {\n      hls\n    } = this;\n    if (hls) {\n      hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n    }\n  }\n  unregisterListeners() {\n    const {\n      hls\n    } = this;\n    if (hls) {\n      hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n    }\n  }\n  destroy() {\n    super.destroy();\n    this.unregisterListeners();\n    this.media = this.hls = this.fragmentTracker = null;\n    this.mediaSource = void 0;\n  }\n  onMediaAttached(event, data) {\n    this.setInterval(TICK_INTERVAL$1);\n    this.mediaSource = data.mediaSource;\n    const media = this.media = data.media;\n    addEventListener(media, \"playing\", this.onMediaPlaying);\n    addEventListener(media, \"waiting\", this.onMediaWaiting);\n    addEventListener(media, \"ended\", this.onMediaEnded);\n  }\n  onMediaDetaching(event, data) {\n    this.clearInterval();\n    const {\n      media\n    } = this;\n    if (media) {\n      removeEventListener(media, \"playing\", this.onMediaPlaying);\n      removeEventListener(media, \"waiting\", this.onMediaWaiting);\n      removeEventListener(media, \"ended\", this.onMediaEnded);\n      this.media = null;\n    }\n    this.mediaSource = void 0;\n  }\n  onBufferAppended(event, data) {\n    this.buffered = data.timeRanges;\n  }\n  get hasBuffered() {\n    return Object.keys(this.buffered).length > 0;\n  }\n  tick() {\n    var _this$media3;\n    if (!((_this$media3 = this.media) != null && _this$media3.readyState) || !this.hasBuffered) {\n      return;\n    }\n    const currentTime = this.media.currentTime;\n    this.poll(currentTime, this.lastCurrentTime);\n    this.lastCurrentTime = currentTime;\n  }\n  poll(currentTime, lastCurrentTime) {\n    var _this$hls, _this$hls2;\n    const config = (_this$hls = this.hls) == null ? void 0 : _this$hls.config;\n    if (!config) {\n      return;\n    }\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    const {\n      seeking\n    } = media;\n    const seeked = this.seeking && !seeking;\n    const beginSeek = !this.seeking && seeking;\n    const pausedEndedOrHalted = media.paused && !seeking || media.ended || media.playbackRate === 0;\n    this.seeking = seeking;\n    if (currentTime !== lastCurrentTime) {\n      if (lastCurrentTime) {\n        this.ended = 0;\n      }\n      this.moved = true;\n      if (!seeking) {\n        this.nudgeRetry = 0;\n        if (config.nudgeOnVideoHole && !pausedEndedOrHalted && currentTime > lastCurrentTime) {\n          this.nudgeOnVideoHole(currentTime, lastCurrentTime);\n        }\n      }\n      if (this.waiting === 0) {\n        this.stallResolved(currentTime);\n      }\n      return;\n    }\n    if (beginSeek || seeked) {\n      if (seeked) {\n        this.stallResolved(currentTime);\n      }\n      return;\n    }\n    if (pausedEndedOrHalted) {\n      this.nudgeRetry = 0;\n      this.stallResolved(currentTime);\n      if (!this.ended && media.ended && this.hls) {\n        this.ended = currentTime || 1;\n        this.hls.trigger(Events.MEDIA_ENDED, {\n          stalled: false\n        });\n      }\n      return;\n    }\n    if (!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    const fragmentTracker = this.fragmentTracker;\n    if (seeking && fragmentTracker && this.hls) {\n      const inFlightDependency = getInFlightDependency(this.hls.inFlightFragments, currentTime);\n      const hasEnoughBuffer = bufferInfo.len > MAX_START_GAP_JUMP;\n      const noBufferHole = !nextStart || inFlightDependency || nextStart - currentTime > MAX_START_GAP_JUMP && !fragmentTracker.getPartialFragment(currentTime);\n      if (hasEnoughBuffer || noBufferHole) {\n        return;\n      }\n      this.moved = false;\n    }\n    const levelDetails = (_this$hls2 = this.hls) == null ? void 0 : _this$hls2.latestLevelDetails;\n    if (!this.moved && this.stalled !== null && fragmentTracker) {\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 isLive = !!(levelDetails != null && levelDetails.live);\n      const maxStartGapJump = isLive ? levelDetails.targetduration * 2 : MAX_START_GAP_JUMP;\n      const appended = appendedFragAtPosition(currentTime, fragmentTracker);\n      if (startJump > 0 && (startJump <= maxStartGapJump || appended)) {\n        if (!media.paused) {\n          this._trySkipBufferHole(appended);\n        }\n        return;\n      }\n    }\n    const detectStallWithCurrentTimeMs = config.detectStallWithCurrentTimeMs;\n    const tnow = self.performance.now();\n    const tWaiting = this.waiting;\n    let stalled = this.stalled;\n    if (stalled === null) {\n      if (tWaiting > 0 && tnow - tWaiting < detectStallWithCurrentTimeMs) {\n        stalled = this.stalled = tWaiting;\n      } else {\n        this.stalled = tnow;\n        return;\n      }\n    }\n    const stalledDuration = tnow - stalled;\n    if (!seeking && (stalledDuration >= detectStallWithCurrentTimeMs || tWaiting) && this.hls) {\n      var _this$mediaSource;\n      if (((_this$mediaSource = this.mediaSource) == null ? void 0 : _this$mediaSource.readyState) === \"ended\" && !(levelDetails != null && levelDetails.live) && Math.abs(currentTime - ((levelDetails == null ? void 0 : levelDetails.edge) || 0)) < 1) {\n        if (this.ended) {\n          return;\n        }\n        this.ended = currentTime || 1;\n        this.hls.trigger(Events.MEDIA_ENDED, {\n          stalled: true\n        });\n        return;\n      }\n      this._reportStall(bufferInfo);\n      if (!this.media || !this.hls) {\n        return;\n      }\n    }\n    const bufferedWithHoles = BufferHelper.bufferInfo(media, currentTime, config.maxBufferHole);\n    this._tryFixBufferStall(bufferedWithHoles, stalledDuration, currentTime);\n  }\n  stallResolved(currentTime) {\n    const stalled = this.stalled;\n    if (stalled && this.hls) {\n      this.stalled = null;\n      if (this.stallReported) {\n        const stalledDuration = self.performance.now() - stalled;\n        this.log(`playback not stuck anymore @${currentTime}, after ${Math.round(stalledDuration)}ms`);\n        this.stallReported = false;\n        this.waiting = 0;\n        this.hls.trigger(Events.STALL_RESOLVED, {});\n      }\n    }\n  }\n  nudgeOnVideoHole(currentTime, lastCurrentTime) {\n    var _this$buffered$audio;\n    const videoSourceBuffered = this.buffered.video;\n    if (this.hls && this.media && this.fragmentTracker && (_this$buffered$audio = this.buffered.audio) != null && _this$buffered$audio.length && videoSourceBuffered && videoSourceBuffered.length > 1 && currentTime > videoSourceBuffered.end(0)) {\n      const audioBufferInfo = BufferHelper.bufferedInfo(BufferHelper.timeRangesToArray(this.buffered.audio), currentTime, 0);\n      if (audioBufferInfo.len > 1 && lastCurrentTime >= audioBufferInfo.start) {\n        const videoTimes = BufferHelper.timeRangesToArray(videoSourceBuffered);\n        const lastBufferedIndex = BufferHelper.bufferedInfo(videoTimes, lastCurrentTime, 0).bufferedIndex;\n        if (lastBufferedIndex > -1 && lastBufferedIndex < videoTimes.length - 1) {\n          const bufferedIndex = BufferHelper.bufferedInfo(videoTimes, currentTime, 0).bufferedIndex;\n          const holeStart = videoTimes[lastBufferedIndex].end;\n          const holeEnd = videoTimes[lastBufferedIndex + 1].start;\n          if ((bufferedIndex === -1 || bufferedIndex > lastBufferedIndex) && holeEnd - holeStart < 1 && currentTime - holeStart < 2) {\n            const error = new Error(`nudging playhead to flush pipeline after video hole. currentTime: ${currentTime} hole: ${holeStart} -> ${holeEnd} buffered index: ${bufferedIndex}`);\n            this.warn(error.message);\n            this.media.currentTime += 1e-6;\n            let frag = appendedFragAtPosition(currentTime, this.fragmentTracker);\n            if (frag && \"fragment\" in frag) {\n              frag = frag.fragment;\n            } else if (!frag) {\n              frag = void 0;\n            }\n            const bufferInfo = BufferHelper.bufferInfo(this.media, currentTime, 0);\n            this.hls.trigger(Events.ERROR, {\n              type: ErrorTypes.MEDIA_ERROR,\n              details: ErrorDetails.BUFFER_SEEK_OVER_HOLE,\n              fatal: false,\n              error,\n              reason: error.message,\n              frag,\n              buffer: bufferInfo.len,\n              bufferInfo\n            });\n          }\n        }\n      }\n    }\n  }\n  _tryFixBufferStall(bufferInfo, stalledDurationMs, currentTime) {\n    var _this$hls3, _this$hls4;\n    const {\n      fragmentTracker,\n      media\n    } = this;\n    const config = (_this$hls3 = this.hls) == null ? void 0 : _this$hls3.config;\n    if (!media || !fragmentTracker || !config) {\n      return;\n    }\n    const levelDetails = (_this$hls4 = this.hls) == null ? void 0 : _this$hls4.latestLevelDetails;\n    const appended = appendedFragAtPosition(currentTime, fragmentTracker);\n    if (appended || levelDetails != null && levelDetails.live && currentTime < levelDetails.fragmentStart) {\n      const targetTime = this._trySkipBufferHole(appended);\n      if (targetTime || !this.media) {\n        return;\n      }\n    }\n    const bufferedRanges = bufferInfo.buffered;\n    const adjacentTraversal = this.adjacentTraversal(bufferInfo, currentTime);\n    if ((bufferedRanges && bufferedRanges.length > 1 && bufferInfo.len > config.maxBufferHole || bufferInfo.nextStart && (bufferInfo.nextStart - currentTime < config.maxBufferHole || adjacentTraversal)) && (stalledDurationMs > config.highBufferWatchdogPeriod * 1e3 || this.waiting)) {\n      this.warn(\"Trying to nudge playhead over buffer-hole\");\n      this._tryNudgeBuffer(bufferInfo);\n    }\n  }\n  adjacentTraversal(bufferInfo, currentTime) {\n    const fragmentTracker = this.fragmentTracker;\n    const nextStart = bufferInfo.nextStart;\n    if (fragmentTracker && nextStart) {\n      const current = fragmentTracker.getFragAtPos(currentTime, PlaylistLevelType.MAIN);\n      const next = fragmentTracker.getFragAtPos(nextStart, PlaylistLevelType.MAIN);\n      if (current && next) {\n        return next.sn - current.sn < 2;\n      }\n    }\n    return false;\n  }\n  _reportStall(bufferInfo) {\n    const {\n      hls,\n      media,\n      stallReported,\n      stalled\n    } = this;\n    if (!stallReported && stalled !== null && media && hls) {\n      this.stallReported = true;\n      const error = new Error(`Playback stalling at @${media.currentTime} due to low buffer (${stringify(bufferInfo)})`);\n      this.warn(error.message);\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_STALLED_ERROR,\n        fatal: false,\n        error,\n        buffer: bufferInfo.len,\n        bufferInfo,\n        stalled: {\n          start: stalled\n        }\n      });\n    }\n  }\n  _trySkipBufferHole(appended) {\n    var _this$hls5;\n    const {\n      fragmentTracker,\n      media\n    } = this;\n    const config = (_this$hls5 = this.hls) == null ? void 0 : _this$hls5.config;\n    if (!media || !fragmentTracker || !config) {\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 && this.hls) {\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          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 && appended) {\n            var _this$hls$loadLevelOb;\n            if (!((_this$hls$loadLevelOb = this.hls.loadLevelObj) != null && _this$hls$loadLevelOb.details)) {\n              return 0;\n            }\n            const inFlightDependency = getInFlightDependency(this.hls.inFlightFragments, startTime);\n            if (inFlightDependency) {\n              return 0;\n            }\n            let moreToLoad = false;\n            let pos = appended.end;\n            while (pos < startTime) {\n              const provisioned = appendedFragAtPosition(pos, fragmentTracker);\n              if (provisioned) {\n                pos += provisioned.duration;\n              } else {\n                moreToLoad = true;\n                break;\n              }\n            }\n            if (moreToLoad) {\n              return 0;\n            }\n          }\n        }\n        const targetTime = Math.max(startTime + SKIP_BUFFER_RANGE_START, currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS);\n        this.warn(`skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}`);\n        this.moved = true;\n        media.currentTime = targetTime;\n        if (!(appended != null && appended.gap)) {\n          const error = new Error(`fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}`);\n          const errorData = {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.BUFFER_SEEK_OVER_HOLE,\n            fatal: false,\n            error,\n            reason: error.message,\n            buffer: bufferInfo.len,\n            bufferInfo\n          };\n          if (appended) {\n            if (\"fragment\" in appended) {\n              errorData.part = appended;\n            } else {\n              errorData.frag = appended;\n            }\n          }\n          this.hls.trigger(Events.ERROR, errorData);\n        }\n        return targetTime;\n      }\n    }\n    return 0;\n  }\n  _tryNudgeBuffer(bufferInfo) {\n    const {\n      hls,\n      media,\n      nudgeRetry\n    } = this;\n    const config = hls == null ? void 0 : hls.config;\n    if (!media || !config) {\n      return 0;\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      this.warn(error.message);\n      media.currentTime = targetTime;\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_NUDGE_ON_STALL,\n        error,\n        fatal: false,\n        buffer: bufferInfo.len,\n        bufferInfo\n      });\n    } else {\n      const error = new Error(`Playhead still not moving while enough data buffered @${currentTime} after ${config.nudgeMaxRetry} nudges`);\n      this.error(error.message);\n      hls.trigger(Events.ERROR, {\n        type: ErrorTypes.MEDIA_ERROR,\n        details: ErrorDetails.BUFFER_STALLED_ERROR,\n        error,\n        fatal: true,\n        buffer: bufferInfo.len,\n        bufferInfo\n      });\n    }\n  }\n}\nfunction getInFlightDependency(inFlightFragments, currentTime) {\n  const main = inFlight(inFlightFragments.main);\n  if (main && main.start <= currentTime) {\n    return main;\n  }\n  const audio = inFlight(inFlightFragments.audio);\n  if (audio && audio.start <= currentTime) {\n    return audio;\n  }\n  return null;\n}\nfunction inFlight(inFlightData) {\n  if (!inFlightData) {\n    return null;\n  }\n  switch (inFlightData.state) {\n    case State.IDLE:\n    case State.STOPPED:\n    case State.ENDED:\n    case State.ERROR:\n      return null;\n  }\n  return inFlightData.frag;\n}\nfunction appendedFragAtPosition(pos, fragmentTracker) {\n  return fragmentTracker.getAppendedFrag(pos, PlaylistLevelType.MAIN) || fragmentTracker.getPartialFragment(pos);\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, 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})();\nclass ID3TrackController {\n  constructor(hls) {\n    this.hls = void 0;\n    this.id3Track = null;\n    this.media = null;\n    this.dateRangeCuesAppended = {};\n    this.removeCues = true;\n    this.assetCue = void 0;\n    this.onEventCueEnter = () => {\n      if (!this.hls) {\n        return;\n      }\n      this.hls.trigger(Events.EVENT_CUE_ENTER, {});\n    };\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 = this.onEventCueEnter = null;\n  }\n  _registerListeners() {\n    const {\n      hls\n    } = this;\n    if (hls) {\n      hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.on(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);\n      hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n      hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.on(Events.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this);\n    }\n  }\n  _unregisterListeners() {\n    const {\n      hls\n    } = this;\n    if (hls) {\n      hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n      hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n      hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n      hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n      hls.off(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);\n      hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n      hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n      hls.off(Events.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this);\n    }\n  }\n  onMediaAttaching(event, data) {\n    var _data$overrides;\n    this.media = data.media;\n    if (((_data$overrides = data.overrides) == null ? void 0 : _data$overrides.cueRemoval) === false) {\n      this.removeCues = false;\n    }\n  }\n  onMediaAttached() {\n    var _this$hls;\n    const details = (_this$hls = this.hls) == null ? void 0 : _this$hls.latestLevelDetails;\n    if (details) {\n      this.updateDateRangeCues(details);\n    }\n  }\n  onMediaDetaching(event, data) {\n    this.media = null;\n    const transferringMedia = !!data.transferMedia;\n    if (transferringMedia) {\n      return;\n    }\n    if (this.id3Track) {\n      if (this.removeCues) {\n        clearCurrentCues(this.id3Track, this.onEventCueEnter);\n      }\n      this.id3Track = null;\n    }\n    this.dateRangeCuesAppended = {};\n  }\n  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 || !this.hls) {\n      return;\n    }\n    const {\n      enableEmsgMetadataCues,\n      enableID3MetadataCues\n    } = this.hls.config;\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      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 (!isId3TimestampFrame(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  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    this.updateDateRangeCues(details, true);\n  }\n  onLevelPtsUpdated(event, data) {\n    if (Math.abs(data.drift) > 0.01) {\n      this.updateDateRangeCues(data.details);\n    }\n  }\n  updateDateRangeCues(details, removeOldCues) {\n    if (!this.hls || !this.media) {\n      return;\n    }\n    const {\n      assetPlayerId,\n      timelineOffset,\n      enableDateRangeMetadataCues,\n      interstitialsController\n    } = this.hls.config;\n    if (!enableDateRangeMetadataCues) {\n      return;\n    }\n    const Cue = getCueClass();\n    if (assetPlayerId && timelineOffset && !interstitialsController) {\n      const {\n        fragmentStart,\n        fragmentEnd\n      } = details;\n      let cue = this.assetCue;\n      if (cue) {\n        cue.startTime = fragmentStart;\n        cue.endTime = fragmentEnd;\n      } else if (Cue) {\n        cue = this.assetCue = createCueWithDataFields(Cue, fragmentStart, fragmentEnd, {\n          assetPlayerId: this.hls.config.assetPlayerId\n        }, \"hlsjs.interstitial.asset\");\n        if (cue) {\n          cue.id = assetPlayerId;\n          this.id3Track || (this.id3Track = this.createTrack(this.media));\n          this.id3Track.addCue(cue);\n          cue.addEventListener(\"enter\", this.onEventCueEnter);\n        }\n      }\n    }\n    if (!details.hasProgramDateTime) {\n      return;\n    }\n    const {\n      id3Track\n    } = this;\n    const {\n      dateRanges\n    } = details;\n    const ids = Object.keys(dateRanges);\n    let dateRangeCuesAppended = this.dateRangeCuesAppended;\n    if (id3Track && removeOldCues) {\n      var _id3Track$cues;\n      if ((_id3Track$cues = id3Track.cues) != null && _id3Track$cues.length) {\n        const idsToRemove = Object.keys(dateRangeCuesAppended).filter((id) => !ids.includes(id));\n        for (let i = idsToRemove.length; i--; ) {\n          var _dateRangeCuesAppende;\n          const id = idsToRemove[i];\n          const cues = (_dateRangeCuesAppende = dateRangeCuesAppended[id]) == null ? void 0 : _dateRangeCuesAppende.cues;\n          delete dateRangeCuesAppended[id];\n          if (cues) {\n            Object.keys(cues).forEach((key) => {\n              const cue = cues[key];\n              if (cue) {\n                cue.removeEventListener(\"enter\", this.onEventCueEnter);\n                try {\n                  id3Track.removeCue(cue);\n                } catch (e) {\n                }\n              }\n            });\n          }\n        }\n      } else {\n        dateRangeCuesAppended = this.dateRangeCuesAppended = {};\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    this.id3Track || (this.id3Track = this.createTrack(this.media));\n    for (let i = 0; i < ids.length; i++) {\n      const id = ids[i];\n      const dateRange = dateRanges[id];\n      const startTime = dateRange.startTime;\n      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 {\n        duration,\n        endDate\n      } = dateRange;\n      if (endDate && duration !== null) {\n        endTime = startTime + duration;\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 = nextDateRangeWithSameClass.startTime;\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 != null && appendedDateRangeCues.durationKnown)) {\n            cue.endTime = endTime;\n          } else if (Math.abs(cue.startTime - startTime) > 0.01) {\n            cue.startTime = startTime;\n            cue.endTime = endTime;\n          }\n        } else if (Cue) {\n          let data = dateRange.attr[key];\n          if (isSCTE35Attribute(key)) {\n            data = hexToArrayBuffer(data);\n          }\n          const payload = {\n            key,\n            data\n          };\n          const _cue = createCueWithDataFields(Cue, startTime, endTime, payload, MetadataSchema.dateRange);\n          if (_cue) {\n            _cue.id = id;\n            this.id3Track.addCue(_cue);\n            cues[key] = _cue;\n            if (interstitialsController) {\n              if (key === \"X-ASSET-LIST\" || key === \"X-ASSET-URL\") {\n                _cue.addEventListener(\"enter\", this.onEventCueEnter);\n              }\n            }\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.currentTime = 0;\n    this.stallCount = 0;\n    this._latency = null;\n    this._targetLatencyUpdated = false;\n    this.onTimeupdate = () => {\n      const {\n        media\n      } = this;\n      const levelDetails = this.levelDetails;\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        const playbackRate = Math.min(max, Math.max(1, rate));\n        this.changeMediaPlaybackRate(media, playbackRate);\n      } else if (media.playbackRate !== 1 && media.playbackRate !== 0) {\n        this.changeMediaPlaybackRate(media, 1);\n      }\n    };\n    this.hls = hls;\n    this.config = hls.config;\n    this.registerListeners();\n  }\n  get levelDetails() {\n    var _this$hls;\n    return ((_this$hls = this.hls) == null ? void 0 : _this$hls.latestLevelDetails) || null;\n  }\n  get latency() {\n    return this._latency || 0;\n  }\n  get maxLatency() {\n    const {\n      config\n    } = this;\n    if (config.liveMaxLatencyDuration !== void 0) {\n      return config.liveMaxLatencyDuration;\n    }\n    const levelDetails = this.levelDetails;\n    return levelDetails ? config.liveMaxLatencyDurationCount * levelDetails.targetduration : 0;\n  }\n  get targetLatency() {\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null || this.hls === 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 (this._targetLatencyUpdated || userConfig.liveSyncDuration || userConfig.liveSyncDurationCount || targetLatency === 0) {\n      targetLatency = liveSyncDuration !== void 0 ? liveSyncDuration : liveSyncDurationCount * targetduration;\n    }\n    const maxLiveSyncOnStallIncrease = targetduration;\n    return targetLatency + Math.min(this.stallCount * this.config.liveSyncOnStallIncrease, maxLiveSyncOnStallIncrease);\n  }\n  set targetLatency(latency) {\n    this.stallCount = 0;\n    this.config.liveSyncDuration = latency;\n    this._targetLatencyUpdated = true;\n  }\n  get liveSyncPosition() {\n    const liveEdge = this.estimateLiveEdge();\n    const targetLatency = this.targetLatency;\n    if (liveEdge === null || targetLatency === null) {\n      return null;\n    }\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null) {\n      return null;\n    }\n    const edge = levelDetails.edge;\n    const syncPosition = liveEdge - targetLatency - this.edgeStalled;\n    const min = edge - levelDetails.totalduration;\n    const max = edge - (this.config.lowLatencyMode && levelDetails.partTarget || levelDetails.targetduration);\n    return Math.min(Math.max(min, syncPosition), max);\n  }\n  get drift() {\n    const levelDetails = this.levelDetails;\n    if (levelDetails === null) {\n      return 1;\n    }\n    return levelDetails.drift;\n  }\n  get edgeStalled() {\n    const levelDetails = this.levelDetails;\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    } = this;\n    const levelDetails = this.levelDetails;\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.hls = null;\n  }\n  registerListeners() {\n    const {\n      hls\n    } = this;\n    if (!hls) {\n      return;\n    }\n    hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    hls.on(Events.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const {\n      hls\n    } = this;\n    if (!hls) {\n      return;\n    }\n    hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n    hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n    hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n    hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n    hls.off(Events.ERROR, this.onError, this);\n  }\n  onMediaAttached(event, data) {\n    this.media = data.media;\n    this.media.addEventListener(\"timeupdate\", this.onTimeupdate);\n  }\n  onMediaDetaching() {\n    if (this.media) {\n      this.media.removeEventListener(\"timeupdate\", this.onTimeupdate);\n      this.media = null;\n    }\n  }\n  onManifestLoading() {\n    this._latency = null;\n    this.stallCount = 0;\n  }\n  onLevelUpdated(event, {\n    details\n  }) {\n    if (details.advanced) {\n      this.onTimeupdate();\n    }\n    if (!details.live && this.media) {\n      this.media.removeEventListener(\"timeupdate\", this.onTimeupdate);\n    }\n  }\n  onError(event, data) {\n    var _this$levelDetails;\n    if (data.details !== ErrorDetails.BUFFER_STALLED_ERROR) {\n      return;\n    }\n    this.stallCount++;\n    if (this.hls && (_this$levelDetails = this.levelDetails) != null && _this$levelDetails.live) {\n      this.hls.logger.warn(\"[latency-controller]: Stall detected, adjusting target latency\");\n    }\n  }\n  changeMediaPlaybackRate(media, playbackRate) {\n    var _this$hls2, _this$targetLatency;\n    if (media.playbackRate === playbackRate) {\n      return;\n    }\n    (_this$hls2 = this.hls) == null || _this$hls2.logger.debug(`[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${(_this$targetLatency = this.targetLatency) == null ? void 0 : _this$targetLatency.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${media.playbackRate} to ${playbackRate}`);\n    media.playbackRate = playbackRate;\n  }\n  estimateLiveEdge() {\n    const levelDetails = this.levelDetails;\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}\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      const attributes = levelParsed.attrs;\n      let {\n        audioCodec,\n        videoCodec\n      } = levelParsed;\n      if (audioCodec) {\n        levelParsed.audioCodec = audioCodec = getCodecCompatibleName(audioCodec, preferManagedMediaSource) || void 0;\n      }\n      if (videoCodec) {\n        videoCodec = levelParsed.videoCodec = convertAVC1ToAVCOTI(videoCodec);\n      }\n      const {\n        width,\n        height,\n        unknownCodecs\n      } = levelParsed;\n      const unknownUnsupportedCodecCount = (unknownCodecs == null ? void 0 : unknownCodecs.length) || 0;\n      resolutionFound || (resolutionFound = !!(width && height));\n      videoCodecFound || (videoCodecFound = !!videoCodec);\n      audioCodecFound || (audioCodecFound = !!audioCodec);\n      if (unknownUnsupportedCodecCount || audioCodec && !this.isAudioSupported(audioCodec) || videoCodec && !this.isVideoSupported(videoCodec)) {\n        this.log(`Some or all CODECS not supported \"${attributes.CODECS}\"`);\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 = this.createLevel(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 = this.createLevel(levelParsed);\n        redundantSet[levelKey] = level;\n        levels.push(level);\n      } else {\n        redundantSet[levelKey].addGroupId(\"audio\", attributes.AUDIO);\n        redundantSet[levelKey].addGroupId(\"text\", attributes.SUBTITLES);\n      }\n    });\n    this.filterAndSortMediaOptions(levels, data, resolutionFound, videoCodecFound, audioCodecFound);\n  }\n  createLevel(levelParsed) {\n    const level = new Level(levelParsed);\n    const supplemental = levelParsed.supplemental;\n    if (supplemental != null && supplemental.videoCodec && !this.isVideoSupported(supplemental.videoCodec)) {\n      const error = new Error(`SUPPLEMENTAL-CODECS not supported \"${supplemental.videoCodec}\"`);\n      this.log(error.message);\n      level.supportedResult = getUnsupportedResult(error, []);\n    }\n    return level;\n  }\n  isAudioSupported(codec) {\n    return areCodecsMediaSourceSupported(codec, \"audio\", this.hls.config.preferManagedMediaSource);\n  }\n  isVideoSupported(codec) {\n    return areCodecsMediaSourceSupported(codec, \"video\", this.hls.config.preferManagedMediaSource);\n  }\n  filterAndSortMediaOptions(filteredLevels, data, resolutionFound, videoCodecFound, audioCodecFound) {\n    var _data$stats;\n    let audioTracks = [];\n    let subtitleTracks = [];\n    let levels = filteredLevels;\n    const statsParsing = ((_data$stats = data.stats) == null ? void 0 : _data$stats.parsing) || {};\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          let message = \"no level with compatible codecs found in manifest\";\n          let reason = message;\n          if (data.levels.length) {\n            reason = `one or more CODECS in variant not supported: ${stringify(data.levels.map((level) => level.attrs.CODECS).filter((value, index, array) => array.indexOf(value) === index))}`;\n            this.warn(reason);\n            message += ` (${reason})`;\n          }\n          const error = new Error(message);\n          this.hls.trigger(Events.ERROR, {\n            type: ErrorTypes.MEDIA_ERROR,\n            details: ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n            fatal: true,\n            url: data.url,\n            error,\n            reason\n          });\n        }\n      });\n      statsParsing.end = performance.now();\n      return;\n    }\n    if (data.audioTracks) {\n      audioTracks = data.audioTracks.filter((track) => !track.audioCodec || this.isAudioSupported(track.audioCodec));\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 === this.hls.abrEwmaDefaultEstimate) {\n            this.hls.bandwidthEstimate = startingBwEstimate;\n          }\n        }\n        break;\n      }\n    }\n    const audioOnly = audioCodecFound && !videoCodecFound;\n    const config = this.hls.config;\n    const altAudioEnabled = !!(config.audioStreamController && config.audioTrackController);\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: altAudioEnabled && !audioOnly && audioTracks.some((t) => !!t.url)\n    };\n    statsParsing.end = performance.now();\n    this.hls.trigger(Events.MANIFEST_PARSED, edata);\n  }\n  get levels() {\n    if (this._levels.length === 0) {\n      return null;\n    }\n    return this._levels;\n  }\n  get loadLevelObj() {\n    return this.currentLevel;\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 && 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, levelDetails);\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  get pathways() {\n    if (this.steering) {\n      return this.steering.pathways();\n    }\n    return [];\n  }\n  get pathwayPriority() {\n    if (this.steering) {\n      return this.steering.pathwayPriority;\n    }\n    return null;\n  }\n  set pathwayPriority(pathwayPriority) {\n    if (this.steering) {\n      const pathwaysList = this.steering.pathways();\n      const filteredPathwayPriority = pathwayPriority.filter((pathwayId) => {\n        return pathwaysList.indexOf(pathwayId) !== -1;\n      });\n      if (pathwayPriority.length < 1) {\n        this.warn(`pathwayPriority ${pathwayPriority} should contain at least one pathway from list: ${pathwaysList}`);\n        return;\n      }\n      this.steering.pathwayPriority = filteredPathwayPriority;\n    }\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  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 = data.levelInfo;\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 (curLevel === this.currentLevel || data.withoutMultiVariant) {\n      if (curLevel.fragmentError === 0) {\n        curLevel.loadError = 0;\n      }\n      let previousDetails = curLevel.details;\n      if (previousDetails === data.details && previousDetails.advanced) {\n        previousDetails = void 0;\n      }\n      this.playlistLoaded(level, data, previousDetails);\n    } else if ((_data$deliveryDirecti2 = data.deliveryDirectives) != null && _data$deliveryDirecti2.skip) {\n      details.deltaUpdateFailed = true;\n    }\n  }\n  loadPlaylist(hlsUrlParameters) {\n    super.loadPlaylist();\n    if (this.shouldLoadPlaylist(this.currentLevel)) {\n      this.scheduleLoading(this.currentLevel, hlsUrlParameters);\n    }\n  }\n  loadingPlaylist(currentLevel, hlsUrlParameters) {\n    super.loadingPlaylist(currentLevel, hlsUrlParameters);\n    const url = this.getUrlWithDirectives(currentLevel.uri, hlsUrlParameters);\n    const currentLevelIndex = this.currentLevelIndex;\n    const pathwayId = currentLevel.attrs[\"PATHWAY-ID\"];\n    const details = currentLevel.details;\n    const age = details == null ? void 0 : details.age;\n    this.log(`Loading level index ${currentLevelIndex}${(hlsUrlParameters == null ? void 0 : hlsUrlParameters.msn) !== void 0 ? \" at sn \" + hlsUrlParameters.msn + \" part \" + hlsUrlParameters.part : \"\"}${pathwayId ? \" Pathway \" + pathwayId : \"\"}${age && details.live ? \" age \" + age.toFixed(1) + (details.type ? \" \" + details.type || \"\" : \"\") : \"\"} ${url}`);\n    this.hls.trigger(Events.LEVEL_LOADING, {\n      url,\n      level: currentLevelIndex,\n      levelInfo: currentLevel,\n      pathwayId: currentLevel.attrs[\"PATHWAY-ID\"],\n      id: 0,\n      deliveryDirectives: hlsUrlParameters || null\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    if (this._levels.length === 1) {\n      return;\n    }\n    const levels = this._levels.filter((level, index) => {\n      if (index !== levelIndex) {\n        return true;\n      }\n      if (this.steering) {\n        this.steering.removeLevel(level);\n      }\n      if (level === this.currentLevel) {\n        this.currentLevel = null;\n        this.currentLevelIndex = -1;\n        if (level.details) {\n          level.details.fragments.forEach((f) => f.level = -1);\n        }\n      }\n      return false;\n    });\n    reassignFragmentLevelIndexes(levels);\n    this._levels = levels;\n    if (this.currentLevelIndex > -1 && (_this$currentLevel = this.currentLevel) != null && _this$currentLevel.details) {\n      this.currentLevelIndex = this.currentLevel.details.fragments[0].level;\n    }\n    if (this.manualLevelIndex > -1) {\n      this.manualLevelIndex = this.currentLevelIndex;\n    }\n    const maxLevel = levels.length - 1;\n    this._firstLevel = Math.min(this._firstLevel, maxLevel);\n    if (this._startLevel) {\n      this._startLevel = Math.min(this._startLevel, maxLevel);\n    }\n    this.hls.trigger(Events.LEVELS_UPDATED, {\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}\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 || (_sourceBuffer$prototy = sourceBuffer.prototype) == null ? void 0 : _sourceBuffer$prototy.changeType) === \"function\";\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.level = -1;\n    this._forceStartLoad = false;\n    this._hasEnoughToStart = false;\n    this.altAudio = 0;\n    this.audioOnly = false;\n    this.fragPlaying = null;\n    this.fragLastKbps = 0;\n    this.couldBacktrack = false;\n    this.backtrackFragment = null;\n    this.audioCodecSwitch = false;\n    this.videoBuffer = null;\n    this.onMediaPlaying = () => {\n      this.tick();\n    };\n    this.onMediaSeeked = () => {\n      const media = this.media;\n      const currentTime = media ? media.currentTime : null;\n      if (currentTime === null || !isFiniteNumber(currentTime)) {\n        return;\n      }\n      this.log(`Media seeked to ${currentTime.toFixed(3)}`);\n      if (!this.getBufferedFrag(currentTime)) {\n        return;\n      }\n      const bufferInfo = this.getFwdBufferInfoAtPos(media, currentTime, PlaylistLevelType.MAIN, 0);\n      if (bufferInfo === null || bufferInfo.len === 0) {\n        this.warn(`Main forward buffer length at ${currentTime} on \"seeked\" event ${bufferInfo ? bufferInfo.len : \"empty\"})`);\n        return;\n      }\n      this.tick();\n    };\n    this.registerListeners();\n  }\n  registerListeners() {\n    super.registerListeners();\n    const {\n      hls\n    } = 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.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    super.unregisterListeners();\n    const {\n      hls\n    } = 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.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.onMediaPlaying = this.onMediaSeeked = null;\n    this.unregisterListeners();\n    super.onHandlerDestroying();\n  }\n  startLoad(startPosition, skipSeekToStartPosition) {\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._hasEnoughToStart = !!skipSeekToStartPosition;\n      }\n      if (lastCurrentTime > 0 && startPosition === -1 && !skipSeekToStartPosition) {\n        this.log(`Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(3)}`);\n        startPosition = lastCurrentTime;\n      }\n      this.state = State.IDLE;\n      this.nextLoadPosition = this.lastCurrentTime = startPosition + this.timelineOffset;\n      this.startPosition = skipSeekToStartPosition ? -1 : startPosition;\n      this.tick();\n    } else {\n      this._forceStartLoad = true;\n      this.state = State.STOPPED;\n    }\n  }\n  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 && !this.waitForLive(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        this.checkRetryDate();\n        break;\n    }\n    if (this.state === State.IDLE) {\n      this.doTickIdle();\n    }\n    this.onTickEnd();\n  }\n  onTickEnd() {\n    var _this$media;\n    super.onTickEnd();\n    if ((_this$media = this.media) != null && _this$media.readyState && this.media.seeking === false) {\n      this.lastCurrentTime = this.media.currentTime;\n    }\n    this.checkFragmentChanged();\n  }\n  doTickIdle() {\n    const {\n      hls,\n      levelLastLoaded,\n      levels,\n      media\n    } = this;\n    if (levelLastLoaded === null || !media && !this.primaryPrefetch && (this.startFragRequested || !hls.config.startFragPrefetch)) {\n      return;\n    }\n    if (this.altAudio && this.audioOnly) {\n      return;\n    }\n    const level = this.buffering ? hls.nextLoadLevel : hls.loadLevel;\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 === 2) {\n        data.type = \"video\";\n      }\n      this.hls.trigger(Events.BUFFER_EOS, data);\n      this.state = State.ENDED;\n      return;\n    }\n    if (!this.buffering) {\n      return;\n    }\n    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 || this.waitForLive(levelInfo)) {\n      this.level = level;\n      this.state = State.WAITING_LEVEL;\n      this.startFragRequested = false;\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 && isMediaFragment(frag) && 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    if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {\n      if (!isMediaFragment(frag)) {\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        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  immediateLevelSwitch() {\n    this.abortCurrentFrag();\n    this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\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 === 2 ? \"video\" : null);\n  }\n  onMediaAttached(event, data) {\n    super.onMediaAttached(event, data);\n    const media = data.media;\n    addEventListener(media, \"playing\", this.onMediaPlaying);\n    addEventListener(media, \"seeked\", this.onMediaSeeked);\n  }\n  onMediaDetaching(event, data) {\n    const {\n      media\n    } = this;\n    if (media) {\n      removeEventListener(media, \"playing\", this.onMediaPlaying);\n      removeEventListener(media, \"seeked\", this.onMediaSeeked);\n    }\n    this.videoBuffer = null;\n    this.fragPlaying = null;\n    super.onMediaDetaching(event, data);\n    const transferringMedia = !!data.transferMedia;\n    if (transferringMedia) {\n      return;\n    }\n    this._hasEnoughToStart = false;\n  }\n  onManifestLoading() {\n    super.onManifestLoading();\n    this.log(\"Trigger BUFFER_RESET\");\n    this.hls.trigger(Events.BUFFER_RESET, void 0);\n    this.couldBacktrack = false;\n    this.fragLastKbps = 0;\n    this.fragPlaying = this.backtrackFragment = null;\n    this.altAudio = 0;\n    this.audioOnly = false;\n  }\n  onManifestParsed(event, data) {\n    let aac = false;\n    let heaac = false;\n    for (let i = 0; i < data.levels.length; i++) {\n      const codec = data.levels[i].audioCodec;\n      if (codec) {\n        aac = aac || codec.indexOf(\"mp4a.40.2\") !== -1;\n        heaac = heaac || codec.indexOf(\"mp4a.40.5\") !== -1;\n      }\n    }\n    this.audioCodecSwitch = aac && heaac && !changeTypeSupported();\n    if (this.audioCodecSwitch) {\n      this.log(\"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 = data.levelInfo;\n    if (!level.details || level.details.live && (this.levelLastLoaded !== level || level.details.expired) || 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      startFragRequested\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 = data.levelInfo;\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    if (!startFragRequested) {\n      this.setStartPosition(newDetails, sliding);\n    }\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 (startFragRequested && newDetails.live) {\n      this.synchronizeToLiveEdge(newDetails);\n    }\n    this.tick();\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 = this.getLoadPosition();\n    const start = levelDetails.fragmentStart;\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._hasEnoughToStart) {\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          if (this.config.liveSyncMode === \"buffered\") {\n            var _bufferInfo$buffered;\n            const bufferInfo = BufferHelper.bufferInfo(media, liveSyncPosition, 0);\n            if (!((_bufferInfo$buffered = bufferInfo.buffered) != null && _bufferInfo$buffered.length)) {\n              media.currentTime = liveSyncPosition;\n              return;\n            }\n            const isLiveSyncInBuffer = bufferInfo.start <= currentTime;\n            if (isLiveSyncInBuffer) {\n              media.currentTime = liveSyncPosition;\n              return;\n            }\n            const {\n              nextStart\n            } = BufferHelper.bufferedInfo(bufferInfo.buffered, currentTime, 0);\n            if (nextStart) {\n              media.currentTime = nextStart;\n            }\n          } else {\n            media.currentTime = liveSyncPosition;\n          }\n        }\n      }\n    }\n  }\n  _handleFragmentLoadProgress(data) {\n    var _frag$initSegment;\n    const frag = data.frag;\n    const {\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    if (!currentLevel) {\n      this.warn(`Level ${frag.level} not found on progress`);\n      return;\n    }\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 hls = this.hls;\n    const fromAltAudio = this.altAudio !== 0;\n    const altAudio = useAlternateAudio(data.url, hls);\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      if (fromAltAudio) {\n        this.altAudio = 0;\n        this.fragmentTracker.removeAllFragments();\n        hls.once(Events.BUFFER_FLUSHED, () => {\n          if (!this.hls) {\n            return;\n          }\n          this.hls.trigger(Events.AUDIO_TRACK_SWITCHED, data);\n        });\n        hls.trigger(Events.BUFFER_FLUSHING, {\n          startOffset: 0,\n          endOffset: Number.POSITIVE_INFINITY,\n          type: null\n        });\n        return;\n      }\n      hls.trigger(Events.AUDIO_TRACK_SWITCHED, data);\n    } else {\n      this.altAudio = 1;\n    }\n  }\n  onAudioTrackSwitched(event, data) {\n    const altAudio = useAlternateAudio(data.url, this.hls);\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 ? 2 : 0;\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    const bufferedMainFragment = frag.type === PlaylistLevelType.MAIN;\n    if (bufferedMainFragment) {\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 (isMediaFragment(frag)) {\n        this.fragPrevious = frag;\n      }\n      this.fragBufferedComplete(frag, part);\n    }\n    const media = this.media;\n    if (!media) {\n      return;\n    }\n    if (!this._hasEnoughToStart && BufferHelper.getBuffered(media).length) {\n      this._hasEnoughToStart = true;\n      this.seekToStartPos();\n    }\n    if (bufferedMainFragment) {\n      this.tick();\n    }\n  }\n  get hasEnoughToStart() {\n    return this._hasEnoughToStart;\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_ADD_CODEC_ERROR:\n      case ErrorDetails.BUFFER_APPEND_ERROR:\n        if (data.parent !== \"main\") {\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          this.resetLoadingState();\n        }\n        break;\n      case ErrorDetails.BUFFER_FULL_ERROR:\n        if (data.parent !== \"main\") {\n          return;\n        }\n        if (this.reduceLengthAndFlushBuffer(data)) {\n          const isAssetPlayer = !this.config.interstitialsController && this.config.assetPlayerId;\n          if (isAssetPlayer) {\n            this._hasEnoughToStart = true;\n          } else {\n            this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n          }\n        }\n        break;\n      case ErrorDetails.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(data);\n        break;\n    }\n  }\n  onFragLoadEmergencyAborted() {\n    this.state = State.IDLE;\n    if (!this._hasEnoughToStart) {\n      this.startFragRequested = false;\n      this.nextLoadPosition = this.lastCurrentTime;\n    }\n    this.tickImmediate();\n  }\n  onBufferFlushed(event, {\n    type\n  }) {\n    if (type !== ElementaryStreamTypes.AUDIO || !this.altAudio) {\n      const mediaBuffer = (type === ElementaryStreamTypes.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n      if (mediaBuffer) {\n        this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n        this.tick();\n      }\n    }\n  }\n  onLevelsUpdated(event, data) {\n    if (this.level > -1 && this.fragCurrent) {\n      this.level = this.fragCurrent.level;\n      if (this.level === -1) {\n        this.resetWhenMissingContext(this.fragCurrent);\n      }\n    }\n    this.levels = data.levels;\n  }\n  swapAudioCodec() {\n    this.audioCodecSwap = !this.audioCodecSwap;\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 timelineOffset = this.timelineOffset;\n      if (timelineOffset && startPosition) {\n        startPosition += timelineOffset;\n      }\n      const details = this.getLevelDetails();\n      const buffered = BufferHelper.getBuffered(media);\n      const bufferStart = buffered.length ? buffered.start(0) : 0;\n      const delta = bufferStart - startPosition;\n      const skipTolerance = Math.max(this.config.maxBufferHole, this.config.maxFragLookUpTolerance);\n      if (this.config.startOnSegmentBoundary || delta > 0 && (delta < skipTolerance || this.loadingParts && delta < 2 * ((details == null ? void 0 : details.partTarget) || 0))) {\n        this.log(`adjusting start position by ${delta} to match buffer start`);\n        startPosition += delta;\n        this.startPosition = startPosition;\n      }\n      if (currentTime < startPosition) {\n        this.log(`seek to target start position ${startPosition} from current time ${currentTime} buffer start ${bufferStart}`);\n        media.currentTime = startPosition;\n      }\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(fragment, level) {\n    fragment.bitrateTest = true;\n    this._doFragLoad(fragment, level).then((data) => {\n      const {\n        hls\n      } = this;\n      const frag = data == null ? void 0 : data.frag;\n      if (!frag || this.fragContextChanged(frag)) {\n        return;\n      }\n      level.fragmentError = 0;\n      this.state = State.IDLE;\n      this.startFragRequested = false;\n      this.bitrateTest = false;\n      const stats = frag.stats;\n      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    }).catch((reason) => {\n      if (this.state === State.STOPPED || this.state === State.ERROR) {\n        return;\n      }\n      this.warn(reason);\n      this.resetFragmentLoading(fragment);\n    });\n  }\n  _handleTransmuxComplete(transmuxResult) {\n    const id = this.playlistType;\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      const tracks = initSegment.tracks;\n      if (tracks) {\n        const mapFragment = frag.initSegment || frag;\n        if (this.unhandledEncryptionError(initSegment, frag)) {\n          return;\n        }\n        this._bufferInitSegment(level, tracks, mapFragment, chunkMeta);\n        hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n          frag: mapFragment,\n          id,\n          tracks\n        });\n      }\n      const baseTime = initSegment.initPTS;\n      const timescale = initSegment.timescale;\n      const initPTS = this.initPTS[frag.cc];\n      if (isFiniteNumber(baseTime) && (!initPTS || initPTS.baseTime !== baseTime || initPTS.timescale !== timescale)) {\n        const trackId = initSegment.trackId;\n        this.initPTS[frag.cc] = {\n          baseTime,\n          timescale,\n          trackId\n        };\n        hls.trigger(Events.INIT_PTS_FOUND, {\n          frag,\n          id,\n          initPTS: baseTime,\n          timescale,\n          trackId\n        });\n      }\n    }\n    if (video && details) {\n      if (audio && video.type === \"audiovideo\") {\n        this.logMuxedErr(frag);\n      }\n      const prevFrag = details.fragments[frag.sn - 1 - details.startSN];\n      const isFirstFragment = frag.sn === details.startSN;\n      const isFirstInDiscontinuity = !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 - (details.appliedTimelineOffset || 0) > 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.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  logMuxedErr(frag) {\n    this.warn(`${isMediaFragment(frag) ? \"Media\" : \"Init\"} segment with muxed audiovideo where only video expected: ${frag.url}`);\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      if (tracks.audiovideo) {\n        this.logMuxedErr(frag);\n      }\n    }\n    const {\n      audio,\n      video,\n      audiovideo\n    } = tracks;\n    if (audio) {\n      const levelCodec = currentLevel.audioCodec;\n      let audioCodec = pickMostCompleteCodecName(audio.codec, levelCodec);\n      if (audioCodec === \"mp4a\") {\n        audioCodec = \"mp4a.40.5\";\n      }\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        const audioMetadata = audio.metadata;\n        if (audioMetadata && \"channelCount\" in audioMetadata && (audioMetadata.channelCount || 1) !== 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 (levelCodec && levelCodec !== audioCodec) {\n        this.log(`Swapping manifest audio codec \"${levelCodec}\" for \"${audioCodec}\"`);\n      }\n      audio.levelCodec = audioCodec;\n      audio.id = PlaylistLevelType.MAIN;\n      this.log(`Init audio buffer, container:${audio.container}, codecs[selected/level/parsed]=[${audioCodec || \"\"}/${levelCodec || \"\"}/${audio.codec}]`);\n      delete tracks.audiovideo;\n    }\n    if (video) {\n      video.levelCodec = currentLevel.videoCodec;\n      video.id = PlaylistLevelType.MAIN;\n      const parsedVideoCodec = video.codec;\n      if ((parsedVideoCodec == null ? void 0 : parsedVideoCodec.length) === 4) {\n        switch (parsedVideoCodec) {\n          case \"hvc1\":\n          case \"hev1\":\n            video.codec = \"hvc1.1.6.L120.90\";\n            break;\n          case \"av01\":\n            video.codec = \"av01.0.04M.08\";\n            break;\n          case \"avc1\":\n            video.codec = \"avc1.42e01e\";\n            break;\n        }\n      }\n      this.log(`Init video buffer, container:${video.container}, codecs[level/parsed]=[${currentLevel.videoCodec || \"\"}/${parsedVideoCodec}]${video.codec !== parsedVideoCodec ? \" parsed-corrected=\" + video.codec : \"\"}${video.supplemental ? \" supplemental=\" + video.supplemental : \"\"}`);\n      delete tracks.audiovideo;\n    }\n    if (audiovideo) {\n      this.log(`Init audiovideo buffer, container:${audiovideo.container}, codecs[level/parsed]=[${currentLevel.codecs}/${audiovideo.codec}]`);\n      delete tracks.video;\n      delete tracks.audio;\n    }\n    const trackTypes = Object.keys(tracks);\n    if (trackTypes.length) {\n      this.hls.trigger(Events.BUFFER_CODECS, tracks);\n      if (!this.hls) {\n        return;\n      }\n      trackTypes.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    }\n    this.tickImmediate();\n  }\n  getMainFwdBufferInfo() {\n    const bufferOutput = this.mediaBuffer && this.altAudio === 2 ? this.mediaBuffer : this.media;\n    return this.getFwdBufferInfo(bufferOutput, PlaylistLevelType.MAIN);\n  }\n  get maxBufferLength() {\n    const {\n      levels,\n      level\n    } = this;\n    const levelInfo = levels == null ? void 0 : levels[level];\n    if (!levelInfo) {\n      return this.config.maxBufferLength;\n    }\n    return this.getMaxBufferLength(levelInfo.maxBitrate);\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    var _this$media2;\n    if (this.fragPlaying) {\n      return this.fragPlaying;\n    }\n    const currentTime = ((_this$media2 = this.media) == null ? void 0 : _this$media2.currentTime) || this.lastCurrentTime;\n    if (isFiniteNumber(currentTime)) {\n      return this.getAppendedFrag(currentTime);\n    }\n    return null;\n  }\n  get currentProgramDateTime() {\n    var _this$media3;\n    const currentTime = ((_this$media3 = this.media) == null ? void 0 : _this$media3.currentTime) || this.lastCurrentTime;\n    if (isFiniteNumber(currentTime)) {\n      const details = this.getLevelDetails();\n      const frag = this.currentFrag || (details ? findFragmentByPTS(null, details.fragments, currentTime) : null);\n      if (frag) {\n        const programDateTime = frag.programDateTime;\n        if (programDateTime !== null) {\n          const epocMs = programDateTime + (currentTime - frag.start) * 1e3;\n          return new Date(epocMs);\n        }\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 KeyLoader extends Logger {\n  constructor(config, logger2) {\n    super(\"key-loader\", logger2);\n    this.config = void 0;\n    this.keyIdToKeyInfo = {};\n    this.emeController = null;\n    this.config = config;\n  }\n  abort(type) {\n    for (const id in this.keyIdToKeyInfo) {\n      const loader = this.keyIdToKeyInfo[id].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 id in this.keyIdToKeyInfo) {\n      const keyInfo = this.keyIdToKeyInfo[id];\n      if (keyInfo.mediaKeySessionContext || keyInfo.decryptdata.isCommonEncryption) {\n        delete this.keyIdToKeyInfo[id];\n      }\n    }\n  }\n  destroy() {\n    this.detach();\n    for (const id in this.keyIdToKeyInfo) {\n      const loader = this.keyIdToKeyInfo[id].loader;\n      if (loader) {\n        loader.destroy();\n      }\n    }\n    this.keyIdToKeyInfo = {};\n  }\n  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, startFragRequested) {\n    if (this.emeController && this.config.emeEnabled && !this.emeController.getSelectedKeySystemFormats().length) {\n      if (encryptedFragments.length) {\n        for (let i = 0, l = encryptedFragments.length; i < l; i++) {\n          const frag = encryptedFragments[i];\n          if (loadingFrag.cc <= frag.cc && (!isMediaFragment(loadingFrag) || !isMediaFragment(frag) || loadingFrag.sn < frag.sn) || !startFragRequested && i == l - 1) {\n            return this.emeController.selectKeySystemFormat(frag).then((keySystemFormat) => {\n              if (!this.emeController) {\n                return;\n              }\n              frag.setKeyFormat(keySystemFormat);\n              const keySystem = keySystemFormatToKeySystemDomain(keySystemFormat);\n              if (keySystem) {\n                return this.emeController.getKeySystemAccess([keySystem]);\n              }\n            });\n          }\n        }\n      }\n      if (this.config.requireKeySystemAccessOnStart) {\n        const keySystemsInConfig = getKeySystemsForConfig(this.config);\n        if (keySystemsInConfig.length) {\n          return this.emeController.getKeySystemAccess(keySystemsInConfig);\n        }\n      }\n    }\n    return null;\n  }\n  load(frag) {\n    if (!frag.decryptdata && frag.encrypted && this.emeController && this.config.emeEnabled) {\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 (emeEnabled with controller: ${this.emeController && this.config.emeEnabled})`);\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    const id = getKeyId(decryptdata);\n    let keyInfo = this.keyIdToKeyInfo[id];\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 (this.emeController && (_keyInfo2 = keyInfo) != null && _keyInfo2.keyLoadPromise) {\n      const keyStatus = this.emeController.getKeyStatus(keyInfo.decryptdata);\n      switch (keyStatus) {\n        case \"usable\":\n        case \"usable-in-future\":\n          return keyInfo.keyLoadPromise.then((keyLoadedData) => {\n            const {\n              keyInfo: keyInfo2\n            } = keyLoadedData;\n            decryptdata.key = keyInfo2.decryptdata.key;\n            return {\n              frag,\n              keyInfo: keyInfo2\n            };\n          });\n      }\n    }\n    this.log(`${this.keyIdToKeyInfo[id] ? \"Rel\" : \"L\"}oading${decryptdata.keyId ? \" keyId: \" + arrayToHex(decryptdata.keyId) : \"\"} URI: ${decryptdata.uri} from ${frag.type} ${frag.level}`);\n    keyInfo = this.keyIdToKeyInfo[id] = {\n      decryptdata,\n      keyLoadPromise: null,\n      loader: null,\n      mediaKeySessionContext: null\n    };\n    switch (decryptdata.method) {\n      case \"SAMPLE-AES\":\n      case \"SAMPLE-AES-CENC\":\n      case \"SAMPLE-AES-CTR\":\n        if (decryptdata.keyFormat === \"identity\") {\n          return this.loadKeyHTTP(keyInfo, frag);\n        }\n        return this.loadKeyEME(keyInfo, frag);\n      case \"AES-128\":\n      case \"AES-256\":\n      case \"AES-256-CTR\":\n        return this.loadKeyHTTP(keyInfo, frag);\n      default:\n        return Promise.reject(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      var _frag$initSegment;\n      if (!keyInfo.decryptdata.keyId && (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data) {\n        const keyIds = parseKeyIdsFromTenc(frag.initSegment.data);\n        if (keyIds.length) {\n          let keyId = keyIds[0];\n          if (keyId.some((b) => b !== 0)) {\n            this.log(`Using keyId found in init segment ${arrayToHex(keyId)}`);\n            LevelKey.setKeyIdForUri(keyInfo.decryptdata.uri, keyId);\n          } else {\n            keyId = LevelKey.addKeyIdForUri(keyInfo.decryptdata.uri);\n            this.log(`Generating keyId to patch media ${arrayToHex(keyId)}`);\n          }\n          keyInfo.decryptdata.keyId = keyId;\n        }\n      }\n      if (!keyInfo.decryptdata.keyId && !isMediaFragment(frag)) {\n        return Promise.resolve(keyLoadedData);\n      }\n      const keySessionContextPromise = this.emeController.loadKey(keyLoadedData);\n      return (keyInfo.keyLoadPromise = keySessionContextPromise.then((keySessionContext) => {\n        keyInfo.mediaKeySessionContext = keySessionContext;\n        return keyLoadedData;\n      })).catch((error) => {\n        keyInfo.keyLoadPromise = null;\n        if (\"data\" in error) {\n          error.data.frag = frag;\n        }\n        throw error;\n      });\n    }\n    return Promise.resolve(keyLoadedData);\n  }\n  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          } = context;\n          const id = getKeyId(keyInfo2.decryptdata);\n          if (!frag2.decryptdata || keyInfo2 !== this.keyIdToKeyInfo[id]) {\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    const id = getKeyId(keyInfo.decryptdata) || uri;\n    delete this.keyIdToKeyInfo[id];\n    if (loader) {\n      loader.destroy();\n    }\n  }\n}\nfunction getKeyId(decryptdata) {\n  if (decryptdata.keyFormat !== KeySystemFormats.FAIRPLAY) {\n    const keyId = decryptdata.keyId;\n    if (keyId) {\n      return arrayToHex(keyId);\n    }\n  }\n  return decryptdata.uri;\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 = Object.create(null);\n    this.variableList = null;\n    this.onManifestLoaded = this.checkAutostartLoad;\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    hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, 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    hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\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  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      levelOrTrack: null\n    });\n  }\n  onLevelLoading(event, data) {\n    const {\n      id,\n      level,\n      pathwayId,\n      url,\n      deliveryDirectives,\n      levelInfo\n    } = data;\n    this.load({\n      id,\n      level,\n      pathwayId,\n      responseType: \"text\",\n      type: PlaylistContextType.LEVEL,\n      url,\n      deliveryDirectives,\n      levelOrTrack: levelInfo\n    });\n  }\n  onAudioTrackLoading(event, data) {\n    const {\n      id,\n      groupId,\n      url,\n      deliveryDirectives,\n      track\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      levelOrTrack: track\n    });\n  }\n  onSubtitleTrackLoading(event, data) {\n    const {\n      id,\n      groupId,\n      url,\n      deliveryDirectives,\n      track\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      levelOrTrack: track\n    });\n  }\n  onLevelsUpdated(event, data) {\n    const loader = this.loaders[PlaylistContextType.LEVEL];\n    if (loader) {\n      const context = loader.context;\n      if (context && !data.levels.some((lvl) => lvl === context.levelOrTrack)) {\n        loader.abort();\n        delete this.loaders[PlaylistContextType.LEVEL];\n      }\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 logger2 = this.hls.logger;\n      const loaderContext = loader.context;\n      if (loaderContext && loaderContext.levelOrTrack === context.levelOrTrack && (loaderContext.url === context.url || loaderContext.deliveryDirectives && !context.deliveryDirectives)) {\n        if (loaderContext.url === context.url) {\n          logger2.log(`[playlist-loader]: ignore ${context.url} ongoing request`);\n        } else {\n          logger2.log(`[playlist-loader]: ignore ${context.url} in favor of ${loaderContext.url}`);\n        }\n        return;\n      }\n      logger2.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        stats.parsing.start = performance.now();\n        if (M3U8Parser.isMediaPlaylist(string) || context2.type !== PlaylistContextType.MANIFEST) {\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  checkAutostartLoad() {\n    if (!this.hls) {\n      return;\n    }\n    const {\n      config: {\n        autoStartLoad,\n        startPosition\n      },\n      forceStartLoad\n    } = this.hls;\n    if (autoStartLoad || forceStartLoad) {\n      this.hls.logger.log(`${autoStartLoad ? \"auto\" : \"force\"} startLoad with configured startPosition ${startPosition}`);\n      this.hls.startLoad(startPosition);\n    }\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      stats.parsing.end = performance.now();\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    levels.forEach((levelParsed) => {\n      const {\n        unknownCodecs\n      } = levelParsed;\n      if (unknownCodecs) {\n        const {\n          preferManagedMediaSource\n        } = this.hls.config;\n        let {\n          audioCodec,\n          videoCodec\n        } = levelParsed;\n        for (let i = unknownCodecs.length; i--; ) {\n          const unknownCodec = unknownCodecs[i];\n          if (areCodecsMediaSourceSupported(unknownCodec, \"audio\", preferManagedMediaSource)) {\n            levelParsed.audioCodec = audioCodec = audioCodec ? `${audioCodec},${unknownCodec}` : unknownCodec;\n            sampleEntryCodesISO.audio[audioCodec.substring(0, 4)] = 2;\n            unknownCodecs.splice(i, 1);\n          } else if (areCodecsMediaSourceSupported(unknownCodec, \"video\", preferManagedMediaSource)) {\n            levelParsed.videoCodec = videoCodec = videoCodec ? `${videoCodec},${unknownCodec}` : unknownCodec;\n            sampleEntryCodesISO.video[videoCodec.substring(0, 4)] = 2;\n            unknownCodecs.splice(i, 1);\n          }\n        }\n      }\n    });\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        this.hls.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 levelId = isFiniteNumber(level) ? level : isFiniteNumber(id) ? id : 0;\n    const levelType = mapContextToLevelType(context);\n    const levelDetails = M3U8Parser.parseLevelPlaylist(response.data, url, levelId, levelType, 0, 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      levelDetails.requestScheduled = stats.loading.start + computeReloadInterval(levelDetails, 0);\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    this.hls.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      levelOrTrack,\n      id,\n      groupId,\n      deliveryDirectives\n    } = context;\n    const url = getResponseUrl(response, context);\n    const parent = mapContextToLevelType(context);\n    let levelIndex = typeof context.level === \"number\" && parent === PlaylistLevelType.MAIN ? level : void 0;\n    const error = levelDetails.playlistParsingError;\n    if (error) {\n      this.hls.logger.warn(`${error} ${levelDetails.url}`);\n      if (!hls.config.ignorePlaylistParsingErrors) {\n        hls.trigger(Events.ERROR, {\n          type: ErrorTypes.NETWORK_ERROR,\n          details: ErrorDetails.LEVEL_PARSING_ERROR,\n          fatal: false,\n          url,\n          error,\n          reason: error.message,\n          response,\n          context,\n          level: levelIndex,\n          parent,\n          networkDetails,\n          stats\n        });\n        return;\n      }\n      levelDetails.playlistParsingError = null;\n    }\n    if (!levelDetails.fragments.length) {\n      const _error = levelDetails.playlistParsingError = new Error(\"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.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        if (levelIndex) {\n          if (!levelOrTrack) {\n            levelIndex = 0;\n          } else {\n            if (levelOrTrack !== hls.levels[levelIndex]) {\n              const updatedIndex = hls.levels.indexOf(levelOrTrack);\n              if (updatedIndex > -1) {\n                levelIndex = updatedIndex;\n              }\n            }\n          }\n        }\n        hls.trigger(Events.LEVEL_LOADED, {\n          details: levelDetails,\n          levelInfo: levelOrTrack || hls.levels[0],\n          level: levelIndex || 0,\n          id: id || 0,\n          stats,\n          networkDetails,\n          deliveryDirectives,\n          withoutMultiVariant: type === PlaylistContextType.MANIFEST\n        });\n        break;\n      case PlaylistContextType.AUDIO_TRACK:\n        hls.trigger(Events.AUDIO_TRACK_LOADED, {\n          details: levelDetails,\n          track: levelOrTrack,\n          id: id || 0,\n          groupId: groupId || \"\",\n          stats,\n          networkDetails,\n          deliveryDirectives\n        });\n        break;\n      case PlaylistContextType.SUBTITLE_TRACK:\n        hls.trigger(Events.SUBTITLE_TRACK_LOADED, {\n          details: levelDetails,\n          track: levelOrTrack,\n          id: id || 0,\n          groupId: groupId || \"\",\n          stats,\n          networkDetails,\n          deliveryDirectives\n        });\n        break;\n    }\n  }\n}\nclass Hls {\n  static get version() {\n    return version;\n  }\n  static isMSESupported() {\n    return isMSESupported();\n  }\n  static isSupported() {\n    return isSupported();\n  }\n  static getMediaSource() {\n    return getMediaSource();\n  }\n  static get Events() {\n    return Events;\n  }\n  static get MetadataSchema() {\n    return MetadataSchema;\n  }\n  static get ErrorTypes() {\n    return ErrorTypes;\n  }\n  static get ErrorDetails() {\n    return ErrorDetails;\n  }\n  static get DefaultConfig() {\n    if (!Hls.defaultConfig) {\n      return hlsDefaultConfig;\n    }\n    return Hls.defaultConfig;\n  }\n  static set DefaultConfig(defaultConfig) {\n    Hls.defaultConfig = defaultConfig;\n  }\n  constructor(userConfig = {}) {\n    this.config = void 0;\n    this.userConfig = void 0;\n    this.logger = void 0;\n    this.coreComponents = void 0;\n    this.networkControllers = void 0;\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.audioStreamController = void 0;\n    this.subtititleStreamController = void 0;\n    this.audioTrackController = void 0;\n    this.subtitleTrackController = void 0;\n    this.interstitialsController = void 0;\n    this.gapController = void 0;\n    this.emeController = void 0;\n    this.cmcdController = void 0;\n    this._media = null;\n    this._url = null;\n    this._sessionId = void 0;\n    this.triggeringException = void 0;\n    this.started = false;\n    const logger2 = this.logger = enableLogs(userConfig.debug || false, \"Hls instance\", userConfig.assetPlayerId);\n    const config = this.config = mergeConfig(Hls.DefaultConfig, userConfig, logger2);\n    this.userConfig = userConfig;\n    if (config.progressive) {\n      enableStreamingMode(config, logger2);\n    }\n    const {\n      abrController: _AbrController,\n      bufferController: _BufferController,\n      capLevelController: _CapLevelController,\n      errorController: _ErrorController,\n      fpsController: _FpsController\n    } = config;\n    const errorController = new _ErrorController(this);\n    const abrController = this.abrController = new _AbrController(this);\n    const fragmentTracker = new FragmentTracker(this);\n    const _InterstitialsController = config.interstitialsController;\n    const interstitialsController = _InterstitialsController ? this.interstitialsController = new _InterstitialsController(this, Hls) : null;\n    const bufferController = this.bufferController = new _BufferController(this, fragmentTracker);\n    const capLevelController = this.capLevelController = new _CapLevelController(this);\n    const fpsController = new _FpsController(this);\n    const playListLoader = new PlaylistLoader(this);\n    const _ContentSteeringController = config.contentSteeringController;\n    const contentSteering = _ContentSteeringController ? new _ContentSteeringController(this) : null;\n    const levelController = this.levelController = new LevelController(this, contentSteering);\n    const id3TrackController = new ID3TrackController(this);\n    const keyLoader = new KeyLoader(this.config, this.logger);\n    const streamController = this.streamController = new StreamController(this, fragmentTracker, keyLoader);\n    const gapController = this.gapController = new GapController(this, fragmentTracker);\n    capLevelController.setStreamController(streamController);\n    fpsController.setStreamController(streamController);\n    const networkControllers = [playListLoader, levelController, streamController];\n    if (interstitialsController) {\n      networkControllers.splice(1, 0, interstitialsController);\n    }\n    if (contentSteering) {\n      networkControllers.splice(1, 0, contentSteering);\n    }\n    this.networkControllers = networkControllers;\n    const coreComponents = [abrController, bufferController, gapController, capLevelController, fpsController, id3TrackController, fragmentTracker];\n    this.audioTrackController = this.createController(config.audioTrackController, networkControllers);\n    const AudioStreamControllerClass = config.audioStreamController;\n    if (AudioStreamControllerClass) {\n      networkControllers.push(this.audioStreamController = 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(this.subtititleStreamController = 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    this.on(Events.MANIFEST_LOADED, playListLoader.onManifestLoaded, playListLoader);\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  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        this.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  destroy() {\n    this.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  attachMedia(data) {\n    if (!data || \"media\" in data && !data.media) {\n      const error = new Error(`attachMedia failed: invalid argument (${data})`);\n      this.trigger(Events.ERROR, {\n        type: ErrorTypes.OTHER_ERROR,\n        details: ErrorDetails.ATTACH_MEDIA_ERROR,\n        fatal: true,\n        error\n      });\n      return;\n    }\n    this.logger.log(`attachMedia`);\n    if (this._media) {\n      this.logger.warn(`media must be detached before attaching`);\n      this.detachMedia();\n    }\n    const attachMediaSource = \"media\" in data;\n    const media = attachMediaSource ? data.media : data;\n    const attachingData = attachMediaSource ? data : {\n      media\n    };\n    this._media = media;\n    this.trigger(Events.MEDIA_ATTACHING, attachingData);\n  }\n  detachMedia() {\n    this.logger.log(\"detachMedia\");\n    this.trigger(Events.MEDIA_DETACHING, {});\n    this._media = null;\n  }\n  transferMedia() {\n    this._media = null;\n    const transferMedia = this.bufferController.transferMedia();\n    this.trigger(Events.MEDIA_DETACHING, {\n      transferMedia\n    });\n    return transferMedia;\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    this.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  get url() {\n    return this._url;\n  }\n  get hasEnoughToStart() {\n    return this.streamController.hasEnoughToStart;\n  }\n  get startPosition() {\n    return this.streamController.startPositionValue;\n  }\n  startLoad(startPosition = -1, skipSeekToStartPosition) {\n    this.logger.log(`startLoad(${startPosition + (skipSeekToStartPosition ? \", <skip seek to start>\" : \"\")})`);\n    this.started = true;\n    this.resumeBuffering();\n    for (let i = 0; i < this.networkControllers.length; i++) {\n      this.networkControllers[i].startLoad(startPosition, skipSeekToStartPosition);\n      if (!this.started || !this.networkControllers) {\n        break;\n      }\n    }\n  }\n  stopLoad() {\n    this.logger.log(\"stopLoad\");\n    this.started = false;\n    for (let i = 0; i < this.networkControllers.length; i++) {\n      this.networkControllers[i].stopLoad();\n      if (this.started || !this.networkControllers) {\n        break;\n      }\n    }\n  }\n  get loadingEnabled() {\n    return this.started;\n  }\n  get bufferingEnabled() {\n    return this.streamController.bufferingEnabled;\n  }\n  resumeBuffering() {\n    if (!this.bufferingEnabled) {\n      this.logger.log(`resume buffering`);\n      this.networkControllers.forEach((controller) => {\n        if (controller.resumeBuffering) {\n          controller.resumeBuffering();\n        }\n      });\n    }\n  }\n  pauseBuffering() {\n    if (this.bufferingEnabled) {\n      this.logger.log(`pause buffering`);\n      this.networkControllers.forEach((controller) => {\n        if (controller.pauseBuffering) {\n          controller.pauseBuffering();\n        }\n      });\n    }\n  }\n  get inFlightFragments() {\n    const inFlightData = {\n      [PlaylistLevelType.MAIN]: this.streamController.inFlightFrag\n    };\n    if (this.audioStreamController) {\n      inFlightData[PlaylistLevelType.AUDIO] = this.audioStreamController.inFlightFrag;\n    }\n    if (this.subtititleStreamController) {\n      inFlightData[PlaylistLevelType.SUBTITLE] = this.subtititleStreamController.inFlightFrag;\n    }\n    return inFlightData;\n  }\n  swapAudioCodec() {\n    this.logger.log(\"swapAudioCodec\");\n    this.streamController.swapAudioCodec();\n  }\n  recoverMediaError() {\n    this.logger.log(\"recoverMediaError\");\n    const media = this._media;\n    const time = media == null ? void 0 : media.currentTime;\n    this.detachMedia();\n    if (media) {\n      this.attachMedia(media);\n      if (time) {\n        this.startLoad(time);\n      }\n    }\n  }\n  removeLevel(levelIndex) {\n    this.levelController.removeLevel(levelIndex);\n  }\n  get sessionId() {\n    let _sessionId = this._sessionId;\n    if (!_sessionId) {\n      _sessionId = this._sessionId = uuid();\n    }\n    return _sessionId;\n  }\n  get levels() {\n    const levels = this.levelController.levels;\n    return levels ? levels : [];\n  }\n  get latestLevelDetails() {\n    return this.streamController.getLevelDetails() || null;\n  }\n  get loadLevelObj() {\n    return this.levelController.loadLevelObj;\n  }\n  get currentLevel() {\n    return this.streamController.currentLevel;\n  }\n  set currentLevel(newLevel) {\n    this.logger.log(`set currentLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n    this.streamController.immediateLevelSwitch();\n  }\n  get nextLevel() {\n    return this.streamController.nextLevel;\n  }\n  set nextLevel(newLevel) {\n    this.logger.log(`set nextLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n    this.streamController.nextLevelSwitch();\n  }\n  get loadLevel() {\n    return this.levelController.level;\n  }\n  set loadLevel(newLevel) {\n    this.logger.log(`set loadLevel:${newLevel}`);\n    this.levelController.manualLevel = newLevel;\n  }\n  get nextLoadLevel() {\n    return this.levelController.nextLoadLevel;\n  }\n  set nextLoadLevel(level) {\n    this.levelController.nextLoadLevel = level;\n  }\n  get firstLevel() {\n    return Math.max(this.levelController.firstLevel, this.minAutoLevel);\n  }\n  set firstLevel(newLevel) {\n    this.logger.log(`set firstLevel:${newLevel}`);\n    this.levelController.firstLevel = newLevel;\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  set startLevel(newLevel) {\n    this.logger.log(`set startLevel:${newLevel}`);\n    if (newLevel !== -1) {\n      newLevel = Math.max(newLevel, this.minAutoLevel);\n    }\n    this.levelController.startLevel = newLevel;\n  }\n  get capLevelToPlayerSize() {\n    return this.config.capLevelToPlayerSize;\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  get autoLevelCapping() {\n    return this._autoLevelCapping;\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  get abrEwmaDefaultEstimate() {\n    const {\n      bwEstimator\n    } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.defaultEstimate;\n  }\n  get ttfbEstimate() {\n    const {\n      bwEstimator\n    } = this.abrController;\n    if (!bwEstimator) {\n      return NaN;\n    }\n    return bwEstimator.getEstimateTTFB();\n  }\n  set autoLevelCapping(newLevel) {\n    if (this._autoLevelCapping !== newLevel) {\n      this.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  get autoLevelEnabled() {\n    return this.levelController.manualLevel === -1;\n  }\n  get manualLevel() {\n    return this.levelController.manualLevel;\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  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  get nextAutoLevel() {\n    return this.abrController.nextAutoLevel;\n  }\n  set nextAutoLevel(nextLevel) {\n    this.abrController.nextAutoLevel = nextLevel;\n  }\n  get playingDate() {\n    return this.streamController.currentProgramDateTime;\n  }\n  get mainForwardBufferInfo() {\n    return this.streamController.getMainFwdBufferInfo();\n  }\n  get maxBufferLength() {\n    return this.streamController.maxBufferLength;\n  }\n  setAudioOption(audioOption) {\n    var _this$audioTrackContr;\n    return ((_this$audioTrackContr = this.audioTrackController) == null ? void 0 : _this$audioTrackContr.setAudioOption(audioOption)) || null;\n  }\n  setSubtitleOption(subtitleOption) {\n    var _this$subtitleTrackCo;\n    return ((_this$subtitleTrackCo = this.subtitleTrackController) == null ? void 0 : _this$subtitleTrackCo.setSubtitleOption(subtitleOption)) || null;\n  }\n  get allAudioTracks() {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.allAudioTracks : [];\n  }\n  get audioTracks() {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.audioTracks : [];\n  }\n  get audioTrack() {\n    const audioTrackController = this.audioTrackController;\n    return audioTrackController ? audioTrackController.audioTrack : -1;\n  }\n  set audioTrack(audioTrackId) {\n    const audioTrackController = this.audioTrackController;\n    if (audioTrackController) {\n      audioTrackController.audioTrack = audioTrackId;\n    }\n  }\n  get allSubtitleTracks() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.allSubtitleTracks : [];\n  }\n  get subtitleTracks() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.subtitleTracks : [];\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  set subtitleTrack(subtitleTrackId) {\n    const subtitleTrackController = this.subtitleTrackController;\n    if (subtitleTrackController) {\n      subtitleTrackController.subtitleTrack = subtitleTrackId;\n    }\n  }\n  get subtitleDisplay() {\n    const subtitleTrackController = this.subtitleTrackController;\n    return subtitleTrackController ? subtitleTrackController.subtitleDisplay : false;\n  }\n  set subtitleDisplay(value) {\n    const subtitleTrackController = this.subtitleTrackController;\n    if (subtitleTrackController) {\n      subtitleTrackController.subtitleDisplay = value;\n    }\n  }\n  get lowLatencyMode() {\n    return this.config.lowLatencyMode;\n  }\n  set lowLatencyMode(mode) {\n    this.config.lowLatencyMode = mode;\n  }\n  get liveSyncPosition() {\n    return this.latencyController.liveSyncPosition;\n  }\n  get latency() {\n    return this.latencyController.latency;\n  }\n  get maxLatency() {\n    return this.latencyController.maxLatency;\n  }\n  get targetLatency() {\n    return this.latencyController.targetLatency;\n  }\n  set targetLatency(latency) {\n    this.latencyController.targetLatency = latency;\n  }\n  get drift() {\n    return this.latencyController.drift;\n  }\n  get forceStartLoad() {\n    return this.streamController.forceStartLoad;\n  }\n  get pathways() {\n    return this.levelController.pathways;\n  }\n  get pathwayPriority() {\n    return this.levelController.pathwayPriority;\n  }\n  set pathwayPriority(pathwayPriority) {\n    this.levelController.pathwayPriority = pathwayPriority;\n  }\n  get bufferedToEnd() {\n    var _this$bufferControlle;\n    return !!((_this$bufferControlle = this.bufferController) != null && _this$bufferControlle.bufferedToEnd);\n  }\n  get interstitialsManager() {\n    var _this$interstitialsCo;\n    return ((_this$interstitialsCo = this.interstitialsController) == null ? void 0 : _this$interstitialsCo.interstitialsManager) || null;\n  }\n  getMediaDecodingInfo(level, audioTracks = this.allAudioTracks) {\n    const audioTracksByGroup = getAudioTracksByGroup(audioTracks);\n    return getMediaDecodingInfoPromise(level, audioTracksByGroup, navigator.mediaCapabilities);\n  }\n}\nHls.defaultConfig = void 0;\nexport default Hls;\nexport {AbrController, AttrList, AudioStreamController, AudioTrackController, BasePlaylistController, BaseSegment, BaseStreamController, BufferController, CMCDController, CapLevelController, ChunkMetadata, ContentSteeringController, Cues, DateRange, EMEController, ErrorActionFlags, ErrorController, ErrorDetails, ErrorTypes, Events, FPSController, FetchLoader, Fragment, Hls, HlsSkip, HlsUrlParameters, KeySystemFormats, KeySystems, Level, LevelDetails, LevelKey, LoadStats, M3U8Parser, MetadataSchema, NetworkErrorAction, Part, PlaylistLevelType, SubtitleStreamController, SubtitleTrackController, TimelineController, XhrLoader, fetchSupported, getMediaSource, isMSESupported, isSupported, requestMediaKeySystemAccess};\n","/*\n * Skypack CDN - hls.js@1.6.15\n *\n * Learn more:\n *   📙 Package Documentation: https://www.skypack.dev/view/hls.js\n *   📘 Skypack Documentation: https://www.skypack.dev/docs\n *\n * Pinned URL: (Optimized for Production)\n *   ▶️ Normal: https://cdn.skypack.dev/pin/hls.js@v1.6.15-ccKNDzX7weyANgSOjMNp/mode=imports/optimized/hlsjs.js\n *   ⏩ Minified: https://cdn.skypack.dev/pin/hls.js@v1.6.15-ccKNDzX7weyANgSOjMNp/mode=imports,min/optimized/hlsjs.js\n *\n */\n\n// Browser-Optimized Imports (Don't directly import the URLs below in your application!)\nexport * from '/-/hls.js@v1.6.15-ccKNDzX7weyANgSOjMNp/dist=es2019,mode=imports/optimized/hlsjs.js';\nexport {default} from '/-/hls.js@v1.6.15-ccKNDzX7weyANgSOjMNp/dist=es2019,mode=imports/optimized/hlsjs.js';\n"],"mappings":"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,EACA,EACA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,CACF,CAAC,EACKC,EAAY,IAAI,WAAW,CAC/B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,CACF,CAAC,EACD,EAAI,WAAa,CACf,MAAOD,EACP,MAAOC,CACT,EACA,IAAMC,EAAO,IAAI,WAAW,CAC1B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,GACA,EACA,EACA,EACA,CACF,CAAC,EACKC,EAAO,IAAI,WAAW,CAC1B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EACD,EAAI,KAAO,EAAI,KAAO,EAAI,KAAOA,EACjC,EAAI,KAAO,IAAI,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EACD,EAAI,KAAO,IAAI,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EACD,EAAI,KAAO,IAAI,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EACD,EAAI,KAAO,IAAI,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,EACD,IAAMC,EAAa,IAAI,WAAW,CAAC,IAAK,IAAK,IAAK,GAAG,CAAC,EAChDC,EAAY,IAAI,WAAW,CAAC,GAAI,IAAK,GAAI,EAAE,CAAC,EAC5CC,EAAe,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EAChD,EAAI,KAAOl3B,EAAI,IAAIA,EAAI,MAAM,KAAMg3B,EAAYE,EAAcF,EAAYC,CAAS,EAClF,EAAI,KAAOj3B,EAAI,IAAIA,EAAI,MAAM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ACvD,CACA,OAAO,KAAK,EAAW,EAAU,CAC/B,GAAYrqE,EACZ,IAAMiqE,EAAoB,KAAK,MAAMjwD,GAAY64B,GAAa,EAAE,EAC1Dq3B,EAAoB,KAAK,MAAMlwD,GAAY64B,GAAa,EAAE,EAC1DnuC,EAAQ,IAAI,WAAW,CAC3B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA1E,GAAa,GAAK,IAClBA,GAAa,GAAK,IAClBA,GAAa,EAAI,IACjBA,EAAY,IACZiqE,GAAqB,GACrBA,GAAqB,GAAK,IAC1BA,GAAqB,EAAI,IACzBA,EAAoB,IACpBC,GAAqB,GACrBA,GAAqB,GAAK,IAC1BA,GAAqB,EAAI,IACzBA,EAAoB,IACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,GACF,CAAC,EACD,OAAOp3B,EAAI,IAAIA,EAAI,MAAM,KAAMpuC,CAAK,CACtC,CACA,OAAO,KAAK,EAAO,CACjB,IAAMwG,EAAU1J,EAAM,SAAW,CAAC,EAC5BkD,EAAQ,IAAI,WAAW,EAAIwG,EAAQ,MAAM,EAC3C,EACAxI,EACJ,IAAK,EAAI,EAAG,EAAIwI,EAAQ,OAAQ,IAC9B,EAAQA,EAAQ,EAAE,CAAC,MACnB,EAAM,EAAI,GAAKxI,EAAM,WAAa,EAAIA,EAAM,cAAgB,EAAIA,EAAM,cAExE,OAAOowC,EAAI,IAAIA,EAAI,MAAM,KAAMpuC,CAAK,CACtC,CACA,OAAO,KAAK,EAAO,CACjB,OAAOouC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAKtxC,CAAK,EAAGsxC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,IAAI,EAAGA,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,IAAI,EAAGA,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,IAAI,EAAGA,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,IAAI,CAAC,CAC5L,CACA,OAAO,KAAK,EAAO,CACjB,IAAIyuB,EAAM,CAAC,EACPgG,EAAM,CAAC,EACP,EACA7oE,EACA1C,EACJ,IAAK,EAAI,EAAG,EAAIwF,EAAM,IAAI,OAAQ,IAChC,EAAOA,EAAM,IAAI,GACjB,EAAM9C,EAAK,WACX6iE,EAAI,KAAKvlE,IAAQ,EAAI,GAAG,EACxBulE,EAAI,KAAKvlE,EAAM,GAAG,EAClB,EAAMulE,EAAI,OAAO,MAAM,UAAU,MAAM,KAAK7iE,CAAI,CAAC,EAEnD,IAAK,EAAI,EAAG,EAAI8C,EAAM,IAAI,OAAQ,IAChC,EAAOA,EAAM,IAAI,GACjB,EAAM9C,EAAK,WACX6oE,EAAI,KAAKvrE,IAAQ,EAAI,GAAG,EACxBurE,EAAI,KAAKvrE,EAAM,GAAG,EAClB,EAAMurE,EAAI,OAAO,MAAM,UAAU,MAAM,KAAK7oE,CAAI,CAAC,EAEnD,IAAM4rE,EAAOx3B,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAClD,EACAyuB,EAAI,GACJA,EAAI,GACJA,EAAI,GACJ,IACA,IAAM//D,EAAM,IAAI,MAClB,CAAC,CAAC,OAAO+/D,EAAY,CACnB//D,EAAM,IAAI,MACZ,EAAU+lE,CAAG,CAAC,CAAC,EACTr1D,EAAQ1Q,EAAM,MACd2Q,EAAS3Q,EAAM,OACf+oE,EAAW/oE,EAAM,WAAW,GAC5BgpE,EAAWhpE,EAAM,WAAW,GAClC,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC5C,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA5gC,GAAS,EAAI,IACbA,EAAQ,IACRC,GAAU,EAAI,IACdA,EAAS,IACT,EACA,GACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EACF,CAAC,EAAGm4D,EAAMx3B,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC/C,EACA,GACA,IACA,IACA,EACA,GACA,IACA,IACA,EACA,GACA,IACA,GACF,CAAC,CAAC,EAAGA,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC1Cy3B,GAAY,GACZA,GAAY,GAAK,IACjBA,GAAY,EAAI,IAChBA,EAAW,IACXC,GAAY,GACZA,GAAY,GAAK,IACjBA,GAAY,EAAI,IAChBA,EAAW,GACb,CAAC,CAAC,CAAC,CACL,CACA,OAAO,KAAK,EAAO,CACjB,IAAMt3D,EAAS1R,EAAM,OACrB,OAAO,IAAI,WAAW,CACpB,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GAAG0R,EACH,EACA,EACA,CACF,CAAC,CACH,CACA,OAAO,UAAU,EAAO,CACtB,IAAMgc,EAAa1tB,EAAM,YAAc,EACvC,OAAO,IAAI,WAAW,CACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACAA,EAAM,cAAgB,EACtB,EACA,GACA,EACA,EACA,EACA,EACA0tB,GAAc,EAAI,IAClBA,EAAa,IACb,EACA,CACF,CAAC,CACH,CACA,OAAO,KAAK,EAAO,CACjB,OAAO4jB,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,UAAUtxC,CAAK,EAAGsxC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAKtxC,CAAK,CAAC,CAAC,CAC/F,CACA,OAAO,IAAI,EAAO,CAChB,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,QAASA,EAAI,UAAUtxC,CAAK,CAAC,CACxD,CACA,OAAO,IAAI,EAAO,CAChB,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,QAASA,EAAI,UAAUtxC,CAAK,EAAGsxC,EAAI,IAAIA,EAAI,MAAM,KAAMtxC,EAAM,MAAM,CAAC,CAC/F,CACA,OAAO,KAAK,EAAO,CACjB,GAAM,CACJ,gBACEA,EACJ,GAAIA,EAAM,OAAS,QAAS,CAC1B,GAAIipE,IAAiB,MACnB,OAAO33B,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAMA,EAAI,KAAKtxC,CAAK,CAAC,EAE1D,GAAIipE,IAAiB,OAASjpE,EAAM,OAClC,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAMA,EAAI,IAAItxC,CAAK,CAAC,EAEzD,GAAIipE,IAAiB,OAASjpE,EAAM,QAAU,MAC5C,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAMA,EAAI,IAAItxC,CAAK,CAAC,CAE3D,MACE,GAAIA,EAAM,KAAOA,EAAM,IAAK,CAC1B,GAAIipE,IAAiB,MACnB,OAAO33B,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAMA,EAAI,KAAKtxC,CAAK,CAAC,EAE1D,GAAIipE,IAAiB,QAAUjpE,EAAM,IACnC,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAMA,EAAI,KAAKtxC,CAAK,CAAC,CAE5D,MACE,MAAU,MAAM,gCAAgC,EAGpD,MAAU,MAAM,eAAeA,EAAM,KAAK,kBAAkBipE,EAAa,GAAGjpE,EAAM,MAAM,EAAE,CAC5F,CACA,OAAO,KAAK,EAAO,CACjB,IAAMnH,EAAKmH,EAAM,GACXwY,GAAYxY,EAAM,UAAY,IAAMA,EAAM,WAAa,GACvD0Q,EAAQ1Q,EAAM,OAAS,EACvB2Q,EAAS3Q,EAAM,QAAU,EACzByoE,EAAoB,KAAK,MAAMjwD,GAAY64B,GAAa,EAAE,EAC1Dq3B,EAAoB,KAAK,MAAMlwD,GAAY64B,GAAa,EAAE,EAChE,OAAOC,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC5C,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACAz4C,GAAM,GAAK,IACXA,GAAM,GAAK,IACXA,GAAM,EAAI,IACVA,EAAK,IACL,EACA,EACA,EACA,EACA4vE,GAAqB,GACrBA,GAAqB,GAAK,IAC1BA,GAAqB,EAAI,IACzBA,EAAoB,IACpBC,GAAqB,GACrBA,GAAqB,GAAK,IAC1BA,GAAqB,EAAI,IACzBA,EAAoB,IACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACAh4D,GAAS,EAAI,IACbA,EAAQ,IACR,EACA,EACAC,GAAU,EAAI,IACdA,EAAS,IACT,EACA,CACF,CAAC,CAAC,CACJ,CACA,OAAO,KAAK,EAAO,EAAqB,CACtC,IAAMu4D,EAAwB53B,EAAI,KAAKtxC,CAAK,EACtCnH,EAAKmH,EAAM,GACXmpE,EAA+B,KAAK,MAAMP,GAAuBv3B,GAAa,EAAE,EAChF+3B,EAA+B,KAAK,MAAMR,GAAuBv3B,GAAa,EAAE,EACtF,OAAOC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CACpE,EACA,EACA,EACA,EACAz4C,GAAM,GACNA,GAAM,GAAK,IACXA,GAAM,EAAI,IACVA,EAAK,GACP,CAAC,CAAC,EAAGy4C,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC1C,EACA,EACA,EACA,EACA63B,GAAgC,GAChCA,GAAgC,GAAK,IACrCA,GAAgC,EAAI,IACpCA,EAA+B,IAC/BC,GAAgC,GAChCA,GAAgC,GAAK,IACrCA,GAAgC,EAAI,IACpCA,EAA+B,GACjC,CAAC,CAAC,EAAG93B,EAAI,KAAKtxC,EAAOkpE,EAAsB,OAAS,GAAK,GAAK,EAAI,GAAK,EAAI,CAAC,EAAGA,CAAqB,CACtG,CACA,OAAO,KAAK,EAAO,CAEjB,MADA,GAAM,SAAWlpE,EAAM,UAAY,WAC5BsxC,EAAI,IAAIA,EAAI,MAAM,KAAMA,EAAI,KAAKtxC,CAAK,EAAGsxC,EAAI,KAAKtxC,CAAK,CAAC,CACjE,CACA,OAAO,KAAK,EAAO,CACjB,IAAMnH,EAAKmH,EAAM,GACjB,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC5C,EACA,EACA,EACA,EACAz4C,GAAM,GACNA,GAAM,GAAK,IACXA,GAAM,EAAI,IACVA,EAAK,IACL,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,CAAC,CACJ,CACA,OAAO,KAAK,EAAO,EAAQ,CACzB,IAAM6Q,EAAU1J,EAAM,SAAW,CAAC,EAC5BxF,EAAMkP,EAAQ,OACd2/D,EAAW,GAAK,GAAK7uE,EACrBH,EAAQ,IAAI,WAAWgvE,CAAQ,EACjC9wE,EACAq5B,EACApZ,EACA3a,EACAqD,EACAooE,EAgBJ,IAfA,GAAU,EAAID,EACdhvE,EAAM,IAAI,CACR,IAAM,OAAS,SACf,EACA,GACA,EACAG,IAAQ,GAAK,IACbA,IAAQ,GAAK,IACbA,IAAQ,EAAI,IACZA,EAAM,IACN8C,IAAW,GAAK,IAChBA,IAAW,GAAK,IAChBA,IAAW,EAAI,IACfA,EAAS,GACX,EAAG,CAAC,EACC,EAAI,EAAG/E,EAAIiC,EAAK,IACnB,EAASkP,EAAQnR,GACjB,EAAWq5B,EAAO,SAClB,EAAOA,EAAO,KACd,EAAQA,EAAO,MACf,EAAMA,EAAO,IACbv3B,EAAM,IAAI,CACRme,IAAa,GAAK,IAClBA,IAAa,GAAK,IAClBA,IAAa,EAAI,IACjBA,EAAW,IACX3a,IAAS,GAAK,IACdA,IAAS,GAAK,IACdA,IAAS,EAAI,IACbA,EAAO,IACPqD,EAAM,WAAa,EAAIA,EAAM,UAC7BA,EAAM,cAAgB,EAAIA,EAAM,eAAiB,EAAIA,EAAM,cAAgB,EAAIA,EAAM,UACrFA,EAAM,WAAa,MACnBA,EAAM,WAAa,GACnBooE,IAAQ,GAAK,IACbA,IAAQ,GAAK,IACbA,IAAQ,EAAI,IACZA,EAAM,GACR,EAAG,GAAK,GAAK/wE,CAAC,EAEhB,OAAO+4C,EAAI,IAAIA,EAAI,MAAM,KAAMj3C,CAAK,CACtC,CACA,OAAO,YAAY,EAAQ,CACpBi3C,EAAI,OACPA,EAAI,KAAK,EAEX,IAAMi4B,EAAQj4B,EAAI,KAAKntC,CAAM,EAE7B,OADeuC,GAAiB4qC,EAAI,KAAMi4B,CAC9B,CACd,CACA,OAAO,KAAK,EAAO,CACjB,IAAMC,EAAKxpE,EAAM,OACXu+D,EAAQ,CAACv+D,EAAM,IAAKA,EAAM,IAAKA,EAAM,GAAG,EAExC0R,EAAS,IAAI,WAAW,CAAC,EAAG83D,EAAG,uBAAyB,GAAKA,EAAG,kBAAoB,GAAK,GAAKA,EAAG,oBAAqBA,EAAG,oCAAoC,GAAIA,EAAG,oCAAoC,GAAIA,EAAG,oCAAoC,GAAIA,EAAG,oCAAoC,GAAIA,EAAG,mCAAmC,GAAIA,EAAG,mCAAmC,GAAIA,EAAG,mCAAmC,GAAIA,EAAG,mCAAmC,GAAIA,EAAG,mCAAmC,GAAIA,EAAG,mCAAmC,GAAIA,EAAG,kBAAmB,IAAMA,EAAG,8BAAgC,EAAG,IAAMA,EAAG,6BAA8B,IAAMA,EAAG,gBAAiB,IAAMA,EAAG,kBAAmB,IAAMA,EAAG,sBAAuB,IAAMA,EAAG,wBAAyB,EAAG,SAASA,EAAG,WAAW,GAAG,EAAG,EAAqBA,EAAG,oBAAsB,EAAIA,EAAG,qBAAuB,GAAKA,EAAG,WAAW,MAAQ,GAAK,GAAIjL,EAAM,MAAM,CAAC,EAC95B10D,EAAS6H,EAAO,OACpB,IAAK,IAAInZ,EAAI,EAAGA,EAAIgmE,EAAM,OAAQ,GAAK,EAAG,CACxC,GAAU,EACV,IAAK,IAAIl5D,EAAI,EAAGA,EAAIk5D,EAAMhmE,EAAE,CAAC,OAAQ,GAAK,EACxC,GAAU,EAAIgmE,EAAMhmE,EAAE,CAAC8M,EAAE,CAAC,MAE9B,CACA,IAAMokE,EAAO,IAAI,WAAW5/D,CAAM,EAClC4/D,EAAK,IAAI/3D,EAAQ,CAAC,EAClB,EAASA,EAAO,OAChB,IAAMg4D,EAAOnL,EAAM,OAAS,EAC5B,IAAK,IAAIhmE,EAAI,EAAGA,EAAIgmE,EAAM,OAAQ,GAAK,EAAG,CACxCkL,EAAK,IAAI,IAAI,WAAW,CAAC,GAAKlxE,GAAKA,IAAMmxE,EAAO,IAAM,GAAI,EAAGnL,EAAMhmE,EAAE,CAAC,MAAM,CAAC,EAAGsR,CAAM,EACtF,GAAU,EACV,IAAK,IAAIxE,EAAI,EAAGA,EAAIk5D,EAAMhmE,EAAE,CAAC,OAAQ,GAAK,EACxCkxE,EAAK,IAAI,IAAI,WAAW,CAAClL,EAAMhmE,EAAE,CAAC8M,EAAE,CAAC,QAAU,EAAGk5D,EAAMhmE,EAAE,CAAC8M,EAAE,CAAC,OAAS,GAAG,CAAC,EAAGwE,CAAM,EACpF,GAAU,EACV4/D,EAAK,IAAIlL,EAAMhmE,EAAE,CAAC8M,GAAIwE,CAAM,EAC5B,GAAU00D,EAAMhmE,EAAE,CAAC8M,EAAE,CAAC,MAE1B,CACA,IAAMskE,EAAOr4B,EAAI,IAAIA,EAAI,MAAM,KAAMm4B,CAAI,EACnC/4D,EAAQ1Q,EAAM,MACd2Q,EAAS3Q,EAAM,OACf+oE,EAAW/oE,EAAM,WAAW,GAC5BgpE,EAAWhpE,EAAM,WAAW,GAClC,OAAOsxC,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC5C,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA5gC,GAAS,EAAI,IACbA,EAAQ,IACRC,GAAU,EAAI,IACdA,EAAS,IACT,EACA,GACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EACF,CAAC,EAAGg5D,EAAMr4B,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC/C,EACA,GACA,IACA,IACA,EACA,GACA,IACA,IACA,EACA,GACA,IACA,GACF,CAAC,CAAC,EAAGA,EAAI,IAAIA,EAAI,MAAM,KAAM,IAAI,WAAW,CAC1Cy3B,GAAY,GACZA,GAAY,GAAK,IACjBA,GAAY,EAAI,IAChBA,EAAW,IACXC,GAAY,GACZA,GAAY,GAAK,IACjBA,GAAY,EAAI,IAChBA,EAAW,GACb,CAAC,CAAC,CAAC,CACL,CACF,EACA,EAAI,MAAQ,IAAK,GACjB,EAAI,WAAa,IAAK,GACtB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GAChB,EAAI,KAAO,IAAK,GACV,GAAwB,IAsBxB,GAA4B,IAC5B,GAAwB,KACxB,GAA8B,KAC9B,GAAwB,KAC1B,GAAgB,KAChB,GAAsB,KAgBpB,GAAN,cAAyBv7B,EAAO,CAC9B,YAAY,EAAU,EAAQ,EAAe,EAAS,CAkBpD,GAjBA,MAAM,cAAe7oC,CAAO,EAC5B,KAAK,SAAW,IAAK,GACrB,KAAK,OAAS,IAAK,GACnB,KAAK,cAAgB,IAAK,GAC1B,KAAK,YAAc,GACnB,KAAK,SAAW,KAChB,KAAK,SAAW,KAChB,KAAK,YAAc,KACnB,KAAK,YAAc,KACnB,KAAK,oBAAsB,KAC3B,KAAK,kBAAoB,GACzB,KAAK,kBAAoB,GACzB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,SAAW0oB,EAChB,KAAK,OAAS5b,EACd,KAAK,cAAgB2iB,EACrB,KAAK,YAAc,GACfsd,KAAkB,KAAM,CAE1B,IAAMj0C,GADYhG,EAAU,WAAa,GAAA,CAChB,MAAM,gBAAgB,EAC/C,GAAgBgG,EAAS,SAASA,EAAO,EAAE,EAAI,CACjD,CACA,GAAIk0C,KAAwB,KAAM,CAChC,IAAMl0C,EAAShG,EAAU,UAAU,MAAM,gBAAgB,EACzD,GAAsBgG,EAAS,SAASA,EAAO,EAAE,EAAI,CACvD,CACF,CACA,SAAU,CACR,KAAK,OAAS,KAAK,iBAAmB,KAAK,SAAW,KAAK,SAAW,IACxE,CACA,eAAe,EAAkB,CAC/B,IAAM04B,EAAU,KAAK,UACjB,CAACA,GAAW,CAACwzC,GAAoBA,EAAiB,UAAYxzC,EAAQ,SAAWwzC,EAAiB,WAAaxzC,EAAQ,UAAYwzC,EAAiB,YAAcxzC,EAAQ,YAC5K,KAAK,IAAI,kBAAkBA,GAAUR,GAAkBQ,CAAO,EAAY,KAAKwzC,GAAmBh0C,GAAkBg0C,CAAgB,GAAsB,EAE5J,KAAK,SAAW,KAAK,SAAWA,CAClC,CACA,oBAAqB,CACnB,KAAK,IAAI,sBAAsB,EAC/B,KAAK,kBAAoB,GACzB,KAAK,kBAAoB,EAC3B,CACA,kBAAmB,CACjB,KAAK,IAAI,wBAAwB,EACjC,KAAK,YAAc,GACnB,KAAK,iBAAmB,IAAK,EAC/B,CACA,iBAAiB,EAAc,CAC7B,IAAIC,EAAmB,GACjBC,EAAWxM,EAAa,EAAE,CAAC,IAC3Bz4C,EAAWy4C,EAAa,QAAQ,EAAQ,IAAW,CACvD,IAAI1uC,EAAMgD,EAAO,IACbrK,EAAQqH,EAAMm7C,EASlB,OARIxiD,EAAQ,cACV,EAAmB,GACnB,EAAMwO,GAAanH,EAAKk7C,CAAQ,EAChC,EAAQl7C,EAAMm7C,GAEZxiD,EAAQ,EACHwiD,EAEFn7C,CACT,EAAGk7C,CAAQ,EAIX,OAHID,GACF,KAAK,MAAM,uBAAuB,EAE7BhlD,CACT,CACA,MAAM,EAAY,EAAY,EAAU,EAAW,EAAY,EAAoB,EAAO,EAAc,CACtG,IAAIlT,EACAC,EACAxS,EACAqxB,EACAu5C,EACAC,EACAC,EAAkB3hE,EAClB4hE,EAAkB5hE,EAChB6hE,EAAWl5D,EAAW,IAAM,GAC5BI,EAAW8rD,EAAW,IAAM,GAC5BvzD,EAASuzD,EAAW,QAAQ,OAC5BiN,EAAqBn5D,EAAW,QAAQ,OAAS,EACjDo5D,EAAqBlD,GAASv9D,EAAS,GAAKA,EAAS,EAE3D,IADqB,CAACugE,GAAYC,KAAwB,CAAC/4D,GAAYg5D,IAAuB,KAAK,aAAelD,EACjG,CACf,GAAI,KAAK,YAAa,CAEpB,IAAM11D,EAAS,KAAK,kBAChBA,IAAW0rD,EAAW,QAAU1rD,EAAO,OAAS0rD,EAAW,SAAW1rD,EAAO,QAAoC0rD,EAAW,aAAqD,KAA+B1rD,EAAO,aAAkD,IAAkC0rD,EAAW,aAAsD,KAAgC1rD,EAAO,aAAmD,KAAQ,CAACA,GAAU44D,GAAsB,KAAK,cAAgB,MAAQD,IAC9gB,KAAK,iBAAiB,CAE1B,CACK,KAAK,cACR,EAAc,KAAK,WAAWn5D,EAAYksD,EAAY70D,EAAYgiE,CAAkB,GAEtF,IAAMC,EAAoB,KAAK,kBAC3BC,EAAqB,GACrBC,EACJ,GAAIJ,IACF,EAAqBr0C,GAAkBmnC,EAAW,OAAO,EACrD,CAACoN,GAAqB,KAAK,OAAO,8BAA8B,CAElE,GADA,EAAc,GACVC,EAAqB,EAAG,CAC1B,KAAK,KAAK,WAAWA,EAAmB,UAAU5gE,EAAO,yCAAyC,EAClG,IAAMgb,EAAW,KAAK,iBAAiBu4C,EAAW,OAAO,EACzD,EAAW,QAAUA,EAAW,QAAQ,MAAMqN,CAAkB,EAChE,EAAW,SAAWA,EACtB,IAAoBrN,EAAW,QAAQ,EAAE,CAAC,IAAMv4C,GAAYu4C,EAAW,eACvE,EAAmB+M,CACrB,MAAWM,IAAuB,KAChC,KAAK,KAAK,4BAA4B5gE,EAAO,eAAe,EAC5D,EAAc,GAElB,CAEF,GAAI,KAAK,YAAa,CACpB,GAAIwgE,GAAsBC,EAAoB,CAC5C,IAAMzlD,EAAW,KAAK,iBAAiBu4C,EAAW,OAAO,EAEnDuN,GADU50C,GAAa7kB,EAAW,QAAQ,EAAE,CAAC,IAAK2T,CAAQ,EAAIA,GACzBu4C,EAAW,eACtD,GAAmB,KAAK,IAAI,EAAGuN,CAAwB,EACvD,GAAmB,KAAK,IAAI,EAAG,CAACA,CAAwB,CAC1D,CACA,GAAIN,EAMF,IALKn5D,EAAW,aACd,KAAK,KAAK,0CAA0C,EACpD,EAAc,KAAK,WAAWA,EAAYksD,EAAY70D,EAAYgiE,CAAkB,GAEtF,EAAQ,KAAK,WAAWr5D,EAAYg5D,EAAiB,KAAK,kBAAmBK,EAAoBj5D,GAAYg5D,GAAsB1gB,IAAiBzd,EAAkB,MAAQg+B,EAAkB,IAAK,EAAC,EAClMG,EAAoB,CACtB,IAAMM,EAAmBh5D,EAAQA,EAAM,OAASA,EAAM,SAAW,EAC5DwrD,EAAW,iBACd,KAAK,KAAK,0CAA0C,EACpD,EAAc,KAAK,WAAWlsD,EAAYksD,EAAY70D,EAAYgiE,CAAkB,GAEtF,EAAQ,KAAK,WAAWnN,EAAY+M,EAAiBK,EAAmBI,CAAgB,CAC1F,OACSN,IACT,EAAQ,KAAK,WAAWlN,EAAY+M,EAAiBK,EAAmB,CAAC,GAEvE74D,IACF,EAAM,cAAgB84D,EACtB,EAAM,YAAcA,IAAuB,GAC3C,EAAM,iBAAmBC,EAE7B,CACF,CASA,OARI,KAAK,aAAe,KAAK,UAAY,KAAK,WACxC7N,EAAS,QAAQ,SACnB,EAAM3mC,GAAiC2mC,EAAUt0D,EAAY,KAAK,SAAU,KAAK,QAAQ,GAEvFqvB,EAAU,QAAQ,SACpB,EAAOtB,GAAiCsB,EAAWrvB,EAAY,KAAK,QAAQ,IAGzE,CACL,QACA,QACA,cACA,cACA,OACA,KACF,CACF,CACA,eAAe,EAAU,EAAW,EAAkB,EAAM,CAC1D,IAAMjL,EAAS,KAAK,MAAMkN,EAAmBhM,CAAS,EAClD+yB,EAAYwE,GAAa80C,EAAUvtE,CAAM,EAC7C,GAAIi0B,EAAYj0B,EAASkB,EAEvB,IADA,KAAK,IAAI,gDAAgDlB,EAASi0B,GAAa/yB,EAAU,GAAG5F,GAAM,EAC3F24B,EAAYj0B,EAASkB,GAC1B,GAAa,WAGjB,OAAO+yB,EAAYj0B,CACrB,CACA,WAAW,EAAY,EAAY,EAAY,EAAoB,CACjE,IAAMwtE,EAAe55D,EAAW,QAC1BosD,EAAeF,EAAW,QAC1B/oC,EAAgB,KAAK,cACrBlwB,EAAS,CAAC,EACV4mE,EAAW,KAAK,SAClBC,EAAgB,CAACD,GAAYR,EAC7BU,EAAY,YACZ70C,EACAC,EACA73B,EACAe,EAAU,GAId,GAHIyrE,IACF,EAAU,EAAU,KAElB95D,EAAW,QAAU45D,EAAa,OAAQ,CAE5C,OADA,EAAW,UAAY55D,EAAW,WAC1BA,EAAW,aAAnB,CACE,IAAK,MACCmjB,EAAc,MAChB,EAAY,aACZ,EAAW,MAAQ,IACVA,EAAc,MACvB,EAAW,MAAQ,OAErB,MACF,IAAK,MACH,EAAW,MAAQ,MAEvB,CACA,EAAO,MAAQ,CACb,GAAI,QACJ,YACA,MAAOnjB,EAAW,MAClB,YAAaA,EAAW,eAAiB,OAASmjB,EAAc,qBAAO,IAAI,WAAgBid,EAAI,YAAY,CAACpgC,CAAU,CAAC,EACvH,SAAU,CACR,aAAcA,EAAW,YAC3B,CACF,EACI85D,IACF,EAAU95D,EAAW,GACrB,EAAYA,EAAW,eACnB,CAAC65D,GAAYvsE,IAAcusE,EAAS,UACtC,EAAU,EAAU,KAAK,eAAeD,EAAa,EAAE,CAAC,IAAKtsE,EAAW+J,EAAY,OAAO,EAE3F,EAAgB,GAGtB,CACA,GAAI60D,EAAW,KAAOA,EAAW,KAAOE,EAAa,OAAQ,CAY3D,GAXA,EAAW,UAAYF,EAAW,eAClC,EAAO,MAAQ,CACb,GAAI,OACJ,UAAW,YACX,MAAOA,EAAW,MAClB,YAAa9rB,EAAI,YAAY,CAAC8rB,CAAU,CAAC,EACzC,SAAU,CACR,MAAOA,EAAW,MAClB,OAAQA,EAAW,MACrB,CACF,EACI4N,EAAe,CAGjB,GAFA,EAAU5N,EAAW,GACrB,EAAYA,EAAW,eACnB,CAAC2N,GAAYvsE,IAAcusE,EAAS,UAAW,CACjD,IAAMG,EAAU,KAAK,iBAAiB5N,CAAY,EAC5C6N,EAAUp1C,GAAaunC,EAAa,EAAE,CAAC,IAAK4N,CAAO,EACnDE,EAAe,KAAK,eAAeD,EAAS3sE,EAAW+J,EAAY,OAAO,EAC1E8iE,EAAe,KAAK,eAAeH,EAAS1sE,EAAW+J,EAAY,OAAO,EAChF,EAAU,KAAK,IAAI8tB,EAAS+0C,CAAY,EACxC,EAAU,KAAK,IAAIh1C,EAASi1C,CAAY,CAC1C,KACE,GAAgB,EAEpB,CACA,KAAK,iBAAmB,CACtB,MAAOjO,EAAW,MAClB,OAAQA,EAAW,OACnB,WAAYA,EAAW,UACzB,CACF,CACA,GAAI,OAAO,KAAKj5D,CAAM,CAAC,CAAC,OAoBtB,MAnBA,MAAK,YAAc,GACf6mE,GACED,GACF,KAAK,KAAK,gCAAgCR,EAAqB,GAAK,MAAMhiE,EAAW,GAAG6tB,EAAU53B,EAAU,eAAeusE,EAAS,SAAWA,EAAS,UAAU,IAAIA,EAAS,SAAS,GAAGA,EAAS,UAAU,aAAaA,EAAS,SAAS,EAE/O,KAAK,IAAI,mCAAmCxiE,EAAW,WAAW6tB,EAAU53B,EAAU,IAAI43B,EAAQ,GAAG53B,EAAU,aAAae,GAAS,EACrI,KAAK,SAAW,CACd,SAAU62B,EACV,YACA,SACF,EACA,KAAK,SAAW,CACd,SAAUC,EACV,YACA,SACF,GAEA,EAAU,EAAY,IAAK,GAEtB,CACL,SACA,UACA,YACA,SACF,CAEJ,CACA,WAAW,EAAO,EAAY,EAAY,EAAkB,CAC1D,IAAM/rB,EAAYtK,EAAM,eAClBsrE,EAAetrE,EAAM,QACrBurE,EAAgB,CAAC,EACjB/M,EAAY8M,EAAa,OACzBl1C,EAAU,KAAK,SACfo1C,EAAWp1C,EAAQ,SAAW9rB,EAAY8rB,EAAQ,UACpDq1C,EAAc,KAAK,YACnBnuE,EAAS,EACTouE,EAAoB,KAAK,oBACzBC,EACAC,EACA7B,EAAS,IACT8B,EAAS,KACTC,EAAc,GAClB,GAAI,CAACzR,GAAcoR,IAAgB,KAAM,CACvC,IAAM78C,EAAM48C,EAAWjjE,EAAa+B,EAC9Bg/D,EAAMgC,EAAa,EAAE,CAAC,IAAMv1C,GAAau1C,EAAa,EAAE,CAAC,IAAKA,EAAa,EAAE,CAAC,GAAG,EACnF35B,IAAiB85B,IAAgB,MAAQ,KAAK,IAAI78C,EAAM06C,GAAOmC,EAAcD,EAAS,EAAI,KAC5F,EAAa,GAEb,EAAc58C,EAAM06C,EAAMkC,CAE9B,CACA,IAAMO,EAAeN,EAAcD,EACnC,IAAK,IAAIjzE,EAAI,EAAGA,EAAIimE,EAAW,IAAK,CAClC,IAAM5sC,EAAS05C,EAAa/yE,GAC5B,EAAO,IAAMw9B,GAAanE,EAAO,IAAKm6C,CAAY,EAClD,EAAO,IAAMh2C,GAAanE,EAAO,IAAKm6C,CAAY,EAC9Cn6C,EAAO,IAAM05C,EAAa/yE,EAAI,EAAIA,EAAI,EAAIA,EAAE,CAAC,MAC/C,EAAc,GAElB,CACIuzE,GACFR,EAAa,KAAK,SAAS,EAAG,EAAG,CAC/B,IAAMU,EAAWnuD,EAAE,IAAMna,EAAE,IACrBuoE,EAAWpuD,EAAE,IAAMna,EAAE,IAC3B,OAAOsoE,GAAYC,CACrB,CAAC,EAEH,EAAWX,EAAa,EAAE,CAAC,IAC3B,EAAUA,EAAaA,EAAa,OAAS,EAAE,CAAC,IAChD,IAAMY,EAAgBN,EAAUD,EAC1BQ,EAAwBD,EAAgB,KAAK,MAAMA,GAAiB1N,EAAY,EAAE,EAAIkN,GAAqB1rE,EAAM,eAAiB,GACxI,GAAIq6D,EAAY,CACd,IAAM9yC,EAAQokD,EAAWI,EACnBK,EAAY7kD,EAAQ4kD,EACpBE,EAAe9kD,EAAQ,GAC7B,IAAI6kD,GAAaC,KACXD,EACF,KAAK,KAAK,IAAIpsE,EAAM,cAAgB,GAAA,CAAI,YAAY,EAAE,IAAIy1B,GAAoBlO,EAAO,EAAI,EAAE,OAAOA,EAAM,0CAA0Chf,EAAW,QAAQ,CAAC,GAAG,EAEzK,KAAK,KAAK,IAAIvI,EAAM,cAAgB,GAAA,CAAI,YAAY,EAAE,IAAIy1B,GAAoB,CAAClO,EAAO,EAAI,EAAE,OAAOA,EAAM,iDAAiDhf,EAAW,QAAQ,CAAC,GAAG,EAE/K,CAAC8jE,GAAgBN,GAAgBT,EAAa,EAAE,CAAC,KAAO35B,IAAe,CACzE,EAAWo6B,EACX,IAAMO,EAAWhB,EAAa,EAAE,CAAC,IAAM/jD,EACvC,GAAI6kD,EACF,EAAa,EAAE,CAAC,IAAMT,EACtB,EAAa,EAAE,CAAC,IAAMW,MACjB,CACL,IAAIC,EAAqB,GACzB,IAAK,IAAIh0E,EAAI,EAAGA,EAAI+yE,EAAa,QAC3B,IAAa/yE,EAAE,CAAC,IAAM+zE,GAAYC,GADC,IAAK,CAI5C,IAAMC,EAAUlB,EAAa/yE,EAAE,CAAC,IAGhC,GAFA,EAAaA,EAAE,CAAC,KAAOgvB,EACvB,EAAahvB,EAAE,CAAC,KAAOgvB,EACnBhvB,EAAI+yE,EAAa,OAAS,EAAG,CAC/B,IAAMmB,EAAgBnB,EAAa/yE,EAAI,EAAE,CAAC,IAI1C,EAFqBk0E,GADInB,EAAa/yE,EAAE,CAAC,KAEvBk0E,GAAiBD,CAErC,CACF,CACF,CACA,KAAK,IAAI,oCAAoC/2C,GAAoB62C,EAAU,EAAI,EAAE,GAAG72C,GAAoBk2C,EAAU,EAAI,EAAE,WAAWl2C,GAAoBlO,EAAO,EAAI,EAAE,IAAI,CAC1K,CAEJ,CACA,EAAW,KAAK,IAAI,EAAGokD,CAAQ,EAC/B,IAAIe,EAAS,EACTC,EAAU,EACVC,EAAUjB,EACd,IAAK,IAAIpzE,EAAI,EAAGA,EAAIimE,EAAW,IAAK,CAClC,IAAM5sC,EAAS05C,EAAa/yE,GACtBgmE,EAAQ3sC,EAAO,MACfi7C,EAAUtO,EAAM,OAClBuO,EAAY,EAChB,IAAK,IAAIznE,EAAI,EAAGA,EAAIwnE,EAAS,IAC3B,GAAatO,EAAMl5D,EAAE,CAAC,KAAK,OAE7B,GAAWynE,EACX,GAAUD,EACV,EAAO,OAASC,EACZl7C,EAAO,IAAMg7C,GACf,EAAO,IAAMA,EACb,GAAWT,EAAwB,EAAI,GAAK,GAE5C,EAAUv6C,EAAO,IAEnB,EAAS,KAAK,IAAIA,EAAO,IAAKm4C,CAAM,EACpC,EAAS,KAAK,IAAIn4C,EAAO,IAAKi6C,CAAM,CACtC,CACA,EAAUP,EAAa9M,EAAY,EAAE,CAAC,IACtC,IAAMuO,EAAWJ,EAAU,EAAID,EAAS,EACpCpmC,EACJ,GAAI,CACF,EAAO,IAAI,WAAWymC,CAAQ,CAChC,OAAS3sC,EAAK,CACZ,KAAK,SAAS,KAAK7S,EAAO,MAAOA,EAAO,MAAO,CAC7C,KAAMnR,EAAW,UACjB,QAASlD,EAAa,kBACtB,MAAO,GACP,MAAOknB,EACP,MAAO2sC,EACP,OAAQ,8BAA8BA,GACxC,CAAC,EACD,MACF,CACA,IAAMvhE,EAAQ,IAAI,SAAS86B,EAAK,MAAM,EACtC96B,EAAM,UAAU,EAAGuhE,CAAQ,EAC3BzmC,EAAK,IAAIgL,EAAI,MAAM,KAAM,CAAC,EAC1B,IAAI07B,EAAqB,GACrBC,EAAc,IACdC,EAAc,IACdC,EAAc,KACdC,EAAc,KAClB,IAAK,IAAI70E,EAAI,EAAGA,EAAIimE,EAAW,IAAK,CAClC,IAAMH,EAAciN,EAAa/yE,GAC3B80E,EAAmBhP,EAAY,MACjCiP,EAAkB,EACtB,IAAK,IAAIjoE,EAAI,EAAGwnE,EAAUQ,EAAiB,OAAQhoE,EAAIwnE,EAAS,IAAK,CACnE,IAAM99C,EAAOs+C,EAAiBhoE,GACxBkoE,EAAWx+C,EAAK,KAChBy+C,EAAcz+C,EAAK,KAAK,WAC9BvjB,EAAM,UAAUlO,EAAQkwE,CAAW,EACnC,GAAU,EACVlnC,EAAK,IAAIinC,EAAUjwE,CAAM,EACzB,GAAUkwE,EACV,GAAmB,EAAIA,CACzB,CACA,IAAIC,EACJ,GAAIl1E,EAAIimE,EAAY,EAClB,EAAoB8M,EAAa/yE,EAAI,EAAE,CAAC,IAAM8lE,EAAY,IAC1D,EAAWiN,EAAa/yE,EAAI,EAAE,CAAC,IAAM8lE,EAAY,QAC5C,CACL,IAAM3sD,EAAS,KAAK,OACdg8D,EAAoBn1E,EAAI,EAAI8lE,EAAY,IAAMiN,EAAa/yE,EAAI,EAAE,CAAC,IAAM4zE,EAE9E,GADA,EAAW5zE,EAAI,EAAI8lE,EAAY,IAAMiN,EAAa/yE,EAAI,EAAE,CAAC,IAAM4zE,EAC3Dz6D,EAAO,wBAA0B,KAAK,cAAgB,KAAM,CAC9D,IAAMi8D,EAAe,KAAK,MAAMj8D,EAAO,cAAgBpH,CAAS,EAC1DsjE,GAAmBhD,EAAmBb,EAASa,EAAmBtgE,EAAY,KAAK,YAAckhE,GAAYnN,EAAY,IAC3HuP,EAAkBD,GACpB,EAAoBC,EAAkBF,EAClChC,EAAoB,EACtB,EAAoBgC,EAEpB,EAAqB,GAEvB,KAAK,IAAI,uBAAuBE,EAAkB,GAAG,0CAA0ClC,EAAoB,GAAG,8BAA8B,GAEpJ,EAAoBgC,CAExB,KACE,GAAoBA,CAExB,CACA,IAAMG,EAAwB,KAAK,MAAMxP,EAAY,IAAMA,EAAY,GAAG,EAC1E,EAAc,KAAK,IAAI4O,EAAavB,CAAiB,EACrD,EAAc,KAAK,IAAIyB,EAAazB,CAAiB,EACrD,EAAc,KAAK,IAAIwB,EAAaO,CAAQ,EAC5C,EAAc,KAAK,IAAIL,EAAaK,CAAQ,EAC5ClC,EAAc,KAAK11C,GAAgBwoC,EAAY,IAAKqN,EAAmB4B,EAAiBO,CAAqB,CAAC,CAChH,CACA,GAAItC,EAAc,OAAQ,CACxB,GAAI55B,GACE,IAAAA,GAAgB,GAAI,CACtB,IAAMzwC,EAAQqqE,EAAc,EAAE,CAAC,MAC/B,EAAM,UAAY,EAClB,EAAM,UAAY,CACpB,OACK,GAAI35B,IACLw7B,EAAcF,EAAcC,EAAcF,GAAed,EAAwBgB,EAAc,MAAS5B,EAAc,EAAE,CAAC,MAAQ,EAAG,CACtI,KAAK,KAAK,qGAAqG,EAC/G,IAAIuC,EAAMnC,EACV,IAAK,IAAIpzE,EAAI,EAAGiC,EAAM+wE,EAAc,OAAQhzE,EAAIiC,EAAK,IAAK,CACxD,IAAMuzE,EAAUD,EAAMvC,EAAchzE,EAAE,CAAC,SACjCq2B,EAAMk/C,EAAMvC,EAAchzE,EAAE,CAAC,IACnC,GAAIA,EAAIiC,EAAM,EAAG,CACf,IAAMwzE,EAAUD,EAAUxC,EAAchzE,EAAI,EAAE,CAAC,IAC/C,EAAcA,EAAE,CAAC,SAAWy1E,EAAUp/C,CACxC,KACE,GAAcr2B,EAAE,CAAC,SAAWA,EAAIgzE,EAAchzE,EAAI,EAAE,CAAC,SAAW4zE,EAElE,EAAc5zE,EAAE,CAAC,IAAM,EACvB,EAAMw1E,CACR,CACF,CAEJ,CACA,EAAoBf,GAAsB,CAACtB,EAAoBS,EAAwBT,EACvF,IAAMtmD,EAASwmD,EAAUF,EACzB,KAAK,YAAc,EAActmD,EAASomD,EAC1C,KAAK,oBAAsBE,EAC3B,KAAK,kBAAoB,GAKzB,IAAMxuE,GAAO,CACX,MALWo0C,EAAI,KAAK,EAAM,iBAAkBq6B,EAAU5zE,EAASiI,EAAO,CACtE,QAASurE,CACX,CAAC,CAGW,EACV,MAAOjlC,EACP,UAAWyjC,EAASyB,GAAYlhE,EAChC,QAASuhE,EAASH,EAAoBF,GAAYlhE,EAClD,UAAWqhE,EAAWH,GAAYlhE,EAClC,OAAQmhE,EAAcnhE,EACtB,KAAA,QACA,SAAU,GACV,SAAU,GACV,GAAIihE,EAAc,OAClB,QAASvrE,EAAM,OACjB,EAGA,MAFA,GAAM,QAAU,CAAC,EACjB,EAAM,QAAU,EACT9C,EACT,CACA,mBAAmB,EAAO,CACxB,OAAQ8C,EAAM,aAAd,CACE,IAAK,MACH,OAAOyxC,GACT,IAAK,MACH,OAAOC,GACT,QACE,OAAOF,EACX,CACF,CACA,WAAW,EAAO,EAAY,EAAY,EAAoB,EAAiB,CAC7E,IAAMrb,EAAiBn2B,EAAM,eAEvBiuE,EAAc93C,GADCn2B,EAAM,WAAaA,EAAM,WAAam2B,GAErDu1C,EAAoB,KAAK,mBAAmB1rE,CAAK,EACjDkuE,EAAsBxC,EAAoBuC,EAC1C73C,EAAU,KAAK,SACf+3C,EAAUnuE,EAAM,eAAiB,OAAS,KAAK,cAAc,KAC7DurE,EAAgB,CAAC,EACjB6C,EAAmBjE,IAAoB,IAAK,GAC9CmB,EAAetrE,EAAM,QACrB1C,EAAS6wE,EAAU,EAAI,EACvBE,EAAc,KAAK,aAAe,GAChC7C,EAAWp1C,EAAQ,SAAWD,EAAiBC,EAAQ,UACvDk4C,EAAmB9C,EAAWjjE,EAAa4tB,EAKjD,GAJA,KAAK,kBAAoB,IAA2Bm1C,EAAa,QAAU+C,EAAc,IAAM9D,GAAsB,KAAK,IAAI+D,GAAoBD,EAAc7C,EAAS,EAAI,KAAO,KAAK,IAAIz1C,GAAau1C,EAAa,EAAE,CAAC,IAAKgD,CAAgB,GAAKD,EAAc7C,EAAS,EAAI,GAAK0C,GACpR5C,EAAa,QAAQ,SAAS,EAAQ,CACpC,EAAO,IAAMv1C,GAAanE,EAAO,IAAK08C,CAAgB,CACxD,CAAC,EACG,CAACjU,GAAcgU,EAAc,EAAG,CAClC,IAAM9oE,EAAc+lE,EAAa,OAKjC,GAJA,EAAeA,EAAa,OAAQ,GAAW15C,EAAO,KAAO,CAAC,EAC1DrsB,IAAgB+lE,EAAa,QAC/B,KAAK,KAAK,WAAWA,EAAa,OAAS/lE,EAAY,MAAMA,EAAY,oBAAoBimE,EAAS,KAAKr1C,EAAe,EAAE,EAE1H,CAACm1C,EAAa,OAChB,OAEF,AAKE+C,EALElE,IAAoB,EACR,EACLI,GAAsB,CAAC6D,EAClB,KAAK,IAAI,EAAGE,EAAmB9C,CAAQ,EAEvCF,EAAa,EAAE,CAAC,IAAME,CAExC,CACA,GAAIxrE,EAAM,eAAiB,MAAO,CAChC,IAAMuuE,EAAsB,KAAK,OAAO,oBACxC,IAAK,IAAIh2E,EAAI,EAAGy1E,EAAUK,EAAc7C,EAAUjzE,EAAI+yE,EAAa,OAAQ,IAAK,CAC9E,IAAM15C,EAAS05C,EAAa/yE,GACtBq2B,EAAMgD,EAAO,IACbrK,EAAQqH,EAAMo/C,EACdx1D,EAAW,KAAK,IAAI,IAAM+O,EAAQ4O,CAAc,EACtD,GAAI5O,GAAS,CAACgnD,EAAsBL,GAAuBE,EACrD71E,IAAM,IACR,KAAK,KAAK,kBAAkBq2B,EAAMuH,EAAA,CAAgB,QAAQ,CAAC,EAAE,uBAAuB,KAAK,MAAM,IAAM5O,EAAQ4O,CAAc,EAAE,KAAK,EAClI,KAAK,YAAc,EAAcvH,EAAM48C,EACvC,EAAU58C,QAEP,GAAIrH,GAASgnD,EAAsBL,GAAuB11D,EAAW+4B,IAA6B68B,EAAkB,CACzH,IAAIn/C,EAAU,KAAK,MAAM1H,EAAQ2mD,CAAmB,EAEpD,IADA,EAAUt/C,EAAMK,EAAUi/C,EACnBF,EAAU,GAAK/+C,GAAWi/C,GAC/B,IACA,GAAWA,EAET31E,IAAM,IACR,KAAK,YAAc,EAAcy1E,EAAUxC,GAE7C,KAAK,KAAK,aAAav8C,EAAQ,oBAAoB++C,EAAUxC,GAAYr1C,EAAA,CAAgB,QAAQ,CAAC,EAAE,WAAW,KAAK,MAAM,IAAM5O,EAAQ4O,CAAc,EAAE,SAAS,EACjK,IAAK,IAAI9wB,EAAI,EAAGA,EAAI4pB,EAAS,IAAK,CAChC,IAAIu/C,EAAYp9B,GAAI,eAAepxC,EAAM,aAAeA,EAAM,eAAiBA,EAAM,MAAOA,EAAM,YAAY,EAC9G,AAEEwuE,KADA,KAAK,IAAI,mFAAmF,EAChF58C,EAAO,KAAK,SAAS,GAEnC05C,EAAa,OAAO/yE,EAAG,EAAG,CACxB,KAAMi2E,EACN,IAAKR,CACP,CAAC,EACD,GAAWE,EACX,GACF,CACF,CACA,EAAO,IAAMF,EACb,GAAWE,CACb,CACF,CACA,IAAI5B,EAAW,KACXmC,EAAU,KACVnoC,EACAymC,EAAW,EACXlF,EAAeyD,EAAa,OAChC,KAAO,KACL,GAAYA,EAAazD,EAAa,CAAC,KAAK,WAE9C,IAAK,IAAIxiE,EAAI,EAAGqpE,EAAapD,EAAa,OAAQjmE,EAAIqpE,EAAY,IAAK,CACrE,IAAMC,EAAcrD,EAAajmE,GAC3B0pB,EAAO4/C,EAAY,KACrB//C,EAAM+/C,EAAY,IACtB,GAAIF,IAAY,KAAM,CACpB,IAAMG,EAAarD,EAAclmE,EAAI,GACrC,EAAW,SAAW,KAAK,OAAOupB,EAAM6/C,GAAWR,CAAW,CAChE,MAKE,GAJI5T,GAAcr6D,EAAM,eAAiB,QACvC,EAAMquE,EAAc7C,GAEtB,EAAW58C,EACPm+C,EAAW,EAAG,CAChB,GAAYzvE,EACZ,GAAI,CACF,EAAO,IAAI,WAAWyvE,CAAQ,CAChC,OAAS3sC,EAAK,CACZ,KAAK,SAAS,KAAK7S,EAAO,MAAOA,EAAO,MAAO,CAC7C,KAAMnR,EAAW,UACjB,QAASlD,EAAa,kBACtB,MAAO,GACP,MAAOknB,EACP,MAAO2sC,EACP,OAAQ,8BAA8BA,GACxC,CAAC,EACD,MACF,CACKoB,IAEH,IADkB,SAAS7nC,EAAK,MAC5B,CAAC,CAAC,UAAU,EAAGymC,CAAQ,EAC3BzmC,EAAK,IAAIgL,EAAI,MAAM,KAAM,CAAC,EAE9B,MACE,OAGJhL,EAAK,IAAIvX,EAAMzxB,CAAM,EACrB,IAAMuxE,EAAU9/C,EAAK,WACrB,GAAU8/C,EACVtD,EAAc,KAAK11C,GAAgB,GAAM61C,EAAmBmD,EAAS,CAAC,CAAC,EACvE,EAAUjgD,CACZ,CACA,IAAM4vC,EAAY+M,EAAc,OAChC,GAAI,CAAC/M,EACH,OAEF,IAAMC,EAAa8M,EAAcA,EAAc,OAAS,GACxD,EAAckD,EAAUjD,EACxB,KAAK,YAAc6C,EAAcJ,EAAcxP,EAAW,SAC1D,IAAMt3D,EAAOgnE,kBAAU,IAAI,WAAgB78B,EAAI,KAAK,EAAM,iBAAkBg7B,EAAW2B,EAAal2E,EAAS,CAAC,EAAGiI,EAAO,CACtH,QAASurE,CACX,CAAC,CAAC,EACF,EAAM,QAAU,CAAC,EACjB,IAAM1vD,GAASywD,EAAWd,GAAYr1C,EAChCv4B,EAAM,KAAK,YAAcu4B,EAEzB6wC,EAAY,CAChB,MAAO7/D,EACP,MAAOm/B,EACP,SAAUzqB,EACV,OAAQje,EACR,SAAUie,EACV,OAAQje,EACR,KAAA,QACA,SAAU,GACV,SAAU,GACV,GAAI4gE,CACN,EAEA,MADA,MAAK,kBAAoB,GAClBwI,CACT,CACF,EA0DM,GAAN,cAAiCv5B,EAAO,CACtC,YAAY,EAAU,EAAQ,EAAe,EAAS,CACpD,MAAM,sBAAuB7oC,CAAO,EACpC,KAAK,gBAAkB,GACvB,KAAK,WAAa,IAAK,GACvB,KAAK,WAAa,IAAK,GACvB,KAAK,SAAW,IAAK,GACrB,KAAK,QAAU,KACf,KAAK,WAAa,IAAK,GACvB,KAAK,YAAc,KACnB,KAAK,kBAAoB,EAC3B,CACA,SAAU,CACV,CACA,eAAe,EAAgB,CAC7B,KAAK,YAAc,KACnB,IAAMwxB,EAAU,KAAK,QACjBA,GAAW04C,GACT14C,EAAQ,WAAa04C,EAAe,UAAY14C,EAAQ,YAAc04C,EAAe,YAI3F,KAAK,QAAUA,EACjB,CACA,oBAAqB,CACnB,KAAK,kBAAoB,GACzB,KAAK,YAAc,IACrB,CACA,iBAAiB,EAAa,EAAY,EAAY,EAAa,CACjE,KAAK,WAAaz9D,EAClB,KAAK,WAAajF,EAClB,KAAK,oBAAoBhN,EAAaiE,CAAW,EACjD,KAAK,gBAAkB,EACzB,CACA,oBAAoB,EAAa,EAAa,CAC5C,GAAI,CACF,aACA,cACE,KACJ,GAAI,EAAEjE,GAAe,MAAQA,EAAY,YAAa,CACpD,KAAK,WAAa,IAAK,GACvB,KAAK,SAAW,IAAK,GACrB,MACF,CACA,GAAM,CACJ,QACA,SACE,KAAK,SAAWF,EAAiBE,CAAW,EAChD,GAAIiE,EACFD,GAAmBhE,EAAaiE,CAAW,MACtC,CACL,IAAM0rE,EAAcn9D,GAASD,EACzBo9D,GAAe,MAAQA,EAAY,WACrC,KAAK,KAAK,uDAAuDA,EAAY,MAAM,IAAI,CAE3F,CACIn9D,IACF,EAAaglB,GAAoBhlB,EAAOjS,EAAsB,MAAO,IAAI,GAEvEgS,IACF,EAAailB,GAAoBjlB,EAAOhS,EAAsB,MAAO,IAAI,GAE3E,IAAMwE,EAAS,CAAC,EACZyN,GAASD,EACX,EAAO,WAAa,CAClB,UAAW,YACX,MAAON,EAAa,IAAMjF,EAC1B,aAAcuF,EAAM,aACpB,UAAWA,EAAM,UACjB,cACA,GAAI,MACN,EACSC,EACT,EAAO,MAAQ,CACb,UAAW,YACX,MAAOP,EACP,UAAWO,EAAM,UACjB,cACA,GAAI,OACN,EACSD,EACT,EAAO,MAAQ,CACb,UAAW,YACX,MAAOvF,EACP,aAAcuF,EAAM,aACpB,UAAWA,EAAM,UACjB,cACA,GAAI,MACN,EAEA,KAAK,KAAK,kDAAkD,EAE9D,KAAK,WAAaxN,CACpB,CACA,MAAM,EAAY,EAAY,EAAU,EAAW,EAAY,EAAoB,CACjF,IAAI6qE,EAAWC,EACf,GAAI,CACF,UACA,eACE,KACEvxE,EAAS,CACb,MAAO,IAAK,GACZ,MAAO,IAAK,GACZ,KAAMk6B,EACN,IAAKilC,EACL,YAAa,IAAK,EACpB,EACKh4D,EAAeqqE,CAAW,IAC7B,EAAc,KAAK,YAAc3mE,GAAc,GAEjD,IAAMrL,EAAOkgE,EAAW,QACxB,GAAI,CAAClgE,EAAK,OACR,OAAOQ,EAET,IAAM0B,EAAc,CAClB,QAAS,IAAK,GACd,UAAW,IAAK,GAChB,QAAS,IAAK,EAChB,EACImF,EAAW,KAAK,SAKpB,IAJO,EAAYA,IAAa,MAAQyqE,EAAU,SAChD,KAAK,oBAAoB9xE,CAAI,EAC7B,EAAW,KAAK,UAEd,GAAG,EAAaqH,IAAa,MAAQ0qE,EAAW,QAElD,OADA,KAAK,KAAK,iCAAiC,EACpCvxE,EAET,AAEE,KAAK,mBADL,EAAY,OAAS,KAAK,WACH,IAEzB,IAAMyxE,EAAkBjrE,GAAchH,EAAMqH,EAAU,IAAI,EACpD6qE,EAAwB7qE,EAAS,MAAQ4qE,EAAgB5qE,EAAS,MAAM,IAAM,KAC9E8qE,EAAwB9qE,EAAS,MAAQ4qE,EAAgB5qE,EAAS,MAAM,IAAM,KAC9E+qE,EAAiB/4C,GAAoB84C,EAAuB,GAAQ,EACpEE,EAAiBh5C,GAAoB64C,EAAuB,GAAQ,EACpEI,EAAej5C,GAAoB84C,EAAuB,EAAG,EAAI,EACjEI,EAAel5C,GAAoB64C,EAAuB,EAAG,EAAI,EACnEM,EAAannE,EACbiQ,EAAW,EACTm3D,EAAcP,IAA0B,CAACC,GAAyB,CAACj5C,GAAWm5C,EAAiBD,GAAkBl5C,GAAWA,EAAQ,UAAY7xB,EAAS,MAAM,IAC/JqrE,EAAoBD,EAAcP,EAAwBC,EAChE,GAAIO,EAAmB,CACrB,IAAMpxE,EAAYoxE,EAAkB,UAC9BlrE,EAAWkrE,EAAkB,MAAQrnE,EAAa/J,EAClDe,EAAUowE,EAAcprE,EAAS,MAAM,GAAKA,EAAS,MAAM,GACjE,EAAaqrE,EAAkB,MAAQpxE,EACvC,EAAWmxE,EAAcF,EAAeF,EAAiBC,EAAeF,GACnE/E,GAAsB,CAACn0C,KAAaK,GAAiBL,EAASs5C,EAAYnnE,EAAYiQ,CAAQ,GAAKha,IAAc43B,EAAQ,aACxHA,GACF,KAAK,KAAK,gCAAgCm0C,EAAqB,GAAK,MAAMhiE,EAAW,GAAG7D,EAAWlG,EAAU,eAAe43B,EAAQ,SAAWA,EAAQ,UAAU,IAAIA,EAAQ,SAAS,GAAGA,EAAQ,UAAU,aAAaA,EAAQ,SAAS,EAE3O,KAAK,IAAI,mCAAmC7tB,EAAW,WAAWmnE,EAAannE,EAAW,IAAI7D,EAAS,GAAGlG,EAAU,aAAae,GAAS,EAC1I,EAAU,KACV,EAAY,QAAUmF,EACtB,EAAY,UAAYlG,EACxB,EAAY,QAAUe,EAE1B,MACE,KAAK,KAAK,iEAAiEgJ,GAAY,EAEpF6tB,GAaH,EAAY,QAAUA,EAAQ,SAC9B,EAAY,UAAYA,EAAQ,UAChC,EAAY,QAAUA,EAAQ,WAd1B,CAACh3B,EAAY,WAAaA,EAAY,UAAY,IAAK,IAAKA,EAAY,UAAY,IAAK,MAC3F,KAAK,KAAK,uBAAuB,EACjC,EAAY,QAAUswE,EACtB,EAAY,UAAY,EACxB,EAAY,QAAU,IAExB,KAAK,QAAU,EAAU,CACvB,SAAUtwE,EAAY,QACtB,UAAWA,EAAY,UACvB,QAASA,EAAY,OACvB,GAMF,IAAMu3B,EAAY+4C,EAAat5C,EAAQ,SAAWA,EAAQ,UACpDrU,EAAU4U,EAAYne,EACxBA,EAAW,EACb,KAAK,YAAcuJ,GAEnB,KAAK,KAAK,sDAAsD,EAChE,KAAK,mBAAmB,GAE1B,IAAMqoD,EAAW,CAAC,CAAC7lE,EAAS,MACtB+M,EAAW,CAAC,CAAC/M,EAAS,MACxB3L,EAAO,GACPwxE,IACF,GAAQ,SAEN94D,IACF,GAAQ,SAEV,IAAMhR,GAAaiE,EAAS,MAAQA,EAAS,MAAM,UAAY,MAAWA,EAAS,MAAQA,EAAS,MAAM,UAAY,IAChHvE,EAAQ,CACZ,MAAO9C,EACP,SAAUy5B,EACV,SAAUA,EACV,OAAQ5U,EACR,OAAQA,EACR,OACA,WACA,WACA,GAAI,EACJ,QAAS,EACT,WACF,EACA,EAAO,MAAQqoD,GAAY,CAAC94D,EAAWtR,EAAQ,IAAK,GACpD,EAAO,MAAQsR,EAAWtR,EAAQ,IAAK,GACvC,IAAM6vE,EAAmBR,GAA+D,YACxF,GAAIQ,EAAkB,CACpB,IAAMC,EAAgBT,EAAsB,cACtCpF,EAAc6F,IAAkB,GACtC,EAAM,GAAKD,EACX,EAAM,QAAUC,IAAkB,GAAK,KAAK,kBAAoB,EAAI7F,EAAc6F,EAAgBD,EAClG,EAAM,YAAc5F,EACpB,EAAM,cAAgB6F,EAClB7F,GAAeoF,EAAsB,gBACvC,EAAM,kBAAoBA,EAAsB,cAAgBj5C,EAAQ,UAAYA,EAAQ,WAEzF,KAAK,oBACR,EAAO,YAAc6zC,GAEvB,AAA2B,KAAK,oBAAoBA,EAChDjqE,EAAM,SACR,KAAK,KAAK,0CAA0C8vE,EAAc,GAAGD,EAAiB,YAAY7vE,EAAM,QAAQ,UAAUA,EAAM,kBAAoB,MAAM,CAE9J,CAMA,MALA,GAAO,YAAcZ,EACrB,EAAO,IAAM82B,GAAiC2mC,EAAUt0D,EAAY6tB,EAASA,CAAO,EAChFwB,EAAU,QAAQ,SACpB,EAAO,KAAOtB,GAAiCsB,EAAWrvB,EAAY6tB,CAAO,GAExE14B,CACT,CACF,EAgCA,GAAI,CACF,GAAM,KAAK,YAAY,IAAI,KAAK,KAAK,WAAW,CAClD,MAAc,CACZ,GAAM,KAAK,GACb,CACM,GAAY,CAAC,CACjB,MAAOkzC,GACP,MAAOkB,EACT,EAAG,CACD,MAAOX,GACP,MAAOU,EACT,EAAG,CACD,MAAOtB,GACP,MAAOsB,EACT,EAAG,CACD,MAAOnB,GACP,MAAOmB,EACT,CAAC,EAECG,GAAU,OAAO,EAAG,EAAG,CACrB,MAAOvB,GACP,MAAOoB,EACT,CAAC,EAEG,GAAN,KAAiB,CACf,YAAY,EAAU,EAAe,EAAQ,EAAQ,EAAI,EAAS,CAChE,KAAK,YAAc,GACnB,KAAK,OAAS,IAAK,GACnB,KAAK,SAAW,IAAK,GACrB,KAAK,cAAgB,IAAK,GAC1B,KAAK,OAAS,IAAK,GACnB,KAAK,GAAK,IAAK,GACf,KAAK,QAAU,IAAK,GACpB,KAAK,QAAU,IAAK,GACpB,KAAK,UAAY,IAAK,GACtB,KAAK,MAAQ,IAAK,GAClB,KAAK,kBAAoB,KACzB,KAAK,eAAiB,IAAK,GAC3B,KAAK,qBAAuB,IAAK,GACjC,KAAK,SAAWvkB,EAChB,KAAK,cAAgB+G,EACrB,KAAK,OAAS3iB,EACd,KAAK,GAAK7Y,EACV,KAAK,OAAS+L,CAChB,CACA,UAAU,EAAgB,CACxB,KAAK,eAAiBmrE,EAClB,KAAK,WACP,KAAK,UAAU,MAAM,CAEzB,CACA,KAAK,EAAM,EAAa,EAAW,EAAO,CACxC,IAAM7tB,EAAQwV,EAAU,YACxB,EAAM,aAAe3lB,GAAI,EACzB,IAAIi+B,EAAW,IAAI,WAAW9yE,CAAI,EAC5B,CACJ,uBACA,kBACE,KACA24D,IACF,KAAK,qBAAuBA,GAE9B,GAAM,CACJ,aACA,gBACA,cACA,qBACA,aACA,qBACEA,GAASoa,EACP,CACJ,aACA,aACA,iBACA,WACA,mBACEF,EACExvD,EAAUsW,GAAkBm5C,EAAU3sE,CAAW,EACvD,GAAIkd,GAAWxC,GAAwBwC,EAAQ,MAAM,EAAG,CACtD,IAAM2vD,EAAY,KAAK,aAAa,EAC9B10D,EAAUwC,GAAgCuC,EAAQ,MAAM,EAC9D,GAAI2vD,EAAU,OAAO,EAAG,CACtB,IAAIhZ,EAAgBgZ,EAAU,gBAAgBF,EAAUzvD,EAAQ,IAAI,OAAQA,EAAQ,GAAG,OAAQ/E,CAAO,EAEtG,GADqBk8C,EAAU,KAAO,GACpB,CAChB,IAAMyY,EAAQD,EAAU,MAAM,EAC9B,EAAgBC,GAAQA,EAAM,MAChC,CACA,GAAI,CAACjZ,EAEH,MADA,GAAM,WAAanlB,GAAI,EAChBG,GAAYwlB,CAAS,EAE9B,EAAW,IAAI,WAAWR,CAAa,CACzC,MAOE,MANA,MAAK,YAAc,GACnB,KAAK,kBAAoBgZ,EAAU,iBAAiBF,EAAUzvD,EAAQ,IAAI,OAAQA,EAAQ,GAAG,OAAQ/E,CAAO,CAAC,CAAC,KAAM,GAAkB,CACpI,IAAM40D,EAAU,KAAK,KAAKlZ,EAAe,KAAMQ,CAAS,EAExD,MADA,MAAK,kBAAoB,KAClB0Y,CACT,CAAC,EACM,KAAK,iBAEhB,CACA,IAAMC,EAAc,KAAK,aAAaC,EAAeC,CAAW,EAChE,GAAIF,EAAa,CACf,IAAMp3D,EAAQ,KAAK,oBAAoB+2D,CAAQ,EAC/C,GAAI/2D,EAUF,OATA,KAAK,OAAO,KAAK,gBAAgBA,EAAM,SAAS,EAChD,KAAK,SAAS,KAAKsU,EAAO,MAAOA,EAAO,MAAO,CAC7C,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,MAAO,GACP,QACA,OAAQD,EAAM,OAChB,CAAC,EACD,EAAM,WAAa84B,GAAI,EAChBG,GAAYwlB,CAAS,CAEhC,EACI4Y,GAAiBC,GAAeC,GAAqBH,IACvD,KAAK,iBAAiBI,EAAiBp/D,EAAYjF,EAAYoM,EAAUnV,CAAW,GAElFitE,GAAiBE,GAAqBH,IACxC,KAAK,sBAAsBK,CAAc,EAEtCrW,GACH,KAAK,gBAAgB,EAEvB,IAAM38D,EAAS,KAAK,SAASsyE,EAAUzvD,EAAShY,EAAYgiE,EAAoB7S,CAAS,EACzF,KAAK,YAAc1gC,GAAUt5B,CAAM,EACnC,IAAMizE,EAAe,KAAK,qBAK1B,MAJA,GAAa,WAAa,GAC1B,EAAa,cAAgB,GAC7B,EAAa,YAAc,GAC3B,EAAM,WAAa5+B,GAAI,EAChBr0C,CACT,CACA,MAAM,EAAW,CACf,IAAMwkD,EAAQwV,EAAU,YACxB,EAAM,aAAe3lB,GAAI,EACzB,GAAM,CACJ,YACA,uBACA,qBACE,KACJ,GAAI6+B,EAEF,MADA,MAAK,YAAc,GACZA,EAAkB,SAChB,KAAK,MAAMlZ,CAAS,CAC5B,EAEH,IAAMmZ,EAAkB,CAAC,EACnB,CACJ,cACEZ,EACJ,GAAIC,EAAW,CACb,IAAMhZ,EAAgBgZ,EAAU,MAAM,EAClChZ,GACF2Z,EAAgB,KAAK,KAAK,KAAK3Z,EAAc,OAAQ,KAAMQ,CAAS,CAAC,CAEzE,CACA,GAAM,CACJ,UACA,WACE,KACJ,GAAI,CAACoZ,GAAW,CAACC,EAAS,CACxB,EAAM,WAAah/B,GAAI,EACvB,IAAMi/B,EAAe,CAAC9+B,GAAYwlB,CAAS,CAAC,EAI5C,OAHI,KAAK,YACA,QAAQ,QAAQsZ,CAAY,EAE9BA,CACT,CACA,IAAMC,EAAuBH,EAAQ,MAAMvoE,CAAU,EAYrD,OAXIyuB,GAAUi6C,CAAoB,GAChC,KAAK,YAAc,GACZA,EAAqB,KAAM,IAChC,KAAK,WAAWJ,EAAiBpJ,EAAa/P,CAAS,EAChDmZ,EACR,IAEH,KAAK,WAAWA,EAAiBI,EAAsBvZ,CAAS,EAC5D,KAAK,YACA,QAAQ,QAAQmZ,CAAe,EAEjCA,EACT,CACA,WAAW,EAAiB,EAAa,EAAW,CAClD,GAAM,CACJ,aACA,aACA,WACA,aACEpJ,EACE,CACJ,qBACA,cACE,KAAK,qBACT,KAAK,OAAO,IAAI,4BAA4B,KAAK,GAAG,OAAO/P,EAAU,KAAKA,EAAU,KAAO,GAAK,UAAYA,EAAU,KAAO,GAAG,MAAM,KAAK,KAAOvrB,EAAkB,KAAO,QAAU,QAAQ,GAAGurB,EAAU,OAAO,EACjN,IAAMwZ,EAAc,KAAK,QAAQ,MAAMhgE,EAAYksD,EAAYP,EAAUjlC,EAAWrvB,EAAYgiE,EAAoB,GAAM,KAAK,EAAE,EACjIsG,EAAgB,KAAK,CACnB,cACA,WACF,CAAC,EACD,EAAU,YAAY,WAAa9+B,GAAI,CACzC,CACA,sBAAsB,EAAgB,CACpC,GAAM,CACJ,UACA,WACE,KACC++B,GAAYC,IAGjBD,EAAQ,eAAeJ,CAAc,EACrCK,EAAQ,eAAeL,CAAc,EACvC,CACA,iBAAkB,CAChB,GAAM,CACJ,UACA,WACE,KACCI,GAAYC,IAGjBD,EAAQ,gBAAgB,EACxBC,EAAQ,mBAAmB,EAC7B,CACA,iBAAiB,EAAiB,EAAY,EAAY,EAAe,EAAa,CACpF,GAAM,CACJ,UACA,WACE,KACCD,GAAYC,IAGjBD,EAAQ,iBAAiBL,EAAiBp/D,EAAYjF,EAAY4wD,CAAa,EAC/E+T,EAAQ,iBAAiBN,EAAiBp/D,EAAYjF,EAAY/I,CAAW,EAC/E,CACA,SAAU,CACR,AAEE,KAAK,WADL,KAAK,QAAQ,QAAQ,EACN,IAAK,IAEtB,AAEE,KAAK,WADL,KAAK,QAAQ,QAAQ,EACN,IAAK,GAExB,CACA,SAAS,EAAM,EAAS,EAAY,EAAoB,EAAW,CACjE,IAAI3F,EAMJ,MALA,CAGEA,EAHE6iB,GAAWA,EAAQ,SAAW,aACvB,KAAK,kBAAkBrjB,EAAMqjB,EAAShY,EAAYgiE,EAAoB7S,CAAS,EAE/E,KAAK,oBAAoBx6D,EAAMqL,EAAYgiE,EAAoB7S,CAAS,EAE5Eh6D,CACT,CACA,oBAAoB,EAAM,EAAY,EAAoB,EAAW,CACnE,GAAM,CACJ,aACA,aACA,WACA,aACE,KAAK,QAAQ,MAAMR,EAAMqL,EAAY,GAAO,CAAC,KAAK,OAAO,WAAW,EAExE,MAAO,CACL,YAFkB,KAAK,QAAQ,MAAM2I,EAAYksD,EAAYP,EAAUjlC,EAAWrvB,EAAYgiE,EAAoB,GAAO,KAAK,EAEpH,EACV,WACF,CACF,CACA,kBAAkB,EAAM,EAAa,EAAY,EAAoB,EAAW,CAC9E,OAAO,KAAK,QAAQ,eAAertE,EAAM65B,EAAaxuB,CAAU,CAAC,CAAC,KAAM,IAE/D,CACL,YAFkB,KAAK,QAAQ,MAAMk/D,EAAY,WAAYA,EAAY,WAAYA,EAAY,SAAUA,EAAY,UAAWl/D,EAAYgiE,EAAoB,GAAO,KAAK,EAEpK,EACV,WACF,EACD,CACH,CACA,oBAAoB,EAAM,CACxB,GAAM,CACJ,SACA,WACA,iBACE,KACA4G,EACJ,IAAK,IAAI54E,EAAI,EAAGiC,EAAMw3C,GAAU,OAAQz5C,EAAIiC,EAAK,IAAK,CACpD,IAAI42E,EACJ,IAAK,EAAqBp/B,GAAUz5C,EAAE,CAAC,QAAU,MAAQ64E,EAAmB,MAAMl0E,EAAM,KAAK,MAAM,EAAG,CACpG,EAAM80C,GAAUz5C,GAChB,KACF,CACF,CACA,GAAI,CAAC44E,EACH,MAAO,gBAAI,MAAM,iDAAiD,EAEpE,IAAML,EAAU,KAAK,QACfC,EAAU,KAAK,QACfM,EAAUF,EAAI,MACdG,EAAUH,EAAI,OAChB,CAACJ,GAAW,EAAEA,aAAmBM,MACnC,KAAK,QAAU,IAAIA,EAAQ/jD,EAAU5b,EAAQ2iB,EAAe,KAAK,MAAM,IAErE,CAACy8C,GAAW,EAAEA,aAAmBQ,MACnC,KAAK,QAAU,IAAIA,EAAQhkD,EAAU5b,EAAQ2iB,EAAe,KAAK,MAAM,EACvE,KAAK,MAAQi9C,EAAQ,MAEzB,CACA,aAAa,EAAe,EAAa,CACvC,MAAO,CAAC,KAAK,SAAW,CAAC,KAAK,SAAWhB,GAAiBC,CAC5D,CACA,cAAe,CACb,IAAIL,EAAY,KAAK,UAIrB,MAHA,CACEA,IAAY,KAAK,UAAY,IAAIthC,GAAU,KAAK,MAAM,EAEjDshC,CACT,CACF,EAQM,GAAe,IAAe,CAClC,YAAa,CAAC,EACd,WACF,GAIM,GAAN,KAAqB,CACnB,YAAY,EAAY,EAAY,EAAiB,EAAU,EAAgB,CAC7E,KAAK,WAAa,IAAK,GACvB,KAAK,WAAa,IAAK,GACvB,KAAK,gBAAkB,IAAK,GAC5B,KAAK,SAAW,IAAK,GACrB,KAAK,eAAiB,IAAK,GAC3B,KAAK,WAAa7+D,EAClB,KAAK,WAAajF,EAClB,KAAK,gBAAkBqkE,EACvB,KAAK,SAAWj4D,EAChB,KAAK,eAAiBk4D,GAAkB,IAC1C,CACF,EACM,GAAN,KAAoB,CAClB,YAAY,EAAe,EAAY,EAAoB,EAAa,EAAY,EAAmB,CACrG,KAAK,cAAgB,IAAK,GAC1B,KAAK,WAAa,IAAK,GACvB,KAAK,mBAAqB,IAAK,GAC/B,KAAK,YAAc,IAAK,GACxB,KAAK,WAAa,IAAK,GACvB,KAAK,kBAAoB,IAAK,GAC9B,KAAK,cAAgBJ,EACrB,KAAK,WAAajW,EAClB,KAAK,mBAAqBkQ,EAC1B,KAAK,YAAcgG,EACnB,KAAK,WAAahoE,EAClB,KAAK,kBAAoBioE,CAC3B,CACF,EACI,GAA0B,EACxB,GAAN,KAA0B,CACxB,YAAY,EAAM,EAAI,EAAoB,EAAS,CACjD,KAAK,MAAQ,KACb,KAAK,IAAM,IAAK,GAChB,KAAK,GAAK,IAAK,GACf,KAAK,WAAa,KAClB,KAAK,SAAW,IAAK,GACrB,KAAK,KAAO,KACZ,KAAK,KAAO,KACZ,KAAK,UAAY,IAAK,GACtB,KAAK,cAAgB,KACrB,KAAK,WAAa,KAClB,KAAK,mBAAqB,IAAK,GAC/B,KAAK,QAAU,IAAK,GACpB,KAAK,gBAAmB,GAAU,CAChC,IAAMtzE,EAAOguB,EAAM,KACb7T,EAAM,KAAK,IACjB,GAAKA,GAASna,GAAQ,MAAQA,EAAK,OAAUA,EAAK,aAAe,KAAK,WAGtE,OAAQA,EAAK,MAAb,CACE,IAAK,OAAQ,CAEX,IAAMsvB,EAAmC,KAAK,eAAsD,UAChGA,GACF,KAAK,IAAI,gBAAgBA,CAAS,EAEpC,KACF,CACA,IAAK,mBACH,KAAK,uBAAuBtvB,EAAK,IAAI,EACrC,MAEF,IAAK,QACH,KAAK,QAAQA,EAAK,IAAI,EACtB,MAEF,IAAK,YACCma,EAAI,OAAOna,EAAK,KAAK,UACvBma,EAAI,OAAOna,EAAK,KAAK,QAAQ,CAACA,EAAK,KAAK,OAAO,EAEjD,MAEF,QACE,EAAK,KAAOA,EAAK,MAAQ,CAAC,EAC1B,EAAK,KAAK,KAAO,KAAK,KACtB,EAAK,KAAK,KAAO,KAAK,KACtB,EAAK,KAAK,GAAK,KAAK,GACpBma,EAAI,QAAQna,EAAK,MAAOA,EAAK,IAAI,CAGrC,CACF,EACA,KAAK,cAAiB,GAAU,CAC9B,GAAI,CAAC,KAAK,IACR,OAEF,IAAM+b,EAAQ,gBAAI,MAAM,GAAGiS,EAAM,QAAQ,KAAKA,EAAM,SAAS,GAAGA,EAAM,OAAO,EAAE,EAC/E,KAAK,IAAI,OAAO,aAAe,GAC/B,KAAK,IAAI,OAAO,KAAK,aAAa,KAAK,GAAG,iCAAiC,EAC3E,KAAK,IAAI,QAAQqC,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,MAAO,GACP,MAAO,gBACP,OACF,CAAC,CACH,EACA,IAAMxH,EAASswC,EAAK,OACpB,KAAK,IAAMA,EACX,KAAK,GAAKnpD,EACV,KAAK,UAAY,CAAC,CAAC6Y,EAAO,aAC1B,KAAK,mBAAqB6/D,EAC1B,KAAK,QAAUC,EACf,IAAMC,GAAkB,EAAI,IAAS,CACnC,IAAe,CAAC,EAChB,EAAK,KAAO,KAAK,MAAQ,IAAK,GAC1BC,IAAOnkD,EAAO,QAChB,EAAOrwB,EACP,EAAK,OAAS,KAAK,GACnB,EAAK,KAAO,KAAK,KACjB,KAAK,MAAQA,EAAK,OAEpB,KAAK,IAAI,QAAQw0E,EAAIx0E,CAAI,CAC3B,EACA,KAAK,SAAW,IAAIizC,GACpB,KAAK,SAAS,GAAG5iB,EAAO,eAAgBkkD,CAAc,EACtD,KAAK,SAAS,GAAGlkD,EAAO,MAAOkkD,CAAc,EAC7C,IAAME,EAAoB1jE,GAA2ByD,EAAO,wBAAwB,EACpF,GAAI,KAAK,WAAa,OAAO,OAAW,IAAa,CACnD,IAAM9M,EAAU,KAAK,IAAI,OAEzB,GADwB8M,EAAO,YAAcwa,GAAa,EACrC,CACnB,GAAI,CACExa,EAAO,YACT9M,EAAQ,IAAI,sBAAsB8M,EAAO,WAAW,QAAQ7Y,EAAG,EAAE,EACjE,KAAK,cAAgB4zB,GAAW/a,EAAO,UAAU,IAEjD9M,EAAQ,IAAI,6BAA6B/L,EAAG,EAAE,EAC9C,KAAK,cAAgBszB,GAAa,GAEpC,GAAM,CACJ,UACE,KAAK,cACTS,EAAO,iBAAiB,UAAW,KAAK,eAAe,EACvDA,EAAO,iBAAiB,QAAS,KAAK,aAAa,EACnDA,EAAO,YAAY,CACjB,WAAY,KAAK,WACjB,IAAK,OACL,cAAe+kD,EACf,KACA,OAAQn9D,EAAU9C,CAAM,CAC1B,CAAC,CACH,OAAS0uB,EAAK,CACZx7B,EAAQ,KAAK,qBAAqB/L,EAAG,kCAAmCunC,CAAG,EAC3E,KAAK,gBAAgB,EACrB,KAAK,MAAQ,KACb,KAAK,WAAa,IAAI6R,GAAW,KAAK,SAAU0/B,EAAmBjgE,EAAQ,GAAI7Y,EAAImpD,EAAK,MAAM,CAChG,CACA,MACF,CACF,CACA,KAAK,WAAa,IAAI/P,GAAW,KAAK,SAAU0/B,EAAmBjgE,EAAQ,GAAI7Y,EAAImpD,EAAK,MAAM,CAChG,CACA,OAAQ,CAGN,GAFA,KAAK,KAAO,KACZ,KAAK,KAAO,KACR,KAAK,cAAe,CACtB,IAAM4vB,EAAa,KAAK,WACxB,KAAK,WAAa,KAClB,IAAMlgE,EAAS,KAAK,IAAI,OAClBigE,EAAoB1jE,GAA2ByD,EAAO,wBAAwB,EACpF,KAAK,cAAc,OAAO,YAAY,CACpC,WAAY,KAAK,WACjB,IAAK,QACL,QAASkgE,EACT,cAAeD,EACf,GAAI,KAAK,GACT,OAAQn9D,EAAU9C,CAAM,CAC1B,CAAC,CACH,CACF,CACA,iBAAkB,CAChB,GAAI,KAAK,cAAe,CACtB,GAAM,CACJ,UACE,KAAK,cACT,KAAK,cAAgB,KACrBkb,EAAO,oBAAoB,UAAW,KAAK,eAAe,EAC1DA,EAAO,oBAAoB,QAAS,KAAK,aAAa,EACtDD,GAAsB,KAAK,IAAI,OAAO,UAAU,CAClD,CACF,CACA,SAAU,CACR,GAAI,KAAK,cACP,KAAK,gBAAgB,EACrB,KAAK,gBAAkB,KAAK,cAAgB,SACvC,CACL,IAAM0qC,EAAa,KAAK,WACpBA,IACFA,EAAW,QAAQ,EACnB,KAAK,WAAa,KAEtB,CACA,IAAM/pC,EAAW,KAAK,SAClBA,GACFA,EAAS,mBAAmB,EAE9B,KAAK,KAAO,KACZ,KAAK,KAAO,KACZ,KAAK,SAAW,KAChB,KAAK,IAAM,IACb,CACA,KAAK,EAAM,EAAiB,EAAY,EAAY,EAAM,EAAM,EAAU,EAAoB,EAAW,EAAgB,CAEvH,EAAU,YAAY,MAAQ,KAAK,YAAY,IAAI,EACnD,GAAM,CACJ,aACA,cACE,KACE/kB,EAAa4S,EAAOA,EAAK,MAAQze,EAAK,MACtC2G,EAAc3G,EAAK,YACnBm1E,EAAW,KAAK,KAChBvB,EAAgB,EAAEuB,GAAYn1E,EAAK,KAAOm1E,EAAS,IACnDtB,EAAc,EAAEsB,GAAYna,EAAU,QAAUma,EAAS,OACzDC,EAASD,EAAWna,EAAU,GAAKma,EAAS,GAAK,GACjDE,EAAW,KAAK,KAAOra,EAAU,KAAO,KAAK,KAAK,MAAQ,GAC1Dsa,EAAcF,IAAW,GAAKpa,EAAU,GAAK,GAAKA,EAAU,KAAQma,GAAqC,MAAM,WAC/GxX,EAAa,CAACkW,IAAgBuB,IAAW,GAAKA,IAAW,IAAMC,IAAa,GAAKC,GAAeD,GAAY,IAC5G9vB,EAAO,KAAK,YAAY,IAAI,GAC9BsuB,GAAeuB,GAAUp1E,EAAK,MAAM,QAAQ,QAAU,KACxD,EAAK,MAAM,QAAQ,MAAQulD,GAEzB9mC,IAAS42D,GAAY,CAAC1X,KACxB,EAAK,MAAM,QAAQ,MAAQpY,GAE7B,IAAMuuB,EAAoB,EAAEqB,GAAkCn1E,EAAK,aAAkD,MAAmCm1E,EAAS,aAAsD,KACjNhc,EAAQ,IAAIzjB,GAAck+B,EAAejW,EAAYkQ,EAAoBgG,EAAahoE,EAAYioE,CAAiB,EACzH,GAAI,CAACnW,GAAciW,GAAiBE,EAAmB,CACrD,KAAK,IAAI,OAAO,IAAI,6DAA6D9zE,EAAK,KAAK,OAAOg7D,EAAU,KAAKA,EAAU,KAAO,GAAK,UAAYA,EAAU,KAAO,GAAG,GAAG,KAAK,KAAOvrB,EAAkB,KAAO,QAAU,QAAQ,IAAIurB,EAAU,MAAM,OAAOA,EAAU,GAAG;yBACtP4Y,EAAc;uBAChBC,EAAY;sBACblW,EAAW;8BACHkQ,EAAmB;sBAC3BhiE,EAAW;6BACJioE,GAAmB,EAC1C,IAAM9+D,EAAS,IAAIygC,GAAe9gC,EAAYjF,EAAYqkE,EAAiBj4D,EAAUs2D,CAAc,EACnG,KAAK,oBAAoBp9D,CAAM,CACjC,CAGA,GAFA,KAAK,KAAOhV,EACZ,KAAK,KAAOye,EACR,KAAK,cACP,KAAK,cAAc,OAAO,YAAY,CACpC,aACA,IAAK,QACL,OACA,cACA,YACA,OACF,EAAGje,aAAgB,YAAc,CAACA,CAAI,EAAI,CAAC,CAAC,OACvC,GAAIm6D,EAAY,CACrB,IAAM4a,EAAiB5a,EAAW,KAAKn6D,EAAMmG,EAAaq0D,EAAW7B,CAAK,EACtE7+B,GAAUi7C,CAAc,EAC1BA,EAAe,KAAM,GAAU,CAC7B,KAAK,uBAAuBprE,CAAK,CACnC,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,KAAK,gBAAgBoS,EAAOy+C,EAAW,iCAAiC,CAC1E,CAAC,EAED,KAAK,uBAAuBua,CAAc,CAE9C,CACF,CACA,MAAM,EAAW,CACf,EAAU,YAAY,MAAQ,KAAK,YAAY,IAAI,EACnD,GAAM,CACJ,aACA,cACE,KACJ,GAAI,KAAK,cACP,KAAK,cAAc,OAAO,YAAY,CACpC,aACA,IAAK,QACL,WACF,CAAC,OACI,GAAI5a,EAAY,CACrB,IAAM4a,EAAiB5a,EAAW,MAAMK,CAAS,EAC7C1gC,GAAUi7C,CAAc,EAC1BA,EAAe,KAAM,GAAS,CAC5B,KAAK,kBAAkB/0E,EAAMw6D,CAAS,CACxC,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,KAAK,gBAAgBz+C,EAAOy+C,EAAW,kCAAkC,CAC3E,CAAC,EAED,KAAK,kBAAkBua,EAAgBva,CAAS,CAEpD,CACF,CACA,gBAAgB,EAAO,EAAW,EAAQ,CACnC,KAAK,MAGV,KAAK,MAAQz+C,EACb,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,YACA,KAAM,KAAK,MAAQ,IAAK,GACxB,KAAM,KAAK,MAAQ,IAAK,GACxB,MAAO,GACP,QACA,IAAKD,EACL,QACF,CAAC,EACH,CACA,kBAAkB,EAAS,EAAW,CACpClb,EAAQ,QAAS,GAAW,CAC1B,KAAK,uBAAuBL,CAAM,CACpC,CAAC,EACD,KAAK,QAAQg6D,CAAS,CACxB,CACA,oBAAoB,EAAQ,CAC1B,GAAM,CACJ,aACA,cACE,KACA,KAAK,cACP,KAAK,cAAc,OAAO,YAAY,CACpC,aACA,IAAK,YACL,QACF,CAAC,EACQL,GACTA,EAAW,UAAU3lD,CAAM,CAE/B,CACA,uBAAuB,EAAQ,CAC7B,EAAO,UAAU,YAAY,IAAM,KAAK,YAAY,IAAI,EACxD,KAAK,mBAAmBhU,CAAM,CAChC,CACF,EACM,GAAkB,IAClB,GAAN,cAAoCuyC,EAAqB,CACvD,YAAY,EAAK,EAAiB,EAAW,CAC3C,MAAM54B,EAAK60B,EAAiBiqB,EAAW,0BAA2BhqB,EAAkB,KAAK,EACzF,KAAK,WAAa,KAClB,KAAK,gBAAkB,KACvB,KAAK,UAAY,GACjB,KAAK,cAAgB,KACrB,KAAK,eAAiB,KACtB,KAAK,QAAU,GACf,KAAK,YAAc,KACnB,KAAK,YAAc,KACnB,KAAK,SAAW,GAChB,KAAK,cAAgB,GACrB,KAAK,sBAAwB,KAC7B,KAAK,kBAAkB,CACzB,CACA,qBAAsB,CACpB,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,EAC1B,KAAK,UAAU,CACjB,CACA,WAAY,CACV,KAAK,YAAc,KAAK,WAAa,KAAK,gBAAkB,KAAK,cAAgB,KAAK,eAAiB,KAAK,YAAc,KAAK,sBAAwB,IACzJ,CACA,mBAAoB,CAClB,MAAM,kBAAkB,EACxB,GAAM,CACJ,OACE,KACJ90B,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,qBAAsB,KAAK,qBAAsB,IAAI,EACnElW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,mBAAoB,KAAK,mBAAoB,IAAI,EAC/DlW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,eAAgB,IAAI,EACvDlW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,CACxD,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACClW,IAGL,MAAM,oBAAoB,EAC1BA,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,qBAAsB,KAAK,qBAAsB,IAAI,EACpElW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,mBAAoB,KAAK,mBAAoB,IAAI,EAChElW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,eAAgB,IAAI,EACxDlW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACzD,CACA,eAAe,EAAO,CACpB,OACA,KACA,UACA,YACA,WACC,CACD,GAAI10B,IAAOszC,EAAkB,KAAM,CACjC,IAAMvzB,EAAKlc,EAAK,GACVw1E,EAAe,KAAK,YAQ1B,GAPA,KAAK,QAAQt5D,GAAM,CACjB,SAAUwd,EACV,YACA,SACF,EACA,KAAK,IAAI,mBAAmBxd,EAAG,oBAAoBwd,EAAU53B,EAAU,IAAI43B,EAAQ,GAAG53B,EAAU,aAAae,GAAS,EACtH,KAAK,WAAa7C,EACd,KAAK,QAAUsvC,EAAM,iBAAkB,CACzC,IAAMmmC,EAAc,KAAK,aACrB,CAACA,GAAe,CAAC,KAAK,cAAgBA,GAAeA,EAAY,KAAK,KAAOv5D,IAC/E,KAAK,eAAelc,EAAMy1E,GAA2C,IAAI,CAE7E,KAAW,CAAC,KAAK,IAAI,kBAAoBD,GAAgBA,EAAa,KAAOt5D,GAC3Es5D,EAAa,cAAc,EAC3B,KAAK,eAAex1E,EAAMw1E,CAAY,GAC7B,KAAK,QAAUlmC,EAAM,MAC9B,KAAK,KAAK,CAEd,CACF,CACA,iBAAkB,CAIhB,MAHI,CAAC,KAAK,oBAAsB,KAAK,kBAAoB,EAChD,KAAK,iBAEP,MAAM,gBAAgB,CAC/B,CACA,eAAe,EAAY,EAAiB,CAE1C,IAAMomC,EAA4C,KAAK,iBAA0D,MAAS,KAC1H,GAAIC,GACGD,GAAmD,KAAQC,EAAgB,GAC9E,OAGJ,IAAMC,GAAuBF,GAAmBG,EAAA,CAAY,GAGtDC,EAAW75D,GAFI,KAAK,gBAEoB,EAAG25D,EADrC,KAAK,gBACuD,CAAC,EACrEE,IACF,KAAK,IAAI,6BAA6BA,EAAS,MAAM,MAAMA,EAAS,IAAI,EACxE,KAAK,mBAAqB,GAC1B,KAAK,iBAAmBA,EAAS,MACjC,KAAK,kBAAkB,EACnB,KAAK,QAAUxmC,EAAM,MACvB,KAAK,WAAW,EAGtB,CACA,UAAU,EAAe,EAAyB,CAChD,GAAI,CAAC,KAAK,OAAQ,CAChB,KAAK,cAAgBoqB,EACrB,KAAK,MAAQpqB,EAAM,QACnB,MACF,CACA,IAAMymC,EAAkB,KAAK,gBAC7B,KAAK,SAAS,EACd,KAAK,YAAYlgC,EAAe,EAC5BkgC,EAAkB,GAAKrc,IAAkB,IAC3C,KAAK,IAAI,gDAAgDqc,EAAgB,QAAQ,CAAC,GAAG,EACrF,EAAgBA,EAChB,KAAK,MAAQzmC,EAAM,MAEnB,KAAK,MAAQA,EAAM,cAErB,KAAK,iBAAmB,KAAK,gBAAkBoqB,EAAgB,KAAK,eACpE,KAAK,cAAgBsc,EAA0B,GAAKtc,EACpD,KAAK,KAAK,CACZ,CACA,QAAS,CACP,OAAQ,KAAK,MAAb,CACE,KAAKpqB,EAAM,KACT,KAAK,WAAW,EAChB,MACF,KAAKA,EAAM,cAAe,CACxB,GAAM,CACJ,SACA,WACE,KACE2mC,EAAc39D,IAAiCzV,GAC/C2S,EAAUygE,GAA2C,QAC3D,GAAIzgE,GAAW,CAAC,KAAK,YAAYygE,CAAW,EAAG,CAC7C,GAAI,KAAK,iBAAiBzgE,CAAO,EAC/B,MAEF,KAAK,MAAQ85B,EAAM,gBACrB,CACA,KACF,CACA,KAAKA,EAAM,2BACT,KAAK,eAAe,EACpB,MAEF,KAAKA,EAAM,iBAAkB,CAC3B,IAAMmmC,EAAc,KAAK,YACzB,GAAIA,EAAa,CACf,GAAM,CACJ,OACA,OACA,QACA,YACEA,EACEI,EAAa,KAAK,WACxB,GAAI,KAAK,QAAQ71E,EAAK,MAAQ,IAAK,GAAG,CACpC,KAAK,YAAc,KACnB,KAAK,MAAQsvC,EAAM,aAEnB,IAAM9uC,EAAO,CACX,OACA,OACA,QAJcmT,EAAM,MAAM,CAAC,CAAC,OAK5B,eAAgB,IAClB,EACA,KAAK,4BAA4BnT,CAAI,EACjCq6D,GACF,MAAM,4BAA4Br6D,CAAI,CAE1C,MAAWq1E,GAAcA,EAAW,KAAOJ,EAAY,KAAK,IAC1D,KAAK,eAAeI,EAAYJ,EAAY,IAAI,CAEpD,KACE,MAAK,MAAQnmC,EAAM,IAEvB,CACF,CACA,KAAK,UAAU,CACjB,CACA,mBAAoB,CAClB,IAAMmmC,EAAc,KAAK,YACrBA,IACF,KAAK,gBAAgB,eAAeA,EAAY,IAAI,EACpD,KAAK,YAAc,MAErB,MAAM,kBAAkB,CAC1B,CACA,WAAY,CACV,GAAM,CACJ,SACE,KACEj6C,GAAS,MAAQA,EAAM,aAG7B,KAAK,gBAAkBA,EAAM,YAC/B,CACA,YAAa,CAEX,GAAM,CACJ,MACA,SACA,QACA,WACE,KACExmB,EAAS2F,EAAI,OACnB,GAAI,CAAC,KAAK,WAAa,CAAC6gB,GAAS,CAAC,KAAK,kBAAoB,KAAK,oBAAsB,CAACxmB,EAAO,oBAAsB,EAAEsD,GAAU,MAAQA,EAAOzV,IAC7I,OAEF,IAAMonD,EAAY3xC,EAAOzV,GACnBqzE,EAAejsB,EAAU,QAC/B,GAAI,CAACisB,GAAgB,KAAK,YAAYjsB,CAAS,GAAK,KAAK,iBAAiBisB,CAAY,EAAG,CACvF,KAAK,MAAQ5mC,EAAM,cACnB,KAAK,mBAAqB,GAC1B,MACF,CACA,IAAM8sB,EAAa,KAAK,YAAc,KAAK,YAAc,KAAK,MAC1D,KAAK,eAAiBA,IACxB,KAAK,cAAgB,GACrB,KAAK,mBAAmBA,EAAYn5D,EAAsB,MAAOwsC,EAAkB,KAAK,GAE1F,IAAMuW,EAAa,KAAK,iBAAiBoW,EAAY3sB,EAAkB,KAAK,EAC5E,GAAIuW,IAAe,KACjB,OAEF,GAAI,CAAC,KAAK,gBAAkB,KAAK,aAAaA,EAAYkwB,CAAY,EAAG,CACvEv7D,EAAI,QAAQkW,EAAO,WAAY,CAC7B,KAAM,OACR,CAAC,EACD,KAAK,MAAQye,EAAM,MACnB,MACF,CACA,IAAMglB,EAAYtO,EAAW,IACvBuW,EAAY5hD,EAAI,gBAChBG,EAAYo7D,EAAa,UACzB/2D,EAAQrE,EAAU,EAAE,CAAC,MACrBq7D,EAAe,KAAK,gBAAgB,EACpClc,EAAmB,KAAK,SAAWkc,EAAenwB,EAAW,IACnE,GAAI,KAAK,gBAAkBxqB,EAAO,CAChC,IAAMnf,EAAM85D,EACRD,EAAa,UAAY75D,EAAM8C,IAC7B6mC,EAAW,IAAM7mC,GAAS6mC,EAAW,aACvC,KAAK,IAAI,uEAAuE,EAChF,EAAM,YAAc7mC,EAAQ,IAGlC,CACA,GAAIm1C,GAAaiI,GAAa,CAAC,KAAK,gBAAkBtC,EAAmBn/C,EAAUA,EAAU,OAAS,EAAE,CAAC,MACvG,OAEF,IAAI9a,EAAO,KAAK,gBAAgBi6D,EAAkBic,CAAY,EAI9D,GAHIl2E,GAAQ,KAAK,cAAcA,EAAMi6D,CAAgB,IACnD,EAAO,KAAK,2BAA2Bj6D,EAAMk2E,EAAclwB,EAAYvW,EAAkB,KAAM8sB,CAAS,GAEtG,CAACv8D,EAAM,CACT,KAAK,cAAgB,GACrB,MACF,CACA,IAAI01E,EAA6C,KAAK,iBAA2D,MAAS,KAC1H,GAAI,CAAC,KAAK,WAAa,KAAK,oBAAsBA,GAAmB31E,EAAgBC,CAAI,GAAK,CAACA,EAAK,UAAY,CAACk2E,EAAa,MAAQ,CAAC,KAAK,cAAgBjc,EAAmB,KAAK,IAAI,oBAClL,KAAK,gBAAgB,SAASyb,CAAe,IAAM9jC,EAAc,KACnE,KAAK,gBAAkB,EAAkB,MAEvC8jC,GAAmB31E,EAAgB21E,CAAe,GAAG,CACvD,GAAI11E,EAAK,MAAQ01E,EAAgB,IAAK,CACpC,IAAMU,EAAgB,KAAK,gBAAgB,aAAanc,EAAkBxqB,EAAkB,IAAI,EAC5F2mC,GAAiBA,EAAc,IAAMV,EAAgB,MACvD,EAAkBU,EAClB,KAAK,gBAAkB,CACrB,KAAMA,EACN,iBAAkB,IACpB,EAEJ,CAEA,GAD0Bp2E,EAAK,MAAQ01E,EAAgB,IAErD,MAEJ,CAEF,KAAK,aAAa11E,EAAMiqD,EAAWgQ,CAAgB,CACrD,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,cAAgB,KAAK,SAAW,GACrC,MAAM,iBAAiBzrC,EAAOhuB,CAAI,CACpC,CACA,qBAAqB,EAAO,CAC1B,eACC,CACD,KAAK,gBAAgB,EACrB,KAAK,OAAS61E,EAAY,IAAK,GAAkB,IAAI7kC,GAAM8kC,CAAa,CAAC,CAC3E,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAMC,EAAW,CAAC,CAAC/1E,EAAK,IACxB,KAAK,QAAUA,EAAK,GACpB,GAAM,CACJ,eACE,KACAwrB,IACFA,EAAY,cAAc,EAC1B,KAAK,sBAAsBA,EAAY,KAAK,GAE9C,KAAK,kBAAkB,EACnBuqD,GACF,KAAK,eAAiB/1E,EACtB,KAAK,mBAAmBA,CAAI,EACxB,KAAK,QAAU8uC,EAAM,UACvB,KAAK,YAAYuG,EAAe,EAChC,KAAK,MAAQvG,EAAM,KACnB,KAAK,KAAK,KAGZ,KAAK,gBAAgB,EACrB,KAAK,eAAiB,KACtB,KAAK,cAAgB9uC,EACrB,KAAK,cAAc,EAEvB,CACA,mBAAoB,CAClB,MAAM,kBAAkB,EACxB,KAAK,cAAgB,KAAK,SAAW,KAAK,UAAY,GACtD,KAAK,UAAU,EACf,KAAK,QAAU,EACjB,CACA,cAAc,EAAO,EAAM,CACzB,KAAK,YAAcA,EAAK,QACxB,IAAMg2E,EAAwB,KAAK,sBAC/BA,IACF,KAAK,sBAAwB,KAC7B,KAAK,mBAAmB3lD,EAAO,mBAAoB2lD,CAAqB,EAE5E,CACA,mBAAmB,EAAO,EAAM,CAC9B,IAAIC,EACJ,GAAM,CACJ,UACE,KACE,CACJ,QAASztD,EACT,GAAInmB,EACJ,UACA,SACErC,EACJ,GAAI,CAAC8X,EAAQ,CACX,KAAK,KAAK,0CAA0CzV,EAAQ,IAAIS,EAAM,KAAK,QAAQ+O,EAAQ,EAAE,EAC7F,MACF,CACA,IAAMqkE,EAAc,KAAK,YACzB,GAAI,CAACA,GAAe1tD,EAAW,MAAQ0tD,EAAY,OAASA,EAAY,QAAS,CAC/E,KAAK,sBAAwBl2E,EACzB,KAAK,QAAU8uC,EAAM,UACvB,KAAK,MAAQA,EAAM,eAErB,MACF,CACA,KAAK,sBAAwB,KAC7B,KAAK,IAAI,eAAezsC,EAAQ,IAAIS,EAAM,KAAK,QAAQ+O,EAAQ,YAAY2W,EAAW,QAAQ,GAAGA,EAAW,MAAM,GAAGA,EAAW,WAAa,SAASA,EAAW,WAAW,GAAGA,EAAW,cAAc,GAAK,GAAG,YAAYA,EAAW,eAAe,EACtP,IAAM2tD,EAAar+D,EAAOzV,GACtB4oB,EAAU,EACd,GAAIzC,EAAW,OAAS,EAAsB2tD,EAAW,UAAY,MAAQF,EAAoB,KAAM,CAErG,GADA,KAAK,gBAAgBztD,CAAU,EAC3BA,EAAW,kBACb,OAEE2tD,EAAW,UAEb,EAAU,KAAK,eAAe3tD,EAAY2tD,EAAW,QAAkC,KAAK,iBAA0D,OAAO,GAE1J3tD,EAAW,iBACd8D,GAAqB9D,EAAY0tD,CAAW,EACvC1tD,EAAW,gBACd+D,GAAwB/D,EAAY0tD,CAAW,EAEjD,EAAU1tD,EAAW,cAEzB,CACA,EAAW,QAAUA,EACrB,KAAK,gBAAkB2tD,EAClB,KAAK,oBACR,KAAK,iBAAiBD,EAAajrD,CAAO,EAE5C,KAAK,IAAI,QAAQoF,EAAO,oBAAqB,CAC3C,QAAS7H,EACT,GAAInmB,EACJ,QAASrC,EAAK,OAChB,CAAC,EACG,KAAK,QAAU8uC,EAAM,eAAiB,CAAC,KAAK,iBAAiBtmB,CAAU,IACzE,KAAK,MAAQsmB,EAAM,MAErB,KAAK,KAAK,CACZ,CACA,4BAA4B,EAAM,CAEhC,IAAMtvC,EAAOQ,EAAK,KACZ,CACJ,OACA,WACEA,EACE,CACJ,SACA,UACA,UACE,KACJ,GAAI,CAAC8X,EAAQ,CACX,KAAK,KAAK,yEAAyEtY,EAAK,GAAG,YAAYA,EAAK,MAAM,sBAAsB,EACxI,MACF,CACA,IAAMsD,EAAQgV,EAAOzV,GACrB,GAAI,CAACS,EAAO,CACV,KAAK,KAAK,oDAAoD,EAC9D,MACF,CACA,IAAMkS,EAAUlS,EAAM,QACtB,GAAI,CAACkS,EAAS,CACZ,KAAK,KAAK,yDAAyD,EACnE,KAAK,sBAAsBxV,EAAK,KAAK,EACrC,MACF,CACA,IAAM2U,EAAaK,EAAO,mBAAqB1R,EAAM,YAAc,YAC/Dq3D,EAAa,KAAK,WACtB,AACEA,IAAa,KAAK,WAAa,IAAI/kB,GAAoB,KAAK,IAAKnG,EAAkB,MAAO,KAAK,wBAAwB,KAAK,IAAI,EAAG,KAAK,uBAAuB,KAAK,IAAI,CAAC,EAE3K,IAAM/V,EAAU,KAAK,QAAQ15B,EAAK,IAC5B+zE,EAAuC/zE,EAAK,aAAkD,KACpG,GAAI05B,IAAY,IAAK,GAAG,CACtB,IACMvN,EAAY1N,EAAOA,EAAK,MAAQ,GAChCgvC,EAAUthC,IAAc,GACxB6uC,EAAY,IAAI1oB,GAActyC,EAAK,MAAOA,EAAK,GAAIA,EAAK,MAAM,WAAYmO,EAAQ,WAAYge,EAAWshC,CAAO,EACtHkN,EAAW,KAAKxsD,EAAS4lE,EAAiBp/D,EAAY,GAAI3U,EAAMye,EAAMjJ,EAAQ,cAAe,GAAoBwlD,EAAWthC,CAAO,CACrI,KAAO,CACL,KAAK,IAAI,4BAA4B15B,EAAK,GAAG,qDAAqDA,EAAK,GAAG,OAAOwV,EAAQ,QAAQ,IAAIA,EAAQ,MAAM,UAAU3S,GAAS,EACtK,GAAM,CACJ,SACE,KAAK,YAAc,KAAK,aAAe,CACzC,OACA,OACA,MAAO,IAAI2wC,GACX,SAAU,EACZ,EACA7/B,EAAM,KAAK,IAAI,WAAWxF,CAAO,CAAC,EAC9B,KAAK,QAAUmhC,EAAM,UACvB,KAAK,MAAQA,EAAM,iBAEvB,CACF,CACA,4BAA4B,EAAgB,CACtC,KAAK,YACP,KAAK,YAAY,SAAW,GAG9B,MAAM,4BAA4BisB,CAAc,CAClD,CACA,eAAgB,CACd,KAAK,YAAc,IACrB,CACA,gBAAgB,EAAO,EAAM,CAC3B,KAAK,cAAgB,KAAK,SAAW,GACrC,IAAM/mD,EAAahU,EAAK,OAAO,MAC3BgU,IACF,KAAK,YAAcA,EAAW,QAAU,KAE5C,CACA,cAAc,EAAO,EAAM,CACrB,CAAC,KAAK,WAAahU,EAAK,KAAK,OAASivC,EAAkB,MAAQ1vC,EAAgBS,EAAK,IAAI,IAC3F,KAAK,gBAAkBA,EACnB,KAAK,QAAU8uC,EAAM,MACvB,KAAK,KAAK,EAGhB,CACA,eAAe,EAAO,EAAM,CAC1B,GAAM,CACJ,OACA,QACE9uC,EACJ,GAAIR,EAAK,OAASyvC,EAAkB,MAC9B,CAAC,KAAK,WAAazvC,EAAK,OAASyvC,EAAkB,MAAQ,CAACzvC,EAAK,kBAAkB,OAAS,CAACA,EAAK,kBAAkB,aACtH,KAAK,UAAY,GACjB,KAAK,gBAAkB,WAI3B,GAAI,KAAK,mBAAmBA,CAAI,EAC9B,KAAK,KAAK,YAAYA,EAAK,KAAKye,EAAO,OAASA,EAAK,MAAQ,GAAG,YAAYze,EAAK,MAAM,+CAA+C,KAAK,MAAM,iBAAiB,KAAK,eAAiB,KAAK,eAAe,KAAO,SAAS,MAG9N,IAAID,EAAgBC,CAAI,EAAG,CACzB,KAAK,aAAeA,EACpB,IAAMsD,EAAQ,KAAK,eACfA,IACF,KAAK,cAAgBA,EACrB,KAAK,eAAiB,KACtB,KAAK,IAAI,QAAQutB,EAAO,qBAAsBl1B,EAAe,CAAC,EAAG2H,CAAK,CAAC,EAE3E,CACA,KAAK,qBAAqBtD,EAAMye,CAAI,EAChC,KAAK,OACP,KAAK,KAAK,CAHZ,CAKF,CACA,QAAQ,EAAO,EAAM,CAEnB,GAAIje,EAAK,MACP,KAAK,MAAQ8uC,EAAM,WAGrB,OAAQ9uC,EAAK,QAAb,CACE,KAAKgc,EAAa,SAClB,KAAKA,EAAa,mBAClB,KAAKA,EAAa,mBAClB,KAAKA,EAAa,gBAClB,KAAKA,EAAa,kBAClB,KAAKA,EAAa,eAClB,KAAKA,EAAa,iBAChB,KAAK,yBAAyBizB,EAAkB,MAAOjvC,CAAI,EAC3D,MACF,KAAKgc,EAAa,uBAClB,KAAKA,EAAa,yBAClB,KAAKA,EAAa,oBACZ,CAAChc,EAAK,YAAc,KAAK,QAAU8uC,EAAM,eAAmC9uC,EAAK,SAA0C,OAAUiwC,EAAoB,cAC3J,KAAK,MAAQnB,EAAM,MAErB,MACF,KAAK9yB,EAAa,uBAClB,KAAKA,EAAa,oBAChB,GAAIhc,EAAK,SAAW,QAClB,OAEG,KAAK,2BAA2BA,CAAI,GACvC,KAAK,kBAAkB,EAEzB,MACF,KAAKgc,EAAa,kBAChB,GAAIhc,EAAK,SAAW,QAClB,OAEE,KAAK,2BAA2BA,CAAI,IACtC,KAAK,cAAgB,KACrB,MAAM,gBAAgB,EAAG,IAA0B,OAAO,GAE5D,MACF,KAAKgc,EAAa,mBAChB,KAAK,mBAAmBhc,CAAI,CAEhC,CACF,CACA,iBAAiB,EAAO,CACtB,QACC,CACGtE,IAAS+G,EAAsB,QACjC,KAAK,SAAW,GAEpB,CACA,gBAAgB,EAAO,CACrB,QACC,CACD,GAAI/G,IAAS+G,EAAsB,MAAO,CACxC,KAAK,SAAW,GAChB,KAAK,cAAgB,GACjB,KAAK,QAAUqsC,EAAM,QACvB,KAAK,MAAQA,EAAM,MAErB,IAAM2pB,EAAc,KAAK,aAAe,KAAK,MACzCA,IACF,KAAK,mBAAmBA,EAAa/8D,EAAMuzC,EAAkB,KAAK,EAClE,KAAK,KAAK,EAEd,CACF,CACA,wBAAwB,EAAgB,CACtC,IAAImnC,EACJ,IAAMz6E,EAAK,QACL,CACJ,OACE,KACE,CACJ,cACA,aACEo5E,EACE54E,EAAU,KAAK,kBAAkBq+D,CAAS,EAChD,GAAI,CAACr+D,EAAS,CACZ,KAAK,wBAAwBq+D,CAAS,EACtC,MACF,CACA,GAAM,CACJ,OACA,OACA,SACEr+D,EACE,CACJ,WACE8I,EACE,CACJ,QACA,OACA,MACA,eACE+uE,EACJ,GAAI,KAAK,mBAAmBx0E,CAAI,GAAK,CAACwV,EACpC,KAAK,gBAAgB,eAAexV,CAAI,MAG1C,CAIA,GAJA,KAAK,MAAQsvC,EAAM,QACf,KAAK,gBAAkBp6B,GACzB,KAAK,oBAAoB,KAAK,cAAc,EAE1CxS,GAAe,MAAQA,EAAY,OAAQ,CAC7C,IAAMm0E,EAAc72E,EAAK,aAAeA,EACxC,GAAI,KAAK,yBAAyB0C,EAAa1C,CAAI,EACjD,OAEF,KAAK,mBAAmByF,EAAO/C,EAAY,OAAQm0E,EAAa7b,CAAS,EACzErgD,EAAI,QAAQkW,EAAO,0BAA2B,CAC5C,KAAMgmD,EACN,KACA,OAAQn0E,EAAY,MACtB,CAAC,CACH,CACA,GAAIwS,EAAO,CACT,GAAM,CACJ,WACA,SACA,WACA,UACEA,EACAuJ,IACF,EAAK,kBAAkBxb,EAAsB,OAAS,CACpD,WACA,SACA,WACA,QACF,GAEFjD,EAAK,wBAAwBiD,EAAsB,MAAOklB,EAAUD,EAAQE,EAAUM,CAAM,EAC5F,KAAK,mBAAmBxT,EAAOlV,EAAMye,EAAMu8C,CAAS,CACtD,CACA,GAAIsS,GAAO,OAAS,EAAeA,EAAI,UAAY,MAAQsJ,EAAa,OAAQ,CAC9E,IAAME,EAAaz7E,EAAS,CAC1B,KACA,OACA,SACF,EAAGiyE,CAAG,EACN3yD,EAAI,QAAQkW,EAAO,sBAAuBimD,CAAU,CACtD,CACA,GAAI/iD,EAAM,CACR,IAAMgjD,EAAc17E,EAAS,CAC3B,KACA,OACA,SACF,EAAG04B,CAAI,EACPpZ,EAAI,QAAQkW,EAAO,sBAAuBkmD,CAAW,CACvD,CAjDmB,CAkDrB,CACA,mBAAmB,EAAc,EAAQ,EAAM,EAAW,CAUxD,GATI,KAAK,QAAUznC,EAAM,UAGrB7nC,EAAO,OACT,OAAOA,EAAO,MAEZA,EAAO,YACT,OAAOA,EAAO,WAEZ,CAACA,EAAO,OACV,OAEF,IAAMnE,EAAQmE,EAAO,MACrB,EAAM,GAAKgoC,EAAkB,MAC7B,IAAMunC,EAAqBh9D,EAAa,WACxC,KAAK,IAAI,gCAAgC1W,EAAM,UAAU,0BAA0B0zE,EAAmB,GAAG1zE,EAAM,MAAM,EAAE,EACnH0zE,GAAsBA,EAAmB,MAAM,GAAG,CAAC,CAAC,SAAW,IACjE,EAAM,WAAaA,GAErB,KAAK,IAAI,QAAQnmD,EAAO,cAAeppB,CAAM,EAC7C,IAAM/E,EAAcY,EAAM,YAC1B,GAAIZ,GAAe,MAAQA,EAAY,WAAY,CACjD,IAAMuc,EAAU,CACd,KAAM,QACN,OACA,KAAM,KACN,YACA,OAAQjf,EAAK,KACb,KAAM0C,CACR,EACA,KAAK,IAAI,QAAQmuB,EAAO,iBAAkB5R,CAAO,CACnD,CACA,KAAK,cAAc,CACrB,CACA,aAAa,EAAM,EAAO,EAAkB,CAC1C,IAAMi/C,EAAY,KAAK,gBAAgB,SAASl+D,CAAI,EACpD,GAAI,KAAK,gBAAkBk+D,IAActsB,EAAc,YAAcssB,IAActsB,EAAc,QAAS,CACxG,IAAIqlC,EACJ,GAAI,CAACl3E,EAAgBC,CAAI,EACvB,KAAK,iBAAiBA,EAAMsD,CAAK,OAC5B,IAAK,EAAiBA,EAAM,UAAY,MAAQ2zE,EAAe,MAAQ,CAAC,KAAK,QAAQj3E,EAAK,IAAK,CACpG,KAAK,IAAI,+CAA+CA,EAAK,GAAG,gDAAgDA,EAAK,GAAG,YAAY,KAAK,SAAS,EAClJ,KAAK,MAAQsvC,EAAM,iBACnB,IAAMonC,EAAc,KAAK,YACrBA,GAAeA,EAAY,gBAAkBpzE,EAAM,QAAQ,eAC7DypB,GAAwBzpB,EAAM,QAASozE,CAAW,CAEtD,MACE,MAAM,aAAa12E,EAAMsD,EAAO22D,CAAgB,CAEpD,MACE,KAAK,qBAAqBj6D,CAAI,CAElC,CACA,mBAAmB,EAAgB,CACjC,GAAI,KAAK,OAAS,KAAK,cAAe,CACpC,GAAM,CACJ,OACA,OACA,YACA,kBACA,aACA,YACE,KAAK,cACJ+Y,GAAc,CACjB,OACA,OACA,YACA,kBACA,aACA,UACF,EAAGm+D,EAAgBp9D,EAAmB,IAChCW,GAAkBy8D,EAAe,IAAK,KAAK,GAAG,GAChD,KAAK,IAAI,4CAA4C,EACrD,MAAM,gBAAgB,EAAG,IAA0B,OAAO,EAC1D,KAAK,cAAgB,MAErB,KAAK,cAAgBA,EAG3B,CACF,CACA,oBAAoB,EAAgB,CAClC,GAAM,CACJ,OACE,KACJ,KAAK,mBAAmBA,CAAc,EACtC,KAAK,cAAgBA,EACrB,KAAK,eAAiB,KACtBv8D,EAAI,QAAQkW,EAAO,qBAAsBl1B,EAAe,CAAC,EAAGu7E,CAAc,CAAC,CAC7E,CACF,EACM,GAAN,cAAqCnmC,EAAO,CAC1C,YAAY,EAAK,EAAW,CAC1B,MAAMioB,EAAWr+C,EAAI,MAAM,EAC3B,KAAK,IAAM,IAAK,GAChB,KAAK,QAAU,GACf,KAAK,MAAQ,GACb,KAAK,IAAMA,CACb,CACA,SAAU,CACR,KAAK,WAAW,EAChB,KAAK,IAAM,KAAK,IAAM,KAAK,KAAO,IACpC,CACA,YAAa,CACP,KAAK,QAAU,KACjB,KAAK,aAAa,KAAK,KAAK,EAC5B,KAAK,MAAQ,GAEjB,CACA,WAAY,CACV,KAAK,QAAU,GACf,KAAK,aAAa,CACpB,CACA,UAAW,CACT,KAAK,QAAU,GACf,KAAK,WAAW,CAClB,CACA,aAAa,EAAa,EAAU,EAAS,CAC3C,IAAMw8D,EAAmBlzB,GAAqC,iBAC9D,GAAIkzB,EAAkB,CACpB,IAAIC,EAAa,GACjB,IAAK,IAAIv7E,EAAI,EAAGA,EAAIs7E,EAAiB,OAAQ,IAAK,CAChD,IAAM12D,EAAO02D,EAAiBt7E,GAC1Bse,EACJ,GAAI,CACF,EAAM,IAAI,KAAK,IAAIsG,EAAK,IAAKwjC,EAAS,GAAG,CAAC,CAAC,IAC7C,OAAS1nC,EAAO,CACd,KAAK,KAAK,qDAAqDA,GAAO,EACtE,EAAMkE,EAAK,KAAO,EACpB,CACA,GAAItG,IAAQk9D,EAAa,CACvB,EAAax7E,EACb,KACF,CAAWse,IAAQk9D,EAAY,UAAU,EAAGl9D,EAAI,MAAM,IACpD,EAAate,EAEjB,CACA,GAAIu7E,IAAe,GAAI,CACrB,IAAM32D,EAAO02D,EAAiBC,GACxBryB,EAAM,SAAStkC,EAAK,WAAW,GAAKwjC,EAAS,WAC/CxlC,EAAO,SAASgC,EAAK,YAAY,GAAKwjC,EAAS,cACnD,GAAI,KAAK,IAAI,OAAO,eAAgB,CAClC,IAAMqzB,EAAc,KAAK,IAAIrzB,EAAS,IAAMA,EAAS,WAAYA,EAAS,cAAc,EACpFxlC,GAAQ,GAAK64D,EAAcrzB,EAAS,aACtC,GAAQ,EAEZ,CACA,IAAMe,EAAOuyB,GAAWhiE,GAAagiE,CAAO,EAC5C,OAAO,IAAIhmC,GAAiBwT,EAAKtmC,GAAQ,EAAIA,EAAO,IAAK,GAAGumC,CAAI,CAClE,CACF,CACF,CACA,aAAa,EAAkB,CAC7B,KAAK,WAAW,CAClB,CACA,gBAAgB,EAAU,EAAkB,CAC1C,KAAK,WAAW,CAClB,CACA,mBAAmB,EAAU,CAC3B,OAAO,KAAK,SAAW,CAAC,CAACwyB,GAAY,CAAC,CAACA,EAAS,MAAQ,CAACA,EAAS,SAAWA,EAAS,QAAQ,KAChG,CACA,qBAAqB,EAAK,EAAkB,CAC1C,GAAIC,EACF,GAAI,CACF,OAAOA,EAAiB,cAAct9D,CAAG,CAC3C,OAASoC,EAAO,CACd,KAAK,KAAK,6DAA6DA,GAAO,CAChF,CAEF,OAAOpC,CACT,CACA,eAAe,EAAO,EAAM,EAAiB,CAC3C,GAAM,CACJ,UACA,SACE3Z,EACE+kD,EAAO,KAAK,YAAY,IAAI,EAC5BmyB,EAAUlyB,EAAM,QAAQ,MAAQ,KAAK,IAAI,EAAGD,EAAOC,EAAM,QAAQ,KAAK,EAAI,EAChF,EAAQ,iBAAmB,KAAK,IAAI,EAAIkyB,EACxC,IAAMhZ,EAAiB,KAAK,IAAI,OAAO,eACvC,GAAIA,IAAmBlpD,EAAQ,sBAAuB,CACpD,IAAM5U,EAAS,KAAK,IAAI89D,GAAkB,EAAG,CAAC,EAC9C,EAAQ,sBAAwB99D,EAChC4U,EAAQ,UAAU,QAAS,GAAS,CAClCxV,EAAK,SAASA,EAAK,eAAiBY,CAAM,CAC5C,CAAC,CACH,CACA,GAAI4U,EAAQ,MAAQ+oD,GAAmB,MAAQA,EAAgB,KAAM,CACnE,IAAMoZ,EAAe,cAAen3E,EAAOA,EAAK,UAAYA,EAAK,MAEjE,GADAgV,EAAQ,SAAS+oD,CAAe,EAC5BA,GAAmB/oD,EAAQ,UAAU,OAAS,EAAG,CACnDsT,GAAay1C,EAAiB/oD,EAAS,IAAI,EAC3C,IAAM+G,EAAQ/G,EAAQ,qBACtB,GAAI+G,EAAO,CACT,KAAK,KAAKA,CAAK,EACf,IAAM5B,EAAM,KAAK,IACjB,GAAI,CAACA,EAAI,OAAO,4BAA6B,CAE3C,GAAM,CACJ,kBACEna,EACJma,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,cACjB,QAASlD,EAAa,oBACtB,MAAO,GACP,IAAKhH,EAAQ,IACb,QACA,OAAQ+G,EAAM,QACd,MAAO/b,EAAK,OAAS,IAAK,GAC1B,OAA+BgV,EAAQ,UAAU,EAAA,EAA2C,KAC5F,iBACA,OACF,CAAC,EACD,MACF,CACA,EAAQ,qBAAuB,IACjC,CACF,CACIA,EAAQ,mBAAqB,KAC/B,EAAQ,iBAAmBgwC,EAAM,QAAQ,OAE3C,IAAMQ,EAAa,KAAK,IAAI,sBACtBhe,EAAWge,EAAaA,EAAW,IAAMA,EAAW,IAAM,EAE1Dn6B,EAAiBD,GAAsBpW,GADfA,EAAQ,KAAOwyB,GAAY,GACiB,EAO1E,GANIxyB,EAAQ,iBAAmBqW,EAAiB05B,EAC9C,EAAQ,iBAAmBA,EAE3B,EAAQ,kBAAoB15B,EAE9B,KAAK,IAAI,iBAAiBhqB,EAAM,GAAG2T,EAAQ,SAAW,aAAeA,EAAQ,WAAa,IAAMA,EAAQ,cAAgBA,EAAQ,QAAU,UAAY,UAAU,EAC5J,CAAC,KAAK,SAAW,CAACA,EAAQ,KAC5B,OAEF,IAAIoiE,EACA7yB,EACAtmC,EACJ,GAAIjJ,EAAQ,gBAAkBA,EAAQ,OAASA,EAAQ,SAAU,CAC/D,IAAMqiE,EAAiB,KAAK,IAAI,OAAO,eACjCC,EAAatiE,EAAQ,WACrBuiE,EAAQviE,EAAQ,MAChBwiE,EAAgBxiE,EAAQ,cACxByiE,EAAWD,IAAkB,GAC7BE,EAAsBJ,IAAeC,EACvCE,EACEC,GACF,EAAMH,EAAQ,EACd,EAAOF,EAAiB,EAAIG,IAE5B,EAAMF,EACN,EAAOD,EAAiBG,EAAgB,EAAIxiE,EAAQ,cAGtD,EAAMuiE,EAAQ,EAEhB,IAAMI,EAAe3iE,EAAQ,IACvB4iE,EAASD,EAAe3iE,EAAQ,UAClC8hE,EAAc,KAAK,IAAIc,EAAS5iE,EAAQ,WAAYA,EAAQ,eAAiB,GAAG,EACpF,GAAI8hE,EAAc,EAAG,CACnB,GAAIc,EAAS5iE,EAAQ,eAAiB,EACpC,KAAK,IAAI,0BAA0B2iE,EAAa,QAAQ,CAAC,EAAE,6CAA6C,EACxG,EAAM,IAAK,GACX,EAAO,IAAK,QACP,GAAI5Z,GAAmB,MAAQA,EAAgB,YAAc6Z,EAAS5iE,EAAQ,WAAa+oD,EAAgB,WAChH,KAAK,KAAK,oCAAoCA,EAAgB,WAAW,OAAO+Y,EAAY,sBAAsB9hE,EAAQ,KAAK,EAC/H,EAAc,MACT,CACL,IAAM6iE,EAAW,KAAK,MAAMf,EAAc9hE,EAAQ,cAAc,EAEhE,GADA,GAAO6iE,EACH55D,IAAS,IAAK,GAAG,CACnB,IAAM9e,EAAQ,KAAK,MAAM23E,EAAc9hE,EAAQ,eAAiBA,EAAQ,UAAU,EAClF,GAAQ7V,CACV,CACA,KAAK,IAAI,oBAAoB6V,EAAQ,UAAU,kBAAkB2iE,EAAa,QAAQ,CAAC,EAAE,UAAUb,EAAY,WAAWe,EAAS,WAAW55D,GAAM,CACtJ,CACA,EAAQ,WAAa64D,CACvB,CAEA,GADA,EAAqB,KAAK,sBAAsB9hE,EAAShV,EAAK,mBAAoBukD,EAAKtmC,CAAI,EACvFo5D,GAAkB,CAACK,EAAqB,CAC1C,EAAQ,iBAAmB3yB,EAC3B,KAAK,gBAAgBoyB,EAAcC,CAAkB,EACrD,MACF,CACF,MAAWpiE,EAAQ,gBAAkBA,EAAQ,gBAC3C,EAAqB,KAAK,sBAAsBA,EAAShV,EAAK,mBAAoBukD,EAAKtmC,CAAI,GAEzFm5D,GAAsB7yB,IAAQ,IAAK,IAAKvvC,EAAQ,iBAClD,EAAQ,iBAAmBgwC,EAAM,QAAQ,MAAQ,KAAK,IAAI35B,EAAiB6rD,EAAU,EAAG7rD,EAAiB,CAAC,GAE5G,KAAK,gBAAgB8rD,EAAcC,EAAoBpiE,CAAO,CAChE,MACE,KAAK,WAAW,CAEpB,CACA,gBAAgB,EAAc,EAAoB,EAAgB,CAChE,IAAMA,EAAU8iE,GAAkBX,EAAa,QAC/C,GAAI,CAACniE,EAAS,CACZ,KAAK,gBAAgBmiE,EAAcC,CAAkB,EACrD,MACF,CACA,IAAMryB,EAAO,KAAK,YAAY,IAAI,EAC5BgzB,EAAmB/iE,EAAQ,iBACjC,GAAI+vC,GAAQgzB,EAAkB,CAC5B,KAAK,gBAAgBZ,EAAcC,CAAkB,EACrD,MACF,CACA,IAAMY,EAA2BD,EAAmBhzB,EACpD,KAAK,IAAI,wBAAwBoyB,EAAa,MAAQA,EAAa,QAAU,MAAM,MAAM,KAAK,MAAMa,CAAwB,EAAE,IAAI,EAClI,KAAK,WAAW,EAChB,KAAK,MAAQ,KAAK,eAAiB,KAAK,gBAAgBb,EAAcC,CAAkB,EAAGY,CAAwB,CACrH,CACA,sBAAsB,EAAS,EAA4B,EAAK,EAAM,CACpE,IAAIxzB,EAAOzvC,GAAaC,CAAO,EAM/B,OALIijE,GAA8B,MAAQA,EAA2B,MAAQjjE,EAAQ,oBACnF,EAAMijE,EAA2B,IACjC,EAAOA,EAA2B,KAClC,EAAO5iE,GAAQ,IAEV,IAAI07B,GAAiBwT,EAAKtmC,EAAMumC,CAAI,CAC7C,CACA,WAAW,EAAY,CACrB,IAAM2G,EAAe+sB,EAAW,QAC1B97D,EAAYN,GAAeo8D,CAAU,EACrC/6D,EAAc+6D,EAAW,YACzB,CACJ,SACA,aAAa,EACb,eACE/6D,GAAe,CAAC,EACdJ,EAAQ,CAAC,CAACI,GAAe,CAAC,CAACX,IAAgB4e,IAAWhe,EAAmB,cAAgB,CAACD,EAAY,UAAYie,IAAWhe,EAAmB,2BACtJ,GAAIL,EAAO,CACT,IAAIo7D,EACJ,GAAI17D,GAAcD,EAAY,YAC5B,MAAO,GAET,GAAIJ,IAAc,EAAsB87D,EAAW,UAAY,MAAQC,EAAoB,mBACzF,KAAK,KAAK,6BAA6B17D,EAAa,EAAE,GAAGD,EAAY,YAAY,UAAU2uC,EAAa,8BAA8B,EACtI,KAAK,aAAa,MACb,CACL,IAAMsT,EAAQniD,GAAcE,EAAaC,CAAU,EACnD,KAAK,WAAW,EAChB,KAAK,MAAQ,KAAK,eAAiB,KAAK,aAAa,EAAGgiD,CAAK,EAC7D,KAAK,KAAK,6BAA6BhiD,EAAa,EAAE,GAAGD,EAAY,YAAY,UAAU2uC,EAAa,OAAOsT,EAAM,GAAG,CAC1H,CACA,EAAW,WAAa,GACxB,EAAY,SAAW,EACzB,CACA,OAAO1hD,CACT,CACF,EAsBM,GAAN,cAAmCw4B,EAAuB,CACxD,YAAY,EAAK,CACf,MAAMp7B,EAAK,wBAAwB,EACnC,KAAK,OAAS,CAAC,EACf,KAAK,SAAW,KAChB,KAAK,cAAgB,CAAC,EACtB,KAAK,QAAU,GACf,KAAK,aAAe,KACpB,KAAK,mBAAqB,GAC1B,KAAK,kBAAkB,CACzB,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACJA,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,mBAAoB,KAAK,mBAAoB,IAAI,EAC/DlW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,CACzC,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,mBAAoB,KAAK,mBAAoB,IAAI,EAChElW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,CAC1C,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,OAAO,OAAS,EACrB,KAAK,cAAc,OAAS,EAC5B,KAAK,aAAe,KACpB,MAAM,QAAQ,CAChB,CACA,mBAAoB,CAClB,KAAK,OAAS,CAAC,EACf,KAAK,cAAgB,CAAC,EACtB,KAAK,SAAW,KAChB,KAAK,aAAe,KACpB,KAAK,QAAU,GACf,KAAK,mBAAqB,EAC5B,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,OAASrwB,EAAK,aAAe,CAAC,CACrC,CACA,mBAAmB,EAAO,EAAM,CAC9B,GAAM,CACJ,KACA,UACA,WACEA,EACEo4E,EAAqB,KAAK,cAAcz8E,GAC9C,GAAI,CAACy8E,GAAsBA,EAAmB,UAAYvmE,EAAS,CACjE,KAAK,KAAK,uBAAuBlW,EAAG,aAAakW,EAAQ,6BAA6BumE,GAAyD,SAAS,EACxJ,MACF,CACA,IAAMC,EAAaD,EAAmB,QACtC,EAAmB,QAAUp4E,EAAK,QAClC,KAAK,IAAI,eAAerE,EAAG,IAAIy8E,EAAmB,KAAK,SAASA,EAAmB,KAAK,SAASvmE,EAAQ,WAAWmD,EAAQ,QAAQ,GAAGA,EAAQ,MAAM,EAAE,EACnJrZ,IAAO,KAAK,SACd,KAAK,eAAeA,EAAIqE,EAAMq4E,CAAU,CAE5C,CACA,eAAe,EAAO,EAAM,CAC1B,KAAK,YAAYr4E,EAAK,KAAK,CAC7B,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,YAAYA,EAAK,KAAK,CAC7B,CACA,YAAY,EAAY,CACtB,IAAMypD,EAAY,KAAK,IAAI,OAAOoB,GAClC,GAAI,CAACpB,EACH,OAEF,IAAMn4C,EAAcm4C,EAAU,aAAe,KACvC6uB,EAAgB,KAAK,SACvBC,EAAe,KAAK,aACxB,GAAI,CAACjnE,GAAgBgnE,GAA+C,SAAahnE,GAA2C,QAAWA,GAAe,MAAQA,EAAY,KAAM,GAAagnE,GAA+C,QAAQzmE,CAAO,IAAO,EAAE,EAAG,CACrQ,KAAK,SAAWP,EAChB,KAAK,QAAU,GACf,KAAK,aAAe,KACpB,IAAMukE,EAAc,KAAK,OAAO,OAAQ,GAAU,CAACvkE,GAAeA,EAAY,QAAQxO,EAAM,OAAO,IAAM,EAAE,EAC3G,GAAI+yE,EAAY,OACV,KAAK,oBAAsB,CAACA,EAAY,KAAM,GAAU/yE,EAAM,OAAO,IACvE,KAAK,mBAAqB,IAE5B+yE,EAAY,SAAS,EAAO,IAAM,CAChC,EAAM,GAAKx6E,CACb,CAAC,OACI,GAAI,CAACk9E,GAAgB,CAAC,KAAK,cAAc,OAC9C,OAEF,KAAK,cAAgB1C,EACrB,IAAMrkE,EAAkB,KAAK,IAAI,OAAO,gBACxC,GAAI,CAAC+mE,GAAgB/mE,EAAiB,CACpC,IAAMgnE,EAAalgE,GAAmB9G,EAAiBqkE,EAAav8D,EAAmB,EACvF,GAAIk/D,EAAa,GACf,EAAe3C,EAAY2C,OACtB,CACL,IAAMC,EAAWngE,GAAmB9G,EAAiB,KAAK,MAAM,EAChE,EAAe,KAAK,OAAOinE,EAC7B,CACF,CACA,IAAIp2E,EAAU,KAAK,YAAYk2E,CAAY,EACvCl2E,IAAY,IAAMk2E,IACpB,EAAU,KAAK,YAAY,IAAI,GAEjC,IAAMG,EAAqB,CACzB,aACF,EACA,KAAK,IAAI,0BAA0B7C,EAAY,OAAO,+BAA+BvkE,GAA2C,KAAK,GAAG,GAAG,EAC3I,KAAK,IAAI,QAAQ+e,EAAO,qBAAsBqoD,CAAkB,EAChE,IAAMC,EAAkB,KAAK,QAC7B,GAAIt2E,IAAY,IAAMs2E,IAAoB,GACxC,KAAK,cAAct2E,CAAO,OACrB,GAAIwzE,EAAY,QAAU8C,IAAoB,GAAI,CAEvD,IAAM58D,EAAQ,gBAAI,MAAM,0DAA4E,KAAK,UAA4C,KAAK,GAAG,EAAE,gBAAgB85D,EAAY,QAAQ,EACnM,KAAK,KAAK95D,EAAM,OAAO,EACvB,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,uBACtB,MAAO,GACP,OACF,CAAC,CACH,CACF,CACF,CACA,QAAQ,EAAO,EAAM,CACf,GAAK,OAAUhc,EAAK,SAGpBA,EAAK,QAAQ,OAASiwC,EAAoB,aAAejwC,EAAK,QAAQ,KAAO,KAAK,UAAY,CAAC,KAAK,UAAY,KAAK,SAAS,QAAQA,EAAK,QAAQ,OAAO,IAAM,KAClK,KAAK,WAAWA,CAAI,CAExB,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,MACd,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,aACd,CACA,IAAI,YAAa,CACf,OAAO,KAAK,OACd,CACA,IAAI,WAAW,EAAO,CACpB,KAAK,mBAAqB,GAC1B,KAAK,cAAc44E,CAAK,CAC1B,CACA,eAAe,EAAa,CAC1B,IAAMz+D,EAAM,KAAK,IAEjB,GADA,EAAI,OAAO,gBAAkB0+D,EACzBA,EAAa,CACf,IAAMnhE,EAAiB,KAAK,eAE5B,GADA,KAAK,mBAAqB,GACtBA,EAAe,OAAQ,CACzB,IAAM6gE,EAAe,KAAK,aAC1B,GAAIA,GAAgBhgE,GAAcsgE,EAAaN,EAAcj/D,EAAmB,EAC9E,OAAOi/D,EAET,IAAMC,EAAalgE,GAAmBugE,EAAa,KAAK,cAAev/D,EAAmB,EAC1F,GAAIk/D,EAAa,GAAI,CACnB,IAAM11E,EAAQ,KAAK,cAAc01E,GAEjC,OADA,KAAK,cAAcA,CAAU,EACtB11E,CACT,CAAO,GAAIy1E,EAAc,CACvB,IAAI9+D,EAAcU,EAAI,UAClBV,IAAgB,KAClB,EAAcU,EAAI,gBAEpB,IAAM2+D,EAAcv/D,GAA+Bs/D,EAAa1+D,EAAI,OAAQzC,EAAgB+B,EAAaH,EAAmB,EAC5H,GAAIw/D,IAAgB,GAClB,OAAO,KAET,EAAI,cAAgBA,CACtB,CACA,GAAID,EAAY,UAAYA,EAAY,WAAY,CAClD,IAAME,EAA+BzgE,GAAmBugE,EAAanhE,CAAc,EACnF,GAAIqhE,EAA+B,GACjC,OAAOrhE,EAAeqhE,EAE1B,CACF,CACF,CACA,OAAO,IACT,CACA,cAAc,EAAO,CACnB,IAAM9xE,EAAS,KAAK,cACpB,GAAI2xE,EAAQ,GAAKA,GAAS3xE,EAAO,OAAQ,CACvC,KAAK,KAAK,2BAA2B2xE,GAAO,EAC5C,MACF,CACA,KAAK,mBAAqB,GAC1B,IAAMI,EAAY,KAAK,aACjBl2E,EAAQmE,EAAO2xE,GACfK,EAAcn2E,EAAM,SAAW,CAACA,EAAM,QAAQ,KAQpD,GAPI81E,IAAU,KAAK,SAAW91E,IAAUk2E,GAAaC,IAGrD,KAAK,IAAI,4BAA4BL,EAAM,IAAI91E,EAAM,KAAK,SAASA,EAAM,KAAK,SAASA,EAAM,QAAQ,YAAYA,EAAM,UAAU,EACjI,KAAK,QAAU81E,EACf,KAAK,aAAe91E,EACpB,KAAK,IAAI,QAAQutB,EAAO,sBAAuBl1B,EAAe,CAAC,EAAG2H,CAAK,CAAC,EACpEm2E,GACF,OAEF,IAAMhC,EAAmB,KAAK,aAAan0E,EAAM,IAAKk2E,GAAuC,QAASl2E,EAAM,OAAO,EACnH,KAAK,aAAam0E,CAAgB,CACpC,CACA,YAAY,EAAc,CACxB,IAAMpB,EAAc,KAAK,cACzB,IAAK,IAAIx6E,EAAI,EAAGA,EAAIw6E,EAAY,OAAQ,IAAK,CAC3C,IAAM/yE,EAAQ+yE,EAAYx6E,GAC1B,IAAI,MAAK,oBAAuByH,EAAM,WAGlC,CAACy1E,GAAgBhgE,GAAcggE,EAAcz1E,EAAOwW,EAAmB,GACzE,OAAOje,CAEX,CACA,GAAIk9E,EAAc,CAChB,GAAM,CACJ,OACA,OACA,YACA,kBACA,aACA,YACEA,EACJ,IAAK,IAAIl9E,EAAI,EAAGA,EAAIw6E,EAAY,OAAQ,IAAK,CAC3C,IAAM/yE,EAAQ+yE,EAAYx6E,GAC1B,GAAIkd,GAAc,CAChB,OACA,OACA,YACA,kBACA,aACA,UACF,EAAGzV,EAAOwW,EAAmB,EAC3B,OAAOje,CAEX,CACA,IAAK,IAAIA,EAAI,EAAGA,EAAIw6E,EAAY,OAAQ,IAAK,CAC3C,IAAM/yE,EAAQ+yE,EAAYx6E,GAC1B,GAAI8+B,GAAyBo+C,EAAa,MAAOz1E,EAAM,MAAO,CAAC,WAAY,iBAAkB,iBAAiB,CAAC,EAC7G,OAAOzH,CAEX,CACA,IAAK,IAAIA,EAAI,EAAGA,EAAIw6E,EAAY,OAAQ,IAAK,CAC3C,IAAM/yE,EAAQ+yE,EAAYx6E,GAC1B,GAAI8+B,GAAyBo+C,EAAa,MAAOz1E,EAAM,MAAO,CAAC,UAAU,CAAC,EACxE,OAAOzH,CAEX,CACF,CACA,MAAO,EACT,CACA,aAAa,EAAkB,CAC7B,MAAM,aAAa,EACnB,IAAM2Y,EAAa,KAAK,aACnB,KAAK,mBAAmBA,CAAU,GAGnCiG,GAAkBjG,EAAW,IAAK,KAAK,GAAG,GAC5C,KAAK,gBAAgBA,EAAYijE,CAAgB,CAErD,CACA,gBAAgB,EAAY,EAAkB,CAC5C,MAAM,gBAAgBjjE,EAAYijE,CAAgB,EAClD,IAAMt7E,EAAKqY,EAAW,GAChBnC,EAAUmC,EAAW,QACrB5U,EAAM,KAAK,qBAAqB4U,EAAW,IAAKijE,CAAgB,EAChEjiE,EAAUhB,EAAW,QACrBkB,EAAMF,GAAmC,IAC/C,KAAK,IAAI,uBAAuBrZ,EAAG,IAAIqY,EAAW,KAAK,SAASA,EAAW,KAAK,SAASnC,IAAWolE,GAAqD,MAAS,IAAK,GAA0E,GAAtE,UAAYA,EAAiB,IAAM,SAAWA,EAAiB,OAAY/hE,GAAOF,EAAQ,KAAO,QAAUE,EAAI,QAAQ,CAAC,GAAKF,EAAQ,MAAO,IAAMA,EAAQ,MAAQ,IAAW,GAAG,GAAG5V,GAAK,EACnW,KAAK,IAAI,QAAQixB,EAAO,oBAAqB,CAC3C,MACA,KACA,UACA,mBAAoB4mD,GAAoB,KACxC,MAAOjjE,CACT,CAAC,CACH,CACF,EACM,GAAN,KAA2B,CACzB,YAAY,EAAuB,CACjC,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,CACZ,MAAO,CAAC,EACR,MAAO,CAAC,EACR,WAAY,CAAC,CACf,EACA,KAAK,OAASklE,CAChB,CACA,SAAU,CACR,KAAK,OAAS,KAAK,OAAS,IAC9B,CACA,OAAO,EAAW,EAAM,EAAS,CAC/B,GAAI,KAAK,SAAW,MAAQ,KAAK,SAAW,KAC1C,OAEF,IAAMC,EAAQ,KAAK,OAAOz9E,GAC1By9E,EAAM,KAAKC,CAAS,EAChBD,EAAM,SAAW,GAAK,CAACE,GACzB,KAAK,YAAY39E,CAAI,CAEzB,CACA,cAAc,EAAM,CAClB,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAM09E,EAAY,CAChB,MAAO,gBACP,QAASrnB,EACT,YAAe,CACf,EACA,eAAkB,CAClB,EACA,YAAe,CACf,CACF,EACA,KAAK,OAAOqnB,EAAW19E,CAAI,CAC7B,CAAC,CACH,CACA,eAAe,EAAM,CACnB,OAAO,IAAI,QAAS,GAAY,CAC9B,GAAI,KAAK,OAAQ,CACf,IAAM09E,EAAY,CAChB,MAAO,wBACP,QAASrnB,EACT,YAAe,CACf,EACA,eAAkB,CAClB,EACA,YAAe,CACf,CACF,EACA,KAAK,OAAOr2D,EAAK,CAAC,QAAQ09E,CAAS,CACrC,CACF,CAAC,CACH,CACA,gBAAiB,CACX,KAAK,SAAW,MAGpB,CAAC,KAAK,OAAO,MAAO,KAAK,OAAO,MAAO,KAAK,OAAO,UAAU,CAAC,CAAC,QAAS,GAAU,CAEhF,IAAM3zC,EAAmB0zC,EAAM,EAAA,EAA+B,OAC1D1zC,IAAU,iBAAmBA,IAAU,2BACzC0zC,EAAM,EAAE,CAAC,QAAQ,EACjBA,EAAM,OAAO,EAAG,CAAC,EAErB,CAAC,CACH,CACA,aAAa,EAAI,CACX,KAAK,SAAW,MAGN,KAAK,OAAO,MAChB,KAAOG,GACf,KAAK,oBAAoB,OAAO,CAEpC,CACA,YAAY,EAAM,CAChB,GAAI,KAAK,SAAW,MAAQ,KAAK,SAAW,KAC1C,OAEF,IAAMH,EAAQ,KAAK,OAAOz9E,GAC1B,GAAIy9E,EAAM,OAAQ,CAChB,IAAMC,EAAYD,EAAM,GACxB,GAAI,CACFC,EAAU,QAAQ,CACpB,OAASr9D,EAAO,CAGd,GADAq9D,EAAU,QAAQr9D,CAAK,EACnB,KAAK,SAAW,MAAQ,KAAK,SAAW,KAC1C,OAEF,IAAMw9D,EAA0B,KAAK,OAAO79E,EAAA,EAA4C,OAClF69E,GAAM,MAAQA,EAAG,UACrB,KAAK,oBAAoB79E,CAAI,CAEjC,CACF,CACF,CACA,oBAAoB,EAAM,CACpB,KAAK,SAAW,OAGpB,KAAK,OAAOA,EAAK,CAAC,MAAM,EACxB,KAAK,YAAYA,CAAI,EACvB,CACA,QAAQ,EAAM,CAEZ,OAAwB,KAAK,SAAwCA,EAAK,CAAC,IAAO,IACpF,CACA,UAAW,CACT,GAAM,CACJ,SACA,UACE,KAIJ,OAHI89E,IAAW,MAAQvyE,IAAW,KACzB,cAEF;EACT,KAAK,KAAK,OAAO,EAAE;EACnB,KAAK,KAAK,OAAO,EAAE;EACnB,KAAK,KAAK,YAAY,EAAE,EACxB,CACA,KAAK,EAAM,CACT,IAAIwyE,EAAeC,EACnB,OAAQ,EAAgB,KAAK,SAAW,MAAQD,EAAc/9E,KAAU,EAAe,KAAK,SAAW,MAAQg+E,EAAah+E,GAAQ,GAAGA,EAAK,KAAK,KAAK,WAAWA,CAAI,EAAE,IAAI,KAAK,QAAQA,CAAI,IAAM,EACpM,CACA,WAAW,EAAM,CAEf,IAAMoH,EAAyB,KAAK,SAAyCpH,GACvE69E,EAAKz2E,GAA+B,OAI1C,OAHKy2E,EAGE,eAAeA,EAAG,SAAW,YAAc,KAAKz2E,EAAM,MAAQ,SAAW,KAAKA,EAAM,OAAS,UAAY,KAFvG,MAGX,CACA,QAAQ,EAAM,CAEZ,OAAyB,KAAK,SAAyCpH,EAAK,CAAC,IAAK,GAAO49E,EAAG,KAAK,CAAC,CAAC,KAAK,IAAI,GAAM,EACpH,CACF,EACM,GAA8B,uDAC9B,GAA2B,yBAC3B,GAAN,cAAqC,KAAM,CACzC,YAAY,EAAS,CACnB,MAAMvuD,CAAO,EACb,KAAK,KAAO4qB,EACd,CACF,EACM,GAAN,cAA+BpF,EAAO,CACpC,YAAY,EAAK,EAAiB,CAChC,MAAM,oBAAqBp2B,EAAI,MAAM,EACrC,KAAK,IAAM,IAAK,GAChB,KAAK,gBAAkB,IAAK,GAC5B,KAAK,QAAU,KACf,KAAK,WAAa,KAClB,KAAK,eAAiB,KACtB,KAAK,uBAAyB,EAC9B,KAAK,MAAQ,KACb,KAAK,YAAc,KACnB,KAAK,mBAAqB,KAC1B,KAAK,mBAAqB,KAC1B,KAAK,mBAAqB,EAC1B,KAAK,aAAe,IAAK,GACzB,KAAK,aAAe,IAAK,GACzB,KAAK,UAAY,IAAK,GACtB,KAAK,aAAe,CAClB,MAAO,EACP,MAAO,EACP,WAAY,CACd,EACA,KAAK,OAAS,CAAC,EACf,KAAK,cAAgB,CAAC,CAAC,KAAM,IAAI,EAAG,CAAC,KAAM,IAAI,CAAC,EAChD,KAAK,gBAAmB,GAAU,CAE3B,KAAK,KAGgB,KAAK,aAAkD,aAAgB,QAGjG,KAAK,IAAI,eAAe,CAC1B,EACA,KAAK,kBAAqB,GAAU,CAC7B,KAAK,KAGV,KAAK,IAAI,gBAAgB,CAC3B,EACA,KAAK,mBAAsB,GAAM,CAC/B,GAAM,CACJ,QACA,eACE,KACA,GACF,KAAK,IAAI,qBAAqB,EAE3B6gB,GAAU0U,IAGfA,EAAY,oBAAoB,aAAc,KAAK,kBAAkB,EACrE1U,EAAM,oBAAoB,UAAW,KAAK,eAAe,EACzD,KAAK,eAAe,EACpB,KAAK,IAAI,QAAQ3K,EAAO,eAAgB,CACtC,QACA,aACF,CAAC,EACG,KAAK,cAAgB,MACvB,KAAK,mBAAmB,EAE5B,EACA,KAAK,wBAA4B,CAC/B,KAAK,IAAI,qBAAqB,CAChC,EACA,KAAK,wBAA4B,CAC/B,KAAK,IAAI,oBAAoB,CAC/B,EACA,KAAK,oBAAwB,CAC3B,GAAM,CACJ,WACA,cACE,KACAspD,IAAaC,GACf,KAAK,MAAM,0DAA0DA,EAAW,KAAKD,EAAS,EAAE,CAEpG,EACA,KAAK,IAAMx/D,EACX,KAAK,gBAAkB60B,EACvB,KAAK,aAAezyC,EAAqBF,EAAe8d,EAAI,OAAO,wBAAwB,CAAC,EAC5F,KAAK,WAAW,EAChB,KAAK,kBAAkB,CACzB,CACA,gBAAiB,CACf,OAAO,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,OAAS,CAC3C,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,QAAU,KACf,KAAK,mBAAqB,KAAK,mBAAqB,KACpD,KAAK,aAAe,KAAK,UAAY,IAAK,GAC1C,AAEE,KAAK,kBADL,KAAK,eAAe,QAAQ,EACN,MAExB,KAAK,IAAM,KAAK,gBAAkB,KAClC,KAAK,mBAAqB,KAAK,oBAAsB,KACrD,KAAK,oBAAsB,KAC3B,KAAK,kBAAoB,KAAK,gBAAkB,IAClD,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACJA,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,WAAY,KAAK,YAAa,IAAI,EAChDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,YAAa,KAAK,aAAc,IAAI,EAClDlW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,CACzC,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,WAAY,KAAK,YAAa,IAAI,EACjDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,YAAa,KAAK,aAAc,IAAI,EACnDlW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,CAC1C,CACA,eAAgB,CACd,GAAM,CACJ,QACA,eACE,KACJ,GAAI,CAAC2K,EACH,OAAO,KAET,IAAM/zB,EAAS,CAAC,EAChB,GAAI,KAAK,eAAgB,CACvB,IAAM4yE,EAAW,KAAK,WAAW,EAC5BA,GACH,KAAK,eAAe,eAAe,EAErC,IAAMC,EAAS,KAAK,SAAS,GACzBD,GAAYC,IACd,KAAK,KAAK,+BAA+BA,EAAS,uBAAyB,KAAKD,EAAW,4BAA8B,GAAG,GAAG,KAAK,gBAAgB,EAEtJ,KAAK,eAAe,QAAQ,CAC9B,CACA,IAAME,EAAe,KAAK,aAa1B,MAZI,CAAC,KAAK,mBAAqBA,GAAgBA,EAAa,cAAgBrqC,EAC1E70C,EAASoM,EAAQ8yE,EAAa,MAAM,EAEpC,KAAK,cAAc,QAAS,GAAU,CACpC,GAAM,CAACr+E,GAAQs+E,EACXt+E,IACF,EAAOA,GAAQb,EAAS,CAAC,EAAG,KAAK,OAAOa,EAAK,EAC7C,KAAK,aAAaA,CAAI,GAExB,EAAM,GAAK,EAAM,GAAK,IACxB,CAAC,EAEI,CACL,QACA,cACA,QACF,CACF,CACA,YAAa,CACX,IAAMuL,EAAS,CAAC,EAChB,KAAK,cAAgB,CAAC,CAAC,KAAM,IAAI,EAAG,CAAC,KAAM,IAAI,CAAC,EAChD,KAAK,OAASA,EACd,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,mBAAqB,KAAK,mBAAqB,KACpD,KAAK,mBAAqB,CAC5B,CACA,mBAAoB,CAClB,KAAK,uBAAyB,EAC9B,KAAK,QAAU,IACjB,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAIgzE,EACJ,IAAIC,EAAc,GACdl6E,EAAK,OAAS,CAACA,EAAK,OAAS,CAACA,EAAK,YACrC,EAAc,GAEhB,KAAK,uBAAyBk6E,EAC9B,KAAK,IAAI,GAAGA,EAAY,gCAAgC,GACnD,EAAqB,KAAK,eAAiB,MAAQD,EAAmB,aAAe,KAAK,mBAAqBC,GAClH,KAAK,cAAc,CAEvB,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAMl/C,EAAQ,KAAK,MAAQh7B,EAAK,MAChC,KAAK,aAAe,KAAK,UAAY,IAAK,GAC1C,IAAMgR,EAAc3U,EAAe,KAAK,YAAY,EACpD,GAAI2U,EAAa,CACf,IAAMwoD,EAAoB,CAAC,CAACx5D,EAAK,aAC7Bw5D,GAAqBx5D,EAAK,aAC5B,KAAK,aAAeA,EACpB,KAAK,UAAYA,EAAK,WAExB,IAAMm6E,EAAK,KAAK,YAAcn6E,EAAK,aAAe,IAAIgR,EAEtD,GADA,KAAK,kBAAkBmpE,CAAE,EACrB3gB,EACF,KAAK,WAAax+B,EAAM,IACxB,KAAK,kBAAkB,MAClB,CACL,IAAMo/C,EAAY,KAAK,WAAa,KAAK,IAAI,gBAAgBD,CAAE,EAC/D,GAAI,KAAK,aACP,GAAI,CACFn/C,EAAM,gBAAgB,KAAK,EAC3B,IAAMq/C,EAAM,KAAK,mBACjB,EAAM,sBAAwBr/C,EAAM,uBAAyBq/C,GAAOF,aAAcE,EAClFz/C,GAAqBI,CAAK,EAC1BD,GAAUC,EAAOo/C,CAAS,EAC1Bp/C,EAAM,KAAK,CACb,MAAgB,CACd,EAAM,IAAMo/C,CACd,KAEA,GAAM,IAAMA,CAEhB,CACAp/C,EAAM,iBAAiB,UAAW,KAAK,eAAe,CACxD,CACF,CACA,kBAAkB,EAAI,CAEpB,KAAK,IAAI,GAA2B,KAAK,cAAqD,cAAiBm/C,EAAK,cAAgB,UAAU,iBAAoCA,EAAG,aAAgD,MAAM,EAC3OA,EAAG,iBAAiB,aAAc,KAAK,kBAAkB,EACzDA,EAAG,iBAAiB,cAAe,KAAK,mBAAmB,EAC3DA,EAAG,iBAAiB,cAAe,KAAK,mBAAmB,EACvD,KAAK,eACPA,EAAG,iBAAiB,iBAAkB,KAAK,iBAAiB,EAC5DA,EAAG,iBAAiB,eAAgB,KAAK,eAAe,EAE5D,CACA,mBAAoB,CAClB,IAAMn/C,EAAQ,KAAK,MACbh7B,EAAO,KAAK,aAClB,GAAI,CAACA,GAAQ,CAACg7B,EACZ,OAEF,IAAMn+B,EAAiB,KAAK,OACtBy9E,EAAoBt6E,EAAK,OACzBtD,EAAa49E,EAAoB,OAAO,KAAKA,CAAiB,EAAI,KAClEx9E,EAAaJ,EAAaA,EAAW,OAAS,EAC9C69E,MAAgC,CACpC,QAAQ,QAAQ,CAAC,CAAC,SAAW,CACvB,KAAK,OAAS,KAAK,wBACrB,KAAK,mBAAmB,CAE5B,CAAC,CACH,EACA,GAAID,GAAqB59E,GAAcI,EAAY,CACjD,GAAI,CAAC,KAAK,YAAa,CACrB,KAAK,IAAI,OAAO,kBAAoB,GACpC,KAAK,IAAI,wDAAwD,EACjE,MACF,CAIA,GAHA,KAAK,IAAI,8CAA8C,KAAK,uBAAuB;mBACtEwa,EAAUza,GAAiB,EAAK,IAAUd,IAAQ,cAAgB,IAAK,GAAIoR,CAAK,EAAE;mBAClFmK,EAAUgjE,GAAoB,EAAK,IAAUv+E,IAAQ,cAAgB,IAAK,GAAIoR,CAAK,EAAE,EAAE,EAChG,CAAC1Q,EAAwB69E,EAAmBz9E,CAAc,EAAG,CAC/D,EAAK,YAAc,KACnB,EAAK,OAAS,IAAK,GACnB,IAAM+xC,EAAc5T,EAAM,YACpBhmB,EAAU,KAAK,QACfykB,EAAY,KAAK,IAAImV,EAAc55B,GAAmC,UAAU,EAAE,CAAC,OAAU,CAAC,EACpG,GAAIykB,EAAYmV,EAAc,EAAG,CAC/B,KAAK,IAAI,0EAA0EA,EAAY,MAAMnV,GAAW,EAChH,MACF,CACA,KAAK,KAAK,sEAAsE,OAAO,KAAK6gD,CAAiB,EAAE,MAAM,OAAO,KAAKz9E,CAAc,EAAE,iBAAiB48B,EAAU,gBAAgBmV,GAAa,EACzM,KAAK,iBAAiBve,EAAO,gBAAiB,CAAC,CAAC,EAChD,KAAK,iBAAiBA,EAAO,gBAAiBrwB,CAAI,EAClD,EAAM,YAAcy5B,EACpB,MACF,CACA,KAAK,aAAe,IAAK,GACzB/8B,EAAW,QAAS,GAAc,CAChC,IAAMhB,EAAO8+E,EACP13E,EAAQw3E,EAAkB5+E,GAChC,GAAIoH,EAAO,CACT,IAAMy2E,EAAKz2E,EAAM,OACjB,GAAIy2E,EAAI,CACN,IAAMvqC,EAAkB,KAAK,gBACvB0d,EAAe5pD,EAAM,GAC3B,GAAIksC,EAAgB,aAAa0d,CAAY,GAAK1d,EAAgB,SAAS0d,CAAY,EAAG,CACxF,IAAMmS,EAAqB7sB,EAAa,YAAYunC,CAAE,EACtDvqC,EAAgB,uBAAuBtzC,EAAMmjE,EAAoBnS,EAAc,KAAM,EAAI,CAC3F,CACA,IAAM+tB,EAAUx/C,GAAwBv/B,CAAI,EACtCg/E,EAAU,CAACh/E,EAAM69E,CAAE,EACzB,KAAK,cAAckB,GAAWC,EAC1BnB,EAAG,UAAY,KAAK,gBACtB,KAAK,eAAe,eAAe79E,CAAI,EAEzC,KAAK,kBAAkBA,EAAMoH,CAAK,CACpC,CACF,CACF,CAAC,EACDy3E,EAAwB,EACxB,KAAK,cAAc,CACrB,MACE,KAAK,IAAI,kDAAkD,EAC3DA,EAAwB,CAE5B,CACA,IAAI,wBAAyB,CAE3B,IAAMI,EAAmC,KAAK,aAAmD,WACjG,OAAOA,IAAe,QAAUA,IAAe,OACjD,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAMnhB,EAAoB,CAAC,CAACx5D,EAAK,cACjC,KAAK,aAAe,KAAK,UAAY,IAAK,GAC1C,GAAM,CACJ,QACA,cACA,cACE,KACJ,GAAI0vC,EAAa,CAEf,GADA,KAAK,IAAI,gBAAgB8pB,EAAoB,eAAiB,aAAa,EACvEA,EACF,KAAK,cAAc,SAAS,CAAC99D,KAAU,CACjCA,GACF,KAAK,aAAaA,CAAI,CAE1B,CAAC,EACD,KAAK,WAAW,MACX,CACL,GAAI,KAAK,uBAAwB,CAC/B,IAAMk/E,EAAOlrC,EAAY,aAAe,OACxC,GAAI,CACF,IAAMmrC,EAAgBnrC,EAAY,cAClC,IAAK,IAAIr0C,EAAIw/E,EAAc,OAAQ,KAC7BD,GACFC,EAAcx/E,EAAE,CAAC,MAAM,EAEzBq0C,EAAY,mBAAmBmrC,EAAcx/E,EAAE,EAE7Cu/E,GACFlrC,EAAY,YAAY,CAE5B,OAASxM,EAAK,CACZ,KAAK,KAAK,qBAAqBA,EAAI,QAAQ,2BAA2B,CACxE,CACF,CACI,KAAK,mBACP,KAAK,cAAc,CAEvB,CACAwM,EAAY,oBAAoB,aAAc,KAAK,kBAAkB,EACrEA,EAAY,oBAAoB,cAAe,KAAK,mBAAmB,EACvEA,EAAY,oBAAoB,cAAe,KAAK,mBAAmB,EACnE,KAAK,eACPA,EAAY,oBAAoB,iBAAkB,KAAK,iBAAiB,EACxEA,EAAY,oBAAoB,eAAgB,KAAK,eAAe,GAEtE,KAAK,YAAc,KACnB,KAAK,WAAa,IACpB,CACI1U,IACFA,EAAM,oBAAoB,UAAW,KAAK,eAAe,EACpDw+B,IACCogB,GACF,KAAK,IAAI,gBAAgBA,CAAU,EAEjC,KAAK,WAAaA,GACpB5+C,EAAM,gBAAgB,KAAK,EACvB,KAAK,cACPJ,GAAqBI,CAAK,EAE5BA,EAAM,KAAK,GAEX,KAAK,KAAK,8DAA8D,GAG5E,KAAK,MAAQ,MAEf,KAAK,IAAI,QAAQ3K,EAAO,eAAgBrwB,CAAI,CAC9C,CACA,eAAgB,CACd,KAAK,cAAc,SAAS,CAACtE,KAAU,CACjCA,GACF,KAAK,YAAYA,CAAI,CAEzB,CAAC,EACD,KAAK,WAAW,CAClB,CACA,YAAY,EAAM,CAEhB,IAAM69E,EAA0B,KAAK,OAAO79E,EAAA,EAA4C,OAExF,GADA,KAAK,aAAaA,CAAI,EAClB69E,EACF,GAAI,CACF,IAAIuB,GACC,EAAqB,KAAK,cAAgB,MAAQA,EAAmB,cAAc,QACtF,KAAK,YAAY,mBAAmBvB,CAAE,CAE1C,OAASr2C,EAAK,CACZ,KAAK,KAAK,iBAAiBxnC,IAAQwnC,CAAG,CACxC,CAEF,OAAO,KAAK,OAAOxnC,EACrB,CACA,aAAa,EAAM,CACjB,KAAK,sBAAsBA,CAAI,EAC/B,KAAK,cAAcu/B,GAAwBv/B,CAAI,GAAK,CAAC,KAAM,IAAI,EAC/D,IAAMoH,EAAQ,KAAK,OAAOpH,GACtBoH,IACF,EAAM,OAAS,IAAK,GAExB,CACA,YAAa,CACP,KAAK,gBACP,KAAK,eAAe,QAAQ,EAE9B,KAAK,eAAiB,IAAI2yC,GAAqB,KAAK,MAAM,CAC5D,CACA,eAAe,EAAO,EAAM,CAE1B,IAAMxuC,EAAS,KAAK,OACdvK,EAAa,OAAO,KAAKsD,CAAI,EACnC,KAAK,IAAI,mBAAmBtD,EAAW,sBAAsB,KAAK,kBAAkB,EAAE,EACtF,IAAMq+E,EAAiB,eAAgB/6E,IAASiH,EAAO,OAASA,EAAO,QAAUA,EAAO,aAAe,UAAWjH,GAAQ,UAAWA,GAC/Hg7E,EAAiB,CAACD,GAAkB,KAAK,mBAAqB,KAAK,OAASr+E,EAAW,KAAM,GAAW,CAACuK,EAAOg0E,EAAO,EACzHF,GAAkBC,EACpB,KAAK,KAAK,mCAAmC,OAAO,KAAK/zE,CAAM,EAAE,SAASvK,EAAW,gBAAgB,GAGvGA,EAAW,QAAS,GAAc,CAChC,IAAIw+E,EAEJ,GAAM,CACJ,KACA,QACA,aACA,YACA,WACA,gBAPkBl7E,EAAKw6E,GASrB13E,EAAQmE,EAAOuzE,GACbW,GAAoB,EAAsB,KAAK,eAAiB,OAAS,EAAsBD,EAAoB,SAAW,KAAO,IAAK,GAAIA,EAAoBV,GAClKY,EAAUD,GAAoB,MAAQA,EAAiB,OAASA,EAAmBr4E,EACnFu4E,EAAWD,GAAmC,cAAkBA,GAAmC,MACnGE,EAAkBF,GAAmC,WAC3D,AACEt4E,IAAQ,EAAO03E,GAAa,CAC1B,OAAQ,IAAK,GACb,UAAW,CAAC,EACZ,QACA,eACA,YACA,aACA,WACA,IACF,EAEF,IAAMe,EAAmBnrE,GAA0BirE,EAASC,CAAe,EACrEE,EAAeD,GAAqD,QAAQ7lC,GAA6B,IAAI,EAC/G+lC,EAAarrE,GAA0BlN,EAAOqN,CAAU,EACtDmrE,EAA2BD,GAA2C,QAAQ/lC,GAA6B,IAAI,EACjH+lC,GAAcF,GAAoBC,IAAiBE,IACjDlB,EAAU,MAAM,EAAG,CAAC,IAAM,UAC5B,EAAa3qE,GAAuB4rE,EAAY,KAAK,YAAY,GAEnE,KAAK,IAAI,mBAAmBJ,EAAQ,MAAMI,GAAY,EAClDA,KAAgB34E,EAAM,cAAgBA,EAAM,SAC9C,EAAM,aAAe24E,GAEvB,EAAM,UAAY1N,EAClB,KAAK,iBAAiByM,EAAWzM,EAAW0N,CAAU,EAE1D,CAAC,GACG,KAAK,aAAe,KAAK,qBAC3B,EAAK,OAAS,KAAK,oBAEjB,MAAK,oBAGL,KAAK,uBAAyB,GAAK,CAAC,KAAK,OAAO,OAAS,CAACz7E,EAAK,OAAyBA,EAAK,OAAsC,KAAQ,SAC7I,KAAK,IAAI,iBAAiB,EAC1B,KAAK,uBAAyB,GAE5B,KAAK,wBACP,KAAK,mBAAmB,GAE5B,CACA,IAAI,oBAAqB,CACvB,OAAO,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAY,IAAS,CAC3D,IAAM8C,EAAQ,KAAK,OAAOpH,GAO1B,MANA,GAAWA,GAAQ,CACjB,GAAIoH,EAAM,GACV,UAAWA,EAAM,UACjB,MAAOA,EAAM,MACb,WAAYA,EAAM,UACpB,EACO64E,CACT,EAAG,CAAC,CAAC,CACP,CACA,iBAAiB,EAAM,EAAW,EAAO,CACvC,IAAMzqE,EAAW,GAAG68D,EAAU,UAAU7qE,IAClCk2E,EAAY,CAChB,MAAO,eAAeloE,IACtB,YAAe,CACb,IAAMpO,EAAQ,KAAK,OAAOpH,GAC1B,GAAIoH,EAAO,CACT,IAAMy2E,EAAKz2E,EAAM,OACby2E,GAAM,MAAQA,EAAG,aACnB,KAAK,IAAI,YAAY79E,EAAK,wBAAwBwV,GAAU,EAC5DqoE,EAAG,WAAWroE,CAAQ,EACtB,EAAM,MAAQhO,EACd,EAAM,UAAY6qE,EAEtB,CACA,KAAK,oBAAoBryE,CAAI,CAC/B,EACA,YAAe,CACf,EACA,eAAkB,CAClB,EACA,QAAU,GAAU,CAClB,KAAK,KAAK,oBAAoBA,EAAK,oBAAqBqgB,CAAK,CAC/D,CACF,EACA,KAAK,OAAOq9D,EAAW19E,EAAM,KAAK,UAAU,KAAK,OAAOA,EAAK,CAAC,CAChE,CACA,WAAW,EAAY,CAErB,IAAMkgF,EAASC,EAAW,MACpBC,EAAQF,EAASC,EAAW,SAAW,IAE7C,GADwC,KAAK,gBAAgB,gBAAgBD,EAAQ3sC,EAAkB,IAAI,CAAA,EAA4C,MAAS,GAE9J,OAEF,IAAMqqC,EAAK,CACT,MAAO,cACP,YAAe,CAEb,IAAMpZ,EAAa,KAAK,OAAO,OAC3B,KAAK,mBAAqB4b,GAAS5b,GAAc,MAAQA,EAAW,QAAUluB,EAAa,WAAWkuB,EAAW,OAAQ4b,CAAK,GAAgC,KAAK,gBAAgB,gBAAgBA,EAAO7sC,EAAkB,IAAI,CAAA,EAA6C,MAAS,MACxR,KAAK,mBAAqB,KAC1B,KAAK,oBAAoB,OAAO,EAEpC,EACA,YAAe,CACf,EACA,eAAkB,CAClB,EACA,QAAU,GAAU,CAClB,KAAK,KAAK,wCAAyClzB,CAAK,CAC1D,CACF,EACA,KAAK,mBAAqB,CACxB,KACA,KAAM8/D,CACR,EACA,KAAK,OAAOvC,EAAI,QAAS,EAAI,CAC/B,CACA,cAAe,CACb,GAAM,CACJ,qBACA,kBACE,KACAyC,GAAsBC,IACxB,KAAK,mBAAqB,KAC1BA,EAAe,aAAaD,EAAmB,EAAE,EAErD,CACA,kBAAkB,EAAO,EAAW,CAClC,GAAM,CACJ,UACE,KACE,CACJ,OACA,OACA,SACA,OACA,OACA,YACA,UACEE,EACEC,EAAa1hB,EAAU,UAAU9+D,GACjC,CACJ,KACA,MACE8D,EACE28E,EAAuB,KAAK,YAAY,IAAI,EAClD,EAAW,MAAQA,EACnB,IAAMC,EAAgB58E,EAAK,MAAM,UAC3B68E,EAAgBp+D,EAAOA,EAAK,MAAM,UAAY,KAChDm+D,EAAc,QAAU,IAC1B,EAAc,MAAQD,GAEpBE,GAAiBA,EAAc,QAAU,IAC3C,EAAc,MAAQF,GAExB,IAAMnoE,EAAa/M,EAAO,MACtBq1E,EAAuB,GACvB5gF,IAAS,SAAYsY,GAAyC,YAAe,eAC/E,EAAuB,CAAC,KAAK,oBAAsBwmD,EAAU,KAAO,GAAK,KAAK,mBAAmB,KAAOA,EAAU,GAClH,KAAK,mBAAqBA,GAE5B,IAAM0F,EAAaj5D,EAAO,MACpBs1E,EAAUrc,GAAyC,OACzD,GAAIqc,GAAWn0D,IAAO,cAAe,CACnC,IAAMyzD,EAAa59D,GAAQze,EACrBu8E,EAAqB,KAAK,mBAChC,GAAIrgF,IAAS,SAAWovC,IAAW,QAAU,CAAC,KAAK,oBAAsB,EAAEo1B,EAAW,QAAUA,EAAW,OAAQ,CAEjH,IAAM4b,EADSD,EAAW,MACHA,EAAW,SAAW,IACvCW,EAAYD,EAAQ,SACpBE,EAAa,KAAK,UAAU,OAAO,GACrC,CAACD,EAAU,QAAU,CAACC,GAEf,CAACA,GAAc,CAACzqC,EAAa,WAAWuqC,EAAST,CAAK,GAAK,KAAK,mBAAqBA,IAC9F,KAAK,WAAWD,CAAU,CAE9B,MAAO,GAAIngF,IAAS,QAAS,CAC3B,IAAMghF,EAAiBb,EAAW,IAClC,GAAIE,EAAoB,CACtB,IAAMY,EAAaZ,EAAmB,KAAK,OACvCW,EAAiBC,GAAcD,EAAiB,KAAK,oBAAsB1qC,EAAa,WAAWuqC,EAASI,CAAU,IACxH,KAAK,aAAa,CAEtB,CACA,KAAK,mBAAqBD,CAC5B,CACF,CACA,IAAME,GAAa3+D,GAAQze,EAAA,CAAM,MAC3B45E,EAAY,CAChB,MAAO,UAAU19E,IACjB,YAAe,CAEb,EAAW,aAAe,KAAK,YAAY,IAAI,EAC/C,IAAM69E,EAA2B,KAAK,OAAO79E,EAAA,EAA6C,OACtF69E,IACE+C,EACF,KAAK,sBAAsB/C,EAAIqD,EAAW,GAAKlhF,EAAM0sB,EAAI1M,CAAE,EAClDtb,IAAW,IAAK,IAAKuH,EAAevH,CAAM,GACnD,KAAK,sBAAsBm5E,EAAIn5E,EAAQ,KAAM1E,EAAM0sB,EAAI1M,CAAE,GAG7D,KAAK,eAAe1b,EAAMtE,CAAI,CAChC,EACA,YAAe,CACf,EACA,eAAkB,CAChB,IAAMgF,EAAM,KAAK,YAAY,IAAI,EACjC,EAAW,WAAa,EAAW,IAAMA,EACrC07E,EAAc,QAAU,IAC1B,EAAc,MAAQ17E,GAEpB27E,GAAiBA,EAAc,QAAU,IAC3C,EAAc,MAAQ37E,GAExB,IAAMmsD,EAAa,CAAC,EACpB,KAAK,cAAc,SAAS,CAACgwB,EAAOtD,KAAQ,CACtCsD,IACF,EAAWA,GAAS7qC,EAAa,YAAYunC,CAAE,EAEnD,CAAC,EACD,KAAK,aAAa79E,GAAQ,EACtBA,IAAS,SAAWA,IAAS,QAC/B,KAAK,aAAa,WAAa,GAE/B,KAAK,aAAa,MAAQ,EAC1B,KAAK,aAAa,MAAQ,GAE5B,KAAK,IAAI,QAAQ20B,EAAO,gBAAiB,CACvC,OACA,OACA,OACA,YACA,OAAQ7wB,EAAK,KACb,YACF,CAAC,CACH,EACA,QAAU,GAAU,CAElB,IAAMs9E,EAAS,CACb,KAAM59D,EAAW,YACjB,OAAQ1f,EAAK,KACb,QAASwc,EAAa,oBACtB,iBAAkBtgB,EAClB,OACA,OACA,YACA,QACA,IAAKqgB,EACL,MAAO,EACT,EACMghE,EAA4B,KAAK,OAAsC,MAC7E,GAAIhhE,EAAM,OAAS,aAAa,oBAAsBA,EAAM,MAAQ,sBAAwB,UAAWA,EACrG,EAAO,QAAUC,EAAa,uBACzB,GAAID,EAAM,OAAS,aAAa,mBAAqB,KAAK,wBAA0B,CAACghE,EAC1F,EAAO,YAAc7/D,GAA2B,EAAI,OAC/C,GAAInB,EAAM,OAAS45B,IAA4B,KAAK,oBAAsB,EAC/E,EAAO,YAAcz4B,GAA2B,EAAI,MAC/C,CACL,IAAM8/D,EAAmB,EAAE,KAAK,aAAathF,GAC7C,KAAK,KAAK,UAAUshF,EAAiB,GAAG,KAAK,IAAI,OAAO,oBAAoB,+BAA+BthF,EAAK,kBAAkBqhF,GAA0B,iBAAiB,EAAE,GAC3KC,GAAoB,KAAK,IAAI,OAAO,qBAAyBD,KAC/D,EAAO,MAAQ,GAEnB,CACA,KAAK,IAAI,QAAQ1sD,EAAO,MAAOysD,CAAM,CACvC,CACF,EACA,KAAK,IAAI,YAAYphF,EAAK,eAAe0sB,IAAKnK,EAAO,OAASA,EAAK,MAAQ,GAAG,MAAMze,EAAK,OAASyvC,EAAkB,KAAO,QAAU,QAAQ,GAAGzvC,EAAK,MAAM,OAAOkc,GAAI,EACtK,KAAK,OAAO09D,EAAW19E,EAAM,KAAK,UAAU,KAAK,OAAOA,EAAK,CAAC,CAChE,CACA,WAAW,EAAM,EAAO,EAAK,CAE3B,OADA,KAAK,IAAI,YAAYA,EAAK,WAAWijB,EAAM,GAAGje,GAAK,EAC5C,CACL,MAAO,SACP,YAAe,CACb,KAAK,eAAehF,EAAMijB,EAAOje,CAAG,CACtC,EACA,YAAe,CACf,EACA,eAAkB,CAChB,KAAK,IAAI,QAAQ2vB,EAAO,eAAgB,CACtC,MACF,CAAC,CACH,EACA,QAAU,GAAU,CAClB,KAAK,KAAK,oBAAoB1R,EAAM,GAAGje,EAAI,SAAShF,EAAK,gBAAiBqgB,CAAK,CACjF,CACF,CACF,CACA,iBAAiB,EAAO,EAAM,CAC5B,GAAM,CACJ,OACA,cACA,aACE/b,EACAtE,EACF,KAAK,OAAO,KAAK,WAAWA,EAAMm+D,EAAaC,CAAS,EAAGp+D,CAAI,EAE/D,KAAK,cAAc,SAAS,CAACmhF,KAAW,CAClCA,GACF,KAAK,OAAO,KAAK,WAAWA,EAAOhjB,EAAaC,CAAS,EAAG+iB,CAAK,CAErE,CAAC,CAEL,CACA,aAAa,EAAO,EAAM,CACxB,GAAM,CACJ,OACA,QACE78E,EACEi9E,EAAoB,CAAC,EACrB74B,EAAoBnmC,EAAOA,EAAK,kBAAoBze,EAAK,kBAC3D4kD,EAAkB3hD,EAAsB,YAC1Cw6E,EAAkB,KAAK,YAAY,GAE/B74B,EAAkB3hD,EAAsB,QAC1Cw6E,EAAkB,KAAK,OAAO,EAE5B74B,EAAkB3hD,EAAsB,QAC1Cw6E,EAAkB,KAAK,OAAO,GAiB9BA,EAAkB,SAAW,GAC/B,KAAK,KAAK,oEAAoEz9E,EAAK,KAAK,UAAUA,EAAK,MAAM,OAAOA,EAAK,IAAI,EAE/H,KAAK,iBAjBqB,CACxB,IAAMulD,EAAO,KAAK,YAAY,IAAI,EAClC,EAAK,MAAM,UAAU,IAAMA,EACvB9mC,IACF,EAAK,MAAM,UAAU,IAAM8mC,GAE7B,IAAMC,EAAQ/mC,EAAOA,EAAK,MAAQze,EAAK,MACvC,KAAK,IAAI,QAAQ6wB,EAAO,cAAe,CACrC,OACA,OACA,QACA,GAAI7wB,EAAK,IACX,CAAC,CACH,EAI+By9E,CAAiB,CAAC,CAAC,MAAO,GAAU,CACjE,KAAK,KAAK,8BAA8BlhE,GAAO,EAC/C,KAAK,mBAAmB,KAAK,iBAAiB,CAChD,CAAC,CACH,CACA,cAAc,EAAO,EAAM,CACzB,KAAK,YAAY,CACnB,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,kBAAoB,GAAK,CAAC,KAAK,cAAc,MAAM,CAACrgB,KAAU,CACxE,GAAIA,EAAM,CACR,IAAMoH,EAAQ,KAAK,OAAOpH,GAC1B,GAAIoH,EACF,MAAO,CAACA,EAAM,OAASA,EAAM,MAEjC,CACA,MAAO,EACT,CAAC,CACH,CACA,YAAY,EAAO,EAAM,CAEvB,KAAK,cAAc,SAAS,CAACpH,KAAU,CACrC,GAAIA,EAAM,CACR,IAAMoH,EAAQ,KAAK,OAAOpH,IACtB,CAACsE,EAAK,MAAQA,EAAK,OAAStE,KAC9B,EAAM,OAAS,GACVoH,EAAM,QACT,EAAM,MAAQ,GACd,KAAK,IAAI,GAAGpH,EAAK,oBAAoB,GAG3C,CACF,CAAC,EACD,IAAMwhF,EAAuC,KAAK,WAA8C,cAAiB,GACzF,KAAK,kBAAoB,GAAK,CAAC,KAAK,cAAc,MAAM,CAACxhF,KAAU,CACzF,IAAIyhF,EACJ,OAAOzhF,GAAQ,GAAG,EAAqB,KAAK,OAAOA,KAAU,MAAQyhF,EAAmB,MAC1F,CAAC,EAEKD,GACF,KAAK,IAAI,cAAc,EACvB,KAAK,mBAAqB,CACxB,KAAK,YAAY,EACjB,GAAM,CACJ,eACE,KACA,CAACxtC,GAAeA,EAAY,aAAe,OACzCA,GACF,KAAK,IAAI,qEAAqEA,EAAY,YAAY,GAI1G,KAAK,IAAI,mCAAmC,EAC5CA,EAAY,YAAY,EACxB,KAAK,IAAI,QAAQrf,EAAO,gBAAiB,IAAK,EAAC,EACjD,CAAC,IAED,KAAK,YAAY,EACjB,KAAK,IAAI,QAAQA,EAAO,gBAAiB,IAAK,EAAC,GAExCrwB,EAAK,OAAS,SACvB,KAAK,aAAa,CAEtB,CACA,aAAc,CACZ,KAAK,cAAc,SAAS,CAACtE,KAAU,CACrC,GAAIA,IAAS,KAAM,CACjB,IAAMoH,EAAQ,KAAK,OAAOpH,GACtBoH,IACF,EAAM,OAAS,GAEnB,CACF,CAAC,CACH,CACA,eAAe,EAAO,CACpB,WACC,CACIkS,EAAQ,UAAU,SAGvB,KAAK,QAAUA,EACf,KAAK,eAAe,EACtB,CACA,gBAAiB,CACf,KAAK,mBAAqB,CACxB,IAAMooE,EAAmB,KAAK,oBAAoB,EAC7CA,GAGL,KAAK,kBAAkBA,CAAgB,CACzC,CAAC,CACH,CACA,QAAQ,EAAO,EAAM,CACnB,GAAIp9E,EAAK,UAAYgc,EAAa,qBAAuBhc,EAAK,KAAM,CAElE,IAAM6rD,EAAqC7rD,EAAK,aAAkD,cAC9F2H,EAAekkD,CAAa,GAAKA,IAAkB7rD,EAAK,KAAK,OAC/D,KAAK,kBAAkB,CAE3B,CACF,CACA,mBAAoB,CAClB,KAAK,aAAe,CAClB,MAAO,EACP,MAAO,EACP,WAAY,CACd,CACF,CACA,aAAc,CACZ,GAAM,CACJ,MACA,UACA,SACE,KAIJ,GAHI,CAACg7B,GAAShmB,IAAY,MAGtB,CAAC,KAAK,kBACR,OAEF,IAAMR,EAAS2F,EAAI,OACby0B,EAAc5T,EAAM,YACpBqiD,EAAiBroE,EAAQ,oBACzBsoE,EAAmBtoE,EAAQ,MAAQR,EAAO,uBAAyB,KAAOA,EAAO,qBAAuBA,EAAO,iBACrH,GAAI7M,EAAe21E,CAAgB,GAAKA,GAAoB,EAAG,CAC7D,IAAMC,EAAsB,KAAK,IAAID,EAAkBD,CAAc,EAC/DG,EAA2B,KAAK,MAAM5uC,EAAcyuC,CAAc,EAAIA,EAAiBE,EAC7F,KAAK,gBAAgB3uC,EAAayuC,EAAgBG,CAAwB,CAC5E,CACA,IAAMC,EAA4BjpE,EAAO,0BACzC,GAAI7M,EAAe81E,CAAyB,GAAKA,EAA4B,EAAG,CAC9E,IAAMC,EAAoB,KAAK,IAAIlpE,EAAO,gBAAiBipE,CAAyB,EAC9EE,EAAuB,KAAK,IAAID,EAAmBL,CAAc,EACjEO,EAA4B,KAAK,MAAMhvC,EAAcyuC,CAAc,EAAIA,EAAiBM,EAC9F,KAAK,iBAAiB/uC,EAAayuC,EAAgBO,CAAyB,CAC9E,CACF,CACA,gBAAgB,EAAa,EAAgB,EAA0B,CACrE,KAAK,cAAc,SAAS,CAACliF,EAAM69E,KAAQ,CACzC,GAAIA,EAAI,CACN,IAAMntB,EAAWpa,EAAa,YAAYunC,CAAE,EAC5C,GAAIntB,EAAS,OAAS,GAAKoxB,EAA2BpxB,EAAS,MAAM,CAAC,EAAG,CACvE,IAAIyxB,EACJ,KAAK,IAAI,QAAQxtD,EAAO,oBAAqB,CAC3C,UAAWmtD,CACb,CAAC,EACD,IAAM16E,EAAQ,KAAK,OAAOpH,GAC1B,IAAK,EAAgB,KAAK,UAAY,MAAQmiF,EAAc,KAC1D,KAAK,IAAI,QAAQxtD,EAAO,yBAA0B,CAChD,UAAWmtD,CACb,CAAC,OACI,GAAI16E,GAAS,MAAQA,EAAM,MAAO,CACvC,KAAK,IAAI,gBAAgBpH,EAAK,kDAAkD,EAChF,MACF,CACA,KAAK,IAAI,QAAQ20B,EAAO,gBAAiB,CACvC,YAAa,EACb,UAAWmtD,EACX,MACF,CAAC,CACH,CACF,CACF,CAAC,CACH,CACA,iBAAiB,EAAa,EAAgB,EAA2B,CACvE,KAAK,cAAc,SAAS,CAAC9hF,EAAM69E,KAAQ,CACzC,GAAIA,EAAI,CACN,IAAMntB,EAAWpa,EAAa,YAAYunC,CAAE,EACtCuE,EAAoB1xB,EAAS,OACnC,GAAI0xB,EAAoB,EACtB,OAEF,IAAM9pB,EAAc5H,EAAS,MAAM0xB,EAAoB,CAAC,EAClDhjE,EAAYsxC,EAAS,IAAI0xB,EAAoB,CAAC,EACpD,GAAIF,EAA4B5pB,GAAeplB,GAAeolB,GAAeplB,GAAe9zB,EAC1F,OAEF,KAAK,IAAI,QAAQuV,EAAO,gBAAiB,CACvC,YAAa2jC,EACb,UAAW,IACX,MACF,CAAC,CACH,CACF,CAAC,CACH,CACA,qBAAsB,CAEpB,GAAM,CACJ,UACA,eACE,KACJ,GAAI,CAACh/C,GAAW,CAAC,KAAK,OAAU06B,GAA2C,aAAgB,OACzF,OAAO,KAET,IAAMrrB,EAAcrP,EAAQ,KAC5B,GAAIA,EAAQ,MAAQ,KAAK,IAAI,OAAO,qBAAsB,CAExD,GADYA,EAAQ,UAAU,QACjB06B,EAAY,qBAAsB,CAC7C,IAAM/wB,EAAQ,KAAK,IAAI,EAAG3J,EAAQ,aAAa,EAE/C,MAAO,CACL,SAAU,IACV,QACA,IAJU,KAAK,IAAI2J,EAAO0F,CAIxB,CACJ,CACF,CACA,MAAO,CACL,SAAU,GACZ,CACF,CACA,IAAM05D,EAAuC,KAAK,WAA+C,SACjG,GAAIA,EAIF,OAHKp2E,EAAeo2E,CAAgB,EAG7B,CACL,SAAUA,CACZ,EAJS,KAMX,IAAMC,EAAgB,KAAK,MAAM,SAOjC,OALI35D,GADe1c,EAAe+nC,EAAY,QAAQ,EAAIA,EAAY,SAAW,IACjDrrB,EAAc25D,GAAiB,CAACr2E,EAAeq2E,CAAa,EACnF,CACL,SAAU35D,CACZ,EAEK,IACT,CACA,kBAAkB,CAChB,WACA,QACA,OACC,CACD,IAAMqrB,EAAc,KAAK,YACpB,KAAK,OAAUA,GAAeA,EAAY,aAAe,SAG1DA,EAAY,WAAap0B,IACvB3T,EAAe2T,CAAQ,GACzB,KAAK,IAAI,oCAAoCA,EAAS,QAAQ,CAAC,GAAG,EAEpE,EAAY,SAAWA,GAErBqD,IAAU,IAAK,IAAKje,IAAQ,IAAK,KACnC,KAAK,IAAI,kCAAkCgvC,EAAY,SAAS,8BAA8B/wB,EAAM,GAAGje,EAAI,EAAE,EAC7GgvC,EAAY,qBAAqB/wB,EAAOje,CAAG,GAE/C,CACA,IAAI,aAAc,CAChB,IAAMu9E,EAAoB,KAAK,kBAC/B,OAAOA,EAAoB,IAAMA,GAAqB,KAAK,wBAA0B,KAAK,UAAU,KAAK,OAAO,UAAU,EAC5H,CACA,oBAAqB,CACnB,GAAM,CACJ,yBACA,oBACA,UACE,KAEJ,GADA,KAAK,IAAI,gCAAgCA,EAAkB,0BAA0BC,EAAuB,IAAI5mE,EAAUrQ,CAAM,GAAG,EAC/H,KAAK,YAAa,CAEpB,IAAMqzE,EAA2C,KAAK,cAAqD,OACvGA,GAAqB,OAAO,KAAKA,CAAiB,CAAC,CAAC,OACtD,KAAK,kBAAkB,EAEvB,KAAK,oBAAoB,CAE7B,CACF,CACA,eAAgB,CACd,GAAI,KAAK,kBAAmB,CAC1B,IAAMrzE,EAAS,CAAC,EAChB,KAAK,cAAc,SAAS,CAACvL,EAAMyE,KAAY,CAC7C,GAAIzE,EAAM,CACR,IAAMoH,EAAQ,KAAK,OAAOpH,GAC1B,EAAOA,GAAQ,CACb,SACA,UAAWoH,EAAM,UACjB,MAAOA,EAAM,MACb,aAAcA,EAAM,aACpB,WAAYA,EAAM,WAClB,GAAIA,EAAM,GACV,SAAUA,EAAM,QAClB,CACF,CACF,CAAC,EACD,KAAK,IAAI,QAAQutB,EAAO,eAAgB,CACtC,QACF,CAAC,EACD,KAAK,IAAI,yCAAyC,KAAK,gBAAgB,EACvE,KAAK,cAAc,SAAS,CAAC30B,KAAU,CACrC,KAAK,YAAYA,CAAI,CACvB,CAAC,CACH,KAAO,CACL,IAAMqgB,EAAQ,gBAAI,MAAM,mDAAmD,EAC3E,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,iCACtB,MAAO,GACP,QACA,OAAQD,EAAM,OAChB,CAAC,CACH,CACF,CACA,qBAAsB,CACpB,GAAM,CACJ,SACA,gBACA,eACE,KACJ,GAAI,CAAC2zB,EACH,MAAU,MAAM,sDAAsD,EAExE,IAAK,IAAM8qC,KAAavzE,EAAQ,CAC9B,IAAMvL,EAAO8+E,EACP13E,EAAQmE,EAAOvL,GACrB,GAAI,KAAK,UAAUoH,CAAK,EAAG,CACzB,IAAMI,EAAQ,KAAK,cAAcJ,EAAOpH,CAAI,EACtCwV,EAAW,GAAGpO,EAAM,UAAU,UAAUI,IAC9C,EAAM,MAAQA,EACd,KAAK,IAAI,yBAAyBgO,EAAS,GAAG,KAAK,UAAUxV,CAAI,EAAI,UAAY,GAAG,GAAG4b,EAAUxU,CAAK,GAAG,EACzG,GAAI,CACF,IAAMy2E,EAAK7pC,EAAY,gBAAgBx+B,CAAQ,EACzCupE,EAAUx/C,GAAwBv/B,CAAI,EAE5C,EAAc++E,GAAW,CADR/+E,EAAM69E,CACQ,EAC/B,EAAM,OAASA,CACjB,OAASx9D,EAAO,CACd,IAAIoiE,EACJ,KAAK,MAAM,2CAA2CpiE,EAAM,SAAS,EACrE,KAAK,oBAAoBrgB,CAAI,GAC5B,EAAuB,KAAK,iBAAmB,MAAQyiF,EAAqB,eAAe,EAC5F,OAAO,KAAK,OAAOziF,GACnB,KAAK,IAAI,QAAQ20B,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,uBACtB,MAAO,GACP,QACA,iBAAkBtgB,EAClB,WACA,OAAQoH,EAAM,EAChB,CAAC,EACD,MACF,CACA,KAAK,kBAAkBpH,EAAMoH,CAAK,CACpC,CACF,CACA,KAAK,cAAc,CACrB,CACA,cAAc,EAAO,EAAW,CAC9B,IAAMs7E,EAAoBt7E,EAAM,aAC5B24E,EAAa34E,EAAM,MACnBs7E,IAAsB5D,IAAc,SAAWA,IAAc,eAAiB3rE,GAA8BuvE,EAAmB,OAAO,IACxI,EAAapuE,GAAkByrE,EAAY2C,CAAiB,GAE9D,IAAMl7E,EAAQkN,GAA0BqrE,EAAY34E,EAAM,UAAU,EAOpE,OANII,EACEs3E,EAAU,MAAM,EAAG,CAAC,IAAM,QACrB3qE,GAAuB3M,EAAO,KAAK,YAAY,EAEjDA,EAEF,EACT,CACA,kBAAkB,EAAM,EAAO,CAC7B,IAAM/C,EAAS2C,EAAM,OACrB,GAAI,CAAC3C,EACH,OAEF,IAAM+C,EAAQ,KAAK,cAAcJ,EAAOpH,CAAI,EAC5C,KAAK,OAAOA,GAAQ,CAClB,SACA,QACA,UAAWoH,EAAM,UACjB,WAAYA,EAAM,WAClB,aAAcA,EAAM,aACpB,SAAUA,EAAM,SAChB,GAAIA,EAAM,GACV,UAAW,CAAC,CACd,EACA,KAAK,sBAAsBpH,CAAI,EAC/B,KAAK,kBAAkBA,EAAM,cAAe,KAAK,eAAe,EAChE,KAAK,kBAAkBA,EAAM,YAAa,KAAK,aAAa,EAC5D,KAAK,kBAAkBA,EAAM,QAAS,KAAK,eAAe,EACtD,KAAK,cACP,KAAK,kBAAkBA,EAAM,kBAAmB,EAAO,IAAU,CAC/D,IAAM2iF,EAAgBrwD,EAAM,cACxBqwD,GAAiB,MAAQA,EAAc,QACzC,KAAK,IAAI,QAAQhuD,EAAO,eAAgB,CACtC,KAAMwsD,CACR,CAAC,CAEL,CAAC,CAEL,CACA,IAAI,UAAW,CACb,IAAInhB,EAAc4iB,EAElB,SADgB,EAAe,KAAK,QAAU,OAAS,EAAwB5iB,EAAa,gBAAkB,KAAO,IAAK,GAAI4iB,EAAsB,KAAK5iB,EAAc,QAAQ,IAAM,KAAK,MACnL,EAA+B,GACxC,CACA,gBAAgB,EAAM,CACpB,IAAM0d,EAAY,KAAK,UAAU19E,CAAI,EAChC09E,GAGLA,EAAU,QAAQ,CACpB,CACA,cAAc,EAAM,CAElB,GAA2B,KAAK,aAAmD,aAAgB,SAAU,CAC3G,KAAK,YAAY19E,CAAI,EACrB,MACF,CACA,IAAM09E,EAAY,KAAK,UAAU19E,CAAI,EAChC09E,IAGLA,EAAU,WAAW,EACrB,KAAK,oBAAoB19E,CAAI,EAC/B,CACA,gBAAgB,EAAM,EAAO,CAE3B,IAAMqgB,EAAQ,gBAAI,MAAM,GAAGrgB,EAAK,+CAAqE,KAAK,aAAmD,YAAY,EACzK,KAAK,MAAM,GAAGqgB,IAASiS,CAAK,EAC5B,KAAK,IAAI,QAAQqC,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,uBACtB,iBAAkBtgB,EAClB,QACA,MAAO,EACT,CAAC,EACD,IAAM09E,EAAY,KAAK,UAAU19E,CAAI,EACjC09E,GACFA,EAAU,QAAQr9D,CAAK,CAE3B,CACA,sBAAsB,EAAI,EAAiB,EAAW,EAAM,EAAI,EAAI,CAClE,IAAMsO,EAAQk0D,EAAkBhF,EAAG,gBAC/B,KAAK,IAAIlvD,CAAK,GAAKuuC,IACrB,KAAK,IAAI,YAAYl9D,EAAK,mCAAmC6iF,EAAgB,QAAQn2D,EAAG,OAAO1M,EAAG,EAAE,EACpG,EAAG,gBAAkB6iE,EAEzB,CACA,eAAe,EAAM,EAAa,EAAW,CAC3C,GAAM,CACJ,QACA,eACE,KACEz7E,EAAQ,KAAK,OAAOpH,GACpB69E,EAAKz2E,GAA+B,OAC1C,GAAI,CAACk4B,GAAS,CAAC0U,GAAe,CAAC6pC,EAAI,CACjC,KAAK,KAAK,iCAAiC79E,EAAK,qCAAqC,EACrF,KAAK,oBAAoBA,CAAI,EAC7B,MACF,CACA,IAAMsiF,EAAgBr2E,EAAeqzB,EAAM,QAAQ,EAAIA,EAAM,SAAW,IAClEwjD,EAAa72E,EAAe+nC,EAAY,QAAQ,EAAIA,EAAY,SAAW,IAC3E+uC,EAAc,KAAK,IAAI,EAAG5kB,CAAW,EACrC6kB,EAAY,KAAK,IAAI5kB,EAAWkkB,EAAeQ,CAAU,EAC3DE,EAAYD,IAAgB,CAAC37E,EAAM,QAAUA,EAAM,QACrD,EAAM,MAAQ,GACd,KAAK,IAAI,aAAa27E,EAAY,GAAGC,EAAU,aAAahjF,EAAK,cAAc,EAC/E69E,EAAG,OAAOkF,EAAaC,CAAS,GAEhC,KAAK,oBAAoBhjF,CAAI,CAEjC,CACA,eAAe,EAAM,EAAM,CACzB,IAAMoH,EAAQ,KAAK,OAAOpH,GACpB69E,EAAKz2E,GAA+B,OAC1C,GAAI,CAACy2E,EACH,MAAM,IAAI3jC,GAAuB,+BAA+Bl6C,EAAK,qCAAqC,EAE5G,EAAM,OAAS,GACf,EAAM,MAAQ,GACd69E,EAAG,aAAav5E,CAAI,CACtB,CACA,eAAe,EAAU,CACvB,GAAI,KAAK,WAAW,GAAK,KAAK,SAAS,EACrC,KAAK,aAAa0mC,CAAQ,CAAC,CAAC,MAAO,GAAU,CAC3C,KAAK,KAAK,iCAAiC3qB,GAAO,EAClD,KAAK,mBAAmB,KAAK,iBAAiB,CAChD,CAAC,OAED,GAAI,CACF2qB,EAAS,CACX,OAAS3qB,EAAO,CACd,KAAK,KAAK,iCAAiC,KAAK,eAAe,GAAGA,GAAO,CAC3E,CAEJ,CACA,YAAa,CACX,OAAO,KAAK,cAAc,MAAM,CAACrgB,EAAM69E,KAAQ79E,GAAQ69E,EAAG,QAAQ,CACpE,CACA,UAAW,CACT,OAAO,KAAK,cAAc,MAAM,CAAC79E,KAAUA,GAAQ,CAAC,CAAC,KAAK,UAAUA,CAAI,CAAC,CAC3E,CACA,UAAU,EAAO,CACf,MAAO,CAAC,CAACoH,GAAS,CAACA,EAAM,MAC3B,CACA,aAAa,EAAa,EAAc,KAAK,kBAAmB,CAC9D,GAAI,CAAC67E,EAAY,OAEf,OADA,KAAK,IAAI,0DAA0D,EAC5D,QAAQ,QAAQ,CAAC,CAAC,KAAKC,CAAW,EAE3C,GAAM,CACJ,kBACE,KACEC,EAAqBF,EAAY,IAAK,GAAS,KAAK,cAAcjjF,CAAI,CAAC,EAK7E,OAJqBijF,EAAY,OAAS,GAAO,KAAK,oBAEpD,KAAK,aAAa,EAEb,QAAQ,IAAIE,CAAkB,CAAC,CAAC,KAAM,GAAW,CAClD7C,IAAmB,KAAK,iBAG5B4C,EAAY,EACZ,KAAK,mBAAmB,KAAK,iBAAiB,EAChD,CAAC,CACH,CACA,mBAAmB,EAAa,CAC9BD,EAAY,QAAS,GAAS,CAE5B,IAAMpF,EAA2B,KAAK,OAAO79E,EAAA,EAA6C,OACrF69E,GAAM,GAAG,UAGd,KAAK,oBAAoB79E,CAAI,CAC/B,CAAC,CACH,CACA,OAAO,EAAW,EAAM,EAAS,CAC3B,KAAK,gBACP,KAAK,eAAe,OAAO09E,EAAW19E,EAAM29E,CAAO,CAEvD,CACA,cAAc,EAAM,CAClB,GAAI,KAAK,eACP,OAAO,KAAK,eAAe,cAAc39E,CAAI,CAEjD,CACA,UAAU,EAAM,CAId,OAHI,KAAK,eACA,KAAK,eAAe,QAAQA,CAAI,EAElC,IACT,CACA,YAAY,EAAM,CACZA,GAAQ,KAAK,gBACf,KAAK,eAAe,YAAYA,CAAI,CAExC,CACA,oBAAoB,EAAM,CACpB,KAAK,gBACP,KAAK,eAAe,oBAAoBA,CAAI,CAEhD,CACA,IAAI,mBAAoB,CACtB,OAAO,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,QAAQ,EAAK,IAASqW,GAAO,QAAK,UAAU,KAAK,OAAOrW,EAAK,EAAY,CAAC,CAC5G,CACA,IAAI,mBAAoB,CACtB,OAAO,KAAK,cAAc,QAAQ,EAAK,CAACA,KAAUqW,GAAO,KAAe,CAAC,CAC3E,CACA,IAAI,mBAAoB,CACtB,OAAO,KAAK,cAAc,KAAK,CAACrW,KAAUA,CAAI,CAAC,CAAC,OAAQ,GAAS,CAAC,CAACA,CAAI,CACzE,CACA,kBAAkB,EAAM,EAAO,EAAI,CACjC,IAAMoH,EAAQ,KAAK,OAAOpH,GAC1B,GAAI,CAACoH,EACH,OAEF,IAAM3C,EAAS2C,EAAM,OACrB,GAAI,CAAC3C,EACH,OAEF,IAAM4sB,EAAWY,EAAG,KAAK,KAAMjyB,CAAI,EACnCoH,EAAM,UAAU,KAAK,CACnB,QACA,UACF,CAAC,EACD3C,EAAO,iBAAiB6tB,EAAOjB,CAAQ,CACzC,CACA,sBAAsB,EAAM,CAC1B,IAAMjqB,EAAQ,KAAK,OAAOpH,GAC1B,GAAI,CAACoH,EACH,OAEF,IAAM3C,EAAS2C,EAAM,OAChB3C,IAGL2C,EAAM,UAAU,QAAS,GAAM,CAC7B3C,EAAO,oBAAoBmuB,EAAE,MAAOA,EAAE,QAAQ,CAChD,CAAC,EACD,EAAM,UAAU,OAAS,EAC3B,CACF,EAgBM,GAAN,MAAMwnB,CAAmB,CACvB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,WAAa,IAAK,GACvB,KAAK,MAAQ,IAAK,GAClB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,MAAQ,IAAK,GAClB,KAAK,WAAa,IAAK,GACvB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,IAAM37B,EACX,KAAK,iBAAmB,IACxB,KAAK,WAAa,GAClB,KAAK,MAAQ,KACb,KAAK,iBAAmB,CAAC,EACzB,KAAK,MAAQ,IAAK,GAClB,KAAK,WAAa,KAClB,KAAK,kBAAkB,CACzB,CACA,oBAAoB,EAAkB,CACpC,KAAK,iBAAmB2kE,CAC1B,CACA,SAAU,CACJ,KAAK,KACP,KAAK,mBAAmB,EAEtB,KAAK,OACP,KAAK,YAAY,EAEnB,KAAK,MAAQ,KACb,KAAK,WAAa,KAClB,KAAK,IAAM,KAAK,iBAAmB,IACrC,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACJ3kE,EAAI,GAAGkW,EAAO,uBAAwB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CAC5D,CACA,oBAAqB,CACnB,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,uBAAwB,KAAK,sBAAuB,IAAI,EACvElW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CAC7D,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAMprB,EAAQ,KAAK,IAAI,OAAOjF,EAAK,cAC/B,KAAK,eAAeiF,CAAK,GAC3B,KAAK,iBAAiB,KAAK,CACzB,QAASA,EAAM,QACf,OAAQA,EAAM,OACd,MAAOA,EAAM,KACf,CAAC,CAEL,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,MAAQjF,EAAK,iBAAiB,iBAAmBA,EAAK,MAAQ,KACnE,KAAK,WAAa,KACd,KAAK,OAAS,KAAK,IAAI,OAAO,QAChC,KAAK,iBAAiB,CAE1B,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAMma,EAAM,KAAK,IACjB,KAAK,iBAAmB,CAAC,EACzB,KAAK,WAAana,EAAK,WACnBma,EAAI,OAAO,sBAAwBna,EAAK,OAC1C,KAAK,aAAa,CAEtB,CACA,gBAAgB,EAAO,EAAM,CACvB,KAAK,OAAS2H,EAAe,KAAK,gBAAgB,GACpD,KAAK,iBAAiB,CAE1B,CACA,eAAe,EAAO,EAAM,CACd,KAAK,IACT,OAAO,sBAAwB3H,EAAK,OAC1C,KAAK,aAAa,CAEtB,CACA,kBAAmB,CACjB,KAAK,YAAY,EACjB,KAAK,MAAQ,IACf,CACA,kBAAmB,CACjB,GAAI,KAAK,MAAO,CACd,GAAI,KAAK,aAAe,GAAK,KAAK,YAAc,EAAG,CACjD,KAAK,WAAa,KAClB,MACF,CACA,IAAM8X,EAAS,KAAK,IAAI,OACxB,GAAIA,EAAO,OAAQ,CACjB,IAAMqC,EAAM,KAAK,IACX4kE,EAAW,KAAK,YAAYjnE,EAAO,OAAS,CAAC,EAC/CinE,IAAa,KAAK,kBACpB5kE,EAAI,OAAO,IAAI,+BAA+B4kE,EAAS,IAAIjnE,EAAOinE,EAAS,CAAC,OAAO,IAAIjnE,EAAOinE,EAAS,CAAC,QAAQ,aAAa,KAAK,WAAW,GAAG,KAAK,aAAa,EAEpK,EAAI,iBAAmBA,EACnB5kE,EAAI,kBAAoBA,EAAI,iBAAmB,KAAK,kBAAoB,KAAK,kBAC/E,KAAK,iBAAiB,gBAAgB,EAExC,KAAK,iBAAmBA,EAAI,gBAC9B,CACF,CACF,CACA,YAAY,EAAe,CACzB,IAAMrC,EAAS,KAAK,IAAI,OACxB,GAAI,CAACA,EAAO,OACV,MAAO,GAET,IAAMknE,EAAclnE,EAAO,QAAQ,EAAO,IAAU,KAAK,eAAe7S,CAAK,GAAK5D,GAAS49E,CAAa,EAExG,MADA,MAAK,WAAa,KACXnpC,EAAmB,uBAAuBkpC,EAAa,KAAK,WAAY,KAAK,WAAW,CACjG,CACA,cAAe,CACT,KAAK,QAGT,KAAK,iBAAmB,IACxB,KAAK,cAAc,KAAK,KAAK,EAC7B,KAAK,MAAQ,KAAK,YAAY,KAAK,iBAAiB,KAAK,IAAI,EAAG,GAAG,EACnE,KAAK,iBAAiB,EACxB,CACA,aAAc,CACZ,KAAK,iBAAmB,CAAC,EACzB,KAAK,WAAa,GAClB,KAAK,iBAAmB,IACxB,AAEE,KAAK,SADL,KAAK,cAAc,KAAK,KAAK,EAChB,IAAK,GAEtB,CACA,eAAgB,CACd,GAAI,KAAK,WACP,OAAO,KAAK,WAEd,IAAMhkD,EAAQ,KAAK,MACbkkD,EAAa,CACjB,MAAO,EACP,OAAQ,CACV,EACA,GAAIlkD,EAAO,CACT,IAAMmkD,EAAankD,EAAM,sBAAsB,EAC/C,EAAW,MAAQmkD,EAAW,MAC9B,EAAW,OAASA,EAAW,OAC3B,CAACD,EAAW,OAAS,CAACA,EAAW,SACnC,EAAW,MAAQC,EAAW,MAAQA,EAAW,MAAQnkD,EAAM,OAAS,EACxE,EAAW,OAASmkD,EAAW,OAASA,EAAW,KAAOnkD,EAAM,QAAU,EAE9E,CAEA,MADA,MAAK,WAAakkD,EACXA,CACT,CACA,IAAI,YAAa,CACf,OAAO,KAAK,cAAc,CAAC,CAAC,MAAQ,KAAK,kBAC3C,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,cAAc,CAAC,CAAC,OAAS,KAAK,kBAC5C,CACA,IAAI,oBAAqB,CACvB,IAAIza,EAAa,EACjB,GAAI,CAAC,KAAK,IAAI,OAAO,uBACnB,GAAI,CACF,EAAa,KAAK,gBACpB,MAAY,CACZ,CAEF,OAAO,KAAK,IAAIA,EAAY,KAAK,IAAI,OAAO,mBAAmB,CACjE,CACA,eAAe,EAAO,CAEpB,MAAO,CADkB,KAAK,iBACL,KAAM,GACtBx/D,EAAM,UAAYm6E,EAAgB,SAAWn6E,EAAM,QAAUm6E,EAAgB,OAASn6E,EAAM,SAAWm6E,EAAgB,MAC/H,CACH,CACA,OAAO,uBAAuB,EAAQ,EAAO,EAAQ,CACnD,GAAI,EAAEtnE,GAAU,MAAQA,EAAO,QAC7B,MAAO,GAET,IAAMunE,GAAuB,EAAU,IACrC,CAAKp1B,GAGEq1B,EAAS,QAAUr1B,EAAU,OAASq1B,EAAS,SAAWr1B,EAAU,OAEzEs1B,EAAgBznE,EAAO,OAAS,EAC9B0nE,EAAa,KAAK,IAAIhsE,EAAOC,CAAM,EACzC,IAAK,IAAIpY,EAAI,EAAGA,EAAIyc,EAAO,OAAQ,GAAK,EAAG,CACzC,IAAM7S,EAAQ6S,EAAOzc,GACrB,IAAK4J,EAAM,OAASu6E,GAAcv6E,EAAM,QAAUu6E,IAAeH,EAAoBp6E,EAAO6S,EAAOzc,EAAI,EAAE,EAAG,CAC1G,EAAgBA,EAChB,KACF,CACF,CACA,OAAOkkF,CACT,CACF,EAYM,GAAiB,CAVrB,SAAU,IACV,MAAO,IACP,MAAO,IACP,MAAO,KACP,KAAM,IACN,QAAS,IACT,WAAY,KACZ,IAAK,IACL,MAAO,GAEyB,EAI5B,GAAsB,CAF1B,IAAK,GAEqC,EACtC,GAAN,MAAM7hD,CAAO,CACX,YAAY,EAAO,EAAQ,CACrB,MAAM,QAAQvwB,CAAK,IACrB,EAAQA,EAAM,IAAK,GAAMs5B,aAAa/I,EAAS+I,EAAI,IAAI/I,EAAO+I,CAAC,CAAC,GAElE,KAAK,MAAQt5B,EACb,KAAK,OAASqwB,CAChB,CACF,EACM,GAAO,OAwBP,GAAN,KAAc,CACZ,YAAY,EAAa,CACvB,KAAK,YAActK,CACrB,CACF,EACM,GAAY,YACZ,GAAU,UAUV,GAAQ,gBAOR,GAAU,UA0BV,GAAU,UASV,GAAS,SACT,GAAe,mBAUf,GAAQ,QAsCR,GAAM,MAyDN,GAAc,cACd,EAAe,eACf,GAAe,eACf,GAAc,cACd,GAAkB,CACtB,GAAI+iB,GACJ,GAAIA,GACJ,EAAGA,GACH,GAAIA,GACJ,GAAIA,GACJ,IAAKA,GACL,GAAIA,GACJ,IAAKA,GACL,IAAKA,GACL,IAAKA,GACL,GAAIC,EACJ,GAAIA,EACJ,IAAKA,EACL,GAAIA,EACJ,IAAKA,EACL,IAAKA,EACL,IAAKA,EACL,IAAKA,EACL,GAAIA,EACJ,GAAIA,EACJ,IAAKA,EACL,GAAIA,EACJ,KAAMA,EACN,MAAOA,EACP,KAAMA,EACN,MAAOA,EACP,MAAOA,EACP,KAAMA,EACN,GAAIA,EACJ,GAAIA,EACJ,GAAIA,EACJ,IAAKC,GACL,GAAIA,GACJ,GAAIA,GACJ,IAAKA,GACL,GAAIA,GACJ,EAAGA,GACH,IAAKA,GACL,GAAIC,GACJ,IAAKA,GACL,IAAKA,GACL,IAAKA,GACL,GAAIA,GACJ,GAAIA,GACJ,GAAIA,GACJ,EAAGA,EACL,EACM,GAAkB,CACtB,QAASF,CACX,EAgCM,GAAkB,QAoBlB,GAAa,GAAU,KAAK,MAAM/oC,CAAK,EACvC,IAAa,EAAO,IACpB,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAK,GAASmpC,GAAUpY,EAAMD,CAAO,CAAC,EAEjD9wB,aAAiBuwB,IAAU,OAAOvwB,EAAM,OAAU,SAC7C,IAAIuwB,GAAO4Y,GAAUnpC,EAAM,MAAO8wB,CAAO,EAAG9wB,EAAM,MAAM,GAE3D8wB,EAAQ,UACV,EAAQgB,GAAkB9xB,EAAO8wB,EAAQ,OAAO,GAE3CA,EAAQ,UAAY,EAAI,mBAAmB9wB,CAAK,EAAIA,GAGzD,GAAa,GAAUkpC,GAAUlpC,EAAQ,GAAG,EAAI,IAChD,IAAO,EAAO,IAAY,CAC9B,IAAIsyE,EAAWtyE,EAQf,OAPI8wB,EAAQ,SAAW,IACjB9wB,aAAiBuwB,IAAU,OAAOvwB,EAAM,OAAU,SACpD,EAAW,IAAIuwB,GAAO,CAACvwB,CAAK,CAAC,EACpB,OAAOA,GAAU,WAC1B,EAAW,CAACA,CAAK,IAGdmpC,GAAUmpC,EAAUxhD,CAAO,CACpC,EACM,GAAqB,CACzB,GAAIoY,GACJ,EAAGA,GACH,GAAIE,GACJ,GAAIA,GACJ,IAAKA,GACL,OACA,IAAKA,GACL,GAAIF,EACN,EACM,GAAoB,UACpB,GAAqB,WACrB,GAAmB,gIAA8L,EACjN,GAAkB,CAAC,GAAG,EACtB,GAAmB,kCAOnB,GAAoB,CAAC,IAAK,KAAM,MAAO,KAAM,MAAO,IAAI,EAIxD,GAAqB,CAAC,QAAS,QAAS,KAAM,OAAQ,OAAQ,QAAS,OAAQ,KAAK,EAIpF,GAAe,CAAC,KAAM,KAAM,KAAM,MAAO,IAAK,KAAM,MAAO,MAAO,MAAO,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,KAAM,KAAM,GAAG,EAI9H,GAAY,EACf7V,IAAqBZ,IACrBa,IAAkBlB,IAClBY,IAAoBT,EACvB,EA4EM,GAAa,OAuBb,GAAQ,cAYR,GAAN,KAAqB,CACnB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,OAAS,IAAK,GACnB,KAAK,MAAQ,IAAK,GAClB,KAAK,IAAM,IAAK,GAChB,KAAK,IAAM,IAAK,GAChB,KAAK,WAAa,GAClB,KAAK,YAAc,IAAK,GACxB,KAAK,YAAc,GACnB,KAAK,QAAU,GACf,KAAK,UAAY,GACjB,KAAK,YAAc,IAAK,GACxB,KAAK,YAAc,IAAK,GACxB,KAAK,cAAkB,CACjB,KAAK,cACP,KAAK,QAAU,IAEjB,KAAK,UAAY,EACnB,EACA,KAAK,cAAkB,CACrB,AACE,KAAK,cAAc,GAErB,KAAK,UAAY,EACnB,EACA,KAAK,kBAAqB,GAAY,CACpC,GAAI,CACF,KAAK,MAAMvjC,EAAS,CAClB,GAAI45C,GAAe,SACnB,GAAI,CAAC,KAAK,WACZ,CAAC,CACH,OAASh6B,EAAO,CACd,KAAK,IAAI,OAAO,KAAK,yCAA0CA,CAAK,CACtE,CACF,EACA,KAAK,kBAAqB,GAAY,CACpC,GAAI,CACF,GAAM,CACJ,OACA,QACE5f,EACE8I,EAAQ,KAAK,IAAI,OAAOzF,EAAK,OAC7BkgF,EAAK,KAAK,cAAclgF,CAAI,EAC5BQ,EAAO,CACX,GAAIie,GAAQze,EAAA,CAAM,SAAW,IAC7B,IACF,GACIkgF,IAAO3pC,GAAe,OAAS2pC,IAAO3pC,GAAe,OAAS2pC,GAAM3pC,GAAe,SACrF,EAAK,GAAK9wC,EAAM,QAAU,IAC1B,EAAK,GAAK,KAAK,gBAAgBy6E,CAAE,EAAI,IACrC,EAAK,GAAK,KAAK,gBAAgBA,CAAE,GAEnC,IAAMC,EAAO1hE,EAAO,KAAK,YAAYA,CAAI,EAAI,KAAK,YAAYze,CAAI,EAC9DmgF,GAAQ,MAAQA,EAAK,KAAOA,EAAK,MAAQngF,EAAK,MAChD,EAAK,IAAMmgF,EAAK,KAElB,KAAK,MAAMxjF,EAAS6D,CAAI,CAC1B,OAAS+b,EAAO,CACd,KAAK,IAAI,OAAO,KAAK,wCAAyCA,CAAK,CACrE,CACF,EACA,KAAK,IAAM5B,EACX,IAAM3F,EAAS,KAAK,OAAS2F,EAAI,OAC3B,CACJ,QACE3F,EACAkqB,GAAQ,OACV,EAAO,QAAU,KAAK,qBAAqB,EAC3C,EAAO,QAAU,KAAK,qBAAqB,EAC3C,KAAK,IAAMA,EAAK,WAAavkB,EAAI,UACjC,KAAK,IAAMukB,EAAK,UAChB,KAAK,WAAaA,EAAK,aAAe,GACtC,KAAK,YAAcA,EAAK,YACxB,KAAK,kBAAkB,EAE3B,CACA,mBAAoB,CAClB,IAAMvkB,EAAM,KAAK,IACjBA,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,CAC1D,CACA,qBAAsB,CACpB,IAAMlW,EAAM,KAAK,IACjBA,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,CAC3D,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,IAAM,KAAK,OAAS,KAAK,YAAc,KAAK,YAAc,KAC/D,KAAK,UAAY,KAAK,UAAY,KAAK,MAAQ,IACjD,CACA,gBAAgB,EAAO,EAAM,CAC3B,KAAK,MAAQrwB,EAAK,MAClB,KAAK,MAAM,iBAAiB,UAAW,KAAK,SAAS,EACrD,KAAK,MAAM,iBAAiB,UAAW,KAAK,SAAS,CACvD,CACA,iBAAkB,CAChB,AAKA,KAAK,SAFL,KAAK,MAAM,oBAAoB,UAAW,KAAK,SAAS,EACxD,KAAK,MAAM,oBAAoB,UAAW,KAAK,SAAS,EAC3C,KACf,CACA,gBAAgB,EAAO,EAAM,CAE3B,KAAK,YAAoCA,EAAK,OAAO,OAA6C,OAClG,KAAK,YAAoCA,EAAK,OAAO,OAA6C,MACpG,CACA,YAAa,CAEX,MAAO,CACL,EAAG,EACH,GAAIg2C,GAAoB,IACxB,IAAK,KAAK,IACV,IAAK,KAAK,IACV,GAAmB,KAAK,OAAsC,aAC9D,IAAK,KAAK,IAAI,kBAAoB,GACpC,CACF,CACA,MAAM,EAAS,EAAO,CAAC,EAAG,CACxBn7C,EAASmF,EAAM,KAAK,WAAW,CAAC,EAChC,IAAM4/E,EAAU5/E,EAAK,KAAO+1C,GAAe,MAAQ/1C,EAAK,KAAO+1C,GAAe,OAAS/1C,EAAK,KAAO+1C,GAAe,MAC9G,KAAK,SAAW6pC,IAClB,EAAK,GAAK,GACV,EAAK,GAAK,GACV,KAAK,QAAU,IAEb5/E,EAAK,KACP,EAAK,GAAK,KAAK,WAEjB,GAAM,CACJ,eACE,KACA6/E,IACF,EAAO,OAAO,KAAK7/E,CAAI,CAAC,CAAC,QAAQ,EAAK,KACpC6/E,EAAY,SAAS9jF,CAAG,IAAM,EAAIA,GAAOiE,EAAKjE,IACvCgW,GACN,CAAC,CAAC,GAEP,IAAMksB,EAAU,CACd,QAAS9hC,EAAQ,GACnB,EACI,KAAK,YACP,AACEA,EAAQ,UAAU,CAAC,EAErB8kC,GAAkB9kC,EAAQ,QAAS6D,EAAMi+B,CAAO,GAEhD,EAAQ,IAAMsD,GAAgBplC,EAAQ,IAAK6D,EAAMi+B,CAAO,CAE5D,CACA,YAAY,EAAU,CAEpB,IAAM4rB,EAAwC,KAAK,IAAI,OAAOhsC,EAAS,MAAA,EAAiD,QACxH,GAAIgsC,EAAc,CAChB,IAAMxoD,EAAQwc,EAAS,GAAKgsC,EAAa,QACzC,OAAOA,EAAa,UAAUxoD,EAAQ,EACxC,CAEF,CACA,YAAY,EAAM,CAChB,IAAIy+E,EACJ,GAAM,CACJ,QACA,YACE7hE,EACEF,GAAY,EAAyB,KAAK,IAAI,OAAOF,EAAS,SAAW,OAAS,EAAyBiiE,EAAuB,UAAY,KAAO,IAAK,GAAIA,EAAuB,SAC3L,GAAI/hE,EAAU,CACZ,GAAM,CACJ,MACEF,EACJ,IAAK,IAAIxiB,EAAI0iB,EAAS,OAAS,EAAG1iB,GAAK,EAAG,IAAK,CAC7C,IAAM0+B,EAAIhc,EAAS1iB,GACnB,GAAI0+B,EAAE,QAAU14B,GAAS04B,EAAE,SAAS,KAAO3R,EACzC,OAAOrK,EAAS1iB,EAAI,EAExB,CACF,CAEF,CACA,cAAc,EAAU,CACtB,GAAM,CACJ,QACEwiB,EACJ,GAAIniB,IAAS,WACX,OAAOq6C,GAAe,WAExB,GAAIl4B,EAAS,KAAO,cAClB,OAAOk4B,GAAe,KAExB,GAAIr6C,IAAS,QACX,OAAOq6C,GAAe,MAExB,GAAIr6C,IAAS,OAIX,OAHK,KAAK,IAAI,YAAY,OAGnBq6C,GAAe,MAFbA,GAAe,KAK5B,CACA,gBAAgB,EAAM,CACpB,IAAIziC,EAAU,EACVwE,EACEqC,EAAM,KAAK,IACjB,GAAIze,IAASq6C,GAAe,MAC1B,EAAS57B,EAAI,gBACR,CACL,IAAM4lE,EAAM5lE,EAAI,aACV7c,EAAMyiF,EAAM,GAAKA,EAAM,EAAI5lE,EAAI,OAAO,OAC5C,EAASA,EAAI,OAAO,MAAM,EAAG7c,CAAG,CAClC,CAMA,OALAwa,EAAO,QAAS,GAAU,CACpB7S,EAAM,QAAUqO,IAClB,EAAUrO,EAAM,QAEpB,CAAC,EACMqO,EAAU,EAAIA,EAAU,GACjC,CACA,gBAAgB,EAAM,CACpB,IAAM0nB,EAAQ,KAAK,MACb76B,EAASzE,IAASq6C,GAAe,MAAQ,KAAK,YAAc,KAAK,YAKvE,MAJI,CAAC51C,GAAU,CAAC66B,EACP,IAEIgX,EAAa,WAAW7xC,EAAQ66B,EAAM,YAAa,KAAK,OAAO,aAClE,CAAC,CAAC,IAAM,GACpB,CACA,sBAAuB,CACrB,GAAM,CACJ,WACE,KAAK,OACHglD,EAAQ,KAAK,kBACbC,EAAOC,GAAW,KAAK,OAAO,OACpC,OAAO,KAAyB,CAC9B,YAAY,EAAQ,CAClB,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,IAAID,EAAKzrE,CAAM,CAC/B,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,OAAO,KACrB,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,OAAO,OACrB,CACA,SAAU,CACR,KAAK,OAAO,QAAQ,CACtB,CACA,OAAQ,CACN,KAAK,OAAO,MAAM,CACpB,CACA,KAAK,EAAS,EAAQ,EAAW,CAC/BwrE,EAAM7jF,CAAO,EACb,KAAK,OAAO,KAAKA,EAASqY,EAAQq+C,CAAS,CAC7C,CACF,CACF,CACA,sBAAuB,CACrB,GAAM,CACJ,WACE,KAAK,OACHmtB,EAAQ,KAAK,kBACbC,EAAOE,GAAW,KAAK,OAAO,OACpC,OAAO,KAAyB,CAC9B,YAAY,EAAQ,CAClB,KAAK,OAAS,IAAK,GACnB,KAAK,OAAS,IAAIF,EAAKzrE,CAAM,CAC/B,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,OAAO,KACrB,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,OAAO,OACrB,CACA,SAAU,CACR,KAAK,OAAO,QAAQ,CACtB,CACA,OAAQ,CACN,KAAK,OAAO,MAAM,CACpB,CACA,KAAK,EAAS,EAAQ,EAAW,CAC/BwrE,EAAM7jF,CAAO,EACb,KAAK,OAAO,KAAKA,EAASqY,EAAQq+C,CAAS,CAC7C,CACF,CACF,CACF,EACM,GAA8B,IAC9B,GAAN,cAAwCtiB,EAAO,CAC7C,YAAY,EAAK,CACf,MAAM,mBAAoBp2B,EAAI,MAAM,EACpC,KAAK,IAAM,IAAK,GAChB,KAAK,OAAS,KACd,KAAK,IAAM,KACX,KAAK,UAAY,IACjB,KAAK,iBAAmB,KACxB,KAAK,WAAa,IAClB,KAAK,YAAc,GACnB,KAAK,QAAU,EACf,KAAK,QAAU,GACf,KAAK,QAAU,GACf,KAAK,OAAS,KACd,KAAK,YAAc,KACnB,KAAK,eAAiB,KACtB,KAAK,kBAAoB,CAAC,EAC1B,KAAK,IAAMA,EACX,KAAK,kBAAkB,CACzB,CACA,mBAAoB,CAClB,IAAMA,EAAM,KAAK,IACjBA,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,CACzC,CACA,qBAAsB,CACpB,IAAMlW,EAAM,KAAK,IACZA,IAGLA,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,EAC1C,CACA,UAAW,CACT,OAAQ,KAAK,QAAU,CAAC,EAAA,CAAG,QAAQ,EAAU,KACvC+vD,EAAS,QAAQn7E,EAAM,SAAS,IAAM,IACxCm7E,EAAS,KAAKn7E,EAAM,SAAS,EAExBm7E,GACN,CAAC,CAAC,CACP,CACA,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBACd,CACA,IAAI,gBAAgB,EAAiB,CACnC,KAAK,sBAAsBC,CAAe,CAC5C,CACA,WAAY,CAGV,GAFA,KAAK,QAAU,GACf,KAAK,aAAa,EACd,KAAK,SAAW,KAAK,IAAK,CAC5B,GAAI,KAAK,QAAS,CAChB,IAAMC,EAAM,KAAK,WAAa,KAAO,YAAY,IAAI,EAAI,KAAK,SAC9D,GAAIA,EAAM,EAAG,CACX,KAAK,gBAAgB,KAAK,IAAKA,CAAG,EAClC,MACF,CACF,CACA,KAAK,qBAAqB,KAAK,GAAG,CACpC,CACF,CACA,UAAW,CACT,KAAK,QAAU,GACf,AAEE,KAAK,UADL,KAAK,OAAO,QAAQ,EACN,MAEhB,KAAK,aAAa,CACpB,CACA,cAAe,CACT,KAAK,cAAgB,KACvB,KAAK,aAAa,KAAK,WAAW,EAClC,KAAK,YAAc,GAEvB,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,IAAM,KACX,KAAK,OAAS,KAAK,YAAc,KAAK,eAAiB,IACzD,CACA,YAAY,EAAe,CACzB,IAAMxoE,EAAS,KAAK,OAChBA,IACF,KAAK,OAASA,EAAO,OAAQ,GAAU7S,IAAUs7E,CAAa,EAElE,CACA,mBAAoB,CAClB,KAAK,SAAS,EACd,KAAK,QAAU,GACf,KAAK,WAAa,IAClB,KAAK,QAAU,EACf,KAAK,IAAM,KACX,KAAK,UAAY,IACjB,KAAK,OAAS,KAAK,YAAc,KAAK,eAAiB,IACzD,CACA,iBAAiB,EAAO,EAAM,CAC5B,GAAM,CACJ,mBACEvgF,EACAwgF,IAAoB,OAGxB,KAAK,UAAYA,EAAgB,UACjC,KAAK,IAAMA,EAAgB,IACvB,KAAK,SACP,KAAK,UAAU,EAEnB,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,YAAcxgF,EAAK,YACxB,KAAK,eAAiBA,EAAK,cAC7B,CACA,QAAQ,EAAO,EAAM,CACnB,GAAM,CACJ,eACEA,EACJ,GAAKmd,GAA2C,SAAYC,EAAmB,2BAA6BD,EAAY,QAAUE,GAAiB,8BAA+B,CAChL,IAAMvF,EAAS,KAAK,OAChBuoE,EAAkB,KAAK,iBACvBI,EAAe,KAAK,UACxB,GAAIzgF,EAAK,QAAS,CAChB,GAAM,CACJ,UACA,YACA,QACEA,EAAK,QACL6R,GAAWiG,EACb,EAAe,KAAK,qBAAqBjG,EAASnW,EAAM+kF,CAAY,EAC3DC,IACT,EAAeA,EAEnB,CACMD,KAAgB,KAAK,oBACzB,KAAK,kBAAkBA,GAAgB,YAAY,IAAI,GAErD,CAACJ,GAAmBvoE,IACtB,EAAkB,KAAK,SAAS,GAE9BuoE,GAAmBA,EAAgB,OAAS,IAC9C,KAAK,sBAAsBA,CAAe,EAC1C,EAAY,SAAW,KAAK,YAAcI,GAExCzgF,EAAK,UAAYgc,EAAa,qBAAuB,CAAChc,EAAK,MAC7D,EAAY,SAAW,GACbmd,EAAY,UACtB,KAAK,KAAK,qBAAqBnd,EAAK,QAAQ,KAAKA,EAAK,MAAM,QAAQ,wCAAwCygF,EAAa,WAAW3oE,GAASA,EAAO,OAAgB,eAAeR,EAAU+oE,CAAe,EAAE,cAAc/oE,EAAU,KAAK,iBAAiB,GAAG,CAEnQ,CACF,CACA,mBAAmB,EAAQ,CACzB,KAAK,OAASQ,EACd,IAAI6oE,EAAgB,KAAK,oBAAoB,KAAK,SAAS,EAC3D,GAAIA,EAAc,SAAW,EAAG,CAC9B,IAAMD,EAAY5oE,EAAO,EAAE,CAAC,UAC5B,KAAK,IAAI,8BAA8B,KAAK,UAAU,gCAAgC4oE,EAAU,EAAE,EAClG,EAAgB,KAAK,oBAAoBA,CAAS,EAClD,KAAK,UAAYA,CACnB,CAIA,OAHIC,EAAc,SAAW7oE,EAAO,QAClC,KAAK,IAAI,SAAS6oE,EAAc,OAAO,GAAG7oE,EAAO,OAAO,sBAAsB,KAAK,UAAU,EAAE,EAE1F6oE,CACT,CACA,oBAAoB,EAAW,CAI7B,OAHI,KAAK,SAAW,KACX,CAAC,EAEH,KAAK,OAAO,OAAQ,GAAUD,IAAcz7E,EAAM,SAAS,CACpE,CACA,sBAAsB,EAAiB,CACrC,KAAK,iBAAmBo7E,EACxB,IAAIvoE,EACE8oE,EAAoB,KAAK,kBACzB77B,EAAO,YAAY,IAAI,EAC7B,OAAO,KAAK67B,CAAiB,CAAC,CAAC,QAAS,GAAc,CAChD77B,EAAO67B,EAAkBF,GAAahqC,IACxC,OAAOkqC,EAAkBF,EAE7B,CAAC,EACD,IAAK,IAAIrlF,EAAI,EAAGA,EAAIglF,EAAgB,OAAQ,IAAK,CAC/C,IAAMK,EAAYL,EAAgBhlF,GAClC,GAAIqlF,KAAaE,EACf,SAEF,GAAIF,IAAc,KAAK,UACrB,OAEF,IAAMG,EAAgB,KAAK,IAAI,cACzBC,EAAgB,KAAK,IAAI,OAAOD,GAEtC,GADA,EAAS,KAAK,oBAAoBH,CAAS,EACvC5oE,EAAO,OAAS,EAAG,CACrB,KAAK,IAAI,uBAAuB4oE,EAAU,EAAE,EAC5C,KAAK,UAAYA,EACjB90D,GAA6B9T,CAAM,EACnC,KAAK,IAAI,QAAQuY,EAAO,eAAgB,CACtC,QACF,CAAC,EACD,IAAM0wD,EAAmB,KAAK,IAAI,OAAOF,GACrCC,GAAiBC,GAAoB,KAAK,SACxCA,EAAiB,MAAM,uBAAyBD,EAAc,MAAM,sBAAwBC,EAAiB,UAAYD,EAAc,SACzI,KAAK,IAAI,yCAAyCA,EAAc,QAAQ,MAAMC,EAAiB,SAAS,EAE1G,KAAK,IAAI,cAAgBF,GAE3B,KACF,CACF,CACF,CACA,qBAAqB,EAAS,EAAM,EAAgB,CAClD,IAAM/oE,EAAS,KAAK,oBAAoBkpE,CAAc,CAAC,CAAC,OAAO,KAAK,QAAU,CAAC,CAAC,EAChF,IAAK,IAAI3lF,EAAI,EAAGA,EAAIyc,EAAO,OAAQ,IACjC,GAAIpc,IAASu0C,EAAoB,aAAen4B,EAAOzc,EAAE,CAAC,cAAcwW,CAAO,GAAKnW,IAASu0C,EAAoB,gBAAkBn4B,EAAOzc,EAAE,CAAC,iBAAiBwW,CAAO,EACnK,OAAOiG,EAAOzc,EAAE,CAAC,UAGrB,OAAO2lF,CACT,CACA,cAAc,EAAe,CAC3B,IAAMlpE,EAAS,KAAK,OACpB,GAAI,CAACA,EACH,OAEF,IAAMmpE,EAAqB,CAAC,EACtBC,EAAwB,CAAC,EAC/BC,EAAc,QAAS,GAAiB,CACtC,GAAM,CACJ,GAAIn/C,EACJ,UAAWo/C,EACX,kBAAmBr/C,GACjBs/C,EACJ,GAAIvpE,EAAO,KAAM,GAAU7S,EAAM,YAAc+8B,CAAO,EACpD,OAEF,IAAMs/C,EAAiB,KAAK,oBAAoBF,CAAM,CAAC,CAAC,IAAK,GAAc,CACzE,IAAM7qB,EAAa,IAAIpxC,EAASo8D,EAAU,KAAK,EAC/C,EAAW,cAAgBv/C,EAC3B,IAAMw/C,EAAqBjrB,EAAW,OAAS,GAAGA,EAAW,MAAM,SAASv0B,IACtEy/C,EAAwBlrB,EAAW,WAAa,GAAGA,EAAW,UAAU,SAASv0B,IACnFw/C,IACF,EAAmBjrB,EAAW,OAASirB,EACvC,EAAW,MAAQA,GAEjBC,IACF,EAAsBlrB,EAAW,WAAakrB,EAC9C,EAAW,UAAYA,GAEzB,IAAMriF,EAAM0iC,GAAsBy/C,EAAU,IAAKhrB,EAAW,qBAAsB,mBAAoBx0B,CAAc,EAC9G2/C,EAAc,IAAI1wC,GAAM,CAC5B,MAAOulB,EACP,WAAYgrB,EAAU,WACtB,QAASA,EAAU,QACnB,OAAQA,EAAU,OAClB,KAAMA,EAAU,KAChB,MACA,WAAYA,EAAU,WACtB,MAAOA,EAAU,KACnB,CAAC,EACD,GAAIA,EAAU,YACZ,IAAK,IAAIlmF,EAAI,EAAGA,EAAIkmF,EAAU,YAAY,OAAQ,IAChDG,EAAY,WAAW,QAAS,GAAGH,EAAU,YAAYlmF,GAAG,SAAS2mC,GAAS,EAGlF,GAAIu/C,EAAU,eACZ,IAAK,IAAIlmF,EAAI,EAAGA,EAAIkmF,EAAU,eAAe,OAAQ,IACnDG,EAAY,WAAW,OAAQ,GAAGH,EAAU,eAAelmF,GAAG,SAAS2mC,GAAS,EAGpF,OAAO0/C,CACT,CAAC,EACD5pE,EAAO,KAAK,GAAGwpE,CAAc,EAC7B5/C,GAAqB,KAAK,YAAau/C,EAAoBl/C,EAAgBC,CAAO,EAClFN,GAAqB,KAAK,eAAgBw/C,EAAuBn/C,EAAgBC,CAAO,CAC1F,CAAC,CACH,CACA,qBAAqB,EAAK,CACxB,IAAMxtB,EAAS,KAAK,IAAI,OAClBmtE,EAASntE,EAAO,OAClB,KAAK,QACP,KAAK,OAAO,QAAQ,EAEtB,KAAK,OAAS,IAAImtE,EAAOntE,CAAM,EAC/B,IAAIpV,EACJ,GAAI,CACF,EAAM,IAAI,KAAK,IAAIua,CAAG,CACxB,MAAgB,CACd,KAAK,QAAU,GACf,KAAK,IAAI,0CAA0CA,GAAK,EACxD,MACF,CACA,GAAIva,EAAI,WAAa,QAAS,CAC5B,IAAMwiF,GAAc,KAAK,IAAI,mBAAqBptE,EAAO,wBAA0B,EACnFpV,EAAI,aAAa,IAAI,eAAgB,KAAK,SAAS,EACnDA,EAAI,aAAa,IAAI,kBAAmB,GAAKwiF,CAAU,CACzD,CACA,IAAMzlF,EAAU,CACd,aAAc,OACd,IAAKiD,EAAI,IACX,EACMid,EAAa7H,EAAO,2BAA2B,QAC/CqtE,EAA2BxlE,EAAW,YAAcA,EAAW,cAAgB,CAAC,EAChFu2C,EAAe,CACnB,aACA,QAASv2C,EAAW,cACpB,SAAUwlE,EAAyB,aAAe,EAClD,WAAYA,EAAyB,cAAgB,EACrD,cAAeA,EAAyB,iBAAmB,CAC7D,EAiEA,KAAK,IAAI,iCAAiCziF,GAAK,EAC/C,KAAK,OAAO,KAAKjD,EAASy2D,EAAc,CAhEtC,WAAY,EAAU,EAAO,EAAU,IAAmB,CACxD,KAAK,IAAI,8BAA8BxzD,EAAI,EAAE,EAC7C,IAAM0iF,EAAe3xC,EAAS,KAC9B,GAAK2xC,GAA6C,UAAa,EAAG,CAChE,KAAK,IAAI,oBAAoBA,EAAa,QAAQ,gBAAgB,EAClE,MACF,CACA,KAAK,QAAU,YAAY,IAAI,EAC/B,KAAK,WAAaA,EAAa,IAC/B,GAAM,CACJ,aAAcC,EACd,iBAAkBZ,EAClB,mBAAoBd,GAClByB,EACJ,GAAIC,EACF,GAAI,CACF,KAAK,IAAM,IAAI,KAAK,IAAIA,EAAW3iF,CAAG,CAAC,CAAC,IAC1C,MAAgB,CACd,KAAK,QAAU,GACf,KAAK,IAAI,iDAAiD2iF,GAAW,EACrE,MACF,CAEF,KAAK,gBAAgB,KAAK,KAAOC,EAAS,GAAG,EACzCb,GACF,KAAK,cAAcA,CAAa,EAElC,IAAMc,EAAqB,CACzB,iBAAkBH,EAClB,IAAK1iF,EAAI,SAAS,CACpB,EACA,KAAK,IAAI,QAAQixB,EAAO,yBAA0B4xD,CAAkB,EAChE5B,GACF,KAAK,sBAAsBA,CAAe,CAE9C,EACA,SAAU,EAAO,EAAU,EAAgB,IAAU,CAGnD,GAFA,KAAK,IAAI,oCAAoCtkE,EAAM,KAAK,GAAGA,EAAM,KAAK,IAAIimE,EAAS,IAAI,EAAE,EACzF,KAAK,SAAS,EACVjmE,EAAM,OAAS,IAAK,CACtB,KAAK,QAAU,GACf,KAAK,IAAI,qBAAqBimE,EAAS,IAAI,qBAAqB,EAChE,MACF,CACA,IAAI1B,EAAM,KAAK,WAAa,IAC5B,GAAIvkE,EAAM,OAAS,IAAK,CACtB,IAAM42C,EAAS,KAAK,OACpB,GAAI,OAAQA,GAAiC,mBAAuB,WAAY,CAC9E,IAAMuvB,EAAavvB,EAAO,kBAAkB,aAAa,EACrDuvB,IACF,EAAM,WAAWA,CAAU,EAAI,IAEnC,CACA,KAAK,IAAI,qBAAqBF,EAAS,IAAI,cAAc,CAE3D,MACA,KAAK,gBAAgB,KAAK,KAAOA,EAAS,IAAK1B,CAAG,CACpD,EACA,WAAY,EAAO,EAAU,IAAmB,CAC9C,KAAK,IAAI,sCAAsC0B,EAAS,IAAI,EAAE,EAC9D,KAAK,gBAAgB,KAAK,KAAOA,EAAS,GAAG,CAC/C,CAGsC,CAAS,CACnD,CACA,gBAAgB,EAAK,EAAQ,KAAK,WAAa,IAAK,CAClD,KAAK,aAAa,EAClB,KAAK,YAAc,KAAK,eAAiB,CAEvC,IAAMhnD,EAAqB,KAAK,KAAkC,MAC9DA,GAAS,CAACA,EAAM,MAClB,KAAK,qBAAqBrhB,CAAG,EAG/B,KAAK,gBAAgBA,EAAK,KAAK,WAAa,GAAG,CACjD,EAAGwoE,CAAK,CACV,CACF,EA4CM,GAAN,MAAMvrC,UAAsBrG,EAAO,CACjC,YAAY,EAAK,CACf,MAAM,MAAOp2B,EAAI,MAAM,EACvB,KAAK,IAAM,IAAK,GAChB,KAAK,OAAS,IAAK,GACnB,KAAK,MAAQ,KACb,KAAK,cAAgB,IAAK,GAC1B,KAAK,iBAAmB,KACxB,KAAK,wBAA0B,CAAC,EAChC,KAAK,4BAA8B,EACnC,KAAK,iBAAmB,CAAC,EACzB,KAAK,yBAA2B,CAAC,EACjC,KAAK,UAAY,KACjB,KAAK,kBAAoBy8B,EAAc,kBAAoB,CAACA,EAAc,iBAAiB,EAAI,CAAC,EAChG,KAAK,aAAe,CAAC,EACrB,KAAK,iBAAoB,GAAU,CACjC,GAAM,CACJ,eACA,YACE5oB,EACEo0D,EAAa,IAAIp0D,EAAM,KAAK,4BAA4Bq0D,EAAa,GAE3E,GADA,KAAK,MAAMD,CAAU,EACjB/6E,IAAa,KAGjB,IAAI,CAAC,KAAK,iBAAkB,CAC1B,IAAIi7E,EAAa,OAAO,KAAK,KAAK,uBAAuB,EACpDA,EAAW,SACd,EAAahgE,GAAuB,KAAK,MAAM,GAEjD,IAAMshC,EAAa0+B,EAAW,IAAIlgE,EAAgC,CAAC,CAAC,OAAQ,GAAM,CAAC,CAACokB,CAAC,EACrF,KAAK,iBAAmB,KAAK,oBAAoBod,CAAU,CAC7D,CACA,KAAK,iBAAiB,KAAM,GAAoB,CAC9C,IAAMvhC,EAAYL,GAAiCugE,CAAe,EAClE,GAAIF,IAAiB,QAAUhgE,IAAcF,EAAW,SAAU,CAChE,KAAK,IAAI,aAAa6L,EAAM,KAAK,gCAAgCq0D,EAAa,4BAA4BhgE,GAAW,EACrH,MACF,CACA,IAAIjc,EACJ,GAAI,CACF,IAAMo8E,EAAOziF,EAAQ,IAAI,WAAWsH,CAAQ,CAAC,EAEvCd,EAAOO,GADAia,GAAa,KAAK,MAAMyhE,CAAI,CAAC,CAAC,IACjB,CAAC,EAC3B,GAAI,CAACj8E,EACH,MAAU,MAAM,sDAAsD,EAExE,EAAQ,IAAI,WAAWA,EAAK,SAAS,EAAG,EAAE,CAAC,CAC7C,OAASwV,EAAO,CACd,KAAK,KAAK,GAAGqmE,EAAW,yBAAyBrmE,GAAO,EACxD,MACF,CACA,IAAM0mE,EAAW9kF,EAAWyI,CAAK,EAC3B,CACJ,2BACA,oBACE,KACAs8E,EAA2BC,EAAyBF,GACxD,IAAK,IAAIpnF,EAAI,EAAGA,EAAIunF,EAAiB,OAAQ,IAAK,CAChD,IAAMpgD,EAAaogD,EAAiBvnF,GAC9B8K,EAAcq8B,EAAW,YAC/B,GAAI,CAACr8B,EAAY,MACf,SAEF,IAAM08E,EAAcllF,EAAWwI,EAAY,KAAK,EAChD,GAAIua,GAAiBta,EAAOD,EAAY,KAAK,GAAKA,EAAY,IAAI,QAAQ,KAAM,EAAE,CAAC,CAAC,QAAQs8E,CAAQ,IAAM,GAAI,CAE5G,GADA,EAA2BE,EAAyBE,GAChD,CAACH,EACH,SAEF,GAAIv8E,EAAY,KACd,MAEF,OAAOw8E,EAAyBE,GAChC,EAAY,KAAO,IAAI,WAAWx7E,CAAQ,EAC1C,EAAY,MAAQjB,EACpB,EAA2B,EAAyBq8E,GAAYC,EAAyB,SAChF,KAAK,uCAAuClgD,EAAY6/C,EAAch7E,EAAU,2BAA2B,CACnH,EACDq7E,EAAyB,MAAO,GAAU,KAAK,YAAY3mE,CAAK,CAAC,EACjE,KACF,CACF,CACK2mE,GACH,KAAK,YAAY,gBAAI,MAAM,UAAUD,EAAS,oDAAoDG,EAAiB,OAAO,EAAE,CAAC,CAEjI,CAAC,CAAC,CAAC,MAAO,GAAU,KAAK,YAAY7mE,CAAK,CAAC,CAtD3C,CAuDF,EACA,KAAK,gBAAmB,GAAU,CAChC,KAAK,IAAI,IAAIiS,EAAM,KAAK,QAAQ,CAClC,EACA,KAAK,IAAM7T,EACX,KAAK,OAASA,EAAI,OAClB,KAAK,kBAAkB,CACzB,CACA,SAAU,CACR,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,IAAM3F,EAAS,KAAK,OACpB,EAAO,gCAAkC,KACzC,EAAO,gBAAkB,EAAO,wBAA0B,IAAK,GAC/D,EAAO,WAAa,EAAO,iBAAmB,CAAC,EAC/C,KAAK,IAAM,KAAK,OAAS,KAAK,yBAA2B,KACzD,KAAK,iBAAmB,KAAK,gBAAkB,IACjD,CACA,mBAAoB,CAClB,KAAK,IAAI,GAAG6b,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EAC7D,KAAK,IAAI,GAAGA,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EAC7D,KAAK,IAAI,GAAGA,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EACjE,KAAK,IAAI,GAAGA,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC/D,KAAK,IAAI,GAAGA,EAAO,WAAY,KAAK,aAAc,IAAI,CACxD,CACA,qBAAsB,CACpB,KAAK,IAAI,IAAIA,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EAC9D,KAAK,IAAI,IAAIA,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EAC9D,KAAK,IAAI,IAAIA,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAClE,KAAK,IAAI,IAAIA,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAChE,KAAK,IAAI,IAAIA,EAAO,WAAY,KAAK,aAAc,IAAI,CACzD,CACA,oBAAoB,EAAW,CAC7B,GAAM,CACJ,aACA,sBACE,KAAK,OACHyyD,EAAyBtgE,IAAyCH,GACxE,GAAIygE,EACF,OAAOA,EAAuB,WAEhC,GAAIzgE,IAAcF,EAAW,UAAYM,EACvC,OAAOA,CAEX,CACA,2BAA2B,EAAW,CACpC,IAAMrjB,EAAM,KAAK,oBAAoBijB,CAAS,EAC9C,GAAIjjB,IAAQ,IAAK,GACf,MAAU,MAAM,oDAAoDijB,EAAU,EAAE,EAElF,OAAOjjB,CACT,CACA,wBAAwB,EAAW,CACjC,GAAM,CACJ,cACE,KAAK,OACH0jF,EAAyBtgE,IAAyCH,GACxE,GAAIygE,EACF,OAAOA,EAAuB,qBAE9B,KAAK,IAAI,+CAA+CzgE,EAAU,GAAG,CAEzE,CACA,uBAAuB,EAAqB,CAC1C,IAAMvK,EAAS,KAAK,IAAI,OAClBirE,GAAe,EAAO,EAAG,IAAM,CAAC,CAAC51E,GAASwT,EAAE,QAAQxT,CAAK,IAAM9R,EAC/DwY,EAAciE,EAAO,IAAK,GAAU7S,EAAM,UAAU,CAAC,CAAC,OAAO89E,CAAW,EACxEryE,EAAcoH,EAAO,IAAK,GAAU7S,EAAM,UAAU,CAAC,CAAC,OAAO89E,CAAW,EAI9E,OAHIlvE,EAAY,OAASnD,EAAY,SAAW,GAC9CA,EAAY,KAAK,aAAa,EAEzB,IAAI,SAAS,EAAS,IAAW,CACtC,IAAMsyE,EAAW,GAAe,CAC9B,IAAM3gE,EAAYigE,EAAW,MAAM,EACnC,KAAK,oBAAoBjgE,EAAWxO,EAAanD,CAAW,CAAC,CAAC,KAAM,GAAcqhD,EAAQ,CACxF,YACA,WACF,CAAC,CAAC,CAAC,CAAC,MAAO,GAAU,CACfuwB,EAAW,OACbU,EAAQV,CAAU,EACTvmE,aAAiB6mB,GAC1BovB,EAAOj2C,CAAK,EAEZi2C,EAAO,IAAIpvB,GAAY,CACrB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,qBACtB,QACA,MAAO,EACT,EAAGD,EAAM,OAAO,CAAC,CAErB,CAAC,CACH,EACAinE,EAAQzgE,CAAmB,CAC7B,CAAC,CACH,CACA,4BAA4B,EAAW,EAAyB,CAC9D,GAAM,CACJ,mCACE,KAAK,OACT,GAAM,OAAO0gE,GAAoC,WAAa,CAC5D,IAAIC,EAAa,4DAA4DD,IAI7E,OAHI1wC,KAAgC,MAAQ,KAAK,SAAS,WAAa,UACrE,EAAa,iFAAiF,SAAS,YAElG,QAAQ,OAAW,MAAM2wC,CAAU,CAAC,CAC7C,CACA,OAAOD,EAAgC5gE,EAAW8gE,CAAuB,CAC3E,CACA,oBAAoB,EAAW,EAAa,EAAa,CAEvD,IAAMC,EAAwB1gE,GAAyCL,EAAWxO,EAAanD,EAAa,KAAK,OAAO,kBAAoB,CAAC,CAAC,EAC1I2yE,EAA0B,KAAK,wBAAwBhhE,GACvDihE,EAA2CD,GAAkE,gBACjH,GAAI,CAACC,EAAiB,CACpB,KAAK,IAAI,+BAA+BjhE,EAAU,mCAAmC/K,EAAU8rE,CAAqB,GAAG,EACvH,EAAkB,KAAK,4BAA4B/gE,EAAW+gE,CAAqB,EACnF,IAAMG,EAA6B,EAA0B,KAAK,wBAAwBlhE,GAAa,CACrG,iBACF,EAIA,OAHAihE,EAAgB,MAAO,GAAU,CAC/B,KAAK,IAAI,0CAA0CjhE,EAAU,KAAKtG,GAAO,CAC3E,CAAC,EACMunE,EAAgB,KAAM,GAAyB,CACpD,KAAK,IAAI,0BAA0BE,EAAqB,UAAU,WAAW,EAC7E,IAAMC,EAAqB,KAAK,uBAAuBphE,CAAS,EAChE,KAAK,IAAI,0BAA0BA,EAAU,EAAE,EAC/C,IAAMqhE,EAAY,EAA2B,UAAYF,EAAqB,gBAAgB,CAAC,CAAC,KAAM,IACpG,KAAK,IAAI,2BAA2BnhE,EAAU,EAAE,EAChD,EAA2B,aAAe,GACnCohE,EAAmB,KAAM,GAC1BE,EACK,KAAK,8BAA8BC,EAAYvhE,EAAWshE,CAAW,EAEvEC,CACR,EACF,EAID,OAHAF,EAAU,MAAO,GAAU,CACzB,KAAK,MAAM,oCAAoCrhE,EAAU,MAAMtG,GAAO,CACxE,CAAC,EACM2nE,CACT,CAAC,CACH,CACA,OAAOJ,EAAgB,SAAWD,EAAwB,SAAS,CACrE,CACA,6BAA6B,CAC3B,cACA,YACA,aACC,CACD,KAAK,IAAI,gCAAgChhE,EAAU,WAAW1kB,EAAWwI,EAAY,OAAS,CAAC,CAAC,EAAE,WAAWA,EAAY,KAAK,EAE9H,IAAM09E,EAAyB,CAC7B,cACA,YACA,YACA,iBALuBH,EAAU,cAKlB,EACf,UAAW,gBACb,EAEA,OADA,KAAK,iBAAiB,KAAKG,CAAsB,EAC1CA,CACT,CACA,gBAAgB,EAAwB,CACtC,IAAM19E,EAAc09E,EAAuB,YAC3C,GAAI19E,EAAY,KAAM,CACpB,IAAM29E,EAAoB,KAAK,6BAA6BD,CAAsB,EAC5Ez9E,EAAQk8B,GAAen8B,CAAW,EAExC,KAAK,yBAAyBC,GAAS,KAAK,uCAAuC09E,EAAmB,OAAQ39E,EAAY,KAAK,OAAQ,SAAS,CAClJ,MACE,KAAK,KAAK,yDAAyD,EAErE,KAAK,cAAc09E,CAAsB,CAC3C,CACA,iBAAiB,EAAwB,EAAM,CAC7C,IAAME,EAAaF,EAAuB,iBAG1C,OAFA,KAAK,IAAI,yBAAyBE,EAAW,UAAU,cAAcpmF,EAAWkmF,EAAuB,YAAY,OAAS,CAAC,CAAC,EAAE;wBAC5G7jF,EAAK,WAAW,EAAE,EAC/B+jF,EAAW,OAAO/jF,CAAI,CAC/B,CACA,6BAA8B,CAC5B,OAAO,OAAO,KAAK,KAAK,uBAAuB,CAAC,CAAC,IAAK,IAAe,CACnE,YACA,aAAc,KAAK,wBAAwBqiB,EAAU,CAAC,YACxD,EAAE,CAAC,CAAC,QAAQ,CACV,kBACI,CAAC,CAAC2hE,CAAY,CAAC,CAAC,KAAK,CACzB,eACI5hE,GAAiCC,CAAS,CAAC,CAAC,CAAC,OAAQ,GAAc,CAAC,CAACA,CAAS,CACtF,CACA,mBAAmB,EAAqB,CACtC,OAAO,KAAK,6BAA6BE,CAAmB,CAAC,CAAC,MAAM,CAClE,YACA,eAEO,KAAK,oBAAoBF,EAAWqhE,CAAS,CACrD,CACH,CACA,gBAAgB,EAAqB,CACnC,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,KAAK,6BAA6BnhE,CAAmB,CAAC,CAAC,MAAM,CAC3D,eACI,CACJ,IAAMggE,EAAkBngE,GAAiCC,CAAS,EAC9DkgE,EACFxwB,EAAQwwB,CAAe,EAEvBvwB,EAAO,gBAAI,MAAM,yCAAyC3vC,EAAU,EAAE,CAAC,CAE3E,CAAC,CAAC,CAAC,MAAM2vC,CAAM,CACjB,CAAC,CACH,CACA,sBAAsB,EAAM,CAC1B,IAAMpO,EAAa,OAAO,KAAKpkD,EAAK,WAAa,CAAC,CAAC,EAKnD,MAJA,CAEE,KAAK,oBADL,KAAK,IAAI,2CAA2CA,EAAK,GAAG,GAAGA,EAAK,KAAK,IAAIA,EAAK,MAAM,gBAAgBokD,EAAW,KAAK,IAAI,GAAG,EACvG,KAAK,oBAAoBA,CAAU,GAEtD,KAAK,gBACd,CACA,oBAAoB,EAAY,CAC9B,IAAMqgC,EAAqB3hE,GAAuB,KAAK,MAAM,EACvDC,EAAsBqhC,EAAW,IAAI5hC,EAAgC,CAAC,CAAC,OAAQ,GAAU,CAAC,CAAC7U,GAAS82E,EAAmB,QAAQ92E,CAAK,IAAM,EAAE,EAClJ,OAAO,KAAK,gBAAgBoV,CAAmB,CACjD,CACA,aAAa,EAAa,CACxB,GAAM,CACJ,oBACE,KACJ,IAAK,IAAIlnB,EAAI,EAAGA,EAAIunF,EAAiB,OAAQ,IAAK,CAChD,IAAMsB,EAAU3hD,GAAap8B,EAAay8E,EAAiBvnF,EAAE,EAC7D,GAAI6oF,EACF,OAAOA,CAEX,CAEF,CACA,QAAQ,EAAM,CACZ,IAAM/9E,EAAcnG,EAAK,QAAQ,YAC3BoG,EAAQk8B,GAAen8B,CAAW,EAClCg+E,EAAY,KAAK,aAAa/9E,GACpC,GAAI+9E,GAAa,KAAK,aAAah+E,CAAW,IAAM,iBAAkB,CACpE,IAAM4V,EAAQ0mB,GAAkB0hD,GAAa,iBAAkBh+E,CAAW,EAE1E,OADA,KAAK,YAAY4V,EAAO/b,EAAK,IAAI,EAC1B,QAAQ,OAAO+b,CAAK,CAC7B,CACA,IAAMqoE,EAAa,WAAWh+E,EAAM,YAAYD,EAAY,UAAU,YAAYA,EAAY,OAAO,QAAQA,EAAY,IAAI,GAC7H,KAAK,IAAI,4BAA4Bi+E,GAAY,EACjD,IAAMC,EAAoB,KAAK,yBAAyBj+E,GACxD,GAAI,CAACi+E,EAAmB,CACtB,IAAM3B,EAA2B,KAAK,0BAA0Bv8E,CAAW,CAAC,CAAC,MAAM,CACjF,YACA,gBAEA,KAAK,iBAAiB,EACtB,KAAK,IAAI,8BAA8BnG,EAAK,KAAK,GAAG,GAAGA,EAAK,KAAK,KAAK,IAAIA,EAAK,KAAK,MAAM,aAAaokF,GAAY,EAC5G,KAAK,oBAAoB/hE,EAAWqhE,CAAS,CAAC,CAAC,UACpD,KAAK,iBAAiB,EACf,KAAK,6BAA6B,CACvC,YACA,YACA,aACF,CAAC,EACF,EACF,CAAC,CAAC,KAAM,GAAsB,CAC7B,IACMr8E,EAAWlB,EAAY,KAAOA,EAAY,KAAK,OAAS,KAC9D,OAAO,KAAK,uCAAuC29E,EAAmB,OAAQz8E,EAAU,cAAc,CACxG,CAAC,EAGD,OAFAq7E,EAAyB,MAAO,GAAU,KAAK,YAAY3mE,EAAO/b,EAAK,IAAI,CAAC,EAC5E,KAAK,yBAAyBoG,GAASs8E,EAChCA,CACT,CAWA,OAVA2B,EAAkB,MAAO,GAAU,CACjC,GAAItoE,aAAiB6mB,GAAa,CAChC,IAAM3jB,EAAY9jB,EAAe,CAAC,EAAG4gB,EAAM,IAAI,EAC3C,KAAK,aAAa5V,CAAW,IAAM,mBACrC,EAAU,YAAcA,GAE1B,IAAMm+E,EAAc,IAAI1hD,GAAY3jB,EAAWlD,EAAM,OAAO,EAC5D,KAAK,YAAYuoE,EAAatkF,EAAK,IAAI,CACzC,CACF,CAAC,EACMqkF,CACT,CACA,iBAAiB,EAAU,gBAAiB,CAC1C,GAAI,CAAC,KAAK,IACR,MAAU,MAAM,eAAe,CAEnC,CACA,YAAY,EAAO,EAAM,CACvB,GAAK,KAAK,IAGV,IAAItoE,aAAiB6mB,GAAa,CAC5BpjC,IACF,EAAM,KAAK,KAAOA,GAEpB,IAAMqkD,EAAW9nC,EAAM,KAAK,YAC5B,KAAK,MAAM,GAAGA,EAAM,UAAU8nC,EAAW,KAAKlmD,EAAWkmD,EAAS,OAAS,CAAC,CAAC,EAAE,GAAK,IAAI,EACxF,KAAK,IAAI,QAAQxzB,EAAO,MAAOtU,EAAM,IAAI,CAC3C,MACE,KAAK,MAAMA,EAAM,OAAO,EACxB,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,iBACjB,QAASlD,EAAa,mBACtB,QACA,MAAO,EACT,CAAC,CACH,CACF,CACA,0BAA0B,EAAa,CACrC,IAAM5V,EAAQk8B,GAAen8B,CAAW,EAClC09E,EAAyB,KAAK,yBAAyBz9E,GAC7D,GAAI,CAACy9E,EAAwB,CAC3B,IAAMxhE,EAAYL,GAAiC7b,EAAY,SAAS,EAClEoc,EAAsBF,EAAY,CAACA,CAAS,EAAIC,GAAuB,KAAK,MAAM,EACxF,OAAO,KAAK,uBAAuBC,CAAmB,CACxD,CACA,OAAOshE,CACT,CACA,6BAA6B,EAAqB,CAIhD,GAHKthE,EAAoB,SACvB,EAAsBD,GAAuB,KAAK,MAAM,GAEtDC,EAAoB,SAAW,EACjC,MAAM,IAAIqgB,GAAY,CACpB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,iCACtB,MAAO,EACT,EAAG,oDAAoD1E,EAAU,CAC/D,WAAY,KAAK,OAAO,UAC1B,CAAC,GAAG,EAEN,OAAO,KAAK,uBAAuBiL,CAAmB,CACxD,CACA,oBAAoB,EAAW,EAAW,CAExC,GADA,KAAK,cAAgB,IAAK,GACtB,KAAK,YAAcmhE,EACrB,OAAO,QAAQ,QAAQ,EAEzB,IAAMvK,EAAQ,KAAK,kBAAkB,MAAM,EAC3C,KAAK,IAAI,2BAA2B92D,EAAU,EAAE,EAChD,IAAMkiE,EAAsB,QAAQ,IAAIpL,CAAK,CAAC,CAAC,SACxC,KAAK,MAYH,KAAK,MAAM,aAAauK,CAAS,EAX/B,IAAI,SAAS,EAAS,IAAW,CACtC,KAAK,kBAAsB,CAEzB,GADA,KAAK,cAAgB,IAAK,GACtB,CAAC,KAAK,MACR,OAAO1xB,EAAO,gBAAI,MAAM,2DAA2D,CAAC,EAEtF,KAAK,UAAY0xB,EACjB,KAAK,MAAM,aAAaA,CAAS,CAAC,CAAC,KAAK3xB,CAAO,CAAC,CAAC,MAAMC,CAAM,CAC/D,CACF,CAAC,CAGJ,EAGD,MAFA,MAAK,UAAY0xB,EACjB,KAAK,kBAAkB,KAAKa,CAAmB,EACxCA,EAAoB,SAAW,CACpC,KAAK,IAAI,uBAAuBliE,EAAU,EAAE,EAC5C82D,EAAM,KAAKoL,CAAmB,EAC9B,KAAK,kBAAoB,KAAK,kBAAkB,OAAQ,GAAMpL,EAAM,QAAQp/C,CAAC,IAAM,EAAE,CACvF,CAAC,CACH,CACA,uCAAuC,EAAS,EAAc,EAAU,EAAQ,CAC9E,IAAIyqD,EACJ,IAAMC,GAAyB,EAAwB,KAAK,OAAO,aAAe,OAAS,EAAwBD,EAAsBroF,EAAQ,aAAe,KAAO,IAAK,GAAIqoF,EAAsB,gBACtM,GAAIC,EACF,GAAI,CACF,IAAMC,EAAiBD,EAAsB,KAAK,KAAK,IAAKpC,EAAch7E,EAAUlL,CAAO,EAC3F,GAAI,CAACuoF,EACH,MAAU,MAAM,yDAAyD,EAE3E,EAAeA,EAAe,aAC9B,EAAWA,EAAe,SAAWA,EAAe,SAAW,KAC/D,EAAQ,YAAY,KAAOr9E,EAAW,IAAI,WAAWA,CAAQ,EAAI,IACnE,OAAS0U,EAAO,CAEd,GADA,KAAK,KAAKA,EAAM,OAAO,EACnB,KAAK,KAAO,KAAK,IAAI,OAAO,MAC9B,MAAMA,CAEV,CAEF,GAAI1U,IAAa,KAEf,OADA,KAAK,IAAI,qCAAqCmQ,EAAO,gBAAgB,EAC9D,QAAQ,QAAQrb,CAAO,EAEhC,IAAMiK,EAAQk8B,GAAenmC,EAAQ,WAAW,EAC1CwoF,EAASxoF,EAAQ,YAAY,IACnC,KAAK,IAAI,uCAAuCqb,EAAO,WAAWpR,EAAM,QAAQu+E,EAAO,oBAAoBtC,EAAa,WAAWh7E,EAAS,WAAW,EAAE,EACzJ,IAAMu9E,EAAgB,IAAI3xC,GACpB4xC,EAAY,EAAQ,WAAc,GAAU,CAChD,IAAMd,EAAa5nF,EAAQ,iBAC3B,GAAI,CAAC4nF,EAAY,CACfa,EAAc,KAAK,QAAS,gBAAI,MAAM,eAAe,CAAC,EACtD,MACF,CACA,GAAM,CACJ,cACA,WACE52D,EACJ,KAAK,IAAI,IAAI82D,EAAY,+BAA+Bf,EAAW,UAAU,kBAAkBh5D,EAAQ,YAAY,EAC/G+5D,IAAgB,mBAAqBA,IAAgB,kBACvD,KAAK,aAAa3oF,EAAS4uB,CAAO,CAAC,CAAC,MAAO,GAAU,CAC/C65D,EAAc,WAAW,CAAC,CAAC,OAC7BA,EAAc,KAAK,QAAS7oE,CAAK,EAEjC,KAAK,YAAYA,CAAK,CAE1B,CAAC,EACQ+oE,IAAgB,kBACrB3oF,EAAQ,YAAcgmB,EAAW,UACnC,KAAK,iBAAiBhmB,EAAS8kB,GAAe,cAAc,CAAC,CAAC,CAAC,SAAW,KAAK,cAAc9kB,CAAO,CAAC,CAAC,CAAC,MAAO,GAAU,KAAK,YAAY4f,CAAK,CAAC,EAGjJ,KAAK,KAAK,qCAAqC+oE,EAAY,EAAE,CAEjE,EACMC,GAAmB,EAAW,IAAa,CAC/C,EAAS,UAAYpiD,EACrB,IAAIqiD,EACAriD,EAAU,WAAW,QAAQ,EAC/BiiD,EAAc,KAAK,UAAU,EACpBjiD,IAAc,kBAAoBA,IAAc,qBAAuBA,IAAc,oBAC9F,EAAWF,GAAkBE,EAAWq/C,EAAS,WAAW,EACnDr/C,IAAc,UACvB,EAAW,gBAAI,MAAM,uBAAuBv8B,EAAM,EAAE,EAC3Cu8B,IAAc,WACvB,EAAW,gBAAI,MAAM,cAAc,EAC1BA,IAAc,kBAGvB,KAAK,KAAK,gCAAgCA,EAAU,YAAYv8B,EAAM,EAAE,EAEtE4+E,IACEJ,EAAc,WAAW,CAAC,CAAC,OAC7BA,EAAc,KAAK,QAASI,CAAQ,EAEpC,KAAK,YAAYA,CAAQ,EAG/B,EACMC,EAAsB,EAAQ,qBAAwB,GAAU,CAEpE,GAAI,CADe9oF,EAAQ,iBACV,CACfyoF,EAAc,KAAK,QAAS,gBAAI,MAAM,eAAe,CAAC,EACtD,MACF,CACA,IAAMM,EAAc,KAAK,eAAe/oF,CAAO,EAE/C,GAAI,CADW,OAAO,KAAK+oF,CACjB,CAAC,CAAC,KAAM,GAAOA,EAAYvpF,KAAQ,gBAAgB,EAC3D,OAEF,GAAIupF,EAAY9+E,KAAW,UAAW,CACpC,KAAK,IAAI,eAAekR,EAAU4tE,CAAW,EAAE,mBAAmB/oF,EAAQ,iBAAiB,UAAU,EAAE,EACvG,KAAK,gBAAgBA,CAAO,EAC5B,MACF,CACA,IAAIwmC,EAAYuiD,EAAY9+E,GAC5B,GAAIu8B,EACFoiD,EAAgBpiD,EAAWxmC,CAAO,MAC7B,CACL,IAAIgpF,EACJ,IAAMC,EAAU,IAChB,AAA8BjpF,EAAQ,oBAAoB,CAAC,GAC1D,EAAwBA,EAAQ,kBAAA,CAAmBiK,KAAW,EAAsBA,GAAS,KAAK,eAAiB,CAClH,GAAI,CAACjK,EAAQ,kBAAoB,CAAC,KAAK,UACrC,OAEF,IAAMkpF,EAAmB,KAAK,aAAalpF,EAAQ,WAAW,EAC9D,GAAIkpF,GAAoBA,IAAqB,iBAE3C,OADA,KAAK,IAAI,uBAAuBj/E,EAAM,mBAAmBjK,EAAQ,iBAAiB,UAAU,8BAA8BkpF,EAAiB,qBAAqB,EACzJN,EAAgBM,EAAkBlpF,CAAO,EAElD,KAAK,IAAI,kBAAkBiK,EAAM,mBAAmBjK,EAAQ,iBAAiB,UAAU,oBAAoBipF,EAAQ,GAAG,EACtH,EAAY,iBACZL,EAAgBpiD,EAAWxmC,CAAO,CACpC,EAAGipF,CAAO,GACV,KAAK,IAAI,uBAAuBh/E,EAAM,IAAIkR,EAAU4tE,CAAW,EAAE,GAAG,CACtE,CACF,EACAr4D,EAAiB1wB,EAAQ,iBAAkB,UAAW0oF,CAAS,EAC/Dh4D,EAAiB1wB,EAAQ,iBAAkB,oBAAqB8oF,CAAmB,EACnF,IAAMK,EAAmB,IAAI,SAAS,EAAS,IAAW,CACxDV,EAAc,GAAG,QAAS5yB,CAAM,EAChC4yB,EAAc,GAAG,WAAY7yB,CAAO,CACtC,CAAC,EACD,OAAO51D,EAAQ,iBAAiB,gBAAgBkmF,EAAch7E,CAAQ,CAAC,CAAC,SAAW,CACjF,KAAK,IAAI,sCAAsClL,EAAQ,iBAAiB,UAAU,WAAWiK,EAAM,QAAQu+E,GAAQ,CACrH,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,MAAM,IAAI/hD,GAAY,CACpB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,sBACtB,QACA,YAAa7f,EAAQ,YACrB,MAAO,EACT,EAAG,yCAAyC4f,GAAO,CACrD,CAAC,CAAC,CAAC,SAAWupE,CAAgB,CAAC,CAAC,MAAO,IACrCV,EAAc,mBAAmB,EAC1B,KAAK,cAAczoF,CAAO,CAAC,CAAC,SAAW,CAC5C,MAAM4f,CACR,CAAC,EACF,CAAC,CAAC,UACD6oE,EAAc,mBAAmB,EAC1BzoF,EACR,CACH,CACA,eAAe,EAAwB,CACrC,IAAM+oF,EAAc,CAAC,EAoBrB,OAnBArB,EAAuB,iBAAiB,YAAY,SAAS,EAAS,IAAU,CAC9E,GAAI,OAAOz9E,GAAU,UAAY,OAAO89E,GAAY,SAAU,CAC5D,IAAMz6E,EAAOrD,EACb,EAAQ89E,EACR,EAAUz6E,CACZ,CACA,IAAM6Z,EAAa,WAAYld,EAAQ,IAAI,WAAWA,EAAM,OAAQA,EAAM,WAAYA,EAAM,UAAU,EAAI,IAAI,WAAWA,CAAK,EAC9H,GAAIy9E,EAAuB,YAAc1hE,EAAW,WAAamB,EAAW,SAAW,GAAI,CACzF,IAAMiiE,EAA8B5nF,EAAW2lB,CAAU,EACzD,EAAYiiE,GAA+BrB,EAC3C7iE,GAAiBiC,CAAU,CAC7B,CACA,IAAMkiE,EAAwB7nF,EAAW2lB,CAAU,EAC/C4gE,IAAY,mBACd,KAAK,aAAasB,GAAyBtB,GAE7C,KAAK,IAAI,sBAAsBA,EAAQ,2BAA2BsB,EAAsB,gBAAgB3B,EAAuB,iBAAiB,UAAU,EAAE,EAC5J,EAAY2B,GAAyBtB,CACvC,CAAC,EACMgB,CACT,CACA,uBAAuB,EAAW,CAChC,IAAM1wE,EAAS,KAAK,OACdmtE,EAASntE,EAAO,OAChBixE,EAAa,IAAI9D,EAAOntE,CAAM,EAC9BpV,EAAM,KAAK,wBAAwBijB,CAAS,EAKlD,OAJKjjB,GAGL,KAAK,IAAI,oCAAoCijB,EAAU,EAAE,EAClD,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM3D,EAAgB,CACpB,aAAc,cACd,KACF,EACMrC,EAAa7H,EAAO,eAAe,QACnCo+C,EAAe,CACnB,aACA,QAASv2C,EAAW,cACpB,SAAU,EACV,WAAY,EACZ,cAAe,CACjB,EAiCAopE,EAAW,KAAK/mE,EAAek0C,EAAc,CA/B3C,WAAY,EAAU,EAAO,EAAS,IAAmB,CACvDb,EAAQ5hB,EAAS,IAAI,CACvB,EACA,SAAU,EAAU,EAAQ,EAAgB,IAAU,CACpD6hB,EAAO,IAAIpvB,GAAY,CACrB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,6CACtB,MAAO,GACP,iBACA,SAAU7gB,EAAe,CACvB,IAAKujB,EAAc,IACnB,KAAM,IAAK,EACb,EAAGyxB,CAAQ,CACb,EAAG,IAAI9tB,EAAU,gCAAgCjjB,EAAI,aAAa+wC,EAAS,KAAK,IAAIA,EAAS,KAAK,EAAE,CAAC,CACvG,EACA,WAAY,EAAO,EAAS,IAAmB,CAC7C6hB,EAAO,IAAIpvB,GAAY,CACrB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,6CACtB,MAAO,GACP,iBACA,SAAU,CACR,IAAK0C,EAAc,IACnB,KAAM,IAAK,EACb,CACF,EAAG,IAAI2D,EAAU,mCAAmCjjB,EAAI,EAAE,CAAC,CAC7D,EACA,SAAU,EAAO,EAAS,IAAmB,CAC3C4yD,EAAO,gBAAI,MAAM,SAAS,CAAC,CAC7B,CAEyD,CAAC,CAC9D,CAAC,GAjDQ,QAAQ,QAAQ,CAkD3B,CACA,8BAA8B,EAAW,EAAW,EAAM,CACxD,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC0xB,EAAU,qBAAqBgC,CAAI,CAAC,CAAC,KAAM,GAAY,CACrD,KAAK,IAAI,wBAAwBC,EAAU,UAAY,uBAAuB,IAAID,EAAK,WAAW,QAAQrjE,EAAU,EAAE,EACtH0vC,EAAQ2xB,CAAS,CACnB,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB1xB,EAAO,IAAIpvB,GAAY,CACrB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,4CACtB,QACA,MAAO,EACT,EAAGD,EAAM,OAAO,CAAC,CACnB,CAAC,CACH,CAAC,CACH,CACA,aAAa,EAAS,EAAY,CAChC,OAAO,KAAK,eAAe5f,EAAS,IAAI,WAAWypF,CAAU,CAAC,CAAC,CAAC,KAAM,GAC7D,KAAK,iBAAiBzpF,EAAS,IAAI,WAAW6D,CAAI,CAAC,CAAC,CAAC,MAAO,GAAU,CAC3E,MAAM,IAAI4iC,GAAY,CACpB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,iCACtB,YAAa7f,EAAQ,YACrB,QACA,MAAO,EACT,EAAG4f,EAAM,OAAO,CAClB,CAAC,CACF,CACH,CACA,0BAA0B,EAAK,EAAkB,CAC/C,IAAM8pE,EAAY,OAAO,aAAa,MAAM,KAAM,IAAI,YAAYC,EAAiB,MAAM,CAAC,EAC1F,GAAI,CAACD,EAAU,SAAS,qBAAqB,EAE3C,OADAE,EAAI,iBAAiB,eAAgB,yBAAyB,EACvDD,EAET,IAAME,EAAgB,IAAI,UAAU,CAAC,CAAC,gBAAgBH,EAAW,iBAAiB,EAC5E3kD,EAAU8kD,EAAc,iBAAiB,YAAY,EAC3D,GAAI9kD,EAAQ,OAAS,EAAG,CACtB,IAAItP,EACJ,IAAK,IAAIv2B,EAAI,EAAGiC,EAAM4jC,EAAQ,OAAQ7lC,EAAIiC,EAAK,IAAK,CAElD,EAAS4jC,EAAQ7lC,GACjB,IAAM2B,EAAgC40B,EAAO,cAAc,MAAM,CAAA,EAA4C,YACvGzkB,EAAkCykB,EAAO,cAAc,OAAO,CAAA,EAA6C,YAC7G50B,GAAQmQ,GACV44E,EAAI,iBAAiB/oF,EAAMmQ,CAAK,CAEpC,CACF,CACA,IACM84E,EADmBD,EAAc,cAAc,WAC/B,CAAA,EAAqD,YAC3E,GAAI,CAACC,EACH,MAAU,MAAM,wCAAwC,EAE1D,OAAOhlE,GAAe,KAAKglE,CAAa,CAAC,CAC3C,CACA,gBAAgB,EAAK,EAAK,EAAc,EAAkB,CACxD,IAAMC,EAAkB,KAAK,OAAO,gBAQpC,OAPKA,EAOE,QAAQ,QAAQ,CAAC,CAAC,SAAW,CAClC,GAAI,CAACC,EAAa,YAChB,MAAU,MAAM,aAAa,EAE/B,OAAOD,EAAgB,KAAK,KAAK,IAAKH,EAAK3mF,EAAK+mF,EAAcL,CAAgB,CAChF,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,GAAI,CAACK,EAAa,YAChB,MAAMpqE,EAGR,OADAgqE,EAAI,KAAK,OAAQ3mF,EAAK,EAAI,EACnB8mF,EAAgB,KAAK,KAAK,IAAKH,EAAK3mF,EAAK+mF,EAAcL,CAAgB,CAChF,CAAC,CAAC,CAAC,KAAM,IACFC,EAAI,YACPA,EAAI,KAAK,OAAQ3mF,EAAK,EAAI,EAGrB,CACL,MACA,iBAH4BgnF,GAAgDN,CAI9E,EACD,GA1BCC,EAAI,KAAK,OAAQ3mF,EAAK,EAAI,EACnB,QAAQ,QAAQ,CACrB,MACA,kBACF,CAAC,EAuBL,CACA,eAAe,EAAmB,EAAkB,CAClD,IAAM2rD,EAAgB,KAAK,OAAO,cAAc,QAChD,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM3rD,EAAM,KAAK,2BAA2B0kF,EAAkB,SAAS,EACvE,KAAK,IAAI,mCAAmC1kF,GAAK,EACjD,IAAM2mF,EAAM,IAAI,eAChB,EAAI,aAAe,cACnB,EAAI,uBAA2B,CAC7B,GAAI,CAAC,KAAK,KAAO,CAACjC,EAAkB,iBAClC,OAAO9xB,EAAO,gBAAI,MAAM,eAAe,CAAC,EAE1C,GAAI+zB,EAAI,aAAe,EAAG,CACxB,GAAIA,EAAI,SAAW,IAAK,CACtB,KAAK,4BAA8B,EACnC,IAAI/lF,EAAO+lF,EAAI,SACf,KAAK,IAAI,oBAAoB/lF,aAAgB,YAAcA,EAAK,WAAaA,GAAM,EACnF,IAAMqmF,EAA0B,KAAK,OAAO,wBAC5C,GAAIA,EACF,GAAI,CACF,EAAOA,EAAwB,KAAK,KAAK,IAAKN,EAAK3mF,EAAK0kF,CAAiB,CAC3E,OAAS/nE,EAAO,CACd,KAAK,MAAMA,CAAK,CAClB,CAEFg2C,EAAQ/xD,CAAI,CACd,KAAO,CACL,IAAMwc,EAAcuuC,EAAc,WAC5Bu7B,EAAc9pE,EAAcA,EAAY,YAAc,EAE5D,GADA,KAAK,8BACD,KAAK,4BAA8B8pE,GAAeP,EAAI,QAAU,KAAOA,EAAI,OAAS,IACtF/zB,EAAO,IAAIpvB,GAAY,CACrB,KAAM1jB,EAAW,iBACjB,QAASlD,EAAa,kCACtB,YAAa8nE,EAAkB,YAC/B,MAAO,GACP,eAAgBiC,EAChB,SAAU,CACR,MACA,KAAM,IAAK,GACX,KAAMA,EAAI,OACV,KAAMA,EAAI,UACZ,CACF,EAAG,+BAA+B3mF,EAAI,aAAa2mF,EAAI,OAAO,IAAIA,EAAI,WAAW,EAAE,CAAC,MAC/E,CACL,IAAMQ,EAAeD,EAAc,KAAK,4BAA8B,EACtE,KAAK,KAAK,6BAA6BC,EAAa,eAAe,EACnE,KAAK,eAAezC,EAAmBgC,CAAgB,CAAC,CAAC,KAAK/zB,EAASC,CAAM,CAC/E,CACF,CACF,CACF,EACI8xB,EAAkB,YAAcA,EAAkB,WAAW,aAAe,eAAe,MAC7FA,EAAkB,WAAW,MAAM,EAErC,EAAkB,WAAaiC,EAC/B,KAAK,gBAAgBA,EAAK3mF,EAAK0kF,EAAmBgC,CAAgB,CAAC,CAAC,MAAM,CACxE,IAAKU,EACL,iBAAkBC,KACd,CACA3C,EAAkB,WAAa3hE,EAAW,YAC5C,EAAoB,KAAK,0BAA0BqkE,EAAMC,CAAiB,GAE5ED,EAAK,KAAKC,CAAiB,CAC7B,CAAC,CAAC,CAAC,MAAMz0B,CAAM,CACjB,CAAC,CACH,CACA,cAAe,CACb,KAAK,oBAAoB,EACzB,KAAK,OAAO,CACd,CACA,gBAAgB,EAAO,EAAM,CAC3B,GAAI,CAAC,KAAK,OAAO,WACf,OAEF,IAAMh3B,EAAQh7B,EAAK,MACnB,KAAK,MAAQg7B,EACbnO,EAAiBmO,EAAO,YAAa,KAAK,gBAAgB,EAC1DnO,EAAiBmO,EAAO,gBAAiB,KAAK,eAAe,EAC7D,IAAM0rD,EAAgB,KAAK,cACvBA,EACFA,EAAc,EAEd,KAAK,UAAY1rD,EAAM,SAE3B,CACA,iBAAkB,CAChB,IAAMA,EAAQ,KAAK,MACfA,IACFlO,GAAoBkO,EAAO,YAAa,KAAK,gBAAgB,EAC7DlO,GAAoBkO,EAAO,gBAAiB,KAAK,eAAe,EAChE,KAAK,MAAQ,KACb,KAAK,UAAY,KAErB,CACA,QAAS,CACP,IAAI2rD,EACJ,KAAK,4BAA8B,EACnC,KAAK,yBAA2B,CAAC,EACjC,KAAK,aAAe,CAAC,EACrB,IAAMD,EAAgB,KAAK,cAI3B,GAHIA,GACFA,EAAc,EAEZ,CAAC,KAAK,WAAa,CAAC,KAAK,iBAAiB,OAC5C,OAEF,IAAM1rD,EAAQ,KAAK,MACb4rD,EAAgB,KAAK,iBAAiB,MAAM,EAClD,KAAK,iBAAmB,CAAC,EACzB,KAAK,UAAY,KACjB9gE,GAAS,sBAAsB,EAC/B,IAAM+gE,EAAkBD,EAAc,OACtC,EAAc,kBAAoB,QAAQ,IAAIA,EAAc,IAAK,GAA2B,KAAK,cAAc/C,CAAsB,CAAC,CAAC,CAAC,QAAQ7oD,GAAS,OAAS,EAAsBA,EAAM,aAAa,IAAI,IAAM,KAAO,IAAK,GAAI2rD,EAAoB,MAAO,GAAU,CACxQ,KAAK,IAAI,+BAA+B5qE,GAAO,EAC1C,KAAK,KAEV,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,oCACtB,MAAO,GACP,MAAO,gBAAI,MAAM,+BAA+BD,GAAO,CACzD,CAAC,CACH,CAAC,IAAM,QAAQ,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAO,GAAU,CAC1C,KAAK,IAAI,kDAAkDA,GAAO,EAC7D,KAAK,KAEV,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,uCACtB,MAAO,GACP,MAAO,gBAAI,MAAM,kDAAkDD,GAAO,CAC5E,CAAC,CACH,CAAC,CAAC,CAAC,SAAW,CACR8qE,GACF,KAAK,IAAI,uDAAuD,CAEpE,CAAC,CACH,CACA,mBAAoB,CAClB,KAAK,OAAO,CACd,CACA,iBAAiB,EAAO,CACtB,eACC,CACD,GAAKC,GAAgB,KAAK,OAAO,YAG7B,CAAC,KAAK,iBAAkB,CAC1B,IAAMljC,EAAakjC,EAAY,QAAQ,EAAS,KAC1CC,EAAQ,QAAQrwB,EAAW,SAAS,IAAM,IAC5CqwB,EAAQ,KAAKrwB,EAAW,SAAS,EAE5BqwB,GACN,CAAC,CAAC,EACL,KAAK,IAAI,0CAA0CnjC,EAAW,KAAK,IAAI,GAAG,EAC1E,KAAK,iBAAmB,KAAK,oBAAoBA,CAAU,CAC7D,CACF,CACA,cAAc,EAAwB,CACpC,GAAM,CACJ,mBACA,aACA,eACEigC,EACJ,GAAImD,EAAkB,CACpB,KAAK,IAAI,+CAA+CA,EAAiB,UAAU,WAAWrpF,EAAYwI,GAA2C,OAAU,CAAC,CAAC,GAAG,EACpK,AAEE09E,EAAuB,cADvBmD,EAAiB,oBAAoB,UAAWnD,EAAuB,UAAU,EAC7C,IAAK,IAE3C,AAEEA,EAAuB,wBADvBmD,EAAiB,oBAAoB,oBAAqBnD,EAAuB,oBAAoB,EACvD,IAAK,IAEjDoD,GAAcA,EAAW,aAAe,eAAe,MACzDA,EAAW,MAAM,EAEnB,EAAuB,iBAAmB,EAAuB,YAAc,EAAuB,WAAa,IAAK,GACxH,IAAM5lF,EAAQ,KAAK,iBAAiB,QAAQwiF,CAAsB,EAC9DxiF,EAAQ,IACV,KAAK,iBAAiB,OAAOA,EAAO,CAAC,EAEvC,GAAM,CACJ,qBACEwiF,EACAqD,GACF,OAAO,KAAKA,CAAiB,CAAC,CAAC,QAAS,GAAU,KAAK,aAAaA,EAAkB9gF,EAAM,CAAC,EAE/F,GAAM,CACJ,oBACE,KAAK,OAKT,OAJsB0c,GAAwBD,CAAgB,EAAI,IAAI,SAAS,EAAS,IAAW,CACjG,KAAK,eAAiBmvC,EAAO,gBAAI,MAAM,kCAAkC,CAAC,EAAG,GAAG,EAChFg1B,EAAiB,OAAO,CAAC,CAAC,KAAKj1B,CAAO,CAAC,CAAC,MAAMC,CAAM,CACtD,CAAC,EAAI,QAAQ,QAAQ,EAAA,CACA,MAAO,GAAU,CACpC,KAAK,IAAI,6BAA6Bj2C,GAAO,EACxC,KAAK,KAEV,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,wCACtB,MAAO,GACP,MAAO,gBAAI,MAAM,6BAA6BD,GAAO,CACvD,CAAC,CACH,CAAC,CAAC,CAAC,SACMirE,EAAiB,MAAM,CAC/B,CAAC,CAAC,MAAO,GAAU,CAClB,KAAK,IAAI,4BAA4BjrE,GAAO,EACvC,KAAK,KAEV,KAAK,IAAI,QAAQsU,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,uCACtB,MAAO,GACP,MAAO,gBAAI,MAAM,4BAA4BD,GAAO,CACtD,CAAC,CACH,CAAC,CACH,CACA,OAAO,QAAQ,QAAQ,CACzB,CACF,EACA,GAAc,kBAAoB,IAAK,GAmBjC,GAAN,cAA0B,KAAM,CAC9B,YAAY,EAAM,EAAS,CACzB,MAAMgP,CAAO,EACb,KAAK,KAAO,IAAK,GACjB,AAAe/qB,EAAK,QAAY,MAAM+qB,CAAO,EAC7C,KAAK,KAAO/qB,EACZ,EAAK,IAAMA,EAAK,KAClB,CACF,EAWM,GAAN,KAAoB,CAClB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,gCAAkC,GACvC,KAAK,MAAQ,IAAK,GAClB,KAAK,MAAQ,KACb,KAAK,SAAW,IAAK,GACrB,KAAK,kBAAoB,EACzB,KAAK,kBAAoB,EACzB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,IAAMma,EACX,KAAK,kBAAkB,CACzB,CACA,oBAAoB,EAAkB,CACpC,KAAK,iBAAmB2kE,CAC1B,CACA,mBAAoB,CAClB,KAAK,IAAI,GAAGzuD,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC/D,KAAK,IAAI,GAAGA,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CACjE,CACA,qBAAsB,CACpB,KAAK,IAAI,IAAIA,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAChE,KAAK,IAAI,IAAIA,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CAClE,CACA,SAAU,CACJ,KAAK,OACP,cAAc,KAAK,KAAK,EAE1B,KAAK,oBAAoB,EACzB,KAAK,gCAAkC,GACvC,KAAK,MAAQ,IACf,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAM7b,EAAS,KAAK,IAAI,OACxB,GAAIA,EAAO,kBAAmB,CAC5B,IAAMwmB,EAAQh7B,EAAK,iBAAiB,KAAK,iBAAmBA,EAAK,MAAQ,KACzE,KAAK,MAAQg7B,EACTA,GAAS,OAAOA,EAAM,yBAA4B,aACpD,KAAK,gCAAkC,IAEzC,KAAK,cAAc,KAAK,KAAK,EAC7B,KAAK,MAAQ,KAAK,YAAY,KAAK,iBAAiB,KAAK,IAAI,EAAGxmB,EAAO,0BAA0B,CACnG,CACF,CACA,kBAAmB,CACjB,KAAK,MAAQ,IACf,CACA,SAAS,EAAO,EAAe,EAAe,CAC5C,IAAMo6B,EAAc,YAAY,IAAI,EACpC,GAAIu4C,EAAe,CACjB,GAAI,KAAK,SAAU,CACjB,IAAMC,EAAgBx4C,EAAc,KAAK,SACnCy4C,EAAiBC,EAAgB,KAAK,kBACtCC,EAAiBJ,EAAgB,KAAK,kBACtCK,EAAa,IAAMH,EAAiBD,EACpCjtE,EAAM,KAAK,IAMjB,GALAA,EAAI,QAAQkW,EAAO,SAAU,CAC3B,iBACA,iBACA,mBAAoBi3D,CACtB,CAAC,EACGE,EAAa,GACXH,EAAiBltE,EAAI,OAAO,8BAAgCotE,EAAgB,CAC9E,IAAI/tE,EAAeW,EAAI,aACvBA,EAAI,OAAO,KAAK,mEAAqEX,CAAY,EAC7FA,EAAe,IAAMW,EAAI,mBAAqB,IAAMA,EAAI,kBAAoBX,KAC9E,IACAW,EAAI,QAAQkW,EAAO,uBAAwB,CACzC,MAAO7W,EACP,aAAcW,EAAI,YACpB,CAAC,EACD,EAAI,iBAAmBX,EACvB,KAAK,iBAAiB,gBAAgB,EAE1C,CAEJ,CACA,KAAK,SAAWo1B,EAChB,KAAK,kBAAoB04C,EACzB,KAAK,kBAAoBH,CAC3B,CACF,CACA,kBAAmB,CACjB,IAAM1yE,EAAQ,KAAK,MACnB,GAAIA,EAAO,CACT,GAAI,KAAK,gCAAiC,CACxC,IAAMgzE,EAAuBhzE,EAAM,wBAAwB,EAC3D,KAAK,SAASA,EAAOgzE,EAAqB,iBAAkBA,EAAqB,kBAAkB,CACrG,MACE,KAAK,SAAShzE,EAAOA,EAAM,wBAAyBA,EAAM,uBAAuB,CAErF,CACF,CACF,EAwHM,GAAN,cAAsC8gC,EAAuB,CAC3D,YAAY,EAAK,CACf,MAAMp7B,EAAK,2BAA2B,EACtC,KAAK,MAAQ,KACb,KAAK,OAAS,CAAC,EACf,KAAK,SAAW,KAChB,KAAK,cAAgB,CAAC,EACtB,KAAK,QAAU,GACf,KAAK,aAAe,KACpB,KAAK,mBAAqB,GAC1B,KAAK,mBAAqB,GAC1B,KAAK,oBAAsB,GAC3B,KAAK,wBAA0B,GAC/B,KAAK,iBAAmB,GACxB,KAAK,yBAA6B,KAAK,gBAAgB,CAAC,EACxD,KAAK,wBAA4B,CAI/B,GAHK,KAAK,qBACR,KAAK,cAAc,KAAK,uBAAuB,EAE7C,CAAC,KAAK,OAAS,CAAC,KAAK,IAAI,OAAO,yBAClC,OAEF,IAAIugB,EAAY,KACVzzB,EAASg9B,GAAqB,KAAK,MAAM,UAAU,EACzD,IAAK,IAAI5oC,EAAI,EAAGA,EAAI4L,EAAO,OAAQ,IACjC,GAAIA,EAAO5L,EAAE,CAAC,OAAS,SACrB,EAAY4L,EAAO5L,QACd,GAAI4L,EAAO5L,EAAE,CAAC,OAAS,UAAW,CACvC,EAAY4L,EAAO5L,GACnB,KACF,CAEF,IAAMgH,EAAU,KAAK,sBAAsBq4B,CAAS,EAChD,KAAK,gBAAkBr4B,GACzB,KAAK,iBAAiBA,CAAO,CAEjC,EACA,KAAK,kBAAkB,CACzB,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,OAAO,OAAS,EACrB,KAAK,cAAc,OAAS,EAC5B,KAAK,aAAe,KACpB,KAAK,oBAAsB,KAAK,qBAAuB,KACvD,MAAM,QAAQ,CAChB,CACA,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBACd,CACA,IAAI,gBAAgB,EAAO,CACzB,KAAK,iBAAmB8K,EACpB,KAAK,QAAU,IACjB,KAAK,iBAAiB,CAE1B,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACJgN,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,CACzC,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,CAC1C,CACA,gBAAgB,EAAO,EAAM,CAC3B,KAAK,MAAQrwB,EAAK,MACb,KAAK,QAGN,KAAK,mBAAqB,KAC5B,KAAK,cAAgB,KAAK,mBAC1B,KAAK,mBAAqB,IAE5B,KAAK,oBAAsB,EAAE,KAAK,MAAM,YAAc,aAAc,KAAK,MAAM,YAC3E,KAAK,oBACP,KAAK,gBAAgB,GAAG,EAExB,KAAK,MAAM,WAAW,iBAAiB,SAAU,KAAK,oBAAoB,EAE9E,CACA,gBAAgB,EAAS,CACvB,KAAK,cAAc,KAAK,uBAAuB,EAC/C,KAAK,wBAA0B,KAAK,YAAY,KAAK,oBAAqBolF,CAAO,CACnF,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAMpqD,EAAQ,KAAK,MACnB,GAAI,CAACA,EACH,OAEF,IAAMw+B,EAAoB,CAAC,CAACx5D,EAAK,cACjC,KAAK,cAAc,KAAK,uBAAuB,EAC1C,KAAK,qBACRg7B,EAAM,WAAW,oBAAoB,SAAU,KAAK,oBAAoB,EAEtE,KAAK,QAAU,KACjB,KAAK,mBAAqB,KAAK,SAEjC,KAAK,cAAgB,GACrB,KAAK,MAAQ,KACT,IAIJiJ,GADwCjJ,EAAM,UACrC,CAAC,CAAC,QAAS,GAAU,CAC5BqI,GAAiBvgC,CAAK,CACxB,CAAC,CACH,CACA,mBAAoB,CAClB,KAAK,OAAS,CAAC,EACf,KAAK,SAAW,KAChB,KAAK,cAAgB,CAAC,EACtB,KAAK,QAAU,GACf,KAAK,aAAe,KACpB,KAAK,mBAAqB,EAC5B,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,OAAS9C,EAAK,cACrB,CACA,sBAAsB,EAAO,EAAM,CACjC,GAAM,CACJ,KACA,UACA,WACEA,EACEo4E,EAAqB,KAAK,cAAcz8E,GAC9C,GAAI,CAACy8E,GAAsBA,EAAmB,UAAYvmE,EAAS,CACjE,KAAK,KAAK,0BAA0BlW,EAAG,aAAakW,EAAQ,6BAA6BumE,GAAyD,SAAS,EAC3J,MACF,CACA,IAAMC,EAAaD,EAAmB,QACtC,EAAmB,QAAUp4E,EAAK,QAClC,KAAK,IAAI,kBAAkBrE,EAAG,IAAIy8E,EAAmB,KAAK,SAASA,EAAmB,KAAK,SAASvmE,EAAQ,WAAWmD,EAAQ,QAAQ,GAAGA,EAAQ,MAAM,EAAE,EACtJrZ,IAAO,KAAK,SACd,KAAK,eAAeA,EAAIqE,EAAMq4E,CAAU,CAE5C,CACA,eAAe,EAAO,EAAM,CAC1B,KAAK,YAAYr4E,EAAK,KAAK,CAC7B,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,YAAYA,EAAK,KAAK,CAC7B,CACA,YAAY,EAAY,CACtB,IAAMypD,EAAY,KAAK,IAAI,OAAOoB,GAClC,GAAI,CAACpB,EACH,OAEF,IAAM/E,EAAiB+E,EAAU,gBAAkB,KAC7C6uB,EAAgB,KAAK,SACvBC,EAAe,KAAK,aACxB,GAAI,CAAC7zB,GAAmB4zB,GAA+C,SAAa5zB,GAAiD,QAAWA,GAAkB,MAAQA,EAAe,KAAM,GAAa4zB,GAA+C,QAAQzmE,CAAO,IAAO,EAAE,EAAG,CACpR,KAAK,SAAW6yC,EAChB,KAAK,QAAU,GACf,KAAK,aAAe,KACpB,IAAMgjC,EAAiB,KAAK,OAAO,OAAQ,GAAU,CAAChjC,GAAkBA,EAAe,QAAQ5hD,EAAM,OAAO,IAAM,EAAE,EACpH,GAAI4kF,EAAe,OACb,KAAK,oBAAsB,CAACA,EAAe,KAAM,GAAU5kF,EAAM,OAAO,IAC1E,KAAK,mBAAqB,IAE5B4kF,EAAe,SAAS,EAAO,IAAM,CACnC,EAAM,GAAKrsF,CACb,CAAC,OACI,GAAI,CAACk9E,GAAgB,CAAC,KAAK,cAAc,OAC9C,OAEF,KAAK,cAAgBmP,EACrB,IAAMC,EAAqB,KAAK,IAAI,OAAO,mBAC3C,GAAI,CAACpP,GAAgBoP,EAAoB,CACvC,KAAK,mBAAqB,GAC1B,IAAMnP,EAAalgE,GAAmBqvE,EAAoBD,CAAc,EACxE,GAAIlP,EAAa,GACf,EAAekP,EAAelP,OACzB,CACL,IAAMC,EAAWngE,GAAmBqvE,EAAoB,KAAK,MAAM,EACnE,EAAe,KAAK,OAAOlP,EAC7B,CACF,CACA,IAAIp2E,EAAU,KAAK,YAAYk2E,CAAY,EACvCl2E,IAAY,IAAMk2E,IACpB,EAAU,KAAK,YAAY,IAAI,GAEjC,IAAMqP,EAAwB,CAC5B,gBACF,EACA,KAAK,IAAI,6BAA6BF,EAAe,OAAO,sBAAsBhjC,GAAiD,KAAK,GAAG,EAAE,WAAW,EACxJ,KAAK,IAAI,QAAQr0B,EAAO,wBAAyBu3D,CAAqB,EAClEvlF,IAAY,IAAM,KAAK,UAAY,IACrC,KAAK,iBAAiBA,CAAO,CAEjC,CACF,CACA,YAAY,EAAc,CACxB,IAAM4E,EAAS,KAAK,cACd4gF,EAAgB,KAAK,mBAC3B,IAAK,IAAIxsF,EAAI,EAAGA,EAAI4L,EAAO,OAAQ,IAAK,CACtC,IAAMnE,EAAQmE,EAAO5L,GACrB,GAAI,KAAiB,CAACyH,EAAM,SAAW,CAAC+kF,GAAiB,CAACtP,KAGtD,CAACA,GAAgBhgE,GAAczV,EAAOy1E,CAAY,GACpD,OAAOl9E,CAEX,CACA,GAAIk9E,EAAc,CAChB,IAAK,IAAIl9E,EAAI,EAAGA,EAAI4L,EAAO,OAAQ,IAAK,CACtC,IAAMnE,EAAQmE,EAAO5L,GACrB,GAAI8+B,GAAyBo+C,EAAa,MAAOz1E,EAAM,MAAO,CAAC,WAAY,iBAAkB,iBAAiB,CAAC,EAC7G,OAAOzH,CAEX,CACA,IAAK,IAAIA,EAAI,EAAGA,EAAI4L,EAAO,OAAQ,IAAK,CACtC,IAAMnE,EAAQmE,EAAO5L,GACrB,GAAI8+B,GAAyBo+C,EAAa,MAAOz1E,EAAM,MAAO,CAAC,UAAU,CAAC,EACxE,OAAOzH,CAEX,CACF,CACA,MAAO,EACT,CACA,sBAAsB,EAAW,CAC/B,GAAIq/B,EAAW,CACb,IAAMzzB,EAAS,KAAK,cACpB,IAAK,IAAI5L,EAAI,EAAGA,EAAI4L,EAAO,OAAQ,IAAK,CACtC,IAAMnE,EAAQmE,EAAO5L,GACrB,GAAIo/B,GAA8B33B,EAAO43B,CAAS,EAChD,OAAOr/B,CAEX,CACF,CACA,MAAO,EACT,CACA,QAAQ,EAAO,EAAM,CACf,GAAK,OAAU2E,EAAK,SAGpBA,EAAK,QAAQ,OAASiwC,EAAoB,gBAAkBjwC,EAAK,QAAQ,KAAO,KAAK,UAAY,CAAC,KAAK,UAAY,KAAK,SAAS,QAAQA,EAAK,QAAQ,OAAO,IAAM,KACrK,KAAK,WAAWA,CAAI,CAExB,CACA,IAAI,mBAAoB,CACtB,OAAO,KAAK,MACd,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,aACd,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,OACd,CACA,IAAI,cAAc,EAAO,CACvB,KAAK,mBAAqB,GAC1B,KAAK,iBAAiB44E,CAAK,CAC7B,CACA,kBAAkB,EAAgB,CAEhC,GADA,KAAK,IAAI,OAAO,mBAAqBkP,EACjCA,EAAgB,CAClB,GAAIA,EAAe,KAAO,GAExB,OADA,KAAK,iBAAiB,EAAE,EACjB,KAET,IAAMC,EAAoB,KAAK,kBAE/B,GADA,KAAK,mBAAqB,GACtBA,EAAkB,OAAQ,CAC5B,IAAMxP,EAAe,KAAK,aAC1B,GAAIA,GAAgBhgE,GAAcuvE,EAAgBvP,CAAY,EAC5D,OAAOA,EAET,IAAMC,EAAalgE,GAAmBwvE,EAAgB,KAAK,aAAa,EACxE,GAAItP,EAAa,GAAI,CACnB,IAAM11E,EAAQ,KAAK,cAAc01E,GAEjC,OADA,KAAK,iBAAiBA,CAAU,EACzB11E,CACT,CAAO,GAAIy1E,EACT,OAAO,KACF,CACL,IAAME,EAAWngE,GAAmBwvE,EAAgBC,CAAiB,EACrE,GAAItP,EAAW,GACb,OAAOsP,EAAkBtP,EAE7B,CACF,CACF,CACA,OAAO,IACT,CACA,aAAa,EAAkB,CAC7B,MAAM,aAAa,EACf,KAAK,mBAAmB,KAAK,YAAY,GAC3C,KAAK,gBAAgB,KAAK,aAAcxB,CAAgB,CAE5D,CACA,gBAAgB,EAAc,EAAkB,CAC9C,MAAM,gBAAgBsB,EAActB,CAAgB,EACpD,IAAMt7E,EAAK48E,EAAa,GAClB1mE,EAAU0mE,EAAa,QACvBn5E,EAAM,KAAK,qBAAqBm5E,EAAa,IAAKtB,CAAgB,EAClEjiE,EAAUujE,EAAa,QACvBrjE,EAAMF,GAAmC,IAC/C,KAAK,IAAI,oBAAoBrZ,EAAG,IAAI48E,EAAa,KAAK,SAASA,EAAa,KAAK,SAAS1mE,IAAWolE,GAAqD,MAAS,IAAK,GAA0E,GAAtE,UAAYA,EAAiB,IAAM,SAAWA,EAAiB,OAAY/hE,GAAOF,EAAQ,KAAO,QAAUE,EAAI,QAAQ,CAAC,GAAKF,EAAQ,MAAO,IAAMA,EAAQ,MAAQ,IAAW,GAAG,GAAG5V,GAAK,EACpW,KAAK,IAAI,QAAQixB,EAAO,uBAAwB,CAC9C,MACA,KACA,UACA,mBAAoB4mD,GAAoB,KACxC,MAAOsB,CACT,CAAC,CACH,CACA,kBAAmB,CACjB,GAAM,CACJ,SACE,KACJ,GAAI,CAACv9C,EACH,OAEF,IAAMgtD,EAAa/jD,GAAqBjJ,EAAM,UAAU,EAClDu9C,EAAe,KAAK,aACtB0P,EAYJ,GAXI1P,IACF,EAAYyP,EAAW,OAAQ,GAAcvtD,GAA8B89C,EAAc79C,CAAS,CAAC,CAAC,CAAC,GAChGutD,GACH,KAAK,KAAK,gDAAgD1P,EAAa,KAAK,kBAAkBA,EAAa,KAAK,EAAE,GAGtH,CAAC,CAAC,CAAC,MAAM,KAAKyP,CAAU,CAAC,CAAC,QAAS,GAAU,CACvCllF,EAAM,OAAS,YAAcA,IAAUmlF,IACzC,EAAM,KAAO,WAEjB,CAAC,EACGA,EAAW,CACb,IAAMjlD,EAAO,KAAK,gBAAkB,UAAY,SAC5CilD,EAAU,OAASjlD,IACrB,EAAU,KAAOA,EAErB,CACF,CACA,iBAAiB,EAAO,CACtB,IAAM/7B,EAAS,KAAK,cACpB,GAAI,CAAC,KAAK,MAAO,CACf,KAAK,mBAAqB2xE,EAC1B,MACF,CACA,GAAIA,EAAQ,IAAMA,GAAS3xE,EAAO,QAAU,CAACU,EAAeixE,CAAK,EAAG,CAClE,KAAK,KAAK,8BAA8BA,GAAO,EAC/C,MACF,CACA,KAAK,mBAAqB,GAC1B,IAAMI,EAAY,KAAK,aACjBl2E,EAAQmE,EAAO2xE,IAAU,KAI/B,GAHA,KAAK,QAAUA,EACf,KAAK,aAAe91E,EACpB,KAAK,iBAAiB,EAClB,CAACA,EAAO,CACV,KAAK,IAAI,QAAQutB,EAAO,sBAAuB,CAC7C,GAAIuoD,CACN,CAAC,EACD,MACF,CACA,IAAMK,EAAc,CAAC,CAACn2E,EAAM,SAAW,CAACA,EAAM,QAAQ,KACtD,GAAI81E,IAAU,KAAK,SAAW91E,IAAUk2E,GAAaC,EACnD,OAEF,KAAK,IAAI,+BAA+BL,KAAW91E,EAAQ,KAAKA,EAAM,KAAK,SAASA,EAAM,KAAK,SAASA,EAAM,UAAY,GAAG,EAC7H,GAAM,CACJ,KACA,UAAU,GACV,OACA,OACA,OACEA,EACJ,KAAK,IAAI,QAAQutB,EAAO,sBAAuB,CAC7C,KACA,UACA,OACA,OACA,KACF,CAAC,EACD,IAAM4mD,EAAmB,KAAK,aAAan0E,EAAM,IAAKk2E,GAAuC,QAASl2E,EAAM,OAAO,EACnH,KAAK,aAAam0E,CAAgB,CACpC,CACF,EA6BM,GAAgC,KAClC,GAAoC,yBAAS,EAAoB,CAGnE,MAFA,GAAmB,EAAmBiR,MAAW,GAAK,QACtD,EAAmB,EAAmBC,MAAW,GAAK,QAC/CC,CACT,EAAE,CAAC,CAAC,EAIE,GAAN,KAAwB,CACtB,YAAY,EAAW,EAAM,CAC3B,KAAK,KAAO,IAAK,GACjB,KAAK,UAAY,KACjB,KAAK,eAAiB,KACtB,KAAK,sBAAwB,IAAK,GAClC,KAAK,qBAAuB,IAAK,GACjC,KAAK,UAAY,IAAK,GACtB,KAAK,UAAY,GACjB,KAAK,mBAAqB,EAC1B,KAAK,aAAe,IACpB,KAAK,aAAe,IACpB,KAAK,aAAe,CAClB,KAAM,GACN,KAAM,EACR,EACA,KAAK,YAAc,CACjB,IAAK,GACL,GAAI,EACN,EACA,KAAK,UAAY,CAAC,EAClB,KAAK,gBAAkB,IAAK,GAC5B,KAAK,kBAAoB,KACzB,KAAK,aAAe,IAAK,GACzB,KAAK,MAAQ,IAAK,GAClB,KAAK,cAAgB,IAAK,GAC1B,KAAK,KAAOlpD,EACZ,KAAK,UAAY3a,EACjB,KAAK,aAAaA,CAAS,CAC7B,CACA,aAAa,EAAW,CACtB,KAAK,UAAYA,EACjB,KAAK,aAAeA,EAAU,KAAK,cAAc,kBAAmB,KAAK,YAAY,EACrF,KAAK,aAAeA,EAAU,KAAK,cAAc,kBAAmB,KAAK,YAAY,EACrF,KAAK,aAAeA,EAAU,KAAK,qBAAqB,aAAc,KAAK,YAAY,EACvF,KAAK,YAAcA,EAAU,KAAK,qBAAqB,SAAU,KAAK,WAAW,CACnF,CACA,OAAQ,CACN,IAAI8jE,EACJ,KAAK,qBAAuB,IAC3B,EAAwB,KAAK,kBAAoB,MAAQA,EAAsB,QAAQ,EACxF,KAAK,gBAAkB,IAAK,GACvB,KAAK,qBACR,KAAK,kBAAoB,KACzB,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,KAErB,CACA,wBAAwB,EAAY,CAElC,GAAIC,EAAa,GAAKA,GAAc,KAAK,UAAU,OACjD,MAAO,GAET,IAAMC,EAAe,KAAK,aAQ1B,OAPID,GAAc,GAAK,MAAMC,CAAY,EAChC,GAELA,IAAiB,IAGyB,KAAK,UAAUD,EAAA,EAAsD,aAAgB,GAC9GC,CACvB,CACA,eAAe,EAAO,CAEpB,OADc,KAAK,UAAU,QAAQnjD,CAC1B,CACb,CACA,IAAI,YAAa,CACf,OAAO,KAAK,UAAU,EACxB,CACA,IAAI,WAAY,CACd,OAAO,KAAK,UAAU,SACxB,CACA,IAAI,WAAY,CACd,IAAM3L,EAAY,KAAK,UAAU,UACjC,GAAI,KAAK,YAAY,IAAK,CACxB,IAAMj6B,EAAO,KAAK,UAAU,UAC5B,GAAIA,EACF,OAAOmlC,GAAsBlL,EAAWj6B,CAAI,CAEhD,CACA,OAAOi6B,CACT,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,IAAI,IAAM,EAAI,KAAK,SACjC,CACA,IAAI,gBAAiB,CACnB,GAAI,KAAK,YAAc,GAAK,KAAK,YAAY,IAC3C,MAAO,GAET,IAAMj6B,EAAO,KAAK,UAAU,UAC5B,GAAIA,EAAM,CACR,IAAMi6B,EAAY,KAAK,UAAU,UAEjC,OAAOA,EADckL,GAAsBlL,EAAWj6B,CACxB,EAAI,EACpC,CACA,MAAO,EACT,CACA,IAAI,kBAAmB,CACrB,IAAMgpF,EAAe,KAAK,aACpBpoF,EAASuH,EAAe6gF,CAAY,EAAIA,EAAe,KAAK,SAClE,OAAO,KAAK,mBAAqBpoF,CACnC,CACA,IAAI,YAAa,CACf,IAAMqoF,EAAa,KAAK,YAAc,KAAK,iBAC3C,GAAI,KAAK,YAAY,GAAI,CACvB,IAAMjpF,EAAO,KAAK,aAClB,GAAIA,EACF,OAAOmlC,GAAsB8jD,EAAYjpF,CAAI,CAEjD,CACA,OAAOipF,CACT,CACA,IAAI,eAAgB,CAUlB,OATI,KAAK,qBACA,GAET,CAAI,KAAK,uBAGT,GAAI,CAAC,KAAK,IAAI,MAAQ,CAAC,KAAK,IAAI,KAAO,KAAK,iBAAmB,MAAM,KAAK,YAAY,GAAK,MAAM,KAAK,YAAY,GAAK,KAAK,cAAgB,KAAK,UAAY,KAAK,IAAI,KAAK,aAAe,KAAK,QAAQ,EAAI7jD,IAI7M,CACA,IAAI,cAAc,EAAO,CACnB,KAAK,qBACP,KAAK,cAAgB,CAACz3B,EAGxB,KAAK,sBAAwB,CAACA,CAChC,CACA,IAAI,eAAgB,CAIlB,OAHI,KAAK,iBAAmB,KAGrB,KAAK,UAFH,KAAK,cAGhB,CACA,IAAI,cAAc,EAAO,CACvB,KAAK,eAAiBA,CACxB,CACA,IAAI,UAAW,CACb,IAAMo7E,EAAe,KAAK,aACtBjtE,EAWJ,MAVA,CACEA,EADE,KAAK,YAAc,KAEZ,KAAK,UAAU,SACb,KAAK,UAAU,SAEf,KAAK,UAAU,iBAAmB,EAJlC,KAAK,UAMd,CAAC,MAAMitE,CAAY,GAAKA,EAAejtE,IACzC,EAAWitE,GAENjtE,CACT,CACA,IAAI,SAAS,EAAO,CAClB,KAAK,UAAYnO,CACnB,CACA,IAAI,KAAM,CACR,OAAO,KAAK,UAAU,GACxB,CACA,IAAI,mBAAoB,CAItB,OAHI,KAAK,UAAU,KAAK,yBAA2B,QAC1C4pC,GAAkB,MAEpBA,GAAkB,KAC3B,CACA,IAAI,oBAAqB,CACvB,OAAO,KAAK,UAAU,KAAK,sBAAwB,SACrD,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,UAAU,KAAK,wBAA0B,IACvD,CACA,IAAI,UAAW,CACb,OAAO,KAAK,UAAU,KAAK,cAC7B,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,UAAU,KAAK,eAC7B,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,KAAK,GACnB,CACA,IAAI,iBAAkB,CACpB,OAAO,KAAK,UAAU,OAAS,GAAK,KAAK,oBAAsB,IACjE,CACA,UAAW,CACT,OAAO7R,GAAc,IAAI,CAC3B,CACF,EAyBM,GAAN,KAAqB,CACnB,YAAY,EAAgB,EAAY,EAAc,EAAW,CAC/D,KAAK,IAAM,IAAK,GAChB,KAAK,aAAe,IAAK,GACzB,KAAK,UAAY,IAAK,GACtB,KAAK,OAAS,KACd,KAAK,WAAa,GAClB,KAAK,cAAgB,KACrB,KAAK,aAAe,IAAK,GACzB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,iBAAqB,CACpB,KAAK,eAAe,KAAK,WAAW,GAAK,KAAK,KAChD,KAAK,IAAI,QAAQ7U,EAAO,sBAAuB,CAAC,CAAC,CAErD,EACA,IAAMlW,EAAM,KAAK,IAAM,IAAIuuE,EAAej7C,CAAU,EACpD,KAAK,aAAehJ,EACpB,KAAK,UAAYkkD,EACjB,IAAMC,MAAsB,CAC1B,KAAK,WAAa,EACpB,EACAzuE,EAAI,KAAKkW,EAAO,aAAcu4D,CAAa,EAC3CzuE,EAAI,KAAKkW,EAAO,mBAAoBu4D,CAAa,EACjDzuE,EAAI,KAAKkW,EAAO,sBAAuBu4D,CAAa,EACpDzuE,EAAI,GAAGkW,EAAO,iBAAkB,EAAM,CACpC,WACI,CACJ,KAAK,qBAAqB,EAC1B,KAAK,cAAgB2K,EACP,KAAK,aACT,eACRA,EAAM,iBAAiB,aAAc,KAAK,YAAY,EAClD,KAAK,eACP7gB,EAAI,GAAGkW,EAAO,oBAAuB,CACnC,IAAMw4D,EAAc,KAAK,YACrB,KAAK,eAAeA,CAAW,IACjC,KAAK,iBAAmBA,EACxB1uE,EAAI,QAAQkW,EAAO,gBAAiB,IAAK,EAAC,EAE9C,CAAC,EAGP,CAAC,CACH,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,aAAa,aAC3B,CACA,YAAa,CACX,IAAMlW,EAAM,KAAK,IACjB,GAAKA,EAGL,IAAKA,EAAI,IAOEA,EAAI,OAAO,QAAU,CAACA,EAAI,SACnCA,EAAI,UAAU,GAAI,EAAI,MARV,CACZ,IAAIR,EAAM,KAAK,UAAU,IACzB,GAAI,CACF,EAAMkrB,GAAmBlrB,EAAKQ,EAAI,OAAO,kBAAoB,EAAE,CAAC,CAAC,IACnE,MAAgB,CAChB,CACAA,EAAI,WAAWR,CAAG,CACpB,CACwB,CAE1B,CACA,qBAAqB,EAAO,CAC1B,IAAIm0C,EACJ,GAAI,CAAC,KAAK,cACR,MAAO,GAET,IAAK,EAAY,KAAK,MAAQ,MAAQA,EAAU,cAC9C,MAAO,GAET,GAAI,CAAC9yB,EACH,MAAO,GAET,IAAM1f,EAAW,KAAK,IAAI,KAAK,kBAAoB,IAAU,KAAK,QAAQ,EACpEqD,EAAQ,KAAK,eACb6mC,EAAaxT,EAAa,WAAWhX,EAAOrc,EAAO,CAAC,EAE1D,OADoB,KAAK,aAAa6mC,EAAW,GAChC,GAAKlqC,EAAW,GACnC,CACA,eAAe,EAAM,CAEnB,IAAMitE,EADe,KAAK,aACQ,aAClC,OAAO,KAAK,YAAc5kD,GAAQ4kD,CACpC,CACA,IAAI,WAAY,CACd,IAAIO,EACJ,MAAO,GAAG,EAAa,KAAK,MAAQ,MAAQA,EAAW,WACzD,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,UAAU,UACxB,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,UAAU,gBACxB,CACA,IAAI,OAAQ,CAEV,OAAsB,KAAK,KAAmC,OAAU,IAC1E,CACA,IAAI,aAAc,CAChB,IAAM9tD,EAAQ,KAAK,OAAS,KAAK,cACjC,GAAI,CAACA,EAIH,OAHI,KAAK,iBACA,KAAK,iBAEP,KAAK,YAEd,IAAMwqB,EAAaxT,EAAa,WAAWhX,EAAOA,EAAM,YAAa,IAAI,EACzE,OAAO,KAAK,aAAawqB,EAAW,GAAG,CACzC,CACA,IAAI,aAAc,CAChB,IAAMxqB,EAAQ,KAAK,OAAS,KAAK,cAIjC,OAHKA,EAGE,KAAK,aAAaA,EAAM,WAAW,EAFjC,KAAK,cAAgB,CAGhC,CACA,IAAI,UAAW,CACb,IAAM1f,EAAW,KAAK,UAAU,SAChC,GAAI,CAACA,EACH,MAAO,GAET,IAAMitE,EAAe,KAAK,aAAa,aACvC,GAAIA,EAAc,CAChB,IAAMQ,EAAeR,EAAe,KAAK,YACzC,GAAIQ,EAAe,GAAKA,EAAeztE,EACrC,OAAOytE,CAEX,CACA,OAAOztE,CACT,CACA,IAAI,WAAY,CACd,IAAMA,EAAW,KAAK,SAItB,OAHKA,EAGE,KAAK,IAAI,EAAGA,EAAW,KAAK,WAAW,EAFrC,CAGX,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,UAAU,WACxB,CACA,IAAI,gBAAiB,CAEnB,OAAsB,KAAK,KAAmC,OAAO,gBAAmB,CAC1F,CACA,IAAI,eAAe,EAAO,CACxB,IAAM4iD,EAAiB,KAAK,eAC5B,GAAI/wD,IAAU+wD,EAAgB,CAC5B,IAAM8qB,EAAO77E,EAAQ+wD,EACrB,GAAI,KAAK,IAAI8qB,CAAI,EAAI,EAAI,KAAO,KAAK,IAAK,CACxC,GAAI,KAAK,WACP,MAAU,MAAM,sDAAsD,EAExE,KAAK,IAAI,OAAO,eAAiB77E,CACnC,CACF,CACF,CACA,aAAa,EAAM,CACjB,IAAM+wD,EAAiB,KAAK,eACtB5iD,EAAW,KAAK,SACtB,OAAO,KAAK,IAAI,KAAK,IAAI,EAAGqoB,EAAOu6B,CAAc,EAAG5iD,CAAQ,CAC9D,CACA,sBAAuB,CACrB,IAAM0f,EAAQ,KAAK,cACfA,IACF,KAAK,aAAeA,EAAM,YAC1B,KAAK,eAAe,EACpBA,EAAM,oBAAoB,aAAc,KAAK,YAAY,EAE7D,CACA,gBAAiB,CACf,GAAI,KAAK,cAAe,CACtB,IAAIiuD,GACC,EAAa,KAAK,MAAQ,MAAQA,EAAW,gBAChD,KAAK,iBAAmB,KAAK,YAEjC,CACF,CACA,SAAU,CACR,KAAK,qBAAqB,EACtB,KAAK,KACP,KAAK,IAAI,QAAQ,EAEnB,KAAK,IAAM,KACX,KAAK,OAAS,KAAK,cAAgB,KAAK,aAAe,IACzD,CACA,YAAY,EAAM,CAChB,IAAIC,EACJ,KAAK,WAAW,GACf,EAAa,KAAK,MAAQ,MAAQA,EAAW,YAAYlpF,CAAI,CAChE,CACA,aAAc,CACZ,IAAImpF,EACJ,KAAK,qBAAqB,EAC1B,KAAK,cAAgB,MACpB,EAAa,KAAK,MAAQ,MAAQA,EAAW,YAAY,CAC5D,CACA,iBAAkB,CAChB,IAAIC,GACH,EAAa,KAAK,MAAQ,MAAQA,EAAW,gBAAgB,CAChE,CACA,gBAAiB,CACf,IAAIC,GACH,EAAa,KAAK,MAAQ,MAAQA,EAAW,eAAe,CAC/D,CACA,eAAgB,CAGd,OADA,KAAK,eAAe,EACE,KAAK,KAAmC,cAAc,GAAM,IACpF,CACA,cAAe,CACb,IAAMlvE,EAAM,KAAK,IACjB,GAAIA,GAAO,KAAK,WAAY,CAC1BA,EAAI,SAAS,EACb,IAAMmvE,EAAiB,GAAQ,OAAO32D,EAAI,QAC1CxY,EAAI,OAAO,QAAQmvE,CAAa,EAChCnvE,EAAI,eAAe,QAAQmvE,CAAa,EACxCnvE,EAAI,kBAAkB,QAAQmvE,CAAa,EAC3C,KAAK,WAAa,EACpB,CACF,CACA,GAAG,EAAO,EAAU,EAAS,CAC3B,IAAIC,GACH,EAAa,KAAK,MAAQ,MAAQA,EAAW,GAAGv7D,EAAOjB,CAAQ,CAClE,CACA,KAAK,EAAO,EAAU,EAAS,CAC7B,IAAIy8D,GACH,EAAc,KAAK,MAAQ,MAAQA,EAAY,KAAKx7D,EAAOjB,CAAQ,CACtE,CACA,IAAI,EAAO,EAAU,EAAS,CAC5B,IAAI08D,GACH,EAAc,KAAK,MAAQ,MAAQA,EAAY,IAAIz7D,EAAOjB,CAAQ,CACrE,CACA,UAAW,CAET,MAAO,mBAAmBoY,GAAmB,KAAK,SAAS,EAAE,GAAkB,KAAK,KAAoC,UAAU,GAAG,KAAK,cAAgB,kBAAoB,IAChL,CACF,EACM,GAA6B,KAC7B,GAAN,cAAoCoL,EAAO,CACzC,YAAY,EAAkB,EAAS,CACrC,MAAM,sBAAuB7oC,CAAO,EACpC,KAAK,iBAAmB,IAAK,GAC7B,KAAK,SAAW,CAAC,EACjB,KAAK,OAAS,KACd,KAAK,MAAQ,KACb,KAAK,UAAY,CACf,QAAS,EACT,QAAS,EACT,WAAY,CACd,EACA,KAAK,iBAAmBgiF,CAC1B,CACA,SAAU,CACR,KAAK,MAAM,EACX,KAAK,iBAAmB,IAC1B,CACA,OAAQ,CACN,KAAK,SAAW,CAAC,EACjB,KAAK,aAAa,EAAG,EAAG,CAAC,EACrB,KAAK,QACP,KAAK,OAAO,QAAS,GAAiBjlD,EAAa,MAAM,CAAC,EAE5D,KAAK,OAAS,KAAK,MAAQ,IAC7B,CACA,mBAAmB,EAAO,EAAK,CAU7B,OATI,KAAK,OACA,KAAK,OAAO,QAAQ,EAAO,IAC5B9lB,GAAS8lB,EAAa,aAAe/jC,EAAM+jC,EAAa,aAC1D,OAAOA,EAAa,MACbw9B,EAAQ,GAEVA,EACN,CAAC,EAEC,CACT,CACA,IAAI,UAAW,CACb,IAAM0nB,EAAQ,KAAK,MACnB,OAAOA,EAAQA,EAAMA,EAAM,OAAS,EAAE,CAAC,IAAM,CAC/C,CACA,IAAI,QAAS,CACX,OAAO,KAAK,MAAQ,KAAK,MAAM,OAAS,CAC1C,CACA,SAAS,EAAY,CACnB,OAAOv1B,GAAa,KAAK,SAASA,IAAe,IACnD,CACA,SAAS,EAAY,CACnB,OAAOA,KAAc,KAAK,QAC5B,CACA,cAAc,EAAM,EAAM,CACxB,GAAIl2B,EAAK,MACP,OAAO,KAAK,eAAeA,EAAK,MAAM,UAAU,EAElD,IAAI78B,EAAQ,GACR68B,EAAK,UACP,EAAQ,KAAK,eAAeA,EAAK,UAAU,UAAU,EAAI,EAChDA,EAAK,gBACd,EAAQ,KAAK,eAAeA,EAAK,cAAc,UAAU,EAAI,GAE/D,IAAMyrD,EAAQ,KAAK,MACnB,GAAIA,EAOF,IANKA,EAAMtoF,KACLsiC,IAAS,IAAK,KAChB,EAAOzF,EAAK,OAEd,EAAQ,KAAK,oBAAoByF,CAAI,GAEhCtiC,GAAS,IAAM,EAAesoF,EAAMtoF,KAAW,MAAQuoF,EAAa,OAAO,CAChF,IAAIA,EACJ,GACF,CAEF,OAAOvoF,CACT,CACA,oBAAoB,EAAa,EAAc,CAC7C,IAAMsoF,EAAQ,KAAK,MACnB,GAAIA,EACF,IAAK,IAAItuF,EAAI,EAAGA,EAAIsuF,EAAM,OAAQ,IAAK,CACrC,IAAIr9B,EAAYq9B,EAAMtuF,GAItB,GAHIwuF,GAAgBA,IAAiB,YACnC,EAAYv9B,EAAUu9B,IAEpBC,IAAgBx9B,EAAU,OAASw9B,EAAcx9B,EAAU,OAASw9B,EAAcx9B,EAAU,IAC9F,OAAOjxD,CAEX,CAEF,MAAO,EACT,CACA,wBAAwB,EAAY,EAAU,CAC5C,IAAMsuF,EAAQ,KAAK,MACnB,GAAIA,EACF,IAAK,IAAItuF,EAAIypB,EAAYzpB,GAAK0pB,GACvB4kE,EAAMtuF,GAD2B,IAAK,CAI3C,IAAM2yB,EAAQ27D,EAAMtuF,EAAE,CAAC,MACvB,GAAI2yB,GAAS,MAAQA,EAAM,aAAa,MAAQ,CAACA,EAAM,cACrD,OAAO3yB,CAEX,CAEF,MAAO,EACT,CACA,eAAe,EAAY,CACzB,IAAMsuF,EAAQ,KAAK,MACnB,GAAIA,EACF,KAAK,IAAItuF,EAAIsuF,EAAM,OAAQ,KAEzB,GAAuBA,EAAMtuF,EAAE,CAAC,OAAyC,aAAgB+4D,EACvF,OAAO/4D,CAEX,CAEF,MAAO,EACT,CACA,eAAe,EAAO,EAAa,CACjC,IAAM0uF,EAAY/7D,EAAM,UAClBrhB,EAASo9E,EAAU,OACzB,GAAIp9E,EAAS,EACX,IAAK,IAAItR,EAAI,EAAGA,EAAIsR,EAAQ,IAAK,CAC/B,IAAMy4B,EAAQ2kD,EAAU1uF,GACxB,GAAI,CAAC+pC,EAAM,MAAO,CAChB,IAAMg0B,EAAgBh0B,EAAM,cAC5B,GAAI0kD,IAAgB1wB,GAAiB0wB,EAAc1wB,IAAkB0wB,EAAc1wB,GAAiBh0B,EAAM,UAAY,IAAM/pC,IAAMsR,EAAS,GACzI,OAAOtR,CAEX,CACF,CAEF,MAAO,EACT,CACA,IAAI,cAAe,CACjB,IAAI2uF,EACJ,IAAMC,GAAqB,EAAc,KAAK,QAAU,OAAS,EAAcD,EAAY,KAAK,OAAS,KAAO,KAAO,IAAK,GAAIA,EAAY,MAC5I,GAAIC,EAAmB,CACrB,IAAMF,EAAYE,EAAkB,UAC9BC,EAAaH,EAAUA,EAAU,OAAS,GAChD,GAAIG,EACF,OAAOA,EAAW,UAEtB,CACA,OAAO,IACT,CACA,4BAA4B,EAAgB,EAAqB,CAC/D,IAAMl1E,EAAUm1E,EAAe,KAAK,QAC9B,CACJ,cACEn1E,EACEo1E,EAA6B,KAAK,OAClCC,EAAqB,KAAK,gBAAgBxgE,EAAY,CAC1D,IAAK7U,EAAQ,GACf,EAAGs1E,CAAmB,EAChBC,EAAM,OAAO,KAAK1gE,CAAU,EAC5B2gE,EAAuBJ,EAA6BA,EAA2B,OAAQ,GAAU,CAACG,EAAI,SAASv8D,EAAM,UAAU,CAAC,EAAI,CAAC,EACvIq8D,EAAmB,QACrBA,EAAmB,MAAM,EAAG,IAAM,CAChC,IAAMI,EAAO9pE,EAAE,IAAI,IACb+pE,EAAQ/pE,EAAE,IAAI,KACdgqE,EAAOnkF,EAAE,IAAI,IACbokF,EAAQpkF,EAAE,IAAI,KACpB,GAAIikF,GAAQ,CAACE,EACX,MAAO,GAKT,GAHIA,GAAQ,CAACF,GAGTC,GAAS,CAACE,EACZ,MAAO,GAET,GAAIA,GAAS,CAACF,EACZ,MAAO,GAET,GAAI,CAACD,GAAQ,CAACE,GAAQ,CAACD,GAAS,CAACE,EAAO,CACtC,IAAMC,EAASlqE,EAAE,UACXmqE,EAAStkF,EAAE,UACjB,GAAIqkF,IAAWC,EACb,OAAOD,EAASC,CAEpB,CACA,OAAOnqE,EAAE,UAAU,SAAWna,EAAE,UAAU,QAC5C,CAAC,EAEH,KAAK,OAAS6jF,EACdG,EAAqB,QAAS,GAAiB,CAC7C,KAAK,YAAY/lD,CAAY,CAC/B,CAAC,EACD,KAAK,eAAe0lD,EAAgBK,CAAoB,CAC1D,CACA,eAAe,EAAgB,EAAuB,CAAC,EAAG,EAAc,GAAO,CAC7E,IAAMp8D,EAAS,KAAK,QAAU,CAAC,EAC/B,GAAIA,EAAO,QAAUo8D,EAAqB,QAAU,KAAK,OAAS,EAAG,CACnE,IAAMO,EAAe,KAAK,MACpBC,EAAe,KAAK,cAAc58D,EAAQ+7D,CAAc,GAC9Cc,GAAeT,EAAqB,QAAWO,GAA6C,SAAYC,EAAa,QAAUA,EAAa,MAAM,EAAM,IAC/J,KAAK,IAAI9sD,EAAK,QAAQ,MAAQ6sD,EAAa1vF,EAAE,CAAC,QAAQ,KAAK,EAAI,MAAQ,KAAK,IAAI6iC,EAAK,QAAQ,IAAM6sD,EAAa1vF,EAAE,CAAC,QAAQ,GAAG,EAAI,IAC1I,KAEC,KAAK,MAAQ2vF,EACb,KAAK,iBAAiBR,EAAsBO,CAAY,EAE5D,CACF,CACA,gBAAgB,EAAY,EAAU,EAAqB,CACzD,IAAMV,EAAqB,CAAC,EACtBE,EAAM,OAAO,KAAK1gE,CAAU,EAClC,IAAK,IAAIxuB,EAAI,EAAGA,EAAIkvF,EAAI,OAAQ,IAAK,CACnC,IAAM5uF,EAAK4uF,EAAIlvF,GACTkpB,EAAYsF,EAAWluB,GAC7B,GAAI4oB,EAAU,eAAgB,CAC5B,IAAIkgB,EAAe,KAAK,SAAS9oC,GAC7B8oC,EACFA,EAAa,aAAalgB,CAAS,GAEnC,EAAe,IAAIyyB,GAAkBzyB,EAAW2mE,CAAQ,EACxD,KAAK,SAASvvF,GAAM8oC,EAChB6lD,IAAwB,KAC1B,EAAa,cAAgBA,IAGjCD,EAAmB,KAAK5lD,CAAY,CACtC,CACF,CACA,OAAO4lD,CACT,CACA,cAAc,EAAoB,EAAgB,CAChD,IAAMc,EAAW,CAAC,EACZn2E,EAAUm1E,EAAe,KAAK,QAC9BiB,EAAkBp2E,EAAQ,KAAO,IAAWA,EAAQ,KACtDq2E,EAAkB,EAEtB,GADA,EAAqBhB,EAAmB,OAAQ,GAAU,CAACr8D,EAAM,OAAS,EAAEA,EAAM,IAAI,MAAQA,EAAM,UAAU,EAC1Gq8D,EAAmB,OAAQ,CAC7B,KAAK,eAAeA,EAAoBF,CAAc,EACtD,IAAImB,EAAkB,EAClBC,EAAiB,EA4FrB,GA3FAlB,EAAmB,SAAS,EAAc,IAAM,CAC9C,IAAMmB,EAAU/mD,EAAa,IAAI,IAC3BgnD,EAAWhnD,EAAa,IAAI,KAC5BinD,EAAgBrB,EAAmBhvF,EAAI,IAAM,KAC7CswF,EAAgBlnD,EAAa,cAC7BmnD,EAAaH,EAAWL,EAAkB3mD,EAAa,YACvDonD,EAAuBpnD,EAAa,SACpCqnD,EAAmBrnD,EAAa,oBAAsBsS,GAAkB,MAAQ80C,EAAuB,EACvGE,EAAmBtnD,EAAa,iBAChCunD,EAA2BN,GAA+C,YAAeE,EACzFjtE,EAAQitE,EAAannD,EAAa,mBACpC/jC,EAAMirF,EAAgBhtE,EAAQktE,EAAuBD,EAAaG,EACtE,GAAIP,GAAW,CAACC,GAAYG,GAAc,EAAG,CAC3C,IAAMK,EAAkBV,EACxB,GAAkBO,EAClB,EAAa,cAAgBntE,EAC7B,IAAMutE,EAAeb,EACrB,GAAmBQ,EACnBV,EAAS,KAAK,CACZ,MAAO1mD,EACP,QACA,MACA,QAAS,CACP,MAAOynD,EACP,IAAKb,CACP,EACA,WAAY,CACV,MAAOY,EACP,IAAKV,CACP,CACF,CAAC,CACH,MAAO,GAAIK,GAAcR,EAAiB,CACxC,GAAI,CAACY,EAAyB,CAC5B,IAAMG,EAAkBP,EAAaN,EACrC,GAAIa,EAAkBj1C,GAA4B,CAChD,IAAMkiB,EAAgBkyB,EAChBc,EAAmBb,EACzB,GAAkBY,EAClB,IAAME,EAAgBhB,EACtB,GAAmBc,EACnB,IAAMG,EAAiB,CACrB,cAAejC,EAAmBhvF,EAAI,IAAM,KAC5C,UAAWopC,EACX,MAAO20B,EACP,IAAKA,EAAgB+yB,EACrB,QAAS,CACP,MAAOE,EACP,IAAKhB,CACP,EACA,WAAY,CACV,MAAOe,EACP,IAAKb,CACP,CACF,EACAJ,EAAS,KAAKmB,CAAc,CAC9B,MAAWH,EAAkB,GAAKT,IAChC,EAAc,oBAAsBS,EACpC,EAAShB,EAAS,OAAS,EAAE,CAAC,IAAMS,EAExC,CACIH,IACF,EAAM9sE,GAER,EAAa,cAAgBA,EAC7B,IAAMstE,EAAkBV,EACxB,GAAkBO,EAClB,IAAMI,EAAeb,EACrB,GAAmBQ,EACnBV,EAAS,KAAK,CACZ,MAAO1mD,EACP,QACA,MACA,QAAS,CACP,MAAOynD,EACP,IAAKb,CACP,EACA,WAAY,CACV,MAAOY,EACP,IAAKV,CACP,CACF,CAAC,CACH,MACE,OAEF,IAAM9C,EAAahkD,EAAa,WAChC,AAGE6mD,EAHEG,GAAYhD,EAAa2C,EACTA,EAEA3C,CAEtB,CAAC,EACG6C,EAAkBF,EAAiB,CAErC,IAAMhyB,EAAgBkyB,EAChBW,EAAkBV,EAClBY,EAAkBf,EAAkBE,EAC1C,GAAkBa,EAClB,IAAMD,EAAeb,EACrB,GAAmBc,EACnBhB,EAAS,KAAK,CACZ,cAA6BA,EAASA,EAAS,OAAS,EAAA,EAAiC,OAAU,KACnG,UAAW,KACX,MAAOG,EACP,IAAKlyB,EAAgB+yB,EACrB,QAAS,CACP,MAAOD,EACP,IAAKb,CACP,EACA,WAAY,CACV,MAAOY,EACP,IAAKV,CACP,CACF,CAAC,CACH,CACA,KAAK,aAAaH,EAAiBC,EAAiBE,CAAc,CACpE,MAEEJ,EAAS,KAAK,CACZ,cAAe,KACf,UAAW,KACX,QACA,IAAKC,EACL,QAAS,CACP,QACA,IAAKA,CACP,EACA,WAAY,CACV,QACA,IAAKA,CACP,CACF,CAAC,EACD,KAAK,aAAaA,EAAiBA,EAAiBA,CAAe,EAErE,OAAOD,CACT,CACA,aAAa,EAAS,EAAS,EAAY,CACzC,KAAK,UAAY,CACf,UACA,UACA,YACF,CACF,CACA,eAAe,EAAoB,EAAgB,CACjD,IAAMn2E,EAAUm1E,EAAe,KAAK,QAC9BiB,EAAkBp2E,EAAQ,KAAO,IAAWA,EAAQ,KACtDu3E,EAAqB,EACrBC,EAAqB,GACzBnC,EAAmB,SAAS,EAAc,IAAM,CAC9C,IAAMmB,EAAU/mD,EAAa,IAAI,IAC3BgnD,EAAWhnD,EAAa,IAAI,KAC5BmnD,EAAaJ,EAAU,EAAIC,EAAWL,EAAkB3mD,EAAa,UAC3E,KAAK,qBAAqBA,CAAY,EACN+nD,IAAuBZ,EAErD,EAAa,mBAAqBW,GAElC,EAAqB,EACrB,EAAqBX,GAEnB,CAACH,GAAYhnD,EAAa,YAAY,KACxC,EAAa,aAAe/pB,GAAkB,KAAM1F,EAAQ,UAAWyvB,EAAa,YAAcA,EAAa,iBAAkB,EAAG,CAAC,GAAK,IAAK,IAE7IA,EAAa,eAAiB,CAACA,EAAa,uBAClB,KAAK,0BAA0BA,EAAc0lD,CAClD,IACrB,EAAa,cAAgB,KAG7B,CAAC1lD,EAAa,eAAiBppC,EAAI,EAAIgvF,EAAmB,QACxCA,EAAmBhvF,EAAI,EAAE,CAAC,UAAYgvF,EAAmBhvF,EAAE,CAAC,WAC9D67C,KAChB,EAAmB77C,EAAI,EAAE,CAAC,cAAgB,GACtCgvF,EAAmBhvF,EAAI,EAAE,CAAC,eAC5B,KAAK,KAAK,uDAAuDopC,GAAc,GAIrF,IAAM+jD,EAAe7gF,EAAe88B,EAAa,YAAY,EAAIA,EAAa,aAAeA,EAAa,SAC1G,GAAsB+jD,CACxB,CAAC,CACH,CACA,0BAA0B,EAAc,EAAgB,CACtD,IAAMC,EAAahkD,EAAa,WAC1BgoD,EAAmBhoD,EAAa,UAAYA,EAAa,iBAM/D,OALI,KAAK,IAAIgkD,EAAagE,CAAgB,EAAI7nD,IAC5C,KAAK,IAAI,IAAIH,EAAa,WAAW,eAAegkD,EAAW,2CAA2CgE,GAAkB,EACrH,IAGF,CADW,OAAO,KAAKtC,CACd,CAAC,CAAC,KAAM,GAAiB,CACvC,IAAMn1E,EAAUm1E,EAAez9B,EAAa,CAAC,QACvCroC,EAAcrP,EAAQ,KAC5B,GAAIyzE,GAAcpkE,EAEhB,OADA,KAAK,IAAI,IAAIogB,EAAa,WAAW,eAAegkD,EAAW,QAAQ/7B,EAAa,gBAAgBroC,GAAa,EAC1G,GAET,IAAMqoE,EAAgBhyE,GAAkB,KAAM1F,EAAQ,UAAWyzE,CAAU,EAC3E,GAAI,CAACiE,EAEH,OADA,KAAK,IAAI,IAAIjoD,EAAa,WAAW,eAAegkD,EAAW,wCAAwC/7B,EAAa,aAAa13C,EAAQ,UAAU,GAAGA,EAAQ,YAAY,EAAE,EACrK,GAET,IAAM23E,EAAYjgC,IAAiB,QAAU,KAAQ,EAMrD,OAL2B,KAAK,IAAIggC,EAAc,MAAQjE,CAAU,EAAI7jD,GAAgC+nD,GAAa,KAAK,IAAID,EAAc,IAAMjE,CAAU,EAAI7jD,GAAgC+nD,EAKzL,IAHL,KAAK,IAAI,IAAIloD,EAAa,WAAW,eAAegkD,EAAW,oBAAoB/7B,EAAa,oBAAoBggC,EAAc,MAAM,GAAGA,EAAc,IAAI,OAAOA,EAAc,GAAG,OAAOA,EAAc,GAAG,EAAE,EACxM,GAGX,CAAC,CACH,CACA,qBAAqB,EAAc,CACjC,GAAI,CAACjoD,EAAa,gBAChB,OAEF,IAAMmnD,EAAannD,EAAa,cAC5BmoD,EAAc,EACdC,EAAqB,GACrBC,EAAY,GAChB,IAAK,IAAIzxF,EAAI,EAAGA,EAAIopC,EAAa,UAAU,OAAQ,IAAK,CACtD,IAAMW,EAAQX,EAAa,UAAUppC,GAC/B+9D,EAAgBwyB,EAAagB,EACnC,EAAM,YAAcA,EACpB,EAAM,cAAgBxzB,EACtB,AAAuByzB,IAAqBznD,EAAM,WAAa,KAC/D,AAAc0nD,IAAY,CAAC,CAAC1nD,EAAM,MAClC,IAAM9pB,EAAW8pB,EAAM,MAAQ,EAAIA,EAAM,UAAY,EACrD,GAAe9pB,CACjB,CACA,AAGEmpB,EAAa,SAHXooD,GAAsB,CAACC,EACD,KAAK,IAAIF,EAAanoD,EAAa,QAAQ,EAE3CmoD,CAE5B,CACA,YAAY,EAAc,CACxBnoD,EAAa,MAAM,EACnB,OAAO,KAAK,SAASA,EAAa,WACpC,CACF,EAIM,GAAN,KAAsB,CACpB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,IAAMtqB,CACb,CACA,SAAU,CACR,KAAK,IAAM,IACb,CACA,cAAc,EAAc,EAAgB,CAC1C,IAAM4yE,EAAetoD,EAAa,aAC9BrlC,EACJ,GAAI,CACF,EAAMylC,GAAmBkoD,EAAc,KAAK,IAAI,UAAWtoD,EAAa,OAAO,CACjF,OAAS1oB,EAAO,CACd,IAAMkD,EAAY,KAAK,qBAAqBwlB,EAAczoB,EAAa,sBAAuBD,EAAOgxE,CAAY,EACjH,KAAK,IAAI,QAAQ18D,EAAO,MAAOpR,CAAS,EACxC,MACF,CACI+tE,GAAkB5tF,EAAI,WAAa,SACrCA,EAAI,aAAa,IAAI,oBAAqB,GAAK4tF,CAAc,EAE/D,IAAMx4E,EAAS,KAAK,IAAI,OAClBmtE,EAASntE,EAAO,OAChBm+C,EAAS,IAAIgvB,EAAOntE,CAAM,EAC1BrY,EAAU,CACd,aAAc,OACd,IAAKiD,EAAI,IACX,EACMid,EAAa7H,EAAO,gCAAgC,QACpDo+C,EAAe,CACnB,aACA,QAASv2C,EAAW,cACpB,SAAU,EACV,WAAY,EACZ,cAAe,CACjB,EA8BA,OAJAs2C,EAAO,KAAKx2D,EAASy2D,EAAc,CAxBjC,WAAY,EAAU,EAAO,EAAU,IAAmB,CACxD,IAAMq6B,EAAoB98C,EAAS,KAC7B+8C,EAASD,GAAuD,OACtE,GAAK,MAAM,QAAQC,CAAM,EAKzB,EAAa,kBAAoBD,EACjC,KAAK,IAAI,QAAQ58D,EAAO,kBAAmB,CACzC,MAAOoU,EACP,oBACA,gBACF,CAAC,MAV2B,CAC1B,IAAMxlB,EAAY,KAAK,qBAAqBwlB,EAAczoB,EAAa,yBAA0B,gBAAI,MAAM,iCAAiC,EAAGgmE,EAAS,IAAKh9B,EAAOmoC,CAAc,EAClL,KAAK,IAAI,QAAQ98D,EAAO,MAAOpR,CAAS,CAE1C,CAOF,EACA,SAAU,EAAO,EAAU,EAAgB,IAAU,CACnD,IAAMA,EAAY,KAAK,qBAAqBwlB,EAAczoB,EAAa,sBAAuB,gBAAI,MAAM,2CAA2CD,EAAM,KAAK,GAAGA,EAAM,KAAK,IAAIimE,EAAS,IAAI,EAAE,EAAGA,EAAS,IAAKh9B,EAAOmoC,CAAc,EACrO,KAAK,IAAI,QAAQ98D,EAAO,MAAOpR,CAAS,CAC1C,EACA,WAAY,EAAO,EAAU,IAAmB,CAC9C,IAAMA,EAAY,KAAK,qBAAqBwlB,EAAczoB,EAAa,wBAAyB,gBAAI,MAAM,iCAAiCgmE,EAAS,IAAI,EAAE,EAAGA,EAAS,IAAKh9B,EAAOmoC,CAAc,EAChM,KAAK,IAAI,QAAQ98D,EAAO,MAAOpR,CAAS,CAC1C,CAEyC,CAAC,EAC5C,KAAK,IAAI,QAAQoR,EAAO,mBAAoB,CAC1C,MAAOoU,CACT,CAAC,EACMkuB,CACT,CACA,qBAAqB,EAAc,EAAS,EAAO,EAAK,EAAO,EAAgB,CAE7E,MADA,GAAa,MAAQ52C,EACd,CACL,KAAMmD,EAAW,cACjB,UACA,MAAO,GACP,eACA,MACA,QACA,iBACA,OACF,CACF,CACF,EASM,GAAN,cAAsCqxB,EAAO,CAC3C,YAAY,EAAK,EAAgB,CAC/B,MAAM,gBAAiBp2B,EAAI,MAAM,EACjC,KAAK,eAAiB,IAAK,GAC3B,KAAK,IAAM,IAAK,GAChB,KAAK,gBAAkB,IAAK,GAC5B,KAAK,eAAiB,KACtB,KAAK,aAAe,KACpB,KAAK,MAAQ,KACb,KAAK,aAAe,KACpB,KAAK,eAAiB,KACtB,KAAK,QAAU,KACf,KAAK,YAAc,CAAC,EACpB,KAAK,YAAc,GACnB,KAAK,YAAc,GACnB,KAAK,SAAW,IAAK,GACrB,KAAK,YAAc,KACnB,KAAK,cAAgB,KACrB,KAAK,YAAc,KACnB,KAAK,UAAY,KACjB,KAAK,aAAe,KACpB,KAAK,WAAa,KAClB,KAAK,eAAiB,KACtB,KAAK,WAAa,GAClB,KAAK,WAAe,CAClB,KAAK,WAAa,EACpB,EACA,KAAK,YAAgB,CACnB,KAAK,WAAa,EACpB,EACA,KAAK,cAAkB,CACrB,IAAMy0B,EAAc,KAAK,YACzB,GAAIA,IAAgB,IAAK,IAAK,KAAK,kBAAoB,CAAC,KAAK,SAC3D,OAEF,IAAMo6C,EAAOp6C,EAAc,KAAK,YAEhC,GADsB,KAAK,IAAIo6C,CAAI,EAAI,EAAI,OAEzC,OAEF,IAAMoE,EAAepE,GAAQ,KAC7B,KAAK,YAAcp6C,EACnB,KAAK,YAAcA,EACnB,IAAMy+C,EAAc,KAAK,YACzB,GAAI,CAACA,EAAa,CAChB,KAAK,YAAY,EACjB,MACF,CAQA,GAPID,GACiB,KAAK,SAAS,mBAAmBx+C,EAAaA,EAAco6C,CAClE,GACX,KAAK,eAAe,EAAI,EAG5B,KAAK,YAAY,EACboE,GAAgBx+C,EAAcy+C,EAAY,OAASz+C,GAAey+C,EAAY,IAAK,CACrF,IAAIC,EACJ,IAAMC,EAAe,KAAK,cAAcF,CAAW,EAC/CG,EAAgB,KAAK,SAAS,oBAAoB5+C,CAAW,EAQjE,GAPI4+C,IAAkB,KACpB,EAAgBD,GAAgBH,EAAe,GAAK,GACpD,KAAK,IAAI,UAAUA,EAAe,QAAU,GAAG,sCAAsCx+C,EAAY,mBAAmB2+C,EAAa,MAAMC,EAAc,EAAE,GAErJ,CAAC,KAAK,eAAeH,CAAW,IAAM,EAAc,KAAK,QAAU,MAAQC,EAAY,SACzF,KAAK,WAAa,IAEhB,CAACF,GACCI,EAAgBD,EAAc,CAChC,IAAME,EAAY,KAAK,SAAS,wBAAwBF,EAAe,EAAGC,CAAa,EACvF,GAAIC,EAAYF,EAAc,CAC5B,KAAK,oBAAoBE,CAAS,EAClC,MACF,CACF,CAEF,KAAK,oBAAoBD,CAAa,EACtC,MACF,CACA,IAAME,EAAe,KAAK,aAC1B,GAAI,CAACA,EAAc,CACjB,GAAI,KAAK,iBAAmB,KAAK,eAAeL,CAAW,EAAG,CAC5D,IAAMM,EAAeN,EAAY,MAAM,UAAU,GAC7CM,IACF,KAAK,UAAY,KAAK,YACtB,KAAK,YAAc,KACnB,KAAK,yBAAyB/+C,EAAa++C,CAAY,EAE3D,CACA,MACF,CACA,IAAMhvE,EAAQ+uE,EAAa,cACrBpyE,EAAWoyE,EAAa,UAAY,EAC1C,GAAIN,GAAgBx+C,EAAcjwB,GAASiwB,GAAejwB,EAAQrD,EAAU,CAC1E,IAAIsyE,GACC,EAAqBP,EAAY,QAAU,MAAQO,EAAmB,gBACzE,KAAK,kBAAkBP,EAAY,MAAOA,CAAW,EACrD,KAAK,iBAAiBz+C,CAAW,GAEnC,KAAK,yBAAyBA,EAAa8+C,CAAY,CACzD,CACF,EACA,KAAK,iBAAqB,CACxB,IAAM9+C,EAAc,KAAK,YACzB,GAAIA,IAAgB,IAAK,IAAK,KAAK,iBACjC,OAEF,GAAIA,EAAc,KAAK,YACrB,KAAK,YAAcA,EACfA,EAAc,KAAK,aACrB,KAAK,YAAY,OAGnB,OAEF,IAAMy+C,EAAc,KAAK,YACzB,GAAI,CAACA,GAAe,KAAK,gBACvB,OAEF,GAAIz+C,GAAey+C,EAAY,IAAK,CAClC,KAAK,YAAcA,EAAY,IAC/B,IAAME,EAAe,KAAK,cAAcF,CAAW,EACnD,KAAK,oBAAoBE,EAAe,CAAC,CAC3C,CACA,IAAMG,EAAe,KAAK,aACrBA,GAID9+C,GADQ8+C,EAAa,eAAiBA,EAAa,UAAY,IAEjE,KAAK,yBAAyB9+C,EAAa8+C,CAAY,CAE3D,EACA,KAAK,kBAAoB,EAAsB,IAAkB,CAC/D,IAAMvC,EAAW,KAAK,SACtB,GAAI,CAACA,EACH,OAEF,IAAMkC,EAAc,KAAK,YACnBhD,EAAqBc,EAAS,QAAU,CAAC,EACzC0C,EAAgB1C,EAAS,OAAS,CAAC,EACnC2C,EAAY3C,EAAS,UACrB4C,EAAavD,EAAqB,IAAK,GAAiB/lD,EAAa,UAAU,EAC/EupD,EAAuB,CAAC,EAAE3D,EAAmB,QAAU0D,EAAW,SACpEC,GAAwBC,IAC1B,KAAK,IAAI,0BAA0B5D,EAAmB,OAAO,KAAKA,EAAmB;YACjFwD,EAAc,IAAK,GAAQxoD,GAAgB9qB,CAAG,CAAC,EAAE,QAAQ,KAAK,aAAa,EAE7EwzE,EAAW,QACb,KAAK,IAAI,kBAAkBA,GAAY,EAEzC,IAAIG,EAAqB,KACrBC,EAAuB,KACvBd,IACF,EAAqB,KAAK,WAAWA,EAAa,KAAK,WAAW,EAC9D,KAAK,WAAWA,EAAaa,CAAkB,EACjD,KAAK,YAAcA,EAEnB,KAAK,YAAc,KAAK,UAAY,MAGxC,KAAK,YAAc,KAAK,WAAW,KAAK,WAAW,EACnD,KAAK,UAAY,KAAK,WAAW,KAAK,SAAS,EAC/C,IAAMlxB,EAAgB,KAAK,cA8B3B,GA7BIA,IACF,EAAuB,KAAK,WAAWA,EAAe,KAAK,WAAW,EAClE,KAAK,WAAWA,EAAemxB,CAAoB,EACrD,KAAK,cAAgBA,EACZnxB,EAAc,QACvB,KAAK,cAAgB,KAAK,YAC1B,KAAK,kBAAkBA,EAAc,MAAO,IAAI,IAGpDwtB,EAAqB,QAAS,GAAiB,CAC7C/lD,EAAa,UAAU,QAAS,GAAU,CACxC,KAAK,iBAAiBW,EAAM,WAAY,IAAI,CAC9C,CAAC,CACH,CAAC,EACD,KAAK,YAAY,QAAS,GAAW,CACnC,GAAIgpD,EAAO,aAAa,cAAe,CACrC,IAAMh1B,EAAgBg1B,EAAO,UAAU,cACjCpF,EAAOoF,EAAO,eAAiBh1B,EACrC,GAAI4vB,EACF,GAAI,CACF,EAAO,eAAiB5vB,CAC1B,OAASt+D,EAAG,CACN,KAAK,IAAIkuF,CAAI,EAAIpkD,IACnB,KAAK,KAAK,GAAG9pC,EAAE,KAAKszF,EAAO,QAAQ,IAAIA,EAAO,eAAe,IAAIh1B,EAAc,EAAE,CAErF,CAEJ,CACF,CAAC,EACG40B,GAAwBC,EAAe,CAOzC,GANA,KAAK,IAAI,QAAQ59D,EAAO,sBAAuB,CAC7C,OAAQg6D,EAAmB,MAAM,CAAC,EAClC,SAAUwD,EAAc,MAAM,CAAC,EAC/B,YACA,YACF,CAAC,EACG,KAAK,eAAeR,CAAW,GAAKU,EAAW,SAASV,EAAY,MAAM,UAAU,EAAG,CACzF,KAAK,KAAK,iBAAiBA,EAAY,MAAM,WAAW,wBAAwB,EAChF,KAAK,gBAAgBA,EAAY,KAAK,EACtC,MACF,CACIA,GACF,KAAK,YAAYa,EAAoBb,CAAW,EAE9CrwB,GAAiBmxB,IAAyBD,GAC5C,KAAK,YAAYC,EAAsBnxB,CAAa,EAEtD,KAAK,YAAY,CACnB,CACF,EACA,KAAK,IAAM7iD,EACX,KAAK,eAAiBuuE,EACtB,KAAK,gBAAkB,IAAItxC,GAAgBj9B,CAAG,EAC9C,KAAK,SAAW,IAAIg9B,GAAsB,KAAK,iBAAkBh9B,EAAI,MAAM,EAC3E,KAAK,kBAAkB,CACzB,CACA,mBAAoB,CAClB,IAAMA,EAAM,KAAK,IACbA,IACFA,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,oBAAqB,KAAK,oBAAqB,IAAI,EACjElW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,uBAAwB,KAAK,uBAAwB,IAAI,EACvElW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,uBAAwB,IAAI,EAChElW,EAAI,GAAGkW,EAAO,kBAAmB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,GAAGkW,EAAO,YAAa,KAAK,aAAc,IAAI,EAClDlW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,EACvClW,EAAI,GAAGkW,EAAO,WAAY,KAAK,aAAc,IAAI,EAErD,CACA,qBAAsB,CACpB,IAAMlW,EAAM,KAAK,IACbA,IACFA,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,oBAAqB,KAAK,oBAAqB,IAAI,EAClElW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,uBAAwB,KAAK,uBAAwB,IAAI,EACxElW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,uBAAwB,IAAI,EACjElW,EAAI,IAAIkW,EAAO,kBAAmB,KAAK,kBAAmB,IAAI,EAC9DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,gBAAiB,IAAI,EAC1DlW,EAAI,IAAIkW,EAAO,YAAa,KAAK,aAAc,IAAI,EACnDlW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,EACxClW,EAAI,IAAIkW,EAAO,WAAY,KAAK,aAAc,IAAI,EAEtD,CACA,WAAY,CACV,KAAK,gBAAgB,CACvB,CACA,UAAW,CACT,KAAK,eAAe,CACtB,CACA,iBAAkB,CAChB,IAAIg+D,GACH,EAAwB,KAAK,mBAAmB,IAAM,MAAQA,EAAsB,gBAAgB,CACvG,CACA,gBAAiB,CACf,IAAIC,GACH,EAAyB,KAAK,mBAAmB,IAAM,MAAQA,EAAuB,eAAe,CACxG,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACV,KAAK,iBACP,KAAK,gBAAgB,QAAQ,EAE/B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACpB,KAAK,UACP,KAAK,SAAS,QAAQ,EAExB,KAAK,MAAQ,KAAK,aAAe,KAAK,eAAiB,KAAK,eAAiB,KAAK,aAAe,KAAK,SAAW,KAAK,QAAU,KAChI,KAAK,IAAM,KAAK,eAAiB,KAAK,IAAM,KAC5C,KAAK,gBAAkB,KACvB,KAAK,OAAS,KAAK,QAAU,KAAK,UAAY,KAAK,aAAe,KAClE,KAAK,iBAAmB,IAC1B,CACA,cAAe,CACb,IAAMtzD,EAAQ,KAAK,cAAgB,KAAK,MACpCA,GACF,KAAK,qBAAqBA,CAAK,CAEnC,CACA,qBAAqB,EAAO,CAC1BlO,GAAoBkO,EAAO,OAAQ,KAAK,MAAM,EAC9ClO,GAAoBkO,EAAO,QAAS,KAAK,OAAO,EAChDlO,GAAoBkO,EAAO,UAAW,KAAK,SAAS,EACpDlO,GAAoBkO,EAAO,aAAc,KAAK,YAAY,CAC5D,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAMA,EAAQ,KAAK,MAAQh7B,EAAK,MAChC6sB,EAAiBmO,EAAO,UAAW,KAAK,SAAS,EACjDnO,EAAiBmO,EAAO,aAAc,KAAK,YAAY,EACvDnO,EAAiBmO,EAAO,OAAQ,KAAK,MAAM,EAC3CnO,EAAiBmO,EAAO,QAAS,KAAK,OAAO,CAC/C,CACA,gBAAgB,EAAO,EAAM,CAC3B,IAAMqyD,EAAc,KAAK,qBACnBkB,EAAgB,KAAK,aAE3B,GADA,KAAK,aAAe,KAChBlB,IAAgB,KAClB,KAAK,WAAW,OACX,GAAI,CAACkB,EAAe,CACzB,KAAK,mBAAmB,EACxB,IAAMhB,EAAe,KAAK,cAAcF,CAAW,EACnD,KAAK,oBAAoBE,CAAY,CACvC,CACF,CACA,oBAAqB,CACnB,KAAK,IAAI,sBAAsB,EAC/B,KAAK,YAAc,KAAK,cAAgB,KAAK,YAAc,KAAK,UAAY,KAAK,aAAe,KAAK,WAAa,KAAK,eAAiB,IAC1I,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAM/zB,EAAoB,CAAC,CAACx5D,EAAK,cAC3Bg7B,EAAQ,KAAK,MAEnB,GADA,KAAK,MAAQ,KACT,KAGAA,GACF,KAAK,qBAAqBA,CAAK,EAE7B,KAAK,cAAc,CACrB,IAAMozD,EAAS,KAAK,mBAAmB,EACnCA,IACF,KAAK,IAAI,gDAAgDA,GAAQ,EACjE,KAAK,aAAe,KAAK,WAAa,KAAK,eAAiB,KAAK,cAAgB,KAAK,YAAc,KAAK,aAAe,KACxHA,EAAO,YAAY,GAErB,KAAK,WAAa,EACpB,CACF,CACA,IAAI,sBAAuB,CACzB,GAAI,CAAC,KAAK,IACR,OAAO,KAET,GAAI,KAAK,QACP,OAAO,KAAK,QAEd,IAAM7wF,EAAI,KACJixF,MAA+BjxF,EAAE,eAAiBA,EAAE,YACpDkxF,EAAkB,GAAUrpD,GAAQ7nC,EAAE,eAAe6nC,EAAM,UAAU,EACrEspD,GAAiB,EAAM,EAAc,EAAO,EAAiB,IAAqB,CACtF,GAAIxwD,EAAM,CACR,IAAIyF,EAAOzF,EAAK2rD,EAAa,CAAC,MACxBplD,EAAevG,EAAK,MAC1B,GAAIuG,EACE,IAAAolD,IAAiB,WAAaplD,EAAa,oBAAsBsS,GAAkB,MAAO,CAC5F,IAAM43C,EAAcF,EAAerpD,CAAK,EACnCupD,GAA2C,eAAkBlqD,IAChE,GAAQkqD,EAAY,UAAU,YAAcA,EAAYC,GAE5D,MACK,CACL,IAAMzhF,EAAQ0hF,IAAoB,cAAgBC,EAAe,EAAIvxF,EAAEsxF,GACvE,GAAQ1hF,EAAQ+wB,EAAK,KACvB,CACA,OAAOyF,CACT,CACA,MAAO,EACT,EACMorD,GAAkB,EAAa,IAAiB,CACpD,IAAIC,EACJ,GAAIC,IAAgB,GAAKpF,IAAiB,YAAc,EAActsF,EAAE,WAAa,MAAQyxF,EAAY,OAAQ,CAE/G,IAAM3tF,EAAQ9D,EAAE,SAAS,oBAAoB0xF,CAAW,EAClD/wD,EAA4B3gC,EAAE,SAAS,QAA4C8D,GACzF,GAAI68B,EAEF,OAAO+wD,GADM/wD,EAAK2rD,EAAa,CAAC,MAAQ3rD,EAAK,MAGjD,CACA,OAAO+wD,CACT,EACMH,MAAuB,CAC3B,IAAM3hF,EAAQ5P,EAAE,YAIhB,OAHI4P,IAAU,OAAO,UACZ+hF,EAAkB,SAAS,EAE7B,KAAK,IAAI/hF,EAAO,CAAC,CAC1B,EACM+hF,EAAqB,GAAiB,CAC1C,IAAIC,EAIJ,OAHK,EAAoB5xF,EAAE,iBAAmB,MAAQ4xF,EAAkB,KAC/D5xF,EAAE,eAAe,KAEFA,EAAE,UAA0C,UAAUssF,IAAkB,CAClG,EACMuF,GAAU,EAAM,IAAiB,CACrC,IAAIC,EACJ,IAAMnxD,EAAO3gC,EAAE,qBACf,GAAI2gC,GAAQ,OAAS,EAAcA,EAAK,QAAU,MAAQmxD,EAAY,aAAa,MAAQ,CAAC9xF,EAAE,SAC5F,OAEFA,EAAE,IAAI,WAAWomC,EAAK,IAAIkmD,EAAa,EAAE,EACzC,IAAMwD,EAAc9vF,EAAE,qBAChB+xF,EAAc/xF,EAAE,SAAS,oBAAoBomC,EAAMkmD,CAAY,EAC/D0F,EAAmChyF,EAAE,SAAS,QAA6C+xF,GAC3FE,EAAkBjyF,EAAE,mBAAmB,EAEvCouF,EADwB6D,GAAmD,cACI,cAC/EC,EAAapC,GAAe9vF,EAAE,WAAW8vF,EAAakC,CAAU,EACtE,GAAIlC,IAAgB1B,GAAiB8D,GAAa,CAChD,IAAMd,EAAcF,EAAelxF,EAAE,YAAY,EAC3Cy9B,EAAS2zD,GAA2C,OAAUpxF,EAAE,aACtE,GAAIy9B,EAAO,CACT,IAAM4T,EAAci7C,IAAiB,UAAY7uD,EAAM,YAAc0zD,EAAcrB,EAAaxD,EAActsF,EAAE,aAAc,cAAe,aAAa,EACpJyrF,EAAOrlD,EAAOiL,EACd8gD,GAAc/D,EAAgB/8C,EAAc5T,EAAM,aAAeguD,EACvE,GAAI0G,GAAc,IAAM,CAACf,GAAehD,GAAiB+D,GAAcf,EAAY,UAAW,CAC5F,EAAM,YAAce,EACpB,MACF,CACF,CACF,CACA,GAAIH,EAAY,CACd,IAAIG,EAAa/rD,EACjB,GAAIkmD,IAAiB,UAAW,CAE9B,IAAMb,EAAOrlD,EADe4rD,EAAW1F,EAAa,CAAC,MAErD,EAAa0F,EAAW,MAAQvG,CAClC,CACA,IAAM2G,EAAkB,CAACpyF,EAAE,eAAegyF,CAAU,EACpD,IAAK,CAAChyF,EAAE,eAAe8vF,CAAW,GAAKA,EAAY,MAAM,iBAAmBsC,GAAmBJ,EAAW,MAAM,eAAgB,CAC9H,IAAMv0D,EAAQz9B,EAAE,QAAUouF,EAAgB6D,GAAmD,MAAQ,MACjGx0D,IACF,EAAM,YAAc00D,EAExB,MAAO,GAAIrC,EAAa,CACtB,IAAME,EAAehwF,EAAE,cAAc8vF,CAAW,EAChD,GAAIiC,EAAc/B,EAAc,CAC9B,IAAME,EAAYlwF,EAAE,SAAS,wBAAwBgwF,EAAe,EAAG+B,CAAW,EAClF,GAAI7B,EAAYF,EAAc,CAC5BhwF,EAAE,oBAAoBkwF,CAAS,EAC/B,MACF,CACF,CACA,IAAInF,EAAa,EACjB,GAAIqH,EACF,EAAE,YAAcD,EAChBnyF,EAAE,YAAY,MACT,CACL,IAAMwsF,EAAYwF,EAAW,MAAM,UAC7BK,EAAYjsD,GAAQ4rD,EAAW1F,IAAiB0F,EAAA,CAAY,MAClE,IAAK,IAAIl0F,EAAI0uF,EAAU,OAAQ,KAAO,CACpC,IAAM3kD,EAAQ2kD,EAAU1uF,GACxB,GAAI+pC,EAAM,UAAYwqD,GAAaxqD,EAAM,aAAewqD,EAAYxqD,EAAM,YAAcA,EAAM,SAAU,CACtG,EAAa/pC,EACb,KACF,CACF,CACF,CACAkC,EAAE,oBAAoB+xF,EAAahH,CAAU,CAC/C,CACF,CACF,EACMuH,MAA8B,CAClC,IAAMxC,EAAc9vF,EAAE,qBACtB,GAAIA,EAAE,eAAe8vF,CAAW,EAC9B,OAAOA,EAET,IAAMrwB,EAAgBwxB,EAAuB,EAI7C,OAHIjxF,EAAE,eAAey/D,CAAa,EACzBA,EAEF,IACT,EACM8yB,EAAqB,CACzB,IAAI,aAAc,CAChB,IAAMC,EAAmBvB,EAAuB,EAC1CxxB,EAAgBz/D,EAAE,cAKxB,OAJIy/D,GAAiBA,IAAkB+yB,IAE9BrB,EAAc1xB,EAAe,UAAWz/D,EAAE,eAAgB,cAAe,aAAa,EAAIy/D,EAAc,QAAQ,OAA+Bz/D,EAAE,gBAAqD,cAAgB,CAGjO,EACA,IAAI,aAAc,CAChB,IAAMwyF,EAAmBF,EAAsB,EACzCxC,EAAc9vF,EAAE,qBAItB,OAHI8vF,GAAeA,IAAgB0C,EAC1BrB,EAAcrB,EAAa,UAAW9vF,EAAE,sBAAuB,cAAe,aAAa,EAAI8vF,EAAY,QAAQ,MAErH,CACT,EACA,IAAI,YAAY,EAAM,CACpB,IAAM0C,EAAmBF,EAAsB,EACzCxC,EAAc9vF,EAAE,qBAClB8vF,GAAeA,IAAgB0C,GACjCX,EAAOzrD,EAAO0pD,EAAY,QAAQ,MAAO,SAAS,CAEtD,EACA,IAAI,UAAW,CACb,IAAM0C,EAAmBF,EAAsB,EAI/C,OAHIE,EACKA,EAAiB,QAAQ,IAAMA,EAAiB,QAAQ,MAE1D,CACT,EACA,IAAI,cAAe,CAEjB,IAAMhG,EAAqC8F,EAAsB,CAAA,EAA4C,MAAM,UAInH,OAHI9F,EACKA,EAAU,IAAK,GAAUxsF,EAAE,eAAe6nC,EAAM,UAAU,CAAC,EAE7D,CAAC,CACV,EACA,IAAI,cAAe,CAEjB,IAAMX,EAAyCorD,EAAsB,CAAA,EAA6C,MAIlH,OAHIprD,GAAgBlnC,EAAE,sBACbknC,EAAa,eAAelnC,EAAE,qBAAqB,EAErD,EACT,EACA,IAAI,cAAe,CACjB,OAAOsyF,EAAsB,CAC/B,CACF,EACA,MAAO,MAAK,QAAU,CACpB,IAAI,QAAS,CACX,IAAIG,EACJ,QAAS,EAAezyF,EAAE,WAAa,OAAS,EAAeyyF,EAAa,SAAW,KAAO,IAAK,GAAIA,EAAa,MAAM,CAAC,IAAM,CAAC,CACpI,EACA,IAAI,UAAW,CACb,IAAIC,EACJ,QAAS,EAAe1yF,EAAE,WAAa,OAAS,EAAe0yF,EAAa,QAAU,KAAO,IAAK,GAAIA,EAAa,MAAM,CAAC,IAAM,CAAC,CACnI,EACA,IAAI,oBAAqB,CAIvB,OAHIJ,EAAsB,EACjBC,EAEF,IACT,EACA,IAAI,aAAc,CAChB,OAAOvyF,EAAE,YAAY,MAAM,CAAC,CAC9B,EACA,IAAI,gBAAiB,CACnB,OAAOA,EAAE,cACX,EACA,IAAI,eAAgB,CAClB,OAAOixF,EAAuB,CAChC,EACA,IAAI,gBAAiB,CACnB,IAAMtwD,EAAOswD,EAAuB,EACpC,OAAOjxF,EAAE,cAAc2gC,CAAI,CAC7B,EACA,IAAI,cAAe,CACjB,OAAO3gC,EAAE,qBACX,EACA,IAAI,aAAc,CAChB,OAAOA,EAAE,oBACX,EACA,IAAI,cAAe,CACjB,IAAM2gC,EAAO3gC,EAAE,qBACf,OAAOA,EAAE,cAAc2gC,CAAI,CAC7B,EACA,QAAS,CACP,IAAI,aAAc,CAChB,OAAO4wD,EAAe,CACxB,EACA,IAAI,aAAc,CAChB,IAAMhF,EAAcvsF,EAAE,YACtB,OAAOusF,EAAc,EAAIA,EAAc,CACzC,EACA,IAAI,YAAY,EAAM,CACpBsF,EAAOzrD,EAAM,SAAS,CACxB,EACA,IAAI,UAAW,CACb,OAAOurD,EAAkB,SAAS,CACpC,EACA,IAAI,eAAgB,CAElB,OAA8B3xF,EAAE,gBAAsD,eAAkB,CAC1G,CACF,EACA,WAAY,CACV,IAAI,aAAc,CAChB,OAAOmxF,EAAcF,EAAuB,EAAG,aAAcjxF,EAAE,eAAgB,cAAe,aAAa,CAC7G,EACA,IAAI,aAAc,CAChB,OAAOmxF,EAAcnxF,EAAE,qBAAsB,aAAcA,EAAE,sBAAuB,cAAe,aAAa,CAClH,EACA,IAAI,YAAY,EAAM,CACpB6xF,EAAOzrD,EAAM,YAAY,CAC3B,EACA,IAAI,UAAW,CACb,OAAOurD,EAAkB,YAAY,CACvC,EACA,IAAI,eAAgB,CAElB,OAAOH,EAAsCxxF,EAAE,gBAAsD,eAAkB,EAAG,YAAY,CACxI,CACF,EACA,SAAY,CACV,IAAM2gC,EAAO3gC,EAAE,qBACTywB,EAAQkQ,GAA6B,MAC3C,GAAIlQ,GAAS,CAACA,EAAM,aAAa,KAAM,CACrC,IAAM3sB,EAAQ9D,EAAE,cAAc2gC,CAAI,EAClC,GAAIlQ,EAAM,cAAe,CACvB,IAAM2V,EAAOzF,EAAK,QAAQ,MAAQA,EAAK,MAAM,SAC7CkxD,EAAOzrD,EAAO,KAAM,SAAS,CAC/B,MACEpmC,EAAE,uBAAuBywB,EAAO3sB,EAAO,GAAQ,CAEnD,CACF,CACF,CACF,CACA,IAAI,sBAAuB,CACzB,OAAO,KAAK,aAAe,KAAK,aAAe,KAAK,SACtD,CACA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,cAAgB,KAAK,UACnC,CACA,IAAI,iBAAkB,CAEpB,IAAMgsF,EAAc,KAAK,YACnB1D,EAA0B,KAAK,UAA4C,MAIjF,MAHI,CAAC,KAAK,iBAAmB,CAAC0D,GAAe,CAAC1D,EACrC,GAEF,KAAK,cAAc0D,CAAW,IAAM1D,EAAM,OAAS,CAC5D,CACA,IAAI,iBAAkB,CACpB,OAAO,KAAK,uBAAyB,IACvC,CACA,IAAI,aAAc,CAChB,IAAIuG,EACJ,GAAI,KAAK,iBAAmB,KAC1B,OAEF,IAAMC,EAAoB,KAAK,aAAe,KAAK,YACnD,GAAI,KAAK,eAAeA,CAAiB,GAAK,CAACA,EAAkB,MAAM,cACrE,OAEF,IAAIn1D,EAAQ,KAAK,MACb,CAACA,IAAU,EAAsB,KAAK,gBAAkB,OAAS,EAAsBk1D,EAAoB,QAAU,MAAQA,EAAoB,gBACnJ,EAAQ,KAAK,cAEf,IAAMthD,EAAwB5T,GAAiC,YAC/D,GAAI4T,IAAgB,IAAK,IAAMjnC,EAAeinC,CAAW,EAGzD,OAAOA,CACT,CACA,IAAI,cAAe,CAEjB,OAAO,KAAK,OAAgC,KAAK,cAAoD,OAAU,IACjH,CACA,eAAe,EAAM,CACnB,MAAO,CAAC,EAAE1Q,GAAQ,MAAQA,EAAK,MACjC,CACA,oBAAoB,EAAS,EAAW,CACtC,IAAMkwD,EAAS,KAAK,eAAegC,CAAO,EACtChC,GACF,KAAK,wBAAwBA,EAAQiC,CAAS,CAElD,CACA,wBAAwB,EAAQ,EAAW,CACzC,IAAM1E,EAAgByC,EAAO,aAAa,cACpCkC,EAAclC,EAAO,MAC3B,GAAIzC,GAAiB2E,IAAgB,KAAK,aAAc,CAEtD,GADA,KAAK,eAAiB,MAClB,CAACD,GAAa,KAAK,eAAeA,CAAS,GAAK,CAACA,EAAU,MAAM,gBAC/DA,GAAaC,EAAa,CAC5B,KAAK,aAAe,CAClB,MAAOA,CACT,EACA,MACF,CAEF,IAAMC,EAAwBnC,EAAO,cAAc,EACnD,KAAK,IAAI,6BAA6BA,EAAO,GAAG92E,EAAUi5E,CAAqB,GAAG,EAClF,KAAK,aAAeA,CACtB,MAAWF,GAAaC,IACtB,AAAoB,KAAK,aAAa,CAACA,EAAY,OAEvD,CACA,gBAAgB,EAAQ,EAAO,CAE7B,GAAIlC,EAAO,QAAUpzD,EACnB,OAEF,IAAIu1D,EAAwB,KACtBC,EAAgB,KAAK,IACrBC,EAAgBrC,IAAWoC,EAC3B7E,EAAgB8E,GAAiBrC,EAAO,aAAa,cACrDsC,EAA6C,KAAK,cAAqD,YACzGC,EACJ,GAAIH,EAAc,MACZ7E,IACF,EAAwB6E,EAAc,cAAc,EACpD,KAAK,aAAeD,GAEtB,EAAgB,eACX,GAAIG,EAAqB,CAC9B,IAAMlB,EAAkB,KAAK,mBAAmB,EAC5CA,GACF,EAAwBA,EAAgB,cAAc,EACtD,EAAgB,GAAGA,KAEnB,EAAgB,sBAEpB,KACE,GAAgB,iBAElB,GAAI,CAACe,EAAuB,CAC1B,GAAIG,EACF,EAAwB,KAAK,aAC7B,KAAK,IAAI,mCAAmCp5E,EAAUi5E,CAAqB,GAAG,OACzE,GAAI,CAAC,KAAK,cAAgBC,EAAc,QAAUx1D,EAAO,CAC9D,IAAMkiC,EAAc,KAAK,YACrBA,EAAY,OAAS,GACvBA,EAAY,QAAS,GAAiB,CACpC,GAAIuzB,GAAiBG,EAAa,aAAa,gBAAkBjF,EAAe,CAC9E,IAAMlnD,EAAemsD,EAAa,aAClC,KAAK,kBAAkBA,EAAa,aAAc,IAAI,EACtD,EAAa,cAAgB,GACzBnsD,EAAa,eACf,KAAK,KAAK,sDAAsDA,GAAc,CAElF,CACF,CAAC,EAEH,KAAK,IAAI,YAAY,EACrB,KAAK,aAAe,CAClB,OACF,CACF,CACF,CACA,IAAMosD,EAAeN,GAAyB,gBAAiBA,GAAmDA,EAAsB,aAAsD,aAAgB,SACxMO,EAAeD,GAAgBN,EAAwBA,EAAwBv1D,EACrF,KAAK,IAAI,GAAG61D,EAAe,0BAA4B,kBAAkB,MAAMJ,EAAgBrC,EAAS,UAAU,QAAQuC,EAAc,uBAAuB31D,EAAM,YAAY,EAAE,EACnL,IAAMmwD,EAAW,KAAK,SACtB,GAAI2F,IAAiBP,GAAyBpF,EAAU,CACtD,IAAM4F,EAAyBN,GAAiBrC,EAAO,UAAYjD,EAAS,aAC5E,EAAa,UAAY,CACvB,SAAUA,EAAS,SACnB,YAAa,CAACsF,GAAiBM,EAC/B,WAAY,CAACN,CACf,CACF,CACArC,EAAO,YAAY0C,CAAY,CACjC,CACA,wBAAyB,CACvB,KAAK,aAAa,CACpB,CACA,YAAa,CACX,IAAM3F,EAAW,KAAK,SAChBd,EAAqBc,GAAqC,OAChE,GAAI,CAACd,GAAsB,KAAK,kBAAoB,CAAC,KAAK,MACxD,OAEE,KAAK,cAAgB,KACvB,KAAK,YAAc,GAErB,IAAMP,EAAc,KAAK,YACnBkH,EAAuB,KAAK,qBAClC,GAAIlH,IAAgB,GAAI,CACtB,IAAM5wB,EAAgB,KAAK,IAAI,cAG/B,GAFA,KAAK,IAAI1zB,GAAgB,aAAc0zB,CAAa,CAAC,EACrD,KAAK,YAAcA,EACfmxB,EAAmB,QAAUA,EAAmB,EAAE,CAAC,IAAI,IAAK,CAC9D,IAAMhpF,EAAQ8pF,EAAS,eAAed,EAAmB,EAAE,CAAC,UAAU,EACtE,KAAK,oBAAoBhpF,CAAK,CAChC,MAAO,GAAI63D,GAAiB,GAAK,CAAC,KAAK,YAAa,CAClD,IAAMv6C,EAAQ,KAAK,YAAcu6C,EAAgB,EAAIA,EAAgB,EAC/D73D,EAAQ8pF,EAAS,oBAAoBxsE,CAAK,EAChD,KAAK,oBAAoBtd,CAAK,CAChC,CACF,MAAO,GAAI2vF,GAAwB,CAAC,KAAK,YAAa,CACpD,IAAM3vF,EAAQ8pF,EAAS,cAAc6F,CAAoB,EACzD,KAAK,oBAAoB3vF,CAAK,CAChC,CACF,CACA,sBAAsB,EAAM,EAAW,CACrC,IAAMojC,EAAevG,EAAK,MAEpB+yD,EAAiBjsD,GAAkBP,EADlBA,EAAa,eAAekkD,CACiB,CAAC,EACrE,GAAI,CAAClkD,EAAa,wBAAwBwsD,CAAc,EACtD,KAAK,gBAAgB/yD,EAAM+yD,CAAc,OACpC,GAAI,KAAK,SAAU,CAExB,IAAMC,EAAmC,KAAK,SAAS,QAA+C,KAAK,cAAchzD,CAAI,EAAI,GAC7HgzD,GACF,KAAK,eAAeA,CAAQ,CAEhC,CACF,CACA,uBAAuB,EAAc,EAAO,EAAgB,CAC1D,IAAMD,EAAiBjsD,GAAkBP,EAAcC,CAAc,EACrE,GAAI,CAACD,EAAa,wBAAwBwsD,CAAc,EAAG,CACzD,GAAIxsD,EAAa,cAAe,CAC9B,IAAMkkD,EAAYlkD,EAAa,UAAUwsD,GACrCtI,GACF,KAAK,eAAeA,EAAU,aAAa,CAE/C,CACA,KAAK,oBAAoBtnF,EAAO4vF,CAAc,CAChD,MAAO,GAAI,KAAK,SAAU,CACxB,IAAMpD,EAAgB,KAAK,SAAS,MACpC,GAAIA,EAAe,CACjB,IAAMsD,EAAY9vF,EAAQ,EAE1B,GAAI8vF,GADmBtD,EAAc,OACJ,CAC/B,KAAK,oBAAoB,EAAE,EAC3B,MACF,CACA,IAAMuD,EAAiB3sD,EAAa,WAChC,KAAK,YAAc2sD,IACrB,KAAK,IAAI5rD,GAAgB,yBAA0B4rD,CAAc,CAAC,EAClE,KAAK,YAAcA,EACf3sD,EAAa,eACf,KAAK,eAAe2sD,CAAc,EAEpC,KAAK,YAAY,KAAK,YAAcA,CAAc,GAEpD,KAAK,oBAAoBD,CAAS,CACpC,CACF,CACF,CACA,yBAAyB,EAAM,EAAc,CAC3C,IAAMhG,EAAW,KAAK,SACtB,GAAI,CAACA,EACH,OAEF,IAAMkG,EAAmB3D,EAAa,iBAChCjpD,EAAe0mD,EAAS,SAASkG,CAAgB,EACvD,GAAI5sD,EAAc,CAChB,IAAM6sD,EAAYnG,EAAS,eAAekG,CAAgB,EACpD3sD,EAAiBymD,EAAS,eAAe1mD,EAAcd,CAAI,EACjE,KAAK,uBAAuBc,EAAc6sD,EAAW5sD,EAAiB,CAAC,CACzE,CACF,CACA,oBAAoB,EAAO,EAAgB,CAEzC,IAAMmpD,EAAmC,KAAK,UAA6C,MAC3F,GAAI,CAACA,GAAiB,KAAK,iBACzB,OAEF,IAAM0D,EAAgBlwF,GAAS,EAAIwsF,EAAcxsF,GAAS,KAC1D,KAAK,IAAI,uBAAuBA,EAAM,IAAIqjC,EAAe,IAAI6sD,GAAgBlsD,GAAgBksD,CAAa,EAAkB,SAAS,KAAK,aAAa,EACvJ,IAAMC,EAAc,KAAK,aAAe,KAAK,YACvCC,EAAkB,KAAK,gBAC7B,GAAI,KAAK,eAAeD,CAAW,EAAG,CACpC,IAAM/sD,EAAe+sD,EAAY,MAC3B9D,EAAe,KAAK,aACpB0C,EAAU1C,GAA6C,WACvDU,EAASgC,EAAU,KAAK,eAAeA,CAAO,EAAI,KACxD,GAAIhC,GAAUgC,IAAY,CAAC,KAAK,gBAAgBoB,EAAaD,CAAa,GAAK7sD,IAAmB,IAAK,IAAK0rD,IAAY3rD,EAAa,UAAUC,EAAe,CAAC,YAAa,CAC1K,IAAIgtD,EACJ,IAAMC,EAAwBltD,EAAa,eAAeipD,CAAY,EAYtE,GAXA,KAAK,IAAI,4BAA4BiE,EAAwB,EAAE,GAAGltD,EAAa,UAAU,OAAO,GAAGU,GAAmBuoD,CAAY,GAAG,EACrI,KAAK,WAAaA,EAClB,KAAK,aAAe,KACpB,KAAK,IAAI,QAAQr9D,EAAO,yBAA0B,CAChD,MAAOq9D,EACP,eAAgBiE,EAChB,MAAOltD,EACP,SAAUopD,EAAc,MAAM,CAAC,EAC/B,cAAexsF,EACf,QACF,CAAC,EACGmwF,IAAgB,KAAK,YAAa,CAChC,KAAK,WAAWA,EAAa,KAAK,WAAW,GAAK,CAAC,KAAK,cAC1D,KAAK,uBAAuB/sD,EAAc,KAAK,cAAc,KAAK,WAAW,EAAGktD,CAAqB,EAEvG,MACF,CACA,KAAK,oBAAoBvB,EAASmB,CAAa,EAC3CnD,EAAO,OAAS,GAAG,EAAsB,KAAK,eAAiB,MAAQsD,EAAoB,cAC7FtD,EAAO,YAAY,CAEvB,CACA,GAAI,CAAC,KAAK,gBAAgBoD,EAAaD,CAAa,IAClD,KAAK,UAAYC,EACjB,KAAK,YAAc,KACnB,KAAK,IAAI,sBAAsB/sD,EAAa,GAAGY,GAAgBmsD,CAAW,GAAG,EAC7E,EAAa,UAAY,GACzB,KAAK,IAAI,QAAQnhE,EAAO,mBAAoB,CAC1C,MAAOoU,EACP,SAAUopD,EAAc,MAAM,CAAC,EAC/B,cAAexsF,CACjB,CAAC,EACGojC,EAAa,IAAI,MAAM,CAEzB,KAAK,eAAe,EACpB,IAAMmtD,EAA0C,KAAK,UAA6C,MAClG,GAAIL,GAAiBK,EAAsB,CACzC,IAAMC,EAAe,KAAK,cAAcN,CAAa,EACrD,KAAK,gBAAgBM,EAAcD,EAAsBltD,EAAgB8sD,EAAaC,CAAe,CACvG,CACA,MACF,CAEJ,CACA,KAAK,gBAAgBpwF,EAAOwsF,EAAenpD,EAAgB8sD,EAAaC,CAAe,CACzF,CACA,gBAAgB,EAAO,EAAe,EAAgB,EAAa,EAAgB,CACjF,IAAMtG,EAAW,KAAK,SACtB,GAAI,CAACA,EACH,OAEF,IAAMoG,EAAgB1D,EAAcxsF,IAAU,KACxC25B,EAAQ,KAAK,aACbkiC,EAAc,KAAK,YAUzB,GATIA,EAAY,QACdA,EAAY,QAAS,GAAW,CAC9B,IAAMz4B,EAAe2pD,EAAO,aACtB0D,EAAc3G,EAAS,eAAe1mD,EAAa,UAAU,GAC/DqtD,EAAczwF,GAASywF,EAAczwF,EAAQ,IAC/C,KAAK,kBAAkBojC,EAAc8sD,CAAa,CAEtD,CAAC,EAEC,KAAK,eAAeA,CAAa,EAAG,CACtC,KAAK,YAAc,KAAK,IAAI,KAAK,IAAI,KAAK,YAAaA,EAAc,KAAK,EAAGA,EAAc,GAAG,EAC9F,IAAM9sD,EAAe8sD,EAAc,MACnC,GAAI7sD,IAAmB,IAAK,GAAG,CAC7B,EAAiBymD,EAAS,eAAe1mD,EAAc,KAAK,WAAW,EACvE,IAAMstD,EAAsB/sD,GAAkBP,EAAcC,EAAiB,CAAC,EAC9E,GAAID,EAAa,wBAAwBstD,CAAmB,GAAKttD,EAAa,eAAiB,KAAK,cAAgB8sD,EAAc,IAAK,CACrI,KAAK,uBAAuB9sD,EAAcpjC,EAAOqjC,CAAc,EAC/D,MACF,CACA,EAAiBqtD,CACnB,CACA,IAAMC,EAAc,KAAK,YACpB,KAAK,eAAeT,EAAev2D,CAAK,GAC3C,KAAK,iBAAiBu2D,CAAa,EAErC,IAAInD,EAAS,KAAK,cAAc3pD,EAAcC,CAAc,EAU5D,GATK,KAAK,gBAAgB6sD,EAAeS,GAAeR,CAAW,IACjE,KAAK,YAAcD,EACnB,KAAK,IAAI,wBAAwBlsD,GAAgBksD,CAAa,EAAE,GAAG9sD,EAAa,cAAgB,kBAAoB,IAAI,EACxH,KAAK,IAAI,QAAQpU,EAAO,qBAAsB,CAC5C,MAAOoU,EACP,SAAUopD,EAAc,MAAM,CAAC,EAC/B,cAAexsF,CACjB,CAAC,GAEC,CAACojC,EAAa,gBAAiB,CACjC,KAAK,IAAI,8CAA8CA,GAAc,EACrE,MACF,CAKA,GAJA,AAEEA,EAAa,mBADbA,EAAa,gBAAgB,QAAQ,EACN,IAAK,IAElC,CAACzJ,EAAO,CACV,KAAK,IAAI,iDAAiDyJ,GAAc,EACxE,MACF,CACA,KAAK,YAAc,KAAK,UAAY,KACpC,KAAK,YAAc8sD,EACnB,IAAM5I,EAAYlkD,EAAa,UAAUC,GACzC,GAAI,CAACikD,EAAW,CACd,KAAK,uBAAuBlkD,EAAcpjC,EAAOqjC,GAAkB,CAAC,EACpE,MACF,CAIA,GAHA,AACE0pD,IAAS,KAAK,eAAezF,EAAU,UAAU,EAE/CyF,IAAW,MAAQA,EAAO,UAAW,CACvC,IAAM6D,EAAkBxtD,EAAa,UAAU,OAC/C,KAAK,KAAK,SAASC,EAAiB,EAAE,GAAGutD,EAAgB,oBAAoBxtD,GAAc,EAC3F,EAAS,KAAK,kBAAkBA,EAAckkD,EAAWjkD,CAAc,EACvE0pD,EAAO,WAAW,CACpB,CACA,GAAI,CAAC,KAAK,gBAAgBmD,EAAe,KAAK,aAAa,GACrD9sD,EAAa,eAAiB,KAAK,gBAAgBkkD,CAAS,EAC9D,OAGJ,KAAK,iBAAiByF,EAAQ1pD,EAAgBmpD,EAAexsF,EAAO25B,CAAK,EACrE,KAAK,YACPsK,GAAc8oD,EAAO,KAAK,CAE9B,MAAWmD,GACT,KAAK,cAAcA,EAAelwF,EAAOmwF,CAAW,EAChD,KAAK,YACPlsD,GAAc,KAAK,IAAI,KAAK,GAErB4sD,GAAkB,KAAK,eAAeV,CAAW,IAC1D,KAAK,UAAY,KACjB,KAAK,YAAcA,EACdA,EAAY,MAAM,eACrB,KAAK,cAAcrG,EAAS,UAAU,QAAS,IAAI,EAGzD,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,IAAI,OAAO,6BAA+B,EACxD,CACA,IAAI,gBAAiB,CAEnB,OAA+B,KAAK,gBAAwD,KAAK,OACnG,CACA,IAAI,aAAc,CAChB,IAAIgH,EACJ,MAAO,CAAC,GAAG,EAAuB,KAAK,iBAAmB,MAAQA,EAAqB,KACzF,CACA,cAAc,EAAe,EAAO,EAAU,CAC5C,IAAIC,EAMJ,GALA,KAAK,YAAcb,EACnB,KAAK,aAAe,KAAK,WAAa,KACtC,KAAK,YAAc,KAAK,UAAY,KACpC,KAAK,eAAeA,CAAa,EACjC,KAAK,IAAI,YAAYlsD,GAAgBksD,CAAa,GAAG,EACjD,GAAG,EAAsB,KAAK,eAAiB,MAAQa,EAAoB,aAAc,CAC3F,IAAItI,EAAc,KAAK,aACnBA,EAAcyH,EAAc,OAASzH,GAAeyH,EAAc,OACpE,EAAc,KAAK,qBAAqBA,EAAelwF,CAAK,EAC5D,KAAK,IAAImkC,GAAgB,gBAAiBskD,CAAW,CAAC,EACtD,KAAK,YAAcA,GAErB,KAAK,cAAcA,EAAayH,CAAa,CAC/C,CACA,GAAI,CAACc,EACH,OAEF,IAAMxE,EAAmC,KAAK,UAA6C,MACtFA,IAGL,KAAK,IAAI,iCAAiCxoD,GAAgBksD,CAAa,GAAG,EAC1E,KAAK,IAAI,QAAQlhE,EAAO,8BAA+B,CACrD,SAAUw9D,EAAc,MAAM,CAAC,EAC/B,cAAexsF,CACjB,CAAC,EACD,KAAK,YAAY,EACnB,CACA,qBAAqB,EAAe,EAAO,CACzC,IAAMixF,EAAYf,EAAc,MAChC,GAAI,KAAK,YAAa,CACpB,IAAMv8E,EAAU,KAAK,eACrB,GAAI3T,IAAU,EACZ,OAAO,KAAK,IAAI,cACX,GAAI2T,IAAYs9E,EAAYt9E,EAAQ,eAAiBs9E,EAAYt9E,EAAQ,MAC9E,OAAO,KAAK,IAAI,kBAAoB,EAExC,CACA,OAAOs9E,CACT,CACA,gBAAgB,EAAO,CACrB,IAAMlE,EAAS,KAAK,eAAehpD,EAAM,UAAU,EAKnD,OAJIgpD,GAAU,MAAQA,EAAO,IACpBA,EAAO,IAAI,cAEDp8C,EAAa,WAAW,KAAK,aAAc,KAAK,YAAa,CAChE,CAAC,CAAC,IAAM,GAAK5M,EAAM,eAAiBA,EAAM,UAAY,EACxE,CACA,cAAc,EAAa,EAAM,EAAyB,CACpDlH,EACF,KAAK,iBAAiBA,CAAI,EAE1B,KAAK,cAAgB,KAAK,YAE5B,KAAK,eAAiB,KACtB,IAAMlD,EAAQ,KAAK,aACnB,GAAI,CAACA,EACH,OAEF,IAAM7gB,EAAM,KAAK,IACbA,EAAI,MACN,KAAK,YAAY,GAEjB,KAAK,gBAAgBA,EAAK6gB,CAAK,EAC3Bw6C,GACF,KAAK,sBAAsBsU,EAAatU,CAAuB,GAG9DA,IACH,KAAK,IAAIhwC,GAAgB,gBAAiBskD,CAAW,CAAC,EACtD,KAAK,YAAcA,EACnB,KAAK,sBAAsBA,EAAatU,CAAuB,EAEnE,CACA,sBAAsB,EAAa,EAAyB,CAE1D,IAAMr7D,EAAM,KAAK,IACb,CAACA,EAAI,gBAAkB,CAACA,EAAI,OAAS,KAAK,KAA+BA,EAAI,uBAAgE,OAAUA,EAAI,MAAM,aAAe2vE,CAAW,EAAI,GACjM3vE,EAAI,UAAU2vE,EAAatU,CAAuB,EACxCr7D,EAAI,kBACdA,EAAI,gBAAgB,CAExB,CACA,mBAAoB,CAClB,IAAIo4E,EACJ,KAAK,SAAS,GACb,EAAkB,KAAK,WAAa,MAAQA,EAAgB,MAAM,EACnE,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,WAAa,GAClB,KAAK,YAAc,KAAK,YAAc,GACtC,KAAK,eAAiB,KAAK,aAAe,KAAK,QAAU,KAAK,eAAiB,KAC/E,KAAK,IAAI,IAAIliE,EAAO,cAAe,KAAK,eAAgB,IAAI,EAC5D,KAAK,IAAI,GAAGA,EAAO,cAAe,KAAK,eAAgB,IAAI,CAC7D,CACA,eAAe,EAAO,EAAM,CAC1B,GAAIrwB,EAAK,QAAU,IAAM,CAAC,KAAK,SAC7B,OAEF,IAAMyuC,EAAO,KAAK,IAAI,OAAOzuC,EAAK,OAClC,GAAI,CAACyuC,EAAK,QACR,OAEF,IAAM+jD,EAAmBr3F,EAAeA,EAAe,CAAC,EAAG,KAAK,gBAAkB,KAAK,YAAY,EAAG,CAAC,EAAG,CACxG,MACF,CAAC,EACD,KAAK,eAAiBq3F,EACtB,KAAK,SAAS,4BAA4BA,EAAkB,KAAK,IAAI,OAAO,yBAAyB,EACjG,CAAC,KAAK,sBAAwB,KAAK,SAAS,OAC9C,KAAK,WAAW,CAEpB,CACA,oBAAoB,EAAO,EAAM,CAC/B,IAAM99E,EAAQ,KAAK,IAAI,YAAY1U,EAAK,IAClCyyF,EAAoB,KAAK,eAC/B,GAAI,CAACA,EAAmB,CACtB,KAAK,aAAet3F,EAAeA,EAAe,CAAC,EAAG,KAAK,YAAY,EAAG,CAAC,EAAG,CAC5E,OACF,CAAC,EACD,MACF,CACA,IAAMq3F,EAAmBr3F,EAAeA,EAAe,CAAC,EAAGs3F,CAAiB,EAAG,CAAC,EAAG,CACjF,OACF,CAAC,EACD,KAAK,eAAiBD,CACxB,CACA,uBAAuB,EAAO,EAAM,CAClC,IAAME,EAAY,KAAK,IAAI,eAAe1yF,EAAK,IACzCyyF,EAAoB,KAAK,eAC/B,GAAI,CAACA,EAAmB,CACtB,KAAK,aAAet3F,EAAeA,EAAe,CAAC,EAAG,KAAK,YAAY,EAAG,CAAC,EAAG,CAC5E,WACF,CAAC,EACD,MACF,CACA,IAAMq3F,EAAmBr3F,EAAeA,EAAe,CAAC,EAAGs3F,CAAiB,EAAG,CAAC,EAAG,CACjF,WACF,CAAC,EACD,KAAK,eAAiBD,CACxB,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAM3Z,EAAczgE,GAAwBpY,CAAI,EAChD,KAAK,YAAY,SAAS,CACxB,SACIma,IAAQA,EAAI,eAAena,CAAI,GAAKma,EAAI,eAAe0+D,CAAW,EAAE,CAC5E,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAMiP,EAAiB1vE,GAAwBpY,CAAI,EACnD,KAAK,YAAY,SAAS,CACxB,SACIma,IAAQA,EAAI,kBAAkBna,CAAI,GAAKA,EAAK,KAAO,IAAMma,EAAI,kBAAkB2tE,CAAc,EAAE,CACvG,CACA,eAAe,EAAO,EAAM,CAC1B,IAAMjrF,EAAiBmD,EAAK,OACxBnD,IACF,KAAK,eAAiBA,EAE1B,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,YAAY,CACnB,CACA,gBAAgB,EAAO,EAAM,CAC3B,IAAMwwF,EAAc,KAAK,YACzB,GAAIA,GAAe,CAAC,KAAK,WAAWA,EAAa,KAAK,aAAa,GAAK,CAAC,KAAK,eAAeA,CAAW,EAAG,CACzG,IAAMvD,EAAc,KAAK,YACzB,KAAK,YAAcA,EACnB,KAAK,YAAY,CACnB,CACF,CACA,gBAAgB,EAAO,CACrB,GAAI,CAAC,KAAK,SACR,OAEF,IAAMO,EAAqB,KAAK,SAAS,OACzC,GAAI,KAAK,YAAc,OAAO,WAAaA,EAAoB,CAC7D,IAAK,IAAIhvF,EAAI,EAAGA,EAAIgvF,EAAmB,OAAQ,IAAK,CAClD,IAAM5lD,EAAe4lD,EAAmBhvF,GACxC,GAAIopC,EAAa,IAAI,KAAM,CAEzB,IAAM+oD,EAAgB,KAAK,SAAS,eAAe/oD,EAAa,UAAU,EACpEvG,EAAgC,KAAK,SAAS,QAAgDsvD,GAChG,KAAK,eAAetvD,CAAI,GAAK,KAAK,gBAAgBA,EAAM,KAAK,aAAa,GAC5E,KAAK,eAAeA,EAAM,CAAC,EAE7B,KACF,CACF,CACA,KAAK,YAAc,OAAO,SAC5B,CACF,CACA,aAAa,EAAO,CAClB,IAAMmvD,EAAc,KAAK,YACzB,GAAI,CAAC,KAAK,iBAAmBA,EAAa,CACxC,IAAME,EAAe,KAAK,cAAcF,CAAW,EACnD,KAAK,oBAAoBE,EAAe,CAAC,CAC3C,KACE,MAAK,WAAa,EAEtB,CACA,WAAW,EAAc,EAAM,CAE7B,IAAM5D,EAA2B,KAAK,UAA6C,MAKnF,OAJIgJ,GAAgBhJ,GAEXA,EADO,KAAK,cAAcgJ,EAAchvD,CAC9B,IAAM,IAG3B,CACA,YAAY,EAAa,EAAkB,CACzC,GAAI,KAAK,eAAeivD,CAAW,GAAKA,EAAY,MAAM,eAAiBC,EAAiB,IAAMD,EAAY,IAAM,IAAM,CACxHA,EAAY,MAAM,UAAU,SAAS,EAAO,IAAU,CAChDA,EAAY,MAAM,wBAAwBvxF,CAAK,GACjD,KAAK,iBAAiB+jC,EAAM,WAAY,IAAI,CAEhD,CAAC,EACD,IAAM0tD,EAAaF,EAAY,IAAM,IAC/BptC,EAAaxT,EAAa,WAAW,KAAK,aAAc8gD,EAAY,CAAC,GACvEttC,EAAW,IAAMstC,IAAettC,EAAW,WAAa,GAAKstC,KAC/D,KAAK,IAAI,8BAA8BztD,GAAgButD,CAAW,EAAE,QAAQvtD,GAAgBwtD,CAAgB,EAAE,EAAE,EAEhH,KAAK,cAAcC,EAAY,KAAM,EAAuB,EAC5D,KAAK,iBAAiBA,CAAU,EAEpC,CACF,CACA,WAAW,EAAG,EAAG,CACf,MAAO,CAAC,CAACtsF,IAAMma,IAAMna,GAAKma,EAAE,OAASna,EAAE,OAAS,KAAK,gBAAgBma,EAAGna,CAAC,GAAK,CAACma,EAAE,OAAS,CAACna,EAAE,OAAS,KAAK,cAAcma,CAAC,IAAM,KAAK,cAAcna,CAAC,EACtJ,CACA,gBAAgB,EAAG,EAAG,CAEpB,MAAO,CAAC,CAACA,IAAMma,IAAMna,GAAKma,EAAE,MAAM,aAA4Bna,EAAE,OAAmC,WACrG,CACA,cAAc,EAAM,EAAM,CACxB,OAAO03B,GAAQ,KAAK,SAAW,KAAK,SAAS,cAAcA,EAAMyF,CAAI,EAAI,EAC3E,CACA,eAAe,EAAc,GAAO,CAClC,IAAIovD,EACJ,IAAM5I,EAAiB,KAAK,eACvBA,KAGJ,EAAkB,KAAK,WAAa,MAAQ4I,EAAgB,eAAe5I,EAAgB,CAAC,EAAGc,CAAW,EAC7G,CACA,YAAY,EAAS,CAEnB,IAAMtB,EAA2B,KAAK,UAA6C,MACnF,GAAI,CAACA,EACH,OAEF,IAAMnkC,EAAaxT,EAAa,WAAW,KAAK,aAAc,KAAK,YAAa,CAAC,EAC7EghD,IACF,KAAK,YAAc,KAAK,aAE1B,AAAYA,IAAUxtC,EAAW,IAAM,EACvC,KAAK,kBAAkBA,EAAW,IAAKmkC,EAAOqJ,CAAO,CACvD,CACA,kBAAkB,EAAW,EAAO,EAAe,CACjD,IAAM7H,EAAW,KAAK,SAChBnuB,EAAgB,KAAK,cAC3B,GAAI,KAAK,YAAcliD,GAAa,CAACqwE,EACnC,OAEF,GAAIxB,EAAM,SAAW,GAAK,KAAK,WAAWA,EAAM,GAAI3sB,CAAa,EAAG,CAClE,KAAK,YAAcliD,EACnB,MACF,CACA,IAAMuyE,EAAc,KAAK,YACnBE,EAAe,KAAK,cAAcF,CAAW,EAC/C4F,EAAiB9H,EAAS,oBAAoBrwE,CAAS,EAC3D,GAAI,KAAK,YAAcA,EAAW,CAChC,IAAIo4E,EACJ,IAAMC,EAAiB,KAAK,cAAcn2B,CAAa,EACjDo2B,EAAoB,KAAK,IAAID,EAAiB,EAAGxJ,EAAM,OAAS,CAAC,EACjE0J,EAAmB1J,EAAMyJ,GAI/B,IAHIH,IAAmB,IAAMj2B,GAAiBliD,GAAakiD,EAAc,MAAQ,EAAwBq2B,EAAiB,QAAU,MAAQH,EAAsB,eAAiBp4E,EAAY,KAAQu4E,EAAiB,SACtN,EAAiBD,GAEf,KAAK,eAAep2B,CAAa,EAAG,CACtC,IAAMv4B,EAAeu4B,EAAc,MAInC,GAHIo2B,EAAoB7F,EAAe,GAAK9oD,EAAa,gBAAkB,IAGvEA,EAAa,UAAU,SAAW,GAAKA,EAAa,gBACtD,MAEJ,CAEA,GADA,KAAK,YAAc3pB,EACfm4E,EAAiBE,GAAkBF,EAAiB1F,EACtD,KAAK,eAAe8F,CAAgB,MAC/B,CACL,IAAMr+E,EAAU,KAAK,eACjB,KAAK,aAAeA,GAAW8F,EAAY9F,EAAQ,KAAOA,EAAQ,gBAAkBq+E,EAAiB,MAAQr+E,EAAQ,KAAO,KAAK,IAAI,OAAO,2BAA6B,KAAK,eAAeq+E,CAAgB,GAC/M,KAAK,cAAcA,EAAiB,MAAO,CAAC,CAEhD,CACF,MAAWC,GAAiBjG,GAAe,CAAC,KAAK,WAAWA,EAAarwB,CAAa,IAChFi2B,IAAmB1F,EACrB,KAAK,eAAeF,CAAW,EACtB4F,IAAmB1F,EAAe,GAC3C,KAAK,eAAe5D,EAAMsJ,EAAe,EAG/C,CACA,eAAe,EAAM,EAAO,CAK1B,OAJkB/0D,EAAK,MAAM,UACf,SAAW,GAGlB,CAACA,EAAK,MAAM,UAAU,KAAM,GAAU,CAC3C,IAAMkwD,EAAS,KAAK,eAAehpD,EAAM,UAAU,EACnD,MAAO,EAAEgpD,GAAU,MAAQA,EAAO,qBAAqBpzD,CAAK,EAC9D,CAAC,CACH,CACA,iBAAiB,EAAM,CACrB,IAAMu4D,EAAgB,KAAK,cACrBpI,EAAW,KAAK,SACtB,GAAI,CAAC,KAAK,WAAWjtD,EAAMq1D,CAAa,GAAKpI,EAAU,CACrD,GAAM,CACJ,QACA,UACEA,EACJ,GAAI,CAACxB,GAAS,CAACv7D,EACb,OAAOmlE,EAET,IAAMC,EAAiB,KAAK,eAAet1D,CAAI,EACzCsxD,EAAkB,KAAK,mBAAmB,EAChD,KAAK,cAAgBtxD,EACrB,KAAK,YAAc,KAAK,IAAIA,EAAK,MAAO,KAAK,IAAIA,EAAK,IAAK,KAAK,WAAW,CAAC,EAC5E,IAAMu1D,EAAgBjE,EAAkBA,EAAgB,UAAY+D,EAAgBA,EAAc,IAAM,KAAK,YAAc,EAE3H,GADA,KAAK,IAAI,sCAAsCluD,GAAgBnH,CAAI,KAAOq1D,EAAgB,KAAKE,EAAc,QAAQ,CAAC,EAAE,aAAe,GAAG,EACtI,CAAC,KAAK,iBAAkB,CAC1B,GAAID,EAAgB,CAClB,IAAME,EAAcvI,EAAS,eAAejtD,EAAK,MAAO,KAAK,WAAW,EACxEA,EAAK,MAAM,UAAU,SAAS,EAAO,IAAM,CACzC,IAAMkwD,EAAS,KAAK,eAAehpD,EAAM,UAAU,EAC/CgpD,IACE/yF,IAAMq4F,GACRtF,EAAO,WAAW,EAEpBA,EAAO,gBAAgB,EAE3B,CAAC,CACH,MACE,KAAK,IAAI,gBAAgB,EACzB,KAAK,YAAY,QAAS,GAAWA,EAAO,eAAe,CAAC,CAEhE,CACA,KAAK,IAAI,QAAQ/9D,EAAO,mCAAoC,CAC1D,OAAQjC,EAAO,MAAM,CAAC,EACtB,SAAUu7D,EAAM,MAAM,CAAC,EACvB,eAAgB,KAAK,cAAczrD,CAAI,EACvC,aAAc,KAAK,cAAc,KAAK,WAAW,CACnD,CAAC,CACH,MAAW,KAAK,gBAAkBA,IAChC,KAAK,cAAgBA,GAEvB,OAAOq1D,CACT,CACA,eAAe,EAAM,EAAiB,EAAG,CACvC,IAAMA,EAAgB,KAAK,iBAAiBr1D,CAAI,EAChD,GAAI,MAAK,iBAGT,IAAI,KAAK,eAAeA,CAAI,EAC1B,KAAK,gBAAgBA,EAAMwG,CAAc,OACpC,GAAI6uD,IAAkB,KAAM,CACjC,KAAK,eAAiB,KACtB,IAAMI,EAAe,KAAK,aACtBA,GACEA,EAAa,YAEf,KAAK,cAAcz1D,EAAK,MAAOA,EAAM,EAAuB,EAK9D,KAAK,eAAeA,CAAI,CAE5B,EACF,CACA,eAAe,EAAM,CACnB,IAAM78B,EAAQ,KAAK,cAAc68B,CAAI,EAC/B4rD,EAAc,KAAK,qBAAqB5rD,EAAM78B,CAAK,EACzD,KAAK,sBAAsByoF,CAAW,CACxC,CACA,gBAAgB,EAAM,EAAgB,CACpC,IAAMrlD,EAAevG,EAAK,MACpB01D,EAAcnvD,EAAa,UAAU,SAAW,GAAK,CAACA,EAAa,gBACnEovD,EAAWpvD,EAAa,IAAI,KAClC,GAAImvD,GAAe,CAACC,EAAU,CAC5B,IAAMzF,EAAS,KAAK,cAAc3pD,EAAcC,CAAc,EAC9D,GAAI0pD,GAAU,MAAQA,EAAO,aAAa,cAAe,CACvD,IAAMpzD,EAAQ,KAAK,aACfA,GACF,KAAK,kBAAkBozD,EAAQpzD,CAAK,CAExC,CACF,CACF,CACA,cAAc,EAAc,EAAgB,CAC1C,IAAMrhB,EAAM8qB,EAAa,SACnBwtD,EAAkBxtD,EAAa,UAAU,OACzCmvD,EAAc3B,IAAoB,GAAK,CAACxtD,EAAa,gBACrDovD,EAAWpvD,EAAa,IAAI,KAClC,GAAImvD,EAAa,CACf,IAAMx6B,EAAgB30B,EAAa,cACnC,GAAIA,EAAa,cAAe,CAC9B,IAAIqvD,EACJ,IAAMzG,EAAc,KAAK,YACrB,CAAC,KAAK,eAAeA,CAAW,IAAMA,GAAe,OAAS,EAAwBA,EAAY,YAAc,KAAO,IAAK,GAAIyG,EAAsB,cAAgBrvD,EAAa,YACrL,KAAK,iBAAiB20B,EAAgB,GAAI,CAE9C,CACA,IAAI4zB,EACA+G,EAAoB,EAOxB,GANI,CAAC,KAAK,aAAe,KAAK,cAC5B,EAAoB,KAAK,IAAI,cACzBA,IAAsB,KACxB,EAAoB,KAAK,IAAI,kBAAoB,IAGjDA,GAAqB,EAAEtvD,EAAa,IAAI,KAAOA,EAAa,IAAI,MAAO,CACzE,IAAMo1B,EAAck6B,EAAoB36B,EACpCS,EAAc,IAChB,EAAiB,KAAK,MAAMA,EAAc,GAAG,EAAI,IAErD,CAEA,GADA,KAAK,IAAI,2BAA2Bn1B,EAAiB,EAAE,GAAG/qB,EAAM,EAAIs4E,EAAgB,GAAGxtD,IAAeuoD,EAAiB,gBAAgB+G,EAAkB,iBAAiB/G,IAAmB,IAAI,EAC7LrzE,EACF,OAAO,KAAK,YAAY8qB,EAAc,EAAG,EAAG20B,EAAe30B,EAAa,SAAU9qB,CAAG,EAEvF,IAAMq6E,EAAkB,KAAK,gBAAgB,cAAcvvD,EAAcuoD,CAAc,EACnFgH,IACF,EAAa,gBAAkBA,EAEnC,MAAO,GAAI,CAACH,GAAY5B,EAAiB,CACvC,IAAK,IAAI52F,EAAIqpC,EAAgBrpC,EAAI42F,EAAiB,IAAK,CACrD,IAAMgC,EAASxvD,EAAa,UAAUppC,GAChC64F,EAAc,KAAK,yBAAyBD,EAAO,UAAU,GAC9DC,IAAgB,IAAM,KAAK,YAAYA,EAAY,CAAC,YAAc,CAACD,EAAO,OAC7E,KAAK,kBAAkBxvD,EAAcwvD,EAAQ54F,CAAC,CAElD,CACA,IAAM+pC,EAAQX,EAAa,UAAUC,GACrC,GAAIU,EAAO,CACT,IAAMgpD,EAAS,KAAK,eAAehpD,EAAM,UAAU,EAInD,OAHIgpD,GACFA,EAAO,WAAW,EAEbA,CACT,CACF,CACA,OAAO,IACT,CACA,iBAAiB,EAAa,CAC5B,IAAMvxF,EAAiB,KAAK,eACvBA,IAGL,KAAK,IAAI,qCAAqCg9D,GAAa,EAE3D,OADiC,KAAKh9D,CACtB,CAAC,CAAC,QAAS,GAAS,CAClC,KAAK,IAAI,QAAQwzB,EAAO,gBAAiB,CACvC,cACA,UAAW,IACX,MACF,CAAC,CACH,CAAC,EACH,CACA,yBAAyB,EAAS,CAChC,IAAM6sC,EAAc,KAAK,YACzB,IAAK,IAAI7hE,EAAI,EAAGA,EAAI6hE,EAAY,OAAQ,IACtC,GAAIkzB,IAAYlzB,EAAY7hE,EAAE,CAAC,QAC7B,OAAOA,EAGX,MAAO,EACT,CACA,eAAe,EAAS,CACtB,IAAMgG,EAAQ,KAAK,yBAAyB+uF,CAAO,EACnD,OAAO,KAAK,YAAY/uF,IAAU,IACpC,CACA,oBAAqB,CACnB,GAAM,CACJ,cACA,gBACE,KACJ,GAAI8yF,EACG,KAAA,IAAI94F,EAAI,EAAGA,EAAI6hE,EAAY,OAAQ,IACtC,GAAIA,EAAY7hE,EAAE,CAAC,QAAU84F,EAC3B,OAAOj3B,EAAY7hE,EAAA,CAIzB,OAAO,IACT,CACA,YAAY,EAAc,EAAgB,EAAa,EAAe,EAAU,EAAK,CACnF,IAAMstF,EAAY,CAChB,iBAAkBlkD,EAAa,WAC/B,WAAYD,GAAwBC,EAAc9qB,EAAK+qB,CAAc,EACrE,WACA,cACA,gBACA,KACF,EACA,OAAO,KAAK,kBAAkBD,EAAckkD,EAAWjkD,CAAc,CACvE,CACA,kBAAkB,EAAc,EAAW,EAAgB,CACzD,IAAM0vD,EAAU,KAAK,IACf3mD,EAAa2mD,EAAQ,WACvBt+E,EAAkB23B,EAAW,gBAC3Bj0B,EAAe46E,EAAQ,cAAgBA,EAAQ,OAAOA,EAAQ,eAChEt+E,GAAmB0D,KACrB,EAAkB3e,EAAS,CAAC,EAAGib,CAAe,EAC1C0D,EAAa,aACf,EAAgB,WAAaA,EAAa,YAExCA,EAAa,aACf,EAAgB,mBAAqB,CAACA,EAAa,UAAU,IAGjE,IAAM66E,EAAgBD,EAAQ,YAAYA,EAAQ,YAC5CE,EAAmBF,EAAQ,eAAeA,EAAQ,eACpDl7B,EAAgB,EACpB,GAAI,KAAK,aAAez0B,EAAa,cAAe,CAClD,IAAM8vD,EAAgB,KAAK,YAAc5L,EAAU,cACnD,GAAI4L,EAAgB,EAAG,CACrB,IAAMj5E,EAAWqtE,EAAU,SACvBrtE,GAAYi5E,EAAgBj5E,IAC9B,EAAgBi5E,EAEpB,CACF,CACA,IAAMnE,EAAUzH,EAAU,WACpB6L,EAAer5F,EAAeA,EAAe,CAAC,EAAGsyC,CAAU,EAAG,CAAC,EAAG,CACtE,mBAAoB,KAAK,IAAI,IAAK2mD,EAAQ,OAAO,kBAAkB,EACnE,cAAe,GACf,kBAAmB,GACnB,iBAAkBA,EAAQ,UAC1B,cAAehE,EACf,uBAAwBgE,EAAQ,kBAChC,wBAAyB,IAAK,GAC9B,gBACA,qBAAsB,GACtB,cAAe,GACf,kBACA,gBAAiBC,GAAiB5mD,EAAW,gBAC7C,mBAAoB6mD,GAAoB7mD,EAAW,kBACrD,CAAC,EACGhJ,EAAa,gBACf,EAAa,qBAAuB,GAChCkkD,EAAU,gBACZ,EAAa,eAAiBA,EAAU,gBAG5C,IAAMjqD,EAAO81D,EAAa,KACtB91D,GAAQ,MAAQA,EAAK,WAAaA,EAAK,YACzC,EAAa,KAAO7jC,EAAS,CAAC,EAAG6jC,EAAM,CACrC,UAAW4F,GAAKqkD,EAAU,GAAG,CAC/B,CAAC,GAEC,KAAK,eAAeyH,CAAO,GAC7B,KAAK,KAAK,mCAAmC3rD,EAAa,aAAa2rD,GAAS,EAElF,IAAMhC,EAAS,IAAIn3C,GAAe,KAAK,eAAgBu9C,EAAc/vD,EAAckkD,CAAS,EAC5F,KAAK,YAAY,KAAKyF,CAAM,EAC5B,EAAa,UAAU1pD,GAAkBikD,EACzC,IAAI8L,EAAkB,GAChBC,EAA4B,GAAY,CAC5C,GAAI1/E,EAAQ,KAAM,CAEhB,IAAM+G,EAAQ,gBAAI,MAAM,oCAAoC0oB,GAAc,EACpExlB,EAAY,CAChB,MAAO,GACP,KAAMC,EAAW,YACjB,QAASlD,EAAa,8BACtB,OACF,EACMwxE,EAAoC,KAAK,UAA6C,eAAe/oD,EAAa,UAAU,GAAM,GACxI,KAAK,qBAAqBxlB,EAAWwlB,EAAc+oD,EAAe9oD,EAAgB3oB,EAAM,OAAO,EAC/F,MACF,CACA,IAAMT,EAAWtG,EAAQ,KAAOA,EAAQ,cAClC2/E,EAAuBhM,EAAU,UACnC8L,GAAmBE,IAAyB,MAAQr5E,EAAWq5E,KACjE,EAAkB,GAClB,KAAK,IAAI,uBAAuBvE,EAAQ,oBAAoBuE,EAAqB,KAAKr5E,GAAU,EAChG,EAAU,SAAWA,EACrB,KAAK,eAAe,EAExB,EACA8yE,EAAO,GAAG/9D,EAAO,eAAgB,EAAO,CACtC,aACIqkE,EAAyB1/E,CAAO,CAAC,EACvCo5E,EAAO,GAAG/9D,EAAO,mBAAoB,EAAO,CAC1C,aACIqkE,EAAyB1/E,CAAO,CAAC,EACvCo5E,EAAO,GAAG/9D,EAAO,oBAAuB,KAAK,uBAAuB,CAAC,EACrE,IAAMukE,GAAkB,EAAO,IAAS,CACtC,IAAMC,EAAe,KAAK,eAAezE,CAAO,EAChD,GAAIyE,GAAgB70F,EAAK,OAAQ,CAC/B60F,EAAa,IAAIxkE,EAAO,cAAeukE,CAAc,EACrD,EAAa,OAAS50F,EAAK,OAC3B,IAAMg7B,EAAQ,KAAK,aACf,KAAK,iBAAmB65D,EAAa,WAAa75D,GAAS,CAAC65D,EAAa,OAC3E,KAAK,kBAAkBA,EAAc75D,CAAK,CAE9C,CACF,EACAozD,EAAO,GAAG/9D,EAAO,cAAeukE,CAAc,EAc9CxG,EAAO,GAAG/9D,EAAO,oBAbW,CAE1B,IAAMwkE,EAAe,KAAK,eAAezE,CAAO,EAEhD,GADA,KAAK,IAAI,4BAA4ByE,GAAc,EAC/C,CAACA,GAAgB,CAAC,KAAK,SACzB,OAEF,IAAMrH,EAAgB,KAAK,SAAS,eAAe/oD,EAAa,UAAU,EACpEvG,EAAgC,KAAK,SAAS,QAAgDsvD,GAChG,KAAK,eAAetvD,CAAI,GAC1B,KAAK,sBAAsBA,EAAMyqD,CAAS,CAE9C,CAC+C,EAC/C,IAAMmM,EAAuB,OACd,CAEX,GAAI,CADiB,KAAK,eAAe1E,CACzB,GAAK,CAAC,KAAK,SACzB,OAEF,KAAK,WAAa,GAClB,IAAM5C,EAAgB,KAAK,SAAS,eAAe/oD,EAAa,UAAU,EAC1E,KAAK,uBAAuBA,EAAc+oD,EAAelF,CAAU,CACrE,EAyCF,OAvCA8F,EAAO,KAAK/9D,EAAO,YAAaykE,EAAoBpwD,CAAc,CAAC,EACnE0pD,EAAO,KAAK/9D,EAAO,sBAAuBykE,EAAoB,GAAQ,CAAC,EACvE1G,EAAO,GAAG/9D,EAAO,OAAQ,EAAO,IAAS,CACvC,GAAI,CAAC,KAAK,SACR,OAEF,IAAMwkE,EAAe,KAAK,eAAezE,CAAO,EAChD,GAAIpwF,EAAK,UAAYgc,EAAa,qBAAsB,CACtD,GAAI64E,GAAgB,MAAQA,EAAa,cAAe,CACtD,KAAK,mBAAmBpwD,CAAY,EACpC,MACF,CACA,KAAK,aAAa,EAClB,KAAK,YAAY,EAAI,CAEvB,MACA,KAAK,qBAAqBzkC,EAAMykC,EAAc,KAAK,SAAS,eAAeA,EAAa,UAAU,EAAGC,EAAgB,sBAAsB1kC,EAAK,MAAM,GAAGykC,GAAc,CACzK,CAAC,EACD2pD,EAAO,GAAG/9D,EAAO,eAAkB,CAEjC,GAAI,CADiB,KAAK,eAAe+/D,CACzB,GAAK,CAAC,KAAK,SACzB,OAEF,IAAMr0E,EAAQ,gBAAI,MAAM,uCAAuCq0E,GAAS,EAClEnxE,EAAY,CAChB,MAAO,GACP,KAAMC,EAAW,YACjB,QAASlD,EAAa,8BACtB,OACF,EACA,KAAK,qBAAqBiD,EAAWwlB,EAAc,KAAK,SAAS,eAAeA,EAAa,UAAU,EAAGC,EAAgB3oB,EAAM,OAAO,CACzI,CAAC,EACD,KAAK,IAAI,qCAAqCopB,GAAmBwjD,CAAS,GAAG,EAC7E,KAAK,IAAI,QAAQt4D,EAAO,kCAAmC,CACzD,MAAOs4D,EACP,iBACA,MAAOlkD,EACP,QACF,CAAC,EACM2pD,CACT,CACA,kBAAkB,EAAc,EAAW,CACzC,KAAK,kBAAkB3pD,EAAc4rD,CAAS,EAC9C5rD,EAAa,MAAM,CACrB,CACA,kBAAkB,EAAc,EAAW,CACzCA,EAAa,UAAU,QAAS,GAAU,CACxC,KAAK,iBAAiBW,EAAM,WAAYirD,CAAS,CACnD,CAAC,CACH,CACA,iBAAiB,EAAS,CACxB,IAAM6D,EAAc,KAAK,yBAAyB9D,CAAO,EACzD,GAAI8D,IAAgB,GAAI,CACtB,KAAK,IAAI,uBAAuB9D,EAAQ,cAAc,EACtD,IAAMhC,EAAS,KAAK,YAAY8F,GAChC,KAAK,wBAAwB9F,EAAQ,IAAI,EACzCA,EAAO,aAAa,CACtB,CACF,CACA,iBAAiB,EAAS,EAAW,CACnC,IAAM8F,EAAc,KAAK,yBAAyB9D,CAAO,EACzD,GAAI8D,IAAgB,GAAI,CACtB,IAAM9F,EAAS,KAAK,YAAY8F,GAChC,KAAK,IAAI,SAAS9F,EAAO,cAAciC,GAAYhrD,GAAgBgrD,CAAS,GAAe,EAC3F,KAAK,wBAAwBjC,EAAQiC,CAAS,EAC9C,KAAK,YAAY,OAAO6D,EAAa,CAAC,EACtC9F,EAAO,QAAQ,CACjB,CACF,CACA,kBAAmB,CACjB,IAAIA,EACJ,KAAO,EAAS,KAAK,YAAY,IAAI,GACnCA,EAAO,QAAQ,EAEjB,KAAK,YAAc,CAAC,CACtB,CACA,iBAAiB,EAAQ,EAAgB,EAAe,EAAe,EAAO,CAC5E,GAAM,CACJ,eACA,YACA,WACEA,EACE6D,EAAkBxtD,EAAa,UAAU,OACzCipD,EAAe,KAAK,aAC1B,KAAK,WAAa,KAClB,KAAK,aAAe/E,GAChB,CAAC+E,GAAgBA,EAAa,aAAe0C,KAC3C1C,IACF,KAAK,iBAAiBA,EAAa,WAAYG,EAAcL,EAAc,EAC3E,OAAOE,EAAa,OAEtB,KAAK,IAAI,8BAA8BhpD,EAAiB,EAAE,GAAGutD,EAAgB,GAAG9sD,GAAmBwjD,CAAS,GAAG,EAC/G,KAAK,IAAI,QAAQt4D,EAAO,2BAA4B,CAClD,MAAOs4D,EACP,iBACA,MAAOlkD,EACP,SAAUopD,EAAc,MAAM,CAAC,EAC/B,gBACA,QACF,CAAC,GAEH,KAAK,kBAAkBO,EAAQpzD,CAAK,CACtC,CACA,kBAAkB,EAAQ,EAAO,CAE/B,GAAI,CAAC,KAAK,SACR,OAEF,GAAM,CACJ,eACA,aACEozD,EACEZ,EAAgB,KAAK,SAAS,eAAe/oD,EAAa,UAAU,EACpEvG,EAAgC,KAAK,SAAS,QAAgDsvD,GACpG,GAAI,CAACtvD,EACH,OAEFkwD,EAAO,WAAW,EAClB,KAAK,iBAAiBlwD,CAAI,EAC1B,KAAK,eAAiByqD,EACtB,IAAM6G,EAAkB,KAAK,mBAAmB,EAChD,GAAIA,IAAoBpB,EACtB,OAEF,IAAM2G,EAAoBtwD,EAAa,cACvC,GAAIswD,GAAsBvF,GAAmD,aAAa,gBAAmB,GAC3G,OAEF,IAAMwF,EAAgBxF,GAAmD,QAAmC,KAAK,cAAqD,QAAW,KAAK,eACtL,GAAIuF,GAAqBpM,IAAc,KAAK,aAAc,CACxD,GAAI,CAACyF,EAAO,OAAQ,CAClB,KAAK,IAAI,2CAA2CA,GAAQ,EAC5D,MACF,CACA,GAAI4G,GAAgB,CAACv4F,EAAwBu4F,EAAc5G,EAAO,MAAM,EAAG,CACzE,IAAMryE,EAAQ,gBAAI,MAAM,SAASopB,GAAmBwjD,CAAS,EAAE,yBAAyB,OAAO,KAAKyF,EAAO,MAAM,EAAE,sDAAsD,OAAO,KAAK4G,CAAY,EAAE,GAAG,EAChM/1E,EAAY,CAChB,MAAO,GACP,KAAMC,EAAW,YACjB,QAASlD,EAAa,8BACtB,OACF,EACM0oB,EAAiBD,EAAa,eAAekkD,CAAS,EAC5D,KAAK,qBAAqB1pE,EAAWwlB,EAAc+oD,EAAe9oD,EAAgB3oB,EAAM,OAAO,EAC/F,MACF,CACF,CACA,KAAK,gBAAgBqyE,EAAQpzD,CAAK,CACpC,CACA,mBAAmB,EAAc,CAC/B,IAAMmwD,EAAW,KAAK,SAChBnwD,EAAQ,KAAK,aACnB,GAAI,CAACmwD,GAAY,CAACnwD,EAChB,OAEF,IAAM4T,EAAc5T,EAAM,YACpBi6D,EAAkB9J,EAAS,eAAe1mD,EAAcmK,CAAW,EACnEsmD,EAAgBzwD,EAAa,UAAUwwD,GAC7C,GAAIC,EAAe,CACjB,IAAM9G,EAAS,KAAK,eAAe8G,EAAc,UAAU,EAC3D,GAAI9G,EAAQ,CACV,IAAM+G,EAAmB/G,EAAO,aAAex/C,EAAcsmD,EAAc,cACrEE,EAAkBhH,EAAO,SAAW+G,EAE1C,GADA,KAAK,KAAK,cAAcA,EAAiB,MAAMA,EAAmBC,EAAgB,MAAMhH,EAAO,GAAG3pD,EAAa,uBAAuBmK,EAAY,EAAE,EAChJumD,IAAqBC,EAAkBp6D,EAAM,aAAe,IAAOozD,EAAO,qBAAqBpzD,CAAK,IAAMozD,EAAO,IAAK,CACxH,IAAMZ,EAAgBrC,EAAS,eAAe1mD,EAAa,UAAU,EACrE,KAAK,uBAAuBA,EAAc+oD,EAAeyH,CAAe,CAC1E,CACF,CACF,CACF,CACA,eAAe,EAAM,CACnB,IAAMj6D,EAAQ,KAAK,aACfA,GAASA,EAAM,YAAc2I,IAC/B,EAAM,YAAcA,EAExB,CACA,qBAAqB,EAAM,EAAc,EAAe,EAAgB,EAAc,CACpF,GAAI3jC,EAAK,UAAYgc,EAAa,qBAChC,OAEF,IAAM2sE,EAAYlkD,EAAa,UAAUC,IAAmB,KAE5D,GADA,KAAK,KAAK,4BAA4BikD,GAAYxjD,GAAmBwjD,CAAS,EAAc,GAAG3oF,EAAK,OAAO,EACvG,CAAC,KAAK,SACR,OAEF,IAAMowF,EAAWzH,GAAuC,YAAe,GACjEuL,EAAc,KAAK,yBAAyB9D,CAAO,EACnDhC,EAAS,KAAK,YAAY8F,IAAgB,KAC1CvK,EAAQ,KAAK,SAAS,MACtB0L,EAAyBx6F,EAAS,CAAC,EAAGmF,EAAM,CAChD,MAAO,GACP,YAAakd,GAA2B,EAAI,EAC5C,MAAOyrE,EACP,iBACA,MAAOlkD,EACP,SAAUklD,EACV,gBACA,QACF,CAAC,EAED,GADA,KAAK,IAAI,QAAQt5D,EAAO,yBAA0BglE,CAAsB,EACpE,CAACr1F,EAAK,MACR,OAEF,IAAM0tF,EAAe,KAAK,aACpB4H,EAAiB,KAAK,eACtBv5E,EAAY,MAAMw5E,CAAY,EAKpC,GAJI5M,IACF,KAAK,iBAAiByH,EAAS,IAAI,EACnC,EAAU,MAAQr0E,GAEhB,CAAC0oB,EAAa,UAAU,KAAM,GAAU,CAACW,EAAM,KAAK,EACtD,EAAa,MAAQrpB,OAErB,IAAK,IAAI1gB,EAAIqpC,EAAgBrpC,EAAIopC,EAAa,UAAU,OAAQ,IAC9D,KAAK,iBAAiBA,EAAa,UAAUppC,EAAE,CAAC,UAAU,EAG9D,KAAK,eAAe,EAAI,EACpBopC,EAAa,MACf,KAAK,gBAAgBA,CAAY,EACxBipD,GAAgBA,EAAa,aAAe0C,EACrD,KAAK,uBAAuB3rD,EAAc+oD,EAAe9oD,CAAc,EAC9D4wD,GAAkBA,EAAe,aAAelF,GAAW,KAAK,eAAe,KAAK,aAAa,GAC1G,KAAK,sBAAsB,KAAK,cAAekF,CAAc,CAEjE,CACA,gBAAgB,EAAc,CAC5B,IAAMxC,EAAaruD,EAAa,cAC1B4oD,EAAc,KAAK,qBACrBvD,EAAc,KAAK,YACvB,GAAIuD,EAAa,CACf,KAAK,IAAI,mCAAmC5oD,EAAa,WAAW,WAAWquD,EAAW,QAAQhJ,EAAY,YAAYzkD,GAAgBgoD,CAAW,EAAE,UAAU5oD,EAAa,OAAO,EACjLqlD,IAAgB,KAClB,EAAc,KAAK,IAAI,eAEzB,IAAM0L,EAAiB,KAAK,WAAWnI,EAAavD,CAAW,EAC3D,KAAK,WAAWuD,EAAamI,CAAc,GAC7C,KAAK,kBAAkB/wD,EAAc,IAAI,EAEvCA,EAAa,gBACf,KAAK,cAAcquD,EAAY,IAAI,EACnC,KAAK,iBAAiBA,CAAU,EAEpC,MAAO,GAAIhJ,IAAgB,GAAI,CAC7B,KAAK,WAAW,EAChB,MACF,CACA,GAAI,CAAC,KAAK,SACR,OAEF,IAAM0D,EAAgB,KAAK,SAAS,oBAAoB1D,CAAW,EACnE,KAAK,oBAAoB0D,CAAa,CACxC,CACA,kBAAkB,EAAO,EAAM,CAC7B,IAAIiI,EACJ,IAAMhxD,EAAezkC,EAAK,MACpB01F,EAAiBjxD,EAAa,WAC9ByoD,EAASltF,EAAK,kBAAkB,OACtC,GAAI,GAAG,EAAkB,KAAK,WAAa,MAAQy1F,EAAgB,SAASC,CAAc,GACxF,OAEF,IAAM9J,EAAannD,EAAa,cAC1BkxD,EAAmBlxD,EAAa,SAClCmoD,EAAc,EAClBM,EAAO,SAAS,EAAO,IAAmB,CACxC,IAAM5xE,EAAW,WAAW8pB,EAAM,QAAQ,EAC1C,KAAK,YAAYX,EAAcC,EAAgBkoD,EAAahB,EAAagB,EAAatxE,EAAU8pB,EAAM,GAAG,EACzG,GAAe9pB,CACjB,CAAC,EACD,EAAa,SAAWsxE,EACxB,KAAK,IAAI,oCAAoCA,EAAY,SAAS+I,EAAiB,IAAIlxD,GAAc,EACrG,IACMmxD,EADc,KAAK,aAC0C,MAAM,aAAgBF,EACzF,KAAK,eAAe,EACpB,IAAMG,EAAyC,KAAK,eAAuD,MAC3G,GAAID,EAAgB,CAElB,IAAMpI,EAAgB,KAAK,SAAS,eAAekI,CAAc,EAC3Dx3D,EAAgC,KAAK,SAAS,QAAgDsvD,GACpG,GAAItvD,EAAM,CACR,GAAI,CAAC,KAAK,aAAe,KAAK,YAAcA,EAAK,KACjC,KAAK,SAAS,oBAAoB,KAAK,WAC7C,IAAMsvD,EAAe,CAC3B,EAAa,MAAQ,gBAAI,MAAM,gBAAgBN,EAAO,OAAS,kCAAoC,sBAAsB,GAAG,KAAK,YAAY,GAAGzoD,GAAc,EAC9J,KAAK,IAAIA,EAAa,MAAM,OAAO,EACnC,KAAK,eAAe,EAAI,EACxB,KAAK,gBAAgBA,CAAY,EACjC,MACF,CAEF,KAAK,iBAAiBvG,CAAI,CAC5B,CACA,KAAK,oBAAoBsvD,CAAa,CACxC,MAAO,GAAKqI,GAAiD,aAAgBH,EAAgB,CAC3F,IAAM/M,EAAYlkD,EAAa,UAAU,GACzC,GAAIkkD,EAAW,CACb,IAAMyF,EAAS,KAAK,eAAezF,EAAU,UAAU,EACvD,GAAIkN,EAAe,cAAe,CAChC,IAAM76D,EAAQ,KAAK,aACfozD,GAAUpzD,GACZ,KAAK,kBAAkBozD,EAAQpzD,CAAK,CAExC,MAAWozD,GACTA,EAAO,WAAW,CAEtB,CACF,CACF,CACA,QAAQ,EAAO,EAAM,CACnB,GAAK,KAAK,SAGV,OAAQpuF,EAAK,QAAb,CACE,KAAKgc,EAAa,yBAClB,KAAKA,EAAa,sBAClB,KAAKA,EAAa,wBAAyB,CACzC,IAAMyoB,EAAezkC,EAAK,aACtBykC,IACF,KAAK,eAAe,EAAI,EACxB,KAAK,gBAAgBA,CAAY,GAEnC,KACF,CACA,KAAKzoB,EAAa,qBAAsB,CACtC,IAAM85E,EAAe,KAAK,WAAa,KAAK,aAAe,KAAK,YAChE,GAAI,KAAK,eAAeA,CAAY,GAAKA,EAAa,MAAM,cAAe,CACzE,KAAK,mBAAmBA,EAAa,KAAK,EAC1C,MACF,CACA,KAAK,IAAI,yBAAyB,KAAK,YAAY,gBAAgB,KAAK,aAAa,EACrF,KAAK,aAAa,EAClB,KAAK,YAAY,EAAI,EACrB,KACF,CACF,CACF,CACF,EACM,GAAkB,IAClB,GAAN,cAAuC/iD,EAAqB,CAC1D,YAAY,EAAK,EAAiB,EAAW,CAC3C,MAAM54B,EAAK60B,EAAiBiqB,EAAW,6BAA8BhqB,EAAkB,QAAQ,EAC/F,KAAK,eAAiB,GACtB,KAAK,eAAiB,CAAC,EACvB,KAAK,YAAc,KACnB,KAAK,kBAAkB,CACzB,CACA,qBAAsB,CACpB,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,EAC1B,KAAK,YAAc,IACrB,CACA,mBAAoB,CAClB,MAAM,kBAAkB,EACxB,GAAM,CACJ,OACE,KACJ90B,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EACzElW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EACzElW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CAC5D,CACA,qBAAsB,CACpB,MAAM,oBAAoB,EAC1B,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EAC1ElW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EAC1ElW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CAC7D,CACA,UAAU,EAAe,EAAyB,CAChD,KAAK,SAAS,EACd,KAAK,MAAQye,EAAM,KACnB,KAAK,YAAYwI,EAAe,EAChC,KAAK,iBAAmB,KAAK,gBAAkB4hB,EAAgB,KAAK,eACpE,KAAK,cAAgBsc,EAA0B,GAAKtc,EACpD,KAAK,KAAK,CACZ,CACA,mBAAoB,CAClB,MAAM,kBAAkB,EACxB,KAAK,YAAc,IACrB,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,eAAiB,CAAC,EACvB,MAAM,iBAAiBlrC,EAAOhuB,CAAI,CACpC,CACA,cAAc,EAAO,EAAM,CACzB,KAAK,YAAcA,EAAK,OAC1B,CACA,wBAAwB,EAAO,EAAM,CACnC,GAAM,CACJ,OACA,WACEA,EAOJ,GANK,KAAK,mBAAmBR,CAAI,IAC3BD,EAAgBC,CAAI,IACtB,KAAK,aAAeA,GAEtB,KAAK,MAAQsvC,EAAM,MAEjB,CAAC62C,EACH,OAEF,IAAMv5B,EAAW,KAAK,eAAe,KAAK,gBAC1C,GAAI,CAACA,EACH,OAEF,IAAIE,EACEswB,EAAYp9E,EAAK,MACvB,IAAK,IAAInE,EAAI,EAAGA,EAAI+wD,EAAS,OAAQ,IACnC,GAAIwwB,GAAaxwB,EAAS/wD,EAAE,CAAC,OAASuhF,GAAaxwB,EAAS/wD,EAAE,CAAC,IAAK,CAClE,EAAY+wD,EAAS/wD,GACrB,KACF,CAEF,IAAM06F,EAAUv2F,EAAK,MAAQA,EAAK,SAC9B8sD,EACF,EAAU,IAAMypC,GAEhB,EAAY,CACV,MAAOnZ,EACP,IAAKmZ,CACP,EACA3pC,EAAS,KAAKE,CAAS,GAEzB,KAAK,gBAAgB,aAAa9sD,CAAI,EACtC,KAAK,qBAAqBA,EAAM,IAAI,EAChC,KAAK,OACP,KAAK,KAAK,CAEd,CACA,iBAAiB,EAAO,EAAM,CAC5B,GAAM,CACJ,cACA,aACEQ,EACJ,GAAI65D,IAAgB,GAAKC,IAAc,IAA0B,CAC/D,IAAMk8B,EAAqBl8B,EAAY,EACvC,GAAIk8B,GAAsB,EACxB,OAEF,EAAK,mBAAqB,KAAK,IAAI,EAAGA,CAAkB,EACxD,KAAK,eAAe,QAAS,GAAa,CACxC,IAAK,IAAI36F,EAAI,EAAGA,EAAI+wD,EAAS,QAC3B,GAAIA,EAAS/wD,EAAE,CAAC,KAAO26F,EACrB5pC,EAAS,MAAM,MAEV,IAAIA,EAAS/wD,EAAE,CAAC,MAAQ26F,EAC7B,EAAS36F,EAAE,CAAC,MAAQ26F,OAEpB,MAEF,GAFE,CAIN,CAAC,EACD,KAAK,gBAAgB,uBAAuBn8B,EAAam8B,EAAoB/mD,EAAkB,QAAQ,CACzG,CACF,CACA,QAAQ,EAAO,EAAM,CACnB,IAAMzvC,EAAOQ,EAAK,KACbR,GAA6B,OAAUyvC,EAAkB,WACxDjvC,EAAK,UAAYgc,EAAa,UAChC,KAAK,gBAAgB,aAAaxc,EAAM,EAAI,EAE1C,KAAK,aACP,KAAK,YAAY,cAAc,EAE7B,KAAK,QAAUsvC,EAAM,UACvB,KAAK,MAAQA,EAAM,MAGzB,CACA,wBAAwB,EAAO,CAC7B,kBACC,CACG,KAAK,QAAU9U,GAAyB,KAAK,OAAQ0tD,CAAc,EACrE,KAAK,OAASA,EAAe,IAAK,GAAkB,IAAI12C,GAAM8kC,CAAa,CAAC,GAG9E,KAAK,eAAiB,CAAC,EACvB,KAAK,OAAS4R,EAAe,IAAK,GAAkB,CAClD,IAAMziF,EAAQ,IAAI+rC,GAAM8kC,CAAa,EAErC,MADA,MAAK,eAAe7wE,EAAM,IAAM,CAAC,EAC1BA,CACT,CAAC,EACD,KAAK,gBAAgB,uBAAuB,EAAG,IAA0BgqC,EAAkB,QAAQ,EACnG,KAAK,aAAe,KACpB,KAAK,YAAc,KACrB,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAIgnD,EAEJ,GADA,KAAK,eAAiBj2F,EAAK,GACvB,GAAG,EAAe,KAAK,SAAW,MAAQi2F,EAAa,SAAW,KAAK,iBAAmB,GAAI,CAChG,KAAK,cAAc,EACnB,MACF,CACA,IAAM1d,EAAe,KAAK,OAAO,KAAK,gBACtC,AAGE,KAAK,YAHHA,GAAgB,MAAQA,EAAa,QACpB,KAAK,sBAEL,KAEjBA,GAAgB,KAAK,QAAUzpC,EAAM,SACvC,KAAK,YAAYwI,EAAe,CAEpC,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAIm/B,EACJ,GAAM,CACJ,iBACA,UACE,KACE,CACJ,QAASjuD,EACT,GAAInmB,GACFrC,EACJ,GAAI,CAAC8X,EAAQ,CACX,KAAK,KAAK,kDAAkDzV,GAAS,EACrE,MACF,CACA,IAAMS,EAAQgV,EAAOzV,GACrB,GAAIA,GAAWyV,EAAO,QAAU,CAAChV,EAC/B,OAEF,KAAK,IAAI,kBAAkBT,EAAQ,WAAWmmB,EAAW,QAAQ,GAAGA,EAAW,MAAM,GAAGA,EAAW,WAAa,SAASA,EAAW,WAAW,GAAGA,EAAW,cAAc,GAAK,GAAG,YAAYA,EAAW,eAAe,EACzN,KAAK,YAAc,KAAK,sBACxB,IAAIyC,EAAU,EACd,GAAIzC,EAAW,OAAS,EAAiB1lB,EAAM,UAAY,MAAQ2zE,EAAe,KAAM,CACtF,GAAIjuD,EAAW,kBACb,OAEF,IAAM0tD,EAAc,KAAK,YACzB,GAAI,CAACA,EAAa,CAChB,KAAK,mBAAqB,GAC1B,MACF,CACA,IAAMggB,EAA2BhgB,EAAY,UAAU,GAClDpzE,EAAM,SAUT,EAAU,KAAK,eAAe0lB,EAAY1lB,EAAM,QAAkC,KAAK,iBAA0D,OAAO,EACpJmoB,IAAY,GAAKirE,IACnB,EAAUA,EAAyB,MACnC/qE,GAAW3C,EAAYyC,CAAO,IAZ5BzC,EAAW,oBAAsB0tD,EAAY,oBAC/C3pD,GAAwB/D,EAAY0tD,CAAW,EAC/C,EAAU1tD,EAAW,eACZ0tE,IACT,EAAUA,EAAyB,MACnC/qE,GAAW3C,EAAYyC,CAAO,GAU9BirD,GAAe,CAAC,KAAK,oBACvB,KAAK,iBAAiBA,EAAajrD,CAAO,CAE9C,CACA,EAAM,QAAUzC,EAChB,KAAK,gBAAkB1lB,EACnBT,IAAY8zF,IAGhB,KAAK,IAAI,QAAQ9lE,EAAO,uBAAwB,CAC9C,QAAS7H,EACT,GAAInmB,EACJ,QAASrC,EAAK,OAChB,CAAC,EACD,KAAK,KAAK,EACNwoB,EAAW,MAAQ,CAAC,KAAK,aAAe,KAAK,OAAS,KAAK,QAAUsmB,EAAM,OAC3Dp0B,GAAkB,KAAM8N,EAAW,UAAW,KAAK,MAAM,YAAa,CAC3E,IACX,KAAK,KAAK,6CAA6C,EACvD,EAAM,QAAU,IAAK,KAG3B,CACA,4BAA4B,EAAgB,CAC1C,GAAM,CACJ,OACA,WACEuyC,EACElhC,EAAcr6B,EAAK,YACnB2a,EAAM,KAAK,IACjB,GAAI,MAAK,mBAAmB3a,CAAI,GAG5BmO,GAAWA,EAAQ,WAAa,GAAKksB,GAAe,MAAQA,EAAY,KAAOA,EAAY,IAAMhZ,GAAwBgZ,EAAY,MAAM,EAAG,CAChJ,IAAMJ,EAAY,YAAY,IAAI,EAClC,KAAK,UAAU,QAAQ,IAAI,WAAW9rB,CAAO,EAAGksB,EAAY,IAAI,OAAQA,EAAY,GAAG,OAAQ/Y,GAAgC+Y,EAAY,MAAM,CAAC,CAAC,CAAC,MAAO,GAAQ,CASjK,MARA1f,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,MAAO,GACP,MAAOknB,EACP,OAAQA,EAAI,QACZ,MACF,CAAC,EACKA,CACR,CAAC,CAAC,CAAC,KAAM,GAAkB,CACzB,IAAMre,EAAU,YAAY,IAAI,EAChC1K,EAAI,QAAQkW,EAAO,eAAgB,CACjC,OACA,QAAS2pC,EACT,MAAO,CACL,OAAQvgC,EACR,SAAU5U,CACZ,CACF,CAAC,CACH,CAAC,CAAC,CAAC,MAAO,GAAQ,CAChB,KAAK,KAAK,GAAGqe,EAAI,KAAK,IAAIA,EAAI,SAAS,EACvC,KAAK,MAAQ4L,EAAM,IACrB,CAAC,CACH,CACF,CACA,QAAS,CACP,GAAI,CAAC,KAAK,MACR,KAAK,MAAQA,EAAM,UAGrB,GAAI,KAAK,QAAUA,EAAM,KAAM,CAC7B,GAAM,CACJ,iBACA,UACE,KACEhsC,EAAQgV,IAAiCq+E,GAI/C,GAHI,CAACrzF,GAAS,CAACgV,EAAO,QAAU,CAAChV,EAAM,SAGnC,KAAK,YAAYA,CAAK,EACxB,OAEF,GAAM,CACJ,UACE,KACE8rC,EAAc,KAAK,gBAAgB,EAEnC,CACJ,IAAK6qB,EACL,IAAK3F,GAHc9hB,EAAa,aAAa,KAAK,eAAe,KAAK,iBAAmB,CAAC,EAAGpD,EAAap6B,EAAO,aAIpG,EACTkhE,EAAe5yE,EAAM,QAE3B,GAAIgxD,EADc,KAAK,IAAI,gBAAkB4hB,EAAa,oBAExD,OAEF,IAAMp7D,EAAYo7D,EAAa,UACzBtZ,EAAU9hD,EAAU,OACpB5Z,EAAMg1E,EAAa,KACrB0gB,EAAY,KACVx7E,EAAe,KAAK,aAC1B,GAAI6+C,EAAmB/4D,EAAK,CAC1B,IAAMk4D,EAAYpkD,EAAO,uBACnBipD,EAAkBhE,EAAmB/4D,EAAMk4D,EAAY,EAAIA,EACjE,EAAYl+C,GAAkBE,EAAcN,EAAW,KAAK,IAAIA,EAAU,EAAE,CAAC,MAAOm/C,CAAgB,EAAGgE,CAAe,EAClH,CAAC24B,GAAax7E,GAAgBA,EAAa,MAAQN,EAAU,EAAE,CAAC,QAClE,EAAYA,EAAU,GAE1B,KACE,GAAYA,EAAU8hD,EAAU,GAGlC,GADA,EAAY,KAAK,sBAAsBg6B,EAAWtzF,EAAM,OAAO,EAC3D,CAACszF,EACH,OAGF,IAAMvvE,EAAWvM,EADA87E,EAAU,GAAK1gB,EAAa,QACP,GAItC,GAHI7uD,GAAYA,EAAS,KAAOuvE,EAAU,IAAM,KAAK,gBAAgB,SAASvvE,CAAQ,IAAMuqB,EAAc,aACxG,EAAYvqB,GAEV,KAAK,gBAAgB,SAASuvE,CAAS,IAAMhlD,EAAc,WAAY,CACzE,IAAMilD,EAAa,KAAK,0BAA0BD,CAAS,EACvDC,GACF,KAAK,aAAaA,EAAYvzF,EAAO22D,CAAgB,CAEzD,CACF,CACF,CACA,aAAa,EAAM,EAAO,EAAkB,CACrCl6D,EAAgBC,CAAI,EAGvB,MAAM,aAAaA,EAAMyF,EAAOw0D,CAAgB,EAFhD,KAAK,iBAAiBj6D,EAAMyF,CAAK,CAIrC,CACA,IAAI,uBAAwB,CAC1B,OAAO,IAAIuyC,GAAmB,KAAK,eAAe,KAAK,iBAAmB,CAAC,CAAC,CAC9E,CACF,EACM,GAAN,KAAyB,CACvB,YAAY,EAAY,CACtB,KAAK,SAAW,IAAK,GACrB,IAAM8+C,GAAY,EAAM,EAAO,IAAW,CAExC,GADA,KAAkB,EACdj1F,EAAQsL,EAAS,EACnB,MAAM,IAAI,aAAa,sBAAsB3P,EAAK,yCAAyCqE,EAAM,uCAAuCsL,EAAO,EAAE,EAEnJ,OAAO4pF,EAAWl1F,EAAM,CAACrE,EAC3B,EACA,KAAK,SAAW,CACd,IAAI,QAAS,CACX,OAAOu5F,EAAW,MACpB,EACA,IAAI,EAAO,CACT,OAAOD,EAAS,MAAOj1F,EAAOk1F,EAAW,MAAM,CACjD,EACA,MAAM,EAAO,CACX,OAAOD,EAAS,QAASj1F,EAAOk1F,EAAW,MAAM,CACnD,CACF,CACF,CACF,EACM,GAA0B,CAC9B,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,GACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACP,EACM,GAAkB,GAAS,OAAO,aAAa9+C,GAAwB3yC,IAASA,CAAI,EACpF,GAAU,GACV,GAAU,IACV,GAAa,CACjB,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACN,EACM,GAAc,CAClB,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACN,EACM,GAAa,CACjB,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACN,EACM,GAAc,CAClB,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACN,EACM,GAAmB,CAAC,QAAS,QAAS,OAAQ,OAAQ,MAAO,SAAU,UAAW,QAAS,aAAa,EACxG,GAAN,KAAqB,CACnB,aAAc,CACZ,KAAK,KAAO,KACZ,KAAK,aAAe,CACtB,CACA,IAAI,EAAU,EAAK,CACjB,GAAI,KAAK,cAAgB0xF,EAAU,CACjC,IAAMzmF,EAAI,OAAOwiD,GAAQ,WAAaA,EAAI,EAAIA,EAC9CzwD,EAAO,IAAI,GAAG,KAAK,KAAK,IAAI00F,EAAS,IAAIzmF,GAAG,CAC9C,CACF,CACF,EACM,GAAqB,SAA6B,EAAU,CAChE,IAAM0mF,EAAW,CAAC,EAClB,IAAK,IAAItuF,EAAI,EAAGA,EAAIuuF,EAAS,OAAQ,IACnCD,EAAS,KAAKC,EAASvuF,EAAE,CAAC,SAAS,EAAE,CAAC,EAExC,OAAOsuF,CACT,EACM,GAAN,KAAe,CACb,aAAc,CACZ,KAAK,WAAa,QAClB,KAAK,UAAY,GACjB,KAAK,QAAU,GACf,KAAK,WAAa,QAClB,KAAK,MAAQ,EACf,CACA,OAAQ,CACN,KAAK,WAAa,QAClB,KAAK,UAAY,GACjB,KAAK,QAAU,GACf,KAAK,WAAa,QAClB,KAAK,MAAQ,EACf,CACA,UAAU,EAAQ,CAChB,IAAME,EAAU,CAAC,aAAc,YAAa,UAAW,aAAc,OAAO,EAC5E,IAAK,IAAIt7F,EAAI,EAAGA,EAAIs7F,EAAQ,OAAQ,IAAK,CACvC,IAAMnsD,EAAQmsD,EAAQt7F,GAClBovC,EAAO,eAAeD,CAAK,IAC7B,KAAKA,GAASC,EAAOD,GAEzB,CACF,CACA,WAAY,CACV,OAAO,KAAK,aAAe,SAAW,CAAC,KAAK,WAAa,CAAC,KAAK,SAAW,KAAK,aAAe,SAAW,CAAC,KAAK,KACjH,CACA,OAAO,EAAO,CACZ,OAAO,KAAK,aAAeosD,EAAM,YAAc,KAAK,YAAcA,EAAM,WAAa,KAAK,UAAYA,EAAM,SAAW,KAAK,aAAeA,EAAM,YAAc,KAAK,QAAUA,EAAM,KACtL,CACA,KAAK,EAAa,CAChB,KAAK,WAAaC,EAAY,WAC9B,KAAK,UAAYA,EAAY,UAC7B,KAAK,QAAUA,EAAY,QAC3B,KAAK,WAAaA,EAAY,WAC9B,KAAK,MAAQA,EAAY,KAC3B,CACA,UAAW,CACT,MAAO,SAAW,KAAK,WAAa,eAAiB,KAAK,UAAY,aAAe,KAAK,QAAU,gBAAkB,KAAK,WAAa,WAAa,KAAK,KAC5J,CACF,EACM,GAAN,KAAwB,CACtB,aAAc,CACZ,KAAK,MAAQ,IACb,KAAK,SAAW,IAAIz+C,EACtB,CACA,OAAQ,CACN,KAAK,MAAQ,IACb,KAAK,SAAS,MAAM,CACtB,CACA,QAAQ,EAAO,EAAa,CAC1B,KAAK,MAAQ0+C,EACb,KAAK,SAAS,KAAKD,CAAW,CAChC,CACA,YAAY,EAAa,CACvB,KAAK,SAAS,KAAKA,CAAW,CAChC,CACA,OAAO,EAAO,CACZ,OAAO,KAAK,QAAUD,EAAM,OAAS,KAAK,SAAS,OAAOA,EAAM,QAAQ,CAC1E,CACA,KAAK,EAAS,CACZ,KAAK,MAAQG,EAAQ,MACrB,KAAK,SAAS,KAAKA,EAAQ,QAAQ,CACrC,CACA,SAAU,CACR,OAAO,KAAK,QAAU,KAAO,KAAK,SAAS,UAAU,CACvD,CACF,EACM,GAAN,KAAU,CACR,YAAY,EAAS,CACnB,KAAK,MAAQ,CAAC,EACd,KAAK,IAAM,EACX,KAAK,aAAe,IAAI3+C,GACxB,KAAK,aAAe,KACpB,KAAK,OAAS,IAAK,GACnB,IAAK,IAAI/8C,EAAI,EAAGA,EAAIu8C,GAAS,IAC3B,KAAK,MAAM,KAAK,IAAIS,EAAmB,EAEzC,KAAK,OAAS3wC,CAChB,CACA,OAAO,EAAO,CACZ,IAAK,IAAIrM,EAAI,EAAGA,EAAIu8C,GAAS,IAC3B,GAAI,CAAC,KAAK,MAAMv8C,EAAE,CAAC,OAAOu7F,EAAM,MAAMv7F,EAAE,EACtC,MAAO,GAGX,MAAO,EACT,CACA,KAAK,EAAO,CACV,IAAK,IAAIA,EAAI,EAAGA,EAAIu8C,GAAS,IAC3B,KAAK,MAAMv8C,EAAE,CAAC,KAAKu7F,EAAM,MAAMv7F,EAAE,CAErC,CACA,SAAU,CACR,IAAI27F,EAAQ,GACZ,IAAK,IAAI37F,EAAI,EAAGA,EAAIu8C,GAAS,IAC3B,GAAI,CAAC,KAAK,MAAMv8C,EAAE,CAAC,QAAQ,EAAG,CAC5B,EAAQ,GACR,KACF,CAEF,OAAO27F,CACT,CACA,UAAU,EAAQ,CACZ,KAAK,MAAQC,IACf,KAAK,IAAMA,GAET,KAAK,IAAM,GACb,KAAK,OAAO,IAAI,EAAG,4BAA8B,KAAK,GAAG,EACzD,KAAK,IAAM,GACF,KAAK,IAAMr/C,KACpB,KAAK,OAAO,IAAI,EAAG,6BAA+B,KAAK,GAAG,EAC1D,KAAK,IAAMA,GAEf,CACA,WAAW,EAAQ,CACjB,IAAMs/C,EAAS,KAAK,IAAMC,EAC1B,GAAIA,EAAS,EACX,IAAK,IAAI97F,EAAI,KAAK,IAAM,EAAGA,EAAI67F,EAAS,EAAG,IACzC,KAAK,MAAM77F,EAAE,CAAC,YAAY,KAAK,YAAY,EAG/C,KAAK,UAAU67F,CAAM,CACvB,CACA,WAAY,CACV,KAAK,WAAW,EAAE,EAClB,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAK,KAAK,YAAY,CACrD,CACA,WAAW,EAAM,CACXpyF,GAAQ,KACV,KAAK,UAAU,EAEjB,IAAMsyF,EAAO1/C,GAAe5yC,CAAI,EAC5B,KAAK,KAAO8yC,GACd,KAAK,OAAO,IAAI,MAAS,iBAAmB9yC,EAAK,SAAS,EAAE,EAAI,KAAOsyF,EAAO,iBAAmB,KAAK,IAAM,gBAAgB,GAG9H,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQA,EAAM,KAAK,YAAY,EACpD,KAAK,WAAW,CAAC,EACnB,CACA,aAAa,EAAU,CACrB,IAAI/7F,EACJ,IAAK,EAAIg8F,EAAUh8F,EAAIu8C,GAAS,IAC9B,KAAK,MAAMv8C,EAAE,CAAC,MAAM,CAExB,CACA,OAAQ,CACN,KAAK,aAAa,CAAC,EACnB,KAAK,IAAM,EACX,KAAK,aAAa,MAAM,CAC1B,CACA,iBAAkB,CAChB,KAAK,aAAa,KAAK,GAAG,CAC5B,CACA,eAAgB,CACd,IAAMi8F,EAAQ,CAAC,EACXN,EAAQ,GACZ,IAAK,IAAI37F,EAAI,EAAGA,EAAIu8C,GAAS,IAAK,CAChC,IAAMw/C,EAAO,KAAK,MAAM/7F,EAAE,CAAC,MACvB+7F,IAAS,MACX,EAAQ,IAEVE,EAAM,KAAKF,CAAI,CACjB,CAIE,OAHEJ,EACK,GAEAM,EAAM,KAAK,EAAE,CAExB,CACA,aAAa,EAAQ,CACnB,KAAK,aAAa,UAAU7sD,CAAM,EAElC,KADsB,MAAM,KAAK,IACzB,CAAC,YAAY,KAAK,YAAY,CACxC,CACF,EACM,GAAN,KAAoB,CAClB,YAAY,EAAS,CACnB,KAAK,KAAO,CAAC,EACb,KAAK,QAAU,GACf,KAAK,aAAe,KACpB,KAAK,iBAAmB,KACxB,KAAK,OAAS,IAAK,GACnB,IAAK,IAAIpvC,EAAI,EAAGA,EAAIs8C,GAAS,IAC3B,KAAK,KAAK,KAAK,IAAIW,GAAI5wC,CAAO,CAAC,EAEjC,KAAK,OAASA,CAChB,CACA,OAAQ,CACN,IAAK,IAAIrM,EAAI,EAAGA,EAAIs8C,GAAS,IAC3B,KAAK,KAAKt8C,EAAE,CAAC,MAAM,EAErB,KAAK,QAAU,EACjB,CACA,OAAO,EAAO,CACZ,IAAIk8F,EAAQ,GACZ,IAAK,IAAIl8F,EAAI,EAAGA,EAAIs8C,GAAS,IAC3B,GAAI,CAAC,KAAK,KAAKt8C,EAAE,CAAC,OAAOu7F,EAAM,KAAKv7F,EAAE,EAAG,CACvC,EAAQ,GACR,KACF,CAEF,OAAOk8F,CACT,CACA,KAAK,EAAO,CACV,IAAK,IAAIl8F,EAAI,EAAGA,EAAIs8C,GAAS,IAC3B,KAAK,KAAKt8C,EAAE,CAAC,KAAKu7F,EAAM,KAAKv7F,EAAE,CAEnC,CACA,SAAU,CACR,IAAI27F,EAAQ,GACZ,IAAK,IAAI37F,EAAI,EAAGA,EAAIs8C,GAAS,IAC3B,GAAI,CAAC,KAAK,KAAKt8C,EAAE,CAAC,QAAQ,EAAG,CAC3B,EAAQ,GACR,KACF,CAEF,OAAO27F,CACT,CACA,WAAY,CAEV,KADiB,KAAK,KAAK,QACxB,CAAC,UAAU,CAChB,CACA,iBAAkB,CAEhB,KADiB,KAAK,KAAK,QACxB,CAAC,gBAAgB,CACtB,CACA,WAAW,EAAM,CAEf,KADiB,KAAK,KAAK,QACxB,CAAC,WAAWI,CAAI,CACrB,CACA,OAAO,EAAQ,CAEb,KADiB,KAAK,KAAK,QACxB,CAAC,aAAa3sD,CAAM,CACzB,CACA,WAAW,EAAQ,CAEjB,KADiB,KAAK,KAAK,QACxB,CAAC,WAAW0sD,CAAM,CACvB,CACA,UAAU,EAAQ,CAChB,KAAK,OAAO,IAAI,EAAG,cAAgBF,CAAM,EAEzC,KADiB,KAAK,KAAK,QACxB,CAAC,UAAUA,CAAM,CACtB,CACA,OAAO,EAAS,CACd,KAAK,OAAO,IAAI,MAAS,aAAe3/E,EAAUkgF,CAAO,CAAC,EAC1D,IAAIC,EAASD,EAAQ,IAAM,EAI3B,GAHI,KAAK,cAAgBC,EAAS,KAAK,aAAe,IACpD,EAAS,KAAK,aAAe,GAE3B,KAAK,cAAgB,KAAK,UAAYA,EAAQ,CAChD,IAAK,IAAIp8F,EAAI,EAAGA,EAAIs8C,GAAS,IAC3B,KAAK,KAAKt8C,EAAE,CAAC,MAAM,EAErB,IAAMq8F,EAAc,KAAK,QAAU,EAAI,KAAK,aACtCC,EAAmB,KAAK,iBAC9B,GAAIA,EAAkB,CACpB,IAAMC,EAAeD,EAAiB,KAAKD,EAAY,CAAC,aAClD/zD,EAAO,KAAK,OAAO,KACzB,GAAIi0D,IAAiB,MAAQj0D,IAAS,MAAQi0D,EAAej0D,EAC3D,IAAK,IAAItoC,EAAI,EAAGA,EAAI,KAAK,aAAc,IACrC,KAAK,KAAKo8F,EAAS,KAAK,aAAep8F,EAAI,EAAE,CAAC,KAAKs8F,EAAiB,KAAKD,EAAcr8F,EAAE,CAG/F,CACF,CACA,KAAK,QAAUo8F,EACf,IAAMI,EAAM,KAAK,KAAK,KAAK,SAC3B,GAAIL,EAAQ,SAAW,KAAM,CAC3B,IAAMM,EAASN,EAAQ,OACjBO,EAAU,KAAK,IAAID,EAAS,EAAG,CAAC,EACtCD,EAAI,UAAUL,EAAQ,MAAM,EAC5B,EAAQ,MAAQK,EAAI,MAAME,EAAQ,CAAC,SAAS,UAC9C,CACA,IAAMttD,EAAS,CACb,WAAY+sD,EAAQ,MACpB,UAAWA,EAAQ,UACnB,QAASA,EAAQ,QACjB,WAAY,QACZ,MAAO,EACT,EACA,KAAK,OAAO/sD,CAAM,CACpB,CACA,WAAW,EAAS,CAClB,KAAK,OAAO,IAAI,MAAS,aAAenzB,EAAU0gF,CAAO,CAAC,EAC1D,KAAK,UAAU,EACf,KAAK,OAAOA,CAAO,EACnB,KAAK,WAAW,EAAE,CACpB,CACA,cAAc,EAAQ,CACpB,KAAK,aAAeC,CACtB,CACA,QAAS,CACP,GAAI,KAAK,eAAiB,KAAM,CAC9B,KAAK,OAAO,IAAI,EAAG,sCAAsC,EACzD,MACF,CACA,KAAK,OAAO,IAAI,MAAS,KAAK,eAAe,CAAC,EAC9C,IAAMP,EAAc,KAAK,QAAU,EAAI,KAAK,aACtCQ,EAAS,KAAK,KAAK,OAAOR,EAAa,CAAC,CAAC,CAAC,GAChDQ,EAAO,MAAM,EACb,KAAK,KAAK,OAAO,KAAK,QAAS,EAAGA,CAAM,EACxC,KAAK,OAAO,IAAI,EAAG,YAAY,CACjC,CACA,eAAe,EAAU,CACvB,IAAuB,GACvB,IAAMC,EAAc,CAAC,EACjB5kE,EAAO,GACP6kE,EAAQ,GACZ,IAAK,IAAI/8F,EAAI,EAAGA,EAAIs8C,GAAS,IAAK,CAChC,IAAM0gD,EAAU,KAAK,KAAKh9F,EAAE,CAAC,cAAc,EACvCg9F,IACF,EAAQh9F,EAAI,EACRi9F,EACFH,EAAY,KAAK,OAASC,EAAQ,MAAQC,EAAU,GAAG,EAEvDF,EAAY,KAAKE,EAAQ,KAAK,CAAC,EAGrC,CAQA,OAPIF,EAAY,OAAS,IACvB,AAGE5kE,EAHE+kE,EACK,IAAMH,EAAY,KAAK,KAAK,EAAI,IAEhCA,EAAY,KAAK;CAAI,GAGzB5kE,CACT,CACA,kBAAmB,CACjB,OAAO,KAAK,IACd,CACF,EACM,GAAN,KAAoB,CAClB,YAAY,EAAe,EAAc,EAAS,CAChD,KAAK,KAAO,IAAK,GACjB,KAAK,aAAe,IAAK,GACzB,KAAK,KAAO,IAAK,GACjB,KAAK,QAAU,IAAK,GACpB,KAAK,gBAAkB,IAAK,GAC5B,KAAK,mBAAqB,IAAK,GAC/B,KAAK,iBAAmB,IAAK,GAC7B,KAAK,cAAgB,IAAK,GAC1B,KAAK,YAAc,IAAK,GACxB,KAAK,aAAe,IAAK,GACzB,KAAK,OAAS,IAAK,GACnB,KAAK,KAAOglE,EACZ,KAAK,aAAeC,EACpB,KAAK,KAAO,KACZ,KAAK,QAAU,EACf,KAAK,gBAAkB,IAAIjgD,GAAc7wC,CAAO,EAChD,KAAK,mBAAqB,IAAI6wC,GAAc7wC,CAAO,EACnD,KAAK,iBAAmB,IAAI6wC,GAAc7wC,CAAO,EACjD,KAAK,cAAgB,KAAK,gBAAgB,KAAK,IAC/C,KAAK,YAAc,KAAK,gBACxB,KAAK,KAAO,KACZ,KAAK,aAAe,KACpB,KAAK,OAASA,CAChB,CACA,OAAQ,CACN,KAAK,KAAO,KACZ,KAAK,gBAAgB,MAAM,EAC3B,KAAK,mBAAmB,MAAM,EAC9B,KAAK,iBAAiB,MAAM,EAC5B,KAAK,aAAa,MAAM,EACxB,KAAK,cAAgB,KAAK,gBAAgB,KAAK,IAC/C,KAAK,YAAc,KAAK,gBACxB,KAAK,KAAO,KACZ,KAAK,aAAe,IACtB,CACA,YAAa,CACX,OAAO,KAAK,YACd,CACA,WAAW,EAAY,CACrB,KAAK,aAAe+wF,CACtB,CACA,OAAO,EAAS,CACd,KAAK,YAAY,OAAOjB,CAAO,CACjC,CACA,WAAW,EAAS,CAClB,KAAK,YAAY,WAAWQ,CAAO,CACrC,CACA,QAAQ,EAAS,CACXU,IAAY,KAAK,OAGrB,KAAK,KAAOA,EACZ,KAAK,OAAO,IAAI,MAAS,QAAUA,CAAO,EACtC,KAAK,OAAS,cAChB,KAAK,YAAc,KAAK,oBAExB,KAAK,YAAc,KAAK,gBACxB,KAAK,YAAY,MAAM,GAErB,KAAK,OAAS,iBAChB,KAAK,gBAAgB,aAAe,KACpC,KAAK,mBAAmB,aAAe,MAEzC,KAAK,KAAOA,EACd,CACA,YAAY,EAAO,CACjB,IAAK,IAAIr9F,EAAI,EAAGA,EAAIi8F,EAAM,OAAQ,IAChC,KAAK,YAAY,WAAWA,EAAMj8F,EAAE,EAEtC,IAAMs9F,EAAS,KAAK,cAAgB,KAAK,gBAAkB,OAAS,WACpE,KAAK,OAAO,IAAI,MAASA,EAAS,KAAO,KAAK,YAAY,eAAe,EAAI,CAAC,GAC1E,KAAK,OAAS,iBAAmB,KAAK,OAAS,kBACjD,KAAK,OAAO,IAAI,MAAS,cAAgB,KAAK,gBAAgB,eAAe,EAAI,CAAC,EAClF,KAAK,iBAAiB,EAE1B,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,8BAA8B,EACjD,KAAK,QAAQ,aAAa,CAC5B,CACA,MAAO,CACL,KAAK,OAAO,IAAI,EAAG,gBAAgB,EAC/B,KAAK,OAAS,cAGlB,KAAK,YAAY,UAAU,EACvB,KAAK,cAAgB,KAAK,iBAC5B,KAAK,iBAAiB,EAE1B,CACA,OAAQ,CACR,CACA,OAAQ,CACR,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,2BAA2B,EAC9C,KAAK,YAAY,gBAAgB,EACjC,KAAK,iBAAiB,CACxB,CACA,KAAK,EAAQ,CACX,KAAK,OAAO,IAAI,EAAG,MAAQV,EAAS,aAAa,EACjD,KAAK,YAAc,KAAK,gBACxB,KAAK,QAAQ,cAAc,EAC3B,KAAK,YAAY,cAAcA,CAAM,CACvC,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,gBAAgB,EACnC,KAAK,YAAY,OAAO,CACtB,MAAO,EACT,CAAC,CACH,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,gCAAgC,EACnD,KAAK,QAAQ,eAAe,CAC9B,CACA,MAAO,CACL,KAAK,OAAO,IAAI,EAAG,IAAI,EACvB,KAAK,QAAQ,WAAW,CAC1B,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,KAAK,EACxB,KAAK,QAAQ,WAAW,CAC1B,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,8BAA8B,EACjD,KAAK,gBAAgB,MAAM,EAC3B,KAAK,iBAAiB,EAAI,CAC5B,CACA,MAAO,CACL,KAAK,OAAO,IAAI,EAAG,sBAAsB,EACzC,KAAK,YAAY,OAAO,EACxB,KAAK,iBAAiB,EAAI,CAC5B,CACA,OAAQ,CACN,KAAK,OAAO,IAAI,EAAG,kCAAkC,EACrD,KAAK,mBAAmB,MAAM,CAChC,CACA,OAAQ,CAEN,GADA,KAAK,OAAO,IAAI,EAAG,sBAAsB,EACrC,KAAK,OAAS,cAAe,CAC/B,IAAMW,EAAM,KAAK,gBACjB,KAAK,gBAAkB,KAAK,mBAC5B,KAAK,mBAAqBA,EAC1B,KAAK,YAAc,KAAK,mBACxB,KAAK,OAAO,IAAI,MAAS,SAAW,KAAK,gBAAgB,eAAe,CAAC,CAC3E,CACA,KAAK,iBAAiB,EAAI,CAC5B,CACA,KAAK,EAAQ,CACX,KAAK,OAAO,IAAI,EAAG,MAAQC,EAAS,gBAAgB,EACpD,KAAK,YAAY,WAAWA,CAAM,CACpC,CACA,SAAS,EAAY,CACnB,IAAMpuD,EAAS,CACb,MAAO,EACT,EACA,EAAO,UAAYquD,EAAa,GAAM,EACtC,EAAO,QAAUA,GAAc,GAC/B,AAGEruD,EAAO,WAHJA,EAAO,QAKU,QAFA,CADJ,QAAS,QAAS,OAAQ,OAAQ,MAAO,SAAU,SAC1C,CAAC,CAFP,KAAK,MAAMquD,EAAa,CAAC,EAAI,IAMlD,KAAK,OAAO,IAAI,EAAG,WAAaxhF,EAAUmzB,CAAM,CAAC,EACjD,KAAK,YAAY,OAAOA,CAAM,CAChC,CACA,iBAAiB,EAAW,GAAO,CACjC,IAAM9G,EAAO,KAAK,OAAO,KACrBA,IAAS,MAGT,KAAK,eACH,KAAK,eAAiB,MAAQ,CAAC,KAAK,gBAAgB,QAAQ,EAC9D,KAAK,aAAeA,EAEf,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,IACpD,KAAK,aAAa,OAAO,KAAK,aAAcA,EAAM,KAAK,gBAAgB,EACnEo1D,GAAY,KAAK,aAAa,aAChC,KAAK,aAAa,YAAY,EAEhC,KAAK,aAAe,KAAK,gBAAgB,QAAQ,EAAI,KAAOp1D,GAGhE,KAAK,iBAAiB,KAAK,KAAK,eAAe,EAEnD,CACA,eAAe,EAAG,CACZ,KAAK,eACF,KAAK,gBAAgB,QAAQ,IAC5B,KAAK,aAAa,QACpB,KAAK,aAAa,OAAO,KAAK,aAAc/oC,EAAG,KAAK,eAAe,EAErE,KAAK,aAAeA,GAG1B,CACF,EACM,GAAN,KAAmB,CACjB,YAAY,EAAO,EAAM,EAAM,CAC7B,KAAK,SAAW,IAAK,GACrB,KAAK,eAAiB,EACtB,KAAK,WAAairC,GAAiB,EACnC,KAAK,OAAS,IAAK,GACnB,IAAMn+B,EAAU,KAAK,OAAS,IAAIwwC,GAClC,KAAK,SAAW,CAAC,KAAM,IAAIM,GAAcha,EAAOw6D,EAAMtxF,CAAO,EAAG,IAAI8wC,GAAcha,EAAQ,EAAGy6D,EAAMvxF,CAAO,CAAC,CAC7G,CACA,WAAW,EAAS,CAClB,OAAO,KAAK,SAASwxF,EAAQ,CAAC,WAAW,CAC3C,CACA,WAAW,EAAS,EAAY,CAC9B,KAAK,SAASA,EAAQ,CAAC,WAAWT,CAAU,CAC9C,CACA,QAAQ,EAAM,EAAU,CACtB,KAAK,OAAO,KAAO90D,EACnB,IAAK,IAAItoC,EAAI,EAAGA,EAAI89F,EAAS,OAAQ,GAAK,EAAG,CAC3C,IAAMx4E,EAAIw4E,EAAS99F,GAAK,IAClBmL,EAAI2yF,EAAS99F,EAAI,GAAK,IACxB+9F,EAAW,GACXC,EAAa,KACjB,GAAI14E,IAAM,GAAKna,IAAM,EACnB,SAEA,KAAK,OAAO,IAAI,MAAS,IAAM2xC,GAAmB,CAACghD,EAAS99F,GAAI89F,EAAS99F,EAAI,EAAE,CAAC,EAAI,SAAW88C,GAAmB,CAACx3B,EAAGna,CAAC,CAAC,EAAI,GAAG,EAEjI,IAAMo/B,EAAa,KAAK,WAExB,GADsBjlB,GAAK,IAAMA,GAAK,GACnB,CACjB,GAAIglB,GAAehlB,EAAGna,EAAGo/B,CAAU,EAAG,CACpCF,GAAW,KAAM,KAAME,CAAU,EACjC,KAAK,OAAO,IAAI,MAAS,qBAAuBuS,GAAmB,CAACx3B,EAAGna,CAAC,CAAC,EAAI,cAAc,EAC3F,QACF,CACAk/B,GAAW/kB,EAAGna,EAAG,KAAK,UAAU,EAChC,EAAW,KAAK,SAASma,EAAGna,CAAC,EAC7B,AACE4yF,IAAW,KAAK,YAAYz4E,EAAGna,CAAC,EAElC,AACE4yF,IAAW,KAAK,SAASz4E,EAAGna,CAAC,EAE/B,AACE4yF,IAAW,KAAK,0BAA0Bz4E,EAAGna,CAAC,CAElD,MACEk/B,GAAW,KAAM,KAAME,CAAU,EAEnC,GAAI,CAACwzD,IACH,EAAa,KAAK,WAAWz4E,EAAGna,CAAC,EAC7B6yF,GAAY,CACd,IAAMC,EAAW,KAAK,eAClBA,GAAYA,EAAW,EAEzB,KADqB,SAASA,EACvB,CAAC,YAAYD,CAAU,EAE9B,KAAK,OAAO,IAAI,EAAG,kCAAkC,CAEzD,CAEE,CAACD,GAAY,CAACC,GAChB,KAAK,OAAO,IAAI,MAAS,+BAAiClhD,GAAmB,CAACx3B,EAAGna,CAAC,CAAC,EAAI,UAAY2xC,GAAmB,CAACghD,EAAS99F,GAAI89F,EAAS99F,EAAI,EAAE,CAAC,CAAC,CAEzJ,CACF,CACA,SAAS,EAAG,EAAG,CAGb,GAAI,GAFWslB,IAAM,IAAMA,IAAM,IAAMA,IAAM,IAAMA,IAAM,KAAOna,GAAK,IAAMA,GAAK,KACjEma,IAAM,IAAMA,IAAM,KAAOna,GAAK,IAAMA,GAAK,IAEtD,MAAO,GAET,IAAM+yF,EAAO54E,IAAM,IAAMA,IAAM,IAAMA,IAAM,GAAK,EAAI,EAC9Cu4E,EAAU,KAAK,SAASK,GAuC9B,OAtCI54E,IAAM,IAAMA,IAAM,IAAMA,IAAM,IAAMA,IAAM,GACxCna,IAAM,GACR0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,KAAK,EACJ1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,KAAK,CAAC,EACL1yF,IAAM,GACf0yF,EAAQ,KAAK,CAAC,EACL1yF,IAAM,GACf0yF,EAAQ,KAAK,CAAC,EACL1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,KAAK,EACJ1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,GACf0yF,EAAQ,KAAK,EACJ1yF,IAAM,GACf0yF,EAAQ,MAAM,EACL1yF,IAAM,IACf0yF,EAAQ,MAAM,EAGhBA,EAAQ,KAAK1yF,EAAI,EAAE,EAErB,KAAK,eAAiB+yF,EACf,EACT,CACA,YAAY,EAAG,EAAG,CAChB,IAAIA,EAAO,EACX,IAAK54E,IAAM,IAAMA,IAAM,KAAOna,GAAK,IAAMA,GAAK,GAAI,CAMhD,GALA,AAGE+yF,EAHE54E,IAAM,GACD,EAEA,EAEL44E,IAAS,KAAK,eAEhB,OADA,KAAK,OAAO,IAAI,EAAG,oCAAoC,EAChD,GAET,IAAML,EAAU,KAAK,SAASK,GAM9B,OALKL,GAGLA,EAAQ,SAAS1yF,CAAC,EAClB,KAAK,OAAO,IAAI,MAAS,WAAa2xC,GAAmB,CAACx3B,EAAGna,CAAC,CAAC,EAAI,GAAG,EAC/D,IAJE,EAKX,CACA,MAAO,EACT,CACA,SAAS,EAAG,EAAG,CACb,IAAIqxF,EAGJ,GAAI,GAFWl3E,GAAK,IAAMA,GAAK,IAAMA,GAAK,IAAMA,GAAK,KAAOna,GAAK,IAAMA,GAAK,MAC7Dma,IAAM,IAAMA,IAAM,KAAOna,GAAK,IAAMA,GAAK,IAEtD,MAAO,GAET,IAAM+yF,EAAO54E,GAAK,GAAK,EAAI,EAC3B,AAGEk3E,EAHErxF,GAAK,IAAMA,GAAK,GACZ+yF,IAAS,EAAI1hD,GAAWl3B,GAAKo3B,GAAWp3B,GAExC44E,IAAS,EAAIzhD,GAAYn3B,GAAKq3B,GAAYr3B,GAElD,IAAMu4E,EAAU,KAAK,SAASK,GAM9B,OALKL,GAGLA,EAAQ,OAAO,KAAK,aAAarB,EAAKrxF,CAAC,CAAC,EACxC,KAAK,eAAiB+yF,EACf,IAJE,EAKX,CACA,aAAa,EAAK,EAAM,CACtB,IAAIC,EACEhC,EAAU,CACd,MAAO,KACP,QAAS,GACT,OAAQ,KACR,UAAW,GACX,KACF,EAeA,MAdA,CAGEgC,EAHE10F,EAAO,GACEA,EAAO,GAEPA,EAAO,GAEpB,EAAQ,WAAa00F,EAAW,IAAO,EACnCA,GAAY,GACd,EAAQ,MAAQ,CAAC,QAAS,QAAS,OAAQ,OAAQ,MAAO,SAAU,UAAW,OAAO,CAAC,CAAC,KAAK,MAAMA,EAAW,CAAC,GACtGA,GAAY,IACrB,EAAQ,QAAU,GAClB,EAAQ,MAAQ,SAEhB,EAAQ,OAAS,KAAK,OAAOA,EAAW,IAAM,CAAC,EAAI,EAE9ChC,CACT,CACA,WAAW,EAAG,EAAG,CACf,IAAIiC,EACAC,EAAY,KACZC,EAAY,KAQhB,GAPIh5E,GAAK,IACP,EAAY,EACZ,EAAYA,EAAI,IAEhB,EAAY,EACZ,EAAYA,GAEVg5E,GAAa,IAAMA,GAAa,GAAI,CACtC,IAAIC,EACJ,AAKEA,EALED,IAAc,GACNnzF,EAAI,GACLmzF,IAAc,GACbnzF,EAAI,IAEJA,EAAI,IAEhB,KAAK,OAAO,IAAI,MAAS,iBAAmBkxC,GAAekiD,CAAO,EAAI,gBAAkBH,CAAS,EACjG,EAAY,CAACG,CAAO,CACtB,MAAWj5E,GAAK,IAAMA,GAAK,MACzB,EAAYna,IAAM,EAAI,CAACma,CAAC,EAAI,CAACA,EAAGna,CAAC,GAKnC,OAHIkzF,GACF,KAAK,OAAO,IAAI,MAAS,iBAAmBvhD,GAAmBuhD,CAAS,CAAC,CAAC,KAAK,GAAG,CAAC,EAE9EA,CACT,CACA,0BAA0B,EAAG,EAAG,CAG9B,GAAI,GAFW/4E,IAAM,IAAMA,IAAM,KAAOna,GAAK,IAAMA,GAAK,KACzCma,IAAM,IAAMA,IAAM,KAAOna,GAAK,IAAMA,GAAK,IAEtD,MAAO,GAET,IAAInF,EACE22F,EAAU,CAAC,EACbr3E,IAAM,IAAMA,IAAM,IACpB,EAAQ,KAAK,OAAOna,EAAI,IAAM,CAAC,EAC/B,EAAQ,WAAayxC,GAAiB52C,GAClCmF,EAAI,GAAM,IACZ,EAAQ,YAAkC,UAEnCA,IAAM,GACf,EAAQ,WAAa,eAErB,EAAQ,WAAa,QACjBA,IAAM,KACR,EAAQ,UAAY,KAGxB,IAAM+yF,EAAO54E,GAAK,GAAK,EAAI,EAG3B,OADA,KADqB,SAAS44E,EACvB,CAAC,WAAWvB,CAAO,EACnB,EACT,CACA,OAAQ,CACN,IAAK,IAAI38F,EAAI,EAAGA,EAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,OAAQ,IAAK,CAC1D,IAAM69F,EAAU,KAAK,SAAS79F,GAC1B69F,GACFA,EAAQ,MAAM,CAElB,CACAxzD,GAAW,KAAM,KAAM,KAAK,UAAU,CACxC,CACA,eAAe,EAAG,CAChB,IAAK,IAAIrqC,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQ,IAAK,CAC7C,IAAM69F,EAAU,KAAK,SAAS79F,GAC1B69F,GACFA,EAAQ,eAAet+F,CAAC,CAE5B,CACF,CACF,EAcI,GAAS,UAAW,CACtB,GAAI03C,IAAgB,MAAQA,GAAa,OACvC,OAAO,KAAK,OAEd,IAAMunD,EAAoB,CAAC,GAAI,KAAM,IAAI,EACnCC,EAAoB,CAAC,QAAS,SAAU,MAAO,OAAQ,OAAO,EACpE,SAASC,EAAe,EAAS,EAAO,CAItC,GAHI,OAAO5sF,GAAU,UAGjB,CAAC,MAAM,QAAQ6sF,CAAO,EACxB,MAAO,GAET,IAAMC,EAAU9sF,EAAM,YAAY,EAIlC,MAHI,CAAC6sF,EAAQ,QAAQC,CAAO,EACnBA,EAEF,EACT,CACA,SAASC,EAAqB,EAAO,CACnC,OAAOH,EAAeF,EAAmB1sF,CAAK,CAChD,CACA,SAASgtF,EAAiB,EAAO,CAC/B,OAAOJ,EAAeD,EAAmB3sF,CAAK,CAChD,CACA,SAASitF,EAAO,EAAK,GAAGC,EAAM,CAC5B,IAAIh/F,EAAI,EACR,KAAOA,EAAI,UAAU,OAAQ,IAAK,CAChC,IAAMi/F,EAAO,UAAUj/F,GACvB,IAAK,IAAM0+B,KAAKugE,EACd,EAAIvgE,GAAKugE,EAAKvgE,EAElB,CACA,OAAOpH,CACT,CACA,SAAS4nE,EAAQ,EAAW,EAAS,EAAM,CACzC,IAAMt3D,EAAM,KACNu3D,EAAU,CACd,WAAY,EACd,EACA,EAAI,aAAe,GACnB,IAAIC,EAAM,GACNC,EAAe,GACfC,EAAalhE,EACbmhE,EAAW/1E,EACXg2E,EAAQtnE,EACRunE,EAAU,KACVC,EAAY,GACZC,EAAe,GACfC,EAAQ,OACRC,EAAa,QACbC,EAAY,GACZC,EAAiB,SACjBC,EAAQ,GACRC,EAAS,SACb,OAAO,eAAer4D,EAAK,KAAMm3D,EAAO,CAAC,EAAGI,EAAS,CACnD,IAAK,UAAW,CACd,OAAOC,CACT,EACA,IAAK,SAAS,EAAO,CACnB,EAAM,GAAKttF,CACb,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,cAAem3D,EAAO,CAAC,EAAGI,EAAS,CAC5D,IAAK,UAAW,CACd,OAAOE,CACT,EACA,IAAK,SAAS,EAAO,CACnB,EAAe,CAAC,CAACvtF,CACnB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,YAAam3D,EAAO,CAAC,EAAGI,EAAS,CAC1D,IAAK,UAAW,CACd,OAAOG,CACT,EACA,IAAK,SAAS,EAAO,CACnB,GAAI,OAAOxtF,GAAU,SACnB,MAAU,UAAU,qCAAqC,EAE3D,EAAaA,EACb,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,UAAWm3D,EAAO,CAAC,EAAGI,EAAS,CACxD,IAAK,UAAW,CACd,OAAOI,CACT,EACA,IAAK,SAAS,EAAO,CACnB,GAAI,OAAOztF,GAAU,SACnB,MAAU,UAAU,mCAAmC,EAEzD,EAAWA,EACX,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,OAAQm3D,EAAO,CAAC,EAAGI,EAAS,CACrD,IAAK,UAAW,CACd,OAAOK,CACT,EACA,IAAK,SAAS,EAAO,CACnB,EAAQ,GAAK1tF,EACb,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,SAAUm3D,EAAO,CAAC,EAAGI,EAAS,CACvD,IAAK,UAAW,CACd,OAAOM,CACT,EACA,IAAK,SAAS,EAAO,CACnB,EAAU3tF,EACV,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,WAAYm3D,EAAO,CAAC,EAAGI,EAAS,CACzD,IAAK,UAAW,CACd,OAAOO,CACT,EACA,IAAK,SAAS,EAAO,CACnB,IAAM5sD,EAAU+rD,EAAqB/sF,CAAK,EAC1C,GAAIghC,IAAY,GACd,MAAU,YAAY,6CAA6C,EAErE,EAAYA,EACZ,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAelL,EAAK,cAAem3D,EAAO,CAAC,EAAGI,EAAS,CAC5D,IAAK,UAAW,CACd,OAAOQ,CACT,EACA,IAAK,SAAS,EAAO,CACnB,EAAe,CAAC,CAAC7tF,EACjB,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,OAAQm3D,EAAO,CAAC,EAAGI,EAAS,CACrD,IAAK,UAAW,CACd,OAAOS,CACT,EACA,IAAK,SAAS,EAAO,CACnB,GAAI,OAAO9tF,GAAU,UAAYA,IAAU,OACzC,MAAU,YAAY,oDAAoD,EAE5E,EAAQA,EACR,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,YAAam3D,EAAO,CAAC,EAAGI,EAAS,CAC1D,IAAK,UAAW,CACd,OAAOU,CACT,EACA,IAAK,SAAS,EAAO,CACnB,IAAM/sD,EAAUgsD,EAAiBhtF,CAAK,EACtC,GAAI,CAACghC,EACH,MAAU,YAAY,6CAA6C,EAErE,EAAaA,EACb,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAelL,EAAK,WAAYm3D,EAAO,CAAC,EAAGI,EAAS,CACzD,IAAK,UAAW,CACd,OAAOW,CACT,EACA,IAAK,SAAS,EAAO,CACnB,GAAIhuF,EAAQ,GAAKA,EAAQ,IACvB,MAAU,MAAM,qCAAqC,EAEvD,EAAYA,EACZ,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,gBAAiBm3D,EAAO,CAAC,EAAGI,EAAS,CAC9D,IAAK,UAAW,CACd,OAAOY,CACT,EACA,IAAK,SAAS,EAAO,CACnB,IAAMjtD,EAAUgsD,EAAiBhtF,CAAK,EACtC,GAAI,CAACghC,EACH,MAAU,YAAY,6CAA6C,EAErE,EAAiBA,EACjB,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAelL,EAAK,OAAQm3D,EAAO,CAAC,EAAGI,EAAS,CACrD,IAAK,UAAW,CACd,OAAOa,CACT,EACA,IAAK,SAAS,EAAO,CACnB,GAAIluF,EAAQ,GAAKA,EAAQ,IACvB,MAAU,MAAM,iCAAiC,EAEnD,EAAQA,EACR,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,OAAO,eAAe81B,EAAK,QAASm3D,EAAO,CAAC,EAAGI,EAAS,CACtD,IAAK,UAAW,CACd,OAAOc,CACT,EACA,IAAK,SAAS,EAAO,CACnB,IAAMntD,EAAUgsD,EAAiBhtF,CAAK,EACtC,GAAI,CAACghC,EACH,MAAU,YAAY,6CAA6C,EAErE,EAASA,EACT,KAAK,aAAe,EACtB,CACF,CAAC,CAAC,EACF,EAAI,aAAe,IAAK,EAC1B,CAKA,MAJA,GAAQ,UAAU,aAAe,UAAW,CAE1C,OADe,KAAK,OACN,oBAAoB,KAAM,KAAK,IAAI,CACnD,EACOosD,CACT,EAAE,EACI,GAAN,KAAoB,CAClB,OAAO,EAAM,EAAS,CACpB,GAAI,CAACv6F,EACH,MAAO,GAET,GAAI,OAAOA,GAAS,SAClB,MAAU,MAAM,+BAA+B,EAEjD,OAAO,mBAAmB,mBAAmBA,CAAI,CAAC,CACpD,CACF,EAcM,GAAN,KAAe,CACb,aAAc,CACZ,KAAK,OAAS,OAAO,OAAO,IAAI,CAClC,CACA,IAAI,EAAG,EAAG,CACJ,CAAC,KAAK,IAAIwmC,CAAC,GAAKC,IAAM,KACxB,KAAK,OAAOD,GAAKC,EAErB,CACA,IAAI,EAAG,EAAM,EAAY,CAIvB,OAHI80D,EACK,KAAK,IAAI/0D,CAAC,EAAI,KAAK,OAAOA,GAAKg1D,EAAKD,GAEtC,KAAK,IAAI/0D,CAAC,EAAI,KAAK,OAAOA,GAAKg1D,CACxC,CACA,IAAI,EAAG,CACL,OAAOh1D,KAAK,KAAK,MACnB,CACA,IAAI,EAAG,EAAG,EAAG,CACX,IAAK,IAAIzrC,EAAI,EAAGA,EAAI4lB,EAAE,OAAQ,EAAE5lB,EAC9B,GAAI0rC,IAAM9lB,EAAE5lB,GAAI,CACd,KAAK,IAAIyrC,EAAGC,CAAC,EACb,KACF,CAEJ,CACA,QAAQ,EAAG,EAAG,CACR,UAAU,KAAKA,CAAC,GAClB,KAAK,IAAID,EAAG,SAASC,EAAG,EAAE,CAAC,CAE/B,CACA,QAAQ,EAAG,EAAG,CACZ,GAAI,2BAA2B,KAAKA,CAAC,EAAG,CACtC,IAAMg1D,EAAU,WAAWh1D,CAAC,EAC5B,GAAIg1D,GAAW,GAAKA,GAAW,IAE7B,OADA,KAAK,IAAIj1D,EAAGi1D,CAAO,EACZ,EAEX,CACA,MAAO,EACT,CACF,EAgBM,GAAW,IAAInxD,GAAO,EAAG,EAAG,EAAE,EAC9B,GAAS/C,GAAS,QAAU,SAAW,SAAW,SAwFlD,GAAN,KAAgB,CACd,aAAc,CACZ,KAAK,MAAQ,UACb,KAAK,OAAS,GACd,KAAK,QAAU,IAAImR,GACnB,KAAK,WAAa,CAAC,EACnB,KAAK,IAAM,KACX,KAAK,MAAQ,IAAK,GAClB,KAAK,eAAiB,IAAK,GAC3B,KAAK,QAAU,IAAK,EACtB,CACA,MAAM,EAAM,CACV,IAAMgjD,EAAQ,KACV17F,IACF,EAAM,QAAU07F,EAAM,QAAQ,OAAO17F,EAAM,CACzC,OAAQ,EACV,CAAC,GAEH,SAAS27F,GAAkB,CACzB,IAAIx7F,EAASu7F,EAAM,OACf7/E,EAAM,EAEV,IADA,EAAS8rB,GAAcxnC,CAAM,EACtB0b,EAAM1b,EAAO,QAAUA,EAAO0b,KAAS,MAAQ1b,EAAO0b,KAAS;GACpE,EAAEA,EAEJ,IAAMyrB,EAAOnnC,EAAO,MAAM,EAAG0b,CAAG,EAQhC,OAPI1b,EAAO0b,KAAS,MAClB,EAAEA,EAEA1b,EAAO0b,KAAS;GAClB,EAAEA,EAEJ,EAAM,OAAS1b,EAAO,MAAM0b,CAAG,EACxByrB,CACT,CACA,SAASs0D,EAAa,EAAO,CAC3Bx1D,GAAaD,EAAO,SAAS,EAAG,EAAG,CACnC,EAAG,GAAG,CACR,CACA,GAAI,CACF,IAAImB,EAAO,GACX,GAAIo0D,EAAM,QAAU,UAAW,CAC7B,GAAI,CAAC,UAAU,KAAKA,EAAM,MAAM,EAC9B,OAAO,KAET,EAAOC,EAAgB,EACvB,IAAM5rF,EAAIu3B,EAAK,MAAM,0BAA0B,EAC/C,GAAI,EAAEv3B,GAAK,MAAQA,EAAE,IACnB,MAAU,MAAM,6BAA6B,EAE/C,EAAM,MAAQ,QAChB,CACA,IAAI8rF,EAAuB,GAC3B,KAAOH,EAAM,QAAQ,CACnB,GAAI,CAAC,UAAU,KAAKA,EAAM,MAAM,EAC9B,OAAO,KAOT,OALKG,EAGH,EAAuB,GAFvB,EAAOF,EAAgB,EAIjBD,EAAM,MAAd,CACE,IAAK,SACC,IAAI,KAAKp0D,CAAI,EACfs0D,EAAat0D,CAAI,EACPA,IACV,EAAM,MAAQ,MAEhB,SACF,IAAK,OACEA,IACH,EAAM,MAAQ,MAEhB,SACF,IAAK,KACH,GAAI,iBAAiB,KAAKA,CAAI,EAAG,CAC/B,EAAM,MAAQ,OACd,KACF,CACA,GAAI,CAACA,EACH,SAIF,GAFA,EAAM,IAAM,IAAIgD,GAAO,EAAG,EAAG,EAAE,EAC/B,EAAM,MAAQ,MACVhD,EAAK,QAAQ,KAAK,IAAM,GAAI,CAC9B,EAAM,IAAI,GAAKA,EACf,QACF,CACF,IAAK,MACH,GAAI,CAACo0D,EAAM,IAAK,CACd,EAAM,MAAQ,SACd,QACF,CACA,GAAI,CACF/0D,GAASW,EAAMo0D,EAAM,IAAKA,EAAM,UAAU,CAC5C,MAAY,CACV,EAAM,IAAM,KACZ,EAAM,MAAQ,SACd,QACF,CACA,EAAM,MAAQ,UACd,SACF,IAAK,UACH,CACE,IAAMI,EAAex0D,EAAK,QAAQ,KAAK,IAAM,GAC7C,GAAI,CAACA,GAAQw0D,IAAiB,EAAuB,IAAO,CACtDJ,EAAM,OAASA,EAAM,KACvBA,EAAM,MAAMA,EAAM,GAAG,EAEvB,EAAM,IAAM,KACZ,EAAM,MAAQ,KACd,QACF,CACA,GAAIA,EAAM,MAAQ,KAChB,SAEEA,EAAM,IAAI,OACZ,EAAM,IAAI,MAAQ;GAEpB,EAAM,IAAI,MAAQp0D,CACpB,CACA,SACF,IAAK,SACEA,IACH,EAAM,MAAQ,KAEpB,CACF,CACF,MAAY,CACNo0D,EAAM,QAAU,WAAaA,EAAM,KAAOA,EAAM,OAClDA,EAAM,MAAMA,EAAM,GAAG,EAEvB,EAAM,IAAM,KACZ,EAAM,MAAQA,EAAM,QAAU,UAAY,YAAc,QAC1D,CACA,OAAO,IACT,CACA,OAAQ,CACN,IAAMA,EAAQ,KACd,GAAI,CAKF,IAJIA,EAAM,KAAOA,EAAM,QAAU,YAC/B,EAAM,QAAU;;EAChBA,EAAM,MAAM,GAEVA,EAAM,QAAU,WAAaA,EAAM,QAAU,YAC/C,MAAU,MAAM,6BAA6B,CAEjD,OAAS5gG,EAAG,CACN4gG,EAAM,gBACRA,EAAM,eAAe5gG,CAAC,CAE1B,CAIA,OAHI4gG,EAAM,SACRA,EAAM,QAAQ,EAET,IACT,CACF,EACM,GAAa,mBACb,GAAa,SAAqB,EAAa,EAAc,EAAW,EAAG,CAC/E,OAAOK,EAAY,MAAMv0D,EAAUA,EAAWw0D,EAAa,MAAM,IAAMA,CACzE,EACM,GAAmB,SAA2B,EAAY,CAC9D,IAAIl1D,EAAK,SAASm1D,EAAW,MAAM,EAAE,CAAC,EAChCC,EAAO,SAASD,EAAW,MAAM,GAAI,EAAE,CAAC,EACxCE,EAAO,SAASF,EAAW,MAAM,GAAI,EAAE,CAAC,EACxCG,EAAQH,EAAW,OAAS,EAAI,SAASA,EAAW,UAAU,EAAGA,EAAW,QAAQ,GAAG,CAAC,CAAC,EAAI,EACnG,GAAI,CAACt0F,EAAem/B,CAAE,GAAK,CAACn/B,EAAeu0F,CAAI,GAAK,CAACv0F,EAAew0F,CAAI,GAAK,CAACx0F,EAAey0F,CAAK,EAChG,MAAM,MAAM,oCAAoCH,GAAY,EAK9D,MAHA,IAAM,IAAMC,EACZ,GAAM,IAAWC,EACjB,GAAM,KAAgBC,EACft1D,CACT,EAIM,GAAkB,SAA0B,EAAQ,EAAI,EAAkB,CAC9E,IAAI2B,EAASC,EAAOhtB,GAChB2gF,EAAS3zD,EAAOD,EAAO,QAC3B,GAAI,CAAC4zD,GAAU,CAACA,EAAO,KAAO5zD,EAAO,IACnC,EAAO,SAAW,EAAO,mBAAqBA,EAAO,MACrD,EAAO,IAAM,OAGf,OAAQ,EAAU4zD,IAAW,MAAQC,EAAQ,KAAK,CAChD,IAAIA,EACJ,EAAO,UAAY7zD,EAAO,MAAQ4zD,EAAO,MACzC,EAAO,IAAM,GACb,EAASA,EACT,EAAS3zD,EAAOD,EAAO,OACzB,CACA,EAAO,mBAAqBn7B,CAD5B,CAEF,EA6EM,GAAc,iBACd,GAAa,8CACb,GAAkB,kCAClB,GAAuB,CAC3B,KAAM,QACN,OAAQ,SACR,MAAO,MACP,MAAO,QACP,IAAK,KACP,EA2KM,GAAN,KAAmB,CACjB,YAAY,EAAoB,EAAW,CACzC,KAAK,mBAAqB,IAAK,GAC/B,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,IAAK,GACtB,KAAK,UAAY,KACjB,KAAK,QAAU,KACf,KAAK,OAAS,KACd,KAAK,mBAAqBivF,EAC1B,KAAK,UAAY/hB,CACnB,CACA,aAAc,CACR,KAAK,YAAc,OAGvB,KAAK,mBAAmB,QAAQ,KAAK,UAAW,KAAK,UAAW,KAAK,QAAS,KAAK,OAAQ,KAAK,SAAS,EACzG,KAAK,UAAY,KACnB,CACA,OAAO,EAAW,EAAS,EAAQ,EAC7B,KAAK,YAAc,MAAQ,KAAK,UAAY/gD,KAC9C,KAAK,UAAYA,GAEnB,KAAK,QAAU5U,EACf,KAAK,OAAS8zE,EACd,KAAK,mBAAmB,oBAAoB,KAAK,SAAS,CAC5D,CACA,OAAQ,CACN,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,IACnB,CACF,EACM,GAAN,KAAyB,CACvB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,MAAQ,KACb,KAAK,OAAS,IAAK,GACnB,KAAK,QAAU,GACf,KAAK,KAAO,IAAK,GACjB,KAAK,WAAa,CAAC,EACnB,KAAK,OAAS,CAAC,EACf,KAAK,QAAU,CAAC,EAChB,KAAK,iBAAmB,CAAC,EACzB,KAAK,eAAiB,CAAC,EACvB,KAAK,wBAA0B,CAAC,EAChC,KAAK,cAAgB,IAAK,GAC1B,KAAK,cAAgB,IAAK,GAC1B,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,cAAgB,GACrB,KAAK,OAAS,GACd,KAAK,OAASjsD,GAAU,EACxB,KAAK,mBAAqB,IAAK,GAC/B,KAAK,IAAMvyB,EACX,KAAK,OAASA,EAAI,OAClB,KAAK,KAAOA,EAAI,OAAO,WACvB,KAAK,mBAAqB,CACxB,WAAY,CACV,MAAO,KAAK,OAAO,wBACnB,aAAc,KAAK,OAAO,8BAC5B,EACA,WAAY,CACV,MAAO,KAAK,OAAO,wBACnB,aAAc,KAAK,OAAO,8BAC5B,EACA,WAAY,CACV,MAAO,KAAK,OAAO,wBACnB,aAAc,KAAK,OAAO,8BAC5B,EACA,WAAY,CACV,MAAO,KAAK,OAAO,wBACnB,aAAc,KAAK,OAAO,8BAC5B,CACF,EACAA,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EACzElW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,YAAa,KAAK,aAAc,IAAI,EAClDlW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,eAAgB,IAAI,EACvDlW,EAAI,GAAGkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EACzElW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,CAC5D,CACA,SAAU,CACR,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EAC1ElW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,YAAa,KAAK,aAAc,IAAI,EACnDlW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,eAAgB,IAAI,EACxDlW,EAAI,IAAIkW,EAAO,wBAAyB,KAAK,wBAAyB,IAAI,EAC1ElW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3D,KAAK,IAAM,KAAK,OAAS,KAAK,MAAQ,KACtC,KAAK,cAAgB,KAAK,cAAgB,IAAK,EACjD,CACA,mBAAoB,CAClB,IAAMmsE,EAAW,IAAI5jD,GAAa,KAAM,YAAY,EAC9C6jD,EAAW,IAAI7jD,GAAa,KAAM,YAAY,EAC9C8jD,EAAW,IAAI9jD,GAAa,KAAM,YAAY,EAC9C+jD,EAAW,IAAI/jD,GAAa,KAAM,YAAY,EACpD,KAAK,cAAgB,IAAIH,GAAa,EAAG+jD,EAAUC,CAAQ,EAC3D,KAAK,cAAgB,IAAIhkD,GAAa,EAAGikD,EAAUC,CAAQ,CAC7D,CACA,QAAQ,EAAW,EAAW,EAAS,EAAQ,EAAW,CACxD,IAAIC,EAAS,GACb,IAAK,IAAIvhG,EAAIwhG,EAAU,OAAQ,KAAO,CACpC,IAAMC,EAAWD,EAAUxhG,GACrB0hG,EAAU1wD,GAAaywD,EAAS,GAAIA,EAAS,GAAIrjE,EAAW5U,CAAO,EACzE,GAAIk4E,GAAW,IACb,EAAS,GAAK,KAAK,IAAID,EAAS,GAAIrjE,CAAS,EAC7C,EAAS,GAAK,KAAK,IAAIqjE,EAAS,GAAIj4E,CAAO,EAC3C,EAAS,GACLk4E,GAAWl4E,EAAU4U,GAAa,IACpC,MAGN,CAIA,GAHKmjE,GACHC,EAAU,KAAK,CAACpjE,EAAW5U,CAAO,CAAC,EAEjC,KAAK,OAAO,yBAA0B,CACxC,IAAM/hB,EAAQ,KAAK,eAAe03E,GAClC,KAAK,KAAK,OAAO13E,EAAO22B,EAAW5U,EAAS8zE,CAAM,CACpD,KAAO,CACL,IAAMn1D,EAAO,KAAK,KAAK,OAAO,KAAM/J,EAAW5U,EAAS8zE,CAAM,EAC9D,KAAK,IAAI,QAAQtoE,EAAO,YAAa,CACnC,KAAM,WACN,OACA,MAAOmqD,CACT,CAAC,CACH,CACF,CACA,eAAe,EAAO,CACpB,OACA,KACA,UACA,YACA,WACC,CACD,GAAM,CACJ,oBACE,KACA7+E,IAAOszC,EAAkB,OAC3B,KAAK,QAAQzvC,EAAK,IAAM,CACtB,SAAU05B,EACV,YACA,SACF,GAEE8jE,EAAiB,SACnB,KAAK,iBAAmB,CAAC,EACzBA,EAAiB,QAAS,GAAS,CAC7B,KAAK,QAAQh9F,EAAK,KAAK,IACzB,KAAK,aAAaqwB,EAAO,YAAarwB,CAAI,EAE1C,KAAK,IAAI,QAAQqwB,EAAO,wBAAyB,CAC/C,QAAS,GACT,KAAMrwB,EAAK,KACX,MAAO,gBAAI,MAAM,mDAAmD,CACtE,CAAC,CAEL,CAAC,EAEL,CACA,iBAAiB,EAAO,EAAU,CAChC,GAAM,CACJ,SACE,KACJ,GAAIg7B,EACF,IAAK,IAAI3/B,EAAI,EAAGA,EAAI2/B,EAAM,WAAW,OAAQ,IAAK,CAChD,IAAMN,EAAYM,EAAM,WAAW3/B,GACnC,GAAI6wC,GAAqBxR,EAAW,CAClC,KAAM+K,EACN,KAAMw3D,EACN,gBAAiB,qDACnB,CAAC,EACC,OAAOviE,CAEX,CAEF,OAAO,IACT,CACA,oBAAoB,EAAW,CACzB,KAAK,OAAO,yBACd,KAAK,kBAAkB8/C,CAAS,EAEhC,KAAK,qBAAqBA,CAAS,CAEvC,CACA,kBAAkB,EAAW,CAC3B,GAAI,KAAK,eAAeA,GACtB,OAEF,GAAM,CACJ,qBACA,iBACA,SACE,KACE,CACJ,QACA,gBACE0iB,EAAmB1iB,GACjB2iB,EAAgB,KAAK,iBAAiB13D,EAAO23D,CAAY,EAC/D,GAAKD,EAOH,EAAe3iB,GAAa2iB,EAC5B95D,GAAiBg6D,EAAe7iB,EAAU,EAC1C33C,GAAkBw6D,EAAe7iB,GAAYx/C,CAAK,MAThC,CAClB,IAAMN,EAAY,KAAK,gBAAgB,WAAY+K,EAAO23D,CAAY,EAClE1iE,IACF,EAAU8/C,GAAa,GACvB,EAAeA,GAAa9/C,EAEhC,CAKF,CACA,qBAAqB,EAAW,CAC9B,GAAI,KAAK,wBAAwB8/C,GAC/B,OAEF,IAAM8iB,EAAkB,KAAK,mBAAmB9iB,GAChD,GAAI,CAAC8iB,EACH,OAGF,IAAMx6F,EAAQ,CACZ,IAAK03E,EACL,MAHY8iB,EAAgB,MAI5B,KAAM,WACN,QAASA,EAAgB,MAAQ,CAAC,CAACA,EAAgB,MAAM,QAAU,GACnE,eAAgBA,EAAgB,KAClC,EACA,KAAK,wBAAwB9iB,GAAa13E,EAC1C,KAAK,IAAI,QAAQutB,EAAO,6BAA8B,CACpD,OAAQ,CAACvtB,CAAK,CAChB,CAAC,CACH,CACA,gBAAgB,EAAM,EAAO,EAAM,CACjC,IAAMk4B,EAAQ,KAAK,MACnB,GAAKA,EAGL,OAAOA,EAAM,aAAauiE,EAAM93D,EAAO9sB,CAAI,CAC7C,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,MAAQ3Y,EAAK,MACbA,EAAK,aACR,KAAK,aAAa,CAEtB,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAMw5D,EAAoB,CAAC,CAACx5D,EAAK,cAEjC,GADA,KAAK,MAAQ,KACTw5D,EACF,OAEF,GAAM,CACJ,kBACE,KACJ,OAAO,KAAK6jC,CAAc,CAAC,CAAC,QAAS,GAAc,CACjDh6D,GAAiBg6D,EAAe7iB,EAAU,EAC1C,OAAO6iB,EAAe7iB,EACxB,CAAC,EACD,KAAK,wBAA0B,CAAC,CAClC,CACA,mBAAoB,CAClB,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,cAAgB,GACrB,KAAK,OAAS,GACd,KAAK,OAAS9tC,GAAU,EACxB,KAAK,aAAa,EAClB,KAAK,OAAS,CAAC,EACf,KAAK,eAAiB,CAAC,EACvB,KAAK,wBAA0B,CAAC,EAChC,KAAK,WAAa,CAAC,EACnB,KAAK,iBAAmB,CAAC,EACzB,KAAK,QAAU,CAAC,EACZ,KAAK,eAAiB,KAAK,gBAC7B,KAAK,cAAc,MAAM,EACzB,KAAK,cAAc,MAAM,EAE7B,CACA,cAAe,CACb,GAAM,CACJ,SACE,KACJ,GAAI,CAAC1R,EACH,OAEF,IAAMgtD,EAAahtD,EAAM,WACzB,GAAIgtD,EACF,IAAK,IAAI3sF,EAAI,EAAGA,EAAI2sF,EAAW,OAAQ,IACrC3kD,GAAiB2kD,EAAW3sF,EAAE,CAGpC,CACA,wBAAwB,EAAO,EAAM,CACnC,IAAM4L,EAASjH,EAAK,gBAAkB,CAAC,EACjCw9F,EAAWv2F,EAAO,KAAM,GAAUnE,EAAM,YAAc61C,EAAW,EACvE,GAAI,KAAK,OAAO,cAAgB6kD,GAAY,KAAK,OAAO,YAAa,CAEnE,GADwBxjE,GAAyB,KAAK,OAAQ/yB,CAC5C,EAAG,CACnB,KAAK,OAASA,EACd,MACF,CAGA,GAFA,KAAK,WAAa,CAAC,EACnB,KAAK,OAASA,EACV,KAAK,OAAO,yBAA0B,CACxC,IAAM+zB,EAAQ,KAAK,MACbyiE,EAAcziE,EAAQiJ,GAAqBjJ,EAAM,UAAU,EAAI,KA6BrE,GA5BA,KAAK,OAAO,SAAS,EAAO,IAAU,CACpC,IAAIN,EACJ,GAAI+iE,EAAa,CACf,IAAItxD,EAAa,KACjB,IAAK,IAAI9wC,EAAI,EAAGA,EAAIoiG,EAAY,OAAQ,IACtC,GAAIA,EAAYpiG,IAAM6wC,GAAqBuxD,EAAYpiG,GAAIyH,CAAK,EAAG,CACjE,EAAa26F,EAAYpiG,GACzB,EAAYA,GAAK,KACjB,KACF,CAEE8wC,IACF,EAAYA,EAEhB,CACA,GAAIzR,EACF2I,GAAiB3I,CAAS,MACrB,CACL,IAAMgjE,EAAgBzxD,GAAuCnpC,CAAK,EAClE,EAAY,KAAK,gBAAgB46F,EAAe56F,EAAM,KAAMA,EAAM,IAAI,EAClE43B,IACF,EAAU,KAAO,WAErB,CACIA,GACF,KAAK,WAAW,KAAKA,CAAS,CAElC,CAAC,EACG+iE,GAAe,MAAQA,EAAY,OAAQ,CAC7C,IAAME,EAAmBF,EAAY,OAAQ,GAAM7iG,IAAM,IAAI,CAAC,CAAC,IAAK,GAAMA,EAAE,KAAK,EAC7E+iG,EAAiB,QACnB,KAAK,IAAI,OAAO,KAAK,kDAAkDA,EAAiB,KAAK,IAAI,EAAE,+EAA+E,CAEtL,CACF,MAAO,GAAI,KAAK,OAAO,OAAQ,CAC7B,IAAMC,EAAa,KAAK,OAAO,IAAK,IAC3B,CACL,MAAO96F,EAAM,KACb,KAAMA,EAAM,KAAK,YAAY,EAC7B,QAASA,EAAM,QACf,cAAeA,CACjB,EACD,EACD,KAAK,IAAI,QAAQutB,EAAO,6BAA8B,CACpD,OAAQutE,CACV,CAAC,CACH,CACF,CACF,CACA,iBAAiB,EAAO,EAAM,CACxB,KAAK,OAAO,sBAAwB59F,EAAK,UAC3CA,EAAK,SAAS,QAAS,GAAkB,CACvC,IAAM69F,EAAkB,wBAAwB,KAAKC,EAAc,UAAU,EAC7E,GAAI,CAACD,EACH,OAEF,IAAMrjB,EAAY,YAAYqjB,EAAgB,KACxCP,EAAkB,KAAK,mBAAmB9iB,GAC3C8iB,IAGL,EAAgB,MAAQQ,EAAc,KAClCA,EAAc,OAChB,EAAgB,aAAeA,EAAc,MAE/C,EAAgB,MAAQA,EAC1B,CAAC,CAEL,CACA,uBAAuB,EAAM,CAE3B,OADc,KAAK,IAAI,OAAOt+F,EAAK,MAC5B,EAA+B,MAAM,kBAC9C,CACA,cAAc,EAAO,EAAM,CACzB,GAAI,KAAK,SAAWQ,EAAK,KAAK,OAASivC,EAAkB,KAAM,CAE7D,GAAM,CACJ,gBACA,gBACA,UACE,KACE,CACJ,KACA,MACEjvC,EAAK,KACH2rB,EAA8C3rB,EAAK,MAAoC,OAAoC,GAC7H+9F,GAAiBC,IACf51E,IAAOkwC,EAAS,GAAKlwC,IAAOkwC,GAAU3sC,IAAc,KAAK,cAAgB,GAAKjQ,IAAO,KAAK,UAC5FqiF,EAAc,MAAM,EACpBC,EAAc,MAAM,GAGxB,KAAK,OAAStiF,EACd,KAAK,OAAS0M,EACd,KAAK,cAAgBuD,CACvB,CACF,CACA,aAAa,EAAO,EAAM,CACxB,GAAM,CACJ,OACA,WACE3rB,EACJ,GAAIR,EAAK,OAASyvC,EAAkB,SAAU,CAC5C,GAAIthC,EAAQ,WAAY,CACtB,IAAMksB,EAAcr6B,EAAK,YACnBy+F,EAAY,UAAWj+F,EAC7B,GAAI65B,GAAe,MAAQ,CAACA,EAAY,WAAaokE,EAAW,CAC9D,IAAMC,EAAqB,KAAK,OAAO1+F,EAAK,OACtCkpC,EAAS,KAAK,OACfA,EAAOlpC,EAAK,MACf,EAAOA,EAAK,IAAM,CAChB,MAAOA,EAAK,MACZ,OAAQ,KAAK,OACb,IAAK,EACP,EACA,KAAK,OAASA,EAAK,IAEjB0+F,GAAsBA,EAAmB,YAAcvlD,GACzD,KAAK,YAAYn5C,EAAMmO,CAAO,EAE9B,KAAK,WAAW3N,CAAI,CAExB,CACF,MACE,KAAK,IAAI,QAAQqwB,EAAO,wBAAyB,CAC/C,QAAS,GACT,OACA,MAAO,gBAAI,MAAM,wBAAwB,CAC3C,CAAC,CAEL,CACF,CACA,YAAY,EAAM,EAAS,CACzB,IAAMlW,EAAM,KAAK,IACjB+uB,GAAWv7B,EAAS,KAAK,QAAQnO,EAAK,IAAM,GAAS,CACnD,KAAK,YAAYgkC,EAAMhkC,EAAK,KAAK,EACjC2a,EAAI,QAAQkW,EAAO,wBAAyB,CAC1C,QAAS,GACT,MACF,CAAC,CACH,EAAI,GAAU,CACZlW,EAAI,OAAO,IAAI,0BAA0B4B,GAAO,EAChD5B,EAAI,QAAQkW,EAAO,wBAAyB,CAC1C,QAAS,GACT,OACA,OACF,CAAC,CACH,CAAC,CACH,CACA,WAAW,EAAM,CACf,IAAI8tE,EACJ,GAAM,CACJ,OACA,WACEn+F,EACE,CACJ,UACA,oBACE,KACEo+F,EAAUllE,EAAQ,OAAS,EACjC,GAAI,CAACA,EAAQ15B,EAAK,KAAO4+F,IAAY,GAAI,CACvCpB,EAAiB,KAAKh9F,CAAI,EAC1B,MACF,CACA,IAAMma,EAAM,KAAK,IAEjB0tB,IADuB,EAAoBroC,EAAK,cAAgB,MAAQ2+F,EAAkB,KAAO30F,GAAiBhK,EAAK,YAAY,KAAM,IAAI,WAAWmO,CAAO,CAAC,CAAC,CAAC,OAASA,EAChJ,KAAK,QAAQnO,EAAK,IAAK,KAAK,OAAQA,EAAK,GAAIA,EAAK,MAAQ,GAAS,CAC5F,KAAK,YAAYgkC,EAAMhkC,EAAK,KAAK,EACjC2a,EAAI,QAAQkW,EAAO,wBAAyB,CAC1C,QAAS,GACT,MACF,CAAC,CACH,EAAI,GAAU,CACZ,IAAMguE,EAAiBtiF,EAAM,UAAY,iCACrCsiF,EACFrB,EAAiB,KAAKh9F,CAAI,EAE1B,KAAK,iBAAiBR,EAAMmO,CAAO,EAErCwM,EAAI,OAAO,IAAI,4BAA4B4B,GAAO,EAC9C,KAAkBqiF,EAAU5+F,EAAK,KAGrC2a,EAAI,QAAQkW,EAAO,wBAAyB,CAC1C,QAAS,GACT,OACA,OACF,CAAC,CACH,CAAC,CACH,CACA,iBAAiB,EAAM,EAAS,CAC9B,IAAM6tE,EAAqB,KAAK,OAAO1+F,EAAK,OACvC0+F,EAAmB,WACtBh1D,GAAWv7B,EAAS,KAAK,QAAQnO,EAAK,QAAW,CAC/C,EAAmB,UAAYm5C,GAC/B,KAAK,YAAYn5C,EAAMmO,CAAO,CAChC,MAAS,CACP,EAAmB,UAAY,MACjC,CAAC,CAEL,CACA,YAAY,EAAM,EAAW,CAC3B,IAAMwM,EAAM,KAAK,IACjB,GAAI,KAAK,OAAO,yBAA0B,CACxC,IAAMugB,EAAY,KAAK,WAAW4jE,GAClC,GAAI,CAAC5jE,GAAaA,EAAU,OAAS,WACnC,OAEF8I,EAAK,QAAS,GAAQT,GAAcrI,EAAWuI,CAAG,CAAC,CACrD,KAAO,CACL,IAAMs1C,EAAe,KAAK,OAAO+lB,GACjC,GAAI,CAAC/lB,EACH,OAEF,IAAMz1E,EAAQy1E,EAAa,QAAU,UAAY,YAAc+lB,EAC/DnkF,EAAI,QAAQkW,EAAO,YAAa,CAC9B,KAAM,YACN,OACA,OACF,CAAC,CACH,CACF,CACA,gBAAgB,EAAO,EAAM,CAC3B,GAAM,CACJ,QACErwB,EACAR,EAAK,OAASyvC,EAAkB,UAClC,KAAK,aAAa5e,EAAO,YAAarwB,CAAI,CAE9C,CACA,yBAA0B,CACxB,KAAK,OAAS,CAAC,EACf,KAAK,eAAiB,CAAC,CACzB,CACA,sBAAsB,EAAO,EAAM,CACjC,GAAI,CAAC,KAAK,SAAW,CAAC,KAAK,OAAO,qBAChC,OAEF,GAAM,CACJ,OACA,WACEA,EACJ,GAAIR,EAAK,OAASyvC,EAAkB,MAAQ,KAAK,uBAAuBzvC,CAAI,IAAM,OAGlF,IAAK,IAAInE,EAAI,EAAGA,EAAImR,EAAQ,OAAQ,IAAK,CACvC,IAAM+xF,EAAU/xF,EAAQnR,EAAE,CAAC,MAC3B,GAAIkjG,EAAS,CACN,KAAK,eACR,KAAK,kBAAkB,EAEzB,IAAMC,EAAU,KAAK,kBAAkBD,CAAO,EAC9C,KAAK,cAAc,QAAQ/xF,EAAQnR,EAAE,CAAC,IAAKmjG,EAAQ,EAAE,EACrD,KAAK,cAAc,QAAQhyF,EAAQnR,EAAE,CAAC,IAAKmjG,EAAQ,EAAE,CACvD,CACF,CACF,CACA,iBAAiB,EAAO,CACtB,cACA,YACA,qBACA,QACC,CACD,GAAM,CACJ,SACE,KACJ,GAAI,GAACxjE,GAASA,EAAM,YAAc8+B,GAGlC,IAAI,CAACp+D,GAAQA,IAAS,QAAS,CAC7B,GAAM,CACJ,kBACE,KACJ,OAAO,KAAK2hG,CAAc,CAAC,CAAC,QAAS,GAAc95D,GAAkB85D,EAAe7iB,GAAY3gB,EAAaC,CAAS,CAAC,CACzH,CACA,GAAI,KAAK,OAAO,0BACVD,IAAgB,GAAKm8B,IAAuB,IAAK,GAAG,CACtD,GAAM,CACJ,cACE,KACJ,OAAO,KAAKhO,CAAU,CAAC,CAAC,QAAS,GAAczkD,GAAkBykD,EAAWxN,GAAY3gB,EAAam8B,CAAkB,CAAC,CAC1H,CAPF,CASF,CACA,kBAAkB,EAAW,CAC3B,IAAMyI,EAAgB,CAAC,CAAC,EAAG,CAAC,CAAC,EACvBx8B,EAAQ11D,EAAU,GAAK,GACzBi7B,EAAW,EACf,IAAK,IAAIr/B,EAAI,EAAGA,EAAI85D,EAAO,IAAK,CAC9B,IAAMy8B,EAAUnyF,EAAU,KACpBoyF,EAAU,IAAMpyF,EAAU,KAC1BqyF,EAAU,IAAMryF,EAAU,KAChC,IAAIoyF,IAAY,GAAKC,IAAY,IAGhB,EAAIF,EACR,CACX,IAAMG,EAAS,EAAIH,GACfG,IAAW,GAAKA,IAAW,KAC7BJ,EAAcI,EAAO,CAAC,KAAKF,CAAO,EAClCF,EAAcI,EAAO,CAAC,KAAKD,CAAO,EAEtC,CACF,CACA,OAAOH,CACT,CACF,EA0BM,GAAkB,KAClB,GAAO,CACX,OAAO,EAAO,EAAW,EAAS,EAAe,CAC/C,IAAMj+F,EAAS,CAAC,EACZq3F,EACA50D,EACA67D,EACAhH,EACAvkE,EACE6b,EAAM,KAAK,QAAU,KAAK,aAChC,IAAK,IAAIz0C,EAAI,EAAGA,EAAIokG,EAAc,KAAK,OAAQ,IAK7C,GAJA,EAAMA,EAAc,KAAKpkG,GACzB,EAAY,GACZ,EAAS,EACT,EAAO,GACH,CAACk9F,EAAI,QAAQ,EAAG,CAClB,IAAImH,EACJ,IAAK,IAAIzhG,EAAI,EAAGA,EAAIs6F,EAAI,MAAM,OAAQ,IAChC/+C,GAAgB,KAAK++C,EAAI,MAAMt6F,EAAE,CAAC,KAAK,GAAKuhG,EAC9C,KAEA,GAAQjH,EAAI,MAAMt6F,EAAE,CAAC,MACrB,EAAY,IAGhB,EAAI,aAAek8B,EACfA,IAAc5U,IAChB,GAAW,MAETizE,GAAU,GACZ,IAEA,IAEF,IAAM7tD,EAAUtC,GAAcpU,EAAK,KAAK,CAAC,EACnC53B,EAAKisC,GAAcnO,EAAW5U,EAASolB,CAAO,EAC9CnnC,GAAS,OAAS,EAAcA,EAAM,OAAS,MAAQk8F,EAAY,WAAWrjG,CAAE,IACpF,EAAM,IAAIyzC,EAAI3V,EAAW5U,EAASolB,CAAO,EACzC,EAAI,GAAKtuC,EACT,EAAI,KAAOhB,EAAI,EACf,EAAI,MAAQ,OACZ,EAAI,SAAW,GAAK,KAAK,IAAI,GAAI,KAAK,MAAMm9F,EAAS,EAAI,EAAE,EAAI,EAAE,EACjEt3F,EAAO,KAAKyiC,CAAG,EAEnB,CAcF,OAZIngC,GAAStC,EAAO,SAClBA,EAAO,MAAM,EAAM,IACby+F,EAAK,OAAS,QAAUC,EAAK,OAAS,OACjC,EAELD,EAAK,KAAO,GAAKC,EAAK,KAAO,EACxBA,EAAK,KAAOD,EAAK,KAEnBA,EAAK,KAAOC,EAAK,IACzB,EACD1+F,EAAO,QAAS,GAASuiC,GAAcjgC,EAAO2kC,CAAI,CAAC,GAE9CjnC,CACT,CACF,EAWM,GAAY,qBACZ,GAAN,KAAkB,CAChB,YAAY,EAAQ,CAClB,KAAK,WAAa,IAAK,GACvB,KAAK,eAAiB,IAAK,GAC3B,KAAK,QAAU,KACf,KAAK,SAAW,KAChB,KAAK,WAAa,IAAK,GACvB,KAAK,QAAU,KACf,KAAK,OAAS,KACd,KAAK,UAAY,KACjB,KAAK,MAAQ,IAAK,GAClB,KAAK,OAAS,KACd,KAAK,WAAagU,EAAO,YAAc64B,GACvC,KAAK,WAAa,IAAI,KAAK,gBAC3B,KAAK,MAAQ,IAAIoD,EACnB,CACA,SAAU,CACR,KAAK,OAAS,KAAK,UAAY,KAAK,QAAU,KAAK,OAAS,KAAK,QAAU,KAC3E,KAAK,cAAc,EACnB,KAAK,SAAW,KAChB,KAAK,WAAa,KAAK,WAAa,KAAK,MAAQ,IACnD,CACA,eAAgB,CACV,KAAK,YAAc,CAAC,KAAK,MAAM,QAAQ,MACzC,KAAK,MAAM,QAAU,GACrB,KAAK,WAAW,MAAM,EAE1B,CACA,OAAQ,CACN,IAAI0uD,EACJ,KAAK,cAAc,GACd,EAAkB,KAAK,YAAc,MAAQA,EAAgB,SAChE,KAAK,UAAU,QAAQ,KAAK,MAAO,KAAK,QAAS,KAAK,QAAQ,CAElE,CACA,KAAK,EAAS,EAAQ,EAAW,CAC/B,IAAMn6C,EAAQ,KAAK,MACnB,GAAIA,EAAM,QAAQ,MAChB,MAAU,MAAM,+BAA+B,EAEjD,EAAM,QAAQ,MAAQ,KAAK,YAAY,IAAI,EAC3C,IAAMnY,EAAaD,GAAqBzwC,EAAS,KAAK,WAAW,MAAM,EACjEijG,EAAgBjjG,EAAQ,eAAiB,cACzCkjG,EAASD,EAAgB,aAAe,SACxC,CACJ,uBACA,iBACE5qF,EAAO,WACX,KAAK,QAAUrY,EACf,KAAK,OAASqY,EACd,KAAK,UAAYq+C,EACjB,KAAK,QAAU,KAAK,WAAW12D,EAAS0wC,CAAU,EAClD,KAAK,aAAa,KAAK,cAAc,EACrC,EAAO,QAAUyyD,GAAwB33F,EAAe23F,CAAoB,EAAIA,EAAuBC,EACvG,KAAK,eAAiB,KAAK,eAAiB,CACtC,KAAK,YACP,KAAK,cAAc,EACnB,KAAK,UAAU,UAAUv6C,EAAO7oD,EAAS,KAAK,QAAQ,EAE1D,EAAGqY,EAAO,OAAO,GACIslB,GAAU,KAAK,OAAO,EAAI,KAAK,QAAQ,KAAK,KAAK,KAAK,EAAI,KAAK,MAAM,KAAK,OAAO,EAAA,CACzF,KAAM,GAAa,CAE9B,KAAK,SAAW,KAAK,OAASqW,EAC9B,IAAMqvD,EAAQ,KAAK,IAAI,KAAK,YAAY,IAAI,EAAGx6C,EAAM,QAAQ,KAAK,EASlE,GARA,KAAK,aAAa,KAAK,cAAc,EACrC,EAAO,QAAUu6C,EACjB,KAAK,eAAiB,KAAK,eAAiB,CACtC,KAAK,YACP,KAAK,cAAc,EACnB,KAAK,UAAU,UAAUv6C,EAAO7oD,EAAS,KAAK,QAAQ,EAE1D,EAAGojG,GAAiBC,EAAQx6C,EAAM,QAAQ,MAAM,EAC5C,CAAC7U,EAAS,GAAI,CAChB,GAAM,CACJ,OAAQ+zC,EACR,cACE/zC,EACJ,MAAM,IAAI4I,GAAW0mD,GAAc,8BAA+Bvb,EAAS/zC,CAAQ,CACrF,CACA,EAAM,QAAQ,MAAQqvD,EACtB,EAAM,MAAQvyD,GAAiBkD,EAAS,OAAO,GAAK6U,EAAM,MAC1D,IAAM8N,EAAiC,KAAK,WAA+C,WAU3F,OATIA,GAAcnrD,EAAe6M,EAAO,aAAa,EAC5C,KAAK,kBAAkB27B,EAAU6U,EAAO7oD,EAASqY,EAAO,cAAes+C,CAAU,EAEtFssC,EACKjvD,EAAS,YAAY,EAE1Bh0C,EAAQ,eAAiB,OACpBg0C,EAAS,KAAK,EAEhBA,EAAS,KAAK,CACvB,CAAC,CAAC,CAAC,KAAM,GAAiB,CACxB,IAAsBuvD,EACtB,IAAMvvD,EAAW,KAAK,SACtB,GAAI,CAACA,EACH,MAAU,MAAM,kBAAkB,EAEpC,KAAK,aAAa,KAAK,cAAc,EACrC,EAAM,QAAQ,IAAM,KAAK,IAAI,KAAK,YAAY,IAAI,EAAG6U,EAAM,QAAQ,KAAK,EACxE,IAAMtB,EAAQi8C,EAAaN,GACvB37C,IACF,EAAM,OAAS,EAAM,MAAQA,GAE/B,IAAM5mC,EAAiB,CACrB,IAAKqzB,EAAS,IACd,KAAMwvD,EACN,KAAMxvD,EAAS,MACjB,EACM2iB,EAAiC,KAAK,WAA+C,WACvFA,GAAc,CAACnrD,EAAe6M,EAAO,aAAa,GACpDs+C,EAAW9N,EAAO7oD,EAASwjG,EAAcxvD,CAAQ,GAElD,EAAmB,KAAK,YAAc,MAAQuvD,EAAiB,UAAU5iF,EAAgBkoC,EAAO7oD,EAASg0C,CAAQ,CACpH,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,IAAIyvD,EAEJ,GADA,KAAK,aAAa,KAAK,cAAc,EACjC56C,EAAM,QACR,OAEF,IAAM66C,EAAQ9jF,GAAYA,EAAM,MAAQ,EAClCwX,EAAQxX,EAAeA,EAAM,QAAb,MACrB,EAAmB,KAAK,YAAc,MAAQ6jF,EAAiB,QAAQ,CACtE,OACA,MACF,EAAGzjG,EAAS4f,EAAQA,EAAM,QAAU,KAAMipC,CAAK,CACjD,CAAC,CACH,CACA,aAAc,CACZ,IAAIxkD,EAAS,KACb,GAAI,KAAK,SAAU,CACjB,IAAMs/F,EAAY,KAAK,SAAS,QAAQ,IAAI,KAAK,EACjD,EAASA,EAAY,WAAWA,CAAS,EAAI,IAC/C,CACA,OAAOt/F,CACT,CACA,kBAAkB,EAAM,CACtB,OAAO,KAAK,SAAW,KAAK,SAAS,QAAQ,IAAIxD,CAAI,EAAI,IAC3D,CACA,kBAAkB,EAAU,EAAO,EAAS,EAAgB,EAAG,EAAY,CACzE,IAAM+iG,EAAa,IAAI/sD,GACjBowB,EAASjzB,EAAS,KAAK,UAAU,EACjC6vD,MACG58B,EAAO,KAAK,CAAC,CAAC,KAAM,GAAS,CAClC,GAAIpjE,EAAK,KAIP,OAHI+/F,EAAW,YACbjtC,EAAW9N,EAAO7oD,EAAS4jG,EAAW,MAAM,CAAC,CAAC,OAAQ5vD,CAAQ,EAEzD,QAAQ,wBAAQ,IAAI,YAAY,CAAC,CAAC,EAE3C,IAAM/iB,EAAQptB,EAAK,MACb1C,EAAM8vB,EAAM,OAUlB,MATA,GAAM,QAAU9vB,EACZA,EAAM2iG,GAAiBF,EAAW,YACpCA,EAAW,KAAK3yE,CAAK,EACjB2yE,EAAW,YAAcE,GAC3BntC,EAAW9N,EAAO7oD,EAAS4jG,EAAW,MAAM,CAAC,CAAC,OAAQ5vD,CAAQ,GAGhE2iB,EAAW9N,EAAO7oD,EAASixB,EAAM,OAAQ+iB,CAAQ,EAE5C6vD,EAAK,CACd,CAAC,CAAC,CAAC,UACM,QAAQ,OAAO,CACvB,EAEH,OAAOA,EAAK,CACd,CACF,EAoCM,GAAN,cAAyB,KAAM,CAC7B,YAAY,EAAS,EAAM,EAAS,CAClC,MAAMj1E,CAAO,EACb,KAAK,KAAO,IAAK,GACjB,KAAK,QAAU,IAAK,GACpB,KAAK,KAAO80E,EACZ,KAAK,QAAU7qF,CACjB,CACF,EACM,GAAwB,uBACxB,GAAN,KAAgB,CACd,YAAY,EAAQ,CAClB,KAAK,SAAW,IAAK,GACrB,KAAK,eAAiB,IAAK,GAC3B,KAAK,aAAe,IAAK,GACzB,KAAK,WAAa,IAAK,GACvB,KAAK,OAAS,KACd,KAAK,UAAY,KACjB,KAAK,QAAU,KACf,KAAK,OAAS,KACd,KAAK,MAAQ,IAAK,GAClB,KAAK,SAAWR,GAASA,EAAO,UAAY,KAC5C,KAAK,MAAQ,IAAIi8B,GACjB,KAAK,WAAa,CACpB,CACA,SAAU,CACR,KAAK,UAAY,KACjB,KAAK,cAAc,EACnB,KAAK,OAAS,KACd,KAAK,OAAS,KACd,KAAK,QAAU,KACf,KAAK,SAAW,IAClB,CACA,eAAgB,CACd,IAAMkiB,EAAS,KAAK,OACpB,KAAK,aAAa,KAAK,cAAc,EACrC,KAAK,aAAa,KAAK,YAAY,EAC/BA,IACF,EAAO,mBAAqB,KAC5B,EAAO,WAAa,KAChBA,EAAO,aAAe,IACxB,KAAK,MAAM,QAAU,GACrBA,EAAO,MAAM,GAGnB,CACA,OAAQ,CACN,IAAIwsC,EACJ,KAAK,cAAc,GACd,EAAkB,KAAK,YAAc,MAAQA,EAAgB,SAChE,KAAK,UAAU,QAAQ,KAAK,MAAO,KAAK,QAAS,KAAK,MAAM,CAEhE,CACA,KAAK,EAAS,EAAQ,EAAW,CAC/B,GAAI,KAAK,MAAM,QAAQ,MACrB,MAAU,MAAM,+BAA+B,EAEjD,KAAK,MAAM,QAAQ,MAAQ,KAAK,YAAY,IAAI,EAChD,KAAK,QAAUhjG,EACf,KAAK,OAASqY,EACd,KAAK,UAAYq+C,EACjB,KAAK,aAAa,CACpB,CACA,cAAe,CACb,GAAM,CACJ,SACA,WACE,KACJ,GAAI,CAACr+C,GAAU,CAACrY,EACd,OAEF,IAAM4pF,EAAM,KAAK,OAAS,IAAI,KAAK,eAC7B/gC,EAAQ,KAAK,MACnB,EAAM,QAAQ,MAAQ,EACtB,EAAM,OAAS,EACf,EAAM,QAAU,GAChB,IAAMk7C,EAAW,KAAK,SAClBA,EACF,QAAQ,QAAQ,CAAC,CAAC,SAAW,CAC3B,GAAI,OAAK,SAAWna,GAAO,KAAK,MAAM,SAEtC,OAAOma,EAASna,EAAK5pF,EAAQ,GAAG,CAClC,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,GAAI,OAAK,SAAW4pF,GAAO,KAAK,MAAM,SAGtC,OADAA,EAAI,KAAK,MAAO5pF,EAAQ,IAAK,EAAI,EAC1B+jG,EAASna,EAAK5pF,EAAQ,GAAG,CAClC,CAAC,CAAC,CAAC,SAAW,CACR,KAAK,SAAW4pF,GAAO,KAAK,MAAM,SAEtC,KAAK,eAAeA,EAAK5pF,EAASqY,CAAM,CAC1C,CAAC,CAAC,CAAC,MAAO,GAAU,CAClB,IAAI2rF,GACH,EAAmB,KAAK,YAAc,MAAQA,EAAiB,QAAQ,CACtE,KAAMpa,EAAI,OACV,KAAMhqE,EAAM,OACd,EAAG5f,EAAS4pF,EAAK/gC,CAAK,CAExB,CAAC,EAED,KAAK,eAAe+gC,EAAK5pF,EAASqY,CAAM,CAE5C,CACA,eAAe,EAAK,EAAS,EAAQ,CAC9BuxE,EAAI,YACPA,EAAI,KAAK,MAAO5pF,EAAQ,IAAK,EAAI,EAEnC,IAAM+kC,EAAU/kC,EAAQ,QAClB,CACJ,uBACA,iBACEqY,EAAO,WACX,GAAI0sB,EACF,IAAK,IAAMtP,KAAUsP,EACnB6kD,EAAI,iBAAiBn0D,EAAQsP,EAAQtP,EAAO,EAG5Cz1B,EAAQ,UACV4pF,EAAI,iBAAiB,QAAS,SAAW5pF,EAAQ,WAAa,KAAOA,EAAQ,SAAW,EAAE,EAE5F,EAAI,mBAAqB,KAAK,iBAAiB,KAAK,IAAI,EACxD,EAAI,WAAa,KAAK,aAAa,KAAK,IAAI,EAC5C,EAAI,aAAeA,EAAQ,aAC3B,KAAK,aAAa,KAAK,cAAc,EACrC,EAAO,QAAUmjG,GAAwB33F,EAAe23F,CAAoB,EAAIA,EAAuBC,EACvG,KAAK,eAAiB,KAAK,WAAW,KAAK,YAAY,KAAK,IAAI,EAAG/qF,EAAO,OAAO,EACjFuxE,EAAI,KAAK,CACX,CACA,kBAAmB,CACjB,GAAM,CACJ,UACA,OAAQA,EACR,SACE,KACJ,GAAI,CAAC5pF,GAAW,CAAC4pF,EACf,OAEF,IAAMpL,EAAaoL,EAAI,WACjBvxE,EAAS,KAAK,OACpB,GAAI,GAAM,SAGNmmE,GAAc,IACZ31B,EAAM,QAAQ,QAAU,IAC1B,EAAM,QAAQ,MAAQ,KAAK,IAAI,KAAK,YAAY,IAAI,EAAGA,EAAM,QAAQ,KAAK,EACtExwC,EAAO,UAAYA,EAAO,WAAW,gBACvC,KAAK,aAAa,KAAK,cAAc,EACrC,EAAO,QAAUA,EAAO,WAAW,cACnC,KAAK,eAAiB,KAAK,WAAW,KAAK,YAAY,KAAK,IAAI,EAAGA,EAAO,WAAW,eAAiBwwC,EAAM,QAAQ,MAAQA,EAAM,QAAQ,MAAM,IAGhJ21B,IAAe,GAAG,CACpB,KAAK,aAAa,KAAK,cAAc,EACrC,EAAI,mBAAqB,KACzB,EAAI,WAAa,KACjB,IAAMuJ,EAAU6B,EAAI,OACdqa,EAAkBra,EAAI,eAAiB,OAASA,EAAI,aAAe,KACzE,GAAI7B,GAAW,KAAOA,EAAU,IAAK,CACnC,IAAMlkF,EAAOogG,GAA4Cra,EAAI,SAC7D,GAAI/lF,GAAQ,KAAM,CAChB,IAAsB0/F,EACtB,EAAM,QAAQ,IAAM,KAAK,IAAI,KAAK,YAAY,IAAI,EAAG16C,EAAM,QAAQ,KAAK,EAExE,EAAM,OAAS,EAAM,MADT+gC,EAAI,eAAiB,cAAgB/lF,EAAK,WAAaA,EAAK,OAExE,EAAM,WAAaglD,EAAM,MAAQ,KAAOA,EAAM,QAAQ,IAAMA,EAAM,QAAQ,OAC1E,IAAM8N,EAAiC,KAAK,WAA+C,WACvFA,GACFA,EAAW9N,EAAO7oD,EAAS6D,EAAM+lF,CAAG,EAEtC,IAAMsa,EAAY,CAChB,IAAKta,EAAI,YACT,OACA,KAAM7B,CACR,GACC,EAAmB,KAAK,YAAc,MAAQwb,EAAiB,UAAUW,EAAWr7C,EAAO7oD,EAAS4pF,CAAG,EACxG,MACF,CACF,CACA,IAAMvpE,EAAchI,EAAO,WAAW,WAChCiI,EAAauoC,EAAM,MAMzB,GAAIpoC,GAAYJ,EAAaC,EAAY,GAAO,CAJ9C,IAAKtgB,EAAQ,IACb,KAAM,IAAK,GACX,KAAM+nF,CAE+C,CAAC,EACtD,KAAK,MAAM1nE,CAAW,MACjB,CACL,IAAIojF,EACJ99F,EAAO,MAAM,GAAGoiF,EAAQ,iBAAiB/nF,EAAQ,KAAK,GACrD,EAAmB,KAAK,YAAc,MAAQyjG,EAAiB,QAAQ,CACtE,KAAM1b,EACN,KAAM6B,EAAI,UACZ,EAAG5pF,EAAS4pF,EAAK/gC,CAAK,CACxB,CACF,CAEJ,CACA,aAAc,CACZ,GAAI,CAAC,KAAK,OACR,OACF,IAAMxoC,EAAc,KAAK,OAAO,WAAW,aACrCC,EAAa,KAAK,MAAM,MAC9B,GAAIG,GAAYJ,EAAaC,EAAY,EAAI,EAC3C,KAAK,MAAMD,CAAW,MACjB,CAEL1a,EAAO,KAAK,yBAA0C,KAAK,SAA0C,KAAK,EAC1G,IAAM+wD,EAAY,KAAK,UACnBA,IACF,KAAK,cAAc,EACnBA,EAAU,UAAU,KAAK,MAAO,KAAK,QAAS,KAAK,MAAM,EAE7D,CACF,CACA,MAAM,EAAa,CACjB,GAAM,CACJ,UACA,SACE,KACJ,KAAK,WAAav2C,GAAcE,EAAawoC,EAAM,KAAK,EACxD,EAAM,QACNljD,EAAO,KAAK,GAAG,OAAS,eAAiB,OAAS,UAAU,iBAAiB3F,GAAmC,IAAI,aAAa6oD,EAAM,MAAM,GAAGxoC,EAAY,YAAY,MAAM,KAAK,WAAW,GAAG,EACjM,KAAK,cAAc,EACnB,KAAK,OAAS,KACd,KAAK,aAAa,KAAK,YAAY,EACnC,KAAK,aAAe,KAAK,WAAW,KAAK,aAAa,KAAK,IAAI,EAAG,KAAK,UAAU,CACnF,CACA,aAAa,EAAO,CAClB,IAAMwoC,EAAQ,KAAK,MACnB,EAAM,OAASh3B,EAAM,OACjBA,EAAM,mBACR,EAAM,MAAQA,EAAM,MAExB,CACA,aAAc,CACZ,IAAIxtB,EAAS,KACb,GAAI,KAAK,QAAUw4C,GAAsB,KAAK,KAAK,OAAO,sBAAsB,CAAC,EAAG,CAClF,IAAM8mD,EAAY,KAAK,OAAO,kBAAkB,KAAK,EACrD,EAASA,EAAY,WAAWA,CAAS,EAAI,IAC/C,CACA,OAAOt/F,CACT,CACA,kBAAkB,EAAM,CAItB,OAHI,KAAK,QAAc,OAAO,IAAIxD,EAAK,mBAAoB,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,sBAAsB,CAAC,EAChG,KAAK,OAAO,kBAAkBA,CAAI,EAEpC,IACT,CACF,EAOM,GAAmB7B,EAAeA,EAAe,CACrD,cAAe,GACf,cAAe,GACf,kBAAmB,IAAK,GACxB,MAAO,GACP,kBAAmB,GACnB,qBAAsB,GACtB,uBAAwB,GACxB,oBAAqB,IACrB,yBAA0B,GAC1B,wBAAyB,EACzB,gBAAiB,GACjB,iBAAkB,IAClB,0BAA2B,IAC3B,uBAAwB,GACxB,cAAe,IACf,uBAAwB,IACxB,cAAe,GACf,6BAA8B,KAC9B,yBAA0B,EAC1B,YAAa,GACb,cAAe,EACf,iBAAkB,GAClB,aAAc,OACd,sBAAuB,EACvB,wBAAyB,EACzB,4BAA6B,IAC7B,iBAAkB,IAAK,GACvB,uBAAwB,IAAK,GAC7B,wBAAyB,EACzB,qBAAsB,GACtB,qBAAsB,KACtB,mBAAoB,IACpB,aAAc,GACd,WAAY,KACZ,kBAAmB,GACnB,WAAY,IAAK,GACjB,kBAAmB,GACnB,2BAA4B,IAC5B,8BAA+B,GAC/B,oBAAqB,EACrB,4BAA6B,GAC7B,OAAQozC,GACR,QAAS,IAAK,GACd,QAAS,IAAK,GACd,SAAU,IAAK,GACf,gBAAiB,IAAK,GACtB,wBAAyB,IAAK,GAC9B,cAAe2C,GACf,iBAAkB2E,GAClB,mBAAoBC,GACpB,gBAAiB3E,GACjB,cAAe0F,GACf,uBAAwB,GACxB,oBAAqB,EACrB,6BAA8B,GAC9B,gBAAiB,EACjB,gBAAiB,EACjB,eAAgB,EAChB,eAAgB,EAChB,uBAAwB,IACxB,0BAA2B,IAC3B,mBAAoB,IACpB,qBAAsB,GACtB,sBAAuB,GACvB,mBAAoB,EACpB,gBAAiB,EACjB,eAAgB,EAChB,WAAY,GACZ,mBAAoB,IAAK,GACzB,WAAY,CAAC,EACb,iBAAkB,CAAC,EACnB,gCAAiCtE,GACjC,8BAA+B,GAC/B,cAAe,GACf,YAAa,GACb,eAAgB,GAChB,KAAM,IAAK,GACX,4BAA6B,GAC7B,uBAAwB,GACxB,sBAAuB,GACvB,sBAAuB,GACvB,2BAA4B,GAC5B,0BAA2B,GAC3B,0BAA2B,GAC3B,qBAAsB,GACtB,2BAA4B,GAC5B,eAAgB,CACd,QAAS,CA7FX,qBAAsB,IACtB,cAAe,IACf,aAAc,KACd,WAAY,IA0Fe,CAC3B,EACA,cAAe,CACb,QAAS,CACP,qBAAsB,IACtB,cAAe,IACf,aAAc,CACZ,YAAa,EACb,aAAc,IACd,gBAAiB,IACjB,QAAS,QACX,EACA,WAAY,CACV,YAAa,EACb,aAAc,IACd,gBAAiB,IACjB,QAAS,QACX,CACF,CACF,EACA,mBAAoB,CAClB,QAAS,CACP,qBAAsB,IACtB,cAAe,IACf,aAAc,CACZ,YAAa,EACb,aAAc,EACd,gBAAiB,CACnB,EACA,WAAY,CACV,YAAa,EACb,aAAc,IACd,gBAAiB,GACnB,CACF,CACF,EACA,mBAAoB,CAClB,QAAS,CACP,qBAAsB,IACtB,cAAe,IACf,aAAc,CACZ,YAAa,EACb,aAAc,EACd,gBAAiB,CACnB,EACA,WAAY,CACV,YAAa,EACb,aAAc,IACd,gBAAiB,GACnB,CACF,CACF,EACA,eAAgB,CACd,QAAS,CACP,qBAAsB,IACtB,cAAe,KACf,aAAc,CACZ,YAAa,EACb,aAAc,EACd,gBAAiB,CACnB,EACA,WAAY,CACV,YAAa,EACb,aAAc,IACd,gBAAiB,GACnB,CACF,CACF,EACA,2BAA4B,CAC1B,QAAS,CACP,qBAAsB,IACtB,cAAe,IACf,aAAc,CACZ,YAAa,EACb,aAAc,EACd,gBAAiB,CACnB,EACA,WAAY,CACV,YAAa,EACb,aAAc,IACd,gBAAiB,GACnB,CACF,CACF,EACA,gCAAiC,CAC/B,QAAS,CACP,qBAAsB,IACtB,cAAe,IACf,aAAc,CACZ,YAAa,EACb,aAAc,EACd,gBAAiB,CACnB,EACA,WAAY,CACV,YAAa,EACb,aAAc,IACd,gBAAiB,GACnB,CACF,CACF,EACA,uBAAwB,IACxB,wBAAyB,EACzB,0BAA2B,IAC3B,+BAAgC,KAChC,oBAAqB,IACrB,qBAAsB,EACtB,uBAAwB,IACxB,4BAA6B,KAC7B,mBAAoB,IACpB,oBAAqB,EACrB,sBAAuB,IACvB,2BAA4B,IAC9B,EAAGjF,GAAe,CAAC,EAAG,CAAC,EAAG,CACxB,yBAA0BiK,GAC1B,wBAAyBT,GACzB,mBAAoB+B,GACpB,sBAAuBvD,GACvB,qBAAsBE,GACtB,cAAeoB,GACf,eAAgBH,GAChB,0BAA2BE,GAC3B,wBAAyBU,EAC3B,CAAC,EAiGK,GAAqB,EACrB,GAAgC,GAChC,GAA0B,IAC1B,GAAkB,IAClB,GAAN,cAA4BxF,EAAS,CACnC,YAAY,EAAK,EAAiB,CAChC,MAAM,iBAAkB13B,EAAI,MAAM,EAClC,KAAK,IAAM,IAAK,GAChB,KAAK,gBAAkB,IAAK,GAC5B,KAAK,MAAQ,KACb,KAAK,YAAc,IAAK,GACxB,KAAK,WAAa,EAClB,KAAK,cAAgB,GACrB,KAAK,QAAU,KACf,KAAK,MAAQ,GACb,KAAK,QAAU,GACf,KAAK,SAAW,CAAC,EACjB,KAAK,gBAAkB,EACvB,KAAK,MAAQ,EACb,KAAK,QAAU,EACf,KAAK,mBAAuB,CAC1B,KAAK,MAAQ,EACb,KAAK,QAAU,CACjB,EACA,KAAK,mBAAuB,CAC1B,IAAImzE,GACC,EAAc,KAAK,QAAU,MAAQA,EAAY,UAGtD,KAAK,QAAU,KAAK,YAAY,IAAI,EACpC,KAAK,KAAK,EACZ,EACA,KAAK,iBAAqB,CACpB,KAAK,MAEP,KAAK,MAAyB,KAAK,OAAuC,aAAgB,EAC1F,KAAK,IAAI,QAAQj9D,EAAO,YAAa,CACnC,QAAS,EACX,CAAC,EAEL,EACA,KAAK,IAAMlW,EACX,KAAK,gBAAkB60B,EACvB,KAAK,kBAAkB,CACzB,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACA70B,IACFA,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAE9D,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACAlW,IACFA,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAE/D,CACA,SAAU,CACR,MAAM,QAAQ,EACd,KAAK,oBAAoB,EACzB,KAAK,MAAQ,KAAK,IAAM,KAAK,gBAAkB,KAC/C,KAAK,YAAc,IAAK,EAC1B,CACA,gBAAgB,EAAO,EAAM,CAC3B,KAAK,YAAYgpB,EAAe,EAChC,KAAK,YAAcr5C,EAAK,YACxB,IAAMg7B,EAAQ,KAAK,MAAQh7B,EAAK,MAChC6sB,EAAiBmO,EAAO,UAAW,KAAK,cAAc,EACtDnO,EAAiBmO,EAAO,UAAW,KAAK,cAAc,EACtDnO,EAAiBmO,EAAO,QAAS,KAAK,YAAY,CACpD,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,cAAc,EACnB,GAAM,CACJ,SACE,KACAA,IACFlO,GAAoBkO,EAAO,UAAW,KAAK,cAAc,EACzDlO,GAAoBkO,EAAO,UAAW,KAAK,cAAc,EACzDlO,GAAoBkO,EAAO,QAAS,KAAK,YAAY,EACrD,KAAK,MAAQ,MAEf,KAAK,YAAc,IAAK,EAC1B,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,SAAWh7B,EAAK,UACvB,CACA,IAAI,aAAc,CAChB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,OAAS,CAC7C,CACA,MAAO,CACL,IAAIw9D,EACJ,GAAI,GAAG,EAAe,KAAK,QAAU,MAAQA,EAAa,aAAe,CAAC,KAAK,YAC7E,OAEF,IAAM5uB,EAAc,KAAK,MAAM,YAC/B,KAAK,KAAKA,EAAa,KAAK,eAAe,EAC3C,KAAK,gBAAkBA,CACzB,CACA,KAAK,EAAa,EAAiB,CAEjC,IAAMp6B,EAAsB,KAAK,KAAkC,OACnE,GAAI,CAACA,EACH,OAEF,IAAMwmB,EAAQ,KAAK,MACnB,GAAI,CAACA,EACH,OAEF,GAAM,CACJ,WACEA,EACEslE,EAAS,KAAK,SAAW,CAACC,EAC1BC,EAAY,CAAC,KAAK,SAAWD,EAC7BE,EAAsBzlE,EAAM,QAAU,CAACulE,GAAWvlE,EAAM,OAASA,EAAM,eAAiB,EAE9F,GADA,KAAK,QAAUulE,EACX3xD,IAAgB2mC,EAAiB,CAC/BA,IACF,KAAK,MAAQ,GAEf,KAAK,MAAQ,GACRgrB,IACH,KAAK,WAAa,EACd/rF,EAAO,kBAAoB,CAACisF,GAAuB7xD,EAAc2mC,GACnE,KAAK,iBAAiB3mC,EAAa2mC,CAAe,GAGlD,KAAK,UAAY,GACnB,KAAK,cAAc3mC,CAAW,EAEhC,MACF,CACA,GAAI4xD,GAAaF,EAAQ,CACnBA,GACF,KAAK,cAAc1xD,CAAW,EAEhC,MACF,CACA,GAAI6xD,EAAqB,CACvB,KAAK,WAAa,EAClB,KAAK,cAAc7xD,CAAW,EAC1B,CAAC,KAAK,OAAS5T,EAAM,OAAS,KAAK,MACrC,KAAK,MAAQ4T,GAAe,EAC5B,KAAK,IAAI,QAAQve,EAAO,YAAa,CACnC,QAAS,EACX,CAAC,GAEH,MACF,CACA,GAAI,CAAC2hB,EAAa,YAAYhX,CAAK,CAAC,CAAC,OAAQ,CAC3C,KAAK,WAAa,EAClB,MACF,CACA,IAAMwqB,EAAaxT,EAAa,WAAWhX,EAAO4T,EAAa,CAAC,EAC1DmlB,EAAYvO,EAAW,WAAa,EACpCxW,EAAkB,KAAK,gBAC7B,GAAIuxD,GAAWvxD,GAAmB,KAAK,IAAK,CAC1C,IAAM0xD,EAAqBlyD,GAAsB,KAAK,IAAI,kBAAmBI,CAAW,EAClF+xD,EAAkBn7C,EAAW,IAAMtM,GACnC0nD,EAAe,CAAC7sC,GAAa2sC,GAAsB3sC,EAAYnlB,EAAcsK,IAAsB,CAAClK,EAAgB,mBAAmBJ,CAAW,EACxJ,GAAI+xD,GAAmBC,EACrB,OAEF,KAAK,MAAQ,EACf,CACA,IAAM/2C,EAA6B,KAAK,KAAmC,mBAC3E,GAAI,CAAC,KAAK,OAAS,KAAK,UAAY,MAAQ7a,EAAiB,CAE3D,GAAI,EADewW,EAAW,IAAM,IACjB,CAACuO,EAClB,OAEF,IAAM8sC,EAAY,KAAK,IAAI9sC,EAAWvO,EAAW,OAAS,CAAC,EAAI5W,EAEzDkyD,EADYj3C,GAAgB,MAAQA,EAAa,KACtBA,EAAa,eAAiB,EAAI3Q,GAC7D6nD,EAAWhyD,GAAuBH,EAAaI,CAAe,EACpE,GAAI6xD,EAAY,IAAMA,GAAaC,GAAmBC,GAAW,CAC1D/lE,EAAM,QACT,KAAK,mBAAmB+lE,CAAQ,EAElC,MACF,CACF,CACA,IAAMC,EAA+BxsF,EAAO,6BACtCysF,EAAO,KAAK,YAAY,IAAI,EAC5BC,EAAW,KAAK,QAClBC,EAAU,KAAK,QACnB,GAAIA,IAAY,KAAM,CACpB,GAAID,EAAW,GAAKD,EAAOC,EAAWF,EACpC,EAAU,KAAK,QAAUE,MACpB,CACL,KAAK,QAAUD,EACf,MACF,CACF,CACA,IAAMG,EAAkBH,EAAOE,EAC/B,GAAI,CAACZ,IAAYa,GAAmBJ,GAAgCE,IAAa,KAAK,IAAK,CAEzF,GAA0B,KAAK,aAAkD,aAAgB,SAAW,EAAEr3C,GAAgB,MAAQA,EAAa,OAAS,KAAK,IAAIjb,GAAgBib,GAA6C,MAAS,EAAE,EAAI,EAAG,CAClP,GAAI,KAAK,MACP,OAEF,KAAK,MAAQjb,GAAe,EAC5B,KAAK,IAAI,QAAQve,EAAO,YAAa,CACnC,QAAS,EACX,CAAC,EACD,MACF,CAEA,GADA,KAAK,aAAam1B,CAAU,EACxB,CAAC,KAAK,OAAS,CAAC,KAAK,IACvB,MAEJ,CACA,IAAM67C,EAAoBrvD,EAAa,WAAWhX,EAAO4T,EAAap6B,EAAO,aAAa,EAC1F,KAAK,mBAAmB6sF,EAAmBD,EAAiBxyD,CAAW,CACzE,CACA,cAAc,EAAa,CACzB,IAAMuyD,EAAU,KAAK,QACrB,GAAIA,GAAW,KAAK,MAClB,KAAK,QAAU,KACX,KAAK,eAAe,CACtB,IAAMC,EAAkB,KAAK,YAAY,IAAI,EAAID,EACjD,KAAK,IAAI,+BAA+BvyD,EAAY,UAAU,KAAK,MAAMwyD,CAAe,EAAE,GAAG,EAC7F,KAAK,cAAgB,GACrB,KAAK,QAAU,EACf,KAAK,IAAI,QAAQ/wE,EAAO,eAAgB,CAAC,CAAC,CAC5C,CAEJ,CACA,iBAAiB,EAAa,EAAiB,CAC7C,IAAIixE,EACJ,IAAMC,EAAsB,KAAK,SAAS,MAC1C,GAAI,KAAK,KAAO,KAAK,OAAS,KAAK,kBAAoB,EAAuB,KAAK,SAAS,QAAU,MAAQD,EAAqB,QAAUC,GAAuBA,EAAoB,OAAS,GAAK3yD,EAAc2yD,EAAoB,IAAI,CAAC,EAAG,CAC9O,IAAMC,EAAkBxvD,EAAa,aAAaA,EAAa,kBAAkB,KAAK,SAAS,KAAK,EAAGpD,EAAa,CAAC,EACrH,GAAI4yD,EAAgB,IAAM,GAAKjsB,GAAmBisB,EAAgB,MAAO,CACvE,IAAMC,EAAazvD,EAAa,kBAAkBuvD,CAAmB,EAC/DG,EAAoB1vD,EAAa,aAAayvD,EAAYlsB,EAAiB,CAAC,CAAC,CAAC,cACpF,GAAImsB,EAAoB,IAAMA,EAAoBD,EAAW,OAAS,EAAG,CACvE,IAAM/tC,EAAgB1hB,EAAa,aAAayvD,EAAY7yD,EAAa,CAAC,CAAC,CAAC,cACtE+yD,EAAYF,EAAWC,EAAkB,CAAC,IAC1CE,EAAUH,EAAWC,EAAoB,EAAE,CAAC,MAClD,IAAKhuC,IAAkB,IAAMA,EAAgBguC,IAAsBE,EAAUD,EAAY,GAAK/yD,EAAc+yD,EAAY,EAAG,CACzH,IAAM5lF,EAAQ,gBAAI,MAAM,qEAAqE6yB,EAAY,SAAS+yD,EAAU,MAAMC,EAAQ,mBAAmBluC,GAAe,EAC5K,KAAK,KAAK33C,EAAM,OAAO,EACvB,KAAK,MAAM,aAAe,KAC1B,IAAIvc,EAAOuvC,GAAuBH,EAAa,KAAK,eAAe,EAC/DpvC,GAAQ,aAAcA,EACxB,EAAOA,EAAK,SACP,AACLA,IAAO,IAAK,GAEd,IAAMgmD,EAAaxT,EAAa,WAAW,KAAK,MAAOpD,EAAa,CAAC,EACrE,KAAK,IAAI,QAAQve,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,sBACtB,MAAO,GACP,QACA,OAAQD,EAAM,QACd,OACA,OAAQypC,EAAW,IACnB,YACF,CAAC,CACH,CACF,CACF,CACF,CACF,CACA,mBAAmB,EAAY,EAAmB,EAAa,CAE7D,GAAM,CACJ,kBACA,SACE,KACEhxC,EAAuB,KAAK,KAAmC,OACrE,GAAI,CAACwmB,GAAS,CAACgU,GAAmB,CAACx6B,EACjC,OAEF,IAAMq1C,EAA6B,KAAK,KAAmC,mBACrEk3C,EAAWhyD,GAAuBH,EAAaI,CAAe,EACpE,IAAI+xD,GAAYl3C,GAAgB,MAAQA,EAAa,MAAQjb,EAAcib,EAAa,iBACnE,KAAK,mBAAmBk3C,CAC9B,GAAK,CAAC,KAAK,OACtB,OAGJ,IAAM1nC,EAAiB7T,EAAW,SAC5Bq8C,EAAoB,KAAK,kBAAkBr8C,EAAY5W,CAAW,GACnEyqB,GAAkBA,EAAe,OAAS,GAAK7T,EAAW,IAAMhxC,EAAO,eAAiBgxC,EAAW,YAAcA,EAAW,UAAY5W,EAAcp6B,EAAO,eAAiBqtF,MAAwBC,EAAoBttF,EAAO,yBAA2B,KAAO,KAAK,WAC3Q,KAAK,KAAK,2CAA2C,EACrD,KAAK,gBAAgBgxC,CAAU,EAEnC,CACA,kBAAkB,EAAY,EAAa,CACzC,IAAMxW,EAAkB,KAAK,gBACvB+kB,EAAYvO,EAAW,UAC7B,GAAIxW,GAAmB+kB,EAAW,CAChC,IAAMgjB,EAAU/nC,EAAgB,aAAaJ,EAAaK,EAAkB,IAAI,EAC1E0wC,EAAO3wC,EAAgB,aAAa+kB,EAAW9kB,EAAkB,IAAI,EAC3E,GAAI8nC,GAAW4I,EACb,OAAOA,EAAK,GAAK5I,EAAQ,GAAK,CAElC,CACA,MAAO,EACT,CACA,aAAa,EAAY,CACvB,GAAM,CACJ,MACA,QACA,gBACA,WACE,KACJ,GAAI,CAACgrB,GAAiBZ,IAAY,MAAQnmE,GAAS7gB,EAAK,CACtD,KAAK,cAAgB,GACrB,IAAM4B,EAAQ,gBAAI,MAAM,yBAAyBif,EAAM,YAAY,sBAAsB1jB,EAAUkuC,CAAU,EAAE,EAAE,EACjH,KAAK,KAAKzpC,EAAM,OAAO,EACvB5B,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,YACjB,QAASlD,EAAa,qBACtB,MAAO,GACP,QACA,OAAQwpC,EAAW,IACnB,aACA,QAAS,CACP,MAAO27C,CACT,CACF,CAAC,CACH,CACF,CACA,mBAAmB,EAAU,CAE3B,GAAM,CACJ,kBACA,SACE,KACE3sF,EAAuB,KAAK,KAAmC,OACrE,GAAI,CAACwmB,GAAS,CAACgU,GAAmB,CAACx6B,EACjC,MAAO,GAET,IAAMo6B,EAAc5T,EAAM,YACpBwqB,EAAaxT,EAAa,WAAWhX,EAAO4T,EAAa,CAAC,EAC1DnV,EAAYmV,EAAc4W,EAAW,MAAQA,EAAW,MAAQA,EAAW,UACjF,GAAI/rB,GAAa,KAAK,IAAK,CACzB,IAAMuoE,EAAgBx8C,EAAW,KAAOhxC,EAAO,cACzCytF,EAAUz8C,EAAW,IAAM,GAAKA,EAAW,IAAM,GAAKxqB,EAAM,WAAa,EACzEknE,EAAYzoE,EAAYmV,EAC9B,GAAIszD,EAAY,IAAMF,GAAiBC,GAAU,CAC/C,GAAIC,EAAY1tF,EAAO,cAAe,CACpC,IAAI2tF,EAAW,GACf,GAAIvzD,IAAgB,EAAG,CACrB,IAAMwzD,EAAYpzD,EAAgB,gBAAgB,EAAGC,EAAkB,IAAI,EACvEmzD,GAAa3oE,EAAY2oE,EAAU,MACrC,EAAW,GAEf,CACA,GAAI,CAACD,GAAYpB,EAAU,CACzB,IAAIsB,EAKJ,GAJI,GAAG,EAAwB,KAAK,IAAI,eAAiB,MAAQA,EAAsB,UAG5D7zD,GAAsB,KAAK,IAAI,kBAAmB/U,CACxD,EACnB,MAAO,GAET,IAAI6oE,EAAa,GACbzmF,EAAMklF,EAAS,IACnB,KAAOllF,EAAM4d,GAAW,CACtB,IAAM8oE,EAAcxzD,GAAuBlzB,EAAKmzB,CAAe,EAC/D,GAAIuzD,EACF,GAAOA,EAAY,aACd,CACL,EAAa,GACb,KACF,CACF,CACA,GAAID,EACF,MAAO,EAEX,CACF,CACA,IAAME,EAAa,KAAK,IAAI/oE,EAAY2f,GAAyBxK,EAAcuK,EAA6B,EAI5G,GAHA,KAAK,KAAK,6CAA6CvK,EAAY,MAAM4zD,GAAY,EACrF,KAAK,MAAQ,GACb,EAAM,YAAcA,EAChB,EAAEzB,GAAY,MAAQA,EAAS,KAAM,CACvC,IAAMhlF,EAAQ,gBAAI,MAAM,mDAAmD6yB,EAAY,MAAM4zD,GAAY,EACnGvjF,EAAY,CAChB,KAAMC,EAAW,YACjB,QAASlD,EAAa,sBACtB,MAAO,GACP,QACA,OAAQD,EAAM,QACd,OAAQypC,EAAW,IACnB,YACF,EACIu7C,IACE,aAAcA,EAChB,EAAU,KAAOA,EAEjB,EAAU,KAAOA,GAGrB,KAAK,IAAI,QAAQ1wE,EAAO,MAAOpR,CAAS,CAC1C,CACA,OAAOujF,CACT,CACF,CACA,MAAO,EACT,CACA,gBAAgB,EAAY,CAC1B,GAAM,CACJ,MACA,QACA,cACE,KACEhuF,EAAS2F,GAA2B,OAC1C,GAAI,CAAC6gB,GAAS,CAACxmB,EACb,MAAO,GAET,IAAMo6B,EAAc5T,EAAM,YAE1B,GADA,KAAK,aACDynE,EAAajuF,EAAO,cAAe,CACrC,IAAMguF,EAAa5zD,GAAe6zD,EAAa,GAAKjuF,EAAO,YACrDuH,EAAQ,gBAAI,MAAM,8BAA8B6yB,EAAY,MAAM4zD,GAAY,EACpF,KAAK,KAAKzmF,EAAM,OAAO,EACvB,EAAM,YAAcymF,EACpBroF,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,YACjB,QAASlD,EAAa,sBACtB,QACA,MAAO,GACP,OAAQwpC,EAAW,IACnB,YACF,CAAC,CACH,KAAO,CACL,IAAMzpC,EAAQ,gBAAI,MAAM,yDAAyD6yB,EAAY,SAASp6B,EAAO,cAAc,QAAQ,EACnI,KAAK,MAAMuH,EAAM,OAAO,EACxB5B,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,YACjB,QAASlD,EAAa,qBACtB,QACA,MAAO,GACP,OAAQwpC,EAAW,IACnB,YACF,CAAC,CACH,CACF,CACF,EA4BM,GAAmB,IAoBnB,QAAyB,CAC7B,IAAMpW,EAAMF,GAAY,EACxB,GAAI,CACFE,GAAO,IAAIA,EAAI,EAAG,IAA0B,EAAE,CAChD,MAAY,CACV,OAAO,OAAO,SAChB,CACA,MAAO,IACT,EAAA,CAAG,EACG,GAAN,KAAyB,CACvB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,SAAW,KAChB,KAAK,MAAQ,KACb,KAAK,sBAAwB,CAAC,EAC9B,KAAK,WAAa,GAClB,KAAK,SAAW,IAAK,GACrB,KAAK,oBAAwB,CACtB,KAAK,KAGV,KAAK,IAAI,QAAQ/e,EAAO,gBAAiB,CAAC,CAAC,CAC7C,EACA,KAAK,IAAMlW,EACX,KAAK,mBAAmB,CAC1B,CACA,SAAU,CACR,KAAK,qBAAqB,EAC1B,KAAK,SAAW,KAChB,KAAK,MAAQ,KACb,KAAK,sBAAwB,CAAC,EAC9B,KAAK,IAAM,KAAK,gBAAkB,IACpC,CACA,oBAAqB,CACnB,GAAM,CACJ,OACE,KACAA,IACFA,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,kBAAmB,KAAK,kBAAmB,IAAI,EAEjE,CACA,sBAAuB,CACrB,GAAM,CACJ,OACE,KACAlW,IACFA,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,kBAAmB,KAAK,kBAAmB,IAAI,EAElE,CACA,iBAAiB,EAAO,EAAM,CAE5B,KAAK,MAAQrwB,EAAK,MACMA,EAAK,WAA8C,aAAgB,KACzF,KAAK,WAAa,GAEtB,CACA,iBAAkB,CAEhB,IAAMgV,EAAuB,KAAK,KAAkC,mBAChEA,GACF,KAAK,oBAAoBA,CAAO,CAEpC,CACA,iBAAiB,EAAO,EAAM,CAC5B,KAAK,MAAQ,KACe,GAAK,gBAIjC,AAIE,KAAK,YAHD,KAAK,YACPquB,GAAiB,KAAK,SAAU,KAAK,eAAe,EAEtC,MAElB,KAAK,sBAAwB,CAAC,EAChC,CACA,mBAAoB,CAClB,KAAK,sBAAwB,CAAC,CAChC,CACA,YAAY,EAAO,CACjB,IAAMvgC,EAAQ,KAAK,YAAYk4B,EAAM,UAAU,EAE/C,MADA,GAAM,KAAO,SACNl4B,CACT,CACA,YAAY,EAAY,CACtB,GAAK,KAAK,MAGV,KAAK,IAAIzH,EAAI,EAAGA,EAAI2sF,EAAW,OAAQ,IAAK,CAC1C,IAAMttD,EAAYstD,EAAW3sF,GAC7B,GAAIq/B,EAAU,OAAS,YAAcA,EAAU,QAAU,MAEvD,OADAmI,GAAkBnI,EAAW,KAAK,KAAK,EAChCA,CAEX,CACA,OAAO,KAAK,MAAM,aAAa,WAAY,KAAK,CADhD,CAEF,CACA,sBAAsB,EAAO,EAAM,CACjC,GAAI,CAAC,KAAK,OAAS,CAAC,KAAK,IACvB,OAEF,GAAM,CACJ,yBACA,yBACE,KAAK,IAAI,OACb,GAAI,CAACgoE,GAA0B,CAACC,EAC9B,OAEF,GAAM,CACJ,WACE3iG,EACJ,AACE,KAAK,WAAW,KAAK,YAAY,KAAK,KAAK,EAE7C,IAAMovC,EAAMF,GAAY,EACxB,GAAKE,EAGL,IAAK,IAAI/zC,EAAI,EAAGA,EAAImR,EAAQ,OAAQ,IAAK,CACvC,IAAM9Q,EAAO8Q,EAAQnR,EAAE,CAAC,KACxB,GAAIK,IAASw3C,GAAe,MAAQ,CAACwvD,GAA0B,CAACC,EAC9D,SAEF,IAAM/uE,EAASD,GAAannB,EAAQnR,EAAE,CAAC,IAAI,EACrCo+B,EAAYjtB,EAAQnR,EAAE,CAAC,IACzBwpB,EAAU4U,EAAYjtB,EAAQnR,EAAE,CAAC,SACjCwpB,EAAU20B,KACZ,EAAUA,IAEK30B,EAAU4U,GACX,IACd,EAAUA,EAAY8f,IAExB,IAAK,IAAIpxC,EAAI,EAAGA,EAAIyrB,EAAO,OAAQ,IAAK,CACtC,IAAMd,EAAQc,EAAOzrB,GACrB,GAAI,CAAC8rB,GAAoBnB,CAAK,EAAG,CAC/B,KAAK,iBAAiB2G,EAAW/9B,CAAI,EACrC,IAAMunC,EAAMkM,GAAwBC,EAAK3V,EAAW5U,EAASiO,EAAOp3B,CAAI,EACpEunC,GACF,KAAK,SAAS,OAAOA,CAAG,CAE5B,CACF,CACF,CACF,CACA,iBAAiB,EAAW,EAAM,CAEhC,IAAMO,EAAyB,KAAK,UAA4C,KAChF,GAAIA,EACF,IAAK,IAAInoC,EAAImoC,EAAK,OAAQ,KAAO,CAC/B,IAAMP,EAAMO,EAAKnoC,GACb4nC,EAAI,OAASvnC,GAAQunC,EAAI,UAAYxJ,GAAawJ,EAAI,UAAYuW,KACpE,EAAI,QAAU/f,EAElB,CAEJ,CACA,iBAAiB,EAAO,CACtB,cACA,YACA,QACC,CACD,GAAM,CACJ,WACA,OACE,KACJ,GAAI,CAACtf,EACH,OAEF,GAAM,CACJ,OAAQ,CACN,yBACA,0BAEAA,EACJ,GAAIwlD,IAAa+iC,GAA0BC,GAAwB,CACjE,IAAI57F,EACJ,AAKEA,EALErL,IAAS,QACE,GAAQunC,EAAI,OAASiQ,GAAe,UAAYyvD,EACpDjnG,IAAS,QACL,GAAQunC,EAAI,OAASiQ,GAAe,MAAQwvD,EAE5C,GAAQz/D,EAAI,OAASiQ,GAAe,UAAYyvD,GAAyB1/D,EAAI,OAASiQ,GAAe,MAAQwvD,EAE5Hn/D,GAAkBo8B,EAAU9F,EAAaC,EAAW/yD,CAAS,CAC/D,CACF,CACA,eAAe,EAAO,CACpB,WACC,CACD,KAAK,oBAAoBiO,EAAS,EAAI,CACxC,CACA,kBAAkB,EAAO,EAAM,CACzB,KAAK,IAAIhV,EAAK,KAAK,EAAI,KACzB,KAAK,oBAAoBA,EAAK,OAAO,CAEzC,CACA,oBAAoB,EAAS,EAAe,CAC1C,GAAI,CAAC,KAAK,KAAO,CAAC,KAAK,MACrB,OAEF,GAAM,CACJ,gBACA,iBACA,8BACA,2BACE,KAAK,IAAI,OACb,GAAI,CAAC4iG,EACH,OAEF,IAAMxzD,EAAMF,GAAY,EACxB,GAAI2zD,GAAiB3kC,GAAkB,CAAC4kC,EAAyB,CAC/D,GAAM,CACJ,gBACA,eACE9tF,EACAiuB,EAAM,KAAK,SACXA,GACF,EAAI,UAAY8/D,EAChB,EAAI,QAAUC,GACL5zD,IACT,EAAM,KAAK,SAAWD,GAAwBC,EAAK2zD,EAAeC,EAAa,CAC7E,cAAe,KAAK,IAAI,OAAO,aACjC,EAAG,0BAA0B,EACzB//D,IACF,EAAI,GAAK4/D,EACT,AAAkB,KAAK,WAAW,KAAK,YAAY,KAAK,KAAK,EAC7D,KAAK,SAAS,OAAO5/D,CAAG,EACxBA,EAAI,iBAAiB,QAAS,KAAK,eAAe,GAGxD,CACA,GAAI,CAACjuB,EAAQ,mBACX,OAEF,GAAM,CACJ,YACE,KACE,CACJ,cACEA,EACEu1E,EAAM,OAAO,KAAK1gE,CAAU,EAC9Bo5E,EAAwB,KAAK,sBACjC,GAAItjC,GAAYujC,EAAe,CAC7B,IAAIC,EACJ,IAAK,EAAiBxjC,EAAS,OAAS,MAAQwjC,EAAe,OAAQ,CACrE,IAAMC,EAAc,OAAO,KAAKH,CAAqB,CAAC,CAAC,OAAQ,GAAO,CAAC1Y,EAAI,SAAS5uF,CAAE,CAAC,EACvF,IAAK,IAAIN,EAAI+nG,EAAY,OAAQ,KAAO,CAEtC,IAAMznG,EAAKynG,EAAY/nG,GACjBmoC,EAAgCy/D,EAAsBtnG,EAAA,EAA8C,KAC1G,OAAOsnG,EAAsBtnG,GACzB6nC,GACF,OAAO,KAAKA,CAAI,CAAC,CAAC,QAAS,GAAQ,CACjC,IAAMP,EAAMO,EAAKznC,GACjB,GAAIknC,EAAK,CACPA,EAAI,oBAAoB,QAAS,KAAK,eAAe,EACrD,GAAI,CACF08B,EAAS,UAAU18B,CAAG,CACxB,MAAY,CACZ,CACF,CACF,CAAC,CAEL,CACF,KACE,GAAwB,KAAK,sBAAwB,CAAC,CAE1D,CACA,IAAM9e,EAAenP,EAAQ,UAAUA,EAAQ,UAAU,OAAS,GAClE,GAAIu1E,EAAI,SAAW,GAAM5iF,EAAewc,GAA6C,eAAe,EAGpG,CAAkB,KAAK,WAAW,KAAK,YAAY,KAAK,KAAK,EAC7D,IAAK,IAAI9oB,EAAI,EAAGA,EAAIkvF,EAAI,OAAQ,IAAK,CACnC,IAAM5uF,EAAK4uF,EAAIlvF,GACTkpB,EAAYsF,EAAWluB,GACvB89B,EAAYlV,EAAU,UACtB8+E,EAAwBJ,EAAsBtnG,GAC9C6nC,EAAQ6/D,GAA+D,MAAS,CAAC,EACnFC,EAAiBD,GAA+D,eAAkB,GAClGx+E,EAAU20B,GACR,CACJ,WACA,WACEj1B,EACJ,GAAIswC,GAAWv5C,IAAa,KAC1B,EAAUme,EAAYne,EACtB,EAAgB,QACX,GAAIiJ,EAAU,WAAa,CAAC++E,EAAe,CAChD,IAAMC,EAA6BhZ,EAAI,QAAQ,EAAoB,IAAQ,CACzE,GAAIiZ,IAAQj/E,EAAU,GAAI,CACxB,IAAMk/E,EAAiB55E,EAAW25E,GAClC,GAAIC,EAAe,QAAUl/E,EAAU,OAASk/E,EAAe,UAAYl/E,EAAU,YAAc,CAACm/E,GAAsBn/E,EAAU,UAAYm/E,EAAmB,WACjK,OAAOD,CAEX,CACA,OAAOC,CACT,EAAG,IAAI,EACHH,IACF,EAAUA,EAA2B,UACrC,EAAgB,GAEpB,CACA,IAAMhtC,EAAa,OAAO,KAAKhyC,EAAU,IAAI,EAC7C,IAAK,IAAIpc,EAAI,EAAGA,EAAIouD,EAAW,OAAQ,IAAK,CAC1C,IAAMx6D,EAAMw6D,EAAWpuD,GACvB,GAAI,CAACoY,GAAwBxkB,CAAG,EAC9B,SAEF,IAAMknC,EAAMO,EAAKznC,GACjB,GAAIknC,EACEqgE,GAAiB,EAAED,GAAyB,MAAQA,EAAsB,eAC5E,EAAI,QAAUx+E,EACL,KAAK,IAAIoe,EAAI,UAAYxJ,CAAS,EAAI,MAC/C,EAAI,UAAYA,EAChB,EAAI,QAAU5U,QAEX,GAAIuqB,EAAK,CACd,IAAIpvC,EAAOukB,EAAU,KAAKxoB,GACtB0kB,GAAkB1kB,CAAG,IACvB,EAAO+B,EAAiBkC,CAAI,GAM9B,IAAM80D,EAAO3lB,GAAwBC,EAAK3V,EAAW5U,EAAS,CAH5D,MACA,MAEkE,EAAGquB,GAAe,SAAS,EAC3F4hB,IACF,EAAK,GAAKn5D,EACV,KAAK,SAAS,OAAOm5D,CAAI,EACzB,EAAK/4D,GAAO+4D,EACRguC,IACE/mG,IAAQ,gBAAkBA,IAAQ,gBACpC+4D,EAAK,iBAAiB,QAAS,KAAK,eAAe,EAI3D,CACF,CACA,EAAsBn5D,GAAM,CAC1B,OACA,YACA,eACF,CACF,CAxE6D,CAyE/D,CACF,EACM,GAAN,KAAwB,CACtB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,OAAS,IAAK,GACnB,KAAK,MAAQ,KACb,KAAK,YAAc,EACnB,KAAK,WAAa,EAClB,KAAK,SAAW,KAChB,KAAK,sBAAwB,GAC7B,KAAK,iBAAqB,CACxB,GAAM,CACJ,SACE,KACEkuD,EAAe,KAAK,aAC1B,GAAI,CAAC7uB,GAAS,CAAC6uB,EACb,OAEF,KAAK,YAAc7uB,EAAM,YACzB,IAAM2oE,EAAU,KAAK,eAAe,EACpC,GAAIA,IAAY,KACd,OAEF,KAAK,SAAWA,EAChB,GAAM,CACJ,iBACA,2BACE,KAAK,OACT,GAAI,CAACtsB,GAAkBusB,IAA4B,GAAK,CAAC/5C,EAAa,KACpE,OAEF,IAAMg6C,EAAgB,KAAK,cAC3B,GAAIA,IAAkB,KACpB,OAEF,IAAMC,EAAqBH,EAAUE,EAGrC,GADoBC,EADW,KAAK,IAAI,KAAK,WAAYD,EAAgBh6C,EAAa,cACxB,GAC3Ci6C,EAAqB,KAAQ,KAAK,oBAAsB,EAAG,CAC5E,IAAM/jB,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG6jB,CAAuB,CAAC,EACtDG,EAAO,KAAK,MAAM,GAAK,EAAI,KAAK,IAAI,KAAQD,EAAqB,KAAK,WAAW,GAAK,EAAE,EAAI,GAC5Fp+C,EAAe,KAAK,IAAIq6B,EAAK,KAAK,IAAI,EAAGgkB,CAAI,CAAC,EACpD,KAAK,wBAAwB/oE,EAAO0qB,CAAY,CAClD,MAAW1qB,EAAM,eAAiB,GAAKA,EAAM,eAAiB,GAC5D,KAAK,wBAAwBA,EAAO,CAAC,CAEzC,EACA,KAAK,IAAM7gB,EACX,KAAK,OAASA,EAAI,OAClB,KAAK,kBAAkB,CACzB,CACA,IAAI,cAAe,CAEjB,OAAqB,KAAK,KAAkC,oBAAuB,IACrF,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,UAAY,CAC1B,CACA,IAAI,YAAa,CACf,GAAM,CACJ,UACE,KACJ,GAAI3F,EAAO,yBAA2B,IAAK,GACzC,OAAOA,EAAO,uBAEhB,IAAMq1C,EAAe,KAAK,aAC1B,OAAOA,EAAer1C,EAAO,4BAA8Bq1C,EAAa,eAAiB,CAC3F,CACA,IAAI,eAAgB,CAClB,IAAMA,EAAe,KAAK,aAC1B,GAAIA,IAAiB,MAAQ,KAAK,MAAQ,KACxC,OAAO,KAET,GAAM,CACJ,WACA,eACA,kBACEA,EACE,CACJ,mBACA,wBACA,kBACE,KAAK,OACHpc,EAAa,KAAK,IAAI,WACxBo2D,EAAgBxsB,GAAiB2sB,GAAgBC,GACjD,KAAK,uBAAyBx2D,EAAW,kBAAoBA,EAAW,uBAAyBo2D,IAAkB,KACrH,EAAgBK,IAAqB,IAAK,GAAuBC,EAAwBC,EAA3CF,GAEhD,IAAMG,EAA6BD,EACnC,OAAOP,EAAgB,KAAK,IAAI,KAAK,WAAa,KAAK,OAAO,wBAAyBQ,CAA0B,CACnH,CACA,IAAI,cAAc,EAAS,CACzB,KAAK,WAAa,EAClB,KAAK,OAAO,iBAAmBV,EAC/B,KAAK,sBAAwB,EAC/B,CACA,IAAI,kBAAmB,CACrB,IAAMW,EAAW,KAAK,iBAAiB,EACjCT,EAAgB,KAAK,cAC3B,GAAIS,IAAa,MAAQT,IAAkB,KACzC,OAAO,KAET,IAAMh6C,EAAe,KAAK,aAC1B,GAAIA,IAAiB,KACnB,OAAO,KAET,IAAMlgC,EAAOkgC,EAAa,KACpB06C,EAAeD,EAAWT,EAAgB,KAAK,YAC/CW,EAAM76E,EAAOkgC,EAAa,cAC1Bk2B,EAAMp2D,GAAQ,KAAK,OAAO,gBAAkBkgC,EAAa,YAAcA,EAAa,gBAC1F,OAAO,KAAK,IAAI,KAAK,IAAI26C,EAAKD,CAAY,EAAGxkB,CAAG,CAClD,CACA,IAAI,OAAQ,CACV,IAAMl2B,EAAe,KAAK,aAI1B,OAHIA,IAAiB,KACZ,EAEFA,EAAa,KACtB,CACA,IAAI,aAAc,CAChB,IAAMA,EAAe,KAAK,aAC1B,GAAIA,IAAiB,KACnB,MAAO,GAET,IAAM46C,GAAqB,KAAK,OAAO,gBAAkB56C,EAAa,YAAcA,EAAa,gBAAkB,EACnH,OAAO,KAAK,IAAIA,EAAa,IAAM46C,EAAmB,CAAC,CACzD,CACA,IAAI,qBAAsB,CACxB,GAAM,CACJ,SACE,KACE56C,EAAe,KAAK,aAC1B,GAAI,CAAC7uB,GAAS,CAAC6uB,EACb,MAAO,GAET,IAAMwP,EAAiBr+B,EAAM,SAAS,OACtC,OAAQq+B,EAAiBr+B,EAAM,SAAS,IAAIq+B,EAAiB,CAAC,EAAIxP,EAAa,MAAQ,KAAK,WAC9F,CACA,SAAU,CACR,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,IAAM,IACb,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACC1vC,IAGLA,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,EACzC,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACClW,IAGLA,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,EAC1C,CACA,gBAAgB,EAAO,EAAM,CAC3B,KAAK,MAAQrwB,EAAK,MAClB,KAAK,MAAM,iBAAiB,aAAc,KAAK,YAAY,CAC7D,CACA,kBAAmB,CACjB,AAEE,KAAK,SADL,KAAK,MAAM,oBAAoB,aAAc,KAAK,YAAY,EACjD,KAEjB,CACA,mBAAoB,CAClB,KAAK,SAAW,KAChB,KAAK,WAAa,CACpB,CACA,eAAe,EAAO,CACpB,WACC,CACGgV,EAAQ,UACV,KAAK,aAAa,EAEhB,CAACA,EAAQ,MAAQ,KAAK,OACxB,KAAK,MAAM,oBAAoB,aAAc,KAAK,YAAY,CAElE,CACA,QAAQ,EAAO,EAAM,CACnB,IAAI0vF,EACA1kG,EAAK,UAAYgc,EAAa,uBAGlC,KAAK,aACD,KAAK,MAAQ,EAAqB,KAAK,eAAiB,MAAQ0oF,EAAmB,MACrF,KAAK,IAAI,OAAO,KAAK,gEAAgE,EAEzF,CACA,wBAAwB,EAAO,EAAc,CAC3C,IAAI5b,EACA9tD,EAAM,eAAiB0qB,KAG1B,EAAa,KAAK,MAAQ,MAAQojC,EAAW,OAAO,MAAM,iCAAiC,KAAK,QAAQ,QAAQ,CAAC,EAAE,kBAAyC,KAAK,eAAsD,QAAQ,CAAC,EAAE,wBAAwB,KAAK,oBAAoB,QAAQ,CAAC,EAAE,iCAAiC9tD,EAAM,aAAa,MAAM0qB,GAAc,EACvW,EAAM,aAAeA,EACvB,CACA,kBAAmB,CACjB,IAAMmE,EAAe,KAAK,aAI1B,OAHIA,IAAiB,KACZ,KAEFA,EAAa,KAAOA,EAAa,GAC1C,CACA,gBAAiB,CACf,IAAMy6C,EAAW,KAAK,iBAAiB,EAIvC,OAHIA,IAAa,KACR,KAEFA,EAAW,KAAK,WACzB,CACF,EACM,GAAN,cAA8B/uD,EAAuB,CACnD,YAAY,EAAK,EAA2B,CAC1C,MAAMp7B,EAAK,kBAAkB,EAC7B,KAAK,QAAU,CAAC,EAChB,KAAK,YAAc,GACnB,KAAK,cAAgB,GACrB,KAAK,YAAc,IAAK,GACxB,KAAK,aAAe,KACpB,KAAK,kBAAoB,GACzB,KAAK,iBAAmB,GACxB,KAAK,SAAW,IAAK,GACrB,KAAK,iBAAmB,IAAK,GAC7B,KAAK,SAAWwqF,EAChB,KAAK,mBAAmB,CAC1B,CACA,oBAAqB,CACnB,GAAM,CACJ,OACE,KACJxqF,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,MAAO,KAAK,QAAS,IAAI,CACzC,CACA,sBAAuB,CACrB,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,MAAO,KAAK,QAAS,IAAI,CAC1C,CACA,SAAU,CACR,KAAK,qBAAqB,EAC1B,KAAK,SAAW,KAChB,KAAK,YAAY,EACjB,MAAM,QAAQ,CAChB,CACA,UAAW,CAET,KADoB,QACb,QAAS,GAAU,CACxB,EAAM,UAAY,EAClB,EAAM,cAAgB,CACxB,CAAC,EACD,MAAM,SAAS,CACjB,CACA,aAAc,CACZ,KAAK,YAAc,IAAK,GACxB,KAAK,iBAAmB,GACxB,KAAK,kBAAoB,GACzB,KAAK,aAAe,KACpB,KAAK,QAAU,CAAC,EAChB,KAAK,cAAgB,EACvB,CACA,kBAAkB,EAAO,EAAM,CAC7B,KAAK,YAAY,CACnB,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAM/zB,EAA2B,KAAK,IAAI,OAAO,yBAC3Cwb,EAAS,CAAC,EACV8sF,EAAe,CAAC,EAChBC,EAAqB,CAAC,EACxBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GACtBhlG,EAAK,OAAO,QAAS,GAAgB,CACnC,IAAMu2D,EAAa0uC,EAAY,MAC3B,CACF,aACA,cACEA,EACA9wF,IACF,EAAY,WAAa,EAAatE,GAAuBsE,EAAY7X,CAAwB,GAAK,IAAK,IAE7G,AACE4S,IAAa,EAAY,WAAauB,GAAoBvB,CAAU,EAEtE,GAAM,CACJ,QACA,SACA,iBACE+1F,EACEC,EAAgCC,GAA+C,QAAW,EAIhG,GAHA,AAAoBL,IAAkB,CAAC,EAAEtxF,GAASC,GAClD,AAAoBsxF,IAAkB,CAAC,CAAC71F,EACxC,AAAoB81F,IAAkB,CAAC,CAAC7wF,EACpC+wF,GAAgC/wF,GAAc,CAAC,KAAK,iBAAiBA,CAAU,GAAKjF,GAAc,CAAC,KAAK,iBAAiBA,CAAU,EAAG,CACxI,KAAK,IAAI,qCAAqCqnD,EAAW,OAAO,EAAE,EAClE,MACF,CACA,GAAM,CACJ,SACA,aAAc6uC,EACd,aAAcC,EACd,aAAcC,EACd,aACA,cAAeC,GACbhvC,EAEE1S,EAAW,GAAG,GADayhD,GAAW,IAAI,KACJL,EAAY,QAAQ,GAAGO,EAAW,GAAGJ,EAAU,GAAGK,EAAO,GAAGF,EAAY,GAAGF,IACvH,GAAI,CAACT,EAAa/gD,GAAW,CAC3B,IAAM5+C,EAAQ,KAAK,YAAYggG,CAAW,EAC1C,EAAaphD,GAAY5+C,EACzB,EAAmB4+C,GAAY,EAC/B/rC,EAAO,KAAK7S,CAAK,CACnB,MAAO,GAAI2/F,EAAa/gD,EAAS,CAAC,MAAQohD,EAAY,KAAO,CAACA,EAAY,MAAM,cAAe,CAC7F,IAAMS,EAAe,EAAmB7hD,IAAa,EACrD,EAAY,MAAM,cAAoB,MAAM6hD,EAAe,CAAC,CAAC,CAAC,KAAK,GAAG,EACtE,IAAMzgG,EAAQ,KAAK,YAAYggG,CAAW,EAC1C,EAAaphD,GAAY5+C,EACzB6S,EAAO,KAAK7S,CAAK,CACnB,MACE2/F,EAAa/gD,EAAS,CAAC,WAAW,QAAS0S,EAAW,KAAK,EAC3DquC,EAAa/gD,EAAS,CAAC,WAAW,OAAQ0S,EAAW,SAAS,CAElE,CAAC,EACD,KAAK,0BAA0Bz+C,EAAQ9X,EAAM8kG,EAAiBC,EAAiBC,CAAe,CAChG,CACA,YAAY,EAAa,CACvB,IAAM//F,EAAQ,IAAI+rC,GAAMi0D,CAAW,EAC7B9hG,EAAe8hG,EAAY,aACjC,GAAI9hG,GAAgB,MAAQA,EAAa,YAAc,CAAC,KAAK,iBAAiBA,EAAa,UAAU,EAAG,CACtG,IAAM4Y,EAAQ,gBAAI,MAAM,sCAAsC5Y,EAAa,WAAW,EAAE,EACxF,KAAK,IAAI4Y,EAAM,OAAO,EACtB,EAAM,gBAAkB5K,GAAqB4K,EAAO,CAAC,CAAC,CACxD,CACA,OAAO9W,CACT,CACA,iBAAiB,EAAO,CACtB,OAAO4J,GAA8B3L,EAAO,QAAS,KAAK,IAAI,OAAO,wBAAwB,CAC/F,CACA,iBAAiB,EAAO,CACtB,OAAO2L,GAA8B3L,EAAO,QAAS,KAAK,IAAI,OAAO,wBAAwB,CAC/F,CACA,0BAA0B,EAAgB,EAAM,EAAiB,EAAiB,EAAiB,CAEjG,IAAI2yE,EAAc,CAAC,EACf6R,EAAiB,CAAC,EAClB5vE,EAAS6tF,EACPC,EAA+B5lG,EAAK,OAAsC,SAAY,CAAC,EAS7F,IARK8kG,GAAmBC,IAAoBC,IAC1C,EAASltF,EAAO,QAAQ,CACtB,aACA,aACA,QACA,aACK,CAAC,CAAC5I,GAAc,CAAC,EAAEsE,GAASC,KAAYoB,GAAalB,CAAU,CAAC,GAErEmE,EAAO,SAAW,EAAG,CACvB,QAAQ,QAAQ,CAAC,CAAC,SAAW,CAC3B,GAAI,KAAK,IAAK,CACZ,IAAIiT,EAAU,oDACVvT,EAASuT,EACT/qB,EAAK,OAAO,SACd,EAAS,gDAAgDsX,EAAUtX,EAAK,OAAO,IAAK,GAAUiF,EAAM,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAO,EAAO,IAAU9H,EAAM,QAAQgQ,CAAK,IAAM9L,CAAK,CAAC,IACjL,KAAK,KAAKmW,CAAM,EAChB,GAAW,KAAKA,EAAO,IAEzB,IAAMuE,EAAY,MAAMgP,CAAO,EAC/B,KAAK,IAAI,QAAQsF,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mCACtB,MAAO,GACP,IAAKhc,EAAK,IACV,QACA,QACF,CAAC,CACH,CACF,CAAC,EACD,EAAa,IAAM,YAAY,IAAI,EACnC,MACF,CACIA,EAAK,cACP,EAAcA,EAAK,YAAY,OAAQ,GAAU,CAAC8C,EAAM,YAAc,KAAK,iBAAiBA,EAAM,UAAU,CAAC,EAC7GusC,GAAsBwmC,CAAW,GAE/B71E,EAAK,YACP,EAAiBA,EAAK,UACtBqvC,GAAsBq4C,CAAc,GAEtC,IAAMme,EAAiB/tF,EAAO,MAAM,CAAC,EACrCA,EAAO,MAAM,EAAG,IAAM,CACpB,GAAI6I,EAAE,MAAM,gBAAkBna,EAAE,MAAM,cACpC,OAAQma,EAAE,MAAM,eAAiB,KAAOna,EAAE,MAAM,eAAiB,IAAM,EAAI,GAE7E,GAAIs+F,GAAmBnkF,EAAE,SAAWna,EAAE,OACpC,OAAOma,EAAE,OAASna,EAAE,OAEtB,GAAIma,EAAE,YAAcna,EAAE,UACpB,OAAOma,EAAE,UAAYna,EAAE,UAEzB,GAAIma,EAAE,aAAena,EAAE,WACrB,OAAOsO,GAAiB,QAAQ6L,EAAE,UAAU,EAAI7L,GAAiB,QAAQtO,EAAE,UAAU,EAEvF,GAAIma,EAAE,aAAena,EAAE,WAAY,CACjC,IAAMs/F,EAAS72F,GAA0B0R,EAAE,UAAU,EAC/ColF,EAAS92F,GAA0BzI,EAAE,UAAU,EACrD,GAAIs/F,IAAWC,EACb,OAAOA,EAASD,CAEpB,CACA,GAAInlF,EAAE,MAAQna,EAAE,KAAOma,EAAE,WAAana,EAAE,SAAU,CAChD,IAAMs/F,EAAS32F,GAAkCwR,EAAE,QAAQ,EACrDolF,EAAS52F,GAAkC3I,EAAE,QAAQ,EAC3D,GAAIs/F,IAAWC,EACb,OAAOA,EAASD,CAEpB,CAIA,OAHInlF,EAAE,iBAAmBna,EAAE,eAGpB,EAFEma,EAAE,eAAiBna,EAAE,cAGhC,CAAC,EACD,IAAIw/F,EAAuBH,EAAe,GAC1C,GAAI,KAAK,WACP,EAAS,KAAK,SAAS,mBAAmB/tF,CAAM,EAC5CA,EAAO,SAAW+tF,EAAe,QAC9B,KAAA,IAAIxqG,EAAI,EAAGA,EAAIwqG,EAAe,OAAQ,IACzC,GAAIA,EAAexqG,EAAE,CAAC,YAAcyc,EAAO,EAAE,CAAC,UAAW,CACvD,EAAuB+tF,EAAexqG,GACtC,KACF,EAIN,KAAK,QAAUyc,EACf,IAAK,IAAIzc,EAAI,EAAGA,EAAIyc,EAAO,OAAQ,IACjC,GAAIA,EAAOzc,KAAO2qG,EAAsB,CAEtC,KAAK,YAAc3qG,EACnB,IAAM4qG,EAAoBD,EAAqB,QACzCE,EAAoB,KAAK,IAAI,kBAEnC,GADA,KAAK,IAAI,oBAAoBpuF,EAAO,OAAO,kCAAkCmuF,GAAmB,EACnE,KAAK,IAAI,YAAoD,yBAA4B,IAAK,GAAG,CAC5H,IAAME,EAAqB,KAAK,IAAIF,EAAmB,KAAK,IAAI,OAAO,yBAAyB,EAC5FE,EAAqBD,GAAqBA,IAAsB,KAAK,IAAI,yBAC3E,KAAK,IAAI,kBAAoBC,EAEjC,CACA,KACF,CAEF,IAAMC,EAAYpB,GAAmB,CAACD,EAChCvwF,EAAS,KAAK,IAAI,OAClB6xF,EAAkB,CAAC,EAAE7xF,EAAO,uBAAyBA,EAAO,sBAC5D8xF,EAAQ,CACZ,SACA,cACA,iBACA,YAAatmG,EAAK,YAClB,YAAaA,EAAK,YAClB,WAAY,KAAK,YACjB,MAAOA,EAAK,MACZ,MAAOglG,EACP,MAAOD,EACP,SAAUsB,GAAmB,CAACD,GAAavwB,EAAY,KAAM,GAAM,CAAC,CAACj7E,EAAE,GAAG,CAC5E,EACA,EAAa,IAAM,YAAY,IAAI,EACnC,KAAK,IAAI,QAAQy1B,EAAO,gBAAiBi2E,CAAK,CAChD,CACA,IAAI,QAAS,CAIX,OAHI,KAAK,QAAQ,SAAW,EACnB,KAEF,KAAK,OACd,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,YACd,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,iBACd,CACA,IAAI,MAAM,EAAU,CAClB,IAAMxuF,EAAS,KAAK,QACpB,GAAIA,EAAO,SAAW,EACpB,OAEF,GAAIyuF,EAAW,GAAKA,GAAYzuF,EAAO,OAAQ,CAC7C,IAAMiE,EAAQ,gBAAI,MAAM,mBAAmB,EACrCyqF,EAAQD,EAAW,EASzB,GARA,KAAK,IAAI,QAAQl2E,EAAO,MAAO,CAC7B,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,MAAOuqF,EACP,QACA,QACA,OAAQxqF,EAAM,OAChB,CAAC,EACGyqF,EACF,OAEF,EAAW,KAAK,IAAID,EAAUzuF,EAAO,OAAS,CAAC,CACjD,CACA,IAAM2uF,EAAiB,KAAK,kBACtBC,EAAY,KAAK,aACjBC,EAAgBD,EAAYA,EAAU,MAAM,cAAgB,IAAK,GACjEzhG,EAAQ6S,EAAOyuF,GACf7lB,EAAYz7E,EAAM,MAAM,cAG9B,GAFA,KAAK,kBAAoBshG,EACzB,KAAK,aAAethG,EAChBwhG,IAAmBF,GAAYG,GAAaC,IAAkBjmB,EAChE,OAEF,KAAK,IAAI,sBAAsB6lB,EAAS,IAAIthG,EAAM,OAASA,EAAM,OAAS,KAAO,KAAKA,EAAM,WAAaA,EAAM,WAAa,IAAM,KAAKA,EAAM,SAAWA,EAAM,SAAW,IAAM,GAAG,GAAGA,EAAM,QAAQ,GAAGy7E,EAAY,iBAAmBA,EAAY,GAAG,cAAc+lB,IAAiBE,EAAgB,iBAAmBA,EAAgB,IAAI,EAC1U,IAAMC,EAAqB,CACzB,MAAOL,EACP,MAAOthG,EAAM,MACb,QAASA,EAAM,QACf,QAASA,EAAM,QACf,eAAgBA,EAAM,eACtB,WAAYA,EAAM,WAClB,YAAaA,EAAM,YACnB,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,SAAUA,EAAM,SAChB,WAAYA,EAAM,WAClB,WAAYA,EAAM,WAClB,YAAaA,EAAM,YACnB,eAAgBA,EAAM,eACtB,OAAQA,EAAM,OACd,UAAWA,EAAM,UACjB,cAAeA,EAAM,cACrB,KAAMA,EAAM,KACZ,GAAIA,EAAM,GACV,IAAKA,EAAM,IACX,IAAKA,EAAM,IACX,MAAO,EACP,cAAeA,EAAM,cACrB,aAAcA,EAAM,YACtB,EACA,KAAK,IAAI,QAAQorB,EAAO,gBAAiBu2E,CAAkB,EAC3D,IAAM/8C,EAAe5kD,EAAM,QAC3B,GAAI,CAAC4kD,GAAgBA,EAAa,KAAM,CACtC,IAAMotB,EAAmB,KAAK,aAAahyE,EAAM,IAAKyhG,GAAuC,QAAS78C,CAAY,EAClH,KAAK,aAAaotB,CAAgB,CACpC,CACF,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,gBACd,CACA,IAAI,YAAY,EAAU,CACxB,KAAK,iBAAmBsvB,EACpB,KAAK,cAAgB,IAAK,KAC5B,KAAK,YAAcA,GAEjBA,IAAa,KACf,KAAK,MAAQA,EAEjB,CACA,IAAI,YAAa,CACf,OAAO,KAAK,WACd,CACA,IAAI,WAAW,EAAU,CACvB,KAAK,YAAcA,CACrB,CACA,IAAI,YAAa,CACf,GAAI,KAAK,cAAgB,IAAK,GAAG,CAC/B,IAAMM,EAAmB,KAAK,IAAI,OAAO,WAIzC,OAHIA,IAAqB,IAAK,GAGvB,KAAK,IAAI,eAFPA,CAGX,CACA,OAAO,KAAK,WACd,CACA,IAAI,WAAW,EAAU,CACvB,KAAK,YAAcN,CACrB,CACA,IAAI,UAAW,CAIb,OAHI,KAAK,SACA,KAAK,SAAS,SAAS,EAEzB,CAAC,CACV,CACA,IAAI,iBAAkB,CAIpB,OAHI,KAAK,SACA,KAAK,SAAS,gBAEhB,IACT,CACA,IAAI,gBAAgB,EAAiB,CACnC,GAAI,KAAK,SAAU,CACjB,IAAMO,EAAe,KAAK,SAAS,SAAS,EACtCC,EAA0B1mB,EAAgB,OAAQ,GAC/CymB,EAAa,QAAQpmB,CAAS,IAAM,EAC5C,EACD,GAAIL,EAAgB,OAAS,EAAG,CAC9B,KAAK,KAAK,mBAAmBA,EAAgB,kDAAkDymB,GAAc,EAC7G,MACF,CACA,KAAK,SAAS,gBAAkBC,CAClC,CACF,CACA,QAAQ,EAAO,EAAM,CACf,GAAK,OAAU/mG,EAAK,SAGpBA,EAAK,QAAQ,OAASiwC,EAAoB,OAASjwC,EAAK,QAAQ,QAAU,KAAK,OACjF,KAAK,WAAWA,CAAI,CAExB,CACA,eAAe,EAAO,CACpB,QACC,CACD,GAAIR,IAAS,IAAK,IAAKA,EAAK,OAASyvC,EAAkB,KAAM,CAC3D,IAAM51B,EAAK7Z,EAAK,kBAChB,GAAI,CAAC,OAAO,KAAK6Z,CAAE,CAAC,CAAC,KAAM,GAAS,CAAC,CAACA,EAAG3d,EAAK,EAC5C,OAEF,IAAMuJ,EAAQ,KAAK,QAAQzF,EAAK,OAC5ByF,GAAS,MAAQA,EAAM,YACzB,KAAK,IAAI,kCAAkCA,EAAM,UAAU,kBAAkB,EAC7E,EAAM,UAAY,EAEtB,CACF,CACA,cAAc,EAAO,EAAM,CACzB,IAAI+hG,EACJ,GAAM,CACJ,QACA,WACEhnG,EACEs/E,EAAWt/E,EAAK,UACtB,GAAI,CAACs/E,EAAU,CACb,IAAI2nB,EACJ,KAAK,KAAK,uBAAuBhiG,GAAO,GACnC,EAAwBjF,EAAK,qBAAuB,MAAQinG,EAAsB,OACrF,EAAQ,kBAAoB,GAGhC,MACA,GAAI3nB,IAAa,KAAK,cAAgBt/E,EAAK,oBAAqB,CAC1Ds/E,EAAS,gBAAkB,IAC7B,EAAS,UAAY,GAEvB,IAAIvhB,EAAkBuhB,EAAS,QAC3BvhB,IAAoB/9D,EAAK,SAAW+9D,EAAgB,WACtD,EAAkB,IAAK,IAEzB,KAAK,eAAe94D,EAAOjF,EAAM+9D,CAAe,CAClD,MAAY,EAAyB/9D,EAAK,qBAAuB,MAAQgnG,EAAuB,OAC9F,EAAQ,kBAAoB,GAEhC,CACA,aAAa,EAAkB,CAC7B,MAAM,aAAa,EACf,KAAK,mBAAmB,KAAK,YAAY,GAC3C,KAAK,gBAAgB,KAAK,aAAc/vB,CAAgB,CAE5D,CACA,gBAAgB,EAAc,EAAkB,CAC9C,MAAM,gBAAgBz9D,EAAcy9D,CAAgB,EACpD,IAAM73E,EAAM,KAAK,qBAAqBoa,EAAa,IAAKy9D,CAAgB,EAClEiwB,EAAoB,KAAK,kBACzBxmB,EAAYlnE,EAAa,MAAM,cAC/BxE,EAAUwE,EAAa,QACvBtE,EAAMF,GAAmC,IAC/C,KAAK,IAAI,uBAAuBkyF,IAAqBjwB,GAAqD,MAAS,IAAK,GAA0E,GAAtE,UAAYA,EAAiB,IAAM,SAAWA,EAAiB,OAAYyJ,EAAY,YAAcA,EAAY,KAAKxrE,GAAOF,EAAQ,KAAO,QAAUE,EAAI,QAAQ,CAAC,GAAKF,EAAQ,MAAO,IAAMA,EAAQ,MAAQ,IAAW,GAAG,GAAG5V,GAAK,EAC/V,KAAK,IAAI,QAAQixB,EAAO,cAAe,CACrC,MACA,MAAO62E,EACP,UAAW1tF,EACX,UAAWA,EAAa,MAAM,cAC9B,GAAI,EACJ,mBAAoBy9D,GAAoB,IAC1C,CAAC,CACH,CACA,IAAI,eAAgB,CAIhB,OAHE,KAAK,mBAAqB,GAGrB,KAAK,IAAI,cAFT,KAAK,gBAIhB,CACA,IAAI,cAAc,EAAW,CAC3B,KAAK,MAAQhtB,EACT,KAAK,mBAAqB,KAC5B,KAAK,IAAI,cAAgBA,EAE7B,CACA,YAAY,EAAY,CACtB,IAAIk9C,EACJ,GAAI,KAAK,QAAQ,SAAW,EAC1B,OAEF,IAAMrvF,EAAS,KAAK,QAAQ,QAAQ,EAAO,IACrCzW,IAAUwpD,IAGV,KAAK,UACP,KAAK,SAAS,YAAY5lD,CAAK,EAE7BA,IAAU,KAAK,eACjB,KAAK,aAAe,KACpB,KAAK,kBAAoB,GACrBA,EAAM,SACRA,EAAM,QAAQ,UAAU,QAAS,GAAM,EAAE,MAAQ,EAAE,GAGhD,GACR,EACD2mB,GAA6B9T,CAAM,EACnC,KAAK,QAAUA,EACX,KAAK,kBAAoB,KAAO,EAAqB,KAAK,eAAiB,MAAQqvF,EAAmB,UACxG,KAAK,kBAAoB,KAAK,aAAa,QAAQ,UAAU,EAAE,CAAC,OAE9D,KAAK,iBAAmB,KAC1B,KAAK,iBAAmB,KAAK,mBAE/B,IAAMpoB,EAAWjnE,EAAO,OAAS,EACjC,KAAK,YAAc,KAAK,IAAI,KAAK,YAAainE,CAAQ,EACtD,AACE,KAAK,cAAc,KAAK,IAAI,KAAK,YAAaA,CAAQ,EAExD,KAAK,IAAI,QAAQ1uD,EAAO,eAAgB,CACtC,QACF,CAAC,CACH,CACA,gBAAgB,EAAO,CACrB,UACC,CACD,KAAK,QAAUvY,CACjB,CACA,qBAAsB,CACpB,GAAM,CACJ,mBACA,eACA,gBACE,KAAK,IACL,KAAK,gBAAkBE,IACzB,KAAK,cAAgBA,EACrB,KAAK,IAAI,QAAQqY,EAAO,uBAAwB,CAC9C,mBACA,OAAQ,KAAK,OACb,eACA,aAAc,KAAK,IAAI,aACvB,cACF,CAAC,EAEL,CACF,EAgCM,GAAgB,IAChB,GAAN,cAA+B0iB,EAAqB,CAClD,YAAY,EAAK,EAAiB,EAAW,CAC3C,MAAM54B,EAAK60B,EAAiBiqB,EAAW,oBAAqBhqB,EAAkB,IAAI,EAClF,KAAK,eAAiB,GACtB,KAAK,MAAQ,GACb,KAAK,gBAAkB,GACvB,KAAK,kBAAoB,GACzB,KAAK,SAAW,EAChB,KAAK,UAAY,GACjB,KAAK,YAAc,KACnB,KAAK,aAAe,EACpB,KAAK,eAAiB,GACtB,KAAK,kBAAoB,KACzB,KAAK,iBAAmB,GACxB,KAAK,YAAc,KACnB,KAAK,mBAAuB,CAC1B,KAAK,KAAK,CACZ,EACA,KAAK,kBAAsB,CACzB,IAAMjU,EAAQ,KAAK,MACb4T,EAAc5T,EAAQA,EAAM,YAAc,KAKhD,GAJI4T,IAAgB,MAAQ,CAACjnC,EAAeinC,CAAW,IAGvD,KAAK,IAAI,mBAAmBA,EAAY,QAAQ,CAAC,GAAG,EAChD,CAAC,KAAK,gBAAgBA,CAAW,GACnC,OAEF,IAAM4W,EAAa,KAAK,sBAAsBxqB,EAAO4T,EAAaK,EAAkB,KAAM,CAAC,EACvFuW,IAAe,MAAQA,EAAW,MAAQ,EAC5C,KAAK,KAAK,iCAAiC5W,EAAY,qBAAqB4W,EAAaA,EAAW,IAAM,QAAQ,EAAE,EAGtH,KAAK,KAAK,CACZ,EACA,KAAK,kBAAkB,CACzB,CACA,mBAAoB,CAClB,MAAM,kBAAkB,EACxB,GAAM,CACJ,OACE,KACJrrC,EAAI,GAAGkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC1DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACpDlW,EAAI,GAAGkW,EAAO,4BAA6B,KAAK,2BAA4B,IAAI,EAChFlW,EAAI,GAAGkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACrElW,EAAI,GAAGkW,EAAO,qBAAsB,KAAK,qBAAsB,IAAI,EACnElW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACxDlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,CACxD,CACA,qBAAsB,CACpB,MAAM,oBAAoB,EAC1B,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,gBAAiB,KAAK,iBAAkB,IAAI,EAC3DlW,EAAI,IAAIkW,EAAO,aAAc,KAAK,cAAe,IAAI,EACrDlW,EAAI,IAAIkW,EAAO,4BAA6B,KAAK,2BAA4B,IAAI,EACjFlW,EAAI,IAAIkW,EAAO,sBAAuB,KAAK,sBAAuB,IAAI,EACtElW,EAAI,IAAIkW,EAAO,qBAAsB,KAAK,qBAAsB,IAAI,EACpElW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,EACzDlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,CACzD,CACA,qBAAsB,CACpB,KAAK,eAAiB,KAAK,cAAgB,KAC3C,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,CAC5B,CACA,UAAU,EAAe,EAAyB,CAChD,GAAI,KAAK,OAAQ,CACf,GAAM,CACJ,kBACA,OACE,KAIJ,GAHA,KAAK,SAAS,EACd,KAAK,YAAYupB,EAAa,EAC9B,KAAK,MAAQ,GACT,CAAC,KAAK,mBAAoB,CAC5B,IAAIwtD,EAAajtF,EAAI,WACjBitF,IAAe,KACbjtF,EAAI,OAAO,eAAiB,KAAK,OAAO,OAAS,GACnD,EAAa,EACb,KAAK,YAAc,IAEnB,EAAaA,EAAI,gBAGrB,EAAI,cAAgBitF,EACpB,KAAK,MAAQjtF,EAAI,UACjB,KAAK,kBAAoB,CAAC,CAACq7D,CAC7B,CACID,EAAkB,GAAKrc,IAAkB,IAAM,CAACsc,IAClD,KAAK,IAAI,gDAAgDD,EAAgB,QAAQ,CAAC,GAAG,EACrF,EAAgBA,GAElB,KAAK,MAAQzmC,EAAM,KACnB,KAAK,iBAAmB,KAAK,gBAAkBoqB,EAAgB,KAAK,eACpE,KAAK,cAAgBsc,EAA0B,GAAKtc,EACpD,KAAK,KAAK,CACZ,KACE,MAAK,gBAAkB,GACvB,KAAK,MAAQpqB,EAAM,OAEvB,CACA,UAAW,CACT,KAAK,gBAAkB,GACvB,MAAM,SAAS,CACjB,CACA,QAAS,CACP,OAAQ,KAAK,MAAb,CACE,KAAKA,EAAM,cAAe,CACxB,GAAM,CACJ,SACA,SACE,KACEt1B,EAAe1B,IAAiC7S,GAChD+P,EAAUwE,GAA6C,QAC7D,GAAIxE,IAAY,CAACA,EAAQ,MAAQ,KAAK,kBAAoBwE,GAAgB,CAAC,KAAK,YAAYA,CAAY,GAAI,CAC1G,GAAI,KAAK,iBAAiBxE,CAAO,EAC/B,MAEF,KAAK,MAAQ85B,EAAM,KACnB,KACF,CAAO,GAAI,KAAK,IAAI,gBAAkB,KAAK,MAAO,CAChD,KAAK,MAAQA,EAAM,KACnB,KACF,CACA,KACF,CACA,KAAKA,EAAM,2BACT,KAAK,eAAe,CAExB,CACI,KAAK,QAAUA,EAAM,MACvB,KAAK,WAAW,EAElB,KAAK,UAAU,CACjB,CACA,WAAY,CACV,IAAIw+C,EACJ,MAAM,UAAU,GACX,EAAc,KAAK,QAAU,MAAQA,EAAY,YAAc,KAAK,MAAM,UAAY,KACzF,KAAK,gBAAkB,KAAK,MAAM,aAEpC,KAAK,qBAAqB,CAC5B,CACA,YAAa,CACX,GAAM,CACJ,MACA,kBACA,SACA,SACE,KAIJ,GAHI+Z,IAAoB,MAAQ,CAACrsE,GAAS,CAAC,KAAK,kBAAoB,KAAK,oBAAsB,CAAC7gB,EAAI,OAAO,oBAGvG,KAAK,UAAY,KAAK,UACxB,OAEF,IAAMlV,EAAQ,KAAK,UAAYkV,EAAI,cAAgBA,EAAI,UACvD,GAAI,EAAErC,GAAU,MAAQA,EAAO7S,IAC7B,OAEF,IAAMwkD,EAAY3xC,EAAO7S,GACnBugD,EAAa,KAAK,qBAAqB,EAC7C,GAAIA,IAAe,KACjB,OAEF,IAAM8hD,EAAc,KAAK,gBAAgB,EACzC,GAAIA,GAAe,KAAK,aAAa9hD,EAAY8hD,CAAW,EAAG,CAC7D,IAAMtnG,EAAO,CAAC,EACV,KAAK,WAAa,IACpB,EAAK,KAAO,SAEd,KAAK,IAAI,QAAQqwB,EAAO,WAAYrwB,CAAI,EACxC,KAAK,MAAQ8uC,EAAM,MACnB,MACF,CACA,GAAI,CAAC,KAAK,UACR,OAEE30B,EAAI,YAAclV,GAASkV,EAAI,cAAgB,IACjD,KAAK,IAAI,qBAAqBlV,EAAM,cAAc,KAAK,OAAO,EAEhE,KAAK,MAAQ,EAAI,cAAgBA,EACjC,IAAM4kD,EAAeJ,EAAU,QAC/B,GAAI,CAACI,GAAgB,KAAK,QAAU/a,EAAM,eAAiB,KAAK,YAAY2a,CAAS,EAAG,CACtF,KAAK,MAAQxkD,EACb,KAAK,MAAQ6pC,EAAM,cACnB,KAAK,mBAAqB,GAC1B,MACF,CACA,IAAMglB,EAAYtO,EAAW,IACvBuW,EAAY,KAAK,mBAAmBtS,EAAU,UAAU,EAC9D,GAAIqK,GAAaiI,EACf,OAEE,KAAK,mBAAqB,KAAK,kBAAkB,MAAQvW,EAAW,MACtE,KAAK,kBAAoB,MAE3B,IAAMiU,EAAmB,KAAK,kBAAoB,KAAK,kBAAkB,MAAQjU,EAAW,IACxFhmD,EAAO,KAAK,gBAAgBi6D,EAAkB5P,CAAY,EAC9D,GAAI,KAAK,gBAAkB,CAAC,KAAK,cAAgBrqD,GAAQD,EAAgBC,CAAI,GAAK,KAAK,gBAAgB,SAASA,CAAI,IAAM4xC,EAAc,GAAI,CAG1I,IAAM/oB,GADwC,KAAK,mBAAqD7oB,EAAA,CAAM,GAChFqqD,EAAa,QACrC09C,EAAgB19C,EAAa,UAAUxhC,EAAU,GACnDk/E,GAAiB/nG,EAAK,KAAO+nG,EAAc,KAC7C,EAAOA,EACP,KAAK,gBAAgB,eAAeA,CAAa,EAErD,MAAW,KAAK,mBAAqB/hD,EAAW,MAC9C,KAAK,kBAAoB,MAE3B,GAAIhmD,GAAQ,KAAK,cAAcA,EAAMi6D,CAAgB,EAAG,CAEtD,GAAI,CADaj6D,EAAK,IACP,CACb,IAAM9D,EAAO,KAAK,WAAa,CAAC,KAAK,SAAW+G,EAAsB,MAAQA,EAAsB,MAC9Fg2D,GAAe/8D,IAAS+G,EAAsB,MAAQ,KAAK,YAAc,KAAK,cAAgB,KAAK,MACrGg2D,GACF,KAAK,mBAAmBA,EAAa/8D,EAAMuzC,EAAkB,IAAI,CAErE,CACA,EAAO,KAAK,2BAA2BzvC,EAAMqqD,EAAcrE,EAAYvW,EAAkB,KAAM8sB,CAAS,CAC1G,CACKv8D,IAGDA,EAAK,aAAe,CAACA,EAAK,YAAY,MAAQ,CAAC,KAAK,cACtD,EAAOA,EAAK,aAEd,KAAK,aAAaA,EAAMiqD,EAAWgQ,CAAgB,EACrD,CACA,aAAa,EAAM,EAAO,EAAkB,CAC1C,IAAMiE,EAAY,KAAK,gBAAgB,SAASl+D,CAAI,EAChDk+D,IAActsB,EAAc,YAAcssB,IAActsB,EAAc,QACnE7xC,EAAgBC,CAAI,EAEd,KAAK,aACd,KAAK,IAAI,YAAYA,EAAK,GAAG,YAAYA,EAAK,MAAM,8DAA8D,EAClH,KAAK,qBAAqBA,EAAMyF,CAAK,GAErC,MAAM,aAAazF,EAAMyF,EAAOw0D,CAAgB,EALhD,KAAK,iBAAiBj6D,EAAMyF,CAAK,EAQnC,KAAK,qBAAqBzF,CAAI,CAElC,CACA,gBAAgB,EAAU,CACxB,OAAO,KAAK,gBAAgB,gBAAgBgoC,EAAUyH,EAAkB,IAAI,CAC9E,CACA,sBAAsB,EAAM,CAI1B,OAHIzvC,EACK,KAAK,gBAAgBA,EAAK,IAAM,EAAG,EAErC,IACT,CACA,sBAAuB,CACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAAG,GAAwB,CAClD,CACA,iBAAkB,CAChB,GAAM,CACJ,SACA,SACE,KACJ,GAAIw7B,GAAS,MAAQA,EAAM,WAAY,CACrC,IAAIwsE,EACEC,EAAqB,KAAK,gBAAgBzsE,EAAM,WAAW,EAC7DysE,GAAsBA,EAAmB,MAAQ,GACnD,KAAK,gBAAgB,EAAGA,EAAmB,MAAQ,CAAC,EAEtD,IAAM59C,EAAe,KAAK,gBAAgB,EAC1C,GAAIA,GAAgB,MAAQA,EAAa,KAAM,CAC7C,IAAMrE,EAAa,KAAK,qBAAqB,EAC7C,GAAI,CAACA,GAAcA,EAAW,IAAMqE,EAAa,eAAiB,EAChE,MAEJ,CACA,GAAI,CAAC7uB,EAAM,QAAUljB,EAAQ,CAE3B,IAAMmyC,EAAYnyC,EADE,KAAK,IAAI,eAEvB4vF,EAAe,KAAK,aAC1B,AAGEF,EAHEE,GAAgB,KAAK,YACV,KAAK,YAAY,SAAWz9C,EAAU,YAAc,IAAMy9C,GAAgB,EAE1E,CAEjB,KACE,GAAa,EAEf,IAAMC,EAAe,KAAK,gBAAgB3sE,EAAM,YAAcwsE,CAAU,EACxE,GAAIG,EAAc,CAChB,IAAMC,EAAmB,KAAK,sBAAsBD,CAAY,EAChE,GAAIC,EAAkB,CACpB,KAAK,iBAAiB,EACtB,IAAMC,EAAWD,EAAiB,YAAcA,EAAiB,YAAcA,EAAiB,MAC1FpsC,EAAeosC,EAAiB,SAChCE,EAAW,KAAK,IAAIH,EAAa,IAAKE,EAAW,KAAK,IAAI,KAAK,IAAIrsC,EAAe,KAAK,OAAO,uBAAwBA,GAAgB,KAAK,eAAiB,GAAM,KAAM,EAAGA,GAAgB,KAAK,eAAiB,IAAO,IAAK,CAAC,EACpO,KAAK,gBAAgBssC,EAAU,GAAwB,CACzD,CACF,CACF,CACF,CACA,kBAAmB,CACjB,IAAMt8E,EAAc,KAAK,YAOzB,OANA,KAAK,YAAc,KACnB,KAAK,kBAAoB,KACrBA,IACFA,EAAY,cAAc,EAC1B,KAAK,gBAAgB,eAAeA,CAAW,GAEzC,KAAK,MAAb,CACE,KAAKsjB,EAAM,YACX,KAAKA,EAAM,aACX,KAAKA,EAAM,2BACX,KAAKA,EAAM,QACX,KAAKA,EAAM,OACT,KAAK,MAAQA,EAAM,IAEvB,CACA,KAAK,iBAAmB,KAAK,gBAAgB,CAC/C,CACA,gBAAgB,EAAa,EAAW,CACtC,MAAM,gBAAgB+qB,EAAaC,EAAW,KAAK,WAAa,EAAI,QAAU,IAAI,CACpF,CACA,gBAAgB,EAAO,EAAM,CAC3B,MAAM,gBAAgB9rC,EAAOhuB,CAAI,EACjC,IAAMg7B,EAAQh7B,EAAK,MACnB6sB,EAAiBmO,EAAO,UAAW,KAAK,cAAc,EACtDnO,EAAiBmO,EAAO,SAAU,KAAK,aAAa,CACtD,CACA,iBAAiB,EAAO,EAAM,CAC5B,GAAM,CACJ,SACE,KACAA,IACFlO,GAAoBkO,EAAO,UAAW,KAAK,cAAc,EACzDlO,GAAoBkO,EAAO,SAAU,KAAK,aAAa,GAEzD,KAAK,YAAc,KACnB,KAAK,YAAc,KACnB,MAAM,iBAAiBhN,EAAOhuB,CAAI,EACN,GAAK,gBAIjC,KAAK,kBAAoB,GAC3B,CACA,mBAAoB,CAClB,MAAM,kBAAkB,EACxB,KAAK,IAAI,sBAAsB,EAC/B,KAAK,IAAI,QAAQqwB,EAAO,aAAc,IAAK,EAAC,EAC5C,KAAK,eAAiB,GACtB,KAAK,aAAe,EACpB,KAAK,YAAc,KAAK,kBAAoB,KAC5C,KAAK,SAAW,EAChB,KAAK,UAAY,EACnB,CACA,iBAAiB,EAAO,EAAM,CAC5B,IAAI03E,EAAM,GACNC,EAAQ,GACZ,IAAK,IAAI3sG,EAAI,EAAGA,EAAI2E,EAAK,OAAO,OAAQ,IAAK,CAC3C,IAAMkD,EAAQlD,EAAK,OAAO3E,EAAE,CAAC,WACzB6H,IACF,IAAaA,EAAM,QAAQ,WAAW,IAAM,GAC5C,IAAiBA,EAAM,QAAQ,WAAW,IAAM,GAEpD,CACA,KAAK,iBAAmB6kG,GAAOC,GAAS,CAACn4D,GAAoB,EACzD,KAAK,kBACP,KAAK,IAAI,wEAAwE,EAEnF,KAAK,OAAS7vC,EAAK,OACnB,KAAK,mBAAqB,EAC5B,CACA,eAAe,EAAO,EAAM,CAC1B,GAAM,CACJ,UACE,KACJ,GAAI,CAAC8X,GAAU,KAAK,QAAUg3B,EAAM,KAClC,OAEF,IAAM7pC,EAAQjF,EAAK,WACf,CAACiF,EAAM,SAAWA,EAAM,QAAQ,OAAS,KAAK,kBAAoBA,GAASA,EAAM,QAAQ,UAAY,KAAK,iBAAiBA,EAAM,OAAO,KAC1I,KAAK,MAAQ6pC,EAAM,cAEvB,CACA,cAAc,EAAO,EAAM,CACzB,IAAIm5D,EACJ,GAAM,CACJ,SACA,sBACE,KACEC,EAAaloG,EAAK,MAClBwoB,EAAaxoB,EAAK,QAClBsb,EAAWkN,EAAW,cAC5B,GAAI,CAAC1Q,EAAQ,CACX,KAAK,KAAK,yCAAyCowF,GAAY,EAC/D,MACF,CACA,KAAK,IAAI,SAASA,EAAW,WAAW1/E,EAAW,QAAQ,GAAGA,EAAW,MAAM,GAAGA,EAAW,WAAa,SAASA,EAAW,WAAW,GAAGA,EAAW,cAAc,GAAK,GAAG,QAAQA,EAAW,QAAQ,IAAIA,EAAW,MAAM,aAAalN,GAAU,EACpP,IAAMgkE,EAAWt/E,EAAK,UAChBwrB,EAAc,KAAK,YACrBA,IAAgB,KAAK,QAAUsjB,EAAM,cAAgB,KAAK,QAAUA,EAAM,6BACxEtjB,EAAY,QAAUxrB,EAAK,OAASwrB,EAAY,QAClD,KAAK,iBAAiB,EAG1B,IAAIP,EAAU,EACd,GAAIzC,EAAW,OAAS,EAAoB82D,EAAS,UAAY,MAAQ2oB,EAAkB,KAAM,CAG/F,GADA,KAAK,gBAAgBz/E,CAAU,EAC3BA,EAAW,kBACb,OAEF,EAAU,KAAK,eAAeA,EAAY82D,EAAS,QAAkC,KAAK,iBAA0D,OAAO,CAC7J,CAUA,GATA,EAAS,QAAU92D,EACnB,KAAK,gBAAkB82D,EAClB6oB,GACH,KAAK,iBAAiB3/E,EAAYyC,CAAO,EAE3C,KAAK,IAAI,QAAQoF,EAAO,cAAe,CACrC,QAAS7H,EACT,MAAO0/E,CACT,CAAC,EACG,KAAK,QAAUp5D,EAAM,cAAe,CACtC,GAAI,KAAK,iBAAiBtmB,CAAU,EAClC,OAEF,KAAK,MAAQsmB,EAAM,IACrB,CACIq5D,GAAsB3/E,EAAW,MACnC,KAAK,sBAAsBA,CAAU,EAEvC,KAAK,KAAK,CACZ,CACA,sBAAsB,EAAc,CAClC,GAAM,CACJ,SACA,SACE,KACJ,GAAI,CAACwS,EACH,OAEF,IAAMwhC,EAAmB,KAAK,IAAI,iBAC5B5tB,EAAc,KAAK,gBAAgB,EACnCjwB,EAAQkrC,EAAa,cACrBnpD,EAAMmpD,EAAa,KACnBu+C,EAAsBx5D,GAAejwB,EAAQnK,EAAO,wBAA0Bo6B,GAAeluC,EACnG,GAAI87D,IAAqB,MAAQxhC,EAAM,SAAWwhC,IAAqB5tB,EAAc4tB,GAAoB,CAAC4rC,GAAsB,CAC9H,IAAMC,EAAa7zF,EAAO,yBAA2B,IAAK,GAAoCA,EAAO,4BAA8Bq1C,EAAa,eAAlFr1C,EAAO,uBACrE,IAAI,CAAC4zF,GAAuBptE,EAAM,WAAa,GAAK4T,EAAcluC,EAAM2nG,KACjE,KAAK,oBACR,KAAK,iBAAmB7rC,GAEtBxhC,EAAM,YAAY,CAEpB,GADA,KAAK,KAAK,aAAa4T,EAAY,QAAQ,CAAC,EAAE,6DAA6DluC,EAAI,2BAA2B87D,EAAiB,QAAQ,CAAC,GAAG,EACnK,KAAK,OAAO,eAAiB,WAAY,CAC3C,IAAI8rC,EACJ,IAAM9iD,EAAaxT,EAAa,WAAWhX,EAAOwhC,EAAkB,CAAC,EAMrE,GALI,GAAG,EAAuBhX,EAAW,WAAa,MAAQ8iD,EAAqB,SAIxD9iD,EAAW,OAAS5W,EACvB,CACtB,EAAM,YAAc4tB,EACpB,MACF,CACA,GAAM,CACJ,aACExqB,EAAa,aAAawT,EAAW,SAAU5W,EAAa,CAAC,EAC7DmlB,IACF,EAAM,YAAcA,EAExB,KACE,GAAM,YAAcyI,CAExB,CAEJ,CACF,CACA,4BAA4B,EAAM,CAEhC,IAAMh9D,EAAOQ,EAAK,KACZ,CACJ,OACA,WACEA,EACE,CACJ,UACE,KACJ,GAAI,CAAC8X,EAAQ,CACX,KAAK,KAAK,mEAAmEtY,EAAK,GAAG,YAAYA,EAAK,MAAM,sBAAsB,EAClI,MACF,CACA,IAAMga,EAAe1B,EAAOtY,EAAK,OACjC,GAAI,CAACga,EAAc,CACjB,KAAK,KAAK,SAASha,EAAK,MAAM,uBAAuB,EACrD,MACF,CACA,IAAMwV,EAAUwE,EAAa,QAC7B,GAAI,CAACxE,EAAS,CACZ,KAAK,KAAK,qBAAqBxV,EAAK,GAAG,YAAYA,EAAK,MAAM,gCAAgC,EAC9F,KAAK,gBAAgB,eAAeA,CAAI,EACxC,MACF,CACA,IAAM0P,EAAasK,EAAa,WAC1B6zD,EAAqBr4D,EAAQ,UAAY,CAACA,EAAQ,KAClDu+D,EAAuC/zE,EAAK,aAAkD,KAC9F2U,EAAa,KAAK,eAAeqF,CAAY,EAC7C2gD,EAAa,KAAK,WAAa,KAAK,YAAc,IAAI/kB,GAAoB,KAAK,IAAKnG,EAAkB,KAAM,KAAK,wBAAwB,KAAK,IAAI,EAAG,KAAK,uBAAuB,KAAK,IAAI,CAAC,EAC3LtjB,EAAY1N,EAAOA,EAAK,MAAQ,GAChCgvC,EAAUthC,IAAc,GACxB6uC,EAAY,IAAI1oB,GAActyC,EAAK,MAAOA,EAAK,GAAIA,EAAK,MAAM,WAAYmO,EAAQ,WAAYge,EAAWshC,CAAO,EAChH/zB,EAAU,KAAK,QAAQ15B,EAAK,IAClC26D,EAAW,KAAKxsD,EAAS4lE,EAAiBp/D,EAAYjF,EAAY1P,EAAMye,EAAMjJ,EAAQ,cAAeq4D,EAAoB7S,EAAWthC,CAAO,CAC7I,CACA,sBAAsB,EAAO,EAAM,CACjC,IAAM/e,EAAM,KAAK,IACXouF,EAAe,KAAK,WAAa,EAEvC,GADiBtuF,GAAkBja,EAAK,IAAKma,CACjC,EAiCV,KAAK,SAAW,MAjCH,CACb,GAAI,KAAK,cAAgB,KAAK,MAAO,CACnC,KAAK,IAAI,+EAA+E,EACxF,KAAK,YAAc,KAAK,MACxB,IAAMqR,EAAc,KAAK,YACrBA,IACF,KAAK,IAAI,0DAA0D,EACnEA,EAAY,cAAc,EAC1B,KAAK,gBAAgB,eAAeA,CAAW,GAEjD,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,CACzB,MAAW,KAAK,WACd,KAAK,gBAAgB,EAEvB,GAAI+8E,EAAc,CAChB,KAAK,SAAW,EAChB,KAAK,gBAAgB,mBAAmB,EACxCpuF,EAAI,KAAKkW,EAAO,mBAAsB,CAC/B,KAAK,KAGV,KAAK,IAAI,QAAQA,EAAO,qBAAsBrwB,CAAI,CACpD,CAAC,EACDma,EAAI,QAAQkW,EAAO,gBAAiB,CAClC,YAAa,EACb,UAAW,IACX,KAAM,IACR,CAAC,EACD,MACF,CACAlW,EAAI,QAAQkW,EAAO,qBAAsBrwB,CAAI,CAC/C,CAGF,CACA,qBAAqB,EAAO,EAAM,CAChC,IAAM+1E,EAAW97D,GAAkBja,EAAK,IAAK,KAAK,GAAG,EACrD,GAAI+1E,EAAU,CACZ,IAAMyyB,EAAc,KAAK,YACrBA,GAAe,KAAK,cAAgBA,IACtC,KAAK,IAAI,oFAAoF,EAC7F,KAAK,YAAcA,EAEvB,CACA,KAAK,SAAWzyB,EAAW,EAAI,EAC/B,KAAK,KAAK,CACZ,CACA,gBAAgB,EAAO,EAAM,CAC3B,IAAM9uE,EAASjH,EAAK,OAChByoG,EACAzrG,EACA0rG,EAAY,GAChB,IAAK,IAAMhtG,KAAQuL,EAAQ,CACzB,IAAMnE,EAAQmE,EAAOvL,GACrB,GAAIoH,EAAM,KAAO,OAGf,IAFA,EAAOpH,EACP,EAAaoH,EACTpH,IAAS,QAAS,CACpB,IAAMwkE,EAAaj5D,EAAOvL,GACtBwkE,IACF,KAAK,YAAcA,EAAW,OAElC,MAEA,GAAY,EAEhB,CACIwoC,GAAaD,GACf,KAAK,IAAI,8BAA8BzrG,EAAK,4CAA4C,EACxF,KAAK,YAAcyrG,EAAW,QAE9B,KAAK,YAAc,KAAK,KAE5B,CACA,eAAe,EAAO,EAAM,CAC1B,GAAM,CACJ,OACA,QACEzoG,EACE2oG,EAAuBnpG,EAAK,OAASyvC,EAAkB,KAC7D,GAAI05D,EAAsB,CACxB,GAAI,KAAK,mBAAmBnpG,CAAI,EAAG,CACjC,KAAK,KAAK,YAAYA,EAAK,KAAKye,EAAO,OAASA,EAAK,MAAQ,GAAG,YAAYze,EAAK,MAAM,+CAA+C,KAAK,OAAO,EAC9I,KAAK,QAAUsvC,EAAM,SACvB,KAAK,MAAQA,EAAM,MAErB,MACF,CACA,IAAMkW,EAAQ/mC,EAAOA,EAAK,MAAQze,EAAK,MACvC,KAAK,aAAe,KAAK,MAAM,EAAIwlD,EAAM,OAASA,EAAM,UAAU,IAAMA,EAAM,QAAQ,MAAM,EACxFzlD,EAAgBC,CAAI,IACtB,KAAK,aAAeA,GAEtB,KAAK,qBAAqBA,EAAMye,CAAI,CACtC,CACA,IAAM+c,EAAQ,KAAK,MACdA,IAGD,CAAC,KAAK,mBAAqBgX,EAAa,YAAYhX,CAAK,CAAC,CAAC,SAC7D,KAAK,kBAAoB,GACzB,KAAK,eAAe,GAElB2tE,GACF,KAAK,KAAK,EAEd,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,iBACd,CACA,QAAQ,EAAO,EAAM,CAEnB,GAAI3oG,EAAK,MACP,KAAK,MAAQ8uC,EAAM,WAGrB,OAAQ9uC,EAAK,QAAb,CACE,KAAKgc,EAAa,SAClB,KAAKA,EAAa,mBAClB,KAAKA,EAAa,mBAClB,KAAKA,EAAa,gBAClB,KAAKA,EAAa,kBAClB,KAAKA,EAAa,eAClB,KAAKA,EAAa,iBAChB,KAAK,yBAAyBizB,EAAkB,KAAMjvC,CAAI,EAC1D,MACF,KAAKgc,EAAa,iBAClB,KAAKA,EAAa,mBAClB,KAAKA,EAAa,oBACZ,CAAChc,EAAK,YAAc,KAAK,QAAU8uC,EAAM,eAAmC9uC,EAAK,SAA0C,OAAUiwC,EAAoB,QAC3J,KAAK,MAAQnB,EAAM,MAErB,MACF,KAAK9yB,EAAa,uBAClB,KAAKA,EAAa,oBAChB,GAAIhc,EAAK,SAAW,OAClB,OAEE,KAAK,2BAA2BA,CAAI,GACtC,KAAK,kBAAkB,EAEzB,MACF,KAAKgc,EAAa,kBAChB,GAAIhc,EAAK,SAAW,OAClB,OAEE,KAAK,2BAA2BA,CAAI,IAChB,CAAC,KAAK,OAAO,yBAA2B,KAAK,OAAO,cAExE,KAAK,kBAAoB,GAEzB,KAAK,gBAAgB,EAAG,GAAwB,GAGpD,MACF,KAAKgc,EAAa,mBAChB,KAAK,mBAAmBhc,CAAI,CAEhC,CACF,CACA,4BAA6B,CAC3B,KAAK,MAAQ8uC,EAAM,KACd,KAAK,oBACR,KAAK,mBAAqB,GAC1B,KAAK,iBAAmB,KAAK,iBAE/B,KAAK,cAAc,CACrB,CACA,gBAAgB,EAAO,CACrB,QACC,CACD,GAAIpzC,IAAS+G,EAAsB,OAAS,CAAC,KAAK,SAAU,CAC1D,IAAMg2D,GAAe/8D,IAAS+G,EAAsB,MAAQ,KAAK,YAAc,KAAK,cAAgB,KAAK,MACrGg2D,IACF,KAAK,mBAAmBA,EAAa/8D,EAAMuzC,EAAkB,IAAI,EACjE,KAAK,KAAK,EAEd,CACF,CACA,gBAAgB,EAAO,EAAM,CACvB,KAAK,MAAQ,IAAM,KAAK,cAC1B,KAAK,MAAQ,KAAK,YAAY,MAC1B,KAAK,QAAU,IACjB,KAAK,wBAAwB,KAAK,WAAW,GAGjD,KAAK,OAASjvC,EAAK,MACrB,CACA,gBAAiB,CACf,KAAK,eAAiB,CAAC,KAAK,cAC9B,CACA,gBAAiB,CACf,GAAM,CACJ,SACE,KACJ,GAAI,CAACg7B,EACH,OAEF,IAAM4T,EAAc5T,EAAM,YACtBk+B,EAAgB,KAAK,cACzB,GAAIA,GAAiB,GAAKtqB,EAAcsqB,EAAe,CACrD,GAAIl+B,EAAM,QAAS,CACjB,KAAK,IAAI,qBAAqBk+B,EAAc,uBAAuBtqB,GAAa,EAChF,MACF,CACA,IAAMsvB,EAAiB,KAAK,eACxBA,GAAkBhF,IACpB,GAAiBgF,GAEnB,IAAMlpD,EAAU,KAAK,gBAAgB,EAC/Bo3C,EAAWpa,EAAa,YAAYhX,CAAK,EACzCg5B,EAAc5H,EAAS,OAASA,EAAS,MAAM,CAAC,EAAI,EACpD/hC,EAAQ2pC,EAAckF,EACtB0vC,EAAgB,KAAK,IAAI,KAAK,OAAO,cAAe,KAAK,OAAO,sBAAsB,GACxF,KAAK,OAAO,wBAA0Bv+E,EAAQ,IAAMA,EAAQu+E,GAAiB,KAAK,cAAgBv+E,EAAQ,GAAMrV,GAAmC,YAAe,OACpK,KAAK,IAAI,+BAA+BqV,EAAM,uBAAuB,EACrE,GAAiBA,EACjB,KAAK,cAAgB6uC,GAEnBtqB,EAAcsqB,IAChB,KAAK,IAAI,iCAAiCA,EAAc,qBAAqBtqB,EAAY,gBAAgBolB,GAAa,EACtH,EAAM,YAAckF,EAExB,CACF,CACA,eAAe,EAAc,CAC3B,IAAI/kD,EAAa,KAAK,OAAO,mBAAqBqF,EAAa,WAS/D,OARI,KAAK,gBAAkBrF,IACzB,KAAK,IAAI,sBAAsB,EAC/B,AACEA,EADEA,EAAW,QAAQ,WAAW,IAAM,GAGzB,YAFA,aAKVA,CACT,CACA,qBAAqB,EAAU,EAAO,CACpC,EAAS,YAAc,GACvB,KAAK,YAAY0J,EAAU5Y,CAAK,CAAC,CAAC,KAAM,GAAS,CAC/C,GAAM,CACJ,OACE,KACEzF,EAAOQ,GAA6B,KAC1C,GAAI,CAACR,GAAQ,KAAK,mBAAmBA,CAAI,EACvC,OAEF,EAAM,cAAgB,EACtB,KAAK,MAAQsvC,EAAM,KACnB,KAAK,mBAAqB,GAC1B,KAAK,YAAc,GACnB,IAAMkW,EAAQxlD,EAAK,MACnB,EAAM,QAAQ,MAAQ,EAAM,QAAQ,IAAM,EAAM,UAAU,MAAQ,EAAM,UAAU,IAAM,KAAK,YAAY,IAAI,EAC7G2a,EAAI,QAAQkW,EAAO,YAAarwB,CAAI,EACpC,EAAK,YAAc,EACrB,CAAC,CAAC,CAAC,MAAO,GAAW,CACf,KAAK,QAAU8uC,EAAM,SAAW,KAAK,QAAUA,EAAM,QAGzD,KAAK,KAAKt3B,CAAM,EAChB,KAAK,qBAAqBqG,CAAQ,EACpC,CAAC,CACH,CACA,wBAAwB,EAAgB,CACtC,IAAMliB,EAAK,KAAK,aACV,CACJ,OACE,KACE,CACJ,cACA,aACEo5E,EACE54E,EAAU,KAAK,kBAAkBq+D,CAAS,EAChD,GAAI,CAACr+D,EAAS,CACZ,KAAK,wBAAwBq+D,CAAS,EACtC,MACF,CACA,GAAM,CACJ,OACA,OACA,SACEr+D,EACE,CACJ,QACA,OACA,MACA,eACE63E,EACE,CACJ,WACE/uE,EACEyP,EAAQ,KAAK,SAAW,IAAK,GAAIs/D,EAAY,MACnD,GAAI,KAAK,mBAAmBx0E,CAAI,EAC9B,KAAK,gBAAgB,eAAeA,CAAI,MAG1C,CACA,GADA,KAAK,MAAQsvC,EAAM,QACf5sC,EAAa,CACf,IAAM+E,EAAS/E,EAAY,OAC3B,GAAI+E,EAAQ,CACV,IAAMovE,EAAc72E,EAAK,aAAeA,EACxC,GAAI,KAAK,yBAAyB0C,EAAa1C,CAAI,EACjD,OAEF,KAAK,mBAAmByF,EAAOgC,EAAQovE,EAAa7b,CAAS,EAC7DrgD,EAAI,QAAQkW,EAAO,0BAA2B,CAC5C,KAAMgmD,EACN,KACA,QACF,CAAC,CACH,CACA,IAAM7uE,EAAWtF,EAAY,QACvBZ,EAAYY,EAAY,UACxBg3B,EAAU,KAAK,QAAQ15B,EAAK,IAClC,GAAImI,EAAeH,CAAQ,IAAM,CAAC0xB,GAAWA,EAAQ,WAAa1xB,GAAY0xB,EAAQ,YAAc53B,GAAY,CAC9G,IAAMe,EAAUH,EAAY,QAC5B,KAAK,QAAQ1C,EAAK,IAAM,CACtB,WACA,YACA,SACF,EACA2a,EAAI,QAAQkW,EAAO,eAAgB,CACjC,OACA,KACA,QAAS7oB,EACT,YACA,SACF,CAAC,CACH,CACF,CACA,GAAIiN,GAASO,EAAS,CAChBN,GAASD,EAAM,OAAS,cAC1B,KAAK,YAAYjV,CAAI,EAEvB,IAAMqnB,EAAW7R,EAAQ,UAAUxV,EAAK,GAAK,EAAIwV,EAAQ,SACnD6zF,EAAkBrpG,EAAK,KAAOwV,EAAQ,QACtC8zF,EAAyB,CAACjiF,GAAYrnB,EAAK,GAAKqnB,EAAS,GAC/D,GAAImtD,EAAY,cAAgB,GAAO,CACrC,GAAM,CACJ,WACA,SACA,WACA,UACEv/D,EACJ,GAAIwJ,EACF,EAAK,kBAAkBxJ,EAAM,MAAQ,CACnC,WACA,SACA,WACA,QACF,OAKA,GAHIA,EAAM,eAAiBA,EAAM,aAAe+lD,EAAU,KAAO,GAAK,CAACsuC,IACrE,KAAK,eAAiB,IAEpBr0F,EAAM,SAAWA,EAAM,YAAa,CACtC,IAAM+wC,EAAa,KAAK,qBAAqB,EACvCiU,GAAoBjU,EAAaA,EAAW,IAAM,KAAK,gBAAgB,GAAK,KAAK,OAAO,cACxF/rB,EAAYhlB,EAAM,iBAAmBA,EAAM,iBAAmBkT,EACpE,GAAI,CAACkhF,GAAmBpvC,EAAmBhgC,EAAY,KAAK,OAAO,eAAiB,CAACqvE,EAAwB,CAC3G,KAAK,UAAUtpG,CAAI,EACnB,MACF,CAAWspG,IACT,EAAK,IAAM,IAEbtpG,EAAK,wBAAwBiV,EAAM,KAAMjV,EAAK,MAAOkoB,EAAQloB,EAAK,MAAO0oB,EAAQ,EAAI,CACvF,MAAW2gF,GAAmBlhF,GAAY3S,EAAQ,uBAAyB,GAAKkkC,KAC9E,EAAK,IAAM,IAGf15C,EAAK,wBAAwBiV,EAAM,KAAMkT,EAAUD,EAAQE,EAAUM,CAAM,EAC3E,AACE,KAAK,oBAAoB1oB,EAE3B,KAAK,mBAAmBiV,EAAOjV,EAAMye,EAAMu8C,EAAWquC,GAAmBC,CAAsB,CACjG,MAAO,GAAID,GAAmBC,EAC5B,EAAK,IAAM,OACN,CACL,KAAK,UAAUtpG,CAAI,EACnB,MACF,CACF,CACA,GAAIkV,EAAO,CACT,GAAM,CACJ,WACA,SACA,WACA,UACEA,EACAuJ,IACF,EAAK,kBAAkBxb,EAAsB,OAAS,CACpD,WACA,SACA,WACA,QACF,GAEFjD,EAAK,wBAAwBiD,EAAsB,MAAOklB,EAAUD,EAAQE,EAAUM,CAAM,EAC5F,KAAK,mBAAmBxT,EAAOlV,EAAMye,EAAMu8C,CAAS,CACtD,CACA,GAAIxlD,GAAW83D,GAAO,MAAQA,EAAI,QAAQ,OAAQ,CAChD,IAAMwJ,EAAa,CACjB,KACA,OACA,UACA,QAASxJ,EAAI,OACf,EACA3yD,EAAI,QAAQkW,EAAO,sBAAuBimD,CAAU,CACtD,CACA,GAAIthE,GAAWue,EAAM,CACnB,IAAMgjD,EAAc,CAClB,KACA,OACA,UACA,QAAShjD,EAAK,OAChB,EACApZ,EAAI,QAAQkW,EAAO,sBAAuBkmD,CAAW,CACvD,CAzHmB,CA0HrB,CACA,YAAY,EAAM,CAChB,KAAK,KAAK,GAAGh3E,EAAgBC,CAAI,EAAI,QAAU,OAAO,4DAA4DA,EAAK,KAAK,CAC9H,CACA,mBAAmB,EAAc,EAAQ,EAAM,EAAW,CACxD,GAAI,KAAK,QAAUsvC,EAAM,QACvB,OAEF,KAAK,UAAY,CAAC,CAAC7nC,EAAO,OAAS,CAACA,EAAO,MACvC,KAAK,UAAY,CAAC,KAAK,YACzB,OAAOA,EAAO,MACVA,EAAO,YACT,KAAK,YAAYzH,CAAI,GAGzB,GAAM,CACJ,QACA,QACA,cACEyH,EACJ,GAAIyN,EAAO,CACT,IAAMnE,EAAaiJ,EAAa,WAC5BrF,EAAa/D,GAA0BsE,EAAM,MAAOnE,CAAU,EAC9D4D,IAAe,SACjB,EAAa,aAEf,IAAMnB,EAAKxY,EAAU,UAAU,YAAY,EAC3C,GAAI,KAAK,iBAAkB,CACzB,AAEI2Z,IADEA,EAAW,QAAQ,WAAW,IAAM,GAGzB,YAFA,YAKjB,IAAM40F,EAAgBr0F,EAAM,SACxBq0F,GAAiB,iBAAkBA,IAAkBA,EAAc,cAAgB,KAAO,GAAK/1F,EAAG,QAAQ,SAAS,IAAM,KAC3H,EAAa,YAEjB,CACImB,GAAcA,EAAW,QAAQ,WAAW,IAAM,IAAMnB,EAAG,QAAQ,SAAS,IAAM,IAAM0B,EAAM,YAAc,eAC9G,EAAa,YACb,KAAK,IAAI,iCAAiCP,GAAY,GAEpD5D,GAAcA,IAAe4D,GAC/B,KAAK,IAAI,kCAAkC5D,EAAW,SAAS4D,EAAW,EAAE,EAE9E,EAAM,WAAaA,EACnB,EAAM,GAAK86B,EAAkB,KAC7B,KAAK,IAAI,gCAAgCv6B,EAAM,UAAU,mCAAmCP,GAAc,GAAG,GAAG5D,GAAc,GAAG,GAAGmE,EAAM,MAAM,EAAE,EAClJ,OAAOzN,EAAO,UAChB,CACA,GAAIwN,EAAO,CACT,EAAM,WAAa+E,EAAa,WAChC,EAAM,GAAKy1B,EAAkB,KAC7B,IAAM+5D,EAAmBv0F,EAAM,MAC/B,GAAKu0F,GAAqD,SAAY,EACpE,OAAQA,EAAR,CACE,IAAK,OACL,IAAK,OACH,EAAM,MAAQ,mBACd,MACF,IAAK,OACH,EAAM,MAAQ,gBACd,MACF,IAAK,OACH,EAAM,MAAQ,aAElB,CAEF,KAAK,IAAI,gCAAgCv0F,EAAM,UAAU,0BAA0B+E,EAAa,YAAc,GAAG,GAAGwvF,EAAiB,GAAGv0F,EAAM,QAAUu0F,EAAwD,GAArC,qBAAuBv0F,EAAM,QAAaA,EAAM,aAAe,iBAAmBA,EAAM,aAAe,IAAI,EACtR,OAAOxN,EAAO,UAChB,CACIgiG,IACF,KAAK,IAAI,qCAAqCA,EAAW,UAAU,0BAA0BzvF,EAAa,OAAO,GAAGyvF,EAAW,MAAM,EAAE,EACvI,OAAOhiG,EAAO,MACd,OAAOA,EAAO,OAEhB,IAAMiiG,EAAa,OAAO,KAAKjiG,CAAM,EACrC,GAAIiiG,EAAW,OAAQ,CAErB,GADA,KAAK,IAAI,QAAQ74E,EAAO,cAAeppB,CAAM,EACzC,CAAC,KAAK,IACR,OAEFiiG,EAAW,QAAS,GAAc,CAEhC,IAAMhnG,EADQ+E,EAAOuzE,EACI,CAAC,YACtBt4E,GAAe,MAAQA,EAAY,YACrC,KAAK,IAAI,QAAQmuB,EAAO,iBAAkB,CACxC,KAAMmqD,EACN,KAAMt4E,EACN,OACA,KAAM,KACN,YACA,OAAQ1C,EAAK,IACf,CAAC,CAEL,CAAC,CACH,CACA,KAAK,cAAc,CACrB,CACA,sBAAuB,CACrB,IAAM2pG,EAAe,KAAK,aAAe,KAAK,WAAa,EAAI,KAAK,YAAc,KAAK,MACvF,OAAO,KAAK,iBAAiBA,EAAcl6D,EAAkB,IAAI,CACnE,CACA,IAAI,iBAAkB,CACpB,GAAM,CACJ,SACA,SACE,KACEwa,EAAY3xC,IAAiC7S,GAInD,OAHKwkD,EAGE,KAAK,mBAAmBA,EAAU,UAAU,EAF1C,KAAK,OAAO,eAGvB,CACA,UAAU,EAAM,CACd,KAAK,eAAiB,GACtB,KAAK,kBAAoBjqD,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAeA,CAAI,EACxB,KAAK,gBAAgB,eAAeA,CAAI,EACxC,KAAK,aAAe,KACpB,KAAK,iBAAmBA,EAAK,MAC7B,KAAK,MAAQsvC,EAAM,IACrB,CACA,sBAAuB,CACrB,IAAMr6B,EAAQ,KAAK,MACfgzF,EAAqB,KACzB,GAAIhzF,GAASA,EAAM,WAAa,GAAKA,EAAM,UAAY,GAAO,CAC5D,IAAMm6B,EAAcn6B,EAAM,YAM1B,GALIu9B,EAAa,WAAWv9B,EAAOm6B,CAAW,EAC5C,EAAqB,KAAK,gBAAgBA,CAAW,EAC5CoD,EAAa,WAAWv9B,EAAOm6B,EAAc,EAAG,IACzD,EAAqB,KAAK,gBAAgBA,EAAc,EAAG,GAEzD64D,EAAoB,CACtB,KAAK,kBAAoB,KACzB,IAAM2B,EAAc,KAAK,YACnBC,EAAmB5B,EAAmB,OACxC,CAAC2B,GAAe3B,EAAmB,KAAO2B,EAAY,IAAMA,EAAY,QAAUC,KACpF,KAAK,YAAc5B,EACnB,KAAK,IAAI,QAAQp3E,EAAO,aAAc,CACpC,KAAMo3E,CACR,CAAC,GACG,CAAC2B,GAAeA,EAAY,QAAUC,IACxC,KAAK,IAAI,QAAQh5E,EAAO,eAAgB,CACtC,MAAOg5E,CACT,CAAC,EAGP,CACF,CACF,CACA,IAAI,WAAY,CACd,IAAM7pG,EAAO,KAAK,iBAIlB,OAHIA,EACKA,EAAK,MAEP,EACT,CACA,IAAI,aAAc,CAEhB,GAAI,KAAK,YACP,OAAO,KAAK,YAEd,IAAMovC,EAA+B,KAAK,OAAuC,aAAgB,KAAK,gBAItG,OAHIjnC,EAAeinC,CAAW,EACrB,KAAK,gBAAgBA,CAAW,EAElC,IACT,CACA,IAAI,wBAAyB,CAE3B,IAAMA,EAA+B,KAAK,OAAuC,aAAgB,KAAK,gBACtG,GAAIjnC,EAAeinC,CAAW,EAAG,CAC/B,IAAM55B,EAAU,KAAK,gBAAgB,EAC/BxV,EAAO,KAAK,cAAgBwV,EAAU0F,GAAkB,KAAM1F,EAAQ,UAAW45B,CAAW,EAAI,MACtG,GAAIpvC,EAAM,CACR,IAAM8pG,EAAkB9pG,EAAK,gBAC7B,GAAI8pG,IAAoB,KAAM,CAC5B,IAAMC,EAASD,GAAmB16D,EAAcpvC,EAAK,OAAS,IAC9D,OAAO,IAAI,KAAK+pG,CAAM,CACxB,CACF,CACF,CACA,OAAO,IACT,CACA,IAAI,cAAe,CACjB,IAAM/pG,EAAO,KAAK,YAIlB,OAHIA,EACKA,EAAK,MAEP,EACT,CACA,IAAI,kBAAmB,CACrB,IAAMA,EAAO,KAAK,YAIlB,OAHIA,EACK,KAAK,sBAAsBA,CAAI,EAEjC,IACT,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,eACd,CACF,EACM,GAAN,cAAwB+wC,EAAO,CAC7B,YAAY,EAAQ,EAAS,CAC3B,MAAM,aAAc7oC,CAAO,EAC3B,KAAK,OAAS,IAAK,GACnB,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAgB,KACrB,KAAK,OAAS8M,CAChB,CACA,MAAM,EAAM,CACV,IAAK,IAAM7Y,KAAM,KAAK,eAAgB,CACpC,IAAMg3D,EAAS,KAAK,eAAeh3D,EAAG,CAAC,OACvC,GAAIg3D,EAAQ,CAEV,GAAIj3D,GAAQA,IAA6Bi3D,EAAO,SAA4C,KAAK,KAC/F,OAEFA,EAAO,MAAM,CACf,CACF,CACF,CACA,QAAS,CACP,IAAK,IAAMh3D,KAAM,KAAK,eAAgB,CACpC,IAAM6tG,EAAU,KAAK,eAAe7tG,IAChC6tG,EAAQ,wBAA0BA,EAAQ,YAAY,qBACxD,OAAO,KAAK,eAAe7tG,EAE/B,CACF,CACA,SAAU,CACR,KAAK,OAAO,EACZ,IAAK,IAAMA,KAAM,KAAK,eAAgB,CACpC,IAAMg3D,EAAS,KAAK,eAAeh3D,EAAG,CAAC,OACnCg3D,GACFA,EAAO,QAAQ,CAEnB,CACA,KAAK,eAAiB,CAAC,CACzB,CACA,mBAAmB,EAAM,EAAU32C,EAAa,eAAgB,EAAO,EAAgB,EAAU,CAC/F,OAAO,IAAImD,GAAU,CACnB,KAAMD,EAAW,cACjB,UACA,MAAO,GACP,OACA,WACA,QACA,gBACF,CAAC,CACH,CACA,UAAU,EAAa,EAAoB,EAAoB,CAC7D,GAAI,KAAK,eAAiB,KAAK,OAAO,YAAc,CAAC,KAAK,cAAc,4BAA4B,CAAC,CAAC,OAAQ,CAC5G,GAAIgI,EAAmB,OACrB,IAAK,IAAI7rB,EAAI,EAAGizB,EAAIpH,EAAmB,OAAQ7rB,EAAIizB,EAAG,IAAK,CACzD,IAAM9uB,EAAO0nB,EAAmB7rB,GAChC,GAAIouG,EAAY,IAAMjqG,EAAK,KAAO,CAACD,EAAgBkqG,CAAW,GAAK,CAAClqG,EAAgBC,CAAI,GAAKiqG,EAAY,GAAKjqG,EAAK,KAAO,CAAC2oG,GAAsB9sG,GAAKizB,EAAI,EACxJ,OAAO,KAAK,cAAc,sBAAsB9uB,CAAI,CAAC,CAAC,KAAM,GAAoB,CAC9E,GAAI,CAAC,KAAK,cACR,OAEFA,EAAK,aAAa+iF,CAAe,EACjC,IAAMlgE,EAAYL,GAAiCugE,CAAe,EAClE,GAAIlgE,EACF,OAAO,KAAK,cAAc,mBAAmB,CAACA,CAAS,CAAC,CAE5D,CAAC,CAEL,CAEF,GAAI,KAAK,OAAO,8BAA+B,CAC7C,IAAM4hE,EAAqB3hE,GAAuB,KAAK,MAAM,EAC7D,GAAI2hE,EAAmB,OACrB,OAAO,KAAK,cAAc,mBAAmBA,CAAkB,CAEnE,CACF,CACA,OAAO,IACT,CACA,KAAK,EAAM,CAMT,MALI,CAACzkF,EAAK,aAAeA,EAAK,WAAa,KAAK,eAAiB,KAAK,OAAO,WACpE,KAAK,cAAc,sBAAsBA,CAAI,CAAC,CAAC,KAAM,GACnD,KAAK,aAAaA,EAAM+iF,CAAe,CAC/C,EAEI,KAAK,aAAa/iF,CAAI,CAC/B,CACA,aAAa,EAAM,EAAiB,CAClC,IAAIkqG,EAAUC,EACVpnB,GACF/iF,EAAK,aAAa+iF,CAAe,EAEnC,IAAMp8E,EAAc3G,EAAK,YACzB,GAAI,CAAC2G,EAAa,CAChB,IAAM4V,EAAQ,gBAAI,MAAMwmE,EAAkB,gEAAgEA,IAAoB,oFAAoF,KAAK,eAAiB,KAAK,OAAO,WAAW,EAAE,EACjQ,OAAO,QAAQ,OAAO,KAAK,mBAAmB/iF,EAAMwc,EAAa,eAAgBD,CAAK,CAAC,CACzF,CACA,IAAMpC,EAAMxT,EAAY,IACxB,GAAI,CAACwT,EACH,OAAO,QAAQ,OAAO,KAAK,mBAAmBna,EAAMwc,EAAa,eAAgB,gBAAI,MAAM,qBAAqBrC,EAAI,EAAE,CAAC,CAAC,EAE1H,IAAMhe,EAAKo0C,GAAS5pC,CAAW,EAC3BqjG,EAAU,KAAK,eAAe7tG,GAClC,IAAK,EAAW6tG,IAAY,MAAQE,EAAS,YAAY,IAEvD,MADA,GAAY,IAAMF,EAAQ,YAAY,IAC/B,QAAQ,QAAQ,CACrB,OACA,SACF,CAAC,EAEH,GAAI,KAAK,gBAAkB,EAAYA,IAAY,MAAQG,EAAU,eAEnE,OADkB,KAAK,cAAc,aAAaH,EAAQ,WAC1C,EAAhB,CACE,IAAK,SACL,IAAK,mBACH,OAAOA,EAAQ,eAAe,KAAM,GAAkB,CACpD,GAAM,CACJ,QAASI,GACPjvC,EAEJ,MADA,GAAY,IAAMivC,EAAS,YAAY,IAChC,CACL,OACA,QAASA,CACX,CACF,CAAC,CACL,CASF,OAPA,KAAK,IAAI,GAAG,KAAK,eAAejuG,GAAM,MAAQ,IAAI,QAAQwK,EAAY,MAAQ,WAAaxI,EAAWwI,EAAY,KAAK,EAAI,GAAG,QAAQA,EAAY,IAAI,QAAQ3G,EAAK,KAAK,GAAGA,EAAK,OAAO,EACvL,EAAU,KAAK,eAAe7D,GAAM,CAClC,cACA,eAAgB,KAChB,OAAQ,KACR,uBAAwB,IAC1B,EACQwK,EAAY,OAApB,CACE,IAAK,aACL,IAAK,kBACL,IAAK,iBAIH,OAHIA,EAAY,YAAc,WACrB,KAAK,YAAYqjG,EAAShqG,CAAI,EAEhC,KAAK,WAAWgqG,EAAShqG,CAAI,EACtC,IAAK,UACL,IAAK,UACL,IAAK,cACH,OAAO,KAAK,YAAYgqG,EAAShqG,CAAI,EACvC,QACE,OAAO,QAAQ,OAAO,KAAK,mBAAmBA,EAAMwc,EAAa,eAAgB,gBAAI,MAAM,0CAA0C7V,EAAY,OAAO,EAAE,CAAC,CAAC,CAChK,CACF,CACA,WAAW,EAAS,EAAM,CACxB,IAAMw0D,EAAgB,CACpB,OACA,SACF,EACA,GAAI,KAAK,eAAiB,KAAK,OAAO,WAAY,CAChD,IAAIwjC,EACJ,GAAI,CAACqL,EAAQ,YAAY,QAAU,EAAoBhqG,EAAK,cAAgB,MAAQ2+F,EAAkB,KAAM,CAC1G,IAAMx3F,EAASD,GAAoBlH,EAAK,YAAY,IAAI,EACxD,GAAImH,EAAO,OAAQ,CACjB,IAAIP,EAAQO,EAAO,GACfP,EAAM,KAAM,GAAMI,IAAM,CAAC,GAC3B,KAAK,IAAI,qCAAqC7I,EAAWyI,CAAK,GAAG,EACjE0f,GAAS,eAAe0jF,EAAQ,YAAY,IAAKpjG,CAAK,IAEtD,EAAQ0f,GAAS,eAAe0jF,EAAQ,YAAY,GAAG,EACvD,KAAK,IAAI,mCAAmC7rG,EAAWyI,CAAK,GAAG,GAEjE,EAAQ,YAAY,MAAQA,CAC9B,CACF,CAKA,MAJI,CAACojG,EAAQ,YAAY,OAAS,CAACjqG,EAAgBC,CAAI,EAC9C,QAAQ,QAAQm7D,CAAa,GAG9B,EAAQ,eADiB,KAAK,cAAc,QAAQA,CACJ,CAAC,CAAC,KAAM,IAC9D,EAAQ,uBAAyBmpB,EAC1BnpB,EACR,EAAA,CAAG,MAAO,GAAU,CAKnB,KAJA,GAAQ,eAAiB,KACrB,SAAU5+C,IACZ,EAAM,KAAK,KAAOvc,GAEduc,CACR,CAAC,CACH,CACA,OAAO,QAAQ,QAAQ4+C,CAAa,CACtC,CACA,YAAY,EAAS,EAAM,CACzB,IAAMnmD,EAAS,KAAK,OACdmtE,EAASntE,EAAO,OAChBykD,EAAY,IAAI0oB,EAAOntE,CAAM,EAEnC,MADA,GAAK,UAAY,EAAQ,OAASykD,EAC3B,EAAQ,eAAiB,IAAI,SAAS,EAAS,IAAW,CAC/D,IAAMv6C,EAAgB,CACpB,UACA,OACA,aAAc,cACd,IAAK8qF,EAAQ,YAAY,GAC3B,EACMntF,EAAa7H,EAAO,cAAc,QAClCo+C,EAAe,CACnB,aACA,QAASv2C,EAAW,cACpB,SAAU,EACV,WAAY,EACZ,cAAe,CACjB,EAmCA48C,EAAU,KAAKv6C,EAAek0C,EAAc,CAjC1C,WAAY,EAAU,EAAO,EAAS,IAAmB,CACvD,GAAM,CACJ,KAAMi3C,EACN,QAASD,GACPztG,EACER,EAAKo0C,GAAS65D,EAAS,WAAW,EACxC,GAAI,CAACC,EAAM,aAAeD,IAAa,KAAK,eAAejuG,GACzD,OAAOq2D,EAAO,KAAK,mBAAmB63C,EAAO7tF,EAAa,eAAgB,gBAAI,MAAM,8CAA8C,EAAGmxE,CAAc,CAAC,EAEtJ,EAAS,YAAY,IAAM,EAAM,YAAY,IAAM,IAAI,WAAWh9C,EAAS,IAAI,EAC/E,EAAM,UAAY,KAClB,EAAS,OAAS,KAClB4hB,EAAQ,CACN,KAAM83C,EACN,QAASD,CACX,CAAC,CACH,EACA,SAAU,EAAU,EAAS,EAAgB,IAAU,CACrD,KAAK,YAAYztG,CAAO,EACxB61D,EAAO,KAAK,mBAAmBxyD,EAAMwc,EAAa,eAAgB,gBAAI,MAAM,cAAcm0B,EAAS,KAAK,eAAeA,EAAS,MAAM,EAAGg9C,EAAgBhyF,EAAe,CACtK,IAAKujB,EAAc,IACnB,KAAM,IAAK,EACb,EAAGyxB,CAAQ,CAAC,CAAC,CACf,EACA,WAAY,EAAO,EAAS,IAAmB,CAC7C,KAAK,YAAYh0C,CAAO,EACxB61D,EAAO,KAAK,mBAAmBxyD,EAAMwc,EAAa,iBAAkB,gBAAI,MAAM,uBAAuB,EAAGmxE,CAAc,CAAC,CACzH,EACA,SAAU,EAAO,EAAS,IAAmB,CAC3C,KAAK,YAAYhxF,CAAO,EACxB61D,EAAO,KAAK,mBAAmBxyD,EAAMwc,EAAa,iBAAkB,gBAAI,MAAM,qBAAqB,EAAGmxE,CAAc,CAAC,CACvH,CAEwD,CAAC,CAC7D,CAAC,CACH,CACA,YAAY,EAAS,CACnB,GAAM,CACJ,OACA,UACA,IAAKxzE,GACHxd,EACEw2D,EAAS62C,EAAQ,OACnBhqG,EAAK,YAAcmzD,IACrB,EAAK,UAAY,KACjB,EAAQ,OAAS,MAEnB,IAAMh3D,EAAKo0C,GAASy5D,EAAQ,WAAW,GAAK7vF,EAC5C,OAAO,KAAK,eAAehe,GACvBg3D,GACFA,EAAO,QAAQ,CAEnB,CACF,EA8BM,GAAN,KAAqB,CACnB,YAAY,EAAK,CACf,KAAK,IAAM,IAAK,GAChB,KAAK,QAAU,OAAO,OAAO,IAAI,EACjC,KAAK,aAAe,KACpB,KAAK,iBAAmB,KAAK,mBAC7B,KAAK,IAAMx4C,EACX,KAAK,kBAAkB,CACzB,CACA,UAAU,EAAe,CACzB,CACA,UAAW,CACT,KAAK,uBAAuB,CAC9B,CACA,mBAAoB,CAClB,GAAM,CACJ,OACE,KACJA,EAAI,GAAGkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC5DlW,EAAI,GAAGkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACtDlW,EAAI,GAAGkW,EAAO,oBAAqB,KAAK,oBAAqB,IAAI,EACjElW,EAAI,GAAGkW,EAAO,uBAAwB,KAAK,uBAAwB,IAAI,EACvElW,EAAI,GAAGkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,CAC1D,CACA,qBAAsB,CACpB,GAAM,CACJ,OACE,KACJlW,EAAI,IAAIkW,EAAO,iBAAkB,KAAK,kBAAmB,IAAI,EAC7DlW,EAAI,IAAIkW,EAAO,cAAe,KAAK,eAAgB,IAAI,EACvDlW,EAAI,IAAIkW,EAAO,oBAAqB,KAAK,oBAAqB,IAAI,EAClElW,EAAI,IAAIkW,EAAO,uBAAwB,KAAK,uBAAwB,IAAI,EACxElW,EAAI,IAAIkW,EAAO,eAAgB,KAAK,gBAAiB,IAAI,CAC3D,CACA,qBAAqB,EAAS,CAC5B,IAAM7b,EAAS,KAAK,IAAI,OAClBs1F,EAAUt1F,EAAO,QACjBmtE,EAASntE,EAAO,OAEhBm+C,EAAS,IADQm3C,GAAWnoB,GACAntE,CAAM,EAExC,MADA,MAAK,QAAQrY,EAAQ,MAAQw2D,EACtBA,CACT,CACA,kBAAkB,EAAS,CACzB,OAAO,KAAK,QAAQx2D,EAAQ,KAC9B,CACA,oBAAoB,EAAa,CAC3B,KAAK,QAAQ4tG,IACf,OAAO,KAAK,QAAQA,EAExB,CACA,wBAAyB,CACvB,IAAK,IAAMA,KAAe,KAAK,QAAS,CACtC,IAAMp3C,EAAS,KAAK,QAAQo3C,GACxBp3C,GACFA,EAAO,QAAQ,EAEjB,KAAK,oBAAoBo3C,CAAW,CACtC,CACF,CACA,SAAU,CACR,KAAK,aAAe,KACpB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,CAC9B,CACA,kBAAkB,EAAO,EAAM,CAC7B,GAAM,CACJ,OACE/pG,EACJ,KAAK,aAAe,KACpB,KAAK,KAAK,CACR,GAAI,KACJ,MAAO,EACP,aAAc,OACd,KAAMiwC,EAAoB,SAC1B,MACA,mBAAoB,KACpB,aAAc,IAChB,CAAC,CACH,CACA,eAAe,EAAO,EAAM,CAC1B,GAAM,CACJ,KACA,QACA,YACA,MACA,qBACA,aACEjwC,EACJ,KAAK,KAAK,CACR,KACA,QACA,YACA,aAAc,OACd,KAAMiwC,EAAoB,MAC1B,MACA,qBACA,aAAcwZ,CAChB,CAAC,CACH,CACA,oBAAoB,EAAO,EAAM,CAC/B,GAAM,CACJ,KACA,UACA,MACA,qBACA,SACEzpD,EACJ,KAAK,KAAK,CACR,KACA,UACA,MAAO,KACP,aAAc,OACd,KAAMiwC,EAAoB,YAC1B,MACA,qBACA,aAAcntC,CAChB,CAAC,CACH,CACA,uBAAuB,EAAO,EAAM,CAClC,GAAM,CACJ,KACA,UACA,MACA,qBACA,SACE9C,EACJ,KAAK,KAAK,CACR,KACA,UACA,MAAO,KACP,aAAc,OACd,KAAMiwC,EAAoB,eAC1B,MACA,qBACA,aAAcntC,CAChB,CAAC,CACH,CACA,gBAAgB,EAAO,EAAM,CAC3B,IAAM6vD,EAAS,KAAK,QAAQ1iB,EAAoB,OAChD,GAAI0iB,EAAQ,CACV,IAAMx2D,EAAUw2D,EAAO,QACnBx2D,GAAW,CAAC6D,EAAK,OAAO,KAAM,GAAQgqG,IAAQ7tG,EAAQ,YAAY,IACpEw2D,EAAO,MAAM,EACb,OAAO,KAAK,QAAQ1iB,EAAoB,OAE5C,CACF,CACA,KAAK,EAAS,CAEZ,IAAMz7B,EAAS,KAAK,IAAI,OACpBm+C,EAAS,KAAK,kBAAkBx2D,CAAO,EAC3C,GAAIw2D,EAAQ,CACV,IAAMjrD,EAAU,KAAK,IAAI,OACnBgX,EAAgBi0C,EAAO,QAC7B,GAAIj0C,GAAiBA,EAAc,eAAiBviB,EAAQ,eAAiBuiB,EAAc,MAAQviB,EAAQ,KAAOuiB,EAAc,oBAAsB,CAACviB,EAAQ,oBAAqB,CAC9KuiB,EAAc,MAAQviB,EAAQ,IAChCuL,EAAQ,IAAI,6BAA6BvL,EAAQ,IAAI,iBAAiB,EAEtEuL,EAAQ,IAAI,6BAA6BvL,EAAQ,IAAI,eAAeuiB,EAAc,KAAK,EAEzF,MACF,CACAhX,EAAQ,IAAI,yDAAyDvL,EAAQ,MAAM,EACnFw2D,EAAO,MAAM,CACf,CACA,IAAIt2C,EAUJ,GATA,AAGEA,EAHElgB,EAAQ,OAAS8zC,EAAoB,SAC1Bz7B,EAAO,mBAAmB,QAE1B3Z,EAAS,CAAC,EAAG2Z,EAAO,mBAAmB,QAAS,CAC3D,aAAc,KACd,WAAY,IACd,CAAC,EAEH,EAAS,KAAK,qBAAqBrY,CAAO,EACtCwL,EAAwCxL,EAAQ,oBAA6D,IAAI,EAAG,CACtH,IAAI0tD,EAQJ,GAPI1tD,EAAQ,OAAS8zC,EAAoB,OAAS9zC,EAAQ,QAAU,KAClE,EAAe,KAAK,IAAI,OAAOA,EAAQ,MAAM,CAAC,QACrCA,EAAQ,OAAS8zC,EAAoB,aAAe9zC,EAAQ,KAAO,KAC5E,EAAe,KAAK,IAAI,YAAYA,EAAQ,GAAG,CAAC,QACvCA,EAAQ,OAAS8zC,EAAoB,gBAAkB9zC,EAAQ,KAAO,OAC/E,EAAe,KAAK,IAAI,eAAeA,EAAQ,GAAG,CAAC,SAEjD0tD,EAAc,CAChB,IAAMogD,EAAapgD,EAAa,WAC1BwzB,EAAiBxzB,EAAa,eACpC,GAAIogD,GAAc5sB,EAAgB,CAChC,IAAM6sB,EAA+B,KAAK,IAAID,EAAa,EAAG5sB,EAAiB,EAAG,EAAI,IACtF,EAAaxiF,EAAS,CAAC,EAAGwhB,EAAY,CACpC,qBAAsB,KAAK,IAAI6tF,EAA8B7tF,EAAW,oBAAoB,EAC5F,cAAe,KAAK,IAAI6tF,EAA8B7tF,EAAW,oBAAoB,CACvF,CAAC,CACH,CACF,CACF,CACA,IAAMwlE,EAA2BxlE,EAAW,YAAcA,EAAW,cAAgB,CAAC,EAChFu2C,EAAe,CACnB,aACA,QAASv2C,EAAW,cACpB,SAAUwlE,EAAyB,aAAe,EAClD,WAAYA,EAAyB,cAAgB,EACrD,cAAeA,EAAyB,iBAAmB,CAC7D,EAoBAlvB,EAAO,KAAKx2D,EAASy2D,EAAc,CAlBjC,WAAY,EAAU,EAAO,EAAU,IAAmB,CACxD,IAAMu3C,EAAU,KAAK,kBAAkBnoB,CAAQ,EAC/C,KAAK,oBAAoBA,EAAS,IAAI,EACtC,IAAM9rB,EAAS/lB,EAAS,KACxB,EAAM,QAAQ,MAAQ,YAAY,IAAI,EAClCxqB,GAAW,gBAAgBuwC,CAAM,GAAK8rB,EAAS,OAAS/xC,EAAoB,SAC9E,KAAK,2BAA2BE,EAAU6U,EAAOg9B,EAAUmL,GAAkB,KAAMgd,CAAO,EAE1F,KAAK,qBAAqBh6D,EAAU6U,EAAOg9B,EAAUmL,CAAc,CAEvE,EACA,SAAU,EAAU,EAAU,EAAgB,IAAU,CACtD,KAAK,mBAAmBnL,EAAUmL,EAAgB,GAAOh9C,EAAU6U,CAAK,CAC1E,EACA,WAAY,EAAO,EAAU,IAAmB,CAC9C,KAAK,mBAAmBg9B,EAAUmL,EAAgB,GAAM,IAAK,GAAGnoC,CAAK,CACvE,CAE+C,CAAC,CACpD,CACA,oBAAqB,CACnB,GAAI,CAAC,KAAK,IACR,OAEF,GAAM,CACJ,OAAQ,CACN,gBACA,iBAEF,kBACE,KAAK,KACLolD,GAAiBC,KACnB,KAAK,IAAI,OAAO,IAAI,GAAGD,EAAgB,OAAS,QAAQ,2CAA2ClxC,GAAe,EAClH,KAAK,IAAI,UAAUA,CAAa,EAEpC,CACA,qBAAqB,EAAU,EAAO,EAAS,EAAgB,CAC7D,IAAM/+C,EAAM,KAAK,IACX+7C,EAAS/lB,EAAS,KAClB/wC,EAAM8wC,GAAeC,EAAUh0C,CAAO,EACtCmuG,EAAe3kF,GAAW,oBAAoBuwC,EAAQ92D,CAAG,EAC/D,GAAIkrG,EAAa,qBAAsB,CACrC,EAAM,QAAQ,IAAM,YAAY,IAAI,EACpC,KAAK,2BAA2Bn6D,EAAUh0C,EAASmuG,EAAa,qBAAsBnd,EAAgBnoC,CAAK,EAC3G,MACF,CACA,GAAM,CACJ,kBACA,SACA,cACA,cACA,kBACA,gBACEslD,EACJ,KAAK,aAAe5qF,EACpB5H,EAAO,QAAS,GAAgB,CAC9B,GAAM,CACJ,iBACEmtF,EACJ,GAAIE,EAAe,CACjB,GAAM,CACJ,4BACE,KAAK,IAAI,OACT,CACF,aACA,cACEF,EACJ,IAAK,IAAI5pG,EAAI8pG,EAAc,OAAQ,KAAO,CACxC,IAAMoF,EAAepF,EAAc9pG,GAC/BwT,GAA8B07F,EAAc,QAASjuG,CAAwB,GAC/E,EAAY,WAAa,EAAa6X,EAAa,GAAGA,EAAW,GAAGo2F,IAAiBA,EACrF,GAAoB,MAAMp2F,EAAW,UAAU,EAAG,CAAC,GAAK,EACxDgxF,EAAc,OAAO9pG,EAAG,CAAC,GAChBwT,GAA8B07F,EAAc,QAASjuG,CAAwB,IACtF,EAAY,WAAa,EAAa4S,EAAa,GAAGA,EAAW,GAAGq7F,IAAiBA,EACrF,GAAoB,MAAMr7F,EAAW,UAAU,EAAG,CAAC,GAAK,EACxDi2F,EAAc,OAAO9pG,EAAG,CAAC,EAE7B,CACF,CACF,CAAC,EACD,GAAM,CACJ,MAAOw6E,EAAc,CAAC,EACtB,UAAW6c,EACX,kBAAmB8X,GACjB7kF,GAAW,yBAAyBuwC,EAAQ92D,EAAKkrG,CAAY,EAC7Dz0B,EAAY,QAEV,CADuBA,EAAY,KAAM,GAAe,CAAC7hE,EAAW,GAClD,GAAK8D,EAAO,EAAE,CAAC,YAAc,CAACA,EAAO,EAAE,CAAC,MAAM,QAClE,KAAK,IAAI,OAAO,IAAI,4GAA4G,EAChI+9D,EAAY,QAAQ,CAClB,KAAM,OACN,KAAM,OACN,QAAS,OACT,QAAS,GACT,WAAY,GACZ,OAAQ,GACR,GAAI,GACJ,MAAO,IAAI1wD,EAAS,CAAC,CAAC,EACtB,QAAS,EACT,IAAK,EACP,CAAC,GAGLhL,EAAI,QAAQkW,EAAO,gBAAiB,CAClC,SACA,cACA,YACA,WACA,kBACA,MACA,QACA,iBACA,cACA,cACA,kBACA,cACF,CAAC,CACH,CACA,2BAA2B,EAAU,EAAO,EAAS,EAAgB,EAAQ,CAC3E,IAAMlW,EAAM,KAAK,IACX,CACJ,KACA,QACA,QACEhe,EACEiD,EAAM8wC,GAAeC,EAAUh0C,CAAO,EACtCsuG,EAAU9iG,EAAe1C,CAAK,EAAIA,EAAQ0C,EAAehM,CAAE,EAAIA,EAAK,EACpEuwD,EAAYlc,GAAsB7zC,CAAO,EACzC0tD,EAAelkC,GAAW,mBAAmBwqB,EAAS,KAAM/wC,EAAKqrG,EAASv+C,EAAW,EAAG,KAAK,YAAY,EAC/G,GAAIxwD,IAASu0C,EAAoB,SAAU,CACzC,IAAMy6D,EAAc,CAClB,MAAO,IAAIvlF,EAAS,CAAC,CAAC,EACtB,QAAS,EACT,QAAS0kC,EACT,KAAM,GACN,KACF,EACA,EAAa,iBAAmB7E,EAAM,QAAQ,MAAQ55B,GAAsBy+B,EAAc,CAAC,EAC3F1vC,EAAI,QAAQkW,EAAO,gBAAiB,CAClC,OAAQ,CAACq6E,CAAW,EACpB,YAAa,CAAC,EACd,MACA,QACA,iBACA,YAAa,KACb,YAAa,KACb,gBAAiB,KACjB,gBAAiB,KACjB,aAAc,IAChB,CAAC,CACH,CACA,EAAM,QAAQ,IAAM,YAAY,IAAI,EACpC,EAAQ,aAAe7gD,EACvB,KAAK,qBAAqBA,EAAc1Z,EAAU6U,EAAO7oD,EAASgxF,EAAgBx6B,CAAM,CAC1F,CACA,2BAA2B,EAAU,EAAS,EAAO,EAAgB,EAAO,CAC1E,KAAK,IAAI,QAAQtiC,EAAO,MAAO,CAC7B,KAAMnR,EAAW,cACjB,QAASlD,EAAa,uBACtB,MAAO7f,EAAQ,OAAS8zC,EAAoB,SAC5C,IAAKE,EAAS,IACd,IAAKp0B,EACL,QACA,OAAQA,EAAM,QACd,WACA,UACA,iBACA,OACF,CAAC,CACH,CACA,mBAAmB,EAAS,EAAgB,EAAU,GAAO,EAAU,EAAO,CAC5E,IAAIgP,EAAU,aAAaq6D,EAAU,UAAY,SAAWj1C,EAAW,YAAcA,EAAS,KAAO,IAAM,IAAI,0BAA0Bh0C,EAAQ,OAC7IA,EAAQ,OAAS8zC,EAAoB,MACvC,GAAW,KAAK9zC,EAAQ,MAAM,OAAOA,EAAQ,MACpCA,EAAQ,OAAS8zC,EAAoB,aAAe9zC,EAAQ,OAAS8zC,EAAoB,kBAClG,GAAW,QAAQ9zC,EAAQ,GAAG,cAAcA,EAAQ,QAAQ,IAE9D,IAAM4f,EAAY,MAAMgP,CAAO,EAC/B,KAAK,IAAI,OAAO,KAAK,sBAAsBA,GAAS,EACpD,IAAI/V,EAAUgH,EAAa,QACvBwqF,EAAQ,GACN7zC,EAAS,KAAK,kBAAkBx2D,CAAO,EAC7C,OAAQA,EAAQ,KAAhB,CACE,KAAK8zC,EAAoB,SACvB,EAAUm1C,EAAUppE,EAAa,sBAAwBA,EAAa,oBACtE,EAAQ,GACR,MACF,KAAKi0B,EAAoB,MACvB,EAAUm1C,EAAUppE,EAAa,mBAAqBA,EAAa,iBACnE,EAAQ,GACR,MACF,KAAKi0B,EAAoB,YACvB,EAAUm1C,EAAUppE,EAAa,yBAA2BA,EAAa,uBACzE,EAAQ,GACR,MACF,KAAKi0B,EAAoB,eACvB,EAAUm1C,EAAUppE,EAAa,4BAA8BA,EAAa,oBAC5E,EAAQ,EAEZ,CACI22C,GACF,KAAK,oBAAoBx2D,EAAQ,IAAI,EAEvC,IAAM8iB,EAAY,CAChB,KAAMC,EAAW,cACjB,UACA,QACA,IAAK/iB,EAAQ,IACb,SACA,UACA,QACA,iBACA,OACF,EACIg0C,IAEF,EAAU,SAAWh1C,EAAe,CAClC,IAFWgyF,GAAiD,KAAQhxF,EAAQ,IAG5E,KAAM,IAAK,EACb,EAAGg0C,CAAQ,GAEb,KAAK,IAAI,QAAQ9f,EAAO,MAAOpR,CAAS,CAC1C,CACA,qBAAqB,EAAc,EAAU,EAAO,EAAS,EAAgB,EAAQ,CACnF,IAAM9E,EAAM,KAAK,IACX,CACJ,OACA,QACA,eACA,KACA,UACA,sBACEhe,EACEiD,EAAM8wC,GAAeC,EAAUh0C,CAAO,EACtC2uC,EAASkF,GAAsB7zC,CAAO,EACxC0uD,EAAa,OAAO1uD,EAAQ,OAAU,UAAY2uC,IAAWmE,EAAkB,KAAOhqC,EAAQ,IAAK,GACjG8W,EAAQ8tC,EAAa,qBAC3B,GAAI9tC,EAAO,CAET,GADA,KAAK,IAAI,OAAO,KAAK,GAAGA,EAAM,GAAG8tC,EAAa,KAAK,EAC/C,CAAC1vC,EAAI,OAAO,4BAA6B,CAC3CA,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,cACjB,QAASlD,EAAa,oBACtB,MAAO,GACP,MACA,QACA,OAAQD,EAAM,QACd,WACA,UACA,MAAO8uC,EACP,SACA,iBACA,OACF,CAAC,EACD,MACF,CACA,EAAa,qBAAuB,IACtC,CACA,GAAKhB,EAAa,UAAU,OA0B5B,OARIA,EAAa,MAAQ8I,IACnBA,EAAO,cACT,EAAa,UAAYA,EAAO,YAAY,GAAK,IAE/C,CAACA,EAAO,aAAe,MAAM9I,EAAa,SAAS,KACrD,EAAa,UAAY,IAGrBnuD,EAAR,CACE,KAAKu0C,EAAoB,SACzB,KAAKA,EAAoB,MACvB,GAAI4a,EAAY,CACd,GAAI,CAACssB,EACH,EAAa,OAEb,GAAIA,IAAiBh9D,EAAI,OAAO0wC,GAAa,CAC3C,IAAMgnC,EAAe13E,EAAI,OAAO,QAAQg9D,CAAY,EAChD0a,EAAe,KACjB,EAAaA,EAEjB,CAEJ,CACA13E,EAAI,QAAQkW,EAAO,aAAc,CAC/B,QAASw5B,EACT,UAAWstB,GAAgBh9D,EAAI,OAAO,GACtC,MAAO0wC,GAAc,EACrB,GAAIlvD,GAAM,EACV,QACA,iBACA,qBACA,oBAAqBD,IAASu0C,EAAoB,QACpD,CAAC,EACD,MACF,KAAKA,EAAoB,YACvB91B,EAAI,QAAQkW,EAAO,mBAAoB,CACrC,QAASw5B,EACT,MAAOstB,EACP,GAAIx7E,GAAM,EACV,QAASkW,GAAW,GACpB,QACA,iBACA,oBACF,CAAC,EACD,MACF,KAAKo+B,EAAoB,eACvB91B,EAAI,QAAQkW,EAAO,sBAAuB,CACxC,QAASw5B,EACT,MAAOstB,EACP,GAAIx7E,GAAM,EACV,QAASkW,GAAW,GACpB,QACA,iBACA,oBACF,CAAC,CAEL,KA1EoC,CAClC,IAAM84F,EAAS,EAAa,qBAAuB,gBAAI,MAAM,+BAA+B,EAC5FxwF,EAAI,QAAQkW,EAAO,MAAO,CACxB,KAAMnR,EAAW,cACjB,QAASlD,EAAa,kBACtB,MAAO,GACP,MACA,MAAO2uF,EACP,OAAQA,EAAO,QACf,WACA,UACA,MAAO9/C,EACP,SACA,iBACA,OACF,CAAC,CAEH,CA0DF,CACF,EACM,GAAN,MAAM7Q,CAAI,CACR,WAAW,SAAU,CACnB,OAAO5qB,EACT,CACA,OAAO,gBAAiB,CACtB,OAAOmgB,GAAe,CACxB,CACA,OAAO,aAAc,CACnB,OAAOE,GAAY,CACrB,CACA,OAAO,gBAAiB,CACtB,OAAOpzC,EAAe,CACxB,CACA,WAAW,QAAS,CAClB,OAAOg0B,CACT,CACA,WAAW,gBAAiB,CAC1B,OAAO6iB,EACT,CACA,WAAW,YAAa,CACtB,OAAOh0B,CACT,CACA,WAAW,cAAe,CACxB,OAAOlD,CACT,CACA,WAAW,eAAgB,CAIzB,OAHKg+B,EAAI,cAGFA,EAAI,cAFFf,EAGX,CACA,WAAW,cAAc,EAAe,CACtC,EAAI,cAAgBrL,CACtB,CACA,YAAY,EAAa,CAAC,EAAG,CAC3B,KAAK,OAAS,IAAK,GACnB,KAAK,WAAa,IAAK,GACvB,KAAK,OAAS,IAAK,GACnB,KAAK,eAAiB,IAAK,GAC3B,KAAK,mBAAqB,IAAK,GAC/B,KAAK,SAAW,IAAIqF,GACpB,KAAK,kBAAoB,GACzB,KAAK,cAAgB,KACrB,KAAK,cAAgB,IAAK,GAC1B,KAAK,iBAAmB,IAAK,GAC7B,KAAK,mBAAqB,IAAK,GAC/B,KAAK,kBAAoB,IAAK,GAC9B,KAAK,gBAAkB,IAAK,GAC5B,KAAK,iBAAmB,IAAK,GAC7B,KAAK,sBAAwB,IAAK,GAClC,KAAK,2BAA6B,IAAK,GACvC,KAAK,qBAAuB,IAAK,GACjC,KAAK,wBAA0B,IAAK,GACpC,KAAK,wBAA0B,IAAK,GACpC,KAAK,cAAgB,IAAK,GAC1B,KAAK,cAAgB,IAAK,GAC1B,KAAK,eAAiB,IAAK,GAC3B,KAAK,OAAS,KACd,KAAK,KAAO,KACZ,KAAK,WAAa,IAAK,GACvB,KAAK,oBAAsB,IAAK,GAChC,KAAK,QAAU,GACf,IAAMvrC,EAAU,KAAK,OAAS1L,EAAWyxC,EAAW,OAAS,GAAO,eAAgBA,EAAW,aAAa,EACtGj5B,EAAS,KAAK,OAASg5B,GAAYwM,EAAI,cAAevM,EAAY/lC,CAAO,EAC/E,KAAK,WAAa+lC,EACdj5B,EAAO,aACT45B,GAAoB55B,EAAQ9M,CAAO,EAErC,GAAM,CACJ,cAAekjG,EACf,iBAAkBC,EAClB,mBAAoBC,EACpB,gBAAiBC,EACjB,cAAeC,GACbx2F,EACEy2F,EAAkB,IAAIF,EAAiB,IAAI,EAC3CG,EAAgB,KAAK,cAAgB,IAAIN,EAAe,IAAI,EAC5D57D,EAAkB,IAAIqC,GAAgB,IAAI,EAC1C85D,EAA2B32F,EAAO,wBAClCsuF,EAA0BqI,EAA2B,KAAK,wBAA0B,IAAIA,EAAyB,KAAMnxD,CAAG,EAAI,KAC9HoxD,EAAmB,KAAK,iBAAmB,IAAIP,EAAkB,KAAM77D,CAAe,EACtFq8D,EAAqB,KAAK,mBAAqB,IAAIP,EAAoB,IAAI,EAC3EQ,EAAgB,IAAIN,EAAe,IAAI,EACvCO,EAAiB,IAAIxxD,GAAe,IAAI,EACxCyxD,EAA6Bh3F,EAAO,0BACpCgsE,EAAkBgrB,EAA6B,IAAIA,EAA2B,IAAI,EAAI,KACtFC,EAAkB,KAAK,gBAAkB,IAAI9xD,GAAgB,KAAM6mC,CAAe,EAClFkrB,EAAqB,IAAIjyD,GAAmB,IAAI,EAChDwf,EAAY,IAAInf,GAAU,KAAK,OAAQ,KAAK,MAAM,EAClDglC,EAAmB,KAAK,iBAAmB,IAAIjlC,GAAiB,KAAM7K,EAAiBiqB,CAAS,EAChG0yC,EAAgB,KAAK,cAAgB,IAAIryD,GAAc,KAAMtK,CAAe,EAClFq8D,EAAmB,oBAAoBvsB,CAAgB,EACvDwsB,EAAc,oBAAoBxsB,CAAgB,EAClD,IAAM8sB,EAAqB,CAACL,EAAgBE,EAAiB3sB,CAAgB,EACzEgkB,GACF8I,EAAmB,OAAO,EAAG,EAAG9I,CAAuB,EAErDtiB,GACForB,EAAmB,OAAO,EAAG,EAAGprB,CAAe,EAEjD,KAAK,mBAAqBorB,EAC1B,IAAMC,EAAiB,CAACX,EAAeE,EAAkBO,EAAeN,EAAoBC,EAAeI,EAAoB18D,CAAe,EAC9I,KAAK,qBAAuB,KAAK,iBAAiBx6B,EAAO,qBAAsBo3F,CAAkB,EACjG,IAAME,EAA6Bt3F,EAAO,sBACtCs3F,GACFF,EAAmB,KAAK,KAAK,sBAAwB,IAAIE,EAA2B,KAAM98D,EAAiBiqB,CAAS,CAAC,EAEvH,KAAK,wBAA0B,KAAK,iBAAiBzkD,EAAO,wBAAyBo3F,CAAkB,EACvG,IAAMG,EAAgCv3F,EAAO,yBACzCu3F,GACFH,EAAmB,KAAK,KAAK,2BAA6B,IAAIG,EAA8B,KAAM/8D,EAAiBiqB,CAAS,CAAC,EAE/H,KAAK,iBAAiBzkD,EAAO,mBAAoBq3F,CAAc,EAC/D,EAAU,cAAgB,KAAK,cAAgB,KAAK,iBAAiBr3F,EAAO,cAAeq3F,CAAc,EACzG,KAAK,eAAiB,KAAK,iBAAiBr3F,EAAO,eAAgBq3F,CAAc,EACjF,KAAK,kBAAoB,KAAK,iBAAiBnyD,GAAmBmyD,CAAc,EAChF,KAAK,eAAiBA,EACtBD,EAAmB,KAAKX,CAAe,EACvC,IAAMe,EAAaf,EAAgB,WAC/B,OAAOe,GAAe,YACxB,KAAK,GAAG37E,EAAO,MAAO27E,EAAYf,CAAe,EAEnD,KAAK,GAAG56E,EAAO,gBAAiBk7E,EAAe,iBAAkBA,CAAc,CACjF,CACA,iBAAiB,EAAiB,EAAY,CAC5C,GAAIU,EAAiB,CACnB,IAAMC,EAAqB,IAAID,EAAgB,IAAI,EAInD,OAHIE,GACFA,EAAW,KAAKD,CAAkB,EAE7BA,CACT,CACA,OAAO,IACT,CACA,GAAG,EAAO,EAAU,EAAU,KAAM,CAClC,KAAK,SAAS,GAAGl+E,EAAOjB,EAAU5wB,CAAO,CAC3C,CACA,KAAK,EAAO,EAAU,EAAU,KAAM,CACpC,KAAK,SAAS,KAAK6xB,EAAOjB,EAAU5wB,CAAO,CAC7C,CACA,mBAAmB,EAAO,CACxB,KAAK,SAAS,mBAAmB6xB,CAAK,CACxC,CACA,IAAI,EAAO,EAAU,EAAU,KAAM,EAAM,CACzC,KAAK,SAAS,IAAIA,EAAOjB,EAAU5wB,EAASyxB,CAAI,CAClD,CACA,UAAU,EAAO,CACf,OAAO,KAAK,SAAS,UAAUI,CAAK,CACtC,CACA,KAAK,EAAO,EAAM,EAAa,CAC7B,OAAO,KAAK,SAAS,KAAKA,EAAOhxB,EAAMovG,CAAW,CACpD,CACA,QAAQ,EAAO,EAAa,CAC1B,GAAI,KAAK,OAAO,MACd,OAAO,KAAK,KAAKp+E,EAAOA,EAAOo+E,CAAW,EAE1C,GAAI,CACF,OAAO,KAAK,KAAKp+E,EAAOA,EAAOo+E,CAAW,CAC5C,OAASrwF,EAAO,CAEd,GADA,KAAK,OAAO,MAAM,mDAAqDiS,EAAQ,qBAAuBjS,EAAM,QAAU,2BAA4BA,CAAK,EACnJ,CAAC,KAAK,oBAAqB,CAC7B,KAAK,oBAAsB,GAC3B,IAAMyqF,EAAQx4E,IAAUqC,EAAO,MAC/B,KAAK,QAAQA,EAAO,MAAO,CACzB,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,QACA,QACA,OACF,CAAC,EACD,KAAK,oBAAsB,EAC7B,CACF,CAEF,MAAO,EACT,CACA,cAAc,EAAO,CACnB,OAAO,KAAK,SAAS,cAAcgS,CAAK,CAC1C,CACA,SAAU,CACR,KAAK,OAAO,IAAI,SAAS,EACzB,KAAK,QAAQqC,EAAO,WAAY,IAAK,EAAC,EACtC,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,kBAAoB,GACzB,KAAK,KAAO,KACZ,KAAK,mBAAmB,QAAS,GAAcg8E,EAAU,QAAQ,CAAC,EAClE,KAAK,mBAAmB,OAAS,EACjC,KAAK,eAAe,QAAS,GAAcA,EAAU,QAAQ,CAAC,EAC9D,KAAK,eAAe,OAAS,EAC7B,IAAM73F,EAAS,KAAK,OACpB,EAAO,SAAW,EAAO,WAAa,IAAK,GAC3C,KAAK,WAAa,IACpB,CACA,YAAY,EAAM,CAChB,GAAI,CAACxU,GAAQ,UAAWA,GAAQ,CAACA,EAAK,MAAO,CAC3C,IAAM+b,EAAQ,gBAAI,MAAM,yCAAyC/b,EAAK,EAAE,EACxE,KAAK,QAAQqwB,EAAO,MAAO,CACzB,KAAMnR,EAAW,YACjB,QAASlD,EAAa,mBACtB,MAAO,GACP,OACF,CAAC,EACD,MACF,CACA,KAAK,OAAO,IAAI,aAAa,EACzB,KAAK,SACP,KAAK,OAAO,KAAK,yCAAyC,EAC1D,KAAK,YAAY,GAEnB,IAAMswF,EAAoB,UAAWtsG,EAC/Bg7B,EAAQsxE,EAAoBtsG,EAAK,MAAQA,EACzCusG,EAAgBD,EAAoBtsG,EAAO,CAC/C,OACF,EACA,KAAK,OAASg7B,EACd,KAAK,QAAQ3K,EAAO,gBAAiBk8E,CAAa,CACpD,CACA,aAAc,CACZ,KAAK,OAAO,IAAI,aAAa,EAC7B,KAAK,QAAQl8E,EAAO,gBAAiB,CAAC,CAAC,EACvC,KAAK,OAAS,IAChB,CACA,eAAgB,CACd,KAAK,OAAS,KACd,IAAMm8E,EAAgB,KAAK,iBAAiB,cAAc,EAI1D,OAHA,KAAK,QAAQn8E,EAAO,gBAAiB,CACnC,eACF,CAAC,EACMm8E,CACT,CACA,WAAW,EAAK,CACd,KAAK,SAAS,EACd,IAAMxxE,EAAQ,KAAK,MACbyxE,EAAe,KAAK,KACpBC,EAAgB,KAAK,KAAOl8D,GAAkB,iBAAiB,KAAK,SAAS,KAAMpxC,EAAK,CAC5F,gBAAiB,EACnB,CAAC,EACD,KAAK,kBAAoB,GACzB,KAAK,cAAgB,KACrB,KAAK,OAAO,IAAI,cAAcstG,GAAe,EACzC1xE,GAASyxE,IAAiBA,IAAiBC,GAAiB,KAAK,iBAAiB,eAAe,KACnG,KAAK,YAAY,EACjB,KAAK,YAAY1xE,CAAK,GAExB,KAAK,QAAQ3K,EAAO,iBAAkB,CACpC,KACF,CAAC,CACH,CACA,IAAI,KAAM,CACR,OAAO,KAAK,IACd,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,iBAAiB,gBAC/B,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,iBAAiB,kBAC/B,CACA,UAAU,EAAgB,GAAI,EAAyB,CACrD,KAAK,OAAO,IAAI,aAAa6oC,GAAiBsc,EAA0B,yBAA2B,IAAI,EAAE,EACzG,KAAK,QAAU,GACf,KAAK,gBAAgB,EACrB,IAAK,IAAIn6E,EAAI,EAAGA,EAAI,KAAK,mBAAmB,SAC1C,KAAK,mBAAmBA,EAAE,CAAC,UAAU69D,EAAesc,CAAuB,EACtE,KAAK,SAAY,KAAK,oBAFuB,KAMtD,CACA,UAAW,CACT,KAAK,OAAO,IAAI,UAAU,EAC1B,KAAK,QAAU,GACf,IAAK,IAAIn6E,EAAI,EAAGA,EAAI,KAAK,mBAAmB,SAC1C,KAAK,mBAAmBA,EAAE,CAAC,SAAS,EAChC,MAAK,SAAY,KAAK,oBAFwB,KAMtD,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,OACd,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,iBAAiB,gBAC/B,CACA,iBAAkB,CACX,KAAK,mBACR,KAAK,OAAO,IAAI,kBAAkB,EAClC,KAAK,mBAAmB,QAAS,GAAe,CAC1CsxG,EAAW,iBACbA,EAAW,gBAAgB,CAE/B,CAAC,EAEL,CACA,gBAAiB,CACX,KAAK,mBACP,KAAK,OAAO,IAAI,iBAAiB,EACjC,KAAK,mBAAmB,QAAS,GAAe,CAC1CA,EAAW,gBACbA,EAAW,eAAe,CAE9B,CAAC,EAEL,CACA,IAAI,mBAAoB,CACtB,IAAM99D,EAAe,EAClBI,EAAkB,MAAO,KAAK,iBAAiB,YAClD,EAOA,OANI,KAAK,wBACP,EAAaA,EAAkB,OAAS,KAAK,sBAAsB,cAEjE,KAAK,6BACP,EAAaA,EAAkB,UAAY,KAAK,2BAA2B,cAEtEJ,CACT,CACA,gBAAiB,CACf,KAAK,OAAO,IAAI,gBAAgB,EAChC,KAAK,iBAAiB,eAAe,CACvC,CACA,mBAAoB,CAClB,KAAK,OAAO,IAAI,mBAAmB,EACnC,IAAM7T,EAAQ,KAAK,OACb2I,EAAO3I,GAA+B,YAC5C,KAAK,YAAY,EACbA,IACF,KAAK,YAAYA,CAAK,EAClB2I,GACF,KAAK,UAAUA,CAAI,EAGzB,CACA,YAAY,EAAY,CACtB,KAAK,gBAAgB,YAAYknB,CAAU,CAC7C,CACA,IAAI,WAAY,CACd,IAAI+hD,EAAa,KAAK,WAItB,MAHA,CACEA,IAAa,KAAK,WAAazoE,GAAK,EAE/ByoE,CACT,CACA,IAAI,QAAS,CAEX,OADe,KAAK,gBAAgB,QACX,CAAC,CAC5B,CACA,IAAI,oBAAqB,CACvB,OAAO,KAAK,iBAAiB,gBAAgB,GAAK,IACpD,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,gBAAgB,YAC9B,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,iBAAiB,YAC/B,CACA,IAAI,aAAa,EAAU,CACzB,KAAK,OAAO,IAAI,oBAAoBrG,GAAU,EAC9C,KAAK,gBAAgB,YAAcA,EACnC,KAAK,iBAAiB,qBAAqB,CAC7C,CACA,IAAI,WAAY,CACd,OAAO,KAAK,iBAAiB,SAC/B,CACA,IAAI,UAAU,EAAU,CACtB,KAAK,OAAO,IAAI,iBAAiBA,GAAU,EAC3C,KAAK,gBAAgB,YAAcA,EACnC,KAAK,iBAAiB,gBAAgB,CACxC,CACA,IAAI,WAAY,CACd,OAAO,KAAK,gBAAgB,KAC9B,CACA,IAAI,UAAU,EAAU,CACtB,KAAK,OAAO,IAAI,iBAAiBA,GAAU,EAC3C,KAAK,gBAAgB,YAAcA,CACrC,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,gBAAgB,aAC9B,CACA,IAAI,cAAc,EAAO,CACvB,KAAK,gBAAgB,cAAgBthG,CACvC,CACA,IAAI,YAAa,CACf,OAAO,KAAK,IAAI,KAAK,gBAAgB,WAAY,KAAK,YAAY,CACpE,CACA,IAAI,WAAW,EAAU,CACvB,KAAK,OAAO,IAAI,kBAAkBshG,GAAU,EAC5C,KAAK,gBAAgB,WAAaA,CACpC,CACA,IAAI,YAAa,CACf,IAAMa,EAAa,KAAK,gBAAgB,WAIxC,OAHIA,IAAe,IAAM,KAAK,cAAc,gBAAkB,GACrD,KAAK,cAAc,gBAErBA,CACT,CACA,IAAI,WAAW,EAAU,CACvB,KAAK,OAAO,IAAI,kBAAkBb,GAAU,EACxCA,IAAa,KACf,EAAW,KAAK,IAAIA,EAAU,KAAK,YAAY,GAEjD,KAAK,gBAAgB,WAAaA,CACpC,CACA,IAAI,sBAAuB,CACzB,OAAO,KAAK,OAAO,oBACrB,CACA,IAAI,qBAAqB,EAAoB,CAC3C,IAAMsG,EAA0B,CAAC,CAACC,EAC9BD,IAA4B,KAAK,OAAO,uBACtCA,EACF,KAAK,mBAAmB,aAAa,GAErC,KAAK,mBAAmB,YAAY,EACpC,KAAK,iBAAmB,GACxB,KAAK,iBAAiB,gBAAgB,GAExC,KAAK,OAAO,qBAAuBA,EAEvC,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,iBACd,CACA,IAAI,mBAAoB,CACtB,GAAM,CACJ,eACE,KAAK,cAIT,OAHKE,EAGEA,EAAY,YAAY,EAFtB,GAGX,CACA,IAAI,kBAAkB,EAAwB,CAC5C,KAAK,cAAc,eAAehmD,CAAsB,CAC1D,CACA,IAAI,wBAAyB,CAC3B,GAAM,CACJ,eACE,KAAK,cAIT,OAHKgmD,EAGEA,EAAY,gBAFV,GAGX,CACA,IAAI,cAAe,CACjB,GAAM,CACJ,eACE,KAAK,cAIT,OAHKA,EAGEA,EAAY,gBAAgB,EAF1B,GAGX,CACA,IAAI,iBAAiB,EAAU,CACzB,KAAK,oBAAsBxG,IAC7B,KAAK,OAAO,IAAI,wBAAwBA,GAAU,EAClD,KAAK,kBAAoBA,EACzB,KAAK,gBAAgB,oBAAoB,EAE7C,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,aACd,CACA,IAAI,aAAa,EAAO,CAClB5xF,GAAYxH,CAAK,GAAK,KAAK,gBAAkBA,IAC/C,KAAK,cAAgBA,EACrB,KAAK,gBAAgB,oBAAoB,EAE7C,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,gBAAgB,cAAgB,EAC9C,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,gBAAgB,WAC9B,CACA,IAAI,cAAe,CACjB,GAAM,CACJ,SACA,OAAQ,CACN,mBAEA,KACJ,GAAI,CAAC2K,EACH,MAAO,GACT,IAAMxa,EAAMwa,EAAO,OACnB,IAAK,IAAIzc,EAAI,EAAGA,EAAIiC,EAAK,IACvB,GAAIwa,EAAOzc,EAAE,CAAC,YAAc2xG,EAC1B,OAAO3xG,EAGX,MAAO,EACT,CACA,IAAI,cAAe,CACjB,GAAM,CACJ,SACA,mBACA,gBACE,KACA2c,EAMJ,GALA,AAGEA,EAHEi1F,IAAqB,IAAMn1F,GAAU,MAAQA,EAAO,OACvCA,EAAO,OAAS,EAEhBm1F,EAEbC,EACF,IAAK,IAAI7xG,EAAI2c,EAAc,KAAO,CAChC,IAAMm1F,EAAYr1F,EAAOzc,EAAE,CAAC,MAAM,cAClC,GAAI8xG,GAAaA,GAAaD,EAC5B,OAAO7xG,CAEX,CAEF,OAAO2c,CACT,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,cAAc,cAC5B,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,cAAc,aAC5B,CACA,IAAI,cAAc,EAAW,CAC3B,KAAK,cAAc,cAAgBiyC,CACrC,CACA,IAAI,aAAc,CAChB,OAAO,KAAK,iBAAiB,sBAC/B,CACA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,iBAAiB,qBAAqB,CACpD,CACA,IAAI,iBAAkB,CACpB,OAAO,KAAK,iBAAiB,eAC/B,CACA,eAAe,EAAa,CAE1B,OAAiC,KAAK,sBAA+D,eAAe4uB,CAAW,GAAM,IACvI,CACA,kBAAkB,EAAgB,CAEhC,OAAiC,KAAK,yBAAkE,kBAAkBiP,CAAc,GAAM,IAChJ,CACA,IAAI,gBAAiB,CACnB,IAAMslB,EAAuB,KAAK,qBAClC,OAAOA,EAAuBA,EAAqB,eAAiB,CAAC,CACvE,CACA,IAAI,aAAc,CAChB,IAAMA,EAAuB,KAAK,qBAClC,OAAOA,EAAuBA,EAAqB,YAAc,CAAC,CACpE,CACA,IAAI,YAAa,CACf,IAAMA,EAAuB,KAAK,qBAClC,OAAOA,EAAuBA,EAAqB,WAAa,EAClE,CACA,IAAI,WAAW,EAAc,CAC3B,IAAMA,EAAuB,KAAK,qBAC9BA,IACF,EAAqB,WAAaC,EAEtC,CACA,IAAI,mBAAoB,CACtB,IAAMC,EAA0B,KAAK,wBACrC,OAAOA,EAA0BA,EAAwB,kBAAoB,CAAC,CAChF,CACA,IAAI,gBAAiB,CACnB,IAAMA,EAA0B,KAAK,wBACrC,OAAOA,EAA0BA,EAAwB,eAAiB,CAAC,CAC7E,CACA,IAAI,eAAgB,CAClB,IAAMA,EAA0B,KAAK,wBACrC,OAAOA,EAA0BA,EAAwB,cAAgB,EAC3E,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CACA,IAAI,cAAc,EAAiB,CACjC,IAAMA,EAA0B,KAAK,wBACjCA,IACF,EAAwB,cAAgBC,EAE5C,CACA,IAAI,iBAAkB,CACpB,IAAMD,EAA0B,KAAK,wBACrC,OAAOA,EAA0BA,EAAwB,gBAAkB,EAC7E,CACA,IAAI,gBAAgB,EAAO,CACzB,IAAMA,EAA0B,KAAK,wBACjCA,IACF,EAAwB,gBAAkBngG,EAE9C,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,OAAO,cACrB,CACA,IAAI,eAAe,EAAM,CACvB,KAAK,OAAO,eAAiB61B,CAC/B,CACA,IAAI,kBAAmB,CACrB,OAAO,KAAK,kBAAkB,gBAChC,CACA,IAAI,SAAU,CACZ,OAAO,KAAK,kBAAkB,OAChC,CACA,IAAI,YAAa,CACf,OAAO,KAAK,kBAAkB,UAChC,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,kBAAkB,aAChC,CACA,IAAI,cAAc,EAAS,CACzB,KAAK,kBAAkB,cAAgB2gE,CACzC,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,kBAAkB,KAChC,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,iBAAiB,cAC/B,CACA,IAAI,UAAW,CACb,OAAO,KAAK,gBAAgB,QAC9B,CACA,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBAAgB,eAC9B,CACA,IAAI,gBAAgB,EAAiB,CACnC,KAAK,gBAAgB,gBAAkBtjB,CACzC,CACA,IAAI,eAAgB,CAClB,IAAImtB,EACJ,MAAO,CAAC,GAAG,EAAwB,KAAK,mBAAqB,MAAQA,EAAsB,cAC7F,CACA,IAAI,sBAAuB,CAEzB,OAAiC,KAAK,yBAAkE,sBAAyB,IACnI,CACA,qBAAqB,EAAO,EAAc,KAAK,eAAgB,CAE7D,OAAOp7F,GAA4BnN,EADRwS,GAAsBo+D,CACU,EAAGr7E,EAAU,iBAAiB,CAC3F,CACF,EACA,GAAI,cAAgB,IAAK,E"}