@stream-io/video-react-sdk 0.4.19 → 0.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../src/core/components/Audio/Audio.tsx","../../src/core/components/Audio/ParticipantsAudio.tsx","../../src/utilities/isComponentType.ts","../../src/utilities/chunk.ts","../../src/utilities/applyElementToRef.ts","../../src/core/components/Video/BaseVideo.tsx","../../src/core/components/Video/DefaultVideoPlaceholder.tsx","../../src/core/components/Video/Video.tsx","../../src/core/hooks/useTrackElementVisibility.ts","../../src/components/Avatar/Avatar.tsx","../../src/hooks/useFloatingUIPreset.ts","../../src/hooks/usePersistedDevicePreferences.ts","../../src/hooks/useScrollPosition.ts","../../src/hooks/useToggleCallRecording.ts","../../src/hooks/useRequestPermission.ts","../../src/components/Menu/MenuToggle.tsx","../../src/components/Menu/GenericMenu.tsx","../../src/components/Icon/Icon.tsx","../../src/components/Button/IconButton.tsx","../../src/components/Button/CompositeButton.tsx","../../src/components/Tooltip/Tooltip.tsx","../../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts","../../src/components/Tooltip/WithTooltip.tsx","../../src/components/Button/CopyToClipboardButton.tsx","../../src/components/Button/TextButton.tsx","../../src/components/CallControls/AcceptCallButton.tsx","../../src/components/Notification/Notification.tsx","../../src/components/Notification/PermissionNotification.tsx","../../src/components/Notification/SpeakingWhileMutedNotification.tsx","../../src/components/LoadingIndicator/LoadingIndicator.tsx","../../src/components/CallControls/RecordCallButton.tsx","../../src/components/CallStats/CallStatsLatencyChart.tsx","../../src/components/CallStats/CallStats.tsx","../../src/components/CallControls/CallStatsButton.tsx","../../src/components/CallControls/ScreenShareButton.tsx","../../src/components/DeviceSettings/DeviceSelector.tsx","../../src/components/DeviceSettings/DeviceSelectorAudio.tsx","../../src/components/DeviceSettings/DeviceSelectorVideo.tsx","../../src/components/DeviceSettings/DeviceSettings.tsx","../../src/components/CallControls/ToggleAudioButton.tsx","../../src/components/CallControls/ToggleVideoButton.tsx","../../src/components/CallControls/CancelCallButton.tsx","../../src/components/CallControls/CallControls.tsx","../../src/components/Reaction/Reaction.tsx","../../src/components/CallControls/ReactionsButton.tsx","../../src/components/CallControls/ToggleAudioOutputButton.tsx","../../src/components/CallParticipantsList/BlockedUserListing.tsx","../../src/components/CallParticipantsList/CallParticipantListHeader.tsx","../../src/components/CallParticipantsList/CallParticipantListingItem.tsx","../../src/components/CallParticipantsList/CallParticipantListing.tsx","../../src/components/CallParticipantsList/EmptyParticipantSearchList.tsx","../../src/components/Search/SearchInput.tsx","../../src/components/Search/SearchResults.tsx","../../src/components/Search/hooks/useSearch.ts","../../src/components/CallParticipantsList/CallParticipantsList.tsx","../../src/components/CallPreview/CallPreview.tsx","../../src/components/CallRecordingList/CallRecordingListHeader.tsx","../../src/components/CallRecordingList/CallRecordingListItem.tsx","../../src/components/CallRecordingList/EmptyCallRecordingListing.tsx","../../src/components/CallRecordingList/LoadingCallRecordingListing.tsx","../../src/components/CallRecordingList/CallRecordingList.tsx","../../src/components/RingingCall/RingingCallControls.tsx","../../src/components/RingingCall/RingingCall.tsx","../../src/components/Permissions/PermissionRequests.tsx","../../src/components/StreamTheme/StreamTheme.tsx","../../src/components/VideoPreview/VideoPreview.tsx","../../src/core/components/ParticipantView/ParticipantViewContext.tsx","../../src/core/components/ParticipantView/DefaultParticipantViewUI.tsx","../../src/core/components/ParticipantView/ParticipantView.tsx","../../src/core/components/StreamCall/StreamCall.tsx","../../src/translations/index.ts","../../src/core/components/StreamVideo/StreamVideo.tsx","../../src/core/components/CallLayout/hooks.ts","../../src/core/components/CallLayout/LivestreamLayout.tsx","../../src/core/components/CallLayout/PaginatedGridLayout.tsx","../../src/core/hooks/useCalculateHardLimit.ts","../../src/core/components/CallLayout/SpeakerLayout.tsx","../../index.ts"],"sourcesContent":["import { ComponentPropsWithoutRef, useEffect, useState } from 'react';\nimport {\n AudioTrackType,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AudioProps = ComponentPropsWithoutRef<'audio'> & {\n /**\n * The participant whose audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * The type of audio stream to play for the given participant.\n * The default value is `audioTrack`.\n */\n trackType?: AudioTrackType;\n};\n\nexport const Audio = ({\n participant,\n trackType = 'audioTrack',\n ...rest\n}: AudioProps) => {\n const call = useCall();\n const [audioElement, setAudioElement] = useState<HTMLAudioElement | null>(\n null,\n );\n const { userId, sessionId } = participant;\n\n useEffect(() => {\n if (!call || !audioElement) return;\n const cleanup = call.bindAudioElement(audioElement, sessionId, trackType);\n return () => {\n cleanup?.();\n };\n }, [call, sessionId, audioElement, trackType]);\n\n return (\n <audio\n autoPlay\n {...rest}\n ref={setAudioElement}\n data-user-id={userId}\n data-session-id={sessionId}\n data-track-type={trackType}\n />\n );\n};\n","import { ComponentProps, Fragment } from 'react';\nimport { SfuModels, StreamVideoParticipant } from '@stream-io/video-client';\nimport { Audio } from './Audio';\n\nexport type ParticipantsAudioProps = {\n /**\n * The participants to play audio for.\n */\n participants: StreamVideoParticipant[];\n\n /**\n * Props to pass to the underlying `Audio` components.\n */\n audioProps?: ComponentProps<typeof Audio>;\n};\n\nexport const ParticipantsAudio = (props: ParticipantsAudioProps) => {\n const { participants, audioProps } = props;\n return (\n <>\n {participants.map((participant) => {\n if (participant.isLocalParticipant) return null;\n const {\n publishedTracks,\n audioStream,\n screenShareAudioStream,\n sessionId,\n } = participant;\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const audioTrackElement = hasAudio && audioStream && (\n <Audio\n {...audioProps}\n trackType=\"audioTrack\"\n participant={participant}\n />\n );\n\n const hasScreenShareAudio = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE_AUDIO,\n );\n const screenShareAudioTrackElement = hasScreenShareAudio &&\n screenShareAudioStream && (\n <Audio\n {...audioProps}\n trackType=\"screenShareAudioTrack\"\n participant={participant}\n />\n );\n\n return (\n <Fragment key={sessionId}>\n {audioTrackElement}\n {screenShareAudioTrackElement}\n </Fragment>\n );\n })}\n </>\n );\n};\n","import { ComponentType, isValidElement, ReactElement } from 'react';\n\nexport const isComponentType = <T extends {}>(\n elementOrComponent?: ComponentType<T> | ReactElement | null,\n): elementOrComponent is ComponentType<T> => {\n return elementOrComponent === null\n ? false\n : !isValidElement(elementOrComponent);\n};\n","export const chunk = <T extends unknown[]>(array: T, size: number) => {\n const chunkCount = Math.ceil(array.length / size);\n\n return Array.from(\n { length: chunkCount },\n (_, index) => array.slice(size * index, size * index + size) as T,\n );\n};\n","import type { ForwardedRef } from 'react';\n\nexport const applyElementToRef = <T extends HTMLElement | null>(\n ref: ForwardedRef<T>,\n element: T,\n) => {\n if (!ref) return;\n\n if (typeof ref === 'function') return ref(element);\n\n ref.current = element;\n};\n","import { ComponentPropsWithRef, forwardRef, useEffect, useState } from 'react';\nimport { Browsers } from '@stream-io/video-client';\n\nimport { applyElementToRef } from '../../../utilities';\n\nexport type BaseVideoProps = ComponentPropsWithRef<'video'> & {\n stream?: MediaStream;\n};\n\n/**\n * @description Extends video element with `stream` property\n * (`srcObject`) to reactively handle stream changes\n */\nexport const BaseVideo = forwardRef<HTMLVideoElement, BaseVideoProps>(\n ({ stream, ...rest }, ref) => {\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n\n useEffect(() => {\n if (!videoElement || !stream) return;\n if (stream === videoElement.srcObject) return;\n\n videoElement.srcObject = stream;\n if (Browsers.isSafari() || Browsers.isFirefox()) {\n // Firefox and Safari have some timing issue\n setTimeout(() => {\n videoElement.srcObject = stream;\n videoElement.play().catch((e) => {\n console.error(`Failed to play stream`, e);\n });\n }, 0);\n }\n\n return () => {\n videoElement.pause();\n videoElement.srcObject = null;\n };\n }, [stream, videoElement]);\n\n return (\n <video\n autoPlay\n playsInline\n {...rest}\n ref={(element) => {\n applyElementToRef(ref, element);\n setVideoElement(element);\n }}\n />\n );\n },\n);\n","import { ComponentPropsWithRef, forwardRef, useState } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\n\nexport type VideoPlaceholderProps = {\n participant: StreamVideoParticipant;\n} & ComponentPropsWithRef<'div'>;\n\nexport const DefaultVideoPlaceholder = forwardRef<\n HTMLDivElement,\n VideoPlaceholderProps\n>(({ participant, style }, ref) => {\n const { t } = useI18n();\n const [error, setError] = useState(false);\n const name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(!participant.image || error) &&\n (name ? (\n <div className=\"str-video__video-placeholder__initials-fallback\">\n <div>{name[0]}</div>\n </div>\n ) : (\n <div>{t('Video is disabled')}</div>\n ))}\n {participant.image && !error && (\n <img\n onError={() => setError(true)}\n alt=\"video-placeholder\"\n className=\"str-video__video-placeholder__avatar\"\n src={participant.image}\n />\n )}\n </div>\n );\n});\n","import {\n ComponentPropsWithoutRef,\n ComponentType,\n useEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n SfuModels,\n StreamVideoParticipant,\n VideoTrackType,\n VisibilityState,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\nimport {\n DefaultVideoPlaceholder,\n VideoPlaceholderProps,\n} from './DefaultVideoPlaceholder';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type VideoProps = ComponentPropsWithoutRef<'video'> & {\n /**\n * The track type to display.\n */\n trackType: VideoTrackType | 'none';\n /**\n * The participant represented by this video element.\n */\n participant: StreamVideoParticipant;\n /**\n * Override the default UI that's visible when a participant turned off their video.\n * Set it to `null` if you wish to disable the video placeholder.\n *\n * @default DefaultVideoPlaceholder\n */\n VideoPlaceholder?: ComponentType<VideoPlaceholderProps> | null;\n /**\n * An object with setRef functions\n * meant for exposing some of the internal elements of this component.\n */\n refs?: {\n /**\n * The video element that's used to play the video stream.\n * @param element the video element.\n */\n setVideoElement?: (element: HTMLVideoElement | null) => void;\n /**\n * The video placeholder element that's used when the video stream is not playing.\n * @param element the video placeholder element.\n */\n setVideoPlaceholderElement?: (element: HTMLDivElement | null) => void;\n };\n};\n\nexport const Video = ({\n trackType,\n participant,\n className,\n VideoPlaceholder = DefaultVideoPlaceholder,\n refs,\n ...rest\n}: VideoProps) => {\n const {\n sessionId,\n videoStream,\n screenShareStream,\n publishedTracks,\n viewportVisibilityState,\n isLocalParticipant,\n userId,\n } = participant;\n\n const call = useCall();\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n // start with true, will flip once the video starts playing\n const [isVideoPaused, setIsVideoPaused] = useState(true);\n const [isWideMode, setIsWideMode] = useState(true);\n\n const stream =\n trackType === 'videoTrack'\n ? videoStream\n : trackType === 'screenShareTrack'\n ? screenShareStream\n : undefined;\n\n useLayoutEffect(() => {\n if (!call || !videoElement || trackType === 'none') return;\n\n const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);\n\n return () => {\n cleanup?.();\n };\n }, [call, trackType, sessionId, videoElement]);\n\n useEffect(() => {\n if (!stream || !videoElement) return;\n\n const [track] = stream.getVideoTracks();\n if (!track) return;\n\n const handlePlayPause = () => {\n setIsVideoPaused(videoElement.paused);\n\n const { width = 0, height = 0 } = track.getSettings();\n setIsWideMode(width >= height);\n };\n\n // playback may have started before we had a chance to\n // attach the 'play/pause' event listener, so we set the state\n // here to make sure it's in sync\n setIsVideoPaused(videoElement.paused);\n\n videoElement.addEventListener('play', handlePlayPause);\n videoElement.addEventListener('pause', handlePlayPause);\n track.addEventListener('unmute', handlePlayPause);\n return () => {\n videoElement.removeEventListener('play', handlePlayPause);\n videoElement.removeEventListener('pause', handlePlayPause);\n track.removeEventListener('unmute', handlePlayPause);\n\n // reset the 'pause' state once we unmount the video element\n setIsVideoPaused(true);\n };\n }, [stream, videoElement]);\n\n if (!call) return null;\n\n const isPublishingTrack =\n trackType === 'videoTrack'\n ? publishedTracks.includes(SfuModels.TrackType.VIDEO)\n : trackType === 'screenShareTrack'\n ? publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE)\n : false;\n\n const isInvisible =\n trackType === 'none' ||\n viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;\n\n const hasNoVideoOrInvisible = !isPublishingTrack || isInvisible;\n const mirrorVideo = isLocalParticipant && trackType === 'videoTrack';\n const isScreenShareTrack = trackType === 'screenShareTrack';\n return (\n <>\n {!hasNoVideoOrInvisible && (\n <video\n {...rest}\n className={clsx('str-video__video', className, {\n 'str-video__video--not-playing': isVideoPaused,\n 'str-video__video--tall': !isWideMode,\n 'str-video__video--mirror': mirrorVideo,\n 'str-video__video--screen-share': isScreenShareTrack,\n })}\n data-user-id={userId}\n data-session-id={sessionId}\n ref={(element) => {\n setVideoElement(element);\n refs?.setVideoElement?.(element);\n }}\n />\n )}\n {/* TODO: add condition to \"hold\" the placeholder until track unmutes as well */}\n {(hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (\n <VideoPlaceholder\n style={{ position: 'absolute' }}\n participant={participant}\n ref={refs?.setVideoPlaceholderElement}\n />\n )}\n </>\n );\n};\n","import { useEffect } from 'react';\nimport { DynascaleManager, VideoTrackType } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport const useTrackElementVisibility = <T extends HTMLElement>({\n trackedElement,\n dynascaleManager: propsDynascaleManager,\n sessionId,\n trackType,\n}: {\n trackedElement: T | null;\n sessionId: string;\n dynascaleManager?: DynascaleManager;\n trackType: VideoTrackType | 'none';\n}) => {\n const call = useCall();\n const manager = propsDynascaleManager ?? call?.dynascaleManager;\n useEffect(() => {\n if (!trackedElement || !manager || !call || trackType === 'none') return;\n const unobserve = manager.trackElementVisibility(\n trackedElement,\n sessionId,\n trackType,\n );\n return () => {\n unobserve();\n };\n }, [trackedElement, manager, call, sessionId, trackType]);\n};\n","import { ComponentProps, CSSProperties, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarData = {\n imageSrc?: string;\n name?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\n\nexport type AvatarProps = AvatarData & ComponentProps<'img'>;\n\nexport const Avatar = ({\n imageSrc,\n name,\n style,\n className,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n return (\n <>\n {(!imageSrc || error) && name && (\n <AvatarFallback className={className} style={style} names={[name]} />\n )}\n {imageSrc && !error && (\n <img\n onError={() => setError(true)}\n alt=\"avatar\"\n className={clsx('str-video__avatar', className)}\n src={imageSrc}\n style={style}\n {...rest}\n />\n )}\n </>\n );\n};\n\ntype AvatarFallbackProps = {\n names: string[];\n className?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\nexport const AvatarFallback = ({\n className,\n names,\n style,\n}: AvatarFallbackProps) => {\n return (\n <div\n className={clsx('str-video__avatar--initials-fallback', className)}\n style={style}\n >\n <div>\n {names[0][0]}\n {names[1]?.[0]}\n </div>\n </div>\n );\n};\n","import { useEffect } from 'react';\nimport type { UseFloatingData } from '@floating-ui/react';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react';\n\nexport const useFloatingUIPreset = ({\n placement,\n strategy,\n}: Pick<UseFloatingData, 'placement' | 'strategy'>) => {\n const {\n refs,\n x,\n y,\n update,\n elements: { domReference, floating },\n } = useFloating({\n placement,\n strategy,\n middleware: [\n offset(10),\n shift(),\n flip(),\n size({\n padding: 10,\n apply: ({ availableHeight, elements }) => {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n ],\n });\n\n // handle window resizing\n useEffect(() => {\n if (!domReference || !floating) return;\n\n const cleanup = autoUpdate(domReference, floating, update);\n\n return () => cleanup();\n }, [domReference, floating, update]);\n\n return { refs, x, y, domReference, floating, strategy };\n};\n","import { useEffect } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type LocalDevicePreference = {\n selectedDeviceId: string;\n muted: boolean;\n};\n\nexport type LocalDevicePreferences = {\n [type in 'mic' | 'camera' | 'speaker']: LocalDevicePreference;\n};\n\n/**\n * This hook will persist the device settings to local storage.\n *\n * @param key the key to use for local storage.\n */\nconst usePersistDevicePreferences = (key: string) => {\n const {\n useMicrophoneState,\n useCameraState,\n useSpeakerState,\n useCallSettings,\n } = useCallStateHooks();\n const mic = useMicrophoneState();\n const camera = useCameraState();\n const speaker = useSpeakerState();\n const settings = useCallSettings();\n useEffect(() => {\n if (!settings) return;\n try {\n const hasPreferences = !!window.localStorage.getItem(key);\n const { audio, video } = settings;\n const defaultDevice = 'default';\n const preferences: LocalDevicePreferences = {\n mic: {\n selectedDeviceId: mic.selectedDevice || defaultDevice,\n muted: hasPreferences ? mic.isMute : !audio.mic_default_on,\n },\n camera: {\n selectedDeviceId: camera.selectedDevice || defaultDevice,\n muted: hasPreferences ? camera.isMute : !video.camera_default_on,\n },\n speaker: {\n selectedDeviceId: speaker.selectedDevice || defaultDevice,\n muted: false,\n },\n };\n window.localStorage.setItem(key, JSON.stringify(preferences));\n } catch (err) {\n console.warn('Failed to save device preferences', err);\n }\n }, [\n camera.isMute,\n camera.selectedDevice,\n key,\n mic.isMute,\n mic.selectedDevice,\n settings,\n speaker.selectedDevice,\n ]);\n};\n\n/**\n * This hook will apply the device settings from local storage.\n *\n * @param key the key to use for local storage.\n */\nconst useApplyDevicePreferences = (key: string) => {\n const call = useCall();\n const { useCallSettings } = useCallStateHooks();\n const settings = useCallSettings();\n useEffect(() => {\n if (!call || !settings) return;\n\n const apply = async () => {\n const initMic = async (setting: LocalDevicePreference) => {\n await call.microphone.select(setting.selectedDeviceId);\n if (setting.muted) {\n await call.microphone.disable();\n } else {\n await call.microphone.enable();\n }\n };\n\n const initCamera = async (setting: LocalDevicePreference) => {\n await call.camera.select(setting.selectedDeviceId);\n if (setting.muted) {\n await call.camera.disable();\n } else {\n await call.camera.enable();\n }\n };\n\n const initSpeaker = (setting: LocalDevicePreference) => {\n call.speaker.select(setting.selectedDeviceId);\n };\n\n let preferences: LocalDevicePreferences | null = null;\n try {\n preferences = JSON.parse(\n window.localStorage.getItem(key)!,\n ) as LocalDevicePreferences;\n } catch (err) {\n console.warn('Failed to load device preferences', err);\n }\n if (preferences) {\n await initMic(preferences.mic);\n await initCamera(preferences.camera);\n initSpeaker(preferences.speaker);\n } else {\n const { audio, video } = settings;\n if (audio.mic_default_on) await call.microphone.enable();\n if (video.camera_default_on) await call.camera.enable();\n }\n };\n\n apply().catch((err) => {\n console.warn('Failed to apply device preferences', err);\n });\n }, [call, key, settings]);\n};\n\n/**\n * This hook will apply and persist the device preferences from local storage.\n *\n * @param key the key to use for local storage.\n */\nexport const usePersistedDevicePreferences = (\n key: string = '@stream-io/device-preferences',\n) => {\n useApplyDevicePreferences(key);\n usePersistDevicePreferences(key);\n};\n","import { useEffect, useState } from 'react';\n\nconst SCROLL_THRESHOLD = 10;\n\n/**\n * Hook which observes element's scroll position and returns text value based on the\n * position of the scrollbar (`top`, `bottom`, `between` and `null` if no scrollbar is available)\n */\nexport const useVerticalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'top' | 'bottom' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasVerticalScrollbar = element.scrollHeight > element.clientHeight;\n\n if (!hasVerticalScrollbar) return setScrollPosition(null);\n\n const isAtTheTop = element.scrollTop <= threshold;\n if (isAtTheTop) return setScrollPosition('top');\n\n const isAtTheBottom =\n Math.abs(\n element.scrollHeight - element.scrollTop - element.clientHeight,\n ) <= threshold;\n\n if (isAtTheBottom) return setScrollPosition('bottom');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n\nexport const useHorizontalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'start' | 'end' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasHorizontalScrollbar = element.scrollWidth > element.clientWidth;\n\n if (!hasHorizontalScrollbar) return setScrollPosition(null);\n\n const isAtTheStart = element.scrollLeft <= threshold;\n if (isAtTheStart) return setScrollPosition('start');\n\n const isAtTheEnd =\n Math.abs(\n element.scrollWidth - element.scrollLeft - element.clientWidth,\n ) <= threshold;\n\n if (isAtTheEnd) return setScrollPosition('end');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const useToggleCallRecording = () => {\n const call = useCall();\n const { useIsCallRecordingInProgress } = useCallStateHooks();\n const isCallRecordingInProgress = useIsCallRecordingInProgress();\n const [isAwaitingResponse, setIsAwaitingResponse] = useState(false);\n\n // TODO: add permissions\n\n useEffect(() => {\n // we wait until call.recording_started/stopped event to flips the\n // `isCallRecordingInProgress` state variable.\n // Once the flip happens, we remove the loading indicator\n setIsAwaitingResponse((isAwaiting) => {\n if (isAwaiting) return false;\n return isAwaiting;\n });\n }, [isCallRecordingInProgress]);\n\n const toggleCallRecording = useCallback(async () => {\n try {\n setIsAwaitingResponse(true);\n if (isCallRecordingInProgress) {\n await call?.stopRecording();\n } else {\n await call?.startRecording();\n }\n } catch (e) {\n console.error(`Failed start recording`, e);\n }\n }, [call, isCallRecordingInProgress]);\n\n return { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { useCall, useHasPermissions } from '@stream-io/video-react-bindings';\n\nexport const useRequestPermission = (permission: OwnCapability) => {\n const call = useCall();\n const hasPermission = useHasPermissions(permission);\n const [isAwaitingPermission, setIsAwaitingPermission] = useState(false); // TODO: load with possibly pending state\n\n useEffect(() => {\n const reset = () => setIsAwaitingPermission(false);\n\n if (hasPermission) reset();\n }, [hasPermission]);\n\n const requestPermission = useCallback(async () => {\n if (hasPermission) return true;\n\n const canRequestPermission =\n !!call?.permissionsContext.canRequest(permission);\n if (isAwaitingPermission || !canRequestPermission) return false;\n\n setIsAwaitingPermission(true);\n\n try {\n await call?.requestPermissions({\n permissions: [permission],\n });\n } catch (error) {\n setIsAwaitingPermission(false);\n throw new Error(`requestPermission failed: ${error}`);\n }\n\n return false;\n }, [call, hasPermission, isAwaitingPermission, permission]);\n\n return {\n requestPermission,\n hasPermission,\n canRequestPermission: !!call?.permissionsContext.canRequest(permission),\n isAwaitingPermission,\n };\n};\n","import {\n ComponentType,\n PropsWithChildren,\n useEffect,\n useState,\n ForwardedRef,\n} from 'react';\nimport { Placement, Strategy } from '@floating-ui/react';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type ToggleMenuButtonProps<E extends HTMLElement = HTMLButtonElement> = {\n menuShown: boolean;\n ref: ForwardedRef<E>;\n};\n\nexport type MenuToggleProps<E extends HTMLElement> = PropsWithChildren<{\n ToggleButton: ComponentType<ToggleMenuButtonProps<E>>;\n placement?: Placement;\n strategy?: Strategy;\n}>;\n\nexport const MenuToggle = <E extends HTMLElement>({\n ToggleButton,\n placement = 'top-start',\n strategy = 'absolute',\n children,\n}: MenuToggleProps<E>) => {\n const [menuShown, setMenuShown] = useState(false);\n\n const { floating, domReference, refs, x, y } = useFloatingUIPreset({\n placement,\n strategy,\n });\n\n useEffect(() => {\n const handleClick = (event: MouseEvent) => {\n if (!floating && domReference?.contains(event.target as Node)) {\n setMenuShown(true);\n } else if (floating && !floating?.contains(event.target as Node)) {\n setMenuShown(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key.toLowerCase() === 'escape' &&\n !event.altKey &&\n !event.ctrlKey\n ) {\n setMenuShown(false);\n }\n };\n document?.addEventListener('click', handleClick, { capture: true });\n document?.addEventListener('keydown', handleKeyDown);\n return () => {\n document?.removeEventListener('click', handleClick, { capture: true });\n document?.removeEventListener('keydown', handleKeyDown);\n };\n }, [floating, domReference]);\n\n return (\n <>\n {menuShown && (\n <div\n className=\"str-video__menu-container\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {children}\n </div>\n )}\n <ToggleButton menuShown={menuShown} ref={refs.setReference} />\n </>\n );\n};\n","import { ComponentProps, PropsWithChildren } from 'react';\n\nexport const GenericMenu = ({ children }: PropsWithChildren) => {\n return <ul className=\"str-video__generic-menu\">{children}</ul>;\n};\n\nexport const GenericMenuButtonItem = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref'>) => {\n return (\n <li className=\"str-video__generic-menu--item\">\n <button {...rest}>{children}</button>\n </li>\n );\n};\n","import clsx from 'clsx';\n\nexport type IconProps = {\n icon: string;\n};\n\nexport const Icon = ({ icon }: IconProps) => (\n <span\n className={clsx('str-video__icon', icon && `str-video__icon--${icon}`)}\n />\n);\n","import { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon, IconProps } from '../Icon';\n\nexport type ButtonWithIconProps = {\n enabled?: boolean;\n variant?: string;\n} & ComponentProps<'button'> &\n IconProps;\n\nexport const IconButton = forwardRef(\n (props: ButtonWithIconProps, ref: ForwardedRef<HTMLButtonElement>) => {\n const { icon, enabled, variant, onClick, className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__call-controls__button', className, {\n [`str-video__call-controls__button--variant-${variant}`]: variant,\n 'str-video__call-controls__button--enabled': enabled,\n })}\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n ref={ref}\n {...rest}\n >\n <Icon icon={icon} />\n </button>\n );\n },\n);\n","import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { ComponentType, forwardRef, PropsWithChildren } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { Placement } from '@floating-ui/react';\n\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type IconButtonWithMenuProps = PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | JSX.Element;\n caption?: string;\n menuPlacement?: Placement;\n}>;\n\nexport const CompositeButton = forwardRef<\n HTMLDivElement,\n IconButtonWithMenuProps\n>(({ caption, children, active, Menu, menuPlacement }, ref) => {\n return (\n <div className=\"str-video__composite-button\" ref={ref}>\n <div\n className={clsx('str-video__composite-button__button-group', {\n 'str-video__composite-button__button-group--active': active,\n })}\n >\n {children}\n {Menu && (\n <MenuToggle placement={menuPlacement} ToggleButton={ToggleMenuButton}>\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n )}\n </div>\n {caption && (\n <div className=\"str-video__composite-button__caption\">{caption}</div>\n )}\n </div>\n );\n});\n\nconst ToggleMenuButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n ({ menuShown }, ref) => {\n const { t } = useI18n();\n\n return (\n <IconButton\n className={'str-video__menu-toggle-button'}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n title={t('Toggle device menu')}\n ref={ref}\n />\n );\n },\n);\n","import { PropsWithChildren, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { useFloatingUIPreset } from '../../hooks';\nimport { Placement } from '@floating-ui/react';\n\nexport type TooltipProps<T extends HTMLElement> = PropsWithChildren<{\n /** Reference element to which the tooltip should attach to */\n referenceElement: T | null;\n /** Additional class applied to the tooltip root element */\n tooltipClassName?: string;\n /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */\n offset?: [number, number];\n /** Popper's placement property defining default position of the tooltip, default 'top' */\n tooltipPlacement?: Placement;\n /** Tells component whether to render its contents */\n visible?: boolean;\n}>;\n\nexport const Tooltip = <T extends HTMLElement>({\n children,\n referenceElement,\n tooltipClassName,\n tooltipPlacement = 'top',\n visible = false,\n}: TooltipProps<T>) => {\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement: tooltipPlacement,\n strategy: 'absolute',\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n\n if (!visible) return null;\n\n return (\n <div\n className={clsx('str-video__tooltip', tooltipClassName)}\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {children}\n </div>\n );\n};\n","import { MouseEventHandler, useCallback, useState } from 'react';\n\nexport const useEnterLeaveHandlers = <T extends HTMLElement>({\n onMouseEnter,\n onMouseLeave,\n}: Partial<\n Record<'onMouseEnter' | 'onMouseLeave', MouseEventHandler<T>>\n> = {}) => {\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n const handleMouseEnter: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter],\n );\n\n const handleMouseLeave: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave],\n );\n\n return { handleMouseEnter, handleMouseLeave, tooltipVisible };\n};\n","import { ComponentProps, useState } from 'react';\nimport { Tooltip, TooltipProps } from './Tooltip';\nimport { useEnterLeaveHandlers } from './hooks';\n\ntype WithPopupProps = ComponentProps<'div'> &\n Omit<TooltipProps<HTMLDivElement>, 'referenceElement'>;\n\n// todo: duplicate of CallParticipantList.tsx#MediaIndicator - refactor to a single component\nexport const WithTooltip = ({\n title,\n tooltipClassName,\n tooltipPlacement,\n ...props\n}: WithPopupProps) => {\n const { handleMouseEnter, handleMouseLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLDivElement>();\n const [tooltipAnchor, setTooltipAnchor] = useState<HTMLDivElement | null>(\n null,\n );\n\n return (\n <>\n <Tooltip\n referenceElement={tooltipAnchor}\n visible={tooltipVisible}\n tooltipClassName={tooltipClassName}\n tooltipPlacement={tooltipPlacement}\n >\n {title || ''}\n </Tooltip>\n <div\n ref={setTooltipAnchor}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n />\n </>\n );\n};\n","import {\n ComponentProps,\n ComponentPropsWithRef,\n ComponentType,\n ForwardedRef,\n forwardRef,\n MouseEventHandler,\n useCallback,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport { Placement } from '@floating-ui/react';\n\nimport { Tooltip } from '../Tooltip';\n\ntype CopyToClipboardButtonProps = ComponentProps<'button'> & {\n /** Custom button component implementation. Will be rendered instead of native button element */\n Button?: ComponentType<\n ComponentPropsWithRef<'button'> & { ref: ForwardedRef<HTMLButtonElement> }\n >;\n /** Custom function to override the logic of generating the call invitation link */\n copyValue: (() => string) | string;\n /** Callback invoked if the copy-to-clipboard action fails */\n onError?: (button: HTMLButtonElement, e: Error) => void;\n /** Callback invoked if the copy-to-clipboard action succeeds */\n onSuccess?: (button: HTMLButtonElement) => void;\n};\n\nexport const CopyToClipboardButton = forwardRef<\n HTMLButtonElement,\n CopyToClipboardButtonProps\n>(\n (\n { Button, className, copyValue, onClick, onError, onSuccess, ...restProps },\n ref,\n ) => {\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (event) => {\n if (onClick) onClick(event);\n const value = typeof copyValue === 'function' ? copyValue() : copyValue;\n try {\n await navigator?.clipboard.writeText(value);\n onSuccess?.(event.target as HTMLButtonElement);\n } catch (error) {\n onError?.(event.target as HTMLButtonElement, error as Error);\n }\n },\n [copyValue, onClick, onError, onSuccess],\n );\n\n const props = {\n ...restProps,\n ref: ref,\n className: clsx('str-video__copy-to-clipboard-button', className),\n onClick: handleClick,\n };\n\n return Button ? <Button {...props} /> : <button {...props} />;\n },\n);\n\ntype CopyToClipboardButtonWithPopupProps = Exclude<\n CopyToClipboardButtonProps,\n 'onError' | 'onSuccess'\n> & {\n dismissAfterMs?: number;\n /** String displayed when copy-to-clipboard action fails */\n onErrorMessage?: string;\n /** String displayed when copy-to-clipboard succeeds fails */\n onSuccessMessage?: string;\n /** Class applied to the popup container element */\n popupClassName?: string;\n // todo: We should replace Placement for internal type\n popupPlacement?: Placement;\n};\n\nexport const CopyToClipboardButtonWithPopup = ({\n dismissAfterMs = 1500,\n onErrorMessage = 'Failed to copy',\n onSuccessMessage = 'Copied to clipboard',\n popupClassName,\n popupPlacement,\n ...restProps\n}: CopyToClipboardButtonWithPopupProps) => {\n const [tooltipText, setTooltipText] = useState('');\n const [tooltipAnchor, setTooltipAnchor] = useState<HTMLButtonElement | null>(\n null,\n );\n\n const setTemporaryPopup = useCallback(\n (popupText: string) => {\n setTooltipText(popupText);\n setTimeout(() => setTooltipText(''), dismissAfterMs);\n },\n [dismissAfterMs],\n );\n\n const onSuccess = useCallback(\n () => setTemporaryPopup(onSuccessMessage),\n [onSuccessMessage, setTemporaryPopup],\n );\n\n const onError = useCallback(\n () => setTemporaryPopup(onErrorMessage),\n [onErrorMessage, setTemporaryPopup],\n );\n\n return (\n <>\n <Tooltip\n tooltipClassName={clsx(\n 'str-video__copy-to-clipboard-button__popup',\n popupClassName,\n )}\n tooltipPlacement={popupPlacement}\n referenceElement={tooltipAnchor}\n visible={!!tooltipText}\n >\n {tooltipText}\n </Tooltip>\n <CopyToClipboardButton\n {...restProps}\n onError={onError}\n onSuccess={onSuccess}\n ref={setTooltipAnchor}\n />\n </>\n );\n};\n","import { ComponentProps } from 'react';\n\nexport const TextButton = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {\n return (\n <button {...rest} className=\"str-video__text-button\">\n {children}\n </button>\n );\n};\n","import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: () => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.join();\n onAccept?.();\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"success\"\n onClick={handleClick}\n />\n );\n};\n","import { PropsWithChildren, ReactNode, useEffect } from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type NotificationProps = {\n message?: ReactNode;\n isVisible?: boolean;\n visibilityTimeout?: number;\n resetIsVisible?: () => void;\n placement?: Placement;\n iconClassName?: string | null;\n};\n\nexport const Notification = (props: PropsWithChildren<NotificationProps>) => {\n const {\n isVisible,\n message,\n children,\n visibilityTimeout,\n resetIsVisible,\n placement = 'top',\n iconClassName = 'str-video__notification__icon',\n } = props;\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement,\n strategy: 'absolute',\n });\n\n useEffect(() => {\n if (!isVisible || !visibilityTimeout || !resetIsVisible) return;\n\n const timeout = setTimeout(() => {\n resetIsVisible();\n }, visibilityTimeout);\n\n return () => clearTimeout(timeout);\n }, [isVisible, resetIsVisible, visibilityTimeout]);\n\n return (\n <div ref={refs.setReference}>\n {isVisible && (\n <div\n className=\"str-video__notification\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {iconClassName && <i className={iconClassName} />}\n <span className=\"str-video__notification__message\">{message}</span>\n </div>\n )}\n {children}\n </div>\n );\n};\n","import { Notification } from './Notification';\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useHasPermissions } from '@stream-io/video-react-bindings';\n\nexport type PermissionNotificationProps = PropsWithChildren<{\n /**\n * Set this to true if there is ongoing request for the permission.\n */\n isAwaitingApproval: boolean;\n\n /**\n * The message to display in the notification once\n * the requested permission is granted.\n */\n messageApproved: string;\n\n /**\n * The message to display in the notification once a permission\n * is revoked.\n */\n messageRevoked: string;\n\n /**\n * The message to display in the notification while\n * the requested permission is awaiting approval.\n */\n messageAwaitingApproval: string;\n\n /**\n * The permission to check for.\n */\n permission: OwnCapability;\n\n /**\n * The time in milliseconds to display the notification.\n * Defaults to 3500ms.\n */\n visibilityTimeout?: number;\n}>;\n\nexport const PermissionNotification = (props: PermissionNotificationProps) => {\n const {\n permission,\n isAwaitingApproval,\n messageApproved,\n messageAwaitingApproval,\n messageRevoked,\n visibilityTimeout = 3500,\n children,\n } = props;\n const hasPermission = useHasPermissions(permission);\n const prevHasPermission = useRef(hasPermission);\n const [showNotification, setShowNotification] = useState<\n 'granted' | 'revoked'\n >();\n useEffect(() => {\n if (hasPermission && !prevHasPermission.current) {\n setShowNotification('granted');\n prevHasPermission.current = true;\n } else if (!hasPermission && prevHasPermission.current) {\n setShowNotification('revoked');\n prevHasPermission.current = false;\n }\n }, [hasPermission]);\n\n const resetIsVisible = useCallback(() => setShowNotification(undefined), []);\n if (isAwaitingApproval) {\n return (\n <Notification\n isVisible={isAwaitingApproval && !hasPermission}\n message={messageAwaitingApproval}\n >\n {children}\n </Notification>\n );\n }\n\n return (\n <Notification\n isVisible={!!showNotification}\n visibilityTimeout={visibilityTimeout}\n resetIsVisible={resetIsVisible}\n message={\n showNotification === 'granted' ? messageApproved : messageRevoked\n }\n >\n {children}\n </Notification>\n );\n};\n","import { PropsWithChildren } from 'react';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { Notification } from './Notification';\n\nexport type SpeakingWhileMutedNotificationProps = {\n /**\n * Text message displayed by the notification.\n */\n text?: string;\n};\n\nexport const SpeakingWhileMutedNotification = ({\n children,\n text,\n}: PropsWithChildren<SpeakingWhileMutedNotificationProps>) => {\n const { useMicrophoneState } = useCallStateHooks();\n const { isSpeakingWhileMuted } = useMicrophoneState();\n const { t } = useI18n();\n\n const message = text ?? t('You are muted. Unmute to speak.');\n return (\n <Notification message={message} isVisible={isSpeakingWhileMuted}>\n {children}\n </Notification>\n );\n};\n","import clsx from 'clsx';\n\nexport type LoadingIndicatorProps = {\n className?: string;\n /** String will be injected into class and later used to apply as a CSS mask-image to an element as data URL */\n type?: string;\n /** Text to be displayed under the loading indicator icon */\n text?: string;\n /** Tooltip to be displayed on hover */\n tooltip?: string;\n};\n\nexport const LoadingIndicator = ({\n className,\n type = 'spinner',\n text,\n tooltip,\n}: LoadingIndicatorProps) => {\n return (\n <div\n className={clsx('str-video__loading-indicator', className)}\n title={tooltip}\n >\n <div className={clsx('str-video__loading-indicator__icon', type)}></div>\n {text && <p className=\"str-video__loading-indicator-text\">{text}</p>}\n </div>\n );\n};\n","import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { useToggleCallRecording } from '../../hooks/useToggleCallRecording';\n\nexport type RecordCallButtonProps = {\n caption?: string;\n};\n\nexport const RecordCallButton = ({\n caption = 'Record',\n}: RecordCallButtonProps) => {\n const call = useCall();\n\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <CompositeButton active={isCallRecordingInProgress} caption={caption}>\n {isAwaitingResponse ? (\n <LoadingIndicator\n tooltip={\n isCallRecordingInProgress\n ? t('Waiting for recording to stop...')\n : t('Waiting for recording to start...')\n }\n />\n ) : (\n <IconButton\n // FIXME OL: sort out this ambiguity\n enabled={!!call}\n disabled={!call}\n icon={isCallRecordingInProgress ? 'recording-on' : 'recording-off'}\n title={t('Record call')}\n onClick={toggleCallRecording}\n />\n )}\n </CompositeButton>\n </Restricted>\n );\n};\n","import { ResponsiveLine } from '@nivo/line';\n\nexport const CallStatsLatencyChart = (props: {\n values: Array<{ x: number; y: number }>;\n}) => {\n const { values } = props;\n let max = 0;\n const data = values.map((point) => {\n const { y } = point;\n max = Math.max(max, y);\n return point;\n });\n return (\n <div className=\"str-video__call-stats-line-chart-container\">\n <ResponsiveLine\n colors={{ scheme: 'blues' }}\n data={[\n {\n id: 'Latency',\n data: data,\n },\n ]}\n animate={false}\n margin={{ top: 10, right: 5, bottom: 5, left: 30 }}\n enablePoints\n enableGridX={false}\n enableGridY\n enableSlices=\"x\"\n isInteractive\n useMesh={false}\n xScale={{ type: 'point' }}\n yScale={{\n type: 'linear',\n min: 0,\n max: max < 220 ? 220 : max + 30,\n nice: true,\n }}\n theme={{\n axis: {\n ticks: {\n text: {\n fill: '#FCFCFD',\n },\n line: {\n stroke: '#FCFCFD',\n },\n },\n },\n grid: {\n line: {\n strokeWidth: 0.1,\n },\n },\n }}\n />\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport {\n AggregatedStatsReport,\n CallStatsReport,\n} from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { CallStatsLatencyChart } from './CallStatsLatencyChart';\n\nexport const CallStats = () => {\n const [latencyBuffer, setLatencyBuffer] = useState<\n Array<{ x: number; y: number }>\n >(() => {\n const now = Date.now();\n return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));\n });\n\n const [publishBitrate, setPublishBitrate] = useState('-');\n const [subscribeBitrate, setSubscribeBitrate] = useState('-');\n const previousStats = useRef<CallStatsReport>();\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n useEffect(() => {\n if (!callStatsReport) return;\n if (!previousStats.current) {\n previousStats.current = callStatsReport;\n return;\n }\n const previousCallStatsReport = previousStats.current;\n setPublishBitrate(() => {\n return calculatePublishBitrate(previousCallStatsReport, callStatsReport);\n });\n setSubscribeBitrate(() => {\n return calculateSubscribeBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n\n setLatencyBuffer((latencyBuf) => {\n const newLatencyBuffer = latencyBuf.slice(-19);\n newLatencyBuffer.push({\n x: callStatsReport.timestamp,\n y: callStatsReport.publisherStats.averageRoundTripTimeInMs,\n });\n return newLatencyBuffer;\n });\n\n previousStats.current = callStatsReport;\n }, [callStatsReport]);\n\n return (\n <div className=\"str-video__call-stats\">\n {callStatsReport && (\n <>\n <h3>Call Latency</h3>\n <CallStatsLatencyChart values={latencyBuffer} />\n\n <h3>Call performance</h3>\n <div className=\"str-video__call-stats__card-container\">\n <StatCard label=\"Region\" value={callStatsReport.datacenter} />\n <StatCard\n label=\"Latency\"\n value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}\n />\n <StatCard\n label=\"Receive jitter\"\n value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}\n />\n <StatCard\n label=\"Publish jitter\"\n value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}\n />\n <StatCard\n label=\"Publish resolution\"\n value={toFrameSize(callStatsReport.publisherStats)}\n />\n <StatCard\n label=\"Publish quality drop reason\"\n value={callStatsReport.publisherStats.qualityLimitationReasons}\n />\n <StatCard\n label=\"Receiving resolution\"\n value={toFrameSize(callStatsReport.subscriberStats)}\n />\n <StatCard\n label=\"Receive quality drop reason\"\n value={callStatsReport.subscriberStats.qualityLimitationReasons}\n />\n <StatCard label=\"Publish bitrate\" value={publishBitrate} />\n <StatCard label=\"Receiving bitrate\" value={subscribeBitrate} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport const StatCard = (props: { label: string; value: string }) => {\n const { label, value } = props;\n return (\n <div className=\"str-video__call-stats__card\">\n <div className=\"str-video__call-stats__card_label\">{label}</div>\n <div className=\"str-video__call-stats__card_value\">{value}</div>\n </div>\n );\n};\n\nconst toFrameSize = (stats: AggregatedStatsReport) => {\n const {\n highestFrameWidth: w,\n highestFrameHeight: h,\n highestFramesPerSecond: fps,\n } = stats;\n let size = `-`;\n if (w && h) {\n size = `${w}x${h}`;\n if (fps) {\n size += `@${fps}fps.`;\n }\n }\n return size;\n};\n\nconst calculatePublishBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n publisherStats: {\n totalBytesSent: previousTotalBytesSent,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n publisherStats: { totalBytesSent, timestamp },\n } = callStatsReport;\n\n const bytesSent = totalBytesSent - previousTotalBytesSent;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculateSubscribeBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n subscriberStats: {\n totalBytesReceived: previousTotalBytesReceived,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n subscriberStats: { totalBytesReceived, timestamp },\n } = callStatsReport;\n\n const bytesReceived = totalBytesReceived - previousTotalBytesReceived;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n","import { forwardRef } from 'react';\n\nimport { CallStats } from '../CallStats';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nexport const CallStatsButton = () => (\n <MenuToggle placement=\"top-end\" ToggleButton={ToggleMenuButton}>\n <CallStats />\n </MenuToggle>\n);\n\nconst ToggleMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps<HTMLDivElement>\n>(({ menuShown }, ref) => (\n <CompositeButton ref={ref} active={menuShown} caption={'Stats'}>\n <IconButton icon=\"stats\" title=\"Statistics\" />\n </CompositeButton>\n));\n","import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\n\nexport type ScreenShareButtonProps = {\n caption?: string;\n};\n\nexport const ScreenShareButton = (props: ScreenShareButtonProps) => {\n const { t } = useI18n();\n const { caption = t('Screen Share') } = props;\n\n const { useHasOngoingScreenShare, useScreenShareState } = useCallStateHooks();\n const isSomeoneScreenSharing = useHasOngoingScreenShare();\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SCREENSHARE);\n\n const { screenShare, isMute: amIScreenSharing } = useScreenShareState();\n const disableScreenShareButton = amIScreenSharing\n ? isSomeoneScreenSharing\n : false;\n return (\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <PermissionNotification\n permission={OwnCapability.SCREENSHARE}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your screen.')}\n messageAwaitingApproval={t('Awaiting for an approval to share screen.')}\n messageRevoked={t('You can no longer share your screen.')}\n >\n <CompositeButton active={isSomeoneScreenSharing} caption={caption}>\n <IconButton\n icon={\n isSomeoneScreenSharing ? 'screen-share-on' : 'screen-share-off'\n }\n title={t('Share screen')}\n disabled={disableScreenShareButton}\n onClick={async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await screenShare.toggle();\n }\n }}\n />\n </CompositeButton>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import clsx from 'clsx';\nimport { ChangeEventHandler } from 'react';\n\ntype DeviceSelectorOptionProps = {\n id: string;\n label: string;\n name: string;\n selected?: boolean;\n value: string;\n disabled?: boolean;\n defaultChecked?: boolean;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n};\n\nconst DeviceSelectorOption = ({\n disabled,\n id,\n label,\n onChange,\n name,\n selected,\n defaultChecked,\n value,\n}: DeviceSelectorOptionProps) => {\n return (\n <label\n className={clsx('str-video__device-settings__option', {\n 'str-video__device-settings__option--selected': selected,\n 'str-video__device-settings__option--disabled': disabled,\n })}\n htmlFor={id}\n >\n <input\n type=\"radio\"\n name={name}\n onChange={onChange}\n value={value}\n id={id}\n checked={selected}\n defaultChecked={defaultChecked}\n disabled={disabled}\n />\n {label}\n </label>\n );\n};\nexport const DeviceSelector = (props: {\n devices: MediaDeviceInfo[];\n selectedDeviceId?: string;\n title: string;\n onChange?: (deviceId: string) => void;\n}) => {\n const {\n devices = [],\n selectedDeviceId: selectedDeviceFromProps,\n title,\n onChange,\n } = props;\n const inputGroupName = title.replace(' ', '-').toLowerCase();\n\n // sometimes the browser (Chrome) will report the system-default device\n // with an id of 'default'. In case when it doesn't, we'll select the first\n // available device.\n let selectedDeviceId = selectedDeviceFromProps;\n if (\n devices.length > 0 &&\n !devices.find((d) => d.deviceId === selectedDeviceId)\n ) {\n selectedDeviceId = devices[0].deviceId;\n }\n\n return (\n <div className=\"str-video__device-settings__device-kind\">\n <div className=\"str-video__device-settings__device-selector-title\">\n {title}\n </div>\n {!devices.length ? (\n <DeviceSelectorOption\n id={`${inputGroupName}--default`}\n label=\"Default\"\n name={inputGroupName}\n defaultChecked\n value=\"default\"\n />\n ) : (\n devices.map((device) => {\n return (\n <DeviceSelectorOption\n id={`${inputGroupName}--${device.deviceId}`}\n value={device.deviceId}\n label={device.label}\n key={device.deviceId}\n onChange={(e) => {\n onChange?.(e.target.value);\n }}\n name={inputGroupName}\n selected={\n device.deviceId === selectedDeviceId || devices.length === 1\n }\n />\n );\n })\n )}\n </div>\n );\n};\n","import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { DeviceSelector } from './DeviceSelector';\n\nexport type DeviceSelectorAudioInputProps = {\n title?: string;\n};\n\nexport const DeviceSelectorAudioInput = ({\n title,\n}: DeviceSelectorAudioInputProps) => {\n const { t } = useI18n();\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, selectedDevice, devices } = useMicrophoneState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n selectedDeviceId={selectedDevice}\n onChange={async (deviceId) => {\n await microphone.select(deviceId);\n }}\n title={title || t('Select a Mic')}\n />\n );\n};\n\nexport type DeviceSelectorAudioOutputProps = {\n title?: string;\n};\n\nexport const DeviceSelectorAudioOutput = ({\n title,\n}: DeviceSelectorAudioOutputProps) => {\n const { t } = useI18n();\n const { useSpeakerState } = useCallStateHooks();\n const { speaker, selectedDevice, devices, isDeviceSelectionSupported } =\n useSpeakerState();\n\n if (!isDeviceSelectionSupported) return null;\n\n return (\n <DeviceSelector\n devices={devices}\n selectedDeviceId={selectedDevice}\n onChange={(deviceId) => {\n speaker.select(deviceId);\n }}\n title={title || t('Select Speakers')}\n />\n );\n};\n","import { DeviceSelector } from './DeviceSelector';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\n\nexport type DeviceSelectorVideoProps = {\n title?: string;\n};\n\nexport const DeviceSelectorVideo = ({ title }: DeviceSelectorVideoProps) => {\n const { t } = useI18n();\n const { useCameraState } = useCallStateHooks();\n const { camera, devices, selectedDevice } = useCameraState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n selectedDeviceId={selectedDevice}\n onChange={async (deviceId) => {\n await camera.select(deviceId);\n }}\n title={title || t('Select a Camera')}\n />\n );\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n DeviceSelectorAudioInput,\n DeviceSelectorAudioOutput,\n} from './DeviceSelectorAudio';\nimport { DeviceSelectorVideo } from './DeviceSelectorVideo';\nimport { IconButton } from '../Button';\nimport clsx from 'clsx';\n\nexport const DeviceSettings = () => {\n return (\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleMenuButton}>\n <Menu />\n </MenuToggle>\n );\n};\n\nconst Menu = () => (\n <div className=\"str-video__device-settings\">\n <DeviceSelectorVideo />\n <DeviceSelectorAudioInput />\n <DeviceSelectorAudioOutput />\n </div>\n);\n\nconst ToggleMenuButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n ({ menuShown }, ref) => {\n const { t } = useI18n();\n\n return (\n <IconButton\n className={clsx('str-video__device-settings__button', {\n 'str-video__device-settings__button--active': menuShown,\n })}\n title={t('Toggle device menu')}\n icon=\"device-settings\"\n ref={ref}\n // tabindex={0}\n />\n );\n },\n);\n","import { ComponentType } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { DeviceSelectorAudioInput } from '../DeviceSettings';\nimport { CompositeButton, IconButton } from '../Button';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\n\nexport type ToggleAudioPreviewButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleAudioPreviewButton = (\n props: ToggleAudioPreviewButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Mic'), Menu = DeviceSelectorAudioInput } = props;\n\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, isMute } = useMicrophoneState();\n\n return (\n <CompositeButton Menu={Menu} active={isMute} caption={caption || t('Mic')}>\n <IconButton\n icon={!isMute ? 'mic' : 'mic-off'}\n onClick={() => microphone.toggle()}\n />\n </CompositeButton>\n );\n};\n\nexport type ToggleAudioPublishingButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleAudioPublishingButton = (\n props: ToggleAudioPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Mic'), Menu = DeviceSelectorAudioInput } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_AUDIO);\n\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, isMute } = useMicrophoneState();\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_AUDIO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now speak.')}\n messageAwaitingApproval={t('Awaiting for an approval to speak.')}\n messageRevoked={t('You can no longer speak.')}\n >\n <CompositeButton Menu={Menu} active={isMute} caption={caption}>\n <IconButton\n icon={isMute ? 'mic-off' : 'mic'}\n onClick={async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await microphone.toggle();\n }\n }}\n />\n </CompositeButton>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { ComponentType } from 'react';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\n\nimport { OwnCapability } from '@stream-io/video-client';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { DeviceSelectorVideo } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\n\nexport type ToggleVideoPreviewButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleVideoPreviewButton = (\n props: ToggleVideoPreviewButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Video'), Menu = DeviceSelectorVideo } = props;\n\n const { useCameraState } = useCallStateHooks();\n const { camera, isMute } = useCameraState();\n\n return (\n <CompositeButton Menu={Menu} active={isMute} caption={caption}>\n <IconButton\n icon={!isMute ? 'camera' : 'camera-off'}\n onClick={() => camera.toggle()}\n />\n </CompositeButton>\n );\n};\n\ntype ToggleVideoPublishingButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleVideoPublishingButton = (\n props: ToggleVideoPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Video'), Menu = DeviceSelectorVideo } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_VIDEO);\n\n const { useCameraState } = useCallStateHooks();\n const { camera, isMute } = useCameraState();\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_VIDEO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your video.')}\n messageAwaitingApproval={t(\n 'Awaiting for an approval to share your video.',\n )}\n messageRevoked={t('You can no longer share your video.')}\n >\n <CompositeButton Menu={Menu} active={isMute} caption={caption}>\n <IconButton\n icon={isMute ? 'camera-off' : 'camera'}\n onClick={async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await camera.toggle();\n }\n }}\n />\n </CompositeButton>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button/';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: () => void;\n};\n\nexport const CancelCallButton = ({\n disabled,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.leave();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-end\"\n variant=\"danger\"\n onClick={handleClick}\n />\n );\n};\n","import { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { CallStatsButton } from './CallStatsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: () => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <RecordCallButton />\n <CallStatsButton />\n <ScreenShareButton />\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n <ToggleVideoPublishingButton />\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n","import { useEffect } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type ReactionProps = {\n participant: StreamVideoParticipant;\n hideAfterTimeoutInMs?: number;\n emojiReactionMap?: Record<string, string>;\n};\n\nexport const defaultEmojiReactionMap: Record<string, string> = {\n ':like:': '👍',\n ':raise-hand:': '✋',\n ':fireworks:': '🎉',\n ':dislike:': '👎',\n ':heart:': '❤️',\n ':smile:': '😀',\n};\n\nexport const Reaction = ({\n participant: { reaction, sessionId },\n hideAfterTimeoutInMs = 5500,\n emojiReactionMap = defaultEmojiReactionMap,\n}: ReactionProps) => {\n const call = useCall();\n\n useEffect(() => {\n if (!call || !reaction) return;\n\n const timeoutId = setTimeout(() => {\n call.resetReaction(sessionId);\n }, hideAfterTimeoutInMs);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [call, hideAfterTimeoutInMs, reaction, sessionId]);\n\n if (!reaction) return null;\n\n const { emoji_code: emojiCode } = reaction;\n\n return (\n <div className=\"str-video__reaction\">\n <span className=\"str-video__reaction__emoji\">\n {emojiCode && emojiReactionMap[emojiCode]}\n </span>\n </div>\n );\n};\n","import { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport { CompositeButton, IconButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n const { t } = useI18n();\n\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <CompositeButton\n active={false}\n caption={t('Reactions')}\n menuPlacement=\"top-start\"\n Menu={<DefaultReactionsMenu reactions={reactions} />}\n >\n <IconButton\n icon=\"reactions\"\n title={t('Reactions')}\n onClick={() => {\n console.log('Reactions');\n }}\n />\n </CompositeButton>\n </Restricted>\n );\n};\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n return (\n <div className=\"str-video__reactions-menu\">\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n","import { CompositeButton, IconButton } from '../Button';\nimport { DeviceSelectorAudioOutput } from '../DeviceSettings';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { ComponentType } from 'react';\n\nexport type ToggleAudioOutputButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleAudioOutputButton = (\n props: ToggleAudioOutputButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Speakers'), Menu = DeviceSelectorAudioOutput } = props;\n\n return (\n <CompositeButton Menu={Menu} caption={caption}>\n <IconButton icon=\"speaker\" />\n </CompositeButton>\n );\n};\n","import { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { OwnCapability } from '@stream-io/video-client';\n\nimport { TextButton } from '../Button';\n\nexport const BlockedUserListing = ({ data }: { data: string[] }) => {\n if (!data.length) return null;\n\n return (\n <>\n <div className=\"str-video__participant-listing\">\n {data.map((userId) => (\n <BlockedUserListingItem key={userId} userId={userId} />\n ))}\n </div>\n </>\n );\n};\n\nconst BlockedUserListingItem = ({ userId }: { userId: string }) => {\n const call = useCall();\n\n const unblockUserClickHandler = () => {\n if (userId) call?.unblockUser(userId);\n };\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <div className=\"str-video__participant-listing-item__display-name\">\n {userId}\n </div>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <TextButton onClick={unblockUserClickHandler}>Unblock</TextButton>\n </Restricted>\n </div>\n );\n};\n","import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\n\nexport type CallParticipantListHeaderProps = {\n /** Click event listener function to be invoked in order to dismiss / hide the CallParticipantsList from the UI */\n onClose: () => void;\n};\n\nexport const CallParticipantListHeader = ({\n onClose,\n}: CallParticipantListHeaderProps) => {\n const { useParticipants, useAnonymousParticipantCount } = useCallStateHooks();\n const participants = useParticipants();\n const anonymousParticipantCount = useAnonymousParticipantCount();\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-list-header\">\n <div className=\"str-video__participant-list-header__title\">\n {t('Participants')}{' '}\n <span className=\"str-video__participant-list-header__title-count\">\n ({participants.length})\n </span>\n {anonymousParticipantCount > 0 && (\n <span className=\"str-video__participant-list-header__title-anonymous\">\n {t('Anonymous', { count: anonymousParticipantCount })}\n </span>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"str-video__participant-list-header__close-button\"\n >\n <span className=\"str-video__participant-list-header__close-button--icon\" />\n </button>\n </div>\n );\n};\n","import clsx from 'clsx';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n useEffect,\n useState,\n} from 'react';\nimport {\n Restricted,\n useCall,\n useConnectedUser,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport {\n OwnCapability,\n SfuModels,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { IconButton } from '../Button';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n MenuToggle,\n ToggleMenuButtonProps,\n} from '../Menu';\nimport { WithTooltip } from '../Tooltip';\nimport { Icon } from '../Icon';\n\ntype CallParticipantListingItemProps = {\n /** Participant object be rendered */\n participant: StreamVideoParticipant;\n /** Custom component used to display participant's name */\n DisplayName?: ComponentType<{ participant: StreamVideoParticipant }>;\n};\nexport const CallParticipantListingItem = ({\n participant,\n DisplayName = DefaultDisplayName,\n}: CallParticipantListingItemProps) => {\n const isAudioOn = participant.publishedTracks.includes(\n SfuModels.TrackType.AUDIO,\n );\n const isVideoOn = participant.publishedTracks.includes(\n SfuModels.TrackType.VIDEO,\n );\n const isPinned = !!participant.pin;\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <DisplayName participant={participant} />\n <div className=\"str-video__participant-listing-item__media-indicator-group\">\n <MediaIndicator\n title={isAudioOn ? t('Microphone on') : t('Microphone off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isAudioOn ? 'mic' : 'mic-off'\n }`,\n )}\n />\n <MediaIndicator\n title={isVideoOn ? t('Camera on') : t('Camera off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isVideoOn ? 'camera' : 'camera-off'\n }`,\n )}\n />\n {isPinned && (\n <MediaIndicator\n title={t('Pinned')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n 'str-video__participant-listing-item__icon-pinned',\n )}\n />\n )}\n\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <ParticipantActionsContextMenu participant={participant} />\n </MenuToggle>\n </div>\n </div>\n );\n};\n\nconst MediaIndicator = (props: ComponentProps<'div'>) => (\n <WithTooltip {...props} />\n);\n\ntype DisplayNameProps = {\n /** Participant object that provides the data from which display name can be generated */\n participant: StreamVideoParticipant;\n};\n// todo: implement display device flag\nconst DefaultDisplayName = ({ participant }: DisplayNameProps) => {\n const connectedUser = useConnectedUser();\n const { t } = useI18n();\n\n const meFlag = participant.userId === connectedUser?.id ? t('Me') : '';\n const nameOrId = participant.name || participant.userId || t('Unknown');\n let displayName;\n if (!participant.name) {\n displayName = meFlag || nameOrId || t('Unknown');\n } else if (meFlag) {\n displayName = `${nameOrId} (${meFlag})`;\n } else {\n displayName = nameOrId;\n }\n\n return (\n <WithTooltip\n className=\"str-video__participant-listing-item__display-name\"\n title={displayName}\n >\n {displayName}\n </WithTooltip>\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n (props, ref) => {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n\nexport const ParticipantActionsContextMenu = ({\n participant,\n participantViewElement,\n videoElement,\n}: {\n participant: StreamVideoParticipant;\n participantViewElement?: HTMLDivElement | null;\n videoElement?: HTMLVideoElement | null;\n}) => {\n const [fullscreenModeOn, setFullscreenModeOn] = useState(\n !!document.fullscreenElement,\n );\n const [pictureInPictureElement, setPictureInPictureElement] = useState(\n document.pictureInPictureElement,\n );\n const call = useCall();\n const { t } = useI18n();\n\n const { pin, publishedTracks, sessionId, userId } = participant;\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const hasVideo = publishedTracks.includes(SfuModels.TrackType.VIDEO);\n const hasScreenShare = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE,\n );\n const hasScreenShareAudio = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE_AUDIO,\n );\n\n const blockUser = () => call?.blockUser(userId);\n const muteAudio = () => call?.muteUser(userId, 'audio');\n const muteVideo = () => call?.muteUser(userId, 'video');\n const muteScreenShare = () => call?.muteUser(userId, 'screenshare');\n const muteScreenShareAudio = () =>\n call?.muteUser(userId, 'screenshare_audio');\n\n const grantPermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n grant_permissions: [permission],\n });\n };\n\n const revokePermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n revoke_permissions: [permission],\n });\n };\n\n const toggleParticipantPinnedAt = () => {\n if (pin) {\n call?.unpin(sessionId);\n } else {\n call?.pin(sessionId);\n }\n };\n\n const pinForEveryone = () => {\n call\n ?.pinForEveryone({\n user_id: userId,\n session_id: sessionId,\n })\n .catch((err) => {\n console.error(`Failed to pin participant ${userId}`, err);\n });\n };\n\n const unpinForEveryone = () => {\n call\n ?.unpinForEveryone({\n user_id: userId,\n session_id: sessionId,\n })\n .catch((err) => {\n console.error(`Failed to unpin participant ${userId}`, err);\n });\n };\n\n const toggleFullscreenMode = () => {\n if (!fullscreenModeOn) {\n return participantViewElement\n ?.requestFullscreen()\n .then(() => setFullscreenModeOn(true))\n .catch(console.error);\n }\n\n document\n .exitFullscreen()\n .catch(console.error)\n .finally(() => setFullscreenModeOn(false));\n };\n\n useEffect(() => {\n if (!videoElement) return;\n\n const handlePictureInPicture = () => {\n setPictureInPictureElement(document.pictureInPictureElement);\n };\n\n videoElement.addEventListener(\n 'enterpictureinpicture',\n handlePictureInPicture,\n );\n videoElement.addEventListener(\n 'leavepictureinpicture',\n handlePictureInPicture,\n );\n\n return () => {\n videoElement.removeEventListener(\n 'enterpictureinpicture',\n handlePictureInPicture,\n );\n videoElement.removeEventListener(\n 'leavepictureinpicture',\n handlePictureInPicture,\n );\n };\n }, [videoElement]);\n\n const togglePictureInPicture = () => {\n if (videoElement && pictureInPictureElement !== videoElement) {\n return videoElement\n .requestPictureInPicture()\n .catch(console.error) as Promise<void>;\n }\n\n document.exitPictureInPicture().catch(console.error);\n };\n\n return (\n <GenericMenu>\n <GenericMenuButtonItem\n onClick={toggleParticipantPinnedAt}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {pin ? t('Unpin') : t('Pin')}\n </GenericMenuButtonItem>\n <Restricted requiredGrants={[OwnCapability.PIN_FOR_EVERYONE]}>\n <GenericMenuButtonItem\n onClick={pinForEveryone}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Pin for everyone')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={unpinForEveryone}\n disabled={!pin || pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Unpin for everyone')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <GenericMenuButtonItem onClick={blockUser}>\n <Icon icon=\"not-allowed\" />\n {t('Block')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.MUTE_USERS]}>\n <GenericMenuButtonItem disabled={!hasVideo} onClick={muteVideo}>\n <Icon icon=\"camera-off-outline\" />\n {t('Turn off video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n disabled={!hasScreenShare}\n onClick={muteScreenShare}\n >\n <Icon icon=\"screen-share-off\" />\n {t('Turn off screen share')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem disabled={!hasAudio} onClick={muteAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n disabled={!hasScreenShareAudio}\n onClick={muteScreenShareAudio}\n >\n <Icon icon=\"no-audio\" />\n {t('Mute screen share audio')}\n </GenericMenuButtonItem>\n </Restricted>\n {participantViewElement && (\n <GenericMenuButtonItem onClick={toggleFullscreenMode}>\n {t('{{ direction }} fullscreen', {\n direction: fullscreenModeOn ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n {videoElement && document.pictureInPictureEnabled && (\n <GenericMenuButtonItem onClick={togglePictureInPicture}>\n {t('{{ direction }} picture-in-picture', {\n direction:\n pictureInPictureElement === videoElement\n ? t('Leave')\n : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n <Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Allow audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Allow video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SCREENSHARE)}\n >\n {t('Allow screen sharing')}\n </GenericMenuButtonItem>\n\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Disable audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Disable video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SCREENSHARE)}\n >\n {t('Disable screen sharing')}\n </GenericMenuButtonItem>\n </Restricted>\n </GenericMenu>\n );\n};\n","import { ComponentType } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { CallParticipantListingItem } from './CallParticipantListingItem';\n\nexport type CallParticipantListingProps = {\n /** Array of participant objects to be rendered */\n data: StreamVideoParticipant[];\n Header?: ComponentType;\n};\n\nexport const CallParticipantListing = ({\n data,\n}: CallParticipantListingProps) => (\n <div className=\"str-video__participant-listing\">\n {data.map((participant) => (\n <CallParticipantListingItem\n key={participant.sessionId}\n participant={participant}\n />\n ))}\n </div>\n);\n","import { useI18n } from '@stream-io/video-react-bindings';\n\nexport const EmptyParticipantSearchList = () => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__participant-list--empty\">\n {t('No participants found')}\n </div>\n );\n};\n","import { ComponentProps, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\ntype SearchInputProps = ComponentProps<'input'> & {\n /**\n * Resets the search to its initial state.\n * The function is called when Esc key or inputs clear button are pressed\n */\n exitSearch: () => void;\n /**\n * Flag to signal, whether search input elements should be rendered as active\n */\n isActive: boolean;\n};\nexport const SearchInput = ({\n exitSearch,\n isActive,\n ...rest\n}: SearchInputProps) => {\n const [inputElement, setInputElement] = useState<HTMLInputElement | null>(\n null,\n );\n useEffect(() => {\n if (!inputElement) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === 'escape') exitSearch();\n };\n\n inputElement.addEventListener('keydown', handleKeyDown);\n\n return () => {\n inputElement.removeEventListener('keydown', handleKeyDown);\n };\n }, [exitSearch, inputElement]);\n\n return (\n <div\n className={clsx('str-video__search-input__container', {\n 'str-video__search-input__container--active': isActive,\n })}\n >\n <input placeholder=\"Search\" {...rest} ref={setInputElement} />\n {isActive ? (\n <button\n className=\"str-video__search-input__clear-btn\"\n onClick={exitSearch}\n >\n <span className=\"str-video__search-input__icon--active\" />\n </button>\n ) : (\n <span className=\"str-video__search-input__icon\" />\n )}\n </div>\n );\n};\n","import { ComponentType } from 'react';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../LoadingIndicator';\nimport { SearchController } from './hooks';\n\nexport type SearchResultListProps<T> = {\n data: T[];\n};\n\nexport type SearchResultsProps<T> = Pick<\n SearchController<T>,\n 'searchResults' | 'searchQueryInProgress'\n> & {\n /** Component to be displayed, when empty array of search results is provided */\n EmptySearchResultComponent: ComponentType;\n /** Component will be used to render non-empty array of search results */\n SearchResultList: ComponentType<SearchResultListProps<T>>;\n /** Component to be displayed while the search query request is in progress */\n LoadingIndicator?: ComponentType;\n};\n\nexport const SearchResults = <T extends unknown>({\n EmptySearchResultComponent,\n LoadingIndicator = DefaultLoadingIndicator,\n searchQueryInProgress,\n searchResults,\n SearchResultList,\n}: SearchResultsProps<T>) => {\n if (searchQueryInProgress) {\n return (\n <div className=\"str-video__search-results--loading\">\n <LoadingIndicator />\n </div>\n );\n }\n if (!searchResults.length) {\n return <EmptySearchResultComponent />;\n }\n\n return <SearchResultList data={searchResults} />;\n};\n","import { useEffect, useState } from 'react';\n\nexport type SearchController<T> = {\n /** Flag signals that the search request is flight await the response */\n searchQueryInProgress: boolean;\n /** Array of items returned by the search query */\n searchResults: T[];\n};\n\nexport type UseSearchParams<T> = {\n /** Search function performing the search request */\n searchFn: (searchQuery: string) => Promise<T[]>;\n /** Debounce interval applied to the search function */\n debounceInterval: number;\n /** Search query string */\n searchQuery?: string;\n};\n\nexport const useSearch = <T>({\n debounceInterval,\n searchFn,\n searchQuery = '',\n}: UseSearchParams<T>): SearchController<T> => {\n const [searchResults, setSearchResults] = useState<T[]>([]);\n const [searchQueryInProgress, setSearchQueryInProgress] = useState(false);\n\n useEffect(() => {\n if (!searchQuery.length) return setSearchResults([]);\n\n setSearchQueryInProgress(true);\n\n const timeout = setTimeout(async () => {\n try {\n const results = await searchFn(searchQuery);\n setSearchResults(results);\n } catch (error) {\n console.error(error);\n } finally {\n setSearchQueryInProgress(false);\n }\n }, debounceInterval);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [debounceInterval, searchFn, searchQuery]);\n\n return {\n searchQueryInProgress,\n searchResults,\n };\n};\n","import {\n ComponentProps,\n Dispatch,\n ForwardedRef,\n forwardRef,\n SetStateAction,\n useCallback,\n useState,\n} from 'react';\nimport {\n Restricted,\n useCall,\n useCallStateHooks,\n} from '@stream-io/video-react-bindings';\nimport {\n name,\n OwnCapability,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\n\nimport { BlockedUserListing } from './BlockedUserListing';\nimport {\n CopyToClipboardButtonWithPopup,\n IconButton,\n TextButton,\n} from '../Button';\nimport { CallParticipantListHeader } from './CallParticipantListHeader';\nimport { CallParticipantListing } from './CallParticipantListing';\nimport { EmptyParticipantSearchList } from './EmptyParticipantSearchList';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { SearchInput, SearchResults } from '../Search';\nimport { useSearch, UseSearchParams } from '../Search/hooks';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n MenuToggle,\n ToggleMenuButtonProps,\n} from '../Menu';\n\ntype CallParticipantListProps = {\n /** Click event listener function to be invoked in order to dismiss/hide the CallParticipantsList from the UI */\n onClose: () => void;\n /** Custom function to override the searching logic of active participants */\n activeUsersSearchFn?: UseSearchParams<StreamVideoParticipant>['searchFn'];\n /** Custom function to override the searching logic of blocked users */\n blockedUsersSearchFn?: UseSearchParams<string>['searchFn'];\n /** Interval in ms, during which the participant search calls will be debounced. The default value is 200ms. */\n debounceSearchInterval?: number;\n};\n\nconst UserListTypes = {\n active: 'Active users',\n blocked: 'Blocked users',\n} as const;\n\nconst DEFAULT_DEBOUNCE_SEARCH_INTERVAL = 200 as const;\n\nexport const CallParticipantsList = ({\n onClose,\n activeUsersSearchFn,\n blockedUsersSearchFn,\n debounceSearchInterval,\n}: CallParticipantListProps) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [userListType, setUserListType] =\n useState<keyof typeof UserListTypes>('active');\n\n const exitSearch = useCallback(() => setSearchQuery(''), []);\n\n return (\n <div className=\"str-video__participant-list\">\n <CallParticipantListHeader onClose={onClose} />\n <SearchInput\n value={searchQuery}\n onChange={({ currentTarget }) => setSearchQuery(currentTarget.value)}\n exitSearch={exitSearch}\n isActive={!!searchQuery}\n />\n <CallParticipantListContentHeader\n userListType={userListType}\n setUserListType={setUserListType}\n />\n <div className=\"str-video__participant-list__content\">\n {userListType === 'active' && (\n <ActiveUsersSearchResults\n searchQuery={searchQuery}\n activeUsersSearchFn={activeUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n {userListType === 'blocked' && (\n <BlockedUsersSearchResults\n searchQuery={searchQuery}\n blockedUsersSearchFn={blockedUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n </div>\n <div className=\"str-video__participant-list__footer\">\n <CopyToClipboardButtonWithPopup\n Button={InviteLinkButton}\n copyValue={typeof window !== 'undefined' ? window.location.href : ''}\n />\n </div>\n </div>\n );\n};\n\nconst CallParticipantListContentHeader = ({\n userListType,\n setUserListType,\n}: {\n userListType: keyof typeof UserListTypes;\n setUserListType: Dispatch<SetStateAction<keyof typeof UserListTypes>>;\n}) => {\n const call = useCall();\n\n const muteAll = () => {\n call?.muteAllUsers('audio');\n };\n\n return (\n <div className=\"str-video__participant-list__content-header\">\n <div className=\"str-video__participant-list__content-header-title\">\n <span>{UserListTypes[userListType]}</span>\n {userListType === 'active' && (\n <Restricted\n requiredGrants={[OwnCapability.MUTE_USERS]}\n hasPermissionsOnly\n >\n <TextButton onClick={muteAll}>Mute all</TextButton>\n </Restricted>\n )}\n </div>\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <GenericMenu>\n {(\n Object.keys(UserListTypes) as Array<keyof typeof UserListTypes>\n ).map((lt) => (\n <GenericMenuButtonItem\n key={lt}\n aria-selected={lt === userListType}\n onClick={() => setUserListType(lt)}\n >\n {UserListTypes[lt]}\n </GenericMenuButtonItem>\n ))}\n </GenericMenu>\n </MenuToggle>\n </div>\n );\n};\n\nconst ActiveUsersSearchResults = ({\n searchQuery,\n activeUsersSearchFn: activeUsersSearchFnFromProps,\n debounceSearchInterval = DEFAULT_DEBOUNCE_SEARCH_INTERVAL,\n}: Pick<\n CallParticipantListProps,\n 'activeUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useParticipants } = useCallStateHooks();\n const participants = useParticipants({ sortBy: name });\n\n const activeUsersSearchFn = useCallback(\n (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return Promise.resolve(\n participants.filter((participant) => {\n return participant.name.match(queryRegExp);\n }),\n );\n },\n [participants],\n );\n\n const { searchQueryInProgress, searchResults } =\n useSearch<StreamVideoParticipant>({\n searchFn: activeUsersSearchFnFromProps ?? activeUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<StreamVideoParticipant>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : participants}\n SearchResultList={CallParticipantListing}\n />\n );\n};\n\nconst BlockedUsersSearchResults = ({\n blockedUsersSearchFn: blockedUsersSearchFnFromProps,\n debounceSearchInterval = DEFAULT_DEBOUNCE_SEARCH_INTERVAL,\n searchQuery,\n}: Pick<\n CallParticipantListProps,\n 'blockedUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useCallBlockedUserIds } = useCallStateHooks();\n const blockedUsers = useCallBlockedUserIds();\n\n const blockedUsersSearchFn = useCallback(\n (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return Promise.resolve(\n blockedUsers.filter((blockedUser) => {\n return blockedUser.match(queryRegExp);\n }),\n );\n },\n [blockedUsers],\n );\n\n const { searchQueryInProgress, searchResults } = useSearch<string>({\n searchFn: blockedUsersSearchFnFromProps ?? blockedUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<string>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : blockedUsers}\n SearchResultList={BlockedUserListing}\n />\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n (props, ref) => {\n return <IconButton enabled={props.menuShown} icon=\"filter\" ref={ref} />;\n },\n);\n\nconst InviteLinkButton = forwardRef(\n (\n { className, ...props }: ComponentProps<'button'>,\n ref: ForwardedRef<HTMLButtonElement>,\n ) => (\n <button\n {...props}\n className={clsx('str-video__invite-link-button', className)}\n ref={ref}\n >\n <div className=\"str-video__invite-participant-icon\" />\n <div className=\"str-video__invite-link-button__text\">Invite Link</div>\n </button>\n ),\n);\n","import clsx from 'clsx';\nimport { CSSProperties, useEffect, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type CallPreviewProps = {\n /**\n * Additional CSS class name to apply to the CallPreview element.\n */\n className?: string;\n\n /**\n * Additional CSS properties to apply to the CallPreview element.\n */\n style?: CSSProperties;\n};\n\nexport const CallPreview = (props: CallPreviewProps) => {\n const { className, style } = props;\n const call = useCall();\n const { useCallThumbnail } = useCallStateHooks();\n const thumbnail = useCallThumbnail();\n\n const [imageRef, setImageRef] = useState<HTMLImageElement | null>(null);\n useEffect(() => {\n if (!imageRef || !call) return;\n const cleanup = call.bindCallThumbnailElement(imageRef);\n return () => cleanup();\n }, [imageRef, call]);\n\n if (!thumbnail) return null;\n\n return (\n <img\n className={clsx('str-video__call-preview', className)}\n style={style}\n alt=\"Call Preview Thumbnail\"\n ref={setImageRef}\n />\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { IconButton } from '../Button';\n\nexport type CallRecordingListHeaderProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingListHeader = ({\n callRecordings,\n onRefresh,\n}: CallRecordingListHeaderProps) => {\n return (\n <div className=\"str-video__call-recording-list__header\">\n <div className=\"str-video__call-recording-list__title\">\n <span>Call Recordings</span>\n {callRecordings.length ? <span>({callRecordings.length})</span> : null}\n </div>\n <IconButton icon=\"refresh\" title=\"Refresh\" onClick={onRefresh} />\n </div>\n );\n};\n","import clsx from 'clsx';\nimport { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport { CallRecording } from '@stream-io/video-client';\nimport { CopyToClipboardButtonWithPopup } from '../Button';\n\nexport type CallRecordingListItemProps = {\n /** CallRecording object to represent */\n recording: CallRecording;\n};\nexport const CallRecordingListItem = ({\n recording,\n}: CallRecordingListItemProps) => {\n return (\n <div className=\"str-video__call-recording-list-item\">\n <div className=\"str-video__call-recording-list-item__info\">\n <div className=\"str-video__call-recording-list-item__created\">\n {new Date(recording.end_time).toLocaleString()}\n </div>\n </div>\n <div className=\"str-video__call-recording-list-item__actions\">\n <a\n className={clsx(\n 'str-video__call-recording-list-item__action-button',\n 'str-video__call-recording-list-item__action-button--download',\n )}\n role=\"button\"\n href={recording.url}\n download={recording.filename}\n title=\"Download the recording\"\n >\n <span\n className={clsx(\n 'str-video__call-recording-list-item__action-button-icon',\n 'str-video__download-button--icon',\n )}\n />\n </a>\n <CopyToClipboardButtonWithPopup\n Button={CopyUrlButton}\n copyValue={recording.url}\n />\n </div>\n </div>\n );\n};\nconst CopyUrlButton = forwardRef(\n (props: ComponentProps<'button'>, ref: ForwardedRef<HTMLButtonElement>) => {\n return (\n <button\n {...props}\n className={clsx(\n 'str-video__call-recording-list-item__action-button',\n 'str-video__call-recording-list-item__action-button--copy-link',\n )}\n ref={ref}\n title=\"Copy the recording link\"\n >\n <span\n className={clsx(\n 'str-video__call-recording-list-item__action-button-icon',\n 'str-video__copy-button--icon',\n )}\n />\n </button>\n );\n },\n);\n","export const EmptyCallRecordingListing = () => {\n return (\n <div className=\"str-video__call-recording-list__listing str-video__call-recording-list__listing--empty\">\n <div className=\"str-video__call-recording-list__listing--icon-empty\" />\n <p className=\"str-video__call-recording-list__listing--text-empty\">\n {/* todo: introduce i18n to enable text customization */}\n No recordings available\n </p>\n </div>\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { CallRecordingListItem } from './CallRecordingListItem';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nexport type LoadingCallRecordingListProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n};\n\nexport const LoadingCallRecordingListing = ({\n callRecordings,\n}: LoadingCallRecordingListProps) => {\n return (\n <>\n {callRecordings.map((recording) => (\n <CallRecordingListItem recording={recording} key={recording.filename} />\n ))}\n <LoadingIndicator text=\"Recording getting ready\" />\n </>\n );\n};\n","import { ComponentType } from 'react';\nimport { CallRecording } from '@stream-io/video-client';\n\nimport {\n CallRecordingListHeader as DefaultCallRecordingListHeader,\n CallRecordingListHeaderProps,\n} from './CallRecordingListHeader';\nimport {\n CallRecordingListItem as DefaultCallRecordingListItem,\n CallRecordingListItemProps,\n} from './CallRecordingListItem';\nimport { EmptyCallRecordingListing as DefaultEmptyCallRecordingList } from './EmptyCallRecordingListing';\nimport {\n LoadingCallRecordingListing as DefaultLoadingCallRecordingList,\n LoadingCallRecordingListProps,\n} from './LoadingCallRecordingListing';\n\nexport type CallRecordingListProps = {\n /** Array of CallRecording objects to be displayed */\n callRecordings: CallRecording[];\n /** Custom component to replace the default header implementation */\n CallRecordingListHeader?: ComponentType<CallRecordingListHeaderProps>;\n /** Custom component to replace the default list item implementation */\n CallRecordingListItem?: ComponentType<CallRecordingListItemProps>;\n /** Custom component to replace the default empty list component implementation */\n EmptyCallRecordingList?: ComponentType;\n /** Signals that a request for new list of CallRecording object has been initiated */\n loading?: boolean;\n /** Custom component to be rendered when loading is true */\n LoadingCallRecordingList?: ComponentType<LoadingCallRecordingListProps>;\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingList = ({\n callRecordings,\n CallRecordingListHeader = DefaultCallRecordingListHeader,\n CallRecordingListItem = DefaultCallRecordingListItem,\n EmptyCallRecordingList = DefaultEmptyCallRecordingList,\n loading,\n LoadingCallRecordingList = DefaultLoadingCallRecordingList,\n onRefresh,\n}: CallRecordingListProps) => {\n return (\n <div className=\"str-video__call-recording-list\">\n <CallRecordingListHeader\n callRecordings={callRecordings}\n onRefresh={onRefresh}\n />\n <div className=\"str-video__call-recording-list__listing\">\n {loading ? (\n <LoadingCallRecordingList callRecordings={callRecordings} />\n ) : callRecordings.length ? (\n callRecordings.map((recording) => (\n <CallRecordingListItem\n recording={recording}\n key={recording.filename}\n />\n ))\n ) : (\n <EmptyCallRecordingList />\n )}\n </div>\n </div>\n );\n};\n","import { CallingState } from '@stream-io/video-client';\nimport { AcceptCallButton, CancelCallButton } from '../CallControls';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const RingingCallControls = () => {\n const call = useCall();\n const { useCallCallingState } = useCallStateHooks();\n const callCallingState = useCallCallingState();\n\n if (!call) return null;\n\n const buttonsDisabled = callCallingState !== CallingState.RINGING;\n return (\n <div className=\"str-video__pending-call-controls\">\n {call.isCreatedByMe ? (\n <CancelCallButton disabled={buttonsDisabled} />\n ) : (\n <>\n <AcceptCallButton disabled={buttonsDisabled} />\n <CancelCallButton\n onClick={() => call.leave({ reject: true })}\n disabled={buttonsDisabled}\n />\n </>\n )}\n </div>\n );\n};\n","import { CallingState, UserResponse } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useConnectedUser,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { Avatar } from '../Avatar';\nimport { RingingCallControls } from './RingingCallControls';\n\nconst CALLING_STATE_TO_LABEL: Record<CallingState, string> = {\n [CallingState.JOINING]: 'Joining',\n [CallingState.RINGING]: 'Ringing',\n [CallingState.MIGRATING]: 'Migrating',\n [CallingState.RECONNECTING]: 'Re-connecting',\n [CallingState.RECONNECTING_FAILED]: 'Failed',\n [CallingState.OFFLINE]: 'No internet connection',\n [CallingState.IDLE]: '',\n [CallingState.UNKNOWN]: '',\n [CallingState.JOINED]: 'Joined',\n [CallingState.LEFT]: 'Left call',\n};\n\nexport type RingingCallProps = {\n /**\n * Whether to include the current user in the list of members to show.\n * @default false.\n */\n includeSelf?: boolean;\n\n /**\n * The maximum number of members to show.\n * @default 3.\n */\n totalMembersToShow?: number;\n};\n\nexport const RingingCall = (props: RingingCallProps) => {\n const { includeSelf = false, totalMembersToShow = 3 } = props;\n const call = useCall();\n const { t } = useI18n();\n const { useCallCallingState, useCallMembers } = useCallStateHooks();\n const callingState = useCallCallingState();\n const members = useCallMembers();\n const connectedUser = useConnectedUser();\n\n if (!call) return null;\n\n // take the first N members to show their avatars\n const membersToShow: UserResponse[] = (members || [])\n .slice(0, totalMembersToShow)\n .map(({ user }) => user)\n .filter((user) => user.id !== connectedUser?.id || includeSelf);\n if (\n includeSelf &&\n !membersToShow.find((user) => user.id === connectedUser?.id)\n ) {\n // if the current user is not in the initial batch of members,\n // replace the first item in membersToShow array with the current user\n const self = members.find(({ user }) => user.id === connectedUser?.id);\n if (self) {\n membersToShow.splice(0, 1, self.user);\n }\n }\n\n const callingStateLabel = CALLING_STATE_TO_LABEL[callingState];\n\n return (\n <div className=\"str-video__call-panel str-video__call-panel--ringing\">\n <div className=\"str-video__call-panel__members-list\">\n {membersToShow.map((user) => (\n <div key={user.id} className=\"str-video__call-panel__member-box\">\n <Avatar name={user.name} imageSrc={user.image} />\n {user.name && (\n <div className=\"str-video__member_details\">\n <span className=\"str-video__member_name\">{user.name}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n\n {callingStateLabel && (\n <div className=\"str-video__call-panel__calling-state-label\">\n {t(callingStateLabel)}\n </div>\n )}\n\n {[CallingState.RINGING, CallingState.JOINING].includes(callingState) && (\n <RingingCallControls />\n )}\n </div>\n );\n};\n","import {\n ButtonHTMLAttributes,\n ComponentProps,\n forwardRef,\n Fragment,\n PropsWithChildren,\n useEffect,\n useState,\n} from 'react';\nimport {\n OwnCapability,\n PermissionRequestEvent,\n StreamVideoEvent,\n UserResponse,\n} from '@stream-io/video-client';\nimport {\n TranslatorFunction,\n useCall,\n useCallStateHooks,\n useHasPermissions,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nconst byNameOrId = (a: UserResponse, b: UserResponse) => {\n if (a.name && b.name && a.name < b.name) return -1;\n if (a.name && b.name && a.name > b.name) return 1;\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n return 0;\n};\n\ntype HandleUpdatePermission = (\n request: PermissionRequestEvent,\n type: 'grant' | 'revoke' | 'dismiss',\n) => () => Promise<void>;\n\nexport const PermissionRequests = () => {\n const call = useCall();\n const { useLocalParticipant } = useCallStateHooks();\n const localParticipant = useLocalParticipant();\n const [expanded, setExpanded] = useState(false);\n const [permissionRequests, setPermissionRequests] = useState<\n PermissionRequestEvent[]\n >([]);\n const canUpdateCallPermissions = useHasPermissions(\n OwnCapability.UPDATE_CALL_PERMISSIONS,\n );\n\n const localUserId = localParticipant?.userId;\n useEffect(() => {\n if (!call || !canUpdateCallPermissions) return;\n\n const unsubscribe = call.on(\n 'call.permission_request',\n (event: StreamVideoEvent) => {\n if (event.type !== 'call.permission_request') return;\n if (event.user.id !== localUserId) {\n setPermissionRequests((requests) =>\n [...requests, event as PermissionRequestEvent].sort((a, b) =>\n byNameOrId(a.user, b.user),\n ),\n );\n }\n },\n );\n return () => {\n unsubscribe();\n };\n }, [call, canUpdateCallPermissions, localUserId]);\n\n const handleUpdatePermission: HandleUpdatePermission = (request, type) => {\n return async () => {\n const { user, permissions } = request;\n switch (type) {\n case 'grant':\n await call?.grantPermissions(user.id, permissions);\n break;\n case 'revoke':\n await call?.revokePermissions(user.id, permissions);\n break;\n default:\n break;\n }\n setPermissionRequests((requests) =>\n requests.filter((r) => r !== request),\n );\n };\n };\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement: 'bottom',\n strategy: 'absolute',\n });\n\n // don't render anything if there are no permission requests\n if (permissionRequests.length === 0) return null;\n\n return (\n <div className=\"str-video__permission-requests\" ref={refs.setReference}>\n <div className=\"str-video__permission-requests__notification\">\n <span className=\"str-video__permission-requests__notification__message\">\n {permissionRequests.length} pending permission requests\n </span>\n <Button\n type=\"button\"\n onClick={() => {\n setExpanded((e) => !e);\n }}\n >\n {expanded ? 'Hide requests' : 'Show requests'}\n </Button>\n </div>\n {expanded && (\n <PermissionRequestList\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n permissionRequests={permissionRequests}\n handleUpdatePermission={handleUpdatePermission}\n />\n )}\n </div>\n );\n};\n\nexport type PermissionRequestListProps = ComponentProps<'div'> & {\n permissionRequests: PermissionRequestEvent[];\n handleUpdatePermission: HandleUpdatePermission;\n};\n\nexport const PermissionRequestList = forwardRef<\n HTMLDivElement,\n PermissionRequestListProps\n>((props, ref) => {\n const { permissionRequests, handleUpdatePermission, ...rest } = props;\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__permission-requests-list\" ref={ref} {...rest}>\n {permissionRequests.map((request, reqIndex) => {\n const { user, permissions } = request;\n return (\n <Fragment key={`${user.id}/${reqIndex}`}>\n {permissions.map((permission) => (\n <div className=\"str-video__permission-request\" key={permission}>\n <div className=\"str-video__permission-request__message\">\n {messageForPermission(user.name || user.id, permission, t)}\n </div>\n <Button\n className=\"str-video__permission-request__button--allow\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'grant')}\n >\n {t('Allow')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'revoke')}\n >\n {t('Revoke')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'dismiss')}\n >\n {t('Dismiss')}\n </Button>\n </div>\n ))}\n </Fragment>\n );\n })}\n </div>\n );\n});\n\nconst Button = (\n props: PropsWithChildren<ButtonHTMLAttributes<HTMLButtonElement>>,\n) => {\n const { className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__permission-request__button', className)}\n {...rest}\n />\n );\n};\n\nconst messageForPermission = (\n userName: string,\n permission: string,\n t: TranslatorFunction,\n) => {\n switch (permission) {\n case OwnCapability.SEND_AUDIO:\n return t('{{ userName }} is requesting to speak', { userName });\n case OwnCapability.SEND_VIDEO:\n return t('{{ userName }} is requesting to share their camera', {\n userName,\n });\n case OwnCapability.SCREENSHARE:\n return t('{{ userName }} is requesting to present their screen', {\n userName,\n });\n default:\n return t('{{ userName }} is requesting permission: {{ permission }}', {\n userName,\n permission,\n });\n }\n};\n","import { ElementType, HTMLProps, PropsWithChildren } from 'react';\nimport clsx from 'clsx';\n\nexport type StreamThemeProps = HTMLProps<HTMLElement> & {\n as?: ElementType;\n};\n\nexport const StreamTheme = ({\n as: Component = 'div',\n className,\n children,\n ...props\n}: PropsWithChildren<StreamThemeProps>) => {\n return (\n <Component {...props} className={clsx('str-video', className)}>\n {children}\n </Component>\n );\n};\n","import { ComponentType } from 'react';\nimport clsx from 'clsx';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { BaseVideo } from '../../core/components/Video';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nconst DefaultDisabledVideoPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__disabled-video-preview\">\n {t('Video is disabled')}\n </div>\n );\n};\n\nconst DefaultNoCameraPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__no-camera-preview\">\n {t('No camera found')}\n </div>\n );\n};\n\nexport type VideoPreviewProps = {\n /**\n * Additional CSS class name to apply to the root element.\n */\n className?: string;\n /**\n * Enforces mirroring of the video on the X axis. Defaults to true.\n */\n mirror?: boolean;\n /**\n * Component rendered when user turns off the video.\n */\n DisabledVideoPreview?: ComponentType;\n /**\n * Component rendered when no camera devices are available.\n */\n NoCameraPreview?: ComponentType;\n /**\n * Component rendered above the BaseVideo until the video is ready (meaning until the play event is emitted).\n */\n StartingCameraPreview?: ComponentType;\n};\n\nexport const VideoPreview = ({\n className,\n mirror = true,\n DisabledVideoPreview = DefaultDisabledVideoPreview,\n NoCameraPreview = DefaultNoCameraPreview,\n StartingCameraPreview = LoadingIndicator,\n}: VideoPreviewProps) => {\n const { useCameraState } = useCallStateHooks();\n const { devices, status, isMute, mediaStream } = useCameraState();\n\n let contents;\n if (isMute && devices?.length === 0) {\n contents = <NoCameraPreview />;\n } else if (status === 'enabled') {\n const loading = !mediaStream;\n contents = (\n <>\n {mediaStream && (\n <BaseVideo\n stream={mediaStream}\n className={clsx('str-video__video-preview', {\n 'str-video__video-preview--mirror': mirror,\n 'str-video__video-preview--loading': loading,\n })}\n />\n )}\n {loading && <StartingCameraPreview />}\n </>\n );\n } else {\n contents = <DisabledVideoPreview />;\n }\n\n return (\n <div className={clsx('str-video__video-preview-container', className)}>\n {contents}\n </div>\n );\n};\n","import { createContext, useContext } from 'react';\nimport { ParticipantViewProps } from './ParticipantView';\n\nexport type ParticipantViewContextValue = Required<\n Pick<ParticipantViewProps, 'participant' | 'trackType'>\n> & {\n participantViewElement: HTMLDivElement | null;\n videoElement: HTMLVideoElement | null;\n videoPlaceholderElement: HTMLDivElement | null;\n};\n\nexport const ParticipantViewContext = createContext<\n ParticipantViewContextValue | undefined\n>(undefined);\n\nexport const useParticipantViewContext = () =>\n useContext(ParticipantViewContext) as ParticipantViewContextValue;\n","import { forwardRef } from 'react';\nimport { Placement } from '@floating-ui/react';\nimport { SfuModels } from '@stream-io/video-client';\nimport { useCall, useI18n } from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport {\n Icon,\n IconButton,\n MenuToggle,\n Notification,\n ParticipantActionsContextMenu,\n ToggleMenuButtonProps,\n} from '../../../components';\nimport { Reaction } from '../../../components/Reaction';\nimport { useParticipantViewContext } from './ParticipantViewContext';\n\nexport type DefaultParticipantViewUIProps = {\n /**\n * Turns on/off the status indicator icons (mute, connection quality, etc...).\n */\n indicatorsVisible?: boolean;\n /**\n * Placement of the context menu component when opened\n */\n menuPlacement?: Placement;\n /**\n * Option to show/hide menu button component\n */\n showMenuButton?: boolean;\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n (props, ref) => {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n\nexport const DefaultScreenShareOverlay = () => {\n const call = useCall();\n const { t } = useI18n();\n\n const stopScreenShare = () => {\n call?.screenShare.disable();\n };\n\n return (\n <div className=\"str-video__screen-share-overlay\">\n <Icon icon=\"screen-share-off\" />\n <span className=\"str-video__screen-share-overlay__title\">\n {t('You are presenting your screen')}\n </span>\n <button\n onClick={stopScreenShare}\n className=\"str-video__screen-share-overlay__button\"\n >\n <Icon icon=\"close\" /> {t('Stop Screen Sharing')}\n </button>\n </div>\n );\n};\n\nexport const DefaultParticipantViewUI = ({\n indicatorsVisible = true,\n menuPlacement = 'bottom-end',\n showMenuButton = true,\n}: DefaultParticipantViewUIProps) => {\n const { participant, participantViewElement, trackType, videoElement } =\n useParticipantViewContext();\n const { publishedTracks } = participant;\n\n const hasScreenShare = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE,\n );\n\n if (\n participant.isLocalParticipant &&\n hasScreenShare &&\n trackType === 'screenShareTrack'\n ) {\n return (\n <>\n <DefaultScreenShareOverlay />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n }\n\n return (\n <>\n {showMenuButton && (\n <MenuToggle\n strategy=\"fixed\"\n placement={menuPlacement}\n ToggleButton={ToggleButton}\n >\n <ParticipantActionsContextMenu\n participantViewElement={participantViewElement}\n participant={participant}\n videoElement={videoElement}\n />\n </MenuToggle>\n )}\n <Reaction participant={participant} />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n};\n\nexport const ParticipantDetails = ({\n indicatorsVisible = true,\n}: Pick<DefaultParticipantViewUIProps, 'indicatorsVisible'>) => {\n const { participant } = useParticipantViewContext();\n const {\n isDominantSpeaker,\n isLocalParticipant,\n connectionQuality,\n publishedTracks,\n pin,\n sessionId,\n name,\n userId,\n } = participant;\n const call = useCall();\n\n const { t } = useI18n();\n const connectionQualityAsString =\n !!connectionQuality &&\n SfuModels.ConnectionQuality[connectionQuality].toLowerCase();\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const hasVideo = publishedTracks.includes(SfuModels.TrackType.VIDEO);\n const canUnpin = !!pin && pin.isLocalPin;\n\n return (\n <div className=\"str-video__participant-details\">\n <span className=\"str-video__participant-details__name\">\n {name || userId}\n {indicatorsVisible && isDominantSpeaker && (\n <span\n className=\"str-video__participant-details__name--dominant_speaker\"\n title={t('Dominant speaker')}\n />\n )}\n {indicatorsVisible && (\n <Notification\n isVisible={\n isLocalParticipant &&\n connectionQuality === SfuModels.ConnectionQuality.POOR\n }\n message={t('Poor connection quality')}\n >\n {connectionQualityAsString && (\n <span\n className={clsx(\n 'str-video__participant-details__connection-quality',\n `str-video__participant-details__connection-quality--${connectionQualityAsString}`,\n )}\n title={connectionQualityAsString}\n />\n )}\n </Notification>\n )}\n {indicatorsVisible && !hasAudio && (\n <span className=\"str-video__participant-details__name--audio-muted\" />\n )}\n {indicatorsVisible && !hasVideo && (\n <span className=\"str-video__participant-details__name--video-muted\" />\n )}\n {indicatorsVisible && canUnpin && (\n // TODO: remove this monstrosity once we have a proper design\n <span\n title={t('Unpin')}\n onClick={() => call?.unpin(sessionId)}\n style={{ cursor: 'pointer' }}\n className=\"str-video__participant-details__name--pinned\"\n />\n )}\n </span>\n </div>\n );\n};\n","import {\n ComponentType,\n forwardRef,\n ReactElement,\n useMemo,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {\n SfuModels,\n StreamVideoParticipant,\n VideoTrackType,\n} from '@stream-io/video-client';\n\nimport { Audio } from '../Audio';\nimport { Video, VideoProps } from '../Video';\nimport { useTrackElementVisibility } from '../../hooks';\nimport { DefaultParticipantViewUI } from './DefaultParticipantViewUI';\nimport { applyElementToRef, isComponentType } from '../../../utilities';\nimport { ParticipantViewContext } from './ParticipantViewContext';\n\nexport type ParticipantViewProps = {\n /**\n * The participant whose video/audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * Override the default UI for rendering participant information/actions.\n * pass `null` if you wish to not render anything\n * @default DefaultParticipantViewUI\n */\n ParticipantViewUI?: ComponentType | ReactElement | null;\n\n /**\n * The kind of video stream to play for the given participant.\n * The default value is `videoTrack`.\n * You can use `none` if you're building an audio-only call.\n */\n trackType?: VideoTrackType | 'none';\n\n /**\n * This prop is only useful for advanced use-cases (for example, building your own layout).\n * When set to `true` it will mute the give participant's audio stream on the client side.\n * The local participant is always muted.\n */\n muteAudio?: boolean;\n\n /**\n * An object with set functions meant for exposing the video\n * and video placeholder elements to the integrators.\n * It's useful when you want to attach custom event handlers to these elements.\n * - `refs.setVideoElement`\n * - `refs.setVideoPlaceholderElement`\n */\n refs?: VideoProps['refs'];\n\n /**\n * Custom class applied to the root DOM element.\n */\n className?: string;\n} & Pick<VideoProps, 'VideoPlaceholder'>;\n\nexport const ParticipantView = forwardRef<HTMLDivElement, ParticipantViewProps>(\n (\n {\n participant,\n trackType = 'videoTrack',\n muteAudio,\n refs: { setVideoElement, setVideoPlaceholderElement } = {},\n className,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI as ComponentType,\n },\n ref,\n ) => {\n const {\n isLocalParticipant,\n isSpeaking,\n isDominantSpeaker,\n publishedTracks,\n sessionId,\n } = participant;\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const hasVideo = publishedTracks.includes(SfuModels.TrackType.VIDEO);\n const hasScreenShareAudio = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE_AUDIO,\n );\n\n const [trackedElement, setTrackedElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const [contextVideoElement, setContextVideoElement] =\n useState<HTMLVideoElement | null>(null);\n\n const [contextVideoPlaceholderElement, setContextVideoPlaceholderElement] =\n useState<HTMLDivElement | null>(null);\n\n // TODO: allow to pass custom ViewportTracker instance from props\n useTrackElementVisibility({\n sessionId,\n trackedElement,\n trackType,\n });\n\n const participantViewContextValue = useMemo(\n () => ({\n participant,\n participantViewElement: trackedElement,\n videoElement: contextVideoElement,\n videoPlaceholderElement: contextVideoPlaceholderElement,\n trackType,\n }),\n [\n contextVideoElement,\n contextVideoPlaceholderElement,\n participant,\n trackedElement,\n trackType,\n ],\n );\n\n const videoRefs: VideoProps['refs'] = useMemo(\n () => ({\n setVideoElement: (element) => {\n setVideoElement?.(element);\n setContextVideoElement(element);\n },\n setVideoPlaceholderElement: (element) => {\n setVideoPlaceholderElement?.(element);\n setContextVideoPlaceholderElement(element);\n },\n }),\n [setVideoElement, setVideoPlaceholderElement],\n );\n\n return (\n <div\n data-testid=\"participant-view\"\n ref={(element) => {\n applyElementToRef(ref, element);\n setTrackedElement(element);\n }}\n className={clsx(\n 'str-video__participant-view',\n isDominantSpeaker && 'str-video__participant-view--dominant-speaker',\n isSpeaking && 'str-video__participant-view--speaking',\n !hasVideo && 'str-video__participant-view--no-video',\n !hasAudio && 'str-video__participant-view--no-audio',\n className,\n )}\n >\n <ParticipantViewContext.Provider value={participantViewContextValue}>\n {/* mute the local participant, as we don't want to hear ourselves */}\n {!isLocalParticipant && !muteAudio && (\n <>\n {hasAudio && (\n <Audio participant={participant} trackType=\"audioTrack\" />\n )}\n {hasScreenShareAudio && (\n <Audio\n participant={participant}\n trackType=\"screenShareAudioTrack\"\n />\n )}\n </>\n )}\n <Video\n VideoPlaceholder={VideoPlaceholder}\n participant={participant}\n trackType={trackType}\n refs={videoRefs}\n autoPlay\n />\n {isComponentType(ParticipantViewUI) ? (\n <ParticipantViewUI />\n ) : (\n ParticipantViewUI\n )}\n </ParticipantViewContext.Provider>\n </div>\n );\n },\n);\n","import { StreamCallProvider } from '@stream-io/video-react-bindings';\n\n// re-exporting the StreamCallProvider as StreamCall\nexport const StreamCall = StreamCallProvider;\n","import en from './en.json';\n\nexport const translations = { en };\n","import {\n StreamVideoProvider,\n StreamVideoProps,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport { translations } from '../../../translations';\n\nexport const StreamVideo = (props: PropsWithChildren<StreamVideoProps>) => {\n return (\n <StreamVideoProvider translationsOverrides={translations} {...props} />\n );\n};\n","import { useEffect } from 'react';\nimport {\n Call,\n CallTypes,\n combineComparators,\n Comparator,\n defaultSortPreset,\n paginatedLayoutSortPreset,\n screenSharing,\n speakerLayoutSortPreset,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\n\nexport const usePaginatedLayoutSortPreset = (call: Call | undefined) => {\n useEffect(() => {\n if (!call) return;\n call.setSortParticipantsBy(paginatedLayoutSortPreset);\n return () => {\n resetSortPreset(call);\n };\n }, [call]);\n};\n\nexport const useSpeakerLayoutSortPreset = (\n call: Call | undefined,\n isOneOnOneCall: boolean,\n) => {\n useEffect(() => {\n if (!call) return;\n // always show the remote participant in the spotlight\n if (isOneOnOneCall) {\n call.setSortParticipantsBy(combineComparators(screenSharing, loggedIn));\n } else {\n call.setSortParticipantsBy(speakerLayoutSortPreset);\n }\n return () => {\n resetSortPreset(call);\n };\n }, [call, isOneOnOneCall]);\n};\n\nconst resetSortPreset = (call: Call) => {\n // reset the sorting to the default for the call type\n const callConfig = CallTypes.get(call.type);\n call.setSortParticipantsBy(\n callConfig.options.sortParticipantsBy || defaultSortPreset,\n );\n};\n\nconst loggedIn: Comparator<StreamVideoParticipant> = (a, b) => {\n if (a.isLocalParticipant) return 1;\n if (b.isLocalParticipant) return -1;\n return 0;\n};\n","import clsx from 'clsx';\nimport { useCallback, useEffect, useState } from 'react';\nimport {\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { SfuModels, StreamVideoParticipant } from '@stream-io/video-client';\nimport { ParticipantView, useParticipantViewContext } from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport { usePaginatedLayoutSortPreset } from './hooks';\n\n/**\n * The props for the {@link LivestreamLayout} component.\n */\nexport type LivestreamLayoutProps = {\n /**\n * Whether the livestream is muted. Defaults to `false`.\n */\n muted?: boolean;\n\n /**\n * Whether to show the participant count. Defaults to `true`.\n */\n showParticipantCount?: boolean;\n\n /**\n * Whether to enable fullscreen mode. Defaults to `true`.\n */\n enableFullScreen?: boolean;\n\n /**\n * Whether to show the duration of the call. Defaults to `true`.\n */\n showDuration?: boolean;\n\n /**\n * Whether to show the live badge. Defaults to `true`.\n */\n showLiveBadge?: boolean;\n\n /**\n * Whether to show the speaker name. Defaults to `false`.\n */\n showSpeakerName?: boolean;\n\n /**\n * The props to pass to the floating participant element.\n */\n floatingParticipantProps?: LivestreamLayoutProps & {\n /**\n * The position of the floating participant element. Defaults to `top-right`.\n */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n };\n};\n\nexport const LivestreamLayout = (props: LivestreamLayoutProps) => {\n const { useParticipants, useRemoteParticipants, useHasOngoingScreenShare } =\n useCallStateHooks();\n const call = useCall();\n const [currentSpeaker, ...otherParticipants] = useParticipants();\n const remoteParticipants = useRemoteParticipants();\n const hasOngoingScreenShare = useHasOngoingScreenShare();\n const presenter = hasOngoingScreenShare\n ? hasScreenShare(currentSpeaker) && currentSpeaker\n : otherParticipants.find(hasScreenShare);\n\n usePaginatedLayoutSortPreset(call);\n\n const Overlay = (\n <ParticipantOverlay\n showParticipantCount={props.showParticipantCount}\n showDuration={props.showDuration}\n showLiveBadge={props.showLiveBadge}\n showSpeakerName={props.showSpeakerName}\n />\n );\n\n const { floatingParticipantProps } = props;\n const FloatingParticipantOverlay = hasOngoingScreenShare && (\n <ParticipantOverlay\n // these elements aren't needed for the video feed\n showParticipantCount={\n floatingParticipantProps?.showParticipantCount ?? false\n }\n showDuration={floatingParticipantProps?.showDuration ?? false}\n showLiveBadge={floatingParticipantProps?.showLiveBadge ?? false}\n showSpeakerName={floatingParticipantProps?.showSpeakerName ?? true}\n />\n );\n\n return (\n <div className=\"str-video__livestream-layout__wrapper\">\n <ParticipantsAudio participants={remoteParticipants} />\n {hasOngoingScreenShare && presenter && (\n <ParticipantView\n className=\"str-video__livestream-layout__screen-share\"\n participant={presenter}\n ParticipantViewUI={Overlay}\n trackType=\"screenShareTrack\"\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n {currentSpeaker && (\n <ParticipantView\n className={clsx(\n hasOngoingScreenShare &&\n clsx(\n 'str-video__livestream-layout__floating-participant',\n `str-video__livestream-layout__floating-participant--${\n floatingParticipantProps?.position ?? 'top-right'\n }`,\n ),\n )}\n participant={currentSpeaker}\n ParticipantViewUI={FloatingParticipantOverlay || Overlay}\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n </div>\n );\n};\n\nconst hasScreenShare = (p?: StreamVideoParticipant) =>\n !!p?.publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE);\n\nconst ParticipantOverlay = (props: {\n enableFullScreen?: boolean;\n showParticipantCount?: boolean;\n showDuration?: boolean;\n showLiveBadge?: boolean;\n showSpeakerName?: boolean;\n}) => {\n const {\n enableFullScreen = true,\n showParticipantCount = true,\n showDuration = true,\n showLiveBadge = true,\n showSpeakerName = false,\n } = props;\n const { participant } = useParticipantViewContext();\n const { useParticipantCount } = useCallStateHooks();\n const participantCount = useParticipantCount();\n const duration = useUpdateCallDuration();\n const toggleFullScreen = useToggleFullScreen();\n const { t } = useI18n();\n return (\n <div className=\"str-video__livestream-layout__overlay\">\n <div className=\"str-video__livestream-layout__overlay__bar\">\n {showLiveBadge && (\n <span className=\"str-video__livestream-layout__live-badge\">\n {t('Live')}\n </span>\n )}\n {showParticipantCount && (\n <span className=\"str-video__livestream-layout__viewers-count\">\n {participantCount}\n </span>\n )}\n {showSpeakerName && (\n <span\n className=\"str-video__livestream-layout__speaker-name\"\n title={participant.name || participant.userId || ''}\n >\n {participant.name || participant.userId || ''}\n </span>\n )}\n {showDuration && (\n <span className=\"str-video__livestream-layout__duration\">\n {formatDuration(duration)}\n </span>\n )}\n {enableFullScreen && (\n <span\n className=\"str-video__livestream-layout__go-fullscreen\"\n onClick={toggleFullScreen}\n />\n )}\n </div>\n </div>\n );\n};\n\nconst useUpdateCallDuration = () => {\n const { useIsCallLive, useCallSession } = useCallStateHooks();\n const isCallLive = useIsCallLive();\n const session = useCallSession();\n const [duration, setDuration] = useState(() => {\n if (!session || !session.live_started_at) return 0;\n const liveStartTime = new Date(session.live_started_at);\n const now = new Date();\n return Math.floor((now.getTime() - liveStartTime.getTime()) / 1000);\n });\n\n useEffect(() => {\n if (!isCallLive) return;\n const interval = setInterval(() => {\n setDuration((d) => d + 1);\n }, 1000);\n return () => {\n clearInterval(interval);\n };\n }, [isCallLive]);\n\n return duration;\n};\n\nconst useToggleFullScreen = () => {\n const { participantViewElement } = useParticipantViewContext();\n const [isFullscreen, setIsFullscreen] = useState(false);\n return useCallback(() => {\n if (isFullscreen) {\n document.exitFullscreen().then(() => {\n setIsFullscreen(false);\n });\n } else {\n participantViewElement?.requestFullscreen().then(() => {\n setIsFullscreen(true);\n });\n }\n }, [isFullscreen, participantViewElement]);\n};\n\nconst formatDuration = (durationInMs: number) => {\n const days = Math.floor(durationInMs / 86400);\n const hours = Math.floor(durationInMs / 3600);\n const minutes = Math.floor((durationInMs % 3600) / 60);\n const seconds = durationInMs % 60;\n\n return `${days ? days + ' ' : ''}${hours ? hours + ':' : ''}${\n minutes < 10 ? '0' : ''\n }${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport clsx from 'clsx';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport { IconButton } from '../../../components';\nimport { chunk } from '../../../utilities';\nimport { usePaginatedLayoutSortPreset } from './hooks';\n\nconst GROUP_SIZE = 16;\n\ntype PaginatedGridLayoutGroupProps = {\n /**\n * The group of participants to render.\n */\n group: Array<StreamVideoParticipant>;\n} & Pick<ParticipantViewProps, 'VideoPlaceholder'> &\n Required<Pick<ParticipantViewProps, 'ParticipantViewUI'>>;\n\nconst PaginatedGridLayoutGroup = ({\n group,\n VideoPlaceholder,\n ParticipantViewUI,\n}: PaginatedGridLayoutGroupProps) => {\n return (\n <div\n className={clsx('str-video__paginated-grid-layout__group', {\n 'str-video__paginated-grid-layout--one': group.length === 1,\n 'str-video__paginated-grid-layout--two-four':\n group.length >= 2 && group.length <= 4,\n 'str-video__paginated-grid-layout--five-nine':\n group.length >= 5 && group.length <= 9,\n })}\n >\n {group.map((participant) => (\n <ParticipantView\n key={participant.sessionId}\n participant={participant}\n muteAudio\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n </div>\n );\n};\n\nexport type PaginatedGridLayoutProps = {\n /**\n * The number of participants to display per page.\n */\n groupSize?: number;\n\n /**\n * Whether to exclude the local participant from the grid.\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Turns on/off the pagination arrows.\n */\n pageArrowsVisible?: boolean;\n} & Pick<ParticipantViewProps, 'ParticipantViewUI' | 'VideoPlaceholder'>;\n\nexport const PaginatedGridLayout = ({\n groupSize = GROUP_SIZE,\n excludeLocalParticipant = false,\n pageArrowsVisible = true,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI,\n}: PaginatedGridLayoutProps) => {\n const [page, setPage] = useState(0);\n const [\n paginatedGridLayoutWrapperElement,\n setPaginatedGridLayoutWrapperElement,\n ] = useState<HTMLDivElement | null>(null);\n\n const call = useCall();\n const { useParticipants, useRemoteParticipants } = useCallStateHooks();\n const participants = useParticipants();\n // used to render audio elements\n const remoteParticipants = useRemoteParticipants();\n\n usePaginatedLayoutSortPreset(call);\n\n useEffect(() => {\n if (!paginatedGridLayoutWrapperElement || !call) return;\n\n const cleanup = call.setViewport(paginatedGridLayoutWrapperElement);\n\n return () => cleanup();\n }, [paginatedGridLayoutWrapperElement, call]);\n\n // only used to render video elements\n const participantGroups = useMemo(\n () =>\n chunk(\n excludeLocalParticipant ? remoteParticipants : participants,\n groupSize,\n ),\n [excludeLocalParticipant, remoteParticipants, participants, groupSize],\n );\n\n const pageCount = participantGroups.length;\n\n // update page when page count is reduced and selected page no longer exists\n useEffect(() => {\n if (page > pageCount - 1) {\n setPage(Math.max(0, pageCount - 1));\n }\n }, [page, pageCount]);\n\n const selectedGroup = participantGroups[page];\n\n if (!call) return null;\n\n return (\n <div\n className=\"str-video__paginated-grid-layout__wrapper\"\n ref={setPaginatedGridLayoutWrapperElement}\n >\n <ParticipantsAudio participants={remoteParticipants} />\n <div className=\"str-video__paginated-grid-layout\">\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n icon=\"caret-left\"\n disabled={page === 0}\n onClick={() =>\n setPage((currentPage) => Math.max(0, currentPage - 1))\n }\n />\n )}\n {selectedGroup && (\n <PaginatedGridLayoutGroup\n group={participantGroups[page]}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n )}\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n disabled={page === pageCount - 1}\n icon=\"caret-right\"\n onClick={() =>\n setPage((currentPage) => Math.min(pageCount - 1, currentPage + 1))\n }\n />\n )}\n </div>\n </div>\n );\n};\n","import { useEffect, useState } from 'react';\n\nexport const useCalculateHardLimit = (\n /**\n * Element that stretches to 100% of the whole layout component\n */\n wrapperElement: HTMLDivElement | null,\n /**\n * Element that directly hosts individual `ParticipantView` (or wrapper) elements\n */\n hostElement: HTMLDivElement | null,\n limit?: 'dynamic' | number,\n) => {\n const [calculatedLimit, setCalculatedLimit] = useState<{\n vertical: number | null;\n horizontal: number | null;\n }>({\n vertical: typeof limit === 'number' ? limit : null,\n horizontal: typeof limit === 'number' ? limit : null,\n });\n\n useEffect(() => {\n if (\n !hostElement ||\n !wrapperElement ||\n typeof limit === 'number' ||\n typeof limit === 'undefined'\n )\n return;\n\n let childWidth: number | null = null;\n let childHeight: number | null = null;\n\n const resizeObserver = new ResizeObserver((entries, observer) => {\n // this part should ideally run as little times as possible\n // get child measurements and disconnect\n // does not consider dynamically sized children\n // this hook is for SpeakerLayout use only, where children in the bar are fixed size\n if (entries.length > 1) {\n const child = hostElement.firstChild as HTMLElement | null;\n\n if (child) {\n childHeight = child.clientHeight;\n childWidth = child.clientWidth;\n observer.unobserve(hostElement);\n }\n }\n\n // keep the state at { vertical: 1, horizontal: 1 }\n // until we get the proper child measurements\n if (childHeight === null || childWidth === null) return;\n\n const vertical = Math.floor(wrapperElement.clientHeight / childHeight);\n const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);\n\n setCalculatedLimit((pv) => {\n if (pv.vertical !== vertical || pv.horizontal !== horizontal)\n return { vertical, horizontal };\n return pv;\n });\n });\n\n resizeObserver.observe(wrapperElement);\n resizeObserver.observe(hostElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [hostElement, limit, wrapperElement]);\n\n return calculatedLimit;\n};\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { SfuModels, StreamVideoParticipant } from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { IconButton } from '../../../components';\nimport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n} from '../../../hooks';\nimport { useSpeakerLayoutSortPreset } from './hooks';\nimport { useCalculateHardLimit } from '../../hooks/useCalculateHardLimit';\nimport { ParticipantsAudio } from '../Audio';\n\nexport type SpeakerLayoutProps = {\n ParticipantViewUISpotlight?: ParticipantViewProps['ParticipantViewUI'];\n ParticipantViewUIBar?: ParticipantViewProps['ParticipantViewUI'];\n /**\n * The position of the participants who are not in focus.\n * Providing `null` will hide the bar.\n */\n participantsBarPosition?: 'top' | 'bottom' | 'left' | 'right' | null;\n /**\n * Hard limits the number of the participants rendered in the participants bar.\n * Providing string `dynamic` will calculate hard limit based on screen width/height.\n */\n participantsBarLimit?: 'dynamic' | number;\n} & Pick<ParticipantViewProps, 'VideoPlaceholder'>;\n\nconst DefaultParticipantViewUIBar = () => (\n <DefaultParticipantViewUI menuPlacement=\"top-end\" />\n);\n\nconst DefaultParticipantViewUISpotlight = () => <DefaultParticipantViewUI />;\n\nexport const SpeakerLayout = ({\n ParticipantViewUIBar = DefaultParticipantViewUIBar,\n ParticipantViewUISpotlight = DefaultParticipantViewUISpotlight,\n VideoPlaceholder,\n participantsBarPosition = 'bottom',\n participantsBarLimit,\n}: SpeakerLayoutProps) => {\n const call = useCall();\n const { useParticipants, useRemoteParticipants } = useCallStateHooks();\n const [participantInSpotlight, ...otherParticipants] = useParticipants();\n const remoteParticipants = useRemoteParticipants();\n const [participantsBarWrapperElement, setParticipantsBarWrapperElement] =\n useState<HTMLDivElement | null>(null);\n const [participantsBarElement, setParticipantsBarElement] =\n useState<HTMLDivElement | null>(null);\n const [buttonsWrapperElement, setButtonsWrapperElement] =\n useState<HTMLDivElement | null>(null);\n\n const isSpeakerScreenSharing = hasScreenShare(participantInSpotlight);\n const hardLimit = useCalculateHardLimit(\n buttonsWrapperElement,\n participantsBarElement,\n participantsBarLimit,\n );\n\n const isVertical =\n participantsBarPosition === 'left' || participantsBarPosition === 'right';\n const isHorizontal =\n participantsBarPosition === 'top' || participantsBarPosition === 'bottom';\n\n useEffect(() => {\n if (!participantsBarWrapperElement || !call) return;\n\n const cleanup = call.setViewport(participantsBarWrapperElement);\n\n return () => cleanup();\n }, [participantsBarWrapperElement, call]);\n\n const isOneOnOneCall = otherParticipants.length === 1;\n useSpeakerLayoutSortPreset(call, isOneOnOneCall);\n\n let participantsWithAppliedLimit = otherParticipants;\n\n const hardLimitToApply = isVertical\n ? hardLimit.vertical\n : hardLimit.horizontal;\n\n if (\n typeof participantsBarLimit !== 'undefined' &&\n hardLimitToApply !== null\n ) {\n participantsWithAppliedLimit = otherParticipants.slice(\n 0,\n // subtract 1 if speaker is sharing screen as\n // that one is rendered independently from otherParticipants array\n hardLimitToApply - (isSpeakerScreenSharing ? 1 : 0),\n );\n }\n\n if (!call) return null;\n\n return (\n <div className=\"str-video__speaker-layout__wrapper\">\n <ParticipantsAudio participants={remoteParticipants} />\n <div\n className={clsx(\n 'str-video__speaker-layout',\n participantsBarPosition &&\n `str-video__speaker-layout--variant-${participantsBarPosition}`,\n )}\n >\n <div className=\"str-video__speaker-layout__spotlight\">\n {participantInSpotlight && (\n <ParticipantView\n participant={participantInSpotlight}\n muteAudio={true}\n trackType={\n isSpeakerScreenSharing ? 'screenShareTrack' : 'videoTrack'\n }\n ParticipantViewUI={ParticipantViewUISpotlight}\n VideoPlaceholder={VideoPlaceholder}\n />\n )}\n </div>\n {participantsWithAppliedLimit.length > 0 && participantsBarPosition && (\n <div\n ref={setButtonsWrapperElement}\n className=\"str-video__speaker-layout__participants-bar-buttons-wrapper\"\n >\n <div\n className=\"str-video__speaker-layout__participants-bar-wrapper\"\n ref={setParticipantsBarWrapperElement}\n >\n <div\n ref={setParticipantsBarElement}\n className=\"str-video__speaker-layout__participants-bar\"\n >\n {isSpeakerScreenSharing && (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participantInSpotlight.sessionId}\n >\n <ParticipantView\n participant={participantInSpotlight}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n muteAudio={true}\n />\n </div>\n )}\n {participantsWithAppliedLimit.map((participant) => (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participant.sessionId}\n >\n <ParticipantView\n participant={participant}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n muteAudio={true}\n />\n </div>\n ))}\n </div>\n </div>\n {isVertical && (\n <VerticalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n {isHorizontal && (\n <HorizontalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\ntype ScrollButtonsProps<T extends HTMLElement> = {\n scrollWrapper: T | null;\n};\n\nconst HorizontalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useHorizontalScrollPosition(scrollWrapper);\n\n const scrollStartClickHandler = () => {\n scrollWrapper?.scrollBy({ left: -150, behavior: 'smooth' });\n };\n\n const scrollEndClickHandler = () => {\n scrollWrapper?.scrollBy({ left: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'start' && (\n <IconButton\n onClick={scrollStartClickHandler}\n icon=\"caret-left\"\n className=\"str-video__speaker-layout__participants-bar--button-left\"\n />\n )}\n {scrollPosition && scrollPosition !== 'end' && (\n <IconButton\n onClick={scrollEndClickHandler}\n icon=\"caret-right\"\n className=\"str-video__speaker-layout__participants-bar--button-right\"\n />\n )}\n </>\n );\n};\n\nconst VerticalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useVerticalScrollPosition(scrollWrapper);\n\n const scrollTopClickHandler = () => {\n scrollWrapper?.scrollBy({ top: -150, behavior: 'smooth' });\n };\n\n const scrollBottomClickHandler = () => {\n scrollWrapper?.scrollBy({ top: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'top' && (\n <IconButton\n onClick={scrollTopClickHandler}\n icon=\"caret-up\"\n className=\"str-video__speaker-layout__participants-bar--button-top\"\n />\n )}\n {scrollPosition && scrollPosition !== 'bottom' && (\n <IconButton\n onClick={scrollBottomClickHandler}\n icon=\"caret-down\"\n className=\"str-video__speaker-layout__participants-bar--button-bottom\"\n />\n )}\n </>\n );\n};\n\nconst hasScreenShare = (p?: StreamVideoParticipant) =>\n !!p?.publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE);\n","import { setSdkInfo, SfuModels } from '@stream-io/video-client';\n\nexport * from '@stream-io/video-client';\nexport * from '@stream-io/video-react-bindings';\n\nexport * from './src/core';\n\nexport * from './src/components';\nexport * from './src/translations';\nexport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n useRequestPermission,\n usePersistedDevicePreferences,\n} from './src/hooks';\n\nconst [major, minor, patch] = (\n process.env.PKG_VERSION || '0.0.0-development'\n).split('.');\n\nsetSdkInfo({\n type: SfuModels.SdkType.REACT,\n major,\n minor,\n patch,\n});\n"],"names":["_jsx","_jsxs","Fragment","Video","_Fragment","ToggleMenuButton","ToggleButton","LoadingIndicator","DefaultLoadingIndicator","CallRecordingListHeader","DefaultCallRecordingListHeader","CallRecordingListItem","DefaultCallRecordingListItem","DefaultEmptyCallRecordingList","DefaultLoadingCallRecordingList","hasScreenShare"],"mappings":";;;;;;;;;;AAoBa,MAAA,KAAK,GAAG,CAAC,EACpB,WAAW,EACX,SAAS,GAAG,YAAY,EACxB,GAAG,IAAI,EACI,KAAI;AACf,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL,CAAC;AACF,IAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;IAE1C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;AACnC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC1E,QAAA,OAAO,MAAK;YACV,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;KACH,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;AAE/C,IAAA,QACEA,GACE,CAAA,OAAA,EAAA,EAAA,QAAQ,EACJ,IAAA,EAAA,GAAA,IAAI,EACR,GAAG,EAAE,eAAe,EAAA,cAAA,EACN,MAAM,EACH,iBAAA,EAAA,SAAS,qBACT,SAAS,EAAA,CAC1B,EACF;AACJ;;ACjCa,MAAA,iBAAiB,GAAG,CAAC,KAA6B,KAAI;AACjE,IAAA,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC3C,QACEA,0BACG,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,KAAI;YAChC,IAAI,WAAW,CAAC,kBAAkB;AAAE,gBAAA,OAAO,IAAI,CAAC;YAChD,MAAM,EACJ,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,SAAS,GACV,GAAG,WAAW,CAAC;AAEhB,YAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,iBAAiB,GAAG,QAAQ,IAAI,WAAW,KAC/CA,IAAC,KAAK,EAAA,EAAA,GACA,UAAU,EACd,SAAS,EAAC,YAAY,EACtB,WAAW,EAAE,WAAW,EACxB,CAAA,CACH,CAAC;AAEF,YAAA,MAAM,mBAAmB,GAAG,eAAe,CAAC,QAAQ,CAClD,SAAS,CAAC,SAAS,CAAC,kBAAkB,CACvC,CAAC;YACF,MAAM,4BAA4B,GAAG,mBAAmB;AACtD,gBAAA,sBAAsB,KACpBA,GAAA,CAAC,KAAK,EAAA,EAAA,GACA,UAAU,EACd,SAAS,EAAC,uBAAuB,EACjC,WAAW,EAAE,WAAW,EAAA,CACxB,CACH,CAAC;YAEJ,QACEC,IAAC,CAAAC,UAAQ,EACN,EAAA,QAAA,EAAA,CAAA,iBAAiB,EACjB,4BAA4B,CAFhB,EAAA,EAAA,SAAS,CAGb,EACX;SACH,CAAC,EACD,CAAA,EACH;AACJ;;ACzDO,MAAM,eAAe,GAAG,CAC7B,kBAA2D,KACjB;IAC1C,OAAO,kBAAkB,KAAK,IAAI;AAChC,UAAE,KAAK;AACP,UAAE,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAC1C,CAAC;;ACRM,MAAM,KAAK,GAAG,CAAsB,KAAQ,EAAE,IAAY,KAAI;AACnE,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAElD,IAAA,OAAO,KAAK,CAAC,IAAI,CACf,EAAE,MAAM,EAAE,UAAU,EAAE,EACtB,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAAM,CAClE,CAAC;AACJ,CAAC;;ACLM,MAAM,iBAAiB,GAAG,CAC/B,GAAoB,EACpB,OAAU,KACR;AACF,IAAA,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,OAAO,GAAG,KAAK,UAAU;AAAE,QAAA,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;AAEnD,IAAA,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;AACxB,CAAC;;ACFD;;;AAGG;AACU,MAAA,SAAS,GAAG,UAAU,CACjC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,KAAI;IAC3B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL,CAAC;IAEF,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;YAAE,OAAO;AACrC,QAAA,IAAI,MAAM,KAAK,YAAY,CAAC,SAAS;YAAE,OAAO;AAE9C,QAAA,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;QAChC,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE;;YAE/C,UAAU,CAAC,MAAK;AACd,gBAAA,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;gBAChC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AAC9B,oBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;AAC5C,iBAAC,CAAC,CAAC;aACJ,EAAE,CAAC,CAAC,CAAC;AACP,SAAA;AAED,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,KAAK,EAAE,CAAC;AACrB,YAAA,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;AAChC,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAE3B,IAAA,QACEF,GAAA,CAAA,OAAA,EAAA,EACE,QAAQ,EAAA,IAAA,EACR,WAAW,EAAA,IAAA,EAAA,GACP,IAAI,EACR,GAAG,EAAE,CAAC,OAAO,KAAI;AACf,YAAA,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChC,eAAe,CAAC,OAAO,CAAC,CAAC;SAC1B,EAAA,CACD,EACF;AACJ,CAAC;;AC3CI,MAAM,uBAAuB,GAAG,UAAU,CAG/C,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,GAAG,KAAI;AAChC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,CAAC;IACpD,QACEC,cAAK,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,aACjE,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,KAAK;AAC3B,iBAAC,IAAI,IACHD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iDAAiD,EAAA,QAAA,EAC9DA,GAAM,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,IAAI,CAAC,CAAC,CAAC,EAAO,CAAA,EAAA,CAChB,KAENA,GAAM,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAAC,CAAC,mBAAmB,CAAC,EAAA,CAAO,CACpC,CAAC,EACH,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,KAC1BA,aACE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAC,mBAAmB,EACvB,SAAS,EAAC,sCAAsC,EAChD,GAAG,EAAE,WAAW,CAAC,KAAK,EAAA,CACtB,CACH,CAAA,EAAA,CACG,EACN;AACJ,CAAC;;MCmBYG,OAAK,GAAG,CAAC,EACpB,SAAS,EACT,WAAW,EACX,SAAS,EACT,gBAAgB,GAAG,uBAAuB,EAC1C,IAAI,EACJ,GAAG,IAAI,EACI,KAAI;AACf,IAAA,MAAM,EACJ,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,MAAM,GACP,GAAG,WAAW,CAAC;AAEhB,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL,CAAC;;IAEF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnD,IAAA,MAAM,MAAM,GACV,SAAS,KAAK,YAAY;AACxB,UAAE,WAAW;UACX,SAAS,KAAK,kBAAkB;AAClC,cAAE,iBAAiB;cACjB,SAAS,CAAC;IAEhB,eAAe,CAAC,MAAK;QACnB,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,SAAS,KAAK,MAAM;YAAE,OAAO;AAE3D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAE1E,QAAA,OAAO,MAAK;YACV,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;KACH,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY;YAAE,OAAO;QAErC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,eAAe,GAAG,MAAK;AAC3B,YAAA,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAEtC,YAAA,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;AACtD,YAAA,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;AACjC,SAAC,CAAC;;;;AAKF,QAAA,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAEtC,QAAA,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACvD,QAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACxD,QAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAClD,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC1D,YAAA,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC3D,YAAA,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;;YAGrD,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACzB,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAE3B,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;AAEvB,IAAA,MAAM,iBAAiB,GACrB,SAAS,KAAK,YAAY;UACtB,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;UACnD,SAAS,KAAK,kBAAkB;cAChC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC;cAC1D,KAAK,CAAC;AAEZ,IAAA,MAAM,WAAW,GACf,SAAS,KAAK,MAAM;QACpB,uBAAuB,GAAG,SAAS,CAAC,KAAK,eAAe,CAAC,SAAS,CAAC;AAErE,IAAA,MAAM,qBAAqB,GAAG,CAAC,iBAAiB,IAAI,WAAW,CAAC;AAChE,IAAA,MAAM,WAAW,GAAG,kBAAkB,IAAI,SAAS,KAAK,YAAY,CAAC;AACrE,IAAA,MAAM,kBAAkB,GAAG,SAAS,KAAK,kBAAkB,CAAC;AAC5D,IAAA,QACEF,IACG,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CAAA,CAAC,qBAAqB,KACrBJ,GACM,CAAA,OAAA,EAAA,EAAA,GAAA,IAAI,EACR,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE;AAC7C,oBAAA,+BAA+B,EAAE,aAAa;oBAC9C,wBAAwB,EAAE,CAAC,UAAU;AACrC,oBAAA,0BAA0B,EAAE,WAAW;AACvC,oBAAA,gCAAgC,EAAE,kBAAkB;iBACrD,CAAC,EAAA,cAAA,EACY,MAAM,EAAA,iBAAA,EACH,SAAS,EAC1B,GAAG,EAAE,CAAC,OAAO,KAAI;oBACf,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,oBAAA,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC;AACnC,iBAAC,GACD,CACH,EAEA,CAAC,qBAAqB,IAAI,aAAa,KAAK,gBAAgB,KAC3DA,GAAA,CAAC,gBAAgB,EAAA,EACf,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAC/B,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,IAAI,EAAE,0BAA0B,EAAA,CACrC,CACH,CAAA,EAAA,CACA,EACH;AACJ;;ACzKa,MAAA,yBAAyB,GAAG,CAAwB,EAC/D,cAAc,EACd,gBAAgB,EAAE,qBAAqB,EACvC,SAAS,EACT,SAAS,GAMV,KAAI;AACH,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,OAAO,GAAG,qBAAqB,IAAI,IAAI,EAAE,gBAAgB,CAAC;IAChE,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,MAAM;YAAE,OAAO;AACzE,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,sBAAsB,CAC9C,cAAc,EACd,SAAS,EACT,SAAS,CACV,CAAC;AACF,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,EAAE,CAAC;AACd,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5D;;ACjBa,MAAA,MAAM,GAAG,CAAC,EACrB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACK,KAAI;IAChB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE1C,IAAA,QACEC,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,CAAC,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,KAC3BJ,GAAC,CAAA,cAAc,IAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAA,CAAI,CACtE,EACA,QAAQ,IAAI,CAAC,KAAK,KACjBA,GACE,CAAA,KAAA,EAAA,EAAA,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAC,QAAQ,EACZ,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC/C,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,KACR,IAAI,EAAA,CACR,CACH,CAAA,EAAA,CACA,EACH;AACJ,EAAE;AAOK,MAAM,cAAc,GAAG,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,KAAK,GACe,KAAI;AACxB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,sCAAsC,EAAE,SAAS,CAAC,EAClE,KAAK,EAAE,KAAK,YAEZC,IACG,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAAA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACX,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CACV,EAAA,CAAA,EAAA,CACF,EACN;AACJ;;ACjDO,MAAM,mBAAmB,GAAG,CAAC,EAClC,SAAS,EACT,QAAQ,GACwC,KAAI;AACpD,IAAA,MAAM,EACJ,IAAI,EACJ,CAAC,EACD,CAAC,EACD,MAAM,EACN,QAAQ,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GACrC,GAAG,WAAW,CAAC;QACd,SAAS;QACT,QAAQ;AACR,QAAA,UAAU,EAAE;YACV,MAAM,CAAC,EAAE,CAAC;AACV,YAAA,KAAK,EAAE;AACP,YAAA,IAAI,EAAE;AACN,YAAA,IAAI,CAAC;AACH,gBAAA,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAI;oBACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE;wBACrC,SAAS,EAAE,CAAG,EAAA,eAAe,CAAI,EAAA,CAAA;AAClC,qBAAA,CAAC,CAAC;iBACJ;aACF,CAAC;AACH,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEvC,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE3D,QAAA,OAAO,MAAM,OAAO,EAAE,CAAC;KACxB,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAErC,IAAA,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC;;ACrCD;;;;AAIG;AACH,MAAM,2BAA2B,GAAG,CAAC,GAAW,KAAI;AAClD,IAAA,MAAM,EACJ,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,GAChB,GAAG,iBAAiB,EAAE,CAAC;AACxB,IAAA,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;AACjC,IAAA,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;AAChC,IAAA,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;AAClC,IAAA,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1D,YAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;YAClC,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,YAAA,MAAM,WAAW,GAA2B;AAC1C,gBAAA,GAAG,EAAE;AACH,oBAAA,gBAAgB,EAAE,GAAG,CAAC,cAAc,IAAI,aAAa;AACrD,oBAAA,KAAK,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,cAAc;AAC3D,iBAAA;AACD,gBAAA,MAAM,EAAE;AACN,oBAAA,gBAAgB,EAAE,MAAM,CAAC,cAAc,IAAI,aAAa;AACxD,oBAAA,KAAK,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,iBAAiB;AACjE,iBAAA;AACD,gBAAA,OAAO,EAAE;AACP,oBAAA,gBAAgB,EAAE,OAAO,CAAC,cAAc,IAAI,aAAa;AACzD,oBAAA,KAAK,EAAE,KAAK;AACb,iBAAA;aACF,CAAC;AACF,YAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;AAC/D,SAAA;AAAC,QAAA,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;AACxD,SAAA;AACH,KAAC,EAAE;AACD,QAAA,MAAM,CAAC,MAAM;AACb,QAAA,MAAM,CAAC,cAAc;QACrB,GAAG;AACH,QAAA,GAAG,CAAC,MAAM;AACV,QAAA,GAAG,CAAC,cAAc;QAClB,QAAQ;AACR,QAAA,OAAO,CAAC,cAAc;AACvB,KAAA,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;AAIG;AACH,MAAM,yBAAyB,GAAG,CAAC,GAAW,KAAI;AAChD,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAChD,IAAA,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;AAE/B,QAAA,MAAM,KAAK,GAAG,YAAW;AACvB,YAAA,MAAM,OAAO,GAAG,OAAO,OAA8B,KAAI;gBACvD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBACvD,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,oBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;AACjC,iBAAA;AAAM,qBAAA;AACL,oBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;AAChC,iBAAA;AACH,aAAC,CAAC;AAEF,YAAA,MAAM,UAAU,GAAG,OAAO,OAA8B,KAAI;gBAC1D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AAC7B,iBAAA;AAAM,qBAAA;AACL,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AAC5B,iBAAA;AACH,aAAC,CAAC;AAEF,YAAA,MAAM,WAAW,GAAG,CAAC,OAA8B,KAAI;gBACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAChD,aAAC,CAAC;YAEF,IAAI,WAAW,GAAkC,IAAI,CAAC;YACtD,IAAI;AACF,gBAAA,WAAW,GAAG,IAAI,CAAC,KAAK,CACtB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAE,CACR,CAAC;AAC7B,aAAA;AAAC,YAAA,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;AACxD,aAAA;AACD,YAAA,IAAI,WAAW,EAAE;AACf,gBAAA,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAC/B,gBAAA,MAAM,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACrC,gBAAA,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAClC,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;gBAClC,IAAI,KAAK,CAAC,cAAc;AAAE,oBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBACzD,IAAI,KAAK,CAAC,iBAAiB;AAAE,oBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACzD,aAAA;AACH,SAAC,CAAC;AAEF,QAAA,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;AAC1D,SAAC,CAAC,CAAC;KACJ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF;;;;AAIG;MACU,6BAA6B,GAAG,CAC3C,GAAc,GAAA,+BAA+B,KAC3C;IACF,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/B,2BAA2B,CAAC,GAAG,CAAC,CAAC;AACnC;;ACnIA,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;AAGG;AACU,MAAA,yBAAyB,GAAG,CACvC,aAAiC,EACjC,SAAA,GAAoB,gBAAgB,KAClC;IACF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAElD,IAAI,CAAC,CAAC;IAER,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,aAAa,GAAG,MAAK;YACzB,MAAM,OAAO,GAAG,aAAa,CAAC;YAE9B,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;AAEzE,YAAA,IAAI,CAAC,oBAAoB;AAAE,gBAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAE1D,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;AAClD,YAAA,IAAI,UAAU;AAAE,gBAAA,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEhD,MAAM,aAAa,GACjB,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY,CAChE,IAAI,SAAS,CAAC;AAEjB,YAAA,IAAI,aAAa;AAAE,gBAAA,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAEtD,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/B,SAAC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;AACzD,QAAA,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAEtC,QAAA,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACxD,QAAA,OAAO,MAAK;AACV,YAAA,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC3D,cAAc,CAAC,UAAU,EAAE,CAAC;AAC9B,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAE/B,IAAA,OAAO,cAAc,CAAC;AACxB,EAAE;AAEW,MAAA,2BAA2B,GAAG,CACzC,aAAiC,EACjC,SAAA,GAAoB,gBAAgB,KAClC;IACF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAElD,IAAI,CAAC,CAAC;IAER,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,aAAa,GAAG,MAAK;YACzB,MAAM,OAAO,GAAG,aAAa,CAAC;YAE9B,MAAM,sBAAsB,GAAG,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;AAEzE,YAAA,IAAI,CAAC,sBAAsB;AAAE,gBAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAE5D,YAAA,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC;AACrD,YAAA,IAAI,YAAY;AAAE,gBAAA,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEpD,MAAM,UAAU,GACd,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAC/D,IAAI,SAAS,CAAC;AAEjB,YAAA,IAAI,UAAU;AAAE,gBAAA,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEhD,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/B,SAAC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;AACzD,QAAA,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAEtC,QAAA,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACxD,QAAA,OAAO,MAAK;AACV,YAAA,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC3D,cAAc,CAAC,UAAU,EAAE,CAAC;AAC9B,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAE/B,IAAA,OAAO,cAAc,CAAC;AACxB;;AC3FO,MAAM,sBAAsB,GAAG,MAAK;AACzC,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,4BAA4B,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC7D,IAAA,MAAM,yBAAyB,GAAG,4BAA4B,EAAE,CAAC;IACjE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;;IAIpE,SAAS,CAAC,MAAK;;;;AAIb,QAAA,qBAAqB,CAAC,CAAC,UAAU,KAAI;AACnC,YAAA,IAAI,UAAU;AAAE,gBAAA,OAAO,KAAK,CAAC;AAC7B,YAAA,OAAO,UAAU,CAAC;AACpB,SAAC,CAAC,CAAC;AACL,KAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC;AAEhC,IAAA,MAAM,mBAAmB,GAAG,WAAW,CAAC,YAAW;QACjD,IAAI;YACF,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC5B,YAAA,IAAI,yBAAyB,EAAE;AAC7B,gBAAA,MAAM,IAAI,EAAE,aAAa,EAAE,CAAC;AAC7B,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,IAAI,EAAE,cAAc,EAAE,CAAC;AAC9B,aAAA;AACF,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;AAC5C,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAEtC,IAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,CAAC;AAChF,CAAC;;AC/BY,MAAA,oBAAoB,GAAG,CAAC,UAAyB,KAAI;AAChE,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACpD,IAAA,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExE,SAAS,CAAC,MAAK;QACb,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAEnD,QAAA,IAAI,aAAa;AAAE,YAAA,KAAK,EAAE,CAAC;AAC7B,KAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AAEpB,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,YAAW;AAC/C,QAAA,IAAI,aAAa;AAAE,YAAA,OAAO,IAAI,CAAC;AAE/B,QAAA,MAAM,oBAAoB,GACxB,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,oBAAoB,IAAI,CAAC,oBAAoB;AAAE,YAAA,OAAO,KAAK,CAAC;QAEhE,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI;YACF,MAAM,IAAI,EAAE,kBAAkB,CAAC;gBAC7B,WAAW,EAAE,CAAC,UAAU,CAAC;AAC1B,aAAA,CAAC,CAAC;AACJ,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAA,CAAE,CAAC,CAAC;AACvD,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACd,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC;IAE5D,OAAO;QACL,iBAAiB;QACjB,aAAa;QACb,oBAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC;QACvE,oBAAoB;KACrB,CAAC;AACJ;;ACpBa,MAAA,UAAU,GAAG,CAAwB,EAChD,YAAY,EACZ,SAAS,GAAG,WAAW,EACvB,QAAQ,GAAG,UAAU,EACrB,QAAQ,GACW,KAAI;IACvB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAElD,IAAA,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,mBAAmB,CAAC;QACjE,SAAS;QACT,QAAQ;AACT,KAAA,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACb,QAAA,MAAM,WAAW,GAAG,CAAC,KAAiB,KAAI;YACxC,IAAI,CAAC,QAAQ,IAAI,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE;gBAC7D,YAAY,CAAC,IAAI,CAAC,CAAC;AACpB,aAAA;iBAAM,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE;gBAChE,YAAY,CAAC,KAAK,CAAC,CAAC;AACrB,aAAA;AACH,SAAC,CAAC;AAEF,QAAA,MAAM,aAAa,GAAG,CAAC,KAAoB,KAAI;AAC7C,YAAA,IACE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,QAAQ;gBACpC,CAAC,KAAK,CAAC,MAAM;gBACb,CAAC,KAAK,CAAC,OAAO,EACd;gBACA,YAAY,CAAC,KAAK,CAAC,CAAC;AACrB,aAAA;AACH,SAAC,CAAC;AACF,QAAA,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACpE,QAAA,QAAQ,EAAE,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACrD,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,EAAE,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACvE,YAAA,QAAQ,EAAE,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC1D,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7B,IAAA,QACEA,IACG,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CAAA,SAAS,KACRJ,aACE,SAAS,EAAC,2BAA2B,EACrC,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,CAAC,IAAI,CAAC;AACZ,oBAAA,SAAS,EAAE,MAAM;AAClB,iBAAA,EAAA,QAAA,EAEA,QAAQ,EACL,CAAA,CACP,EACDA,GAAC,CAAA,YAAY,IAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAI,CAAA,CAAA,EAAA,CAC7D,EACH;AACJ;;MC9Ea,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAqB,KAAI;AAC7D,IAAA,OAAOA,YAAI,SAAS,EAAC,yBAAyB,EAAE,QAAA,EAAA,QAAQ,GAAM,CAAC;AACjE,EAAE;AAEK,MAAM,qBAAqB,GAAG,CAAC,EACpC,QAAQ,EACR,GAAG,IAAI,EAC+B,KAAI;AAC1C,IAAA,QACEA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAC3CA,GAAY,CAAA,QAAA,EAAA,EAAA,GAAA,IAAI,EAAG,QAAA,EAAA,QAAQ,EAAU,CAAA,EAAA,CAClC,EACL;AACJ;;ACTa,MAAA,IAAI,GAAG,CAAC,EAAE,IAAI,EAAa,MACtCA,GAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAoB,iBAAA,EAAA,IAAI,CAAE,CAAA,CAAC,EACtE,CAAA;;ACES,MAAA,UAAU,GAAG,UAAU,CAClC,CAAC,KAA0B,EAAE,GAAoC,KAAI;AACnE,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACtE,QACEA,gBACE,SAAS,EAAE,IAAI,CAAC,kCAAkC,EAAE,SAAS,EAAE;AAC7D,YAAA,CAAC,CAA6C,0CAAA,EAAA,OAAO,CAAE,CAAA,GAAG,OAAO;AACjE,YAAA,2CAA2C,EAAE,OAAO;AACrD,SAAA,CAAC,EACF,OAAO,EAAE,CAAC,CAAC,KAAI;YACb,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,YAAA,OAAO,GAAG,CAAC,CAAC,CAAC;AACf,SAAC,EACD,GAAG,EAAE,GAAG,EAAA,GACJ,IAAI,EAER,QAAA,EAAAA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,IAAI,EAAI,CAAA,EAAA,CACb,EACT;AACJ,CAAC;;MCdU,eAAe,GAAG,UAAU,CAGvC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,KAAI;AAC5D,IAAA,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,6BAA6B,EAAC,GAAG,EAAE,GAAG,EAAA,QAAA,EAAA,CACnDA,cACE,SAAS,EAAE,IAAI,CAAC,2CAA2C,EAAE;AAC3D,oBAAA,mDAAmD,EAAE,MAAM;iBAC5D,CAAC,EAAA,QAAA,EAAA,CAED,QAAQ,EACR,IAAI,KACHD,GAAA,CAAC,UAAU,EAAA,EAAC,SAAS,EAAE,aAAa,EAAE,YAAY,EAAEK,kBAAgB,EAAA,QAAA,EACjE,eAAe,CAAC,IAAI,CAAC,GAAGL,IAAC,IAAI,EAAA,EAAA,CAAG,GAAG,IAAI,EAC7B,CAAA,CACd,CACG,EAAA,CAAA,EACL,OAAO,KACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAAA,QAAA,EAAE,OAAO,EAAO,CAAA,CACtE,CACG,EAAA,CAAA,EACN;AACJ,CAAC,EAAE;AAEH,MAAMK,kBAAgB,GAAG,UAAU,CACjC,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,KAAI;AACrB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AAExB,IAAA,QACEL,GAAA,CAAC,UAAU,EAAA,EACT,SAAS,EAAE,+BAA+B,EAC1C,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,EAC3C,KAAK,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAC9B,GAAG,EAAE,GAAG,EAAA,CACR,EACF;AACJ,CAAC,CACF;;MCpCY,OAAO,GAAG,CAAwB,EAC7C,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GAAG,KAAK,EACxB,OAAO,GAAG,KAAK,GACC,KAAI;IACpB,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC;AACnD,QAAA,SAAS,EAAE,gBAAgB;AAC3B,QAAA,QAAQ,EAAE,UAAU;AACrB,KAAA,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACtC,KAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;AAE7B,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI,CAAC;AAE1B,IAAA,QACEA,GACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,EACvD,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,KAAK,EAAE;AACL,YAAA,QAAQ,EAAE,QAAQ;YAClB,GAAG,EAAE,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,CAAC,IAAI,CAAC;AACZ,YAAA,SAAS,EAAE,MAAM;SAClB,EAEA,QAAA,EAAA,QAAQ,EACL,CAAA,EACN;AACJ;;AChDO,MAAM,qBAAqB,GAAG,CAAwB,EAC3D,YAAY,EACZ,YAAY,GAAA,GAGV,EAAE,KAAI;IACR,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE5D,IAAA,MAAM,gBAAgB,GAAyB,WAAW,CACxD,CAAC,CAAC,KAAI;QACJ,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACxB,QAAA,YAAY,GAAG,CAAC,CAAC,CAAC;AACpB,KAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;AAEF,IAAA,MAAM,gBAAgB,GAAyB,WAAW,CACxD,CAAC,CAAC,KAAI;QACJ,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC,CAAC;AACpB,KAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;AAEF,IAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;AAChE,CAAC;;ACpBD;AACa,MAAA,WAAW,GAAG,CAAC,EAC1B,KAAK,EACL,gBAAgB,EAChB,gBAAgB,EAChB,GAAG,KAAK,EACO,KAAI;IACnB,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAC1D,qBAAqB,EAAkB,CAAC;IAC1C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,IAAI,CACL,CAAC;AAEF,IAAA,QACEC,IACE,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CAAAJ,GAAA,CAAC,OAAO,EACN,EAAA,gBAAgB,EAAE,aAAa,EAC/B,OAAO,EAAE,cAAc,EACvB,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAAA,QAAA,EAEjC,KAAK,IAAI,EAAE,GACJ,EACVA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,gBAAgB,EAC9B,YAAY,EAAE,gBAAgB,EAAA,GAC1B,KAAK,EACT,CAAA,CAAA,EAAA,CACD,EACH;AACJ;;ACVa,MAAA,qBAAqB,GAAG,UAAU,CAI7C,CACE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,EAC3E,GAAG,KACD;IACF,MAAM,WAAW,GAAyC,WAAW,CACnE,OAAO,KAAK,KAAI;AACd,QAAA,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5B,QAAA,MAAM,KAAK,GAAG,OAAO,SAAS,KAAK,UAAU,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC;QACxE,IAAI;YACF,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5C,YAAA,SAAS,GAAG,KAAK,CAAC,MAA2B,CAAC,CAAC;AAChD,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,OAAO,GAAG,KAAK,CAAC,MAA2B,EAAE,KAAc,CAAC,CAAC;AAC9D,SAAA;KACF,EACD,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CACzC,CAAC;AAEF,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,GAAG,SAAS;AACZ,QAAA,GAAG,EAAE,GAAG;AACR,QAAA,SAAS,EAAE,IAAI,CAAC,qCAAqC,EAAE,SAAS,CAAC;AACjE,QAAA,OAAO,EAAE,WAAW;KACrB,CAAC;AAEF,IAAA,OAAO,MAAM,GAAGA,IAAC,MAAM,EAAA,EAAA,GAAK,KAAK,EAAA,CAAI,GAAGA,GAAY,CAAA,QAAA,EAAA,EAAA,GAAA,KAAK,GAAI,CAAC;AAChE,CAAC,EACD;AAiBW,MAAA,8BAA8B,GAAG,CAAC,EAC7C,cAAc,GAAG,IAAI,EACrB,cAAc,GAAG,gBAAgB,EACjC,gBAAgB,GAAG,qBAAqB,EACxC,cAAc,EACd,cAAc,EACd,GAAG,SAAS,EACwB,KAAI;IACxC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,IAAI,CACL,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,SAAiB,KAAI;QACpB,cAAc,CAAC,SAAS,CAAC,CAAC;QAC1B,UAAU,CAAC,MAAM,cAAc,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;AACvD,KAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,WAAW,CAC3B,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,EACzC,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CACtC,CAAC;AAEF,IAAA,MAAM,OAAO,GAAG,WAAW,CACzB,MAAM,iBAAiB,CAAC,cAAc,CAAC,EACvC,CAAC,cAAc,EAAE,iBAAiB,CAAC,CACpC,CAAC;IAEF,QACEC,4BACED,GAAC,CAAA,OAAO,IACN,gBAAgB,EAAE,IAAI,CACpB,4CAA4C,EAC5C,cAAc,CACf,EACD,gBAAgB,EAAE,cAAc,EAChC,gBAAgB,EAAE,aAAa,EAC/B,OAAO,EAAE,CAAC,CAAC,WAAW,EAAA,QAAA,EAErB,WAAW,EACJ,CAAA,EACVA,IAAC,qBAAqB,EAAA,EAAA,GAChB,SAAS,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,gBAAgB,EAAA,CACrB,CACD,EAAA,CAAA,EACH;AACJ;;AC9HO,MAAM,UAAU,GAAG,CAAC,EACzB,QAAQ,EACR,GAAG,IAAI,EAC6C,KAAI;IACxD,QACEA,GAAY,CAAA,QAAA,EAAA,EAAA,GAAA,IAAI,EAAE,SAAS,EAAC,wBAAwB,EACjD,QAAA,EAAA,QAAQ,EACF,CAAA,EACT;AACJ;;ACDO,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,QAAQ,EACR,OAAO,GACe,KAAI;AAC1B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,WAAW,GAAyC,WAAW,CACnE,OAAO,CAAC,KAAI;AACV,QAAA,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,CAAC,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE;AACf,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,QAAQ,IAAI,CAAC;AACd,SAAA;KACF,EACD,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC1B,CAAC;IACF,QACEA,IAAC,UAAU,EAAA,EACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,aAAa,EAClB,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,WAAW,EACpB,CAAA,EACF;AACJ;;ACrBa,MAAA,YAAY,GAAG,CAAC,KAA2C,KAAI;IAC1E,MAAM,EACJ,SAAS,EACT,OAAO,EACP,QAAQ,EACR,iBAAiB,EACjB,cAAc,EACd,SAAS,GAAG,KAAK,EACjB,aAAa,GAAG,+BAA+B,GAChD,GAAG,KAAK,CAAC;IAEV,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC;QACnD,SAAS;AACT,QAAA,QAAQ,EAAE,UAAU;AACrB,KAAA,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,iBAAiB,IAAI,CAAC,cAAc;YAAE,OAAO;AAEhE,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAK;AAC9B,YAAA,cAAc,EAAE,CAAC;SAClB,EAAE,iBAAiB,CAAC,CAAC;AAEtB,QAAA,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;KACpC,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEnD,QACEC,cAAK,GAAG,EAAE,IAAI,CAAC,YAAY,EACxB,QAAA,EAAA,CAAA,SAAS,KACRA,cACE,SAAS,EAAC,yBAAyB,EACnC,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,CAAC,IAAI,CAAC;AACZ,oBAAA,SAAS,EAAE,MAAM;iBAClB,EAEA,QAAA,EAAA,CAAA,aAAa,IAAID,GAAG,CAAA,GAAA,EAAA,EAAA,SAAS,EAAE,aAAa,EAAA,CAAI,EACjDA,GAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAE,OAAO,EAAQ,CAAA,CAAA,EAAA,CAC/D,CACP,EACA,QAAQ,CACL,EAAA,CAAA,EACN;AACJ;;ACba,MAAA,sBAAsB,GAAG,CAAC,KAAkC,KAAI;AAC3E,IAAA,MAAM,EACJ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAAG,IAAI,EACxB,QAAQ,GACT,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACpD,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,EAErD,CAAC;IACJ,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,aAAa,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;YAC/C,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC/B,YAAA,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;AAClC,SAAA;AAAM,aAAA,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC,OAAO,EAAE;YACtD,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC/B,YAAA,iBAAiB,CAAC,OAAO,GAAG,KAAK,CAAC;AACnC,SAAA;AACH,KAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AAEpB,IAAA,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,mBAAmB,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7E,IAAA,IAAI,kBAAkB,EAAE;AACtB,QAAA,QACEA,GAAC,CAAA,YAAY,IACX,SAAS,EAAE,kBAAkB,IAAI,CAAC,aAAa,EAC/C,OAAO,EAAE,uBAAuB,YAE/B,QAAQ,EAAA,CACI,EACf;AACH,KAAA;AAED,IAAA,QACEA,GAAA,CAAC,YAAY,EAAA,EACX,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAC7B,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc,EAC9B,OAAO,EACL,gBAAgB,KAAK,SAAS,GAAG,eAAe,GAAG,cAAc,EAAA,QAAA,EAGlE,QAAQ,EAAA,CACI,EACf;AACJ;;ACrFa,MAAA,8BAA8B,GAAG,CAAC,EAC7C,QAAQ,EACR,IAAI,GACmD,KAAI;AAC3D,IAAA,MAAM,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACnD,IAAA,MAAM,EAAE,oBAAoB,EAAE,GAAG,kBAAkB,EAAE,CAAC;AACtD,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,iCAAiC,CAAC,CAAC;AAC7D,IAAA,QACEA,GAAA,CAAC,YAAY,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAA,QAAA,EAC5D,QAAQ,EAAA,CACI,EACf;AACJ;;ACba,MAAA,gBAAgB,GAAG,CAAC,EAC/B,SAAS,EACT,IAAI,GAAG,SAAS,EAChB,IAAI,EACJ,OAAO,GACe,KAAI;AAC1B,IAAA,QACEC,IACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,8BAA8B,EAAE,SAAS,CAAC,EAC1D,KAAK,EAAE,OAAO,EAAA,QAAA,EAAA,CAEdD,aAAK,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE,IAAI,CAAC,EAAA,CAAQ,EACvE,IAAI,IAAIA,GAAG,CAAA,GAAA,EAAA,EAAA,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAE,IAAI,EAAK,CAAA,CAAA,EAAA,CAChE,EACN;AACJ;;ACjBa,MAAA,gBAAgB,GAAG,CAAC,EAC/B,OAAO,GAAG,QAAQ,GACI,KAAI;AAC1B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,GAC1E,sBAAsB,EAAE,CAAC;AAE3B,IAAA,QACEA,GAAA,CAAC,UAAU,EAAA,EACT,cAAc,EAAE;AACd,YAAA,aAAa,CAAC,iBAAiB;AAC/B,YAAA,aAAa,CAAC,gBAAgB;SAC/B,EAED,QAAA,EAAAA,GAAA,CAAC,eAAe,EAAC,EAAA,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,YACjE,kBAAkB,IACjBA,IAAC,gBAAgB,EAAA,EACf,OAAO,EACL,yBAAyB;AACvB,sBAAE,CAAC,CAAC,kCAAkC,CAAC;AACvC,sBAAE,CAAC,CAAC,mCAAmC,CAAC,EAAA,CAE5C,KAEFA,GAAA,CAAC,UAAU;;;;AAET,gBAAA,OAAO,EAAE,CAAC,CAAC,IAAI,EACf,QAAQ,EAAE,CAAC,IAAI,EACf,IAAI,EAAE,yBAAyB,GAAG,cAAc,GAAG,eAAe,EAClE,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,EACvB,OAAO,EAAE,mBAAmB,EAAA,CAC5B,CACH,EACe,CAAA,EAAA,CACP,EACb;AACJ;;AC9Ca,MAAA,qBAAqB,GAAG,CAAC,KAErC,KAAI;AACH,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AAChC,QAAA,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;QACpB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACvB,QAAA,OAAO,KAAK,CAAC;AACf,KAAC,CAAC,CAAC;AACH,IAAA,QACEA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACzDA,IAAC,cAAc,EAAA,EACb,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAC3B,IAAI,EAAE;AACJ,gBAAA;AACE,oBAAA,EAAE,EAAE,SAAS;AACb,oBAAA,IAAI,EAAE,IAAI;AACX,iBAAA;aACF,EACD,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAClD,YAAY,QACZ,WAAW,EAAE,KAAK,EAClB,WAAW,EAAA,IAAA,EACX,YAAY,EAAC,GAAG,EAChB,aAAa,EACb,IAAA,EAAA,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EACzB,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC/B,gBAAA,IAAI,EAAE,IAAI;AACX,aAAA,EACD,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE;AACJ,oBAAA,KAAK,EAAE;AACL,wBAAA,IAAI,EAAE;AACJ,4BAAA,IAAI,EAAE,SAAS;AAChB,yBAAA;AACD,wBAAA,IAAI,EAAE;AACJ,4BAAA,MAAM,EAAE,SAAS;AAClB,yBAAA;AACF,qBAAA;AACF,iBAAA;AACD,gBAAA,IAAI,EAAE;AACJ,oBAAA,IAAI,EAAE;AACJ,wBAAA,WAAW,EAAE,GAAG;AACjB,qBAAA;AACF,iBAAA;aACF,EACD,CAAA,EAAA,CACE,EACN;AACJ;;ACjDO,MAAM,SAAS,GAAG,MAAK;IAC5B,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAEhD,MAAK;AACL,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACtE,KAAC,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9D,IAAA,MAAM,aAAa,GAAG,MAAM,EAAmB,CAAC;AAChD,IAAA,MAAM,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACnD,IAAA,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAE7C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,eAAe;YAAE,OAAO;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC1B,YAAA,aAAa,CAAC,OAAO,GAAG,eAAe,CAAC;YACxC,OAAO;AACR,SAAA;AACD,QAAA,MAAM,uBAAuB,GAAG,aAAa,CAAC,OAAO,CAAC;QACtD,iBAAiB,CAAC,MAAK;AACrB,YAAA,OAAO,uBAAuB,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;AAC3E,SAAC,CAAC,CAAC;QACH,mBAAmB,CAAC,MAAK;AACvB,YAAA,OAAO,yBAAyB,CAC9B,uBAAuB,EACvB,eAAe,CAChB,CAAC;AACJ,SAAC,CAAC,CAAC;AAEH,QAAA,gBAAgB,CAAC,CAAC,UAAU,KAAI;YAC9B,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/C,gBAAgB,CAAC,IAAI,CAAC;gBACpB,CAAC,EAAE,eAAe,CAAC,SAAS;AAC5B,gBAAA,CAAC,EAAE,eAAe,CAAC,cAAc,CAAC,wBAAwB;AAC3D,aAAA,CAAC,CAAC;AACH,YAAA,OAAO,gBAAgB,CAAC;AAC1B,SAAC,CAAC,CAAC;AAEH,QAAA,aAAa,CAAC,OAAO,GAAG,eAAe,CAAC;AAC1C,KAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,QACEA,aAAK,SAAS,EAAC,uBAAuB,EACnC,QAAA,EAAA,eAAe,KACdC,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACEJ,uCAAqB,EACrBA,GAAA,CAAC,qBAAqB,EAAC,EAAA,MAAM,EAAE,aAAa,EAAA,CAAI,EAEhDA,GAAyB,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EACzBC,cAAK,SAAS,EAAC,uCAAuC,EACpD,QAAA,EAAA,CAAAD,GAAA,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAE,eAAe,CAAC,UAAU,EAAA,CAAI,EAC9DA,GAAC,CAAA,QAAQ,IACP,KAAK,EAAC,SAAS,EACf,KAAK,EAAE,CAAG,EAAA,eAAe,CAAC,cAAc,CAAC,wBAAwB,CAAM,IAAA,CAAA,EAAA,CACvE,EACFA,GAAC,CAAA,QAAQ,IACP,KAAK,EAAC,gBAAgB,EACtB,KAAK,EAAE,CAAG,EAAA,eAAe,CAAC,eAAe,CAAC,iBAAiB,CAAM,IAAA,CAAA,EAAA,CACjE,EACFA,GAAC,CAAA,QAAQ,IACP,KAAK,EAAC,gBAAgB,EACtB,KAAK,EAAE,CAAG,EAAA,eAAe,CAAC,cAAc,CAAC,iBAAiB,CAAM,IAAA,CAAA,EAAA,CAChE,EACFA,GAAC,CAAA,QAAQ,IACP,KAAK,EAAC,oBAAoB,EAC1B,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,cAAc,CAAC,EAClD,CAAA,EACFA,IAAC,QAAQ,EAAA,EACP,KAAK,EAAC,6BAA6B,EACnC,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC,wBAAwB,EAAA,CAC9D,EACFA,GAAC,CAAA,QAAQ,IACP,KAAK,EAAC,sBAAsB,EAC5B,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,eAAe,CAAC,EACnD,CAAA,EACFA,IAAC,QAAQ,EAAA,EACP,KAAK,EAAC,6BAA6B,EACnC,KAAK,EAAE,eAAe,CAAC,eAAe,CAAC,wBAAwB,EAAA,CAC/D,EACFA,GAAC,CAAA,QAAQ,IAAC,KAAK,EAAC,iBAAiB,EAAC,KAAK,EAAE,cAAc,EAAA,CAAI,EAC3DA,GAAC,CAAA,QAAQ,IAAC,KAAK,EAAC,mBAAmB,EAAC,KAAK,EAAE,gBAAgB,EAAA,CAAI,IAC3D,CACL,EAAA,CAAA,CACJ,EACG,CAAA,EACN;AACJ,EAAE;AAEW,MAAA,QAAQ,GAAG,CAAC,KAAuC,KAAI;AAClE,IAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC/B,QACEC,cAAK,SAAS,EAAC,6BAA6B,EAC1C,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAE,KAAK,EAAO,CAAA,EAChEA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,mCAAmC,YAAE,KAAK,EAAA,CAAO,CAC5D,EAAA,CAAA,EACN;AACJ,EAAE;AAEF,MAAM,WAAW,GAAG,CAAC,KAA4B,KAAI;AACnD,IAAA,MAAM,EACJ,iBAAiB,EAAE,CAAC,EACpB,kBAAkB,EAAE,CAAC,EACrB,sBAAsB,EAAE,GAAG,GAC5B,GAAG,KAAK,CAAC;IACV,IAAI,IAAI,GAAG,CAAA,CAAA,CAAG,CAAC;IACf,IAAI,CAAC,IAAI,CAAC,EAAE;AACV,QAAA,IAAI,GAAG,CAAG,EAAA,CAAC,CAAI,CAAA,EAAA,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,IAAA,CAAM,CAAC;AACvB,SAAA;AACF,KAAA;AACD,IAAA,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,uBAAwC,EACxC,eAAgC,KAC9B;AACF,IAAA,MAAM,EACJ,cAAc,EAAE,EACd,cAAc,EAAE,sBAAsB,EACtC,SAAS,EAAE,iBAAiB,GAC7B,GACF,GAAG,uBAAuB,CAAC;IAE5B,MAAM,EACJ,cAAc,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,GAC9C,GAAG,eAAe,CAAC;AAEpB,IAAA,MAAM,SAAS,GAAG,cAAc,GAAG,sBAAsB,CAAC;AAC1D,IAAA,MAAM,WAAW,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAClD,IAAA,OAAO,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAChC,uBAAwC,EACxC,eAAgC,KAC9B;AACF,IAAA,MAAM,EACJ,eAAe,EAAE,EACf,kBAAkB,EAAE,0BAA0B,EAC9C,SAAS,EAAE,iBAAiB,GAC7B,GACF,GAAG,uBAAuB,CAAC;IAE5B,MAAM,EACJ,eAAe,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,GACnD,GAAG,eAAe,CAAC;AAEpB,IAAA,MAAM,aAAa,GAAG,kBAAkB,GAAG,0BAA0B,CAAC;AACtE,IAAA,MAAM,WAAW,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAClD,IAAA,OAAO,GAAG,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAClE,CAAC;;AC5JY,MAAA,eAAe,GAAG,OAC7BA,GAAC,CAAA,UAAU,EAAC,EAAA,SAAS,EAAC,SAAS,EAAC,YAAY,EAAEK,kBAAgB,EAAA,QAAA,EAC5DL,IAAC,SAAS,EAAA,EAAA,CAAG,EACF,CAAA,EACb;AAEF,MAAMK,kBAAgB,GAAG,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,MACnBL,GAAA,CAAC,eAAe,EAAC,EAAA,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAC5D,QAAA,EAAAA,GAAA,CAAC,UAAU,EAAC,EAAA,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,YAAY,GAAG,EAC9B,CAAA,CACnB,CAAC;;ACLW,MAAA,iBAAiB,GAAG,CAAC,KAA6B,KAAI;AACjE,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,cAAc,CAAC,EAAE,GAAG,KAAK,CAAC;IAE9C,MAAM,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC9E,IAAA,MAAM,sBAAsB,GAAG,wBAAwB,EAAE,CAAC;AAC1D,IAAA,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,GAC9D,oBAAoB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAElD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACxE,MAAM,wBAAwB,GAAG,gBAAgB;AAC/C,UAAE,sBAAsB;UACtB,KAAK,CAAC;AACV,IAAA,QACEA,GAAC,CAAA,UAAU,IAAC,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,YACrDA,GAAC,CAAA,sBAAsB,IACrB,UAAU,EAAE,aAAa,CAAC,WAAW,EACrC,kBAAkB,EAAE,oBAAoB,EACxC,eAAe,EAAE,CAAC,CAAC,gCAAgC,CAAC,EACpD,uBAAuB,EAAE,CAAC,CAAC,2CAA2C,CAAC,EACvE,cAAc,EAAE,CAAC,CAAC,sCAAsC,CAAC,YAEzDA,GAAC,CAAA,eAAe,IAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAA,QAAA,EAC/DA,IAAC,UAAU,EAAA,EACT,IAAI,EACF,sBAAsB,GAAG,iBAAiB,GAAG,kBAAkB,EAEjE,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,EACxB,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,YAAW;wBAClB,IAAI,CAAC,aAAa,EAAE;4BAClB,MAAM,iBAAiB,EAAE,CAAC;AAC3B,yBAAA;AAAM,6BAAA;AACL,4BAAA,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;AAC5B,yBAAA;AACH,qBAAC,EACD,CAAA,EAAA,CACc,EACK,CAAA,EAAA,CACd,EACb;AACJ;;ACzCA,MAAM,oBAAoB,GAAG,CAAC,EAC5B,QAAQ,EACR,EAAE,EACF,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,KAAK,GACqB,KAAI;AAC9B,IAAA,QACEC,IACE,CAAA,OAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE;AACpD,YAAA,8CAA8C,EAAE,QAAQ;AACxD,YAAA,8CAA8C,EAAE,QAAQ;AACzD,SAAA,CAAC,EACF,OAAO,EAAE,EAAE,EAEX,QAAA,EAAA,CAAAD,GAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,QAAQ,EACjB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAAA,CAClB,EACD,KAAK,CAAA,EAAA,CACA,EACR;AACJ,CAAC,CAAC;AACW,MAAA,cAAc,GAAG,CAAC,KAK9B,KAAI;AACH,IAAA,MAAM,EACJ,OAAO,GAAG,EAAE,EACZ,gBAAgB,EAAE,uBAAuB,EACzC,KAAK,EACL,QAAQ,GACT,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;;;;IAK7D,IAAI,gBAAgB,GAAG,uBAAuB,CAAC;AAC/C,IAAA,IACE,OAAO,CAAC,MAAM,GAAG,CAAC;AAClB,QAAA,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,gBAAgB,CAAC,EACrD;AACA,QAAA,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxC,KAAA;IAED,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,yCAAyC,EACtD,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAC/D,KAAK,EAAA,CACF,EACL,CAAC,OAAO,CAAC,MAAM,IACdA,GAAC,CAAA,oBAAoB,EACnB,EAAA,EAAE,EAAE,CAAA,EAAG,cAAc,CAAW,SAAA,CAAA,EAChC,KAAK,EAAC,SAAS,EACf,IAAI,EAAE,cAAc,EACpB,cAAc,EAAA,IAAA,EACd,KAAK,EAAC,SAAS,EAAA,CACf,KAEF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AACrB,gBAAA,QACEA,GAAA,CAAC,oBAAoB,EAAA,EACnB,EAAE,EAAE,CAAG,EAAA,cAAc,CAAK,EAAA,EAAA,MAAM,CAAC,QAAQ,EAAE,EAC3C,KAAK,EAAE,MAAM,CAAC,QAAQ,EACtB,KAAK,EAAE,MAAM,CAAC,KAAK,EAEnB,QAAQ,EAAE,CAAC,CAAC,KAAI;wBACd,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;qBAC5B,EACD,IAAI,EAAE,cAAc,EACpB,QAAQ,EACN,MAAM,CAAC,QAAQ,KAAK,gBAAgB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAA,EANzD,MAAM,CAAC,QAAQ,CAQpB,EACF;AACJ,aAAC,CAAC,CACH,CACG,EAAA,CAAA,EACN;AACJ;;MClGa,wBAAwB,GAAG,CAAC,EACvC,KAAK,GACyB,KAAI;AAClC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACnD,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAErE,QACEA,IAAC,cAAc,EAAA,EACb,OAAO,EAAE,OAAO,IAAI,EAAE,EACtB,gBAAgB,EAAE,cAAc,EAChC,QAAQ,EAAE,OAAO,QAAQ,KAAI;AAC3B,YAAA,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACnC,EACD,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,cAAc,CAAC,EACjC,CAAA,EACF;AACJ,EAAE;MAMW,yBAAyB,GAAG,CAAC,EACxC,KAAK,GAC0B,KAAI;AACnC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAChD,IAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,GACpE,eAAe,EAAE,CAAC;AAEpB,IAAA,IAAI,CAAC,0BAA0B;AAAE,QAAA,OAAO,IAAI,CAAC;AAE7C,IAAA,QACEA,GAAC,CAAA,cAAc,EACb,EAAA,OAAO,EAAE,OAAO,EAChB,gBAAgB,EAAE,cAAc,EAChC,QAAQ,EAAE,CAAC,QAAQ,KAAI;AACrB,YAAA,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC1B,EACD,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,iBAAiB,CAAC,EACpC,CAAA,EACF;AACJ;;MC3Ca,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAA4B,KAAI;AACzE,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE7D,QACEA,IAAC,cAAc,EAAA,EACb,OAAO,EAAE,OAAO,IAAI,EAAE,EACtB,gBAAgB,EAAE,cAAc,EAChC,QAAQ,EAAE,OAAO,QAAQ,KAAI;AAC3B,YAAA,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC/B,EACD,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,iBAAiB,CAAC,EACpC,CAAA,EACF;AACJ;;ACXO,MAAM,cAAc,GAAG,MAAK;AACjC,IAAA,QACEA,GAAC,CAAA,UAAU,EAAC,EAAA,SAAS,EAAC,YAAY,EAAC,YAAY,EAAE,gBAAgB,EAC/D,QAAA,EAAAA,GAAA,CAAC,IAAI,EAAG,EAAA,CAAA,EAAA,CACG,EACb;AACJ,EAAE;AAEF,MAAM,IAAI,GAAG,OACXC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,4BAA4B,EACzC,QAAA,EAAA,CAAAD,GAAA,CAAC,mBAAmB,EAAG,EAAA,CAAA,EACvBA,GAAC,CAAA,wBAAwB,EAAG,EAAA,CAAA,EAC5BA,IAAC,yBAAyB,EAAA,EAAA,CAAG,CACzB,EAAA,CAAA,CACP,CAAC;AAEF,MAAM,gBAAgB,GAAG,UAAU,CACjC,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,KAAI;AACrB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,QACEA,IAAC,UAAU,EAAA,EACT,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE;AACpD,YAAA,4CAA4C,EAAE,SAAS;AACxD,SAAA,CAAC,EACF,KAAK,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAC9B,IAAI,EAAC,iBAAiB,EACtB,GAAG,EAAE,GAAG,EAAA,CAER,EACF;AACJ,CAAC,CACF;;AC1BY,MAAA,wBAAwB,GAAG,CACtC,KAAoC,KAClC;AACF,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,wBAAwB,EAAE,GAAG,KAAK,CAAC;AAEtE,IAAA,MAAM,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACnD,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAEpD,QACEA,IAAC,eAAe,EAAA,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,EACvE,QAAA,EAAAA,GAAA,CAAC,UAAU,EAAA,EACT,IAAI,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,UAAU,CAAC,MAAM,EAAE,EAAA,CAClC,EACc,CAAA,EAClB;AACJ,EAAE;AAOW,MAAA,2BAA2B,GAAG,CACzC,KAAuC,KACrC;AACF,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,wBAAwB,EAAE,GAAG,KAAK,CAAC;AAEtE,IAAA,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,GAC9D,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AAEjD,IAAA,MAAM,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACnD,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;AAEpD,IAAA,QACEA,GAAC,CAAA,UAAU,EAAC,EAAA,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EACpD,QAAA,EAAAA,GAAA,CAAC,sBAAsB,EACrB,EAAA,UAAU,EAAE,aAAa,CAAC,UAAU,EACpC,kBAAkB,EAAE,oBAAoB,EACxC,eAAe,EAAE,CAAC,CAAC,oBAAoB,CAAC,EACxC,uBAAuB,EAAE,CAAC,CAAC,oCAAoC,CAAC,EAChE,cAAc,EAAE,CAAC,CAAC,0BAA0B,CAAC,EAE7C,QAAA,EAAAA,GAAA,CAAC,eAAe,EAAC,EAAA,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAA,QAAA,EAC3DA,GAAC,CAAA,UAAU,IACT,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,EAChC,OAAO,EAAE,YAAW;wBAClB,IAAI,CAAC,aAAa,EAAE;4BAClB,MAAM,iBAAiB,EAAE,CAAC;AAC3B,yBAAA;AAAM,6BAAA;AACL,4BAAA,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;AAC3B,yBAAA;AACH,qBAAC,EACD,CAAA,EAAA,CACc,EACK,CAAA,EAAA,CACd,EACb;AACJ;;AC3Da,MAAA,wBAAwB,GAAG,CACtC,KAAoC,KAClC;AACF,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,mBAAmB,EAAE,GAAG,KAAK,CAAC;AAEnE,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,QACEA,IAAC,eAAe,EAAA,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAA,QAAA,EAC3DA,IAAC,UAAU,EAAA,EACT,IAAI,EAAE,CAAC,MAAM,GAAG,QAAQ,GAAG,YAAY,EACvC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,EAC9B,CAAA,EAAA,CACc,EAClB;AACJ,EAAE;AAOW,MAAA,2BAA2B,GAAG,CACzC,KAAuC,KACrC;AACF,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,mBAAmB,EAAE,GAAG,KAAK,CAAC;AAEnE,IAAA,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,GAC9D,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AAEjD,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;AAE5C,IAAA,QACEA,GAAC,CAAA,UAAU,EAAC,EAAA,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EACpD,QAAA,EAAAA,GAAA,CAAC,sBAAsB,EACrB,EAAA,UAAU,EAAE,aAAa,CAAC,UAAU,EACpC,kBAAkB,EAAE,oBAAoB,EACxC,eAAe,EAAE,CAAC,CAAC,+BAA+B,CAAC,EACnD,uBAAuB,EAAE,CAAC,CACxB,+CAA+C,CAChD,EACD,cAAc,EAAE,CAAC,CAAC,qCAAqC,CAAC,EAExD,QAAA,EAAAA,GAAA,CAAC,eAAe,EAAC,EAAA,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAA,QAAA,EAC3DA,GAAC,CAAA,UAAU,IACT,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,EACtC,OAAO,EAAE,YAAW;wBAClB,IAAI,CAAC,aAAa,EAAE;4BAClB,MAAM,iBAAiB,EAAE,CAAC;AAC3B,yBAAA;AAAM,6BAAA;AACL,4BAAA,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;AACvB,yBAAA;AACH,qBAAC,EACD,CAAA,EAAA,CACc,EACK,CAAA,EAAA,CACd,EACb;AACJ;;ACtEO,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,OAAO,EACP,OAAO,GACe,KAAI;AAC1B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,WAAW,GAAyC,WAAW,CACnE,OAAO,CAAC,KAAI;AACV,QAAA,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,CAAC,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE;AACf,YAAA,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;AACb,SAAA;KACF,EACD,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CACzB,CAAC;IACF,QACEA,IAAC,UAAU,EAAA,EACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,UAAU,EACf,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAE,WAAW,EACpB,CAAA,EACF;AACJ;;MCvBa,YAAY,GAAG,CAAC,EAAE,OAAO,EAAqB,MACzDC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,0BAA0B,EACvC,QAAA,EAAA,CAAAD,GAAA,CAAC,gBAAgB,EAAG,EAAA,CAAA,EACpBA,GAAC,CAAA,eAAe,EAAG,EAAA,CAAA,EACnBA,IAAC,iBAAiB,EAAA,EAAA,CAAG,EACrBA,GAAC,CAAA,8BAA8B,cAC7BA,GAAC,CAAA,2BAA2B,EAAG,EAAA,CAAA,EAAA,CACA,EACjCA,GAAA,CAAC,2BAA2B,EAAG,EAAA,CAAA,EAC/BA,GAAC,CAAA,gBAAgB,EAAC,EAAA,OAAO,EAAE,OAAO,EAAA,CAAI,CAClC,EAAA,CAAA;;ACZD,MAAM,uBAAuB,GAA2B;AAC7D,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,cAAc,EAAE,GAAG;AACnB,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,SAAS,EAAE,IAAI;CAChB,CAAC;AAEK,MAAM,QAAQ,GAAG,CAAC,EACvB,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EACpC,oBAAoB,GAAG,IAAI,EAC3B,gBAAgB,GAAG,uBAAuB,GAC5B,KAAI;AAClB,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;AAE/B,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SAC/B,EAAE,oBAAoB,CAAC,CAAC;AAEzB,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,SAAS,CAAC,CAAC;AAC1B,SAAC,CAAC;KACH,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAEtD,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI,CAAC;AAE3B,IAAA,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;IAE3C,QACEA,aAAK,SAAS,EAAC,qBAAqB,EAClC,QAAA,EAAAA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,4BAA4B,YACzC,SAAS,IAAI,gBAAgB,CAAC,SAAS,CAAC,EACpC,CAAA,EAAA,CACH,EACN;AACJ,CAAC;;AC3CY,MAAA,gBAAgB,GAAqB;AAChD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,QAAQ;AACrB,KAAA;AACD,IAAA;;AAEE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,UAAU,EAAE,cAAc;AAC3B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,aAAa;AAC1B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,WAAW;AACxB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;EACD;AAMW,MAAA,eAAe,GAAG,CAAC,EAC9B,SAAS,GAAG,gBAAgB,GACP,KAAI;AACzB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,QACEA,GAAC,CAAA,UAAU,EAAC,EAAA,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EACzD,QAAA,EAAAA,GAAA,CAAC,eAAe,EACd,EAAA,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,EACvB,aAAa,EAAC,WAAW,EACzB,IAAI,EAAEA,GAAA,CAAC,oBAAoB,EAAA,EAAC,SAAS,EAAE,SAAS,EAAA,CAAI,EAEpD,QAAA,EAAAA,GAAA,CAAC,UAAU,EAAA,EACT,IAAI,EAAC,WAAW,EAChB,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,EACrB,OAAO,EAAE,MAAK;AACZ,oBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3B,iBAAC,EACD,CAAA,EAAA,CACc,EACP,CAAA,EACb;AACJ,EAAE;MAMW,oBAAoB,GAAG,CAAC,EACnC,SAAS,GACiB,KAAI;AAC9B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EACvC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,MACtBA,GAEE,CAAA,QAAA,EAAA,EAAA,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;aAC9B,EAAA,QAAA,EAEA,QAAQ,CAAC,UAAU,IAAI,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAP/D,EAAA,QAAQ,CAAC,UAAU,CAQjB,CACV,CAAC,EAAA,CACE,EACN;AACJ;;AC7Ea,MAAA,uBAAuB,GAAG,CACrC,KAAmC,KACjC;AACF,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,GAAG,yBAAyB,EAAE,GAAG,KAAK,CAAC;IAE5E,QACEA,IAAC,eAAe,EAAA,EAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAC3C,QAAA,EAAAA,GAAA,CAAC,UAAU,EAAC,EAAA,IAAI,EAAC,SAAS,EAAA,CAAG,EACb,CAAA,EAClB;AACJ;;AChBO,MAAM,kBAAkB,GAAG,CAAC,EAAE,IAAI,EAAsB,KAAI;IACjE,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI,CAAC;AAE9B,IAAA,QACEA,GAAA,CAAAI,QAAA,EAAA,EAAA,QAAA,EACEJ,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gCAAgC,EAC5C,QAAA,EAAA,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,MACfA,GAAC,CAAA,sBAAsB,EAAc,EAAA,MAAM,EAAE,MAAM,EAAA,EAAtB,MAAM,CAAoB,CACxD,CAAC,EACE,CAAA,EAAA,CACL,EACH;AACJ,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,EAAE,MAAM,EAAsB,KAAI;AAChE,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,uBAAuB,GAAG,MAAK;AACnC,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;AACxC,KAAC,CAAC;AAEF,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qCAAqC,EAClD,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAC/D,QAAA,EAAA,MAAM,EACH,CAAA,EACNA,IAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,YACrDA,GAAC,CAAA,UAAU,EAAC,EAAA,OAAO,EAAE,uBAAuB,EAAA,QAAA,EAAA,SAAA,EAAA,CAAsB,EACvD,CAAA,CAAA,EAAA,CACT,EACN;AACJ,CAAC;;AC7BM,MAAM,yBAAyB,GAAG,CAAC,EACxC,OAAO,GACwB,KAAI;IACnC,MAAM,EAAE,eAAe,EAAE,4BAA4B,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC9E,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;AACvC,IAAA,MAAM,yBAAyB,GAAG,4BAA4B,EAAE,CAAC;AACjE,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AAExB,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oCAAoC,EACjD,QAAA,EAAA,CAAAA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2CAA2C,EAAA,QAAA,EAAA,CACvD,CAAC,CAAC,cAAc,CAAC,EAAE,GAAG,EACvBA,IAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,iDAAiD,kBAC7D,YAAY,CAAC,MAAM,EAAA,GAAA,CAAA,EAAA,CAChB,EACN,yBAAyB,GAAG,CAAC,KAC5BD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,qDAAqD,EAAA,QAAA,EAClE,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,EAAA,CAChD,CACR,CACG,EAAA,CAAA,EACNA,GACE,CAAA,QAAA,EAAA,EAAA,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,kDAAkD,EAAA,QAAA,EAE5DA,GAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,wDAAwD,EAAA,CAAG,EACpE,CAAA,CAAA,EAAA,CACL,EACN;AACJ,CAAC;;ACDM,MAAM,0BAA0B,GAAG,CAAC,EACzC,WAAW,EACX,WAAW,GAAG,kBAAkB,GACA,KAAI;AACpC,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,CACpD,SAAS,CAAC,SAAS,CAAC,KAAK,CAC1B,CAAC;AACF,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,CACpD,SAAS,CAAC,SAAS,CAAC,KAAK,CAC1B,CAAC;AACF,IAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;AAEnC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AAExB,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qCAAqC,EAClD,QAAA,EAAA,CAAAD,GAAA,CAAC,WAAW,EAAA,EAAC,WAAW,EAAE,WAAW,EAAA,CAAI,EACzCC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,4DAA4D,EACzE,QAAA,EAAA,CAAAD,GAAA,CAAC,cAAc,EAAA,EACb,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,EAC3D,SAAS,EAAE,IAAI,CACb,2CAA2C,EAC3C,6CACE,SAAS,GAAG,KAAK,GAAG,SACtB,CAAE,CAAA,CACH,EACD,CAAA,EACFA,IAAC,cAAc,EAAA,EACb,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,EACnD,SAAS,EAAE,IAAI,CACb,2CAA2C,EAC3C,CACE,0CAAA,EAAA,SAAS,GAAG,QAAQ,GAAG,YACzB,CAAA,CAAE,CACH,EACD,CAAA,EACD,QAAQ,KACPA,GAAC,CAAA,cAAc,EACb,EAAA,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,EAClB,SAAS,EAAE,IAAI,CACb,2CAA2C,EAC3C,kDAAkD,CACnD,GACD,CACH,EAEDA,GAAC,CAAA,UAAU,IAAC,SAAS,EAAC,YAAY,EAAC,YAAY,EAAEM,cAAY,EAAA,QAAA,EAC3DN,IAAC,6BAA6B,EAAA,EAAC,WAAW,EAAE,WAAW,EAAI,CAAA,EAAA,CAChD,CACT,EAAA,CAAA,CAAA,EAAA,CACF,EACN;AACJ,EAAE;AAEF,MAAM,cAAc,GAAG,CAAC,KAA4B,MAClDA,GAAA,CAAC,WAAW,EAAA,EAAA,GAAK,KAAK,EAAA,CAAI,CAC3B,CAAC;AAMF;AACA,MAAM,kBAAkB,GAAG,CAAC,EAAE,WAAW,EAAoB,KAAI;AAC/D,IAAA,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AACzC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,KAAK,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACvE,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;AACxE,IAAA,IAAI,WAAW,CAAC;AAChB,IAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QACrB,WAAW,GAAG,MAAM,IAAI,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;AAClD,KAAA;AAAM,SAAA,IAAI,MAAM,EAAE;AACjB,QAAA,WAAW,GAAG,CAAG,EAAA,QAAQ,CAAK,EAAA,EAAA,MAAM,GAAG,CAAC;AACzC,KAAA;AAAM,SAAA;QACL,WAAW,GAAG,QAAQ,CAAC;AACxB,KAAA;AAED,IAAA,QACEA,GAAA,CAAC,WAAW,EAAA,EACV,SAAS,EAAC,mDAAmD,EAC7D,KAAK,EAAE,WAAW,EAAA,QAAA,EAEjB,WAAW,EAAA,CACA,EACd;AACJ,CAAC,CAAC;AAEF,MAAMM,cAAY,GAAG,UAAU,CAC7B,CAAC,KAAK,EAAE,GAAG,KAAI;AACb,IAAA,OAAON,IAAC,UAAU,EAAA,EAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAC,UAAU,EAAC,GAAG,EAAE,GAAG,GAAI,CAAC;AAC5E,CAAC,CACF,CAAC;AAEK,MAAM,6BAA6B,GAAG,CAAC,EAC5C,WAAW,EACX,sBAAsB,EACtB,YAAY,GAKb,KAAI;AACH,IAAA,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CACtD,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAC7B,CAAC;AACF,IAAA,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GAAG,QAAQ,CACpE,QAAQ,CAAC,uBAAuB,CACjC,CAAC;AACF,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;AAEhE,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,IAAA,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAC7C,SAAS,CAAC,SAAS,CAAC,YAAY,CACjC,CAAC;AACF,IAAA,MAAM,mBAAmB,GAAG,eAAe,CAAC,QAAQ,CAClD,SAAS,CAAC,SAAS,CAAC,kBAAkB,CACvC,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;AAChD,IAAA,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxD,IAAA,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxD,IAAA,MAAM,eAAe,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACpE,IAAA,MAAM,oBAAoB,GAAG,MAC3B,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAE9C,MAAM,eAAe,GAAG,CAAC,UAAkB,KAAK,MAAK;QACnD,IAAI,EAAE,qBAAqB,CAAC;AAC1B,YAAA,OAAO,EAAE,MAAM;YACf,iBAAiB,EAAE,CAAC,UAAU,CAAC;AAChC,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,UAAkB,KAAK,MAAK;QACpD,IAAI,EAAE,qBAAqB,CAAC;AAC1B,YAAA,OAAO,EAAE,MAAM;YACf,kBAAkB,EAAE,CAAC,UAAU,CAAC;AACjC,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;IAEF,MAAM,yBAAyB,GAAG,MAAK;AACrC,QAAA,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AACxB,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;AACtB,SAAA;AACH,KAAC,CAAC;IAEF,MAAM,cAAc,GAAG,MAAK;QAC1B,IAAI;AACF,cAAE,cAAc,CAAC;AACf,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,UAAU,EAAE,SAAS;SACtB,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;YACb,OAAO,CAAC,KAAK,CAAC,CAAA,0BAAA,EAA6B,MAAM,CAAE,CAAA,EAAE,GAAG,CAAC,CAAC;AAC5D,SAAC,CAAC,CAAC;AACP,KAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAK;QAC5B,IAAI;AACF,cAAE,gBAAgB,CAAC;AACjB,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,UAAU,EAAE,SAAS;SACtB,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;YACb,OAAO,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,MAAM,CAAE,CAAA,EAAE,GAAG,CAAC,CAAC;AAC9D,SAAC,CAAC,CAAC;AACP,KAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,MAAK;QAChC,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,sBAAsB;AAC3B,kBAAE,iBAAiB,EAAE;iBACpB,IAAI,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACrC,iBAAA,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACzB,SAAA;QAED,QAAQ;AACL,aAAA,cAAc,EAAE;AAChB,aAAA,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;aACpB,OAAO,CAAC,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,KAAC,CAAC;IAEF,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,sBAAsB,GAAG,MAAK;AAClC,YAAA,0BAA0B,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAC/D,SAAC,CAAC;AAEF,QAAA,YAAY,CAAC,gBAAgB,CAC3B,uBAAuB,EACvB,sBAAsB,CACvB,CAAC;AACF,QAAA,YAAY,CAAC,gBAAgB,CAC3B,uBAAuB,EACvB,sBAAsB,CACvB,CAAC;AAEF,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,mBAAmB,CAC9B,uBAAuB,EACvB,sBAAsB,CACvB,CAAC;AACF,YAAA,YAAY,CAAC,mBAAmB,CAC9B,uBAAuB,EACvB,sBAAsB,CACvB,CAAC;AACJ,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,sBAAsB,GAAG,MAAK;AAClC,QAAA,IAAI,YAAY,IAAI,uBAAuB,KAAK,YAAY,EAAE;AAC5D,YAAA,OAAO,YAAY;AAChB,iBAAA,uBAAuB,EAAE;AACzB,iBAAA,KAAK,CAAC,OAAO,CAAC,KAAK,CAAkB,CAAC;AAC1C,SAAA;QAED,QAAQ,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvD,KAAC,CAAC;AAEF,IAAA,QACEC,IAAA,CAAC,WAAW,EAAA,EAAA,QAAA,EAAA,CACVA,IAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAEhC,QAAA,EAAA,CAAAD,GAAA,CAAC,IAAI,EAAC,EAAA,IAAI,EAAC,KAAK,EAAG,CAAA,EAClB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CACN,EAAA,CAAA,EACxBC,IAAC,CAAA,UAAU,IAAC,cAAc,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,CAC1DA,KAAC,qBAAqB,EAAA,EACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAA,QAAA,EAAA,CAEhCD,GAAC,CAAA,IAAI,EAAC,EAAA,IAAI,EAAC,KAAK,EAAG,CAAA,EAClB,CAAC,CAAC,kBAAkB,CAAC,CAAA,EAAA,CACA,EACxBC,IAAA,CAAC,qBAAqB,EAAA,EACpB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,EAEhC,QAAA,EAAA,CAAAD,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,KAAK,EAAA,CAAG,EAClB,CAAC,CAAC,oBAAoB,CAAC,CACF,EAAA,CAAA,CAAA,EAAA,CACb,EACbA,GAAA,CAAC,UAAU,EAAC,EAAA,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,YACrDC,IAAC,CAAA,qBAAqB,EAAC,EAAA,OAAO,EAAE,SAAS,EACvC,QAAA,EAAA,CAAAD,GAAA,CAAC,IAAI,EAAC,EAAA,IAAI,EAAC,aAAa,EAAG,CAAA,EAC1B,CAAC,CAAC,OAAO,CAAC,CACW,EAAA,CAAA,EAAA,CACb,EACbC,IAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EACpD,QAAA,EAAA,CAAAA,IAAA,CAAC,qBAAqB,EAAC,EAAA,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAC5D,QAAA,EAAA,CAAAD,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,oBAAoB,EAAA,CAAG,EACjC,CAAC,CAAC,gBAAgB,CAAC,CACE,EAAA,CAAA,EACxBC,IAAC,CAAA,qBAAqB,IACpB,QAAQ,EAAE,CAAC,cAAc,EACzB,OAAO,EAAE,eAAe,aAExBD,GAAC,CAAA,IAAI,EAAC,EAAA,IAAI,EAAC,kBAAkB,EAAG,CAAA,EAC/B,CAAC,CAAC,uBAAuB,CAAC,CAAA,EAAA,CACL,EACxBC,IAAA,CAAC,qBAAqB,EAAA,EAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,aAC5DD,GAAC,CAAA,IAAI,EAAC,EAAA,IAAI,EAAC,UAAU,EAAG,CAAA,EACvB,CAAC,CAAC,YAAY,CAAC,CAAA,EAAA,CACM,EACxBC,IAAA,CAAC,qBAAqB,EAAA,EACpB,QAAQ,EAAE,CAAC,mBAAmB,EAC9B,OAAO,EAAE,oBAAoB,EAAA,QAAA,EAAA,CAE7BD,IAAC,IAAI,EAAA,EAAC,IAAI,EAAC,UAAU,EAAA,CAAG,EACvB,CAAC,CAAC,yBAAyB,CAAC,CACP,EAAA,CAAA,CAAA,EAAA,CACb,EACZ,sBAAsB,KACrBA,IAAC,qBAAqB,EAAA,EAAC,OAAO,EAAE,oBAAoB,EAAA,QAAA,EACjD,CAAC,CAAC,4BAA4B,EAAE;AAC/B,oBAAA,SAAS,EAAE,gBAAgB,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;iBACtD,CAAC,EAAA,CACoB,CACzB,EACA,YAAY,IAAI,QAAQ,CAAC,uBAAuB,KAC/CA,IAAC,qBAAqB,EAAA,EAAC,OAAO,EAAE,sBAAsB,YACnD,CAAC,CAAC,oCAAoC,EAAE;oBACvC,SAAS,EACP,uBAAuB,KAAK,YAAY;AACtC,0BAAE,CAAC,CAAC,OAAO,CAAC;AACZ,0BAAE,CAAC,CAAC,OAAO,CAAC;AACjB,iBAAA,CAAC,EACoB,CAAA,CACzB,EACDC,IAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAA,QAAA,EAAA,CACjED,GAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EAEjD,CAAC,CAAC,aAAa,CAAC,EACK,CAAA,EACxBA,GAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EAEjD,CAAC,CAAC,aAAa,CAAC,EACK,CAAA,EACxBA,GAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,eAAe,CAAC,aAAa,CAAC,WAAW,CAAC,EAAA,QAAA,EAElD,CAAC,CAAC,sBAAsB,CAAC,EACJ,CAAA,EAExBA,GAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EAElD,CAAC,CAAC,eAAe,CAAC,EACG,CAAA,EACxBA,GAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EAElD,CAAC,CAAC,eAAe,CAAC,EACG,CAAA,EACxBA,GAAC,CAAA,qBAAqB,EACpB,EAAA,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,WAAW,CAAC,EAAA,QAAA,EAEnD,CAAC,CAAC,wBAAwB,CAAC,EACN,CAAA,CAAA,EAAA,CACb,CACD,EAAA,CAAA,EACd;AACJ;;ACtWa,MAAA,sBAAsB,GAAG,CAAC,EACrC,IAAI,GACwB,MAC5BA,aAAK,SAAS,EAAC,gCAAgC,EAC5C,QAAA,EAAA,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,MACpBA,GAAC,CAAA,0BAA0B,IAEzB,WAAW,EAAE,WAAW,EADnB,EAAA,WAAW,CAAC,SAAS,CAE1B,CACH,CAAC,EAAA,CACE;;AClBD,MAAM,0BAA0B,GAAG,MAAK;AAC7C,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAChD,CAAC,CAAC,uBAAuB,CAAC,EACvB,CAAA,EACN;AACJ,CAAC;;ACKM,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,QAAQ,EACR,GAAG,IAAI,EACU,KAAI;IACrB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL,CAAC;IACF,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;AAE1B,QAAA,MAAM,aAAa,GAAG,CAAC,CAAgB,KAAI;AACzC,YAAA,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,QAAQ;AAAE,gBAAA,UAAU,EAAE,CAAC;AACrD,SAAC,CAAC;AAEF,QAAA,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAExD,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC7D,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AAE/B,IAAA,QACEC,IACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE;AACpD,YAAA,4CAA4C,EAAE,QAAQ;SACvD,CAAC,EAAA,QAAA,EAAA,CAEFD,eAAO,WAAW,EAAC,QAAQ,EAAK,GAAA,IAAI,EAAE,GAAG,EAAE,eAAe,EAAI,CAAA,EAC7D,QAAQ,IACPA,GAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,oCAAoC,EAC9C,OAAO,EAAE,UAAU,YAEnBA,GAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,uCAAuC,EAAA,CAAG,GACnD,KAETA,cAAM,SAAS,EAAC,+BAA+B,EAAG,CAAA,CACnD,CACG,EAAA,CAAA,EACN;AACJ;;ACnCa,MAAA,aAAa,GAAG,CAAoB,EAC/C,0BAA0B,oBAC1BO,kBAAgB,GAAGC,gBAAuB,EAC1C,qBAAqB,EACrB,aAAa,EACb,gBAAgB,GACM,KAAI;AAC1B,IAAA,IAAI,qBAAqB,EAAE;QACzB,QACER,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,oCAAoC,EACjD,QAAA,EAAAA,GAAA,CAACO,kBAAgB,EAAA,EAAA,CAAG,EAChB,CAAA,EACN;AACH,KAAA;AACD,IAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;QACzB,OAAOP,GAAA,CAAC,0BAA0B,EAAA,EAAA,CAAG,CAAC;AACvC,KAAA;AAED,IAAA,OAAOA,IAAC,gBAAgB,EAAA,EAAC,IAAI,EAAE,aAAa,GAAI,CAAC;AACnD;;ACrBO,MAAM,SAAS,GAAG,CAAI,EAC3B,gBAAgB,EAChB,QAAQ,EACR,WAAW,GAAG,EAAE,GACG,KAAyB;IAC5C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1E,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,WAAW,CAAC,MAAM;AAAE,YAAA,OAAO,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAErD,wBAAwB,CAAC,IAAI,CAAC,CAAC;AAE/B,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,YAAW;YACpC,IAAI;AACF,gBAAA,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC5C,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC3B,aAAA;AAAC,YAAA,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,aAAA;AAAS,oBAAA;gBACR,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACjC,aAAA;SACF,EAAE,gBAAgB,CAAC,CAAC;AAErB,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,SAAC,CAAC;KACH,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAE9C,OAAO;QACL,qBAAqB;QACrB,aAAa;KACd,CAAC;AACJ,CAAC;;ACAD,MAAM,aAAa,GAAG;AACpB,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,OAAO,EAAE,eAAe;CAChB,CAAC;AAEX,MAAM,gCAAgC,GAAG,GAAY,CAAC;AAE/C,MAAM,oBAAoB,GAAG,CAAC,EACnC,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,GACG,KAAI;IAC7B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GACnC,QAAQ,CAA6B,QAAQ,CAAC,CAAC;AAEjD,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAE7D,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAC1C,QAAA,EAAA,CAAAD,GAAA,CAAC,yBAAyB,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,CAAI,EAC/CA,GAAC,CAAA,WAAW,EACV,EAAA,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,EACpE,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,CAAC,CAAC,WAAW,EACvB,CAAA,EACFA,GAAC,CAAA,gCAAgC,IAC/B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAAA,CAChC,EACFC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,aAClD,YAAY,KAAK,QAAQ,KACxBD,GAAC,CAAA,wBAAwB,EACvB,EAAA,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,sBAAsB,EAAE,sBAAsB,EAAA,CAC9C,CACH,EACA,YAAY,KAAK,SAAS,KACzBA,GAAC,CAAA,yBAAyB,EACxB,EAAA,WAAW,EAAE,WAAW,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,sBAAsB,EAAE,sBAAsB,GAC9C,CACH,CAAA,EAAA,CACG,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAClDA,IAAC,8BAA8B,EAAA,EAC7B,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,EAAA,CACpE,EACE,CAAA,CAAA,EAAA,CACF,EACN;AACJ,EAAE;AAEF,MAAM,gCAAgC,GAAG,CAAC,EACxC,YAAY,EACZ,eAAe,GAIhB,KAAI;AACH,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,MAAK;AACnB,QAAA,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;AAC9B,KAAC,CAAC;IAEF,QACEC,cAAK,SAAS,EAAC,6CAA6C,EAC1D,QAAA,EAAA,CAAAA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,wBAAO,aAAa,CAAC,YAAY,CAAC,EAAQ,CAAA,EACzC,YAAY,KAAK,QAAQ,KACxBA,GAAC,CAAA,UAAU,IACT,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAC1C,kBAAkB,EAElB,IAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,UAAU,EAAA,EAAC,OAAO,EAAE,OAAO,EAAuB,QAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CACxC,CACd,CAAA,EAAA,CACG,EACNA,GAAC,CAAA,UAAU,EAAC,EAAA,SAAS,EAAC,YAAY,EAAC,YAAY,EAAEM,cAAY,EAC3D,QAAA,EAAAN,GAAA,CAAC,WAAW,EAER,EAAA,QAAA,EAAA,MAAM,CAAC,IAAI,CAAC,aAAa,CAC1B,CAAC,GAAG,CAAC,CAAC,EAAE,MACPA,GAAC,CAAA,qBAAqB,EAEL,EAAA,eAAA,EAAA,EAAE,KAAK,YAAY,EAClC,OAAO,EAAE,MAAM,eAAe,CAAC,EAAE,CAAC,EAEjC,QAAA,EAAA,aAAa,CAAC,EAAE,CAAC,EAJb,EAAA,EAAE,CAKe,CACzB,CAAC,EACU,CAAA,EAAA,CACH,CACT,EAAA,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,EAChC,WAAW,EACX,mBAAmB,EAAE,4BAA4B,EACjD,sBAAsB,GAAG,gCAAgC,GAIhC,KAAI;AAC7B,IAAA,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAEvD,IAAA,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,WAAmB,KAAI;QACtB,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,OAAO,CACpB,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,KAAI;YAClC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SAC5C,CAAC,CACH,CAAC;AACJ,KAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;AAEF,IAAA,MAAM,EAAE,qBAAqB,EAAE,aAAa,EAAE,GAC5C,SAAS,CAAyB;QAChC,QAAQ,EAAE,4BAA4B,IAAI,mBAAmB;AAC7D,QAAA,gBAAgB,EAAE,sBAAsB;QACxC,WAAW;AACZ,KAAA,CAAC,CAAC;AAEL,IAAA,QACEA,GAAA,CAAC,aAAa,EAAA,EACZ,0BAA0B,EAAE,0BAA0B,EACtD,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,EACzD,gBAAgB,EAAE,sBAAsB,EAAA,CACxC,EACF;AACJ,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,EACjC,oBAAoB,EAAE,6BAA6B,EACnD,sBAAsB,GAAG,gCAAgC,EACzD,WAAW,GAIc,KAAI;AAC7B,IAAA,MAAM,EAAE,qBAAqB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACtD,IAAA,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,WAAW,CACtC,CAAC,WAAmB,KAAI;QACtB,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,OAAO,CACpB,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,KAAI;AAClC,YAAA,OAAO,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SACvC,CAAC,CACH,CAAC;AACJ,KAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;AAEF,IAAA,MAAM,EAAE,qBAAqB,EAAE,aAAa,EAAE,GAAG,SAAS,CAAS;QACjE,QAAQ,EAAE,6BAA6B,IAAI,oBAAoB;AAC/D,QAAA,gBAAgB,EAAE,sBAAsB;QACxC,WAAW;AACZ,KAAA,CAAC,CAAC;AAEH,IAAA,QACEA,GAAA,CAAC,aAAa,EAAA,EACZ,0BAA0B,EAAE,0BAA0B,EACtD,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,EACzD,gBAAgB,EAAE,kBAAkB,EAAA,CACpC,EACF;AACJ,CAAC,CAAC;AAEF,MAAMM,cAAY,GAAG,UAAU,CAC7B,CAAC,KAAK,EAAE,GAAG,KAAI;AACb,IAAA,OAAON,IAAC,UAAU,EAAA,EAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAE,GAAG,GAAI,CAAC;AAC1E,CAAC,CACF,CAAC;AAEF,MAAM,gBAAgB,GAAG,UAAU,CACjC,CACE,EAAE,SAAS,EAAE,GAAG,KAAK,EAA4B,EACjD,GAAoC,MAEpCC,IACM,CAAA,QAAA,EAAA,EAAA,GAAA,KAAK,EACT,SAAS,EAAE,IAAI,CAAC,+BAA+B,EAAE,SAAS,CAAC,EAC3D,GAAG,EAAE,GAAG,EAER,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oCAAoC,EAAG,CAAA,EACtDA,aAAK,SAAS,EAAC,qCAAqC,EAAkB,QAAA,EAAA,aAAA,EAAA,CAAA,CAAA,EAAA,CAC/D,CACV,CACF;;AC/OY,MAAA,WAAW,GAAG,CAAC,KAAuB,KAAI;AACrD,IAAA,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;AACnC,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACjD,IAAA,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IAErC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IACxE,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI;YAAE,OAAO;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AACxD,QAAA,OAAO,MAAM,OAAO,EAAE,CAAC;AACzB,KAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;AAErB,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI,CAAC;IAE5B,QACEA,GACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAC,EACrD,KAAK,EAAE,KAAK,EACZ,GAAG,EAAC,wBAAwB,EAC5B,GAAG,EAAE,WAAW,EAChB,CAAA,EACF;AACJ;;AC7Ba,MAAA,uBAAuB,GAAG,CAAC,EACtC,cAAc,EACd,SAAS,GACoB,KAAI;IACjC,QACEC,cAAK,SAAS,EAAC,wCAAwC,EACrD,QAAA,EAAA,CAAAA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,aACpDD,GAA4B,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,CAAA,EAC3B,cAAc,CAAC,MAAM,GAAGC,IAAQ,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,cAAc,CAAC,MAAM,SAAS,GAAG,IAAI,CAAA,EAAA,CAClE,EACND,GAAC,CAAA,UAAU,EAAC,EAAA,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAE,SAAS,EAAA,CAAI,CAC7D,EAAA,CAAA,EACN;AACJ;;MCda,qBAAqB,GAAG,CAAC,EACpC,SAAS,GACkB,KAAI;IAC/B,QACEC,cAAK,SAAS,EAAC,qCAAqC,EAClD,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2CAA2C,YACxDA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC1D,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,EAC1C,CAAA,EAAA,CACF,EACNC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAAA,CAC3DD,WACE,SAAS,EAAE,IAAI,CACb,oDAAoD,EACpD,8DAA8D,CAC/D,EACD,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,SAAS,CAAC,GAAG,EACnB,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,KAAK,EAAC,wBAAwB,EAAA,QAAA,EAE9BA,cACE,SAAS,EAAE,IAAI,CACb,yDAAyD,EACzD,kCAAkC,CACnC,GACD,EACA,CAAA,EACJA,IAAC,8BAA8B,EAAA,EAC7B,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,CAAC,GAAG,GACxB,CACE,EAAA,CAAA,CAAA,EAAA,CACF,EACN;AACJ,EAAE;AACF,MAAM,aAAa,GAAG,UAAU,CAC9B,CAAC,KAA+B,EAAE,GAAoC,KAAI;AACxE,IAAA,QACEA,GAAA,CAAA,QAAA,EAAA,EAAA,GACM,KAAK,EACT,SAAS,EAAE,IAAI,CACb,oDAAoD,EACpD,+DAA+D,CAChE,EACD,GAAG,EAAE,GAAG,EACR,KAAK,EAAC,yBAAyB,EAE/B,QAAA,EAAAA,GAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAE,IAAI,CACb,yDAAyD,EACzD,8BAA8B,CAC/B,EACD,CAAA,EAAA,CACK,EACT;AACJ,CAAC,CACF;;AClEM,MAAM,yBAAyB,GAAG,MAAK;AAC5C,IAAA,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,wFAAwF,EAAA,QAAA,EAAA,CACrGD,aAAK,SAAS,EAAC,qDAAqD,EAAG,CAAA,EACvEA,WAAG,SAAS,EAAC,qDAAqD,EAG9D,QAAA,EAAA,yBAAA,EAAA,CAAA,CAAA,EAAA,CACA,EACN;AACJ;;MCDa,2BAA2B,GAAG,CAAC,EAC1C,cAAc,GACgB,KAAI;AAClC,IAAA,QACEC,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,MAC5BJ,GAAC,CAAA,qBAAqB,IAAC,SAAS,EAAE,SAAS,EAAA,EAAO,SAAS,CAAC,QAAQ,CAAI,CACzE,CAAC,EACFA,GAAA,CAAC,gBAAgB,EAAA,EAAC,IAAI,EAAC,yBAAyB,EAAG,CAAA,CAAA,EAAA,CAClD,EACH;AACJ;;ACcO,MAAM,iBAAiB,GAAG,CAAC,EAChC,cAAc,2BACdS,yBAAuB,GAAGC,uBAA8B,yBACxDC,uBAAqB,GAAGC,qBAA4B,EACpD,sBAAsB,GAAGC,yBAA6B,EACtD,OAAO,EACP,wBAAwB,GAAGC,2BAA+B,EAC1D,SAAS,GACc,KAAI;AAC3B,IAAA,QACEb,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gCAAgC,aAC7CD,GAAC,CAAAS,yBAAuB,EACtB,EAAA,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,GACpB,EACFT,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yCAAyC,EACrD,QAAA,EAAA,OAAO,IACNA,GAAA,CAAC,wBAAwB,EAAA,EAAC,cAAc,EAAE,cAAc,GAAI,IAC1D,cAAc,CAAC,MAAM,IACvB,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,MAC3BA,GAAC,CAAAW,uBAAqB,IACpB,SAAS,EAAE,SAAS,EAAA,EACf,SAAS,CAAC,QAAQ,CACvB,CACH,CAAC,KAEFX,IAAC,sBAAsB,EAAA,EAAA,CAAG,CAC3B,EACG,CAAA,CAAA,EAAA,CACF,EACN;AACJ;;AC7DO,MAAM,mBAAmB,GAAG,MAAK;AACtC,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACpD,IAAA,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;AAE/C,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;AAEvB,IAAA,MAAM,eAAe,GAAG,gBAAgB,KAAK,YAAY,CAAC,OAAO,CAAC;AAClE,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAC9C,IAAI,CAAC,aAAa,IACjBA,GAAA,CAAC,gBAAgB,EAAA,EAAC,QAAQ,EAAE,eAAe,EAAA,CAAI,KAE/CC,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACEJ,GAAC,CAAA,gBAAgB,EAAC,EAAA,QAAQ,EAAE,eAAe,EAAI,CAAA,EAC/CA,GAAC,CAAA,gBAAgB,EACf,EAAA,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAC3C,QAAQ,EAAE,eAAe,EACzB,CAAA,CAAA,EAAA,CACD,CACJ,EAAA,CACG,EACN;AACJ;;ACjBA,MAAM,sBAAsB,GAAiC;AAC3D,IAAA,CAAC,YAAY,CAAC,OAAO,GAAG,SAAS;AACjC,IAAA,CAAC,YAAY,CAAC,OAAO,GAAG,SAAS;AACjC,IAAA,CAAC,YAAY,CAAC,SAAS,GAAG,WAAW;AACrC,IAAA,CAAC,YAAY,CAAC,YAAY,GAAG,eAAe;AAC5C,IAAA,CAAC,YAAY,CAAC,mBAAmB,GAAG,QAAQ;AAC5C,IAAA,CAAC,YAAY,CAAC,OAAO,GAAG,wBAAwB;AAChD,IAAA,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE;AACvB,IAAA,CAAC,YAAY,CAAC,OAAO,GAAG,EAAE;AAC1B,IAAA,CAAC,YAAY,CAAC,MAAM,GAAG,QAAQ;AAC/B,IAAA,CAAC,YAAY,CAAC,IAAI,GAAG,WAAW;CACjC,CAAC;AAgBW,MAAA,WAAW,GAAG,CAAC,KAAuB,KAAI;IACrD,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,kBAAkB,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;AAC9D,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,MAAM,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACpE,IAAA,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;AAC3C,IAAA,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;AACjC,IAAA,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAEzC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;;AAGvB,IAAA,MAAM,aAAa,GAAmB,CAAC,OAAO,IAAI,EAAE;AACjD,SAAA,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC5B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AACvB,SAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,EAAE,IAAI,WAAW,CAAC,CAAC;AAClE,IAAA,IACE,WAAW;AACX,QAAA,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,EAAE,CAAC,EAC5D;;;QAGA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,EAAE,CAAC,CAAC;AACvE,QAAA,IAAI,IAAI,EAAE;YACR,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,SAAA;AACF,KAAA;AAED,IAAA,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAE/D,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,sDAAsD,aACnED,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,qCAAqC,EACjD,QAAA,EAAA,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,MACtBC,IAAA,CAAA,KAAA,EAAA,EAAmB,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAC9DD,IAAC,MAAM,EAAA,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,GAAI,EAChD,IAAI,CAAC,IAAI,KACRA,aAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EACxCA,GAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAE,IAAI,CAAC,IAAI,EAAA,CAAQ,GACvD,CACP,CAAA,EAAA,EANO,IAAI,CAAC,EAAE,CAOX,CACP,CAAC,EAAA,CACE,EAEL,iBAAiB,KAChBA,aAAK,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACxD,CAAC,CAAC,iBAAiB,CAAC,EAAA,CACjB,CACP,EAEA,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,KAClEA,GAAC,CAAA,mBAAmB,EAAG,EAAA,CAAA,CACxB,CACG,EAAA,CAAA,EACN;AACJ;;ACnEA,MAAM,UAAU,GAAG,CAAC,CAAe,EAAE,CAAe,KAAI;AACtD,IAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;AACnD,IAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAAE,QAAA,OAAO,CAAC,CAAC;AAClD,IAAA,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC,CAAC;AAC3B,IAAA,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC;AAC1B,IAAA,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAOK,MAAM,kBAAkB,GAAG,MAAK;AACrC,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACpD,IAAA,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAC/C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAE1D,EAAE,CAAC,CAAC;IACN,MAAM,wBAAwB,GAAG,iBAAiB,CAChD,aAAa,CAAC,uBAAuB,CACtC,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,gBAAgB,EAAE,MAAM,CAAC;IAC7C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,wBAAwB;YAAE,OAAO;QAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CACzB,yBAAyB,EACzB,CAAC,KAAuB,KAAI;AAC1B,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB;gBAAE,OAAO;AACrD,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,WAAW,EAAE;AACjC,gBAAA,qBAAqB,CAAC,CAAC,QAAQ,KAC7B,CAAC,GAAG,QAAQ,EAAE,KAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KACvD,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAC3B,CACF,CAAC;AACH,aAAA;AACH,SAAC,CACF,CAAC;AACF,QAAA,OAAO,MAAK;AACV,YAAA,WAAW,EAAE,CAAC;AAChB,SAAC,CAAC;KACH,EAAE,CAAC,IAAI,EAAE,wBAAwB,EAAE,WAAW,CAAC,CAAC,CAAC;AAElD,IAAA,MAAM,sBAAsB,GAA2B,CAAC,OAAO,EAAE,IAAI,KAAI;QACvE,OAAO,YAAW;AAChB,YAAA,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;AACtC,YAAA,QAAQ,IAAI;AACV,gBAAA,KAAK,OAAO;oBACV,MAAM,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBACnD,MAAM;AACR,gBAAA,KAAK,QAAQ;oBACX,MAAM,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBACpD,MAAM;AAGT,aAAA;YACD,qBAAqB,CAAC,CAAC,QAAQ,KAC7B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CACtC,CAAC;AACJ,SAAC,CAAC;AACJ,KAAC,CAAC;IAEF,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC;AACnD,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,QAAQ,EAAE,UAAU;AACrB,KAAA,CAAC,CAAC;;AAGH,IAAA,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AAEjD,IAAA,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gCAAgC,EAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EACpE,QAAA,EAAA,CAAAA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8CAA8C,EAC3D,QAAA,EAAA,CAAAA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uDAAuD,EACpE,QAAA,EAAA,CAAA,kBAAkB,CAAC,MAAM,oCACrB,EACPD,GAAA,CAAC,MAAM,EAAA,EACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAK;4BACZ,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;yBACxB,EAAA,QAAA,EAEA,QAAQ,GAAG,eAAe,GAAG,eAAe,EAAA,CACtC,CACL,EAAA,CAAA,EACL,QAAQ,KACPA,GAAC,CAAA,qBAAqB,EACpB,EAAA,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,KAAK,EAAE;AACL,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,CAAC,IAAI,CAAC;AACZ,oBAAA,SAAS,EAAE,MAAM;iBAClB,EACD,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,CAAA,CACH,CACG,EAAA,CAAA,EACN;AACJ,EAAE;AAOW,MAAA,qBAAqB,GAAG,UAAU,CAG7C,CAAC,KAAK,EAAE,GAAG,KAAI;IACf,MAAM,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;AAEtE,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,QACEA,aAAK,SAAS,EAAC,qCAAqC,EAAC,GAAG,EAAE,GAAG,EAAA,GAAM,IAAI,EACpE,QAAA,EAAA,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAI;AAC5C,YAAA,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;AACtC,YAAA,QACEA,GAAA,CAACE,UAAQ,EAAA,EAAA,QAAA,EACN,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,MAC1BD,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAA,CAC5CD,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,wCAAwC,EACpD,QAAA,EAAA,oBAAoB,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EACtD,CAAA,EACNA,GAAC,CAAA,MAAM,EACL,EAAA,SAAS,EAAC,8CAA8C,EACxD,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,EAEhD,QAAA,EAAA,CAAC,CAAC,OAAO,CAAC,EACJ,CAAA,EACTA,GAAC,CAAA,MAAM,EACL,EAAA,SAAS,EAAC,+CAA+C,EACzD,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAEjD,QAAA,EAAA,CAAC,CAAC,QAAQ,CAAC,EAAA,CACL,EACTA,GAAA,CAAC,MAAM,EAAA,EACL,SAAS,EAAC,+CAA+C,EACzD,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAA,QAAA,EAElD,CAAC,CAAC,SAAS,CAAC,EAAA,CACN,CAxByC,EAAA,EAAA,UAAU,CAyBxD,CACP,CAAC,EAAA,EA5BW,CAAG,EAAA,IAAI,CAAC,EAAE,CAAI,CAAA,EAAA,QAAQ,CAAE,CAAA,CA6B5B,EACX;SACH,CAAC,EACE,CAAA,EACN;AACJ,CAAC,EAAE;AAEH,MAAM,MAAM,GAAG,CACb,KAAiE,KAC/D;IACF,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;AACrC,IAAA,QACEA,GAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,uCAAuC,EAAE,SAAS,CAAC,EAAA,GAC/D,IAAI,EAAA,CACR,EACF;AACJ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,QAAgB,EAChB,UAAkB,EAClB,CAAqB,KACnB;AACF,IAAA,QAAQ,UAAU;QAChB,KAAK,aAAa,CAAC,UAAU;YAC3B,OAAO,CAAC,CAAC,uCAAuC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,KAAK,aAAa,CAAC,UAAU;YAC3B,OAAO,CAAC,CAAC,oDAAoD,EAAE;gBAC7D,QAAQ;AACT,aAAA,CAAC,CAAC;QACL,KAAK,aAAa,CAAC,WAAW;YAC5B,OAAO,CAAC,CAAC,sDAAsD,EAAE;gBAC/D,QAAQ;AACT,aAAA,CAAC,CAAC;AACL,QAAA;YACE,OAAO,CAAC,CAAC,2DAA2D,EAAE;gBACpE,QAAQ;gBACR,UAAU;AACX,aAAA,CAAC,CAAC;AACN,KAAA;AACH,CAAC;;MCrNY,WAAW,GAAG,CAAC,EAC1B,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EAC4B,KAAI;AACxC,IAAA,QACEA,GAAC,CAAA,SAAS,OAAK,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,YAC1D,QAAQ,EAAA,CACC,EACZ;AACJ;;ACZA,MAAM,2BAA2B,GAAG,MAAK;AACvC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kDAAkD,EAAA,QAAA,EAC9D,CAAC,CAAC,mBAAmB,CAAC,EACnB,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,MAAK;AAClC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6CAA6C,EAAA,QAAA,EACzD,CAAC,CAAC,iBAAiB,CAAC,EACjB,CAAA,EACN;AACJ,CAAC,CAAC;AAyBW,MAAA,YAAY,GAAG,CAAC,EAC3B,SAAS,EACT,MAAM,GAAG,IAAI,EACb,oBAAoB,GAAG,2BAA2B,EAClD,eAAe,GAAG,sBAAsB,EACxC,qBAAqB,GAAG,gBAAgB,GACtB,KAAI;AACtB,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC/C,IAAA,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;AAElE,IAAA,IAAI,QAAQ,CAAC;AACb,IAAA,IAAI,MAAM,IAAI,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE;AACnC,QAAA,QAAQ,GAAGA,GAAA,CAAC,eAAe,EAAA,EAAA,CAAG,CAAC;AAChC,KAAA;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC;AAC7B,QAAA,QAAQ,IACNC,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,WAAW,KACVJ,IAAC,SAAS,EAAA,EACR,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,IAAI,CAAC,0BAA0B,EAAE;AAC1C,wBAAA,kCAAkC,EAAE,MAAM;AAC1C,wBAAA,mCAAmC,EAAE,OAAO;qBAC7C,CAAC,EAAA,CACF,CACH,EACA,OAAO,IAAIA,IAAC,qBAAqB,EAAA,EAAA,CAAG,CACpC,EAAA,CAAA,CACJ,CAAC;AACH,KAAA;AAAM,SAAA;AACL,QAAA,QAAQ,GAAGA,GAAA,CAAC,oBAAoB,EAAA,EAAA,CAAG,CAAC;AACrC,KAAA;AAED,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE,SAAS,CAAC,EAAA,QAAA,EAClE,QAAQ,EAAA,CACL,EACN;AACJ;;MC1Ea,sBAAsB,GAAG,aAAa,CAEjD,SAAS,EAAE;AAEA,MAAA,yBAAyB,GAAG,MACvC,UAAU,CAAC,sBAAsB;;ACgBnC,MAAM,YAAY,GAAG,UAAU,CAC7B,CAAC,KAAK,EAAE,GAAG,KAAI;AACb,IAAA,OAAOA,IAAC,UAAU,EAAA,EAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAC,UAAU,EAAC,GAAG,EAAE,GAAG,GAAI,CAAC;AAC5E,CAAC,CACF,CAAC;AAEK,MAAM,yBAAyB,GAAG,MAAK;AAC5C,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AACvB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,MAAM,eAAe,GAAG,MAAK;AAC3B,QAAA,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;AAC9B,KAAC,CAAC;IAEF,QACEC,cAAK,SAAS,EAAC,iCAAiC,EAC9C,QAAA,EAAA,CAAAD,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,kBAAkB,EAAG,CAAA,EAChCA,cAAM,SAAS,EAAC,wCAAwC,EACrD,QAAA,EAAA,CAAC,CAAC,gCAAgC,CAAC,EAAA,CAC/B,EACPC,IACE,CAAA,QAAA,EAAA,EAAA,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,yCAAyC,EAEnD,QAAA,EAAA,CAAAD,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,OAAO,EAAG,CAAA,EAAA,GAAA,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAA,EAAA,CACxC,CACL,EAAA,CAAA,EACN;AACJ,EAAE;AAEW,MAAA,wBAAwB,GAAG,CAAC,EACvC,iBAAiB,GAAG,IAAI,EACxB,aAAa,GAAG,YAAY,EAC5B,cAAc,GAAG,IAAI,GACS,KAAI;AAClC,IAAA,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,SAAS,EAAE,YAAY,EAAE,GACpE,yBAAyB,EAAE,CAAC;AAC9B,IAAA,MAAM,EAAE,eAAe,EAAE,GAAG,WAAW,CAAC;AAExC,IAAA,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAC7C,SAAS,CAAC,SAAS,CAAC,YAAY,CACjC,CAAC;IAEF,IACE,WAAW,CAAC,kBAAkB;QAC9B,cAAc;QACd,SAAS,KAAK,kBAAkB,EAChC;AACA,QAAA,QACEC,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACEJ,GAAC,CAAA,yBAAyB,KAAG,EAC7BA,GAAA,CAAC,kBAAkB,EAAA,EAAC,iBAAiB,EAAE,iBAAiB,EAAI,CAAA,CAAA,EAAA,CAC3D,EACH;AACH,KAAA;IAED,QACEC,IACG,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CAAA,cAAc,KACbJ,IAAC,UAAU,EAAA,EACT,QAAQ,EAAC,OAAO,EAChB,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,YAAY,EAE1B,QAAA,EAAAA,GAAA,CAAC,6BAA6B,EAAA,EAC5B,sBAAsB,EAAE,sBAAsB,EAC9C,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,CAAA,EAAA,CACS,CACd,EACDA,GAAC,CAAA,QAAQ,EAAC,EAAA,WAAW,EAAE,WAAW,EAAA,CAAI,EACtCA,GAAA,CAAC,kBAAkB,EAAA,EAAC,iBAAiB,EAAE,iBAAiB,EAAA,CAAI,CAC3D,EAAA,CAAA,EACH;AACJ,EAAE;AAEW,MAAA,kBAAkB,GAAG,CAAC,EACjC,iBAAiB,GAAG,IAAI,GACiC,KAAI;AAC7D,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,yBAAyB,EAAE,CAAC;AACpD,IAAA,MAAM,EACJ,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,GAAG,EACH,SAAS,EACT,IAAI,EACJ,MAAM,GACP,GAAG,WAAW,CAAC;AAChB,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,yBAAyB,GAC7B,CAAC,CAAC,iBAAiB;QACnB,SAAS,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;AAE/D,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;AAEzC,IAAA,QACEA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC7CC,eAAM,SAAS,EAAC,sCAAsC,EACnD,QAAA,EAAA,CAAA,IAAI,IAAI,MAAM,EACd,iBAAiB,IAAI,iBAAiB,KACrCD,GAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAC,wDAAwD,EAClE,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAA,CAC5B,CACH,EACA,iBAAiB,KAChBA,GAAA,CAAC,YAAY,EACX,EAAA,SAAS,EACP,kBAAkB;AAClB,wBAAA,iBAAiB,KAAK,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAExD,OAAO,EAAE,CAAC,CAAC,yBAAyB,CAAC,EAEpC,QAAA,EAAA,yBAAyB,KACxBA,GACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CACb,oDAAoD,EACpD,CAAuD,oDAAA,EAAA,yBAAyB,CAAE,CAAA,CACnF,EACD,KAAK,EAAE,yBAAyB,EAAA,CAChC,CACH,EAAA,CACY,CAChB,EACA,iBAAiB,IAAI,CAAC,QAAQ,KAC7BA,GAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,mDAAmD,GAAG,CACvE,EACA,iBAAiB,IAAI,CAAC,QAAQ,KAC7BA,cAAM,SAAS,EAAC,mDAAmD,EAAA,CAAG,CACvE,EACA,iBAAiB,IAAI,QAAQ;;AAE5B,gBAAAA,GAAA,CAAA,MAAA,EAAA,EACE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EACjB,OAAO,EAAE,MAAM,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,EACrC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAC5B,SAAS,EAAC,8CAA8C,EACxD,CAAA,CACH,CACI,EAAA,CAAA,EAAA,CACH,EACN;AACJ;;ACtHa,MAAA,eAAe,GAAG,UAAU,CACvC,CACE,EACE,WAAW,EACX,SAAS,GAAG,YAAY,EACxB,SAAS,EACT,IAAI,EAAE,EAAE,eAAe,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAC1D,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAAG,wBAAyC,GAC9D,EACD,GAAG,KACD;AACF,IAAA,MAAM,EACJ,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,SAAS,GACV,GAAG,WAAW,CAAC;AAEhB,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,IAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,IAAA,MAAM,mBAAmB,GAAG,eAAe,CAAC,QAAQ,CAClD,SAAS,CAAC,SAAS,CAAC,kBAAkB,CACvC,CAAC;IAEF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAClD,IAAI,CACL,CAAC;IAEF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GACjD,QAAQ,CAA0B,IAAI,CAAC,CAAC;IAE1C,MAAM,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,GACvE,QAAQ,CAAwB,IAAI,CAAC,CAAC;;AAGxC,IAAA,yBAAyB,CAAC;QACxB,SAAS;QACT,cAAc;QACd,SAAS;AACV,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,2BAA2B,GAAG,OAAO,CACzC,OAAO;QACL,WAAW;AACX,QAAA,sBAAsB,EAAE,cAAc;AACtC,QAAA,YAAY,EAAE,mBAAmB;AACjC,QAAA,uBAAuB,EAAE,8BAA8B;QACvD,SAAS;AACV,KAAA,CAAC,EACF;QACE,mBAAmB;QACnB,8BAA8B;QAC9B,WAAW;QACX,cAAc;QACd,SAAS;AACV,KAAA,CACF,CAAC;AAEF,IAAA,MAAM,SAAS,GAAuB,OAAO,CAC3C,OAAO;AACL,QAAA,eAAe,EAAE,CAAC,OAAO,KAAI;AAC3B,YAAA,eAAe,GAAG,OAAO,CAAC,CAAC;YAC3B,sBAAsB,CAAC,OAAO,CAAC,CAAC;SACjC;AACD,QAAA,0BAA0B,EAAE,CAAC,OAAO,KAAI;AACtC,YAAA,0BAA0B,GAAG,OAAO,CAAC,CAAC;YACtC,iCAAiC,CAAC,OAAO,CAAC,CAAC;SAC5C;AACF,KAAA,CAAC,EACF,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAC9C,CAAC;IAEF,QACEA,4BACc,kBAAkB,EAC9B,GAAG,EAAE,CAAC,OAAO,KAAI;AACf,YAAA,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChC,iBAAiB,CAAC,OAAO,CAAC,CAAC;SAC5B,EACD,SAAS,EAAE,IAAI,CACb,6BAA6B,EAC7B,iBAAiB,IAAI,+CAA+C,EACpE,UAAU,IAAI,uCAAuC,EACrD,CAAC,QAAQ,IAAI,uCAAuC,EACpD,CAAC,QAAQ,IAAI,uCAAuC,EACpD,SAAS,CACV,EAED,QAAA,EAAAC,IAAA,CAAC,sBAAsB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,2BAA2B,EAAA,QAAA,EAAA,CAEhE,CAAC,kBAAkB,IAAI,CAAC,SAAS,KAChCA,IAAA,CAAAG,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,QAAQ,KACPJ,GAAA,CAAC,KAAK,EAAA,EAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,YAAY,EAAA,CAAG,CAC3D,EACA,mBAAmB,KAClBA,GAAC,CAAA,KAAK,EACJ,EAAA,WAAW,EAAE,WAAW,EACxB,SAAS,EAAC,uBAAuB,EACjC,CAAA,CACH,CACA,EAAA,CAAA,CACJ,EACDA,GAAA,CAACG,OAAK,EAAA,EACJ,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,QAAQ,EAAA,IAAA,EAAA,CACR,EACD,eAAe,CAAC,iBAAiB,CAAC,IACjCH,GAAA,CAAC,iBAAiB,EAAA,EAAA,CAAG,KAErB,iBAAiB,CAClB,CAAA,EAAA,CAC+B,EAC9B,CAAA,EACN;AACJ,CAAC;;ACtLH;AACO,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDb,MAAA,YAAY,GAAG,EAAE,EAAE;;ACKnB,MAAA,WAAW,GAAG,CAAC,KAA0C,KAAI;IACxE,QACEA,GAAC,CAAA,mBAAmB,EAAC,EAAA,qBAAqB,EAAE,YAAY,EAAM,GAAA,KAAK,EAAI,CAAA,EACvE;AACJ;;ACEO,MAAM,4BAA4B,GAAG,CAAC,IAAsB,KAAI;IACrE,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO;AAClB,QAAA,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;AACtD,QAAA,OAAO,MAAK;YACV,eAAe,CAAC,IAAI,CAAC,CAAC;AACxB,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACb,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAG,CACxC,IAAsB,EACtB,cAAuB,KACrB;IACF,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO;;AAElB,QAAA,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzE,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;AACrD,SAAA;AACD,QAAA,OAAO,MAAK;YACV,eAAe,CAAC,IAAI,CAAC,CAAC;AACxB,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAU,KAAI;;IAErC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,qBAAqB,CACxB,UAAU,CAAC,OAAO,CAAC,kBAAkB,IAAI,iBAAiB,CAC3D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAuC,CAAC,CAAC,EAAE,CAAC,KAAI;IAC5D,IAAI,CAAC,CAAC,kBAAkB;AAAE,QAAA,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,kBAAkB;QAAE,OAAO,CAAC,CAAC,CAAC;AACpC,IAAA,OAAO,CAAC,CAAC;AACX,CAAC;;ACIY,MAAA,gBAAgB,GAAG,CAAC,KAA4B,KAAI;IAC/D,MAAM,EAAE,eAAe,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,GACxE,iBAAiB,EAAE,CAAC;AACtB,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,cAAc,EAAE,GAAG,iBAAiB,CAAC,GAAG,eAAe,EAAE,CAAC;AACjE,IAAA,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;AACnD,IAAA,MAAM,qBAAqB,GAAG,wBAAwB,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,qBAAqB;AACrC,UAAEe,gBAAc,CAAC,cAAc,CAAC,IAAI,cAAc;AAClD,UAAE,iBAAiB,CAAC,IAAI,CAACA,gBAAc,CAAC,CAAC;IAE3C,4BAA4B,CAAC,IAAI,CAAC,CAAC;AAEnC,IAAA,MAAM,OAAO,IACXf,GAAA,CAAC,kBAAkB,EAAA,EACjB,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,EAChD,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,eAAe,EAAE,KAAK,CAAC,eAAe,EAAA,CACtC,CACH,CAAC;AAEF,IAAA,MAAM,EAAE,wBAAwB,EAAE,GAAG,KAAK,CAAC;AAC3C,IAAA,MAAM,0BAA0B,GAAG,qBAAqB,KACtDA,IAAC,kBAAkB;;;;AAEjB,QAAA,oBAAoB,EAClB,wBAAwB,EAAE,oBAAoB,IAAI,KAAK,EAEzD,YAAY,EAAE,wBAAwB,EAAE,YAAY,IAAI,KAAK,EAC7D,aAAa,EAAE,wBAAwB,EAAE,aAAa,IAAI,KAAK,EAC/D,eAAe,EAAE,wBAAwB,EAAE,eAAe,IAAI,IAAI,EAAA,CAClE,CACH,CAAC;AAEF,IAAA,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,CACpDD,IAAC,iBAAiB,EAAA,EAAC,YAAY,EAAE,kBAAkB,EAAI,CAAA,EACtD,qBAAqB,IAAI,SAAS,KACjCA,GAAA,CAAC,eAAe,EAAA,EACd,SAAS,EAAC,4CAA4C,EACtD,WAAW,EAAE,SAAS,EACtB,iBAAiB,EAAE,OAAO,EAC1B,SAAS,EAAC,kBAAkB,EAC5B,SAAS;yBACT,CACH,EACA,cAAc,KACbA,GAAA,CAAC,eAAe,EAAA,EACd,SAAS,EAAE,IAAI,CACb,qBAAqB;oBACnB,IAAI,CACF,oDAAoD,EACpD,CACE,oDAAA,EAAA,wBAAwB,EAAE,QAAQ,IAAI,WACxC,CAAA,CAAE,CACH,CACJ,EACD,WAAW,EAAE,cAAc,EAC3B,iBAAiB,EAAE,0BAA0B,IAAI,OAAO,EACxD,SAAS;yBACT,CACH,CAAA,EAAA,CACG,EACN;AACJ,EAAE;AAEF,MAAMe,gBAAc,GAAG,CAAC,CAA0B,KAChD,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAElE,MAAM,kBAAkB,GAAG,CAAC,KAM3B,KAAI;IACH,MAAM,EACJ,gBAAgB,GAAG,IAAI,EACvB,oBAAoB,GAAG,IAAI,EAC3B,YAAY,GAAG,IAAI,EACnB,aAAa,GAAG,IAAI,EACpB,eAAe,GAAG,KAAK,GACxB,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,yBAAyB,EAAE,CAAC;AACpD,IAAA,MAAM,EAAE,mBAAmB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACpD,IAAA,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;AAC/C,IAAA,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;AACzC,IAAA,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;AAC/C,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,QACEf,aAAK,SAAS,EAAC,uCAAuC,EACpD,QAAA,EAAAC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4CAA4C,EAAA,QAAA,EAAA,CACxD,aAAa,KACZD,cAAM,SAAS,EAAC,0CAA0C,EACvD,QAAA,EAAA,CAAC,CAAC,MAAM,CAAC,EAAA,CACL,CACR,EACA,oBAAoB,KACnBA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,6CAA6C,EAC1D,QAAA,EAAA,gBAAgB,EACZ,CAAA,CACR,EACA,eAAe,KACdA,GACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAE,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE,EAElD,QAAA,EAAA,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE,EACxC,CAAA,CACR,EACA,YAAY,KACXA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,wCAAwC,EACrD,QAAA,EAAA,cAAc,CAAC,QAAQ,CAAC,GACpB,CACR,EACA,gBAAgB,KACfA,GAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAC,6CAA6C,EACvD,OAAO,EAAE,gBAAgB,GACzB,CACH,CAAA,EAAA,CACG,EACF,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,MAAK;IACjC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC9D,IAAA,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AACnC,IAAA,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;AAAE,YAAA,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AACxD,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AACvB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC;AACtE,KAAC,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO;AACxB,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAK;YAChC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3B,EAAE,IAAI,CAAC,CAAC;AACT,QAAA,OAAO,MAAK;YACV,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AAEjB,IAAA,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,MAAK;AAC/B,IAAA,MAAM,EAAE,sBAAsB,EAAE,GAAG,yBAAyB,EAAE,CAAC;IAC/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,WAAW,CAAC,MAAK;AACtB,QAAA,IAAI,YAAY,EAAE;AAChB,YAAA,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,MAAK;gBAClC,eAAe,CAAC,KAAK,CAAC,CAAC;AACzB,aAAC,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;AACL,YAAA,sBAAsB,EAAE,iBAAiB,EAAE,CAAC,IAAI,CAAC,MAAK;gBACpD,eAAe,CAAC,IAAI,CAAC,CAAC;AACxB,aAAC,CAAC,CAAC;AACJ,SAAA;AACH,KAAC,EAAE,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,YAAoB,KAAI;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAC9C,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AACvD,IAAA,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAElC,OAAO,CAAA,EAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,EAAE,CACzD,EAAA,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EACvB,CAAG,EAAA,OAAO,CAAI,CAAA,EAAA,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC;AACpD,CAAC;;AC1ND,MAAM,UAAU,GAAG,EAAE,CAAC;AAUtB,MAAM,wBAAwB,GAAG,CAAC,EAChC,KAAK,EACL,gBAAgB,EAChB,iBAAiB,GACa,KAAI;AAClC,IAAA,QACEA,GACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,yCAAyC,EAAE;AACzD,YAAA,uCAAuC,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;YAC3D,4CAA4C,EAC1C,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YACxC,6CAA6C,EAC3C,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;AACzC,SAAA,CAAC,YAED,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,MACrBA,GAAC,CAAA,eAAe,EAEd,EAAA,WAAW,EAAE,WAAW,EACxB,SAAS,EAAA,IAAA,EACT,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAAA,EAJ/B,WAAW,CAAC,SAAS,CAK1B,CACH,CAAC,EAAA,CACE,EACN;AACJ,CAAC,CAAC;AAmBW,MAAA,mBAAmB,GAAG,CAAC,EAClC,SAAS,GAAG,UAAU,EACtB,uBAAuB,GAAG,KAAK,EAC/B,iBAAiB,GAAG,IAAI,EACxB,gBAAgB,EAChB,iBAAiB,GAAG,wBAAwB,GACnB,KAAI;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,CACJ,iCAAiC,EACjC,oCAAoC,EACrC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;AAE1C,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,eAAe,EAAE,qBAAqB,EAAE,GAAG,iBAAiB,EAAE,CAAC;AACvE,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;;AAEvC,IAAA,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;IAEnD,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAEnC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,iCAAiC,IAAI,CAAC,IAAI;YAAE,OAAO;QAExD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC;AAEpE,QAAA,OAAO,MAAM,OAAO,EAAE,CAAC;AACzB,KAAC,EAAE,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC,CAAC;;AAG9C,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAC/B,MACE,KAAK,CACH,uBAAuB,GAAG,kBAAkB,GAAG,YAAY,EAC3D,SAAS,CACV,EACH,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,CAAC,CACvE,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC;;IAG3C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AAEtB,IAAA,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAE9C,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;AAEvB,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,2CAA2C,EACrD,GAAG,EAAE,oCAAoC,EAEzC,QAAA,EAAA,CAAAD,GAAA,CAAC,iBAAiB,EAAA,EAAC,YAAY,EAAE,kBAAkB,EAAI,CAAA,EACvDC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,kCAAkC,aAC9C,iBAAiB,IAAI,SAAS,GAAG,CAAC,KACjCD,GAAC,CAAA,UAAU,IACT,IAAI,EAAC,YAAY,EACjB,QAAQ,EAAE,IAAI,KAAK,CAAC,EACpB,OAAO,EAAE,MACP,OAAO,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,EAAA,CAExD,CACH,EACA,aAAa,KACZA,GAAC,CAAA,wBAAwB,EACvB,EAAA,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAAA,CACpC,CACH,EACA,iBAAiB,IAAI,SAAS,GAAG,CAAC,KACjCA,GAAC,CAAA,UAAU,IACT,QAAQ,EAAE,IAAI,KAAK,SAAS,GAAG,CAAC,EAChC,IAAI,EAAC,aAAa,EAClB,OAAO,EAAE,MACP,OAAO,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,EAEpE,CAAA,CACH,CACG,EAAA,CAAA,CAAA,EAAA,CACF,EACN;AACJ;;AC3JO,MAAM,qBAAqB,GAAG;AACnC;;AAEG;AACH,cAAqC;AACrC;;AAEG;AACH,WAAkC,EAClC,KAA0B,KACxB;AACF,IAAA,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAGnD;AACD,QAAA,QAAQ,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AAClD,QAAA,UAAU,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AACrD,KAAA,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACb,QAAA,IACE,CAAC,WAAW;AACZ,YAAA,CAAC,cAAc;YACf,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,WAAW;YAE5B,OAAO;QAET,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,WAAW,GAAkB,IAAI,CAAC;QAEtC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAI;;;;;AAK9D,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,UAAgC,CAAC;AAE3D,gBAAA,IAAI,KAAK,EAAE;AACT,oBAAA,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC;AACjC,oBAAA,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC;AAC/B,oBAAA,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AACjC,iBAAA;AACF,aAAA;;;AAID,YAAA,IAAI,WAAW,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;gBAAE,OAAO;AAExD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC;AACvE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;AAEvE,YAAA,kBAAkB,CAAC,CAAC,EAAE,KAAI;gBACxB,IAAI,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,KAAK,UAAU;AAC1D,oBAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,gBAAA,OAAO,EAAE,CAAC;AACZ,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACvC,QAAA,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAEpC,QAAA,OAAO,MAAK;YACV,cAAc,CAAC,UAAU,EAAE,CAAC;AAC9B,SAAC,CAAC;KACH,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;AAEzC,IAAA,OAAO,eAAe,CAAC;AACzB,CAAC;;ACrCD,MAAM,2BAA2B,GAAG,OAClCA,GAAA,CAAC,wBAAwB,EAAA,EAAC,aAAa,EAAC,SAAS,EAAA,CAAG,CACrD,CAAC;AAEF,MAAM,iCAAiC,GAAG,MAAMA,GAAC,CAAA,wBAAwB,KAAG,CAAC;MAEhE,aAAa,GAAG,CAAC,EAC5B,oBAAoB,GAAG,2BAA2B,EAClD,0BAA0B,GAAG,iCAAiC,EAC9D,gBAAgB,EAChB,uBAAuB,GAAG,QAAQ,EAClC,oBAAoB,GACD,KAAI;AACvB,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,eAAe,EAAE,qBAAqB,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACvE,MAAM,CAAC,sBAAsB,EAAE,GAAG,iBAAiB,CAAC,GAAG,eAAe,EAAE,CAAC;AACzE,IAAA,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;IACnD,MAAM,CAAC,6BAA6B,EAAE,gCAAgC,CAAC,GACrE,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GACvD,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GACrD,QAAQ,CAAwB,IAAI,CAAC,CAAC;AAExC,IAAA,MAAM,sBAAsB,GAAG,cAAc,CAAC,sBAAsB,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,qBAAqB,CACrC,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,CACrB,CAAC;IAEF,MAAM,UAAU,GACd,uBAAuB,KAAK,MAAM,IAAI,uBAAuB,KAAK,OAAO,CAAC;IAC5E,MAAM,YAAY,GAChB,uBAAuB,KAAK,KAAK,IAAI,uBAAuB,KAAK,QAAQ,CAAC;IAE5E,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,6BAA6B,IAAI,CAAC,IAAI;YAAE,OAAO;QAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;AAEhE,QAAA,OAAO,MAAM,OAAO,EAAE,CAAC;AACzB,KAAC,EAAE,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC,CAAC;AAE1C,IAAA,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC;AACtD,IAAA,0BAA0B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEjD,IAAI,4BAA4B,GAAG,iBAAiB,CAAC;IAErD,MAAM,gBAAgB,GAAG,UAAU;UAC/B,SAAS,CAAC,QAAQ;AACpB,UAAE,SAAS,CAAC,UAAU,CAAC;IAEzB,IACE,OAAO,oBAAoB,KAAK,WAAW;QAC3C,gBAAgB,KAAK,IAAI,EACzB;AACA,QAAA,4BAA4B,GAAG,iBAAiB,CAAC,KAAK,CACpD,CAAC;;;AAGD,QAAA,gBAAgB,IAAI,sBAAsB,GAAG,CAAC,GAAG,CAAC,CAAC,CACpD,CAAC;AACH,KAAA;AAED,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;IAEvB,QACEC,cAAK,SAAS,EAAC,oCAAoC,EACjD,QAAA,EAAA,CAAAD,GAAA,CAAC,iBAAiB,EAAC,EAAA,YAAY,EAAE,kBAAkB,EAAA,CAAI,EACvDC,IACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,IAAI,CACb,2BAA2B,EAC3B,uBAAuB;oBACrB,CAAsC,mCAAA,EAAA,uBAAuB,EAAE,CAClE,EAAA,QAAA,EAAA,CAEDD,aAAK,SAAS,EAAC,sCAAsC,EAClD,QAAA,EAAA,sBAAsB,KACrBA,GAAA,CAAC,eAAe,EACd,EAAA,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,IAAI,EACf,SAAS,EACP,sBAAsB,GAAG,kBAAkB,GAAG,YAAY,EAE5D,iBAAiB,EAAE,0BAA0B,EAC7C,gBAAgB,EAAE,gBAAgB,EAAA,CAClC,CACH,EACG,CAAA,EACL,4BAA4B,CAAC,MAAM,GAAG,CAAC,IAAI,uBAAuB,KACjEC,cACE,GAAG,EAAE,wBAAwB,EAC7B,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAEvED,aACE,SAAS,EAAC,qDAAqD,EAC/D,GAAG,EAAE,gCAAgC,EAAA,QAAA,EAErCC,cACE,GAAG,EAAE,yBAAyB,EAC9B,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAAA,CAEtD,sBAAsB,KACrBD,aACE,SAAS,EAAC,6CAA6C,EAGvD,QAAA,EAAAA,GAAA,CAAC,eAAe,EACd,EAAA,WAAW,EAAE,sBAAsB,EACnC,iBAAiB,EAAE,oBAAoB,EACvC,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,IAAI,EAAA,CACf,IAPG,sBAAsB,CAAC,SAAS,CAQjC,CACP,EACA,4BAA4B,CAAC,GAAG,CAAC,CAAC,WAAW,MAC5CA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,6CAA6C,YAGvDA,GAAC,CAAA,eAAe,IACd,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,oBAAoB,EACvC,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,IAAI,EACf,CAAA,EAAA,EAPG,WAAW,CAAC,SAAS,CAQtB,CACP,CAAC,IACE,EACF,CAAA,EACL,UAAU,KACTA,IAAC,qBAAqB,EAAA,EACpB,aAAa,EAAE,6BAA6B,GAC5C,CACH,EACA,YAAY,KACXA,IAAC,uBAAuB,EAAA,EACtB,aAAa,EAAE,6BAA6B,GAC5C,CACH,CAAA,EAAA,CACG,CACP,CACG,EAAA,CAAA,CAAA,EAAA,CACF,EACN;AACJ,EAAE;AAMF,MAAM,uBAAuB,GAAG,CAAwB,EACtD,aAAa,GACS,KAAI;AAC1B,IAAA,MAAM,cAAc,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAC;IAElE,MAAM,uBAAuB,GAAG,MAAK;AACnC,QAAA,aAAa,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9D,KAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,MAAK;AACjC,QAAA,aAAa,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7D,KAAC,CAAC;IACF,QACEC,4BACG,cAAc,IAAI,cAAc,KAAK,OAAO,KAC3CD,GAAC,CAAA,UAAU,IACT,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAC,YAAY,EACjB,SAAS,EAAC,0DAA0D,EACpE,CAAA,CACH,EACA,cAAc,IAAI,cAAc,KAAK,KAAK,KACzCA,GAAC,CAAA,UAAU,EACT,EAAA,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAC,aAAa,EAClB,SAAS,EAAC,2DAA2D,EACrE,CAAA,CACH,CACA,EAAA,CAAA,EACH;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAwB,EACpD,aAAa,GACS,KAAI;AAC1B,IAAA,MAAM,cAAc,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;IAEhE,MAAM,qBAAqB,GAAG,MAAK;AACjC,QAAA,aAAa,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7D,KAAC,CAAC;IAEF,MAAM,wBAAwB,GAAG,MAAK;AACpC,QAAA,aAAa,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5D,KAAC,CAAC;IACF,QACEC,4BACG,cAAc,IAAI,cAAc,KAAK,KAAK,KACzCD,GAAC,CAAA,UAAU,IACT,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,yDAAyD,EACnE,CAAA,CACH,EACA,cAAc,IAAI,cAAc,KAAK,QAAQ,KAC5CA,GAAC,CAAA,UAAU,EACT,EAAA,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAC,YAAY,EACjB,SAAS,EAAC,4DAA4D,EACtE,CAAA,CACH,CACA,EAAA,CAAA,EACH;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAA0B,KAChD,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC;;AC3OjE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAC5B,QAAuB,CAAuB,EAC9C,KAAK,CAAC,GAAG,CAAC,CAAC;AAEb,UAAU,CAAC;AACT,IAAA,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK;IAC7B,KAAK;IACL,KAAK;IACL,KAAK;AACN,CAAA,CAAC;;;;"}
1
+ {"version":3,"file":"index.es.js","sources":["../../src/core/components/Audio/Audio.tsx","../../src/core/components/Audio/ParticipantsAudio.tsx","../../src/utilities/isComponentType.ts","../../src/utilities/chunk.ts","../../src/utilities/applyElementToRef.ts","../../src/core/components/Video/BaseVideo.tsx","../../src/core/components/Video/DefaultVideoPlaceholder.tsx","../../src/core/components/Video/Video.tsx","../../src/core/hooks/useTrackElementVisibility.ts","../../src/components/Avatar/Avatar.tsx","../../src/hooks/useFloatingUIPreset.ts","../../src/hooks/usePersistedDevicePreferences.ts","../../src/hooks/useScrollPosition.ts","../../src/hooks/useToggleCallRecording.ts","../../src/hooks/useRequestPermission.ts","../../src/components/Menu/MenuToggle.tsx","../../src/components/Menu/GenericMenu.tsx","../../src/components/Icon/Icon.tsx","../../src/components/Button/IconButton.tsx","../../src/components/Button/CompositeButton.tsx","../../src/components/Tooltip/Tooltip.tsx","../../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts","../../src/components/Tooltip/WithTooltip.tsx","../../src/components/Button/CopyToClipboardButton.tsx","../../src/components/Button/TextButton.tsx","../../src/components/CallControls/AcceptCallButton.tsx","../../src/components/Notification/Notification.tsx","../../src/components/Notification/PermissionNotification.tsx","../../src/components/Notification/SpeakingWhileMutedNotification.tsx","../../src/components/LoadingIndicator/LoadingIndicator.tsx","../../src/components/CallControls/RecordCallButton.tsx","../../src/components/CallStats/CallStatsLatencyChart.tsx","../../src/components/CallStats/CallStats.tsx","../../src/components/CallControls/CallStatsButton.tsx","../../src/components/CallControls/ScreenShareButton.tsx","../../src/components/DeviceSettings/DeviceSelector.tsx","../../src/components/DeviceSettings/DeviceSelectorAudio.tsx","../../src/components/DeviceSettings/DeviceSelectorVideo.tsx","../../src/components/DeviceSettings/DeviceSettings.tsx","../../src/components/CallControls/ToggleAudioButton.tsx","../../src/components/CallControls/ToggleVideoButton.tsx","../../src/components/CallControls/CancelCallButton.tsx","../../src/components/CallControls/CallControls.tsx","../../src/components/Reaction/Reaction.tsx","../../src/components/CallControls/ReactionsButton.tsx","../../src/components/CallControls/ToggleAudioOutputButton.tsx","../../src/components/CallParticipantsList/BlockedUserListing.tsx","../../src/components/CallParticipantsList/CallParticipantListHeader.tsx","../../src/components/CallParticipantsList/CallParticipantListingItem.tsx","../../src/components/CallParticipantsList/CallParticipantListing.tsx","../../src/components/CallParticipantsList/EmptyParticipantSearchList.tsx","../../src/components/Search/SearchInput.tsx","../../src/components/Search/SearchResults.tsx","../../src/components/Search/hooks/useSearch.ts","../../src/components/CallParticipantsList/CallParticipantsList.tsx","../../src/components/CallPreview/CallPreview.tsx","../../src/components/CallRecordingList/CallRecordingListHeader.tsx","../../src/components/CallRecordingList/CallRecordingListItem.tsx","../../src/components/CallRecordingList/EmptyCallRecordingListing.tsx","../../src/components/CallRecordingList/LoadingCallRecordingListing.tsx","../../src/components/CallRecordingList/CallRecordingList.tsx","../../src/components/RingingCall/RingingCallControls.tsx","../../src/components/RingingCall/RingingCall.tsx","../../src/components/Permissions/PermissionRequests.tsx","../../src/components/StreamTheme/StreamTheme.tsx","../../src/components/VideoPreview/VideoPreview.tsx","../../src/core/components/ParticipantView/ParticipantViewContext.tsx","../../src/core/components/ParticipantView/DefaultParticipantViewUI.tsx","../../src/core/components/ParticipantView/ParticipantView.tsx","../../src/core/components/StreamCall/StreamCall.tsx","../../src/translations/index.ts","../../src/core/components/StreamVideo/StreamVideo.tsx","../../src/core/components/CallLayout/hooks.ts","../../src/core/components/CallLayout/LivestreamLayout.tsx","../../src/core/components/CallLayout/PaginatedGridLayout.tsx","../../src/core/hooks/useCalculateHardLimit.ts","../../src/core/components/CallLayout/SpeakerLayout.tsx","../../index.ts"],"sourcesContent":["import { ComponentPropsWithoutRef, useEffect, useState } from 'react';\nimport {\n AudioTrackType,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AudioProps = ComponentPropsWithoutRef<'audio'> & {\n /**\n * The participant whose audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * The type of audio stream to play for the given participant.\n * The default value is `audioTrack`.\n */\n trackType?: AudioTrackType;\n};\n\nexport const Audio = ({\n participant,\n trackType = 'audioTrack',\n ...rest\n}: AudioProps) => {\n const call = useCall();\n const [audioElement, setAudioElement] = useState<HTMLAudioElement | null>(\n null,\n );\n const { userId, sessionId } = participant;\n\n useEffect(() => {\n if (!call || !audioElement) return;\n const cleanup = call.bindAudioElement(audioElement, sessionId, trackType);\n return () => {\n cleanup?.();\n };\n }, [call, sessionId, audioElement, trackType]);\n\n return (\n <audio\n autoPlay\n {...rest}\n ref={setAudioElement}\n data-user-id={userId}\n data-session-id={sessionId}\n data-track-type={trackType}\n />\n );\n};\n","import { ComponentProps, Fragment } from 'react';\nimport { SfuModels, StreamVideoParticipant } from '@stream-io/video-client';\nimport { Audio } from './Audio';\n\nexport type ParticipantsAudioProps = {\n /**\n * The participants to play audio for.\n */\n participants: StreamVideoParticipant[];\n\n /**\n * Props to pass to the underlying `Audio` components.\n */\n audioProps?: ComponentProps<typeof Audio>;\n};\n\nexport const ParticipantsAudio = (props: ParticipantsAudioProps) => {\n const { participants, audioProps } = props;\n return (\n <>\n {participants.map((participant) => {\n if (participant.isLocalParticipant) return null;\n const {\n publishedTracks,\n audioStream,\n screenShareAudioStream,\n sessionId,\n } = participant;\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const audioTrackElement = hasAudio && audioStream && (\n <Audio\n {...audioProps}\n trackType=\"audioTrack\"\n participant={participant}\n />\n );\n\n const hasScreenShareAudio = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE_AUDIO,\n );\n const screenShareAudioTrackElement = hasScreenShareAudio &&\n screenShareAudioStream && (\n <Audio\n {...audioProps}\n trackType=\"screenShareAudioTrack\"\n participant={participant}\n />\n );\n\n return (\n <Fragment key={sessionId}>\n {audioTrackElement}\n {screenShareAudioTrackElement}\n </Fragment>\n );\n })}\n </>\n );\n};\n","import { ComponentType, isValidElement, ReactElement } from 'react';\n\nexport const isComponentType = <T extends {}>(\n elementOrComponent?: ComponentType<T> | ReactElement | null,\n): elementOrComponent is ComponentType<T> => {\n return elementOrComponent === null\n ? false\n : !isValidElement(elementOrComponent);\n};\n","export const chunk = <T extends unknown[]>(array: T, size: number) => {\n const chunkCount = Math.ceil(array.length / size);\n\n return Array.from(\n { length: chunkCount },\n (_, index) => array.slice(size * index, size * index + size) as T,\n );\n};\n","import type { ForwardedRef } from 'react';\n\nexport const applyElementToRef = <T extends HTMLElement | null>(\n ref: ForwardedRef<T>,\n element: T,\n) => {\n if (!ref) return;\n\n if (typeof ref === 'function') return ref(element);\n\n ref.current = element;\n};\n","import { ComponentPropsWithRef, forwardRef, useEffect, useState } from 'react';\nimport { Browsers } from '@stream-io/video-client';\n\nimport { applyElementToRef } from '../../../utilities';\n\nexport type BaseVideoProps = ComponentPropsWithRef<'video'> & {\n stream?: MediaStream;\n};\n\n/**\n * @description Extends video element with `stream` property\n * (`srcObject`) to reactively handle stream changes\n */\nexport const BaseVideo = forwardRef<HTMLVideoElement, BaseVideoProps>(\n ({ stream, ...rest }, ref) => {\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n\n useEffect(() => {\n if (!videoElement || !stream) return;\n if (stream === videoElement.srcObject) return;\n\n videoElement.srcObject = stream;\n if (Browsers.isSafari() || Browsers.isFirefox()) {\n // Firefox and Safari have some timing issue\n setTimeout(() => {\n videoElement.srcObject = stream;\n videoElement.play().catch((e) => {\n console.error(`Failed to play stream`, e);\n });\n }, 0);\n }\n\n return () => {\n videoElement.pause();\n videoElement.srcObject = null;\n };\n }, [stream, videoElement]);\n\n return (\n <video\n autoPlay\n playsInline\n {...rest}\n ref={(element) => {\n applyElementToRef(ref, element);\n setVideoElement(element);\n }}\n />\n );\n },\n);\n","import { ComponentPropsWithRef, forwardRef, useState } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\n\nexport type VideoPlaceholderProps = {\n participant: StreamVideoParticipant;\n} & ComponentPropsWithRef<'div'>;\n\nexport const DefaultVideoPlaceholder = forwardRef<\n HTMLDivElement,\n VideoPlaceholderProps\n>(({ participant, style }, ref) => {\n const { t } = useI18n();\n const [error, setError] = useState(false);\n const name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(!participant.image || error) &&\n (name ? (\n <div className=\"str-video__video-placeholder__initials-fallback\">\n <div>{name[0]}</div>\n </div>\n ) : (\n <div>{t('Video is disabled')}</div>\n ))}\n {participant.image && !error && (\n <img\n onError={() => setError(true)}\n alt=\"video-placeholder\"\n className=\"str-video__video-placeholder__avatar\"\n src={participant.image}\n />\n )}\n </div>\n );\n});\n","import {\n ComponentPropsWithoutRef,\n ComponentType,\n useEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n SfuModels,\n StreamVideoParticipant,\n VideoTrackType,\n VisibilityState,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\nimport {\n DefaultVideoPlaceholder,\n VideoPlaceholderProps,\n} from './DefaultVideoPlaceholder';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type VideoProps = ComponentPropsWithoutRef<'video'> & {\n /**\n * The track type to display.\n */\n trackType: VideoTrackType | 'none';\n /**\n * The participant represented by this video element.\n */\n participant: StreamVideoParticipant;\n /**\n * Override the default UI that's visible when a participant turned off their video.\n * Set it to `null` if you wish to disable the video placeholder.\n *\n * @default DefaultVideoPlaceholder\n */\n VideoPlaceholder?: ComponentType<VideoPlaceholderProps> | null;\n /**\n * An object with setRef functions\n * meant for exposing some of the internal elements of this component.\n */\n refs?: {\n /**\n * The video element that's used to play the video stream.\n * @param element the video element.\n */\n setVideoElement?: (element: HTMLVideoElement | null) => void;\n /**\n * The video placeholder element that's used when the video stream is not playing.\n * @param element the video placeholder element.\n */\n setVideoPlaceholderElement?: (element: HTMLDivElement | null) => void;\n };\n};\n\nexport const Video = ({\n trackType,\n participant,\n className,\n VideoPlaceholder = DefaultVideoPlaceholder,\n refs,\n ...rest\n}: VideoProps) => {\n const {\n sessionId,\n videoStream,\n screenShareStream,\n publishedTracks,\n viewportVisibilityState,\n isLocalParticipant,\n userId,\n } = participant;\n\n const call = useCall();\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n // start with true, will flip once the video starts playing\n const [isVideoPaused, setIsVideoPaused] = useState(true);\n const [isWideMode, setIsWideMode] = useState(true);\n\n const stream =\n trackType === 'videoTrack'\n ? videoStream\n : trackType === 'screenShareTrack'\n ? screenShareStream\n : undefined;\n\n useLayoutEffect(() => {\n if (!call || !videoElement || trackType === 'none') return;\n\n const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);\n\n return () => {\n cleanup?.();\n };\n }, [call, trackType, sessionId, videoElement]);\n\n useEffect(() => {\n if (!stream || !videoElement) return;\n\n const [track] = stream.getVideoTracks();\n if (!track) return;\n\n const handlePlayPause = () => {\n setIsVideoPaused(videoElement.paused);\n\n const { width = 0, height = 0 } = track.getSettings();\n setIsWideMode(width >= height);\n };\n\n // playback may have started before we had a chance to\n // attach the 'play/pause' event listener, so we set the state\n // here to make sure it's in sync\n setIsVideoPaused(videoElement.paused);\n\n videoElement.addEventListener('play', handlePlayPause);\n videoElement.addEventListener('pause', handlePlayPause);\n track.addEventListener('unmute', handlePlayPause);\n return () => {\n videoElement.removeEventListener('play', handlePlayPause);\n videoElement.removeEventListener('pause', handlePlayPause);\n track.removeEventListener('unmute', handlePlayPause);\n\n // reset the 'pause' state once we unmount the video element\n setIsVideoPaused(true);\n };\n }, [stream, videoElement]);\n\n if (!call) return null;\n\n const isPublishingTrack =\n trackType === 'videoTrack'\n ? publishedTracks.includes(SfuModels.TrackType.VIDEO)\n : trackType === 'screenShareTrack'\n ? publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE)\n : false;\n\n const isInvisible =\n trackType === 'none' ||\n viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;\n\n const hasNoVideoOrInvisible = !isPublishingTrack || isInvisible;\n const mirrorVideo = isLocalParticipant && trackType === 'videoTrack';\n const isScreenShareTrack = trackType === 'screenShareTrack';\n return (\n <>\n {!hasNoVideoOrInvisible && (\n <video\n {...rest}\n className={clsx('str-video__video', className, {\n 'str-video__video--not-playing': isVideoPaused,\n 'str-video__video--tall': !isWideMode,\n 'str-video__video--mirror': mirrorVideo,\n 'str-video__video--screen-share': isScreenShareTrack,\n })}\n data-user-id={userId}\n data-session-id={sessionId}\n ref={(element) => {\n setVideoElement(element);\n refs?.setVideoElement?.(element);\n }}\n />\n )}\n {/* TODO: add condition to \"hold\" the placeholder until track unmutes as well */}\n {(hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (\n <VideoPlaceholder\n style={{ position: 'absolute' }}\n participant={participant}\n ref={refs?.setVideoPlaceholderElement}\n />\n )}\n </>\n );\n};\n","import { useEffect } from 'react';\nimport { DynascaleManager, VideoTrackType } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport const useTrackElementVisibility = <T extends HTMLElement>({\n trackedElement,\n dynascaleManager: propsDynascaleManager,\n sessionId,\n trackType,\n}: {\n trackedElement: T | null;\n sessionId: string;\n dynascaleManager?: DynascaleManager;\n trackType: VideoTrackType | 'none';\n}) => {\n const call = useCall();\n const manager = propsDynascaleManager ?? call?.dynascaleManager;\n useEffect(() => {\n if (!trackedElement || !manager || !call || trackType === 'none') return;\n const unobserve = manager.trackElementVisibility(\n trackedElement,\n sessionId,\n trackType,\n );\n return () => {\n unobserve();\n };\n }, [trackedElement, manager, call, sessionId, trackType]);\n};\n","import { ComponentProps, CSSProperties, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarData = {\n imageSrc?: string;\n name?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\n\nexport type AvatarProps = AvatarData & ComponentProps<'img'>;\n\nexport const Avatar = ({\n imageSrc,\n name,\n style,\n className,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n return (\n <>\n {(!imageSrc || error) && name && (\n <AvatarFallback className={className} style={style} names={[name]} />\n )}\n {imageSrc && !error && (\n <img\n onError={() => setError(true)}\n alt=\"avatar\"\n className={clsx('str-video__avatar', className)}\n src={imageSrc}\n style={style}\n {...rest}\n />\n )}\n </>\n );\n};\n\ntype AvatarFallbackProps = {\n names: string[];\n className?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\nexport const AvatarFallback = ({\n className,\n names,\n style,\n}: AvatarFallbackProps) => {\n return (\n <div\n className={clsx('str-video__avatar--initials-fallback', className)}\n style={style}\n >\n <div>\n {names[0][0]}\n {names[1]?.[0]}\n </div>\n </div>\n );\n};\n","import { useEffect } from 'react';\nimport type { UseFloatingData } from '@floating-ui/react';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react';\n\nexport const useFloatingUIPreset = ({\n placement,\n strategy,\n}: Pick<UseFloatingData, 'placement' | 'strategy'>) => {\n const {\n refs,\n x,\n y,\n update,\n elements: { domReference, floating },\n } = useFloating({\n placement,\n strategy,\n middleware: [\n offset(10),\n shift(),\n flip(),\n size({\n padding: 10,\n apply: ({ availableHeight, elements }) => {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n ],\n });\n\n // handle window resizing\n useEffect(() => {\n if (!domReference || !floating) return;\n\n const cleanup = autoUpdate(domReference, floating, update);\n\n return () => cleanup();\n }, [domReference, floating, update]);\n\n return { refs, x, y, domReference, floating, strategy };\n};\n","import { useEffect } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type LocalDevicePreference = {\n selectedDeviceId: string;\n muted: boolean;\n};\n\nexport type LocalDevicePreferences = {\n [type in 'mic' | 'camera' | 'speaker']: LocalDevicePreference;\n};\n\n/**\n * This hook will persist the device settings to local storage.\n *\n * @param key the key to use for local storage.\n */\nconst usePersistDevicePreferences = (key: string) => {\n const {\n useMicrophoneState,\n useCameraState,\n useSpeakerState,\n useCallSettings,\n } = useCallStateHooks();\n const mic = useMicrophoneState();\n const camera = useCameraState();\n const speaker = useSpeakerState();\n const settings = useCallSettings();\n useEffect(() => {\n if (!settings) return;\n try {\n const hasPreferences = !!window.localStorage.getItem(key);\n const { audio, video } = settings;\n const defaultDevice = 'default';\n const preferences: LocalDevicePreferences = {\n mic: {\n selectedDeviceId: mic.selectedDevice || defaultDevice,\n muted: hasPreferences ? mic.isMute : !audio.mic_default_on,\n },\n camera: {\n selectedDeviceId: camera.selectedDevice || defaultDevice,\n muted: hasPreferences ? camera.isMute : !video.camera_default_on,\n },\n speaker: {\n selectedDeviceId: speaker.selectedDevice || defaultDevice,\n muted: false,\n },\n };\n window.localStorage.setItem(key, JSON.stringify(preferences));\n } catch (err) {\n console.warn('Failed to save device preferences', err);\n }\n }, [\n camera.isMute,\n camera.selectedDevice,\n key,\n mic.isMute,\n mic.selectedDevice,\n settings,\n speaker.selectedDevice,\n ]);\n};\n\n/**\n * This hook will apply the device settings from local storage.\n *\n * @param key the key to use for local storage.\n */\nconst useApplyDevicePreferences = (key: string) => {\n const call = useCall();\n const { useCallSettings } = useCallStateHooks();\n const settings = useCallSettings();\n useEffect(() => {\n if (!call || !settings) return;\n\n const apply = async () => {\n const initMic = async (setting: LocalDevicePreference) => {\n await call.microphone.select(setting.selectedDeviceId);\n if (setting.muted) {\n await call.microphone.disable();\n } else {\n await call.microphone.enable();\n }\n };\n\n const initCamera = async (setting: LocalDevicePreference) => {\n await call.camera.select(setting.selectedDeviceId);\n if (setting.muted) {\n await call.camera.disable();\n } else {\n await call.camera.enable();\n }\n };\n\n const initSpeaker = (setting: LocalDevicePreference) => {\n call.speaker.select(setting.selectedDeviceId);\n };\n\n let preferences: LocalDevicePreferences | null = null;\n try {\n preferences = JSON.parse(\n window.localStorage.getItem(key)!,\n ) as LocalDevicePreferences;\n } catch (err) {\n console.warn('Failed to load device preferences', err);\n }\n if (preferences) {\n await initMic(preferences.mic);\n await initCamera(preferences.camera);\n initSpeaker(preferences.speaker);\n } else {\n const { audio, video } = settings;\n if (audio.mic_default_on) await call.microphone.enable();\n if (video.camera_default_on) await call.camera.enable();\n }\n };\n\n apply().catch((err) => {\n console.warn('Failed to apply device preferences', err);\n });\n }, [call, key, settings]);\n};\n\n/**\n * This hook will apply and persist the device preferences from local storage.\n *\n * @param key the key to use for local storage.\n */\nexport const usePersistedDevicePreferences = (\n key: string = '@stream-io/device-preferences',\n) => {\n useApplyDevicePreferences(key);\n usePersistDevicePreferences(key);\n};\n","import { useEffect, useState } from 'react';\n\nconst SCROLL_THRESHOLD = 10;\n\n/**\n * Hook which observes element's scroll position and returns text value based on the\n * position of the scrollbar (`top`, `bottom`, `between` and `null` if no scrollbar is available)\n */\nexport const useVerticalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'top' | 'bottom' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasVerticalScrollbar = element.scrollHeight > element.clientHeight;\n\n if (!hasVerticalScrollbar) return setScrollPosition(null);\n\n const isAtTheTop = element.scrollTop <= threshold;\n if (isAtTheTop) return setScrollPosition('top');\n\n const isAtTheBottom =\n Math.abs(\n element.scrollHeight - element.scrollTop - element.clientHeight,\n ) <= threshold;\n\n if (isAtTheBottom) return setScrollPosition('bottom');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n\nexport const useHorizontalScrollPosition = (\n scrollElement: HTMLElement | null,\n threshold: number = SCROLL_THRESHOLD,\n) => {\n const [scrollPosition, setScrollPosition] = useState<\n 'start' | 'end' | 'between' | null\n >(null);\n\n useEffect(() => {\n if (!scrollElement) return;\n\n const scrollHandler = () => {\n const element = scrollElement;\n\n const hasHorizontalScrollbar = element.scrollWidth > element.clientWidth;\n\n if (!hasHorizontalScrollbar) return setScrollPosition(null);\n\n const isAtTheStart = element.scrollLeft <= threshold;\n if (isAtTheStart) return setScrollPosition('start');\n\n const isAtTheEnd =\n Math.abs(\n element.scrollWidth - element.scrollLeft - element.clientWidth,\n ) <= threshold;\n\n if (isAtTheEnd) return setScrollPosition('end');\n\n setScrollPosition('between');\n };\n\n const resizeObserver = new ResizeObserver(scrollHandler);\n resizeObserver.observe(scrollElement);\n\n scrollElement.addEventListener('scroll', scrollHandler);\n return () => {\n scrollElement.removeEventListener('scroll', scrollHandler);\n resizeObserver.disconnect();\n };\n }, [scrollElement, threshold]);\n\n return scrollPosition;\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const useToggleCallRecording = () => {\n const call = useCall();\n const { useIsCallRecordingInProgress } = useCallStateHooks();\n const isCallRecordingInProgress = useIsCallRecordingInProgress();\n const [isAwaitingResponse, setIsAwaitingResponse] = useState(false);\n\n // TODO: add permissions\n\n useEffect(() => {\n // we wait until call.recording_started/stopped event to flips the\n // `isCallRecordingInProgress` state variable.\n // Once the flip happens, we remove the loading indicator\n setIsAwaitingResponse((isAwaiting) => {\n if (isAwaiting) return false;\n return isAwaiting;\n });\n }, [isCallRecordingInProgress]);\n\n const toggleCallRecording = useCallback(async () => {\n try {\n setIsAwaitingResponse(true);\n if (isCallRecordingInProgress) {\n await call?.stopRecording();\n } else {\n await call?.startRecording();\n }\n } catch (e) {\n console.error(`Failed start recording`, e);\n }\n }, [call, isCallRecordingInProgress]);\n\n return { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { useCall, useHasPermissions } from '@stream-io/video-react-bindings';\n\nexport const useRequestPermission = (permission: OwnCapability) => {\n const call = useCall();\n const hasPermission = useHasPermissions(permission);\n const [isAwaitingPermission, setIsAwaitingPermission] = useState(false); // TODO: load with possibly pending state\n\n useEffect(() => {\n const reset = () => setIsAwaitingPermission(false);\n\n if (hasPermission) reset();\n }, [hasPermission]);\n\n const requestPermission = useCallback(async () => {\n if (hasPermission) return true;\n\n const canRequestPermission =\n !!call?.permissionsContext.canRequest(permission);\n if (isAwaitingPermission || !canRequestPermission) return false;\n\n setIsAwaitingPermission(true);\n\n try {\n await call?.requestPermissions({\n permissions: [permission],\n });\n } catch (error) {\n setIsAwaitingPermission(false);\n throw new Error(`requestPermission failed: ${error}`);\n }\n\n return false;\n }, [call, hasPermission, isAwaitingPermission, permission]);\n\n return {\n requestPermission,\n hasPermission,\n canRequestPermission: !!call?.permissionsContext.canRequest(permission),\n isAwaitingPermission,\n };\n};\n","import {\n ComponentType,\n PropsWithChildren,\n useEffect,\n useState,\n ForwardedRef,\n} from 'react';\nimport { Placement, Strategy } from '@floating-ui/react';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type ToggleMenuButtonProps<E extends HTMLElement = HTMLButtonElement> = {\n menuShown: boolean;\n ref: ForwardedRef<E>;\n};\n\nexport type MenuToggleProps<E extends HTMLElement> = PropsWithChildren<{\n ToggleButton: ComponentType<ToggleMenuButtonProps<E>>;\n placement?: Placement;\n strategy?: Strategy;\n}>;\n\nexport const MenuToggle = <E extends HTMLElement>({\n ToggleButton,\n placement = 'top-start',\n strategy = 'absolute',\n children,\n}: MenuToggleProps<E>) => {\n const [menuShown, setMenuShown] = useState(false);\n\n const { floating, domReference, refs, x, y } = useFloatingUIPreset({\n placement,\n strategy,\n });\n\n useEffect(() => {\n const handleClick = (event: MouseEvent) => {\n if (!floating && domReference?.contains(event.target as Node)) {\n setMenuShown(true);\n } else if (floating && !floating?.contains(event.target as Node)) {\n setMenuShown(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key.toLowerCase() === 'escape' &&\n !event.altKey &&\n !event.ctrlKey\n ) {\n setMenuShown(false);\n }\n };\n document?.addEventListener('click', handleClick, { capture: true });\n document?.addEventListener('keydown', handleKeyDown);\n return () => {\n document?.removeEventListener('click', handleClick, { capture: true });\n document?.removeEventListener('keydown', handleKeyDown);\n };\n }, [floating, domReference]);\n\n return (\n <>\n {menuShown && (\n <div\n className=\"str-video__menu-container\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {children}\n </div>\n )}\n <ToggleButton menuShown={menuShown} ref={refs.setReference} />\n </>\n );\n};\n","import { ComponentProps, PropsWithChildren } from 'react';\n\nexport const GenericMenu = ({ children }: PropsWithChildren) => {\n return <ul className=\"str-video__generic-menu\">{children}</ul>;\n};\n\nexport const GenericMenuButtonItem = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref'>) => {\n return (\n <li className=\"str-video__generic-menu--item\">\n <button {...rest}>{children}</button>\n </li>\n );\n};\n","import clsx from 'clsx';\n\nexport type IconProps = {\n icon: string;\n};\n\nexport const Icon = ({ icon }: IconProps) => (\n <span\n className={clsx('str-video__icon', icon && `str-video__icon--${icon}`)}\n />\n);\n","import { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon, IconProps } from '../Icon';\n\nexport type ButtonWithIconProps = {\n enabled?: boolean;\n variant?: string;\n} & ComponentProps<'button'> &\n IconProps;\n\nexport const IconButton = forwardRef(\n (props: ButtonWithIconProps, ref: ForwardedRef<HTMLButtonElement>) => {\n const { icon, enabled, variant, onClick, className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__call-controls__button', className, {\n [`str-video__call-controls__button--variant-${variant}`]: variant,\n 'str-video__call-controls__button--enabled': enabled,\n })}\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n ref={ref}\n {...rest}\n >\n <Icon icon={icon} />\n </button>\n );\n },\n);\n","import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { ComponentType, forwardRef, PropsWithChildren } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { Placement } from '@floating-ui/react';\n\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type IconButtonWithMenuProps = PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | JSX.Element;\n caption?: string;\n menuPlacement?: Placement;\n}>;\n\nexport const CompositeButton = forwardRef<\n HTMLDivElement,\n IconButtonWithMenuProps\n>(({ caption, children, active, Menu, menuPlacement }, ref) => {\n return (\n <div className=\"str-video__composite-button\" ref={ref}>\n <div\n className={clsx('str-video__composite-button__button-group', {\n 'str-video__composite-button__button-group--active': active,\n })}\n >\n {children}\n {Menu && (\n <MenuToggle placement={menuPlacement} ToggleButton={ToggleMenuButton}>\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n )}\n </div>\n {caption && (\n <div className=\"str-video__composite-button__caption\">{caption}</div>\n )}\n </div>\n );\n});\n\nconst ToggleMenuButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n ({ menuShown }, ref) => {\n const { t } = useI18n();\n\n return (\n <IconButton\n className={'str-video__menu-toggle-button'}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n title={t('Toggle device menu')}\n ref={ref}\n />\n );\n },\n);\n","import { PropsWithChildren, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { useFloatingUIPreset } from '../../hooks';\nimport { Placement } from '@floating-ui/react';\n\nexport type TooltipProps<T extends HTMLElement> = PropsWithChildren<{\n /** Reference element to which the tooltip should attach to */\n referenceElement: T | null;\n /** Additional class applied to the tooltip root element */\n tooltipClassName?: string;\n /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */\n offset?: [number, number];\n /** Popper's placement property defining default position of the tooltip, default 'top' */\n tooltipPlacement?: Placement;\n /** Tells component whether to render its contents */\n visible?: boolean;\n}>;\n\nexport const Tooltip = <T extends HTMLElement>({\n children,\n referenceElement,\n tooltipClassName,\n tooltipPlacement = 'top',\n visible = false,\n}: TooltipProps<T>) => {\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement: tooltipPlacement,\n strategy: 'absolute',\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n\n if (!visible) return null;\n\n return (\n <div\n className={clsx('str-video__tooltip', tooltipClassName)}\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {children}\n </div>\n );\n};\n","import { MouseEventHandler, useCallback, useState } from 'react';\n\nexport const useEnterLeaveHandlers = <T extends HTMLElement>({\n onMouseEnter,\n onMouseLeave,\n}: Partial<\n Record<'onMouseEnter' | 'onMouseLeave', MouseEventHandler<T>>\n> = {}) => {\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n const handleMouseEnter: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter],\n );\n\n const handleMouseLeave: MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave],\n );\n\n return { handleMouseEnter, handleMouseLeave, tooltipVisible };\n};\n","import { ComponentProps, useState } from 'react';\nimport { Tooltip, TooltipProps } from './Tooltip';\nimport { useEnterLeaveHandlers } from './hooks';\n\ntype WithPopupProps = ComponentProps<'div'> &\n Omit<TooltipProps<HTMLDivElement>, 'referenceElement'>;\n\n// todo: duplicate of CallParticipantList.tsx#MediaIndicator - refactor to a single component\nexport const WithTooltip = ({\n title,\n tooltipClassName,\n tooltipPlacement,\n ...props\n}: WithPopupProps) => {\n const { handleMouseEnter, handleMouseLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLDivElement>();\n const [tooltipAnchor, setTooltipAnchor] = useState<HTMLDivElement | null>(\n null,\n );\n\n return (\n <>\n <Tooltip\n referenceElement={tooltipAnchor}\n visible={tooltipVisible}\n tooltipClassName={tooltipClassName}\n tooltipPlacement={tooltipPlacement}\n >\n {title || ''}\n </Tooltip>\n <div\n ref={setTooltipAnchor}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n />\n </>\n );\n};\n","import {\n ComponentProps,\n ComponentPropsWithRef,\n ComponentType,\n ForwardedRef,\n forwardRef,\n MouseEventHandler,\n useCallback,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport { Placement } from '@floating-ui/react';\n\nimport { Tooltip } from '../Tooltip';\n\ntype CopyToClipboardButtonProps = ComponentProps<'button'> & {\n /** Custom button component implementation. Will be rendered instead of native button element */\n Button?: ComponentType<\n ComponentPropsWithRef<'button'> & { ref: ForwardedRef<HTMLButtonElement> }\n >;\n /** Custom function to override the logic of generating the call invitation link */\n copyValue: (() => string) | string;\n /** Callback invoked if the copy-to-clipboard action fails */\n onError?: (button: HTMLButtonElement, e: Error) => void;\n /** Callback invoked if the copy-to-clipboard action succeeds */\n onSuccess?: (button: HTMLButtonElement) => void;\n};\n\nexport const CopyToClipboardButton = forwardRef<\n HTMLButtonElement,\n CopyToClipboardButtonProps\n>(\n (\n { Button, className, copyValue, onClick, onError, onSuccess, ...restProps },\n ref,\n ) => {\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (event) => {\n if (onClick) onClick(event);\n const value = typeof copyValue === 'function' ? copyValue() : copyValue;\n try {\n await navigator?.clipboard.writeText(value);\n onSuccess?.(event.target as HTMLButtonElement);\n } catch (error) {\n onError?.(event.target as HTMLButtonElement, error as Error);\n }\n },\n [copyValue, onClick, onError, onSuccess],\n );\n\n const props = {\n ...restProps,\n ref: ref,\n className: clsx('str-video__copy-to-clipboard-button', className),\n onClick: handleClick,\n };\n\n return Button ? <Button {...props} /> : <button {...props} />;\n },\n);\n\ntype CopyToClipboardButtonWithPopupProps = Exclude<\n CopyToClipboardButtonProps,\n 'onError' | 'onSuccess'\n> & {\n dismissAfterMs?: number;\n /** String displayed when copy-to-clipboard action fails */\n onErrorMessage?: string;\n /** String displayed when copy-to-clipboard succeeds fails */\n onSuccessMessage?: string;\n /** Class applied to the popup container element */\n popupClassName?: string;\n // todo: We should replace Placement for internal type\n popupPlacement?: Placement;\n};\n\nexport const CopyToClipboardButtonWithPopup = ({\n dismissAfterMs = 1500,\n onErrorMessage = 'Failed to copy',\n onSuccessMessage = 'Copied to clipboard',\n popupClassName,\n popupPlacement,\n ...restProps\n}: CopyToClipboardButtonWithPopupProps) => {\n const [tooltipText, setTooltipText] = useState('');\n const [tooltipAnchor, setTooltipAnchor] = useState<HTMLButtonElement | null>(\n null,\n );\n\n const setTemporaryPopup = useCallback(\n (popupText: string) => {\n setTooltipText(popupText);\n setTimeout(() => setTooltipText(''), dismissAfterMs);\n },\n [dismissAfterMs],\n );\n\n const onSuccess = useCallback(\n () => setTemporaryPopup(onSuccessMessage),\n [onSuccessMessage, setTemporaryPopup],\n );\n\n const onError = useCallback(\n () => setTemporaryPopup(onErrorMessage),\n [onErrorMessage, setTemporaryPopup],\n );\n\n return (\n <>\n <Tooltip\n tooltipClassName={clsx(\n 'str-video__copy-to-clipboard-button__popup',\n popupClassName,\n )}\n tooltipPlacement={popupPlacement}\n referenceElement={tooltipAnchor}\n visible={!!tooltipText}\n >\n {tooltipText}\n </Tooltip>\n <CopyToClipboardButton\n {...restProps}\n onError={onError}\n onSuccess={onSuccess}\n ref={setTooltipAnchor}\n />\n </>\n );\n};\n","import { ComponentProps } from 'react';\n\nexport const TextButton = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {\n return (\n <button {...rest} className=\"str-video__text-button\">\n {children}\n </button>\n );\n};\n","import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: () => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.join();\n onAccept?.();\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"success\"\n onClick={handleClick}\n />\n );\n};\n","import { PropsWithChildren, ReactNode, useEffect } from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nexport type NotificationProps = {\n message?: ReactNode;\n isVisible?: boolean;\n visibilityTimeout?: number;\n resetIsVisible?: () => void;\n placement?: Placement;\n iconClassName?: string | null;\n};\n\nexport const Notification = (props: PropsWithChildren<NotificationProps>) => {\n const {\n isVisible,\n message,\n children,\n visibilityTimeout,\n resetIsVisible,\n placement = 'top',\n iconClassName = 'str-video__notification__icon',\n } = props;\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement,\n strategy: 'absolute',\n });\n\n useEffect(() => {\n if (!isVisible || !visibilityTimeout || !resetIsVisible) return;\n\n const timeout = setTimeout(() => {\n resetIsVisible();\n }, visibilityTimeout);\n\n return () => clearTimeout(timeout);\n }, [isVisible, resetIsVisible, visibilityTimeout]);\n\n return (\n <div ref={refs.setReference}>\n {isVisible && (\n <div\n className=\"str-video__notification\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n >\n {iconClassName && <i className={iconClassName} />}\n <span className=\"str-video__notification__message\">{message}</span>\n </div>\n )}\n {children}\n </div>\n );\n};\n","import { Notification } from './Notification';\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useHasPermissions } from '@stream-io/video-react-bindings';\n\nexport type PermissionNotificationProps = PropsWithChildren<{\n /**\n * Set this to true if there is ongoing request for the permission.\n */\n isAwaitingApproval: boolean;\n\n /**\n * The message to display in the notification once\n * the requested permission is granted.\n */\n messageApproved: string;\n\n /**\n * The message to display in the notification once a permission\n * is revoked.\n */\n messageRevoked: string;\n\n /**\n * The message to display in the notification while\n * the requested permission is awaiting approval.\n */\n messageAwaitingApproval: string;\n\n /**\n * The permission to check for.\n */\n permission: OwnCapability;\n\n /**\n * The time in milliseconds to display the notification.\n * Defaults to 3500ms.\n */\n visibilityTimeout?: number;\n}>;\n\nexport const PermissionNotification = (props: PermissionNotificationProps) => {\n const {\n permission,\n isAwaitingApproval,\n messageApproved,\n messageAwaitingApproval,\n messageRevoked,\n visibilityTimeout = 3500,\n children,\n } = props;\n const hasPermission = useHasPermissions(permission);\n const prevHasPermission = useRef(hasPermission);\n const [showNotification, setShowNotification] = useState<\n 'granted' | 'revoked'\n >();\n useEffect(() => {\n if (hasPermission && !prevHasPermission.current) {\n setShowNotification('granted');\n prevHasPermission.current = true;\n } else if (!hasPermission && prevHasPermission.current) {\n setShowNotification('revoked');\n prevHasPermission.current = false;\n }\n }, [hasPermission]);\n\n const resetIsVisible = useCallback(() => setShowNotification(undefined), []);\n if (isAwaitingApproval) {\n return (\n <Notification\n isVisible={isAwaitingApproval && !hasPermission}\n message={messageAwaitingApproval}\n >\n {children}\n </Notification>\n );\n }\n\n return (\n <Notification\n isVisible={!!showNotification}\n visibilityTimeout={visibilityTimeout}\n resetIsVisible={resetIsVisible}\n message={\n showNotification === 'granted' ? messageApproved : messageRevoked\n }\n >\n {children}\n </Notification>\n );\n};\n","import { PropsWithChildren } from 'react';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { Notification } from './Notification';\n\nexport type SpeakingWhileMutedNotificationProps = {\n /**\n * Text message displayed by the notification.\n */\n text?: string;\n};\n\nexport const SpeakingWhileMutedNotification = ({\n children,\n text,\n}: PropsWithChildren<SpeakingWhileMutedNotificationProps>) => {\n const { useMicrophoneState } = useCallStateHooks();\n const { isSpeakingWhileMuted } = useMicrophoneState();\n const { t } = useI18n();\n\n const message = text ?? t('You are muted. Unmute to speak.');\n return (\n <Notification message={message} isVisible={isSpeakingWhileMuted}>\n {children}\n </Notification>\n );\n};\n","import clsx from 'clsx';\n\nexport type LoadingIndicatorProps = {\n className?: string;\n /** String will be injected into class and later used to apply as a CSS mask-image to an element as data URL */\n type?: string;\n /** Text to be displayed under the loading indicator icon */\n text?: string;\n /** Tooltip to be displayed on hover */\n tooltip?: string;\n};\n\nexport const LoadingIndicator = ({\n className,\n type = 'spinner',\n text,\n tooltip,\n}: LoadingIndicatorProps) => {\n return (\n <div\n className={clsx('str-video__loading-indicator', className)}\n title={tooltip}\n >\n <div className={clsx('str-video__loading-indicator__icon', type)}></div>\n {text && <p className=\"str-video__loading-indicator-text\">{text}</p>}\n </div>\n );\n};\n","import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { useToggleCallRecording } from '../../hooks/useToggleCallRecording';\n\nexport type RecordCallButtonProps = {\n caption?: string;\n};\n\nexport const RecordCallButton = ({\n caption = 'Record',\n}: RecordCallButtonProps) => {\n const call = useCall();\n\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <CompositeButton active={isCallRecordingInProgress} caption={caption}>\n {isAwaitingResponse ? (\n <LoadingIndicator\n tooltip={\n isCallRecordingInProgress\n ? t('Waiting for recording to stop...')\n : t('Waiting for recording to start...')\n }\n />\n ) : (\n <IconButton\n // FIXME OL: sort out this ambiguity\n enabled={!!call}\n disabled={!call}\n icon={isCallRecordingInProgress ? 'recording-on' : 'recording-off'}\n title={t('Record call')}\n onClick={toggleCallRecording}\n />\n )}\n </CompositeButton>\n </Restricted>\n );\n};\n","import { ResponsiveLine } from '@nivo/line';\n\nexport const CallStatsLatencyChart = (props: {\n values: Array<{ x: number; y: number }>;\n}) => {\n const { values } = props;\n let max = 0;\n const data = values.map((point) => {\n const { y } = point;\n max = Math.max(max, y);\n return point;\n });\n return (\n <div className=\"str-video__call-stats-line-chart-container\">\n <ResponsiveLine\n colors={{ scheme: 'blues' }}\n data={[\n {\n id: 'Latency',\n data: data,\n },\n ]}\n animate={false}\n margin={{ top: 10, right: 5, bottom: 5, left: 30 }}\n enablePoints\n enableGridX={false}\n enableGridY\n enableSlices=\"x\"\n isInteractive\n useMesh={false}\n xScale={{ type: 'point' }}\n yScale={{\n type: 'linear',\n min: 0,\n max: max < 220 ? 220 : max + 30,\n nice: true,\n }}\n theme={{\n axis: {\n ticks: {\n text: {\n fill: '#FCFCFD',\n },\n line: {\n stroke: '#FCFCFD',\n },\n },\n },\n grid: {\n line: {\n strokeWidth: 0.1,\n },\n },\n }}\n />\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport {\n AggregatedStatsReport,\n CallStatsReport,\n} from '@stream-io/video-client';\nimport { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { CallStatsLatencyChart } from './CallStatsLatencyChart';\n\nexport const CallStats = () => {\n const [latencyBuffer, setLatencyBuffer] = useState<\n Array<{ x: number; y: number }>\n >(() => {\n const now = Date.now();\n return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));\n });\n\n const [publishBitrate, setPublishBitrate] = useState('-');\n const [subscribeBitrate, setSubscribeBitrate] = useState('-');\n const previousStats = useRef<CallStatsReport>();\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n useEffect(() => {\n if (!callStatsReport) return;\n if (!previousStats.current) {\n previousStats.current = callStatsReport;\n return;\n }\n const previousCallStatsReport = previousStats.current;\n setPublishBitrate(() => {\n return calculatePublishBitrate(previousCallStatsReport, callStatsReport);\n });\n setSubscribeBitrate(() => {\n return calculateSubscribeBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n\n setLatencyBuffer((latencyBuf) => {\n const newLatencyBuffer = latencyBuf.slice(-19);\n newLatencyBuffer.push({\n x: callStatsReport.timestamp,\n y: callStatsReport.publisherStats.averageRoundTripTimeInMs,\n });\n return newLatencyBuffer;\n });\n\n previousStats.current = callStatsReport;\n }, [callStatsReport]);\n\n return (\n <div className=\"str-video__call-stats\">\n {callStatsReport && (\n <>\n <h3>Call Latency</h3>\n <CallStatsLatencyChart values={latencyBuffer} />\n\n <h3>Call performance</h3>\n <div className=\"str-video__call-stats__card-container\">\n <StatCard label=\"Region\" value={callStatsReport.datacenter} />\n <StatCard\n label=\"Latency\"\n value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}\n />\n <StatCard\n label=\"Receive jitter\"\n value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}\n />\n <StatCard\n label=\"Publish jitter\"\n value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}\n />\n <StatCard\n label=\"Publish resolution\"\n value={toFrameSize(callStatsReport.publisherStats)}\n />\n <StatCard\n label=\"Publish quality drop reason\"\n value={callStatsReport.publisherStats.qualityLimitationReasons}\n />\n <StatCard\n label=\"Receiving resolution\"\n value={toFrameSize(callStatsReport.subscriberStats)}\n />\n <StatCard\n label=\"Receive quality drop reason\"\n value={callStatsReport.subscriberStats.qualityLimitationReasons}\n />\n <StatCard label=\"Publish bitrate\" value={publishBitrate} />\n <StatCard label=\"Receiving bitrate\" value={subscribeBitrate} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport const StatCard = (props: { label: string; value: string }) => {\n const { label, value } = props;\n return (\n <div className=\"str-video__call-stats__card\">\n <div className=\"str-video__call-stats__card_label\">{label}</div>\n <div className=\"str-video__call-stats__card_value\">{value}</div>\n </div>\n );\n};\n\nconst toFrameSize = (stats: AggregatedStatsReport) => {\n const {\n highestFrameWidth: w,\n highestFrameHeight: h,\n highestFramesPerSecond: fps,\n } = stats;\n let size = `-`;\n if (w && h) {\n size = `${w}x${h}`;\n if (fps) {\n size += `@${fps}fps.`;\n }\n }\n return size;\n};\n\nconst calculatePublishBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n publisherStats: {\n totalBytesSent: previousTotalBytesSent,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n publisherStats: { totalBytesSent, timestamp },\n } = callStatsReport;\n\n const bytesSent = totalBytesSent - previousTotalBytesSent;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculateSubscribeBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n subscriberStats: {\n totalBytesReceived: previousTotalBytesReceived,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n subscriberStats: { totalBytesReceived, timestamp },\n } = callStatsReport;\n\n const bytesReceived = totalBytesReceived - previousTotalBytesReceived;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n","import { forwardRef } from 'react';\n\nimport { CallStats } from '../CallStats';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nexport const CallStatsButton = () => (\n <MenuToggle placement=\"top-end\" ToggleButton={ToggleMenuButton}>\n <CallStats />\n </MenuToggle>\n);\n\nconst ToggleMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps<HTMLDivElement>\n>(({ menuShown }, ref) => (\n <CompositeButton ref={ref} active={menuShown} caption={'Stats'}>\n <IconButton icon=\"stats\" title=\"Statistics\" />\n </CompositeButton>\n));\n","import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\n\nexport type ScreenShareButtonProps = {\n caption?: string;\n};\n\nexport const ScreenShareButton = (props: ScreenShareButtonProps) => {\n const { t } = useI18n();\n const { caption = t('Screen Share') } = props;\n\n const { useHasOngoingScreenShare, useScreenShareState } = useCallStateHooks();\n const isSomeoneScreenSharing = useHasOngoingScreenShare();\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SCREENSHARE);\n\n const { screenShare, isMute: amIScreenSharing } = useScreenShareState();\n const disableScreenShareButton = amIScreenSharing\n ? isSomeoneScreenSharing\n : false;\n return (\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <PermissionNotification\n permission={OwnCapability.SCREENSHARE}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your screen.')}\n messageAwaitingApproval={t('Awaiting for an approval to share screen.')}\n messageRevoked={t('You can no longer share your screen.')}\n >\n <CompositeButton active={isSomeoneScreenSharing} caption={caption}>\n <IconButton\n icon={\n isSomeoneScreenSharing ? 'screen-share-on' : 'screen-share-off'\n }\n title={t('Share screen')}\n disabled={disableScreenShareButton}\n onClick={async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await screenShare.toggle();\n }\n }}\n />\n </CompositeButton>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import clsx from 'clsx';\nimport { ChangeEventHandler } from 'react';\n\ntype DeviceSelectorOptionProps = {\n id: string;\n label: string;\n name: string;\n selected?: boolean;\n value: string;\n disabled?: boolean;\n defaultChecked?: boolean;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n};\n\nconst DeviceSelectorOption = ({\n disabled,\n id,\n label,\n onChange,\n name,\n selected,\n defaultChecked,\n value,\n}: DeviceSelectorOptionProps) => {\n return (\n <label\n className={clsx('str-video__device-settings__option', {\n 'str-video__device-settings__option--selected': selected,\n 'str-video__device-settings__option--disabled': disabled,\n })}\n htmlFor={id}\n >\n <input\n type=\"radio\"\n name={name}\n onChange={onChange}\n value={value}\n id={id}\n checked={selected}\n defaultChecked={defaultChecked}\n disabled={disabled}\n />\n {label}\n </label>\n );\n};\nexport const DeviceSelector = (props: {\n devices: MediaDeviceInfo[];\n selectedDeviceId?: string;\n title: string;\n onChange?: (deviceId: string) => void;\n}) => {\n const {\n devices = [],\n selectedDeviceId: selectedDeviceFromProps,\n title,\n onChange,\n } = props;\n const inputGroupName = title.replace(' ', '-').toLowerCase();\n\n // sometimes the browser (Chrome) will report the system-default device\n // with an id of 'default'. In case when it doesn't, we'll select the first\n // available device.\n let selectedDeviceId = selectedDeviceFromProps;\n if (\n devices.length > 0 &&\n !devices.find((d) => d.deviceId === selectedDeviceId)\n ) {\n selectedDeviceId = devices[0].deviceId;\n }\n\n return (\n <div className=\"str-video__device-settings__device-kind\">\n <div className=\"str-video__device-settings__device-selector-title\">\n {title}\n </div>\n {!devices.length ? (\n <DeviceSelectorOption\n id={`${inputGroupName}--default`}\n label=\"Default\"\n name={inputGroupName}\n defaultChecked\n value=\"default\"\n />\n ) : (\n devices.map((device) => {\n return (\n <DeviceSelectorOption\n id={`${inputGroupName}--${device.deviceId}`}\n value={device.deviceId}\n label={device.label}\n key={device.deviceId}\n onChange={(e) => {\n onChange?.(e.target.value);\n }}\n name={inputGroupName}\n selected={\n device.deviceId === selectedDeviceId || devices.length === 1\n }\n />\n );\n })\n )}\n </div>\n );\n};\n","import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { DeviceSelector } from './DeviceSelector';\n\nexport type DeviceSelectorAudioInputProps = {\n title?: string;\n};\n\nexport const DeviceSelectorAudioInput = ({\n title,\n}: DeviceSelectorAudioInputProps) => {\n const { t } = useI18n();\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, selectedDevice, devices } = useMicrophoneState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n selectedDeviceId={selectedDevice}\n onChange={async (deviceId) => {\n await microphone.select(deviceId);\n }}\n title={title || t('Select a Mic')}\n />\n );\n};\n\nexport type DeviceSelectorAudioOutputProps = {\n title?: string;\n};\n\nexport const DeviceSelectorAudioOutput = ({\n title,\n}: DeviceSelectorAudioOutputProps) => {\n const { t } = useI18n();\n const { useSpeakerState } = useCallStateHooks();\n const { speaker, selectedDevice, devices, isDeviceSelectionSupported } =\n useSpeakerState();\n\n if (!isDeviceSelectionSupported) return null;\n\n return (\n <DeviceSelector\n devices={devices}\n selectedDeviceId={selectedDevice}\n onChange={(deviceId) => {\n speaker.select(deviceId);\n }}\n title={title || t('Select Speakers')}\n />\n );\n};\n","import { DeviceSelector } from './DeviceSelector';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\n\nexport type DeviceSelectorVideoProps = {\n title?: string;\n};\n\nexport const DeviceSelectorVideo = ({ title }: DeviceSelectorVideoProps) => {\n const { t } = useI18n();\n const { useCameraState } = useCallStateHooks();\n const { camera, devices, selectedDevice } = useCameraState();\n\n return (\n <DeviceSelector\n devices={devices || []}\n selectedDeviceId={selectedDevice}\n onChange={async (deviceId) => {\n await camera.select(deviceId);\n }}\n title={title || t('Select a Camera')}\n />\n );\n};\n","import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n DeviceSelectorAudioInput,\n DeviceSelectorAudioOutput,\n} from './DeviceSelectorAudio';\nimport { DeviceSelectorVideo } from './DeviceSelectorVideo';\nimport { IconButton } from '../Button';\nimport clsx from 'clsx';\n\nexport const DeviceSettings = () => {\n return (\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleMenuButton}>\n <Menu />\n </MenuToggle>\n );\n};\n\nconst Menu = () => (\n <div className=\"str-video__device-settings\">\n <DeviceSelectorVideo />\n <DeviceSelectorAudioInput />\n <DeviceSelectorAudioOutput />\n </div>\n);\n\nconst ToggleMenuButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n ({ menuShown }, ref) => {\n const { t } = useI18n();\n\n return (\n <IconButton\n className={clsx('str-video__device-settings__button', {\n 'str-video__device-settings__button--active': menuShown,\n })}\n title={t('Toggle device menu')}\n icon=\"device-settings\"\n ref={ref}\n // tabindex={0}\n />\n );\n },\n);\n","import { ComponentType } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { DeviceSelectorAudioInput } from '../DeviceSettings';\nimport { CompositeButton, IconButton } from '../Button';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\n\nexport type ToggleAudioPreviewButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleAudioPreviewButton = (\n props: ToggleAudioPreviewButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Mic'), Menu = DeviceSelectorAudioInput } = props;\n\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, isMute } = useMicrophoneState();\n\n return (\n <CompositeButton Menu={Menu} active={isMute} caption={caption || t('Mic')}>\n <IconButton\n icon={!isMute ? 'mic' : 'mic-off'}\n onClick={() => microphone.toggle()}\n />\n </CompositeButton>\n );\n};\n\nexport type ToggleAudioPublishingButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleAudioPublishingButton = (\n props: ToggleAudioPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Mic'), Menu = DeviceSelectorAudioInput } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_AUDIO);\n\n const { useMicrophoneState } = useCallStateHooks();\n const { microphone, isMute } = useMicrophoneState();\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_AUDIO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now speak.')}\n messageAwaitingApproval={t('Awaiting for an approval to speak.')}\n messageRevoked={t('You can no longer speak.')}\n >\n <CompositeButton Menu={Menu} active={isMute} caption={caption}>\n <IconButton\n icon={isMute ? 'mic-off' : 'mic'}\n onClick={async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await microphone.toggle();\n }\n }}\n />\n </CompositeButton>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { ComponentType } from 'react';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\n\nimport { OwnCapability } from '@stream-io/video-client';\nimport { CompositeButton, IconButton } from '../Button/';\nimport { DeviceSelectorVideo } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\n\nexport type ToggleVideoPreviewButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleVideoPreviewButton = (\n props: ToggleVideoPreviewButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Video'), Menu = DeviceSelectorVideo } = props;\n\n const { useCameraState } = useCallStateHooks();\n const { camera, isMute } = useCameraState();\n\n return (\n <CompositeButton Menu={Menu} active={isMute} caption={caption}>\n <IconButton\n icon={!isMute ? 'camera' : 'camera-off'}\n onClick={() => camera.toggle()}\n />\n </CompositeButton>\n );\n};\n\ntype ToggleVideoPublishingButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleVideoPublishingButton = (\n props: ToggleVideoPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Video'), Menu = DeviceSelectorVideo } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(OwnCapability.SEND_VIDEO);\n\n const { useCameraState } = useCallStateHooks();\n const { camera, isMute } = useCameraState();\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_VIDEO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your video.')}\n messageAwaitingApproval={t(\n 'Awaiting for an approval to share your video.',\n )}\n messageRevoked={t('You can no longer share your video.')}\n >\n <CompositeButton Menu={Menu} active={isMute} caption={caption}>\n <IconButton\n icon={isMute ? 'camera-off' : 'camera'}\n onClick={async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await camera.toggle();\n }\n }}\n />\n </CompositeButton>\n </PermissionNotification>\n </Restricted>\n );\n};\n","import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button/';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: () => void;\n};\n\nexport const CancelCallButton = ({\n disabled,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n await call.leave();\n onLeave?.();\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-end\"\n variant=\"danger\"\n onClick={handleClick}\n />\n );\n};\n","import { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { CallStatsButton } from './CallStatsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: () => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <RecordCallButton />\n <CallStatsButton />\n <ScreenShareButton />\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n <ToggleVideoPublishingButton />\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n","import { useEffect } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type ReactionProps = {\n participant: StreamVideoParticipant;\n hideAfterTimeoutInMs?: number;\n emojiReactionMap?: Record<string, string>;\n};\n\nexport const defaultEmojiReactionMap: Record<string, string> = {\n ':like:': '👍',\n ':raise-hand:': '✋',\n ':fireworks:': '🎉',\n ':dislike:': '👎',\n ':heart:': '❤️',\n ':smile:': '😀',\n};\n\nexport const Reaction = ({\n participant: { reaction, sessionId },\n hideAfterTimeoutInMs = 5500,\n emojiReactionMap = defaultEmojiReactionMap,\n}: ReactionProps) => {\n const call = useCall();\n\n useEffect(() => {\n if (!call || !reaction) return;\n\n const timeoutId = setTimeout(() => {\n call.resetReaction(sessionId);\n }, hideAfterTimeoutInMs);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [call, hideAfterTimeoutInMs, reaction, sessionId]);\n\n if (!reaction) return null;\n\n const { emoji_code: emojiCode } = reaction;\n\n return (\n <div className=\"str-video__reaction\">\n <span className=\"str-video__reaction__emoji\">\n {emojiCode && emojiReactionMap[emojiCode]}\n </span>\n </div>\n );\n};\n","import { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport { CompositeButton, IconButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n const { t } = useI18n();\n\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <CompositeButton\n active={false}\n caption={t('Reactions')}\n menuPlacement=\"top-start\"\n Menu={<DefaultReactionsMenu reactions={reactions} />}\n >\n <IconButton\n icon=\"reactions\"\n title={t('Reactions')}\n onClick={() => {\n console.log('Reactions');\n }}\n />\n </CompositeButton>\n </Restricted>\n );\n};\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n return (\n <div className=\"str-video__reactions-menu\">\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n","import { CompositeButton, IconButton } from '../Button';\nimport { DeviceSelectorAudioOutput } from '../DeviceSettings';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport { ComponentType } from 'react';\n\nexport type ToggleAudioOutputButtonProps = {\n caption?: string;\n Menu?: ComponentType;\n};\n\nexport const ToggleAudioOutputButton = (\n props: ToggleAudioOutputButtonProps,\n) => {\n const { t } = useI18n();\n const { caption = t('Speakers'), Menu = DeviceSelectorAudioOutput } = props;\n\n return (\n <CompositeButton Menu={Menu} caption={caption}>\n <IconButton icon=\"speaker\" />\n </CompositeButton>\n );\n};\n","import { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { OwnCapability } from '@stream-io/video-client';\n\nimport { TextButton } from '../Button';\n\nexport const BlockedUserListing = ({ data }: { data: string[] }) => {\n if (!data.length) return null;\n\n return (\n <>\n <div className=\"str-video__participant-listing\">\n {data.map((userId) => (\n <BlockedUserListingItem key={userId} userId={userId} />\n ))}\n </div>\n </>\n );\n};\n\nconst BlockedUserListingItem = ({ userId }: { userId: string }) => {\n const call = useCall();\n\n const unblockUserClickHandler = () => {\n if (userId) call?.unblockUser(userId);\n };\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <div className=\"str-video__participant-listing-item__display-name\">\n {userId}\n </div>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <TextButton onClick={unblockUserClickHandler}>Unblock</TextButton>\n </Restricted>\n </div>\n );\n};\n","import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\n\nexport type CallParticipantListHeaderProps = {\n /** Click event listener function to be invoked in order to dismiss / hide the CallParticipantsList from the UI */\n onClose: () => void;\n};\n\nexport const CallParticipantListHeader = ({\n onClose,\n}: CallParticipantListHeaderProps) => {\n const { useParticipants, useAnonymousParticipantCount } = useCallStateHooks();\n const participants = useParticipants();\n const anonymousParticipantCount = useAnonymousParticipantCount();\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-list-header\">\n <div className=\"str-video__participant-list-header__title\">\n {t('Participants')}{' '}\n <span className=\"str-video__participant-list-header__title-count\">\n ({participants.length})\n </span>\n {anonymousParticipantCount > 0 && (\n <span className=\"str-video__participant-list-header__title-anonymous\">\n {t('Anonymous', { count: anonymousParticipantCount })}\n </span>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"str-video__participant-list-header__close-button\"\n >\n <span className=\"str-video__participant-list-header__close-button--icon\" />\n </button>\n </div>\n );\n};\n","import clsx from 'clsx';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n useEffect,\n useState,\n} from 'react';\nimport {\n Restricted,\n useCall,\n useConnectedUser,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport {\n OwnCapability,\n SfuModels,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport { IconButton } from '../Button';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n MenuToggle,\n ToggleMenuButtonProps,\n} from '../Menu';\nimport { WithTooltip } from '../Tooltip';\nimport { Icon } from '../Icon';\n\ntype CallParticipantListingItemProps = {\n /** Participant object be rendered */\n participant: StreamVideoParticipant;\n /** Custom component used to display participant's name */\n DisplayName?: ComponentType<{ participant: StreamVideoParticipant }>;\n};\nexport const CallParticipantListingItem = ({\n participant,\n DisplayName = DefaultDisplayName,\n}: CallParticipantListingItemProps) => {\n const isAudioOn = participant.publishedTracks.includes(\n SfuModels.TrackType.AUDIO,\n );\n const isVideoOn = participant.publishedTracks.includes(\n SfuModels.TrackType.VIDEO,\n );\n const isPinned = !!participant.pin;\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__participant-listing-item\">\n <DisplayName participant={participant} />\n <div className=\"str-video__participant-listing-item__media-indicator-group\">\n <MediaIndicator\n title={isAudioOn ? t('Microphone on') : t('Microphone off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isAudioOn ? 'mic' : 'mic-off'\n }`,\n )}\n />\n <MediaIndicator\n title={isVideoOn ? t('Camera on') : t('Camera off')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n `str-video__participant-listing-item__icon-${\n isVideoOn ? 'camera' : 'camera-off'\n }`,\n )}\n />\n {isPinned && (\n <MediaIndicator\n title={t('Pinned')}\n className={clsx(\n 'str-video__participant-listing-item__icon',\n 'str-video__participant-listing-item__icon-pinned',\n )}\n />\n )}\n\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <ParticipantActionsContextMenu participant={participant} />\n </MenuToggle>\n </div>\n </div>\n );\n};\n\nconst MediaIndicator = (props: ComponentProps<'div'>) => (\n <WithTooltip {...props} />\n);\n\ntype DisplayNameProps = {\n /** Participant object that provides the data from which display name can be generated */\n participant: StreamVideoParticipant;\n};\n// todo: implement display device flag\nconst DefaultDisplayName = ({ participant }: DisplayNameProps) => {\n const connectedUser = useConnectedUser();\n const { t } = useI18n();\n\n const meFlag = participant.userId === connectedUser?.id ? t('Me') : '';\n const nameOrId = participant.name || participant.userId || t('Unknown');\n let displayName;\n if (!participant.name) {\n displayName = meFlag || nameOrId || t('Unknown');\n } else if (meFlag) {\n displayName = `${nameOrId} (${meFlag})`;\n } else {\n displayName = nameOrId;\n }\n\n return (\n <WithTooltip\n className=\"str-video__participant-listing-item__display-name\"\n title={displayName}\n >\n {displayName}\n </WithTooltip>\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n (props, ref) => {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n\nexport const ParticipantActionsContextMenu = ({\n participant,\n participantViewElement,\n videoElement,\n}: {\n participant: StreamVideoParticipant;\n participantViewElement?: HTMLDivElement | null;\n videoElement?: HTMLVideoElement | null;\n}) => {\n const [fullscreenModeOn, setFullscreenModeOn] = useState(\n !!document.fullscreenElement,\n );\n const [pictureInPictureElement, setPictureInPictureElement] = useState(\n document.pictureInPictureElement,\n );\n const call = useCall();\n const { t } = useI18n();\n\n const { pin, publishedTracks, sessionId, userId } = participant;\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const hasVideo = publishedTracks.includes(SfuModels.TrackType.VIDEO);\n const hasScreenShare = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE,\n );\n const hasScreenShareAudio = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE_AUDIO,\n );\n\n const blockUser = () => call?.blockUser(userId);\n const muteAudio = () => call?.muteUser(userId, 'audio');\n const muteVideo = () => call?.muteUser(userId, 'video');\n const muteScreenShare = () => call?.muteUser(userId, 'screenshare');\n const muteScreenShareAudio = () =>\n call?.muteUser(userId, 'screenshare_audio');\n\n const grantPermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n grant_permissions: [permission],\n });\n };\n\n const revokePermission = (permission: string) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n revoke_permissions: [permission],\n });\n };\n\n const toggleParticipantPinnedAt = () => {\n if (pin) {\n call?.unpin(sessionId);\n } else {\n call?.pin(sessionId);\n }\n };\n\n const pinForEveryone = () => {\n call\n ?.pinForEveryone({\n user_id: userId,\n session_id: sessionId,\n })\n .catch((err) => {\n console.error(`Failed to pin participant ${userId}`, err);\n });\n };\n\n const unpinForEveryone = () => {\n call\n ?.unpinForEveryone({\n user_id: userId,\n session_id: sessionId,\n })\n .catch((err) => {\n console.error(`Failed to unpin participant ${userId}`, err);\n });\n };\n\n const toggleFullscreenMode = () => {\n if (!fullscreenModeOn) {\n return participantViewElement\n ?.requestFullscreen()\n .then(() => setFullscreenModeOn(true))\n .catch(console.error);\n }\n\n document\n .exitFullscreen()\n .catch(console.error)\n .finally(() => setFullscreenModeOn(false));\n };\n\n useEffect(() => {\n // handles the case when fullscreen mode is toggled externally,\n // e.g., by pressing ESC key or some other keyboard shortcut\n const handleFullscreenChange = () => {\n setFullscreenModeOn(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n useEffect(() => {\n if (!videoElement) return;\n\n const handlePictureInPicture = () => {\n setPictureInPictureElement(document.pictureInPictureElement);\n };\n\n videoElement.addEventListener(\n 'enterpictureinpicture',\n handlePictureInPicture,\n );\n videoElement.addEventListener(\n 'leavepictureinpicture',\n handlePictureInPicture,\n );\n\n return () => {\n videoElement.removeEventListener(\n 'enterpictureinpicture',\n handlePictureInPicture,\n );\n videoElement.removeEventListener(\n 'leavepictureinpicture',\n handlePictureInPicture,\n );\n };\n }, [videoElement]);\n\n const togglePictureInPicture = () => {\n if (videoElement && pictureInPictureElement !== videoElement) {\n return videoElement\n .requestPictureInPicture()\n .catch(console.error) as Promise<void>;\n }\n\n document.exitPictureInPicture().catch(console.error);\n };\n\n return (\n <GenericMenu>\n <GenericMenuButtonItem\n onClick={toggleParticipantPinnedAt}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {pin ? t('Unpin') : t('Pin')}\n </GenericMenuButtonItem>\n <Restricted requiredGrants={[OwnCapability.PIN_FOR_EVERYONE]}>\n <GenericMenuButtonItem\n onClick={pinForEveryone}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Pin for everyone')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={unpinForEveryone}\n disabled={!pin || pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Unpin for everyone')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <GenericMenuButtonItem onClick={blockUser}>\n <Icon icon=\"not-allowed\" />\n {t('Block')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.MUTE_USERS]}>\n <GenericMenuButtonItem disabled={!hasVideo} onClick={muteVideo}>\n <Icon icon=\"camera-off-outline\" />\n {t('Turn off video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n disabled={!hasScreenShare}\n onClick={muteScreenShare}\n >\n <Icon icon=\"screen-share-off\" />\n {t('Turn off screen share')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem disabled={!hasAudio} onClick={muteAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n disabled={!hasScreenShareAudio}\n onClick={muteScreenShareAudio}\n >\n <Icon icon=\"no-audio\" />\n {t('Mute screen share audio')}\n </GenericMenuButtonItem>\n </Restricted>\n {participantViewElement && (\n <GenericMenuButtonItem onClick={toggleFullscreenMode}>\n {t('{{ direction }} fullscreen', {\n direction: fullscreenModeOn ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n {videoElement && document.pictureInPictureEnabled && (\n <GenericMenuButtonItem onClick={togglePictureInPicture}>\n {t('{{ direction }} picture-in-picture', {\n direction:\n pictureInPictureElement === videoElement\n ? t('Leave')\n : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n <Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Allow audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Allow video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SCREENSHARE)}\n >\n {t('Allow screen sharing')}\n </GenericMenuButtonItem>\n\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Disable audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Disable video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SCREENSHARE)}\n >\n {t('Disable screen sharing')}\n </GenericMenuButtonItem>\n </Restricted>\n </GenericMenu>\n );\n};\n","import { ComponentType } from 'react';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport { CallParticipantListingItem } from './CallParticipantListingItem';\n\nexport type CallParticipantListingProps = {\n /** Array of participant objects to be rendered */\n data: StreamVideoParticipant[];\n Header?: ComponentType;\n};\n\nexport const CallParticipantListing = ({\n data,\n}: CallParticipantListingProps) => (\n <div className=\"str-video__participant-listing\">\n {data.map((participant) => (\n <CallParticipantListingItem\n key={participant.sessionId}\n participant={participant}\n />\n ))}\n </div>\n);\n","import { useI18n } from '@stream-io/video-react-bindings';\n\nexport const EmptyParticipantSearchList = () => {\n const { t } = useI18n();\n return (\n <div className=\"str-video__participant-list--empty\">\n {t('No participants found')}\n </div>\n );\n};\n","import { ComponentProps, useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\ntype SearchInputProps = ComponentProps<'input'> & {\n /**\n * Resets the search to its initial state.\n * The function is called when Esc key or inputs clear button are pressed\n */\n exitSearch: () => void;\n /**\n * Flag to signal, whether search input elements should be rendered as active\n */\n isActive: boolean;\n};\nexport const SearchInput = ({\n exitSearch,\n isActive,\n ...rest\n}: SearchInputProps) => {\n const [inputElement, setInputElement] = useState<HTMLInputElement | null>(\n null,\n );\n useEffect(() => {\n if (!inputElement) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() === 'escape') exitSearch();\n };\n\n inputElement.addEventListener('keydown', handleKeyDown);\n\n return () => {\n inputElement.removeEventListener('keydown', handleKeyDown);\n };\n }, [exitSearch, inputElement]);\n\n return (\n <div\n className={clsx('str-video__search-input__container', {\n 'str-video__search-input__container--active': isActive,\n })}\n >\n <input placeholder=\"Search\" {...rest} ref={setInputElement} />\n {isActive ? (\n <button\n className=\"str-video__search-input__clear-btn\"\n onClick={exitSearch}\n >\n <span className=\"str-video__search-input__icon--active\" />\n </button>\n ) : (\n <span className=\"str-video__search-input__icon\" />\n )}\n </div>\n );\n};\n","import { ComponentType } from 'react';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../LoadingIndicator';\nimport { SearchController } from './hooks';\n\nexport type SearchResultListProps<T> = {\n data: T[];\n};\n\nexport type SearchResultsProps<T> = Pick<\n SearchController<T>,\n 'searchResults' | 'searchQueryInProgress'\n> & {\n /** Component to be displayed, when empty array of search results is provided */\n EmptySearchResultComponent: ComponentType;\n /** Component will be used to render non-empty array of search results */\n SearchResultList: ComponentType<SearchResultListProps<T>>;\n /** Component to be displayed while the search query request is in progress */\n LoadingIndicator?: ComponentType;\n};\n\nexport const SearchResults = <T extends unknown>({\n EmptySearchResultComponent,\n LoadingIndicator = DefaultLoadingIndicator,\n searchQueryInProgress,\n searchResults,\n SearchResultList,\n}: SearchResultsProps<T>) => {\n if (searchQueryInProgress) {\n return (\n <div className=\"str-video__search-results--loading\">\n <LoadingIndicator />\n </div>\n );\n }\n if (!searchResults.length) {\n return <EmptySearchResultComponent />;\n }\n\n return <SearchResultList data={searchResults} />;\n};\n","import { useEffect, useState } from 'react';\n\nexport type SearchController<T> = {\n /** Flag signals that the search request is flight await the response */\n searchQueryInProgress: boolean;\n /** Array of items returned by the search query */\n searchResults: T[];\n};\n\nexport type UseSearchParams<T> = {\n /** Search function performing the search request */\n searchFn: (searchQuery: string) => Promise<T[]>;\n /** Debounce interval applied to the search function */\n debounceInterval: number;\n /** Search query string */\n searchQuery?: string;\n};\n\nexport const useSearch = <T>({\n debounceInterval,\n searchFn,\n searchQuery = '',\n}: UseSearchParams<T>): SearchController<T> => {\n const [searchResults, setSearchResults] = useState<T[]>([]);\n const [searchQueryInProgress, setSearchQueryInProgress] = useState(false);\n\n useEffect(() => {\n if (!searchQuery.length) return setSearchResults([]);\n\n setSearchQueryInProgress(true);\n\n const timeout = setTimeout(async () => {\n try {\n const results = await searchFn(searchQuery);\n setSearchResults(results);\n } catch (error) {\n console.error(error);\n } finally {\n setSearchQueryInProgress(false);\n }\n }, debounceInterval);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [debounceInterval, searchFn, searchQuery]);\n\n return {\n searchQueryInProgress,\n searchResults,\n };\n};\n","import {\n ComponentProps,\n Dispatch,\n ForwardedRef,\n forwardRef,\n SetStateAction,\n useCallback,\n useState,\n} from 'react';\nimport {\n Restricted,\n useCall,\n useCallStateHooks,\n} from '@stream-io/video-react-bindings';\nimport {\n name,\n OwnCapability,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\n\nimport { BlockedUserListing } from './BlockedUserListing';\nimport {\n CopyToClipboardButtonWithPopup,\n IconButton,\n TextButton,\n} from '../Button';\nimport { CallParticipantListHeader } from './CallParticipantListHeader';\nimport { CallParticipantListing } from './CallParticipantListing';\nimport { EmptyParticipantSearchList } from './EmptyParticipantSearchList';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { SearchInput, SearchResults } from '../Search';\nimport { useSearch, UseSearchParams } from '../Search/hooks';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n MenuToggle,\n ToggleMenuButtonProps,\n} from '../Menu';\n\ntype CallParticipantListProps = {\n /** Click event listener function to be invoked in order to dismiss/hide the CallParticipantsList from the UI */\n onClose: () => void;\n /** Custom function to override the searching logic of active participants */\n activeUsersSearchFn?: UseSearchParams<StreamVideoParticipant>['searchFn'];\n /** Custom function to override the searching logic of blocked users */\n blockedUsersSearchFn?: UseSearchParams<string>['searchFn'];\n /** Interval in ms, during which the participant search calls will be debounced. The default value is 200ms. */\n debounceSearchInterval?: number;\n};\n\nconst UserListTypes = {\n active: 'Active users',\n blocked: 'Blocked users',\n} as const;\n\nconst DEFAULT_DEBOUNCE_SEARCH_INTERVAL = 200 as const;\n\nexport const CallParticipantsList = ({\n onClose,\n activeUsersSearchFn,\n blockedUsersSearchFn,\n debounceSearchInterval,\n}: CallParticipantListProps) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [userListType, setUserListType] =\n useState<keyof typeof UserListTypes>('active');\n\n const exitSearch = useCallback(() => setSearchQuery(''), []);\n\n return (\n <div className=\"str-video__participant-list\">\n <CallParticipantListHeader onClose={onClose} />\n <SearchInput\n value={searchQuery}\n onChange={({ currentTarget }) => setSearchQuery(currentTarget.value)}\n exitSearch={exitSearch}\n isActive={!!searchQuery}\n />\n <CallParticipantListContentHeader\n userListType={userListType}\n setUserListType={setUserListType}\n />\n <div className=\"str-video__participant-list__content\">\n {userListType === 'active' && (\n <ActiveUsersSearchResults\n searchQuery={searchQuery}\n activeUsersSearchFn={activeUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n {userListType === 'blocked' && (\n <BlockedUsersSearchResults\n searchQuery={searchQuery}\n blockedUsersSearchFn={blockedUsersSearchFn}\n debounceSearchInterval={debounceSearchInterval}\n />\n )}\n </div>\n <div className=\"str-video__participant-list__footer\">\n <CopyToClipboardButtonWithPopup\n Button={InviteLinkButton}\n copyValue={typeof window !== 'undefined' ? window.location.href : ''}\n />\n </div>\n </div>\n );\n};\n\nconst CallParticipantListContentHeader = ({\n userListType,\n setUserListType,\n}: {\n userListType: keyof typeof UserListTypes;\n setUserListType: Dispatch<SetStateAction<keyof typeof UserListTypes>>;\n}) => {\n const call = useCall();\n\n const muteAll = () => {\n call?.muteAllUsers('audio');\n };\n\n return (\n <div className=\"str-video__participant-list__content-header\">\n <div className=\"str-video__participant-list__content-header-title\">\n <span>{UserListTypes[userListType]}</span>\n {userListType === 'active' && (\n <Restricted\n requiredGrants={[OwnCapability.MUTE_USERS]}\n hasPermissionsOnly\n >\n <TextButton onClick={muteAll}>Mute all</TextButton>\n </Restricted>\n )}\n </div>\n <MenuToggle placement=\"bottom-end\" ToggleButton={ToggleButton}>\n <GenericMenu>\n {(\n Object.keys(UserListTypes) as Array<keyof typeof UserListTypes>\n ).map((lt) => (\n <GenericMenuButtonItem\n key={lt}\n aria-selected={lt === userListType}\n onClick={() => setUserListType(lt)}\n >\n {UserListTypes[lt]}\n </GenericMenuButtonItem>\n ))}\n </GenericMenu>\n </MenuToggle>\n </div>\n );\n};\n\nconst ActiveUsersSearchResults = ({\n searchQuery,\n activeUsersSearchFn: activeUsersSearchFnFromProps,\n debounceSearchInterval = DEFAULT_DEBOUNCE_SEARCH_INTERVAL,\n}: Pick<\n CallParticipantListProps,\n 'activeUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useParticipants } = useCallStateHooks();\n const participants = useParticipants({ sortBy: name });\n\n const activeUsersSearchFn = useCallback(\n (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return Promise.resolve(\n participants.filter((participant) => {\n return participant.name.match(queryRegExp);\n }),\n );\n },\n [participants],\n );\n\n const { searchQueryInProgress, searchResults } =\n useSearch<StreamVideoParticipant>({\n searchFn: activeUsersSearchFnFromProps ?? activeUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<StreamVideoParticipant>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : participants}\n SearchResultList={CallParticipantListing}\n />\n );\n};\n\nconst BlockedUsersSearchResults = ({\n blockedUsersSearchFn: blockedUsersSearchFnFromProps,\n debounceSearchInterval = DEFAULT_DEBOUNCE_SEARCH_INTERVAL,\n searchQuery,\n}: Pick<\n CallParticipantListProps,\n 'blockedUsersSearchFn' | 'debounceSearchInterval'\n> & { searchQuery: string }) => {\n const { useCallBlockedUserIds } = useCallStateHooks();\n const blockedUsers = useCallBlockedUserIds();\n\n const blockedUsersSearchFn = useCallback(\n (queryString: string) => {\n const queryRegExp = new RegExp(queryString, 'i');\n return Promise.resolve(\n blockedUsers.filter((blockedUser) => {\n return blockedUser.match(queryRegExp);\n }),\n );\n },\n [blockedUsers],\n );\n\n const { searchQueryInProgress, searchResults } = useSearch<string>({\n searchFn: blockedUsersSearchFnFromProps ?? blockedUsersSearchFn,\n debounceInterval: debounceSearchInterval,\n searchQuery,\n });\n\n return (\n <SearchResults<string>\n EmptySearchResultComponent={EmptyParticipantSearchList}\n LoadingIndicator={LoadingIndicator}\n searchQueryInProgress={searchQueryInProgress}\n searchResults={searchQuery ? searchResults : blockedUsers}\n SearchResultList={BlockedUserListing}\n />\n );\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n (props, ref) => {\n return <IconButton enabled={props.menuShown} icon=\"filter\" ref={ref} />;\n },\n);\n\nconst InviteLinkButton = forwardRef(\n (\n { className, ...props }: ComponentProps<'button'>,\n ref: ForwardedRef<HTMLButtonElement>,\n ) => (\n <button\n {...props}\n className={clsx('str-video__invite-link-button', className)}\n ref={ref}\n >\n <div className=\"str-video__invite-participant-icon\" />\n <div className=\"str-video__invite-link-button__text\">Invite Link</div>\n </button>\n ),\n);\n","import clsx from 'clsx';\nimport { CSSProperties, useEffect, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport type CallPreviewProps = {\n /**\n * Additional CSS class name to apply to the CallPreview element.\n */\n className?: string;\n\n /**\n * Additional CSS properties to apply to the CallPreview element.\n */\n style?: CSSProperties;\n};\n\nexport const CallPreview = (props: CallPreviewProps) => {\n const { className, style } = props;\n const call = useCall();\n const { useCallThumbnail } = useCallStateHooks();\n const thumbnail = useCallThumbnail();\n\n const [imageRef, setImageRef] = useState<HTMLImageElement | null>(null);\n useEffect(() => {\n if (!imageRef || !call) return;\n const cleanup = call.bindCallThumbnailElement(imageRef);\n return () => cleanup();\n }, [imageRef, call]);\n\n if (!thumbnail) return null;\n\n return (\n <img\n className={clsx('str-video__call-preview', className)}\n style={style}\n alt=\"Call Preview Thumbnail\"\n ref={setImageRef}\n />\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { IconButton } from '../Button';\n\nexport type CallRecordingListHeaderProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingListHeader = ({\n callRecordings,\n onRefresh,\n}: CallRecordingListHeaderProps) => {\n return (\n <div className=\"str-video__call-recording-list__header\">\n <div className=\"str-video__call-recording-list__title\">\n <span>Call Recordings</span>\n {callRecordings.length ? <span>({callRecordings.length})</span> : null}\n </div>\n <IconButton icon=\"refresh\" title=\"Refresh\" onClick={onRefresh} />\n </div>\n );\n};\n","import clsx from 'clsx';\nimport { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport { CallRecording } from '@stream-io/video-client';\nimport { CopyToClipboardButtonWithPopup } from '../Button';\n\nexport type CallRecordingListItemProps = {\n /** CallRecording object to represent */\n recording: CallRecording;\n};\nexport const CallRecordingListItem = ({\n recording,\n}: CallRecordingListItemProps) => {\n return (\n <div className=\"str-video__call-recording-list-item\">\n <div className=\"str-video__call-recording-list-item__info\">\n <div className=\"str-video__call-recording-list-item__created\">\n {new Date(recording.end_time).toLocaleString()}\n </div>\n </div>\n <div className=\"str-video__call-recording-list-item__actions\">\n <a\n className={clsx(\n 'str-video__call-recording-list-item__action-button',\n 'str-video__call-recording-list-item__action-button--download',\n )}\n role=\"button\"\n href={recording.url}\n download={recording.filename}\n title=\"Download the recording\"\n >\n <span\n className={clsx(\n 'str-video__call-recording-list-item__action-button-icon',\n 'str-video__download-button--icon',\n )}\n />\n </a>\n <CopyToClipboardButtonWithPopup\n Button={CopyUrlButton}\n copyValue={recording.url}\n />\n </div>\n </div>\n );\n};\nconst CopyUrlButton = forwardRef(\n (props: ComponentProps<'button'>, ref: ForwardedRef<HTMLButtonElement>) => {\n return (\n <button\n {...props}\n className={clsx(\n 'str-video__call-recording-list-item__action-button',\n 'str-video__call-recording-list-item__action-button--copy-link',\n )}\n ref={ref}\n title=\"Copy the recording link\"\n >\n <span\n className={clsx(\n 'str-video__call-recording-list-item__action-button-icon',\n 'str-video__copy-button--icon',\n )}\n />\n </button>\n );\n },\n);\n","export const EmptyCallRecordingListing = () => {\n return (\n <div className=\"str-video__call-recording-list__listing str-video__call-recording-list__listing--empty\">\n <div className=\"str-video__call-recording-list__listing--icon-empty\" />\n <p className=\"str-video__call-recording-list__listing--text-empty\">\n {/* todo: introduce i18n to enable text customization */}\n No recordings available\n </p>\n </div>\n );\n};\n","import { CallRecording } from '@stream-io/video-client';\nimport { CallRecordingListItem } from './CallRecordingListItem';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nexport type LoadingCallRecordingListProps = {\n /** Array of CallRecording objects */\n callRecordings: CallRecording[];\n};\n\nexport const LoadingCallRecordingListing = ({\n callRecordings,\n}: LoadingCallRecordingListProps) => {\n return (\n <>\n {callRecordings.map((recording) => (\n <CallRecordingListItem recording={recording} key={recording.filename} />\n ))}\n <LoadingIndicator text=\"Recording getting ready\" />\n </>\n );\n};\n","import { ComponentType } from 'react';\nimport { CallRecording } from '@stream-io/video-client';\n\nimport {\n CallRecordingListHeader as DefaultCallRecordingListHeader,\n CallRecordingListHeaderProps,\n} from './CallRecordingListHeader';\nimport {\n CallRecordingListItem as DefaultCallRecordingListItem,\n CallRecordingListItemProps,\n} from './CallRecordingListItem';\nimport { EmptyCallRecordingListing as DefaultEmptyCallRecordingList } from './EmptyCallRecordingListing';\nimport {\n LoadingCallRecordingListing as DefaultLoadingCallRecordingList,\n LoadingCallRecordingListProps,\n} from './LoadingCallRecordingListing';\n\nexport type CallRecordingListProps = {\n /** Array of CallRecording objects to be displayed */\n callRecordings: CallRecording[];\n /** Custom component to replace the default header implementation */\n CallRecordingListHeader?: ComponentType<CallRecordingListHeaderProps>;\n /** Custom component to replace the default list item implementation */\n CallRecordingListItem?: ComponentType<CallRecordingListItemProps>;\n /** Custom component to replace the default empty list component implementation */\n EmptyCallRecordingList?: ComponentType;\n /** Signals that a request for new list of CallRecording object has been initiated */\n loading?: boolean;\n /** Custom component to be rendered when loading is true */\n LoadingCallRecordingList?: ComponentType<LoadingCallRecordingListProps>;\n /** Callback to be invoked when the refresh button is clicked */\n onRefresh?: () => void;\n};\n\nexport const CallRecordingList = ({\n callRecordings,\n CallRecordingListHeader = DefaultCallRecordingListHeader,\n CallRecordingListItem = DefaultCallRecordingListItem,\n EmptyCallRecordingList = DefaultEmptyCallRecordingList,\n loading,\n LoadingCallRecordingList = DefaultLoadingCallRecordingList,\n onRefresh,\n}: CallRecordingListProps) => {\n return (\n <div className=\"str-video__call-recording-list\">\n <CallRecordingListHeader\n callRecordings={callRecordings}\n onRefresh={onRefresh}\n />\n <div className=\"str-video__call-recording-list__listing\">\n {loading ? (\n <LoadingCallRecordingList callRecordings={callRecordings} />\n ) : callRecordings.length ? (\n callRecordings.map((recording) => (\n <CallRecordingListItem\n recording={recording}\n key={recording.filename}\n />\n ))\n ) : (\n <EmptyCallRecordingList />\n )}\n </div>\n </div>\n );\n};\n","import { CallingState } from '@stream-io/video-client';\nimport { AcceptCallButton, CancelCallButton } from '../CallControls';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nexport const RingingCallControls = () => {\n const call = useCall();\n const { useCallCallingState } = useCallStateHooks();\n const callCallingState = useCallCallingState();\n\n if (!call) return null;\n\n const buttonsDisabled = callCallingState !== CallingState.RINGING;\n return (\n <div className=\"str-video__pending-call-controls\">\n {call.isCreatedByMe ? (\n <CancelCallButton disabled={buttonsDisabled} />\n ) : (\n <>\n <AcceptCallButton disabled={buttonsDisabled} />\n <CancelCallButton\n onClick={() => call.leave({ reject: true })}\n disabled={buttonsDisabled}\n />\n </>\n )}\n </div>\n );\n};\n","import { CallingState, UserResponse } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useConnectedUser,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { Avatar } from '../Avatar';\nimport { RingingCallControls } from './RingingCallControls';\n\nconst CALLING_STATE_TO_LABEL: Record<CallingState, string> = {\n [CallingState.JOINING]: 'Joining',\n [CallingState.RINGING]: 'Ringing',\n [CallingState.MIGRATING]: 'Migrating',\n [CallingState.RECONNECTING]: 'Re-connecting',\n [CallingState.RECONNECTING_FAILED]: 'Failed',\n [CallingState.OFFLINE]: 'No internet connection',\n [CallingState.IDLE]: '',\n [CallingState.UNKNOWN]: '',\n [CallingState.JOINED]: 'Joined',\n [CallingState.LEFT]: 'Left call',\n};\n\nexport type RingingCallProps = {\n /**\n * Whether to include the current user in the list of members to show.\n * @default false.\n */\n includeSelf?: boolean;\n\n /**\n * The maximum number of members to show.\n * @default 3.\n */\n totalMembersToShow?: number;\n};\n\nexport const RingingCall = (props: RingingCallProps) => {\n const { includeSelf = false, totalMembersToShow = 3 } = props;\n const call = useCall();\n const { t } = useI18n();\n const { useCallCallingState, useCallMembers } = useCallStateHooks();\n const callingState = useCallCallingState();\n const members = useCallMembers();\n const connectedUser = useConnectedUser();\n\n if (!call) return null;\n\n // take the first N members to show their avatars\n const membersToShow: UserResponse[] = (members || [])\n .slice(0, totalMembersToShow)\n .map(({ user }) => user)\n .filter((user) => user.id !== connectedUser?.id || includeSelf);\n if (\n includeSelf &&\n !membersToShow.find((user) => user.id === connectedUser?.id)\n ) {\n // if the current user is not in the initial batch of members,\n // replace the first item in membersToShow array with the current user\n const self = members.find(({ user }) => user.id === connectedUser?.id);\n if (self) {\n membersToShow.splice(0, 1, self.user);\n }\n }\n\n const callingStateLabel = CALLING_STATE_TO_LABEL[callingState];\n\n return (\n <div className=\"str-video__call-panel str-video__call-panel--ringing\">\n <div className=\"str-video__call-panel__members-list\">\n {membersToShow.map((user) => (\n <div key={user.id} className=\"str-video__call-panel__member-box\">\n <Avatar name={user.name} imageSrc={user.image} />\n {user.name && (\n <div className=\"str-video__member_details\">\n <span className=\"str-video__member_name\">{user.name}</span>\n </div>\n )}\n </div>\n ))}\n </div>\n\n {callingStateLabel && (\n <div className=\"str-video__call-panel__calling-state-label\">\n {t(callingStateLabel)}\n </div>\n )}\n\n {[CallingState.RINGING, CallingState.JOINING].includes(callingState) && (\n <RingingCallControls />\n )}\n </div>\n );\n};\n","import {\n ButtonHTMLAttributes,\n ComponentProps,\n forwardRef,\n Fragment,\n PropsWithChildren,\n useEffect,\n useState,\n} from 'react';\nimport {\n OwnCapability,\n PermissionRequestEvent,\n StreamVideoEvent,\n UserResponse,\n} from '@stream-io/video-client';\nimport {\n TranslatorFunction,\n useCall,\n useCallStateHooks,\n useHasPermissions,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport { useFloatingUIPreset } from '../../hooks';\n\nconst byNameOrId = (a: UserResponse, b: UserResponse) => {\n if (a.name && b.name && a.name < b.name) return -1;\n if (a.name && b.name && a.name > b.name) return 1;\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1;\n return 0;\n};\n\ntype HandleUpdatePermission = (\n request: PermissionRequestEvent,\n type: 'grant' | 'revoke' | 'dismiss',\n) => () => Promise<void>;\n\nexport const PermissionRequests = () => {\n const call = useCall();\n const { useLocalParticipant } = useCallStateHooks();\n const localParticipant = useLocalParticipant();\n const [expanded, setExpanded] = useState(false);\n const [permissionRequests, setPermissionRequests] = useState<\n PermissionRequestEvent[]\n >([]);\n const canUpdateCallPermissions = useHasPermissions(\n OwnCapability.UPDATE_CALL_PERMISSIONS,\n );\n\n const localUserId = localParticipant?.userId;\n useEffect(() => {\n if (!call || !canUpdateCallPermissions) return;\n\n const unsubscribe = call.on(\n 'call.permission_request',\n (event: StreamVideoEvent) => {\n if (event.type !== 'call.permission_request') return;\n if (event.user.id !== localUserId) {\n setPermissionRequests((requests) =>\n [...requests, event as PermissionRequestEvent].sort((a, b) =>\n byNameOrId(a.user, b.user),\n ),\n );\n }\n },\n );\n return () => {\n unsubscribe();\n };\n }, [call, canUpdateCallPermissions, localUserId]);\n\n const handleUpdatePermission: HandleUpdatePermission = (request, type) => {\n return async () => {\n const { user, permissions } = request;\n switch (type) {\n case 'grant':\n await call?.grantPermissions(user.id, permissions);\n break;\n case 'revoke':\n await call?.revokePermissions(user.id, permissions);\n break;\n default:\n break;\n }\n setPermissionRequests((requests) =>\n requests.filter((r) => r !== request),\n );\n };\n };\n\n const { refs, x, y, strategy } = useFloatingUIPreset({\n placement: 'bottom',\n strategy: 'absolute',\n });\n\n // don't render anything if there are no permission requests\n if (permissionRequests.length === 0) return null;\n\n return (\n <div className=\"str-video__permission-requests\" ref={refs.setReference}>\n <div className=\"str-video__permission-requests__notification\">\n <span className=\"str-video__permission-requests__notification__message\">\n {permissionRequests.length} pending permission requests\n </span>\n <Button\n type=\"button\"\n onClick={() => {\n setExpanded((e) => !e);\n }}\n >\n {expanded ? 'Hide requests' : 'Show requests'}\n </Button>\n </div>\n {expanded && (\n <PermissionRequestList\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n overflowY: 'auto',\n }}\n permissionRequests={permissionRequests}\n handleUpdatePermission={handleUpdatePermission}\n />\n )}\n </div>\n );\n};\n\nexport type PermissionRequestListProps = ComponentProps<'div'> & {\n permissionRequests: PermissionRequestEvent[];\n handleUpdatePermission: HandleUpdatePermission;\n};\n\nexport const PermissionRequestList = forwardRef<\n HTMLDivElement,\n PermissionRequestListProps\n>((props, ref) => {\n const { permissionRequests, handleUpdatePermission, ...rest } = props;\n\n const { t } = useI18n();\n\n return (\n <div className=\"str-video__permission-requests-list\" ref={ref} {...rest}>\n {permissionRequests.map((request, reqIndex) => {\n const { user, permissions } = request;\n return (\n <Fragment key={`${user.id}/${reqIndex}`}>\n {permissions.map((permission) => (\n <div className=\"str-video__permission-request\" key={permission}>\n <div className=\"str-video__permission-request__message\">\n {messageForPermission(user.name || user.id, permission, t)}\n </div>\n <Button\n className=\"str-video__permission-request__button--allow\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'grant')}\n >\n {t('Allow')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'revoke')}\n >\n {t('Revoke')}\n </Button>\n <Button\n className=\"str-video__permission-request__button--reject\"\n type=\"button\"\n onClick={handleUpdatePermission(request, 'dismiss')}\n >\n {t('Dismiss')}\n </Button>\n </div>\n ))}\n </Fragment>\n );\n })}\n </div>\n );\n});\n\nconst Button = (\n props: PropsWithChildren<ButtonHTMLAttributes<HTMLButtonElement>>,\n) => {\n const { className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__permission-request__button', className)}\n {...rest}\n />\n );\n};\n\nconst messageForPermission = (\n userName: string,\n permission: string,\n t: TranslatorFunction,\n) => {\n switch (permission) {\n case OwnCapability.SEND_AUDIO:\n return t('{{ userName }} is requesting to speak', { userName });\n case OwnCapability.SEND_VIDEO:\n return t('{{ userName }} is requesting to share their camera', {\n userName,\n });\n case OwnCapability.SCREENSHARE:\n return t('{{ userName }} is requesting to present their screen', {\n userName,\n });\n default:\n return t('{{ userName }} is requesting permission: {{ permission }}', {\n userName,\n permission,\n });\n }\n};\n","import { ElementType, HTMLProps, PropsWithChildren } from 'react';\nimport clsx from 'clsx';\n\nexport type StreamThemeProps = HTMLProps<HTMLElement> & {\n as?: ElementType;\n};\n\nexport const StreamTheme = ({\n as: Component = 'div',\n className,\n children,\n ...props\n}: PropsWithChildren<StreamThemeProps>) => {\n return (\n <Component {...props} className={clsx('str-video', className)}>\n {children}\n </Component>\n );\n};\n","import { ComponentType } from 'react';\nimport clsx from 'clsx';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { BaseVideo } from '../../core/components/Video';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nconst DefaultDisabledVideoPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__disabled-video-preview\">\n {t('Video is disabled')}\n </div>\n );\n};\n\nconst DefaultNoCameraPreview = () => {\n const { t } = useI18n();\n return (\n <div className=\"str_video__video-preview__no-camera-preview\">\n {t('No camera found')}\n </div>\n );\n};\n\nexport type VideoPreviewProps = {\n /**\n * Additional CSS class name to apply to the root element.\n */\n className?: string;\n /**\n * Enforces mirroring of the video on the X axis. Defaults to true.\n */\n mirror?: boolean;\n /**\n * Component rendered when user turns off the video.\n */\n DisabledVideoPreview?: ComponentType;\n /**\n * Component rendered when no camera devices are available.\n */\n NoCameraPreview?: ComponentType;\n /**\n * Component rendered above the BaseVideo until the video is ready (meaning until the play event is emitted).\n */\n StartingCameraPreview?: ComponentType;\n};\n\nexport const VideoPreview = ({\n className,\n mirror = true,\n DisabledVideoPreview = DefaultDisabledVideoPreview,\n NoCameraPreview = DefaultNoCameraPreview,\n StartingCameraPreview = LoadingIndicator,\n}: VideoPreviewProps) => {\n const { useCameraState } = useCallStateHooks();\n const { devices, status, isMute, mediaStream } = useCameraState();\n\n let contents;\n if (isMute && devices?.length === 0) {\n contents = <NoCameraPreview />;\n } else if (status === 'enabled') {\n const loading = !mediaStream;\n contents = (\n <>\n {mediaStream && (\n <BaseVideo\n stream={mediaStream}\n className={clsx('str-video__video-preview', {\n 'str-video__video-preview--mirror': mirror,\n 'str-video__video-preview--loading': loading,\n })}\n />\n )}\n {loading && <StartingCameraPreview />}\n </>\n );\n } else {\n contents = <DisabledVideoPreview />;\n }\n\n return (\n <div className={clsx('str-video__video-preview-container', className)}>\n {contents}\n </div>\n );\n};\n","import { createContext, useContext } from 'react';\nimport { ParticipantViewProps } from './ParticipantView';\n\nexport type ParticipantViewContextValue = Required<\n Pick<ParticipantViewProps, 'participant' | 'trackType'>\n> & {\n participantViewElement: HTMLDivElement | null;\n videoElement: HTMLVideoElement | null;\n videoPlaceholderElement: HTMLDivElement | null;\n};\n\nexport const ParticipantViewContext = createContext<\n ParticipantViewContextValue | undefined\n>(undefined);\n\nexport const useParticipantViewContext = () =>\n useContext(ParticipantViewContext) as ParticipantViewContextValue;\n","import { forwardRef } from 'react';\nimport { Placement } from '@floating-ui/react';\nimport { SfuModels } from '@stream-io/video-client';\nimport { useCall, useI18n } from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\n\nimport {\n Icon,\n IconButton,\n MenuToggle,\n Notification,\n ParticipantActionsContextMenu,\n ToggleMenuButtonProps,\n} from '../../../components';\nimport { Reaction } from '../../../components/Reaction';\nimport { useParticipantViewContext } from './ParticipantViewContext';\n\nexport type DefaultParticipantViewUIProps = {\n /**\n * Turns on/off the status indicator icons (mute, connection quality, etc...).\n */\n indicatorsVisible?: boolean;\n /**\n * Placement of the context menu component when opened\n */\n menuPlacement?: Placement;\n /**\n * Option to show/hide menu button component\n */\n showMenuButton?: boolean;\n};\n\nconst ToggleButton = forwardRef<HTMLButtonElement, ToggleMenuButtonProps>(\n (props, ref) => {\n return <IconButton enabled={props.menuShown} icon=\"ellipsis\" ref={ref} />;\n },\n);\n\nexport const DefaultScreenShareOverlay = () => {\n const call = useCall();\n const { t } = useI18n();\n\n const stopScreenShare = () => {\n call?.screenShare.disable();\n };\n\n return (\n <div className=\"str-video__screen-share-overlay\">\n <Icon icon=\"screen-share-off\" />\n <span className=\"str-video__screen-share-overlay__title\">\n {t('You are presenting your screen')}\n </span>\n <button\n onClick={stopScreenShare}\n className=\"str-video__screen-share-overlay__button\"\n >\n <Icon icon=\"close\" /> {t('Stop Screen Sharing')}\n </button>\n </div>\n );\n};\n\nexport const DefaultParticipantViewUI = ({\n indicatorsVisible = true,\n menuPlacement = 'bottom-end',\n showMenuButton = true,\n}: DefaultParticipantViewUIProps) => {\n const { participant, participantViewElement, trackType, videoElement } =\n useParticipantViewContext();\n const { publishedTracks } = participant;\n\n const hasScreenShare = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE,\n );\n\n if (\n participant.isLocalParticipant &&\n hasScreenShare &&\n trackType === 'screenShareTrack'\n ) {\n return (\n <>\n <DefaultScreenShareOverlay />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n }\n\n return (\n <>\n {showMenuButton && (\n <MenuToggle\n strategy=\"fixed\"\n placement={menuPlacement}\n ToggleButton={ToggleButton}\n >\n <ParticipantActionsContextMenu\n participantViewElement={participantViewElement}\n participant={participant}\n videoElement={videoElement}\n />\n </MenuToggle>\n )}\n <Reaction participant={participant} />\n <ParticipantDetails indicatorsVisible={indicatorsVisible} />\n </>\n );\n};\n\nexport const ParticipantDetails = ({\n indicatorsVisible = true,\n}: Pick<DefaultParticipantViewUIProps, 'indicatorsVisible'>) => {\n const { participant } = useParticipantViewContext();\n const {\n isDominantSpeaker,\n isLocalParticipant,\n connectionQuality,\n publishedTracks,\n pin,\n sessionId,\n name,\n userId,\n } = participant;\n const call = useCall();\n\n const { t } = useI18n();\n const connectionQualityAsString =\n !!connectionQuality &&\n SfuModels.ConnectionQuality[connectionQuality].toLowerCase();\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const hasVideo = publishedTracks.includes(SfuModels.TrackType.VIDEO);\n const canUnpin = !!pin && pin.isLocalPin;\n\n return (\n <div className=\"str-video__participant-details\">\n <span className=\"str-video__participant-details__name\">\n {name || userId}\n {indicatorsVisible && isDominantSpeaker && (\n <span\n className=\"str-video__participant-details__name--dominant_speaker\"\n title={t('Dominant speaker')}\n />\n )}\n {indicatorsVisible && (\n <Notification\n isVisible={\n isLocalParticipant &&\n connectionQuality === SfuModels.ConnectionQuality.POOR\n }\n message={t('Poor connection quality')}\n >\n {connectionQualityAsString && (\n <span\n className={clsx(\n 'str-video__participant-details__connection-quality',\n `str-video__participant-details__connection-quality--${connectionQualityAsString}`,\n )}\n title={connectionQualityAsString}\n />\n )}\n </Notification>\n )}\n {indicatorsVisible && !hasAudio && (\n <span className=\"str-video__participant-details__name--audio-muted\" />\n )}\n {indicatorsVisible && !hasVideo && (\n <span className=\"str-video__participant-details__name--video-muted\" />\n )}\n {indicatorsVisible && canUnpin && (\n // TODO: remove this monstrosity once we have a proper design\n <span\n title={t('Unpin')}\n onClick={() => call?.unpin(sessionId)}\n style={{ cursor: 'pointer' }}\n className=\"str-video__participant-details__name--pinned\"\n />\n )}\n </span>\n </div>\n );\n};\n","import {\n ComponentType,\n forwardRef,\n ReactElement,\n useMemo,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {\n SfuModels,\n StreamVideoParticipant,\n VideoTrackType,\n} from '@stream-io/video-client';\n\nimport { Audio } from '../Audio';\nimport { Video, VideoProps } from '../Video';\nimport { useTrackElementVisibility } from '../../hooks';\nimport { DefaultParticipantViewUI } from './DefaultParticipantViewUI';\nimport { applyElementToRef, isComponentType } from '../../../utilities';\nimport { ParticipantViewContext } from './ParticipantViewContext';\n\nexport type ParticipantViewProps = {\n /**\n * The participant whose video/audio stream we want to play.\n */\n participant: StreamVideoParticipant;\n\n /**\n * Override the default UI for rendering participant information/actions.\n * pass `null` if you wish to not render anything\n * @default DefaultParticipantViewUI\n */\n ParticipantViewUI?: ComponentType | ReactElement | null;\n\n /**\n * The kind of video stream to play for the given participant.\n * The default value is `videoTrack`.\n * You can use `none` if you're building an audio-only call.\n */\n trackType?: VideoTrackType | 'none';\n\n /**\n * This prop is only useful for advanced use-cases (for example, building your own layout).\n * When set to `true` it will mute the give participant's audio stream on the client side.\n * The local participant is always muted.\n */\n muteAudio?: boolean;\n\n /**\n * An object with set functions meant for exposing the video\n * and video placeholder elements to the integrators.\n * It's useful when you want to attach custom event handlers to these elements.\n * - `refs.setVideoElement`\n * - `refs.setVideoPlaceholderElement`\n */\n refs?: VideoProps['refs'];\n\n /**\n * Custom class applied to the root DOM element.\n */\n className?: string;\n} & Pick<VideoProps, 'VideoPlaceholder'>;\n\nexport const ParticipantView = forwardRef<HTMLDivElement, ParticipantViewProps>(\n (\n {\n participant,\n trackType = 'videoTrack',\n muteAudio,\n refs: { setVideoElement, setVideoPlaceholderElement } = {},\n className,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI as ComponentType,\n },\n ref,\n ) => {\n const {\n isLocalParticipant,\n isSpeaking,\n isDominantSpeaker,\n publishedTracks,\n sessionId,\n } = participant;\n\n const hasAudio = publishedTracks.includes(SfuModels.TrackType.AUDIO);\n const hasVideo = publishedTracks.includes(SfuModels.TrackType.VIDEO);\n const hasScreenShareAudio = publishedTracks.includes(\n SfuModels.TrackType.SCREEN_SHARE_AUDIO,\n );\n\n const [trackedElement, setTrackedElement] = useState<HTMLDivElement | null>(\n null,\n );\n\n const [contextVideoElement, setContextVideoElement] =\n useState<HTMLVideoElement | null>(null);\n\n const [contextVideoPlaceholderElement, setContextVideoPlaceholderElement] =\n useState<HTMLDivElement | null>(null);\n\n // TODO: allow to pass custom ViewportTracker instance from props\n useTrackElementVisibility({\n sessionId,\n trackedElement,\n trackType,\n });\n\n const participantViewContextValue = useMemo(\n () => ({\n participant,\n participantViewElement: trackedElement,\n videoElement: contextVideoElement,\n videoPlaceholderElement: contextVideoPlaceholderElement,\n trackType,\n }),\n [\n contextVideoElement,\n contextVideoPlaceholderElement,\n participant,\n trackedElement,\n trackType,\n ],\n );\n\n const videoRefs: VideoProps['refs'] = useMemo(\n () => ({\n setVideoElement: (element) => {\n setVideoElement?.(element);\n setContextVideoElement(element);\n },\n setVideoPlaceholderElement: (element) => {\n setVideoPlaceholderElement?.(element);\n setContextVideoPlaceholderElement(element);\n },\n }),\n [setVideoElement, setVideoPlaceholderElement],\n );\n\n return (\n <div\n data-testid=\"participant-view\"\n ref={(element) => {\n applyElementToRef(ref, element);\n setTrackedElement(element);\n }}\n className={clsx(\n 'str-video__participant-view',\n isDominantSpeaker && 'str-video__participant-view--dominant-speaker',\n isSpeaking && 'str-video__participant-view--speaking',\n !hasVideo && 'str-video__participant-view--no-video',\n !hasAudio && 'str-video__participant-view--no-audio',\n className,\n )}\n >\n <ParticipantViewContext.Provider value={participantViewContextValue}>\n {/* mute the local participant, as we don't want to hear ourselves */}\n {!isLocalParticipant && !muteAudio && (\n <>\n {hasAudio && (\n <Audio participant={participant} trackType=\"audioTrack\" />\n )}\n {hasScreenShareAudio && (\n <Audio\n participant={participant}\n trackType=\"screenShareAudioTrack\"\n />\n )}\n </>\n )}\n <Video\n VideoPlaceholder={VideoPlaceholder}\n participant={participant}\n trackType={trackType}\n refs={videoRefs}\n autoPlay\n />\n {isComponentType(ParticipantViewUI) ? (\n <ParticipantViewUI />\n ) : (\n ParticipantViewUI\n )}\n </ParticipantViewContext.Provider>\n </div>\n );\n },\n);\n","import { StreamCallProvider } from '@stream-io/video-react-bindings';\n\n// re-exporting the StreamCallProvider as StreamCall\nexport const StreamCall = StreamCallProvider;\n","import en from './en.json';\n\nexport const translations = { en };\n","import {\n StreamVideoProvider,\n StreamVideoProps,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport { translations } from '../../../translations';\n\nexport const StreamVideo = (props: PropsWithChildren<StreamVideoProps>) => {\n return (\n <StreamVideoProvider translationsOverrides={translations} {...props} />\n );\n};\n","import { useEffect } from 'react';\nimport {\n Call,\n CallTypes,\n combineComparators,\n Comparator,\n defaultSortPreset,\n paginatedLayoutSortPreset,\n screenSharing,\n speakerLayoutSortPreset,\n StreamVideoParticipant,\n} from '@stream-io/video-client';\n\nexport const usePaginatedLayoutSortPreset = (call: Call | undefined) => {\n useEffect(() => {\n if (!call) return;\n call.setSortParticipantsBy(paginatedLayoutSortPreset);\n return () => {\n resetSortPreset(call);\n };\n }, [call]);\n};\n\nexport const useSpeakerLayoutSortPreset = (\n call: Call | undefined,\n isOneOnOneCall: boolean,\n) => {\n useEffect(() => {\n if (!call) return;\n // always show the remote participant in the spotlight\n if (isOneOnOneCall) {\n call.setSortParticipantsBy(combineComparators(screenSharing, loggedIn));\n } else {\n call.setSortParticipantsBy(speakerLayoutSortPreset);\n }\n return () => {\n resetSortPreset(call);\n };\n }, [call, isOneOnOneCall]);\n};\n\nconst resetSortPreset = (call: Call) => {\n // reset the sorting to the default for the call type\n const callConfig = CallTypes.get(call.type);\n call.setSortParticipantsBy(\n callConfig.options.sortParticipantsBy || defaultSortPreset,\n );\n};\n\nconst loggedIn: Comparator<StreamVideoParticipant> = (a, b) => {\n if (a.isLocalParticipant) return 1;\n if (b.isLocalParticipant) return -1;\n return 0;\n};\n","import clsx from 'clsx';\nimport { useCallback, useEffect, useState } from 'react';\nimport {\n useCall,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport { SfuModels, StreamVideoParticipant } from '@stream-io/video-client';\nimport { ParticipantView, useParticipantViewContext } from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport { usePaginatedLayoutSortPreset } from './hooks';\n\n/**\n * The props for the {@link LivestreamLayout} component.\n */\nexport type LivestreamLayoutProps = {\n /**\n * Whether the livestream is muted. Defaults to `false`.\n */\n muted?: boolean;\n\n /**\n * Whether to show the participant count. Defaults to `true`.\n */\n showParticipantCount?: boolean;\n\n /**\n * Whether to enable fullscreen mode. Defaults to `true`.\n */\n enableFullScreen?: boolean;\n\n /**\n * Whether to show the duration of the call. Defaults to `true`.\n */\n showDuration?: boolean;\n\n /**\n * Whether to show the live badge. Defaults to `true`.\n */\n showLiveBadge?: boolean;\n\n /**\n * Whether to show the speaker name. Defaults to `false`.\n */\n showSpeakerName?: boolean;\n\n /**\n * The props to pass to the floating participant element.\n */\n floatingParticipantProps?: LivestreamLayoutProps & {\n /**\n * The position of the floating participant element. Defaults to `top-right`.\n */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n };\n};\n\nexport const LivestreamLayout = (props: LivestreamLayoutProps) => {\n const { useParticipants, useRemoteParticipants, useHasOngoingScreenShare } =\n useCallStateHooks();\n const call = useCall();\n const [currentSpeaker, ...otherParticipants] = useParticipants();\n const remoteParticipants = useRemoteParticipants();\n const hasOngoingScreenShare = useHasOngoingScreenShare();\n const presenter = hasOngoingScreenShare\n ? hasScreenShare(currentSpeaker) && currentSpeaker\n : otherParticipants.find(hasScreenShare);\n\n usePaginatedLayoutSortPreset(call);\n\n const Overlay = (\n <ParticipantOverlay\n showParticipantCount={props.showParticipantCount}\n showDuration={props.showDuration}\n showLiveBadge={props.showLiveBadge}\n showSpeakerName={props.showSpeakerName}\n />\n );\n\n const { floatingParticipantProps } = props;\n const FloatingParticipantOverlay = hasOngoingScreenShare && (\n <ParticipantOverlay\n // these elements aren't needed for the video feed\n showParticipantCount={\n floatingParticipantProps?.showParticipantCount ?? false\n }\n showDuration={floatingParticipantProps?.showDuration ?? false}\n showLiveBadge={floatingParticipantProps?.showLiveBadge ?? false}\n showSpeakerName={floatingParticipantProps?.showSpeakerName ?? true}\n />\n );\n\n return (\n <div className=\"str-video__livestream-layout__wrapper\">\n <ParticipantsAudio participants={remoteParticipants} />\n {hasOngoingScreenShare && presenter && (\n <ParticipantView\n className=\"str-video__livestream-layout__screen-share\"\n participant={presenter}\n ParticipantViewUI={Overlay}\n trackType=\"screenShareTrack\"\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n {currentSpeaker && (\n <ParticipantView\n className={clsx(\n hasOngoingScreenShare &&\n clsx(\n 'str-video__livestream-layout__floating-participant',\n `str-video__livestream-layout__floating-participant--${\n floatingParticipantProps?.position ?? 'top-right'\n }`,\n ),\n )}\n participant={currentSpeaker}\n ParticipantViewUI={FloatingParticipantOverlay || Overlay}\n muteAudio // audio is rendered by ParticipantsAudio\n />\n )}\n </div>\n );\n};\n\nconst hasScreenShare = (p?: StreamVideoParticipant) =>\n !!p?.publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE);\n\nconst ParticipantOverlay = (props: {\n enableFullScreen?: boolean;\n showParticipantCount?: boolean;\n showDuration?: boolean;\n showLiveBadge?: boolean;\n showSpeakerName?: boolean;\n}) => {\n const {\n enableFullScreen = true,\n showParticipantCount = true,\n showDuration = true,\n showLiveBadge = true,\n showSpeakerName = false,\n } = props;\n const { participant } = useParticipantViewContext();\n const { useParticipantCount } = useCallStateHooks();\n const participantCount = useParticipantCount();\n const duration = useUpdateCallDuration();\n const toggleFullScreen = useToggleFullScreen();\n const { t } = useI18n();\n return (\n <div className=\"str-video__livestream-layout__overlay\">\n <div className=\"str-video__livestream-layout__overlay__bar\">\n {showLiveBadge && (\n <span className=\"str-video__livestream-layout__live-badge\">\n {t('Live')}\n </span>\n )}\n {showParticipantCount && (\n <span className=\"str-video__livestream-layout__viewers-count\">\n {participantCount}\n </span>\n )}\n {showSpeakerName && (\n <span\n className=\"str-video__livestream-layout__speaker-name\"\n title={participant.name || participant.userId || ''}\n >\n {participant.name || participant.userId || ''}\n </span>\n )}\n {showDuration && (\n <span className=\"str-video__livestream-layout__duration\">\n {formatDuration(duration)}\n </span>\n )}\n {enableFullScreen && (\n <span\n className=\"str-video__livestream-layout__go-fullscreen\"\n onClick={toggleFullScreen}\n />\n )}\n </div>\n </div>\n );\n};\n\nconst useUpdateCallDuration = () => {\n const { useIsCallLive, useCallSession } = useCallStateHooks();\n const isCallLive = useIsCallLive();\n const session = useCallSession();\n const [duration, setDuration] = useState(() => {\n if (!session || !session.live_started_at) return 0;\n const liveStartTime = new Date(session.live_started_at);\n const now = new Date();\n return Math.floor((now.getTime() - liveStartTime.getTime()) / 1000);\n });\n\n useEffect(() => {\n if (!isCallLive) return;\n const interval = setInterval(() => {\n setDuration((d) => d + 1);\n }, 1000);\n return () => {\n clearInterval(interval);\n };\n }, [isCallLive]);\n\n return duration;\n};\n\nconst useToggleFullScreen = () => {\n const { participantViewElement } = useParticipantViewContext();\n const [isFullscreen, setIsFullscreen] = useState(false);\n return useCallback(() => {\n if (isFullscreen) {\n document.exitFullscreen().then(() => {\n setIsFullscreen(false);\n });\n } else {\n participantViewElement?.requestFullscreen().then(() => {\n setIsFullscreen(true);\n });\n }\n }, [isFullscreen, participantViewElement]);\n};\n\nconst formatDuration = (durationInMs: number) => {\n const days = Math.floor(durationInMs / 86400);\n const hours = Math.floor(durationInMs / 3600);\n const minutes = Math.floor((durationInMs % 3600) / 60);\n const seconds = durationInMs % 60;\n\n return `${days ? days + ' ' : ''}${hours ? hours + ':' : ''}${\n minutes < 10 ? '0' : ''\n }${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { StreamVideoParticipant } from '@stream-io/video-client';\nimport clsx from 'clsx';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { ParticipantsAudio } from '../Audio';\nimport { IconButton } from '../../../components';\nimport { chunk } from '../../../utilities';\nimport { usePaginatedLayoutSortPreset } from './hooks';\n\nconst GROUP_SIZE = 16;\n\ntype PaginatedGridLayoutGroupProps = {\n /**\n * The group of participants to render.\n */\n group: Array<StreamVideoParticipant>;\n} & Pick<ParticipantViewProps, 'VideoPlaceholder'> &\n Required<Pick<ParticipantViewProps, 'ParticipantViewUI'>>;\n\nconst PaginatedGridLayoutGroup = ({\n group,\n VideoPlaceholder,\n ParticipantViewUI,\n}: PaginatedGridLayoutGroupProps) => {\n return (\n <div\n className={clsx('str-video__paginated-grid-layout__group', {\n 'str-video__paginated-grid-layout--one': group.length === 1,\n 'str-video__paginated-grid-layout--two-four':\n group.length >= 2 && group.length <= 4,\n 'str-video__paginated-grid-layout--five-nine':\n group.length >= 5 && group.length <= 9,\n })}\n >\n {group.map((participant) => (\n <ParticipantView\n key={participant.sessionId}\n participant={participant}\n muteAudio\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n ))}\n </div>\n );\n};\n\nexport type PaginatedGridLayoutProps = {\n /**\n * The number of participants to display per page.\n */\n groupSize?: number;\n\n /**\n * Whether to exclude the local participant from the grid.\n */\n excludeLocalParticipant?: boolean;\n\n /**\n * Turns on/off the pagination arrows.\n */\n pageArrowsVisible?: boolean;\n} & Pick<ParticipantViewProps, 'ParticipantViewUI' | 'VideoPlaceholder'>;\n\nexport const PaginatedGridLayout = ({\n groupSize = GROUP_SIZE,\n excludeLocalParticipant = false,\n pageArrowsVisible = true,\n VideoPlaceholder,\n ParticipantViewUI = DefaultParticipantViewUI,\n}: PaginatedGridLayoutProps) => {\n const [page, setPage] = useState(0);\n const [\n paginatedGridLayoutWrapperElement,\n setPaginatedGridLayoutWrapperElement,\n ] = useState<HTMLDivElement | null>(null);\n\n const call = useCall();\n const { useParticipants, useRemoteParticipants } = useCallStateHooks();\n const participants = useParticipants();\n // used to render audio elements\n const remoteParticipants = useRemoteParticipants();\n\n usePaginatedLayoutSortPreset(call);\n\n useEffect(() => {\n if (!paginatedGridLayoutWrapperElement || !call) return;\n\n const cleanup = call.setViewport(paginatedGridLayoutWrapperElement);\n\n return () => cleanup();\n }, [paginatedGridLayoutWrapperElement, call]);\n\n // only used to render video elements\n const participantGroups = useMemo(\n () =>\n chunk(\n excludeLocalParticipant ? remoteParticipants : participants,\n groupSize,\n ),\n [excludeLocalParticipant, remoteParticipants, participants, groupSize],\n );\n\n const pageCount = participantGroups.length;\n\n // update page when page count is reduced and selected page no longer exists\n useEffect(() => {\n if (page > pageCount - 1) {\n setPage(Math.max(0, pageCount - 1));\n }\n }, [page, pageCount]);\n\n const selectedGroup = participantGroups[page];\n\n if (!call) return null;\n\n return (\n <div\n className=\"str-video__paginated-grid-layout__wrapper\"\n ref={setPaginatedGridLayoutWrapperElement}\n >\n <ParticipantsAudio participants={remoteParticipants} />\n <div className=\"str-video__paginated-grid-layout\">\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n icon=\"caret-left\"\n disabled={page === 0}\n onClick={() =>\n setPage((currentPage) => Math.max(0, currentPage - 1))\n }\n />\n )}\n {selectedGroup && (\n <PaginatedGridLayoutGroup\n group={participantGroups[page]}\n VideoPlaceholder={VideoPlaceholder}\n ParticipantViewUI={ParticipantViewUI}\n />\n )}\n {pageArrowsVisible && pageCount > 1 && (\n <IconButton\n disabled={page === pageCount - 1}\n icon=\"caret-right\"\n onClick={() =>\n setPage((currentPage) => Math.min(pageCount - 1, currentPage + 1))\n }\n />\n )}\n </div>\n </div>\n );\n};\n","import { useEffect, useState } from 'react';\n\nexport const useCalculateHardLimit = (\n /**\n * Element that stretches to 100% of the whole layout component\n */\n wrapperElement: HTMLDivElement | null,\n /**\n * Element that directly hosts individual `ParticipantView` (or wrapper) elements\n */\n hostElement: HTMLDivElement | null,\n limit?: 'dynamic' | number,\n) => {\n const [calculatedLimit, setCalculatedLimit] = useState<{\n vertical: number | null;\n horizontal: number | null;\n }>({\n vertical: typeof limit === 'number' ? limit : null,\n horizontal: typeof limit === 'number' ? limit : null,\n });\n\n useEffect(() => {\n if (\n !hostElement ||\n !wrapperElement ||\n typeof limit === 'number' ||\n typeof limit === 'undefined'\n )\n return;\n\n let childWidth: number | null = null;\n let childHeight: number | null = null;\n\n const resizeObserver = new ResizeObserver((entries, observer) => {\n // this part should ideally run as little times as possible\n // get child measurements and disconnect\n // does not consider dynamically sized children\n // this hook is for SpeakerLayout use only, where children in the bar are fixed size\n if (entries.length > 1) {\n const child = hostElement.firstChild as HTMLElement | null;\n\n if (child) {\n childHeight = child.clientHeight;\n childWidth = child.clientWidth;\n observer.unobserve(hostElement);\n }\n }\n\n // keep the state at { vertical: 1, horizontal: 1 }\n // until we get the proper child measurements\n if (childHeight === null || childWidth === null) return;\n\n const vertical = Math.floor(wrapperElement.clientHeight / childHeight);\n const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);\n\n setCalculatedLimit((pv) => {\n if (pv.vertical !== vertical || pv.horizontal !== horizontal)\n return { vertical, horizontal };\n return pv;\n });\n });\n\n resizeObserver.observe(wrapperElement);\n resizeObserver.observe(hostElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [hostElement, limit, wrapperElement]);\n\n return calculatedLimit;\n};\n","import { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { SfuModels, StreamVideoParticipant } from '@stream-io/video-client';\nimport { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';\n\nimport {\n DefaultParticipantViewUI,\n ParticipantView,\n ParticipantViewProps,\n} from '../ParticipantView';\nimport { IconButton } from '../../../components';\nimport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n} from '../../../hooks';\nimport { useSpeakerLayoutSortPreset } from './hooks';\nimport { useCalculateHardLimit } from '../../hooks/useCalculateHardLimit';\nimport { ParticipantsAudio } from '../Audio';\n\nexport type SpeakerLayoutProps = {\n ParticipantViewUISpotlight?: ParticipantViewProps['ParticipantViewUI'];\n ParticipantViewUIBar?: ParticipantViewProps['ParticipantViewUI'];\n /**\n * The position of the participants who are not in focus.\n * Providing `null` will hide the bar.\n */\n participantsBarPosition?: 'top' | 'bottom' | 'left' | 'right' | null;\n /**\n * Hard limits the number of the participants rendered in the participants bar.\n * Providing string `dynamic` will calculate hard limit based on screen width/height.\n */\n participantsBarLimit?: 'dynamic' | number;\n} & Pick<ParticipantViewProps, 'VideoPlaceholder'>;\n\nconst DefaultParticipantViewUIBar = () => (\n <DefaultParticipantViewUI menuPlacement=\"top-end\" />\n);\n\nconst DefaultParticipantViewUISpotlight = () => <DefaultParticipantViewUI />;\n\nexport const SpeakerLayout = ({\n ParticipantViewUIBar = DefaultParticipantViewUIBar,\n ParticipantViewUISpotlight = DefaultParticipantViewUISpotlight,\n VideoPlaceholder,\n participantsBarPosition = 'bottom',\n participantsBarLimit,\n}: SpeakerLayoutProps) => {\n const call = useCall();\n const { useParticipants, useRemoteParticipants } = useCallStateHooks();\n const [participantInSpotlight, ...otherParticipants] = useParticipants();\n const remoteParticipants = useRemoteParticipants();\n const [participantsBarWrapperElement, setParticipantsBarWrapperElement] =\n useState<HTMLDivElement | null>(null);\n const [participantsBarElement, setParticipantsBarElement] =\n useState<HTMLDivElement | null>(null);\n const [buttonsWrapperElement, setButtonsWrapperElement] =\n useState<HTMLDivElement | null>(null);\n\n const isSpeakerScreenSharing = hasScreenShare(participantInSpotlight);\n const hardLimit = useCalculateHardLimit(\n buttonsWrapperElement,\n participantsBarElement,\n participantsBarLimit,\n );\n\n const isVertical =\n participantsBarPosition === 'left' || participantsBarPosition === 'right';\n const isHorizontal =\n participantsBarPosition === 'top' || participantsBarPosition === 'bottom';\n\n useEffect(() => {\n if (!participantsBarWrapperElement || !call) return;\n\n const cleanup = call.setViewport(participantsBarWrapperElement);\n\n return () => cleanup();\n }, [participantsBarWrapperElement, call]);\n\n const isOneOnOneCall = otherParticipants.length === 1;\n useSpeakerLayoutSortPreset(call, isOneOnOneCall);\n\n let participantsWithAppliedLimit = otherParticipants;\n\n const hardLimitToApply = isVertical\n ? hardLimit.vertical\n : hardLimit.horizontal;\n\n if (\n typeof participantsBarLimit !== 'undefined' &&\n hardLimitToApply !== null\n ) {\n participantsWithAppliedLimit = otherParticipants.slice(\n 0,\n // subtract 1 if speaker is sharing screen as\n // that one is rendered independently from otherParticipants array\n hardLimitToApply - (isSpeakerScreenSharing ? 1 : 0),\n );\n }\n\n if (!call) return null;\n\n return (\n <div className=\"str-video__speaker-layout__wrapper\">\n <ParticipantsAudio participants={remoteParticipants} />\n <div\n className={clsx(\n 'str-video__speaker-layout',\n participantsBarPosition &&\n `str-video__speaker-layout--variant-${participantsBarPosition}`,\n )}\n >\n <div className=\"str-video__speaker-layout__spotlight\">\n {participantInSpotlight && (\n <ParticipantView\n participant={participantInSpotlight}\n muteAudio={true}\n trackType={\n isSpeakerScreenSharing ? 'screenShareTrack' : 'videoTrack'\n }\n ParticipantViewUI={ParticipantViewUISpotlight}\n VideoPlaceholder={VideoPlaceholder}\n />\n )}\n </div>\n {participantsWithAppliedLimit.length > 0 && participantsBarPosition && (\n <div\n ref={setButtonsWrapperElement}\n className=\"str-video__speaker-layout__participants-bar-buttons-wrapper\"\n >\n <div\n className=\"str-video__speaker-layout__participants-bar-wrapper\"\n ref={setParticipantsBarWrapperElement}\n >\n <div\n ref={setParticipantsBarElement}\n className=\"str-video__speaker-layout__participants-bar\"\n >\n {isSpeakerScreenSharing && (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participantInSpotlight.sessionId}\n >\n <ParticipantView\n participant={participantInSpotlight}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n muteAudio={true}\n />\n </div>\n )}\n {participantsWithAppliedLimit.map((participant) => (\n <div\n className=\"str-video__speaker-layout__participant-tile\"\n key={participant.sessionId}\n >\n <ParticipantView\n participant={participant}\n ParticipantViewUI={ParticipantViewUIBar}\n VideoPlaceholder={VideoPlaceholder}\n muteAudio={true}\n />\n </div>\n ))}\n </div>\n </div>\n {isVertical && (\n <VerticalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n {isHorizontal && (\n <HorizontalScrollButtons\n scrollWrapper={participantsBarWrapperElement}\n />\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\ntype ScrollButtonsProps<T extends HTMLElement> = {\n scrollWrapper: T | null;\n};\n\nconst HorizontalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useHorizontalScrollPosition(scrollWrapper);\n\n const scrollStartClickHandler = () => {\n scrollWrapper?.scrollBy({ left: -150, behavior: 'smooth' });\n };\n\n const scrollEndClickHandler = () => {\n scrollWrapper?.scrollBy({ left: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'start' && (\n <IconButton\n onClick={scrollStartClickHandler}\n icon=\"caret-left\"\n className=\"str-video__speaker-layout__participants-bar--button-left\"\n />\n )}\n {scrollPosition && scrollPosition !== 'end' && (\n <IconButton\n onClick={scrollEndClickHandler}\n icon=\"caret-right\"\n className=\"str-video__speaker-layout__participants-bar--button-right\"\n />\n )}\n </>\n );\n};\n\nconst VerticalScrollButtons = <T extends HTMLElement>({\n scrollWrapper,\n}: ScrollButtonsProps<T>) => {\n const scrollPosition = useVerticalScrollPosition(scrollWrapper);\n\n const scrollTopClickHandler = () => {\n scrollWrapper?.scrollBy({ top: -150, behavior: 'smooth' });\n };\n\n const scrollBottomClickHandler = () => {\n scrollWrapper?.scrollBy({ top: 150, behavior: 'smooth' });\n };\n return (\n <>\n {scrollPosition && scrollPosition !== 'top' && (\n <IconButton\n onClick={scrollTopClickHandler}\n icon=\"caret-up\"\n className=\"str-video__speaker-layout__participants-bar--button-top\"\n />\n )}\n {scrollPosition && scrollPosition !== 'bottom' && (\n <IconButton\n onClick={scrollBottomClickHandler}\n icon=\"caret-down\"\n className=\"str-video__speaker-layout__participants-bar--button-bottom\"\n />\n )}\n </>\n );\n};\n\nconst hasScreenShare = (p?: StreamVideoParticipant) =>\n !!p?.publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE);\n","import { setSdkInfo, SfuModels } from '@stream-io/video-client';\n\nexport * from '@stream-io/video-client';\nexport * from '@stream-io/video-react-bindings';\n\nexport * from './src/core';\n\nexport * from './src/components';\nexport * from './src/translations';\nexport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n useRequestPermission,\n usePersistedDevicePreferences,\n} from './src/hooks';\n\nconst [major, minor, patch] = (\n process.env.PKG_VERSION || '0.0.0-development'\n).split('.');\n\nsetSdkInfo({\n type: SfuModels.SdkType.REACT,\n major,\n minor,\n patch,\n});\n"],"names":["_jsx","_jsxs","Fragment","Video","_Fragment","ToggleMenuButton","ToggleButton","LoadingIndicator","DefaultLoadingIndicator","CallRecordingListHeader","DefaultCallRecordingListHeader","CallRecordingListItem","DefaultCallRecordingListItem","DefaultEmptyCallRecordingList","DefaultLoadingCallRecordingList","hasScreenShare"],"mappings":"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"}