@vidtreo/recorder-wc 0.9.8 → 0.9.10
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.
- package/dist/vidtreo-recorder.js +4 -3
- package/package.json +2 -2
package/dist/vidtreo-recorder.js
CHANGED
|
@@ -8423,7 +8423,8 @@ class RecorderWorker {
|
|
|
8423
8423
|
}
|
|
8424
8424
|
}
|
|
8425
8425
|
new RecorderWorker;
|
|
8426
|
-
`],{type:`application/javascript`});return rf=URL.createObjectURL(e),rf}var of=class{constructor(){this.worker=null,this.chunks=[],this.totalSize=0,this.isActive=!1,this.videoTrackClone=null,this.audioTrackClone=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.setupWorker()}setupWorker(){if(typeof Worker>`u`)throw W.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);try{W.debug(`[WorkerProcessor] Setting up worker`);let e=af();W.debug(`[WorkerProcessor] Worker URL created`,{urlType:typeof e,isBlobUrl:e.startsWith(`blob:`)}),this.worker=new Worker(e,{type:`classic`}),W.debug(`[WorkerProcessor] Worker created successfully`),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),W.debug(`[WorkerProcessor] Worker event handlers attached`)}catch(e){let t=e instanceof Error?e.message:String(e);throw W.error(`[WorkerProcessor] Failed to create worker:`,e),Error(`Failed to create worker: ${t}`)}}handleWorkerMessage(e){let t=e.data;switch(t.type){case`ready`:W.debug(`[WorkerProcessor] Worker ready`),this.readyPromiseResolve&&=(this.readyPromiseResolve(),null);break;case`error`:W.error(`[WorkerProcessor] Worker error:`,t.error),this.onError&&this.onError(Error(t.error));break;case`chunk`:this.chunks.push({data:t.data,position:t.position}),this.totalSize=Math.max(this.totalSize,t.position+t.data.length);break;case`bufferUpdate`:this.onBufferUpdate&&this.onBufferUpdate(t.size,t.formatted);break;case`stateChange`:W.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;default:W.warn(`[WorkerProcessor] Unknown response type:`,t)}}handleWorkerError(e){W.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.onError&&this.onError(Error(e.message||`Unknown worker error`))}async startProcessing(e,t,n){if(!this.worker)throw Error(`Worker not initialized`);if(this.isActive)throw Error(`Processing already active`);this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.overlayConfig=n||null;let r=t.format||`mp4`,i=t.audioCodec||pd(r),a=ef(e),o=t.codec||await nf(t.width,t.height,t.bitrate);W.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:a,fps:t.fps,codec:o,bitrate:t.bitrate});let s={width:t.width,height:t.height,fps:t.fps,bitrate:tf(t.bitrate),audioCodec:i,audioBitrate:t.audioBitrate,codec:o,keyFrameInterval:5,format:r,watermark:t.watermark},c=e.getVideoTracks(),l=e.getAudioTracks();W.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:c.length,audioTracksCount:l.length,hasWorker:!!this.worker});let u=null,d=null;if(c.length>0){this.stopCurrentVideoTrack();let e=c[0];u=this.cloneVideoTrack(e),this.currentVideoTrack=u}if(l.length>0){let e=l[0];d=this.cloneAudioTrack(e)}W.debug(`[WorkerProcessor] Track details`,{hasVideoTrack:!!u,videoTrackId:u?.id,videoTrackKind:u?.kind,videoTrackReadyState:u?.readyState,hasAudioTrack:!!d,audioTrackId:d?.id,audioTrackKind:d?.kind,audioTrackReadyState:d?.readyState});let f=u===null?null:new MediaStreamTrackProcessor({track:u}).readable,p=d===null?null:new MediaStreamTrackProcessor({track:d}).readable,m={type:`start`,videoStream:f,audioStream:p,config:s,overlayConfig:this.overlayConfig||void 0},h=[];f&&h.push(f),p&&h.push(p),W.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:h.length,messageType:m.type});let g=new Promise(e=>{this.readyPromiseResolve=e});try{this.worker.postMessage(m,h),W.debug(`[WorkerProcessor] Message posted successfully`),await g,W.debug(`[WorkerProcessor] Worker confirmed ready`)}catch(e){throw W.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,e}}pause(){this.worker&&this.isActive&&this.worker.postMessage({type:`pause`})}resume(){this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`resume`})}isWorkerActive(){return!!(this.worker&&this.isActive)}toggleMute(){this.isMuted=!this.isMuted,this.onMuteStateChange&&this.onMuteStateChange(this.isMuted),this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`toggleMute`})}switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return W.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if(W.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return W.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=ef(e);W.debug(`[WorkerProcessor] Source type detected`,{isScreenCapture:n,targetFps:30}),this.worker.postMessage({type:`updateFps`,fps:30});let r={type:`updateSourceType`,isScreenCapture:n};this.worker.postMessage(r);let i=t[0];this.stopCurrentVideoTrack();let a=this.cloneVideoTrack(i);W.debug(`[WorkerProcessor] New video track details`,{trackId:a.id,trackKind:a.kind,trackReadyState:a.readyState}),this.currentVideoTrack=a;let o={type:`switchSource`,videoStream:new MediaStreamTrackProcessor({track:a}).readable};try{W.debug(`[WorkerProcessor] Posting switch source message`);let e=[];return o.videoStream&&e.push(o.videoStream),this.worker.postMessage(o,e),W.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw W.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);return new Promise((e,t)=>{let n=setTimeout(()=>{t(Error(`Finalize timeout`))},3e4),r=i=>{let a=i.data;a.type===`stateChange`&&a.state===`stopped`?(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),this.isActive=!1,e(this.createBlobFromChunks())):a.type===`error`&&(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),t(Error(a.error)))};this.worker&&(this.worker.addEventListener(`message`,r),this.worker.postMessage({type:`stop`}))})}createBlobFromChunks(){let e=[...this.chunks].sort((e,t)=>e.position-t.position),t=new ArrayBuffer(this.totalSize),n=new Uint8Array(t);for(let t of e)n.set(t.data,t.position);return{blob:new Blob([t],{type:`video/mp4`}),totalSize:this.totalSize}}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,Promise.resolve()}getBufferSize(){return this.totalSize}getMutedState(){return this.isMuted}updateTabVisibility(e,t){if(!(this.isWorkerActive()&&this.worker)){W.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/1e3});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){W.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}isPausedState(){return this.isPaused}getClonedAudioTrack(){return this.audioTrackClone}getAudioStreamForAnalysis(){return this.audioTrackClone?new MediaStream([this.audioTrackClone]):null}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnMuteStateChange(e){this.onMuteStateChange=e}cloneVideoTrack(e){if(W.debug(`[WorkerProcessor] Original video track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.videoTrackClone=t,W.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone video track:`,e),Error(`Failed to clone video track: ${e instanceof Error?e.message:String(e)}`)}return W.warn(`[WorkerProcessor] Video track clone() not available, using original`),this.videoTrackClone=e,e}cloneAudioTrack(e){if(W.debug(`[WorkerProcessor] Original audio track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.audioTrackClone=t,W.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone audio track:`,e),Error(`Failed to clone audio track: ${e instanceof Error?e.message:String(e)}`)}return W.warn(`[WorkerProcessor] Audio track clone() not available, using original`),this.audioTrackClone=e,e}stopCurrentVideoTrack(){this.currentVideoTrack&&this.currentVideoTrack.readyState===`live`&&this.currentVideoTrack.stop(),this.currentVideoTrack=null}cleanup(){this.worker&&=(this.worker.terminate(),null),rf&&=(URL.revokeObjectURL(rf),null),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}static isSupported(){return typeof Worker<`u`&&typeof MediaStreamTrackProcessor<`u`&&typeof VideoFrame<`u`&&typeof AudioData<`u`&&typeof OffscreenCanvas<`u`}},sf=class{constructor(){if(this.currentVideoStream=null,!of.isSupported())throw Error(`Web Workers are required for video processing. Please use a modern browser that supports Web Workers, MediaStreamTrackProcessor, VideoFrame, and AudioData APIs.`);try{this.workerProcessor=new of,W.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to initialize worker: ${t}. Web Workers are required for video processing.`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{W.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t})}),this.workerProcessor.setOnError(e=>{W.error(`[StreamProcessor] Worker error:`,e)}),this.currentVideoStream=e,await this.workerProcessor.startProcessing(e,t,n)}updateTabVisibility(e,t){this.workerProcessor.updateTabVisibility(e,t)}updateSourceType(e){this.workerProcessor.updateSourceType(e)}pause(){this.workerProcessor.pause()}resume(){this.workerProcessor.resume()}isPausedState(){return this.workerProcessor.isPausedState()}async finalize(){return W.debug(`[StreamProcessor] finalize called`),await this.workerProcessor.finalize()}toggleMute(){this.workerProcessor.toggleMute()}isMutedState(){return this.workerProcessor.getMutedState()}getClonedAudioTrack(){return this.workerProcessor.getClonedAudioTrack()}getAudioStreamForAnalysis(){return this.workerProcessor.getAudioStreamForAnalysis()}async switchVideoSource(e){await this.workerProcessor.switchVideoSource(e),this.currentVideoStream=e,this.onSourceChange&&this.onSourceChange(e)}getCurrentVideoSource(){return this.currentVideoStream}getBufferSize(){return this.workerProcessor.getBufferSize()}setOnMuteStateChange(e){this.workerProcessor.setOnMuteStateChange(e)}setOnSourceChange(e){this.onSourceChange=e}async cancel(){await this.workerProcessor.cancel(),this.workerProcessor.cleanup(),this.currentVideoStream=null}};let cf=1e3,lf=`recording`,uf=`idle`;var df=class{constructor(e,t){this.recordingState=uf,this.countdownDuration=5e3,this.countdownRemaining=0,this.countdownTimeoutId=null,this.countdownIntervalId=null,this.countdownStartTime=null,this.isPaused=!1,this.maxRecordingTime=null,this.maxTimeTimer=null,this.recordingSeconds=0,this.recordingIntervalId=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.originalCameraStream=null,this.enableTabVisibilityOverlay=!1,this.streamManager=e,this.callbacks=t}setCountdownDuration(e){this.countdownDuration=e}setMaxRecordingTime(e){this.maxRecordingTime=e}setTabVisibilityOverlayConfig(e,t){this.enableTabVisibilityOverlay=e,this.tabVisibilityOverlayText=t}getRecordingState(){return this.recordingState}isPausedState(){return this.isPaused}getRecordingSeconds(){return this.recordingSeconds}getStreamProcessor(){return this.streamProcessor}updateSourceType(e){this.recordingState!==lf||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=uf,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/cf),this.countdownStartTime=Date.now(),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining),this.countdownIntervalId=window.setInterval(()=>{if(!this.countdownStartTime)return;let e=Date.now()-this.countdownStartTime;this.countdownRemaining=Math.max(0,Math.ceil((this.countdownDuration-e)/cf)),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>{})},this.countdownDuration)}async doStartRecording(){W.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.recordingState=lf,this.callbacks.onStateChange(this.recordingState),this.resetRecordingState();let e=this.streamManager.getStream();if(W.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){W.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,W.debug(`[RecordingManager] Creating new StreamProcessor`),this.streamProcessor=new sf,W.debug(`[RecordingManager] StreamProcessor created:`,!!this.streamProcessor);let t=await this.callbacks.onGetConfig().then(e=>({config:e,error:null})).catch(e=>({config:null,error:e}));if(t.error){this.handleError(t.error),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}if(!t.config){this.handleError(Error(`Failed to get recording config`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}W.debug(`[RecordingManager] Starting recording with stream manager`);let n=await this.streamManager.startRecording(this.streamProcessor,t.config,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>(W.info(`[RecordingManager] Recording started successfully`),null)).catch(e=>(W.error(`[RecordingManager] Error starting recording:`,e),e));if(n){this.handleError(n),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.startRecordingTimer(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===lf&&await this.stopRecording()},this.maxRecordingTime))}async stopRecording(){W.debug(`[RecordingManager] stopRecording called`);try{this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState(),this.callbacks.onStopAudioTracking(),W.debug(`[RecordingManager] Stopping recording in stream manager`);let e=(await this.streamManager.stopRecording()).blob;return W.info(`[RecordingManager] Recording stopped, blob size:`,e.size),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor=null,this.callbacks.onRecordingComplete(e),e}catch(e){throw this.handleError(e),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){this.recordingState!==lf||this.isPaused||(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now())}resumeRecording(){this.recordingState!==lf||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=uf,this.countdownRemaining=0,this.countdownStartTime=null,this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)}cleanup(){this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}updatePausedDuration(){if(this.pauseStartTime===null)throw Error(`Pause start time not set`);let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}startRecordingTimer(){this.recordingIntervalId===null&&(this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1,this.callbacks.onTimerUpdate(Gd(this.recordingSeconds))},1e3))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}};let ff=()=>{},pf=()=>{},mf=()=>{},hf=()=>{},gf=e=>{},_f=(e,t)=>{},vf=e=>{},yf=e=>{},bf=e=>{},xf=()=>{},Sf=e=>{};function Cf(){return{onProgress:ff,onSuccess:pf,onError:mf,onClearStatus:hf}}var wf=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.enableTabVisibilityOverlay=!1,this.callbacks=e,this.streamManager=new Zd,this.configManager=new Sd,this.storageManager=new Ad,this.deviceManager=new Cd(this.streamManager,e.device),this.audioLevelAnalyzer=new a,this.uploadService=new $d,this.uploadCallbacks=e.upload?e.upload:Cf();let t=this.createRecordingCallbacks(e);this.recordingManager=new df(this.streamManager,t);let n=this.createSourceSwitchCallbacks(e);this.sourceSwitchManager=new Rd(this.streamManager,n),e.stream&&(this.streamManager.on(`streamstart`,({stream:t})=>{W.debug(`[RecorderController] streamstart event received, calling callback`),e.stream?.onStreamStart&&e.stream.onStreamStart(t)}),this.streamManager.on(`streamstop`,()=>{W.debug(`[RecorderController] streamstop event received, calling callback`),e.stream?.onStreamStop&&e.stream.onStreamStop()}),this.streamManager.on(`error`,({error:t})=>{W.error(`[RecorderController] stream error event received, calling callback`,t),e.stream?.onError&&e.stream.onError(t)}))}async initialize(e){if(this.isInitialized)return;e.apiKey&&e.backendUrl&&await this.configManager.initialize(e.apiKey,e.backendUrl),e.countdownDuration!==void 0&&this.recordingManager.setCountdownDuration(e.countdownDuration),e.maxRecordingTime!==void 0&&this.recordingManager.setMaxRecordingTime(e.maxRecordingTime),e.enableTabVisibilityOverlay!==void 0&&(this.enableTabVisibilityOverlay=e.enableTabVisibilityOverlay),e.tabVisibilityOverlayText!==void 0&&(this.tabVisibilityOverlayText=e.tabVisibilityOverlayText),this.recordingManager.setTabVisibilityOverlayConfig(this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText);let t=this.callbacks.onStorageCleanupError??Sf;await this.storageManager.initialize(t);let n=this.storageManager.getStorageService();n&&this.uploadService&&(this.uploadQueueManager=new Qd(n,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t)},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t)}})),this.isInitialized=!0}async startStream(){W.debug(`[RecorderController] startStream called`),await this.streamManager.startStream(),W.debug(`[RecorderController] startStream completed`)}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){await this.recordingManager.startRecording()}async stopRecording(){let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),e}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.sourceSwitchManager.toggleSource()}setCameraDevice(e){this.deviceManager.setCameraDevice(e)}setMicDevice(e){this.deviceManager.setMicDevice(e)}getAvailableDevices(){return this.deviceManager.getAvailableDevices()}muteAudio(){this.streamManager.muteAudio()}unmuteAudio(){this.streamManager.unmuteAudio()}toggleMute(){this.streamManager.toggleMute()}getIsMuted(){return this.streamManager.isMuted()}startAudioLevelTracking(e,t){if(!t)throw Error(`Audio level callbacks are required`);return this.audioLevelAnalyzer.startTracking(e,t,()=>this.streamManager.isMuted()),Promise.resolve()}stopAudioLevelTracking(){this.audioLevelAnalyzer.stopTracking()}getAudioLevel(){return this.audioLevelAnalyzer.getAudioLevel()}async uploadVideo(e,t,n,r){if(!this.uploadQueueManager)throw Error(`Upload queue manager not initialized`);this.uploadCallbacks.onClearStatus();let i=await wd(e),a=Object.keys(r).length>0?r:void 0;await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:`recording-${Date.now()}.mp4`,duration:i,metadata:void 0,userMetadata:a})}getStream(){return this.streamManager.getStream()}getRecordingState(){return this.recordingManager.getRecordingState()}isPaused(){return this.recordingManager.isPausedState()}getCurrentSourceType(){return this.sourceSwitchManager.getCurrentSourceType()}getOriginalCameraStream(){return this.sourceSwitchManager.getOriginalCameraStream()}getStreamManager(){return this.streamManager}getAudioStreamForAnalysis(){return this.streamManager.getAudioStreamForAnalysis()}getDeviceManager(){return this.deviceManager}getConfig(){return this.configManager.getConfig()}getUploadService(){return this.uploadService}isRecording(){return this.streamManager.isRecording()}isActive(){return this.streamManager.isActive()}cleanup(){this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}createRecordingCallbacks(e){let t=e.recording;return{onStateChange:t?.onStateChange??gf,onCountdownUpdate:t?.onCountdownUpdate??_f,onTimerUpdate:t?.onTimerUpdate??vf,onError:t?.onError??yf,onRecordingComplete:t?.onRecordingComplete??bf,onClearUploadStatus:t?.onClearUploadStatus??xf,onStopAudioTracking:()=>{this.audioLevelAnalyzer.stopTracking()},onGetConfig:()=>this.configManager.getConfig()}}createSourceSwitchCallbacks(e){let t=e.sourceSwitch;return{onSourceChange:t?.onSourceChange,onPreviewUpdate:t?.onPreviewUpdate,onError:t?.onError,onTransitionStart:t?.onTransitionStart,onTransitionEnd:t?.onTransitionEnd,onScreenSelectionStart:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!0)},onScreenSelectionEnd:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!1)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()}}},Tf=`2.0.7`,Ef=500,Df=`user-agent`,Of=``,kf=`?`,G={FUNCTION:`function`,OBJECT:`object`,STRING:`string`,UNDEFINED:`undefined`},Af=`browser`,jf=`cpu`,Mf=`device`,Nf=`engine`,Pf=`os`,Ff=`result`,K=`name`,q=`type`,J=`vendor`,Y=`version`,If=`architecture`,Lf=`major`,X=`model`,Rf=`console`,Z=`mobile`,Q=`tablet`,$=`smarttv`,zf=`wearable`,Bf=`xr`,Vf=`embedded`,Hf=`inapp`,Uf=`brands`,Wf=`formFactors`,Gf=`fullVersionList`,Kf=`platform`,qf=`platformVersion`,Jf=`bitness`,Yf=`sec-ch-ua`,Xf=Yf+`-full-version-list`,Zf=Yf+`-arch`,Qf=Yf+`-`+Jf,$f=Yf+`-form-factors`,ep=Yf+`-`+Z,tp=Yf+`-`+X,np=Yf+`-`+Kf,rp=np+`-version`,ip=[Uf,Gf,Z,X,Kf,qf,If,Wf,Jf],ap=`Amazon`,op=`Apple`,sp=`ASUS`,cp=`BlackBerry`,lp=`Google`,up=`Huawei`,dp=`Lenovo`,fp=`Honor`,pp=`LG`,mp=`Microsoft`,hp=`Motorola`,gp=`Nvidia`,_p=`OnePlus`,vp=`OPPO`,yp=`Samsung`,bp=`Sharp`,xp=`Sony`,Sp=`Xiaomi`,Cp=`Zebra`,wp=`Chrome`,Tp=`Chromium`,Ep=`Chromecast`,Dp=`Edge`,Op=`Firefox`,kp=`Opera`,Ap=`Facebook`,jp=`Sogou`,Mp=`Mobile `,Np=` Browser`,Pp=`Windows`,Fp=typeof window!==G.UNDEFINED&&window.navigator?window.navigator:void 0,Ip=Fp&&Fp.userAgentData?Fp.userAgentData:void 0,Lp=function(e,t){var n={},r=t;if(!Bp(t))for(var i in r={},t)for(var a in t[i])r[a]=t[i][a].concat(r[a]?r[a]:[]);for(var o in e)n[o]=r[o]&&r[o].length%2==0?r[o].concat(e[o]):e[o];return n},Rp=function(e){for(var t={},n=0;n<e.length;n++)t[e[n].toUpperCase()]=e[n];return t},zp=function(e,t){if(typeof e===G.OBJECT&&e.length>0){for(var n in e)if(Up(t)==Up(e[n]))return!0;return!1}return Vp(e)?Up(t)==Up(e):!1},Bp=function(e,t){for(var n in e)return/^(browser|cpu|device|engine|os)$/.test(n)||(t?Bp(e[n]):!1)},Vp=function(e){return typeof e===G.STRING},Hp=function(e){if(e){for(var t=[],n=Kp(/\\?\"/g,e).split(`,`),r=0;r<n.length;r++)if(n[r].indexOf(`;`)>-1){var i=Jp(n[r]).split(`;v=`);t[r]={brand:i[0],version:i[1]}}else t[r]=Jp(n[r]);return t}},Up=function(e){return Vp(e)?e.toLowerCase():e},Wp=function(e){return Vp(e)?Kp(/[^\d\.]/g,e).split(`.`)[0]:void 0},Gp=function(e){for(var t in e)if(e.hasOwnProperty(t)){var n=e[t];typeof n==G.OBJECT&&n.length==2?this[n[0]]=n[1]:this[n]=void 0}return this},Kp=function(e,t){return Vp(t)?t.replace(e,Of):t},qp=function(e){return Kp(/\\?\"/g,e)},Jp=function(e,t){return e=Kp(/^\s\s*/,String(e)),typeof t===G.UNDEFINED?e:e.substring(0,t)},Yp=function(e,t){if(!(!e||!t))for(var n=0,r,i,a,o,s,c;n<t.length&&!s;){var l=t[n],u=t[n+1];for(r=i=0;r<l.length&&!s&&l[r];)if(s=l[r++].exec(e),s)for(a=0;a<u.length;a++)c=s[++i],o=u[a],typeof o===G.OBJECT&&o.length>0?o.length===2?typeof o[1]==G.FUNCTION?this[o[0]]=o[1].call(this,c):this[o[0]]=o[1]:o.length>=3&&(typeof o[1]===G.FUNCTION&&!(o[1].exec&&o[1].test)?o.length>3?this[o[0]]=c?o[1].apply(this,o.slice(2)):void 0:this[o[0]]=c?o[1].call(this,c,o[2]):void 0:o.length==3?this[o[0]]=c?c.replace(o[1],o[2]):void 0:o.length==4?this[o[0]]=c?o[3].call(this,c.replace(o[1],o[2])):void 0:o.length>4&&(this[o[0]]=c?o[3].apply(this,[c.replace(o[1],o[2])].concat(o.slice(4))):void 0)):this[o]=c||void 0;n+=2}},Xp=function(e,t){for(var n in t)if(typeof t[n]===G.OBJECT&&t[n].length>0){for(var r=0;r<t[n].length;r++)if(zp(t[n][r],e))return n===kf?void 0:n}else if(zp(t[n],e))return n===kf?void 0:n;return t.hasOwnProperty(`*`)?t[`*`]:e},Zp={ME:`4.90`,"NT 3.51":`3.51`,"NT 4.0":`4.0`,2e3:[`5.0`,`5.01`],XP:[`5.1`,`5.2`],Vista:`6.0`,7:`6.1`,8:`6.2`,"8.1":`6.3`,10:[`6.4`,`10.0`],NT:``},Qp={embedded:`Automotive`,mobile:`Mobile`,tablet:[`Tablet`,`EInk`],smarttv:`TV`,wearable:`Watch`,xr:[`VR`,`XR`],"?":[`Desktop`,`Unknown`],"*":void 0},$p={Chrome:`Google Chrome`,Edge:`Microsoft Edge`,"Edge WebView2":`Microsoft Edge WebView2`,"Chrome WebView":`Android WebView`,"Chrome Headless":`HeadlessChrome`,"Huawei Browser":`HuaweiBrowser`,"MIUI Browser":`Miui Browser`,"Opera Mobi":`OperaMobile`,Yandex:`YaBrowser`},em={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[Y,[K,Mp+`Chrome`]],[/webview.+edge\/([\w\.]+)/i],[Y,[K,Dp+` WebView`]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[Y,[K,`Edge`]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[K,Y],[/opios[\/ ]+([\w\.]+)/i],[Y,[K,kp+` Mini`]],[/\bop(?:rg)?x\/([\w\.]+)/i],[Y,[K,kp+` GX`]],[/\bopr\/([\w\.]+)/i],[Y,[K,kp]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[Y,[K,`Baidu`]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[Y,[K,`Maxthon`]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[K,Y],[/quark(?:pc)?\/([-\w\.]+)/i],[Y,[K,`Quark`]],[/\bddg\/([\w\.]+)/i],[Y,[K,`DuckDuckGo`]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[Y,[K,`UCBrowser`]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[Y,[K,`WeChat`]],[/konqueror\/([\w\.]+)/i],[Y,[K,`Konqueror`]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[Y,[K,`IE`]],[/ya(?:search)?browser\/([\w\.]+)/i],[Y,[K,`Yandex`]],[/slbrowser\/([\w\.]+)/i],[Y,[K,`Smart `+dp+Np]],[/(avast|avg)\/([\w\.]+)/i],[[K,/(.+)/,`$1 Secure`+Np],Y],[/\bfocus\/([\w\.]+)/i],[Y,[K,Op+` Focus`]],[/\bopt\/([\w\.]+)/i],[Y,[K,kp+` Touch`]],[/coc_coc\w+\/([\w\.]+)/i],[Y,[K,`Coc Coc`]],[/dolfin\/([\w\.]+)/i],[Y,[K,`Dolphin`]],[/coast\/([\w\.]+)/i],[Y,[K,kp+` Coast`]],[/miuibrowser\/([\w\.]+)/i],[Y,[K,`MIUI`+Np]],[/fxios\/([\w\.-]+)/i],[Y,[K,Mp+Op]],[/\bqihoobrowser\/?([\w\.]*)/i],[Y,[K,`360`]],[/\b(qq)\/([\w\.]+)/i],[[K,/(.+)/,`$1Browser`],Y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[K,/(.+)/,`$1`+Np],Y],[/samsungbrowser\/([\w\.]+)/i],[Y,[K,yp+` Internet`]],[/metasr[\/ ]?([\d\.]+)/i],[Y,[K,jp+` Explorer`]],[/(sogou)mo\w+\/([\d\.]+)/i],[[K,jp+` Mobile`],Y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[K,Y],[/(lbbrowser|rekonq|steam(?= (clie|tenf|gameo)))/i],[K],[/ome\/([\w\.]+) \w* ?(iron) saf/i,/ome\/([\w\.]+).+qihu (360)[es]e/i],[Y,K],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[K,Ap],Y,[q,Hf]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[K,Y,[q,Hf]],[/\bgsa\/([\w\.]+) .*safari\//i],[Y,[K,`GSA`],[q,Hf]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[Y,[K,`TikTok`],[q,Hf]],[/\[(linkedin)app\]/i],[K,[q,Hf]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[K,/(.+)/,`Zalo`],Y,[q,Hf]],[/(chromium)[\/ ]([-\w\.]+)/i],[K,Y],[/headlesschrome(?:\/([\w\.]+)| )/i],[Y,[K,wp+` Headless`]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[Y,[K,Dp+` WebView2`]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[K,wp+` WebView`],Y],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[Y,[K,`Android`+Np]],[/chrome\/([\w\.]+) mobile/i],[Y,[K,Mp+`Chrome`]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[K,Y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[Y,[K,Mp+`Safari`]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[K,Mp+`Safari`]],[/version\/([\w\.\,]+) .*(safari)/i],[Y,K],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[K,[Y,`1`]],[/(webkit|khtml)\/([\w\.]+)/i],[K,Y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[K,Mp+Op],Y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[K,`Netscape`],Y],[/(wolvic|librewolf)\/([\w\.]+)/i],[K,Y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[Y,[K,Op+` Reality`]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[K,[Y,/_/g,`.`]],[/(cobalt)\/([\w\.]+)/i],[K,[Y,/[^\d\.]+./,Of]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[If,`amd64`]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[If,`ia32`]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[If,`arm64`]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[If,`armhf`]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[If,`arm`]],[/ sun4\w[;\)]/i],[[If,`sparc`]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[If,/ower/,Of,Up]],[/mc680.0/i],[[If,`68k`]],[/winnt.+\[axp/i],[[If,`alpha`]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[X,[J,yp],[q,Q]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[X,[J,yp],[q,Z]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[X,[J,op],[q,Z]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[X,[J,op],[q,Q]],[/(macintosh);/i],[X,[J,op]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[X,[J,bp],[q,Z]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[X,[J,fp],[q,Q]],[/honor([-\w ]+)[;\)]/i],[X,[J,fp],[q,Z]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[X,[J,up],[q,Q]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[X,[J,up],[q,Z]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[X,/_/g,` `],[J,Sp],[q,Q]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[X,/_/g,` `],[J,Sp],[q,Z]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[X,[J,_p],[q,Z]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[X,[J,vp],[q,Z]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[X,[J,Xp,{OnePlus:[`203`,`304`,`403`,`404`,`413`,`415`],"*":vp}],[q,Q]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[X,[J,`BLU`],[q,Z]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[X,[J,`Vivo`],[q,Z]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[X,[J,`Realme`],[q,Z]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[X,[J,dp],[q,Q]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[X,[J,dp],[q,Z]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[X,[J,hp],[q,Z]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[X,[J,hp],[q,Q]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[X,[J,pp],[q,Q]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[X,[J,pp],[q,Z]],[/(nokia) (t[12][01])/i],[J,X,[q,Q]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[X,/_/g,` `],[q,Z],[J,`Nokia`]],[/(pixel (c|tablet))\b/i],[X,[J,lp],[q,Q]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[X,[J,lp],[q,Z]],[/(google) (pixelbook( go)?)/i],[J,X],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[X,[J,xp],[q,Z]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[X,`Xperia Tablet`],[J,xp],[q,Q]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[X,[J,ap],[q,Q]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[X,/(.+)/g,`Fire Phone $1`],[J,ap],[q,Z]],[/(playbook);[-\w\),; ]+(rim)/i],[X,J,[q,Q]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[X,[J,cp],[q,Z]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[X,[J,sp],[q,Q]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[X,[J,sp],[q,Z]],[/(nexus 9)/i],[X,[J,`HTC`],[q,Q]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[J,[X,/_/g,` `],[q,Z]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Q]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Z]],[/(itel) ((\w+))/i],[[J,Up],X,[q,Xp,{tablet:[`p10001l`,`w7001`],"*":`mobile`}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[X,[J,`Acer`],[q,Q]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[X,[J,`Meizu`],[q,Z]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[X,[J,`Ulefone`],[q,Z]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[X,[J,`Energizer`],[q,Z]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[X,[J,`Cat`],[q,Z]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[X,[J,`Smartfren`],[q,Z]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[X,[J,`Nothing`],[q,Z]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[X,[J,`Archos`],[q,Q]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[X,[J,`Archos`],[q,Z]],[/; (n159v)/i],[X,[J,`HMD`],[q,Z]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[J,X,[q,Q]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[J,X,[q,Z]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[J,X,[q,Q]],[/(surface duo)/i],[X,[J,mp],[q,Q]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[X,[J,`Fairphone`],[q,Z]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[X,[J,gp],[q,Q]],[/(sprint) (\w+)/i],[J,X,[q,Z]],[/(kin\.[onetw]{3})/i],[[X,/\./g,` `],[J,mp],[q,Z]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[X,[J,Cp],[q,Q]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[X,[J,Cp],[q,Z]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[J,[q,$]],[/hbbtv.+maple;(\d+)/i],[[X,/^/,`SmartTV`],[J,yp],[q,$]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[J,X,[q,$]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[J,pp],[q,$]],[/(apple) ?tv/i],[J,[X,op+` TV`],[q,$]],[/crkey.*devicetype\/chromecast/i],[[X,Ep+` Third Generation`],[J,lp],[q,$]],[/crkey.*devicetype\/([^/]*)/i],[[X,/^/,`Chromecast `],[J,lp],[q,$]],[/fuchsia.*crkey/i],[[X,Ep+` Nest Hub`],[J,lp],[q,$]],[/crkey/i],[[X,Ep],[J,lp],[q,$]],[/(portaltv)/i],[X,[J,Ap],[q,$]],[/droid.+aft(\w+)( bui|\))/i],[X,[J,ap],[q,$]],[/(shield \w+ tv)/i],[X,[J,gp],[q,$]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[X,[J,bp],[q,$]],[/(bravia[\w ]+)( bui|\))/i],[X,[J,xp],[q,$]],[/(mi(tv|box)-?\w+) bui/i],[X,[J,Sp],[q,$]],[/Hbbtv.*(technisat) (.*);/i],[J,X,[q,$]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[J,/.+\/(\w+)/,`$1`,Xp,{LG:`lge`}],[X,Jp],[q,$]],[/(playstation \w+)/i],[X,[J,xp],[q,Rf]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[X,[J,mp],[q,Rf]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[J,Xp,{Nvidia:`Shield`,Anbernic:`RGCUBE`,Logitech:`GR0006`}],X,[q,Rf]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[X,[J,yp],[q,zf]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[J,X,[q,zf]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[X,[J,vp],[q,zf]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[X,[J,op],[q,zf]],[/(opwwe\d{3})/i],[X,[J,_p],[q,zf]],[/(moto 360)/i],[X,[J,hp],[q,zf]],[/(smartwatch 3)/i],[X,[J,xp],[q,zf]],[/(g watch r)/i],[X,[J,pp],[q,zf]],[/droid.+; (wt63?0{2,3})\)/i],[X,[J,Cp],[q,zf]],[/droid.+; (glass) \d/i],[X,[J,lp],[q,Bf]],[/(pico) ([\w ]+) os\d/i],[J,X,[q,Bf]],[/(quest( \d| pro)?s?).+vr/i],[X,[J,Ap],[q,Bf]],[/mobile vr; rv.+firefox/i],[[q,Bf]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[J,[q,Vf]],[/(aeobc)\b/i],[X,[J,ap],[q,Vf]],[/(homepod).+mac os/i],[X,[J,op],[q,Vf]],[/windows iot/i],[[q,Vf]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[X,[q,$]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[q,$]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[X,[q,Xp,{mobile:`Mobile`,xr:`VR`,"*":Q}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[q,Q]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[q,Z]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[X,[J,`Generic`]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[Y,[K,Dp+`HTML`]],[/(arkweb)\/([\w\.]+)/i],[K,Y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[Y,[K,`Blink`]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[K,Y],[/ladybird\//i],[[K,`LibWeb`]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[Y,K]],os:[[/(windows nt) (6\.[23]); arm/i],[[K,/N/,`R`],[Y,Xp,Zp]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[K,Y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[Y,/(;|\))/g,``,Xp,Zp],[K,Pp]],[/(windows ce)\/?([\d\.]*)/i],[K,Y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[Y,/_/g,`.`],[K,`iOS`]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[K,`macOS`],[Y,/_/g,`.`]],[/android ([\d\.]+).*crkey/i],[Y,[K,Ep+` Android`]],[/fuchsia.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Fuchsia`]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[Y,[K,Ep+` SmartSpeaker`]],[/linux.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Linux`]],[/crkey\/([\d\.]+)/i],[Y,[K,Ep]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[Y,K],[/(ubuntu) ([\w\.]+) like android/i],[[K,/(.+)/,`$1 Touch`],Y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[K,Y],[/\(bb(10);/i],[Y,[K,cp]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[Y,[K,`Symbian`]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[Y,[K,Op+` OS`]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[Y,[K,`webOS`]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[Y,Xp,{25:`120`,24:`108`,23:`94`,22:`87`,6:`79`,5:`68`,4:`53`,3:`38`,2:`538`,1:`537`,"*":`TV`}],[K,`webOS`]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[Y,[K,`watchOS`]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[K,`Chrome OS`],Y],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[K,Y],[/(sunos) ?([\d\.]*)/i],[[K,`Solaris`],Y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[K,Y]]},tm=(function(){var e={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}};return Gp.call(e.init,[[Af,[K,Y,Lf,q]],[jf,[If]],[Mf,[q,X,J]],[Nf,[K,Y]],[Pf,[K,Y]]]),Gp.call(e.isIgnore,[[Af,[Y,Lf]],[Nf,[Y]],[Pf,[Y]]]),Gp.call(e.isIgnoreRgx,[[Af,/ ?browser$/i],[Pf,/ ?os$/i]]),Gp.call(e.toString,[[Af,[K,Y]],[jf,[If]],[Mf,[J,X]],[Nf,[K,Y]],[Pf,[K,Y]]]),e})(),nm=function(e,t){var n=tm.init[t],r=tm.isIgnore[t]||0,i=tm.isIgnoreRgx[t]||0,a=tm.toString[t]||0;function o(){Gp.call(this,n)}return o.prototype.getItem=function(){return e},o.prototype.withClientHints=function(){return Ip?Ip.getHighEntropyValues(ip).then(function(t){return e.setCH(new rm(t,!1)).parseCH().get()}):e.parseCH().get()},o.prototype.withFeatureCheck=function(){return e.detectFeature().get()},t!=Ff&&(o.prototype.is=function(e){var t=!1;for(var n in this)if(this.hasOwnProperty(n)&&!zp(r,n)&&Up(i?Kp(i,this[n]):this[n])==Up(i?Kp(i,e):e)){if(t=!0,e!=G.UNDEFINED)break}else if(e==G.UNDEFINED&&t){t=!t;break}return t},o.prototype.toString=function(){var e=Of;for(var t in a)typeof this[a[t]]!==G.UNDEFINED&&(e+=(e?` `:Of)+this[a[t]]);return e||G.UNDEFINED}),o.prototype.then=function(e){var t=this,n=function(){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])};n.prototype={is:o.prototype.is,toString:o.prototype.toString,withClientHints:o.prototype.withClientHints,withFeatureCheck:o.prototype.withFeatureCheck};var r=new n;return e(r),r},new o};function rm(e,t){if(e||={},Gp.call(this,ip),t)Gp.call(this,[[Uf,Hp(e[Yf])],[Gf,Hp(e[Xf])],[Z,/\?1/.test(e[ep])],[X,qp(e[tp])],[Kf,qp(e[np])],[qf,qp(e[rp])],[If,qp(e[Zf])],[Wf,Hp(e[$f])],[Jf,qp(e[Qf])]]);else for(var n in e)this.hasOwnProperty(n)&&typeof e[n]!==G.UNDEFINED&&(this[n]=e[n])}function im(e,t,n,r){return Gp.call(this,[[`itemType`,e],[`ua`,t],[`uaCH`,r],[`rgxMap`,n],[`data`,nm(this,e)]]),this}im.prototype.get=function(e){return e?this.data.hasOwnProperty(e)?this.data[e]:void 0:this.data},im.prototype.set=function(e,t){return this.data[e]=t,this},im.prototype.setCH=function(e){return this.uaCH=e,this},im.prototype.detectFeature=function(){if(Fp&&Fp.userAgent==this.ua)switch(this.itemType){case Af:Fp.brave&&typeof Fp.brave.isBrave==G.FUNCTION&&this.set(K,`Brave`);break;case Mf:!this.get(q)&&Ip&&Ip[Z]&&this.set(q,Z),this.get(X)==`Macintosh`&&Fp&&typeof Fp.standalone!==G.UNDEFINED&&Fp.maxTouchPoints&&Fp.maxTouchPoints>2&&this.set(X,`iPad`).set(q,Q);break;case Pf:!this.get(K)&&Ip&&Ip[Kf]&&this.set(K,Ip[Kf]);break;case Ff:var e=this.data,t=function(t){return e[t].getItem().detectFeature().get()};this.set(Af,t(Af)).set(jf,t(jf)).set(Mf,t(Mf)).set(Nf,t(Nf)).set(Pf,t(Pf))}return this},im.prototype.parseUA=function(){switch(this.itemType!=Ff&&Yp.call(this.data,this.ua,this.rgxMap),this.itemType){case Af:this.set(Lf,Wp(this.get(Y)));break;case Pf:if(this.get(K)==`iOS`&&this.get(Y)==`18.6`){var e=/\) Version\/([\d\.]+)/.exec(this.ua);e&&parseInt(e[1].substring(0,2),10)>=26&&this.set(Y,e[1])}break}return this},im.prototype.parseCH=function(){var e=this.uaCH,t=this.rgxMap;switch(this.itemType){case Af:case Nf:var n=e[Gf]||e[Uf],r;if(n)for(var i=0;i<n.length;i++){var a=n[i].brand||n[i],o=n[i].version;this.itemType==Af&&!/not.a.brand/i.test(a)&&(!r||/Chrom/.test(r)&&a!=Tp||r==Dp&&/WebView2/.test(a))&&(a=Xp(a,$p),r=this.get(K),r&&!/Chrom/.test(r)&&/Chrom/.test(a)||this.set(K,a).set(Y,o).set(Lf,Wp(o)),r=a),this.itemType==Nf&&a==Tp&&this.set(Y,o)}break;case jf:var s=e[If];s&&(s&&e[Jf]==`64`&&(s+=`64`),Yp.call(this.data,s+`;`,t));break;case Mf:if(e[Z]&&this.set(q,Z),e[X]&&(this.set(X,e[X]),!this.get(q)||!this.get(J))){var c={};Yp.call(c,`droid 9; `+e[X]+`)`,t),!this.get(q)&&c.type&&this.set(q,c.type),!this.get(J)&&c.vendor&&this.set(J,c.vendor)}if(e[Wf]){var l;if(typeof e[Wf]!=`string`)for(var u=0;!l&&u<e[Wf].length;)l=Xp(e[Wf][u++],Qp);else l=Xp(e[Wf],Qp);this.set(q,l)}break;case Pf:var d=e[Kf];if(d){var f=e[qf];d==Pp&&(f=parseInt(Wp(f),10)>=13?`11`:`10`),this.set(K,d).set(Y,f)}this.get(K)==Pp&&e[X]==`Xbox`&&this.set(K,`Xbox`).set(Y,void 0);break;case Ff:var p=this.data,m=function(t){return p[t].getItem().setCH(e).parseCH().get()};this.set(Af,m(Af)).set(jf,m(jf)).set(Mf,m(Mf)).set(Nf,m(Nf)).set(Pf,m(Pf))}return this};function am(e,t,n){if(typeof e===G.OBJECT?(Bp(e,!0)?(typeof t===G.OBJECT&&(n=t),t=e):(n=e,t=void 0),e=void 0):typeof e===G.STRING&&!Bp(t,!0)&&(n=t,t=void 0),n)if(typeof n.append===G.FUNCTION){var r={};n.forEach(function(e,t){r[String(t).toLowerCase()]=e}),n=r}else{var i={};for(var a in n)n.hasOwnProperty(a)&&(i[String(a).toLowerCase()]=n[a]);n=i}if(!(this instanceof am))return new am(e,t,n).getResult();var o=typeof e===G.STRING?e:n&&n[Df]?n[Df]:Fp&&Fp.userAgent?Fp.userAgent:Of,s=new rm(n,!0),c=t?Lp(em,t):em,l=function(e){return e==Ff?function(){return new im(e,o,c,s).set(`ua`,o).set(Af,this.getBrowser()).set(jf,this.getCPU()).set(Mf,this.getDevice()).set(Nf,this.getEngine()).set(Pf,this.getOS()).get()}:function(){return new im(e,o,c[e],s).parseUA().get()}};return Gp.call(this,[[`getBrowser`,l(Af)],[`getCPU`,l(jf)],[`getDevice`,l(Mf)],[`getEngine`,l(Nf)],[`getOS`,l(Pf)],[`getResult`,l(Ff)],[`getUA`,function(){return o}],[`setUA`,function(e){return Vp(e)&&(o=Jp(e,Ef)),this}]]).setUA(o),this}am.VERSION=Tf,am.BROWSER=Rp([K,Y,Lf,q]),am.CPU=Rp([If]),am.DEVICE=Rp([X,J,q,Rf,Z,$,Q,zf,Vf]),am.ENGINE=am.OS=Rp([K,Y]);function om(e){return{recording:{onStateChange:t=>{e.updateState({recordingState:t})},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:t=>{e.updateState({error:i(t)})},onRecordingComplete:t=>{e.updateState({countdown:null})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onStopAudioTracking:()=>{},onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(_d(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:t=>{e.updateState({error:i(t)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>{},onUploadComplete:()=>{},onUploadError:()=>{}},onStorageCleanupError:e=>{console.error(e)}}}function sm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function cm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function lm(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function um(e,t,n,r){return await e.stopRecording()}function dm(e){e.pauseRecording()}function fm(e){e.resumeRecording()}async function pm(e,t){await e.switchSource(t)}function mm(e){return e.toggleMute(),e.getIsMuted()}function hm(e){if(!e)return;let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`recording-${Date.now()}.mp4`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)}var gm=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new $d}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}};let _m=()=>`
|
|
8426
|
+
`],{type:`application/javascript`});return rf=URL.createObjectURL(e),rf}var of=class{constructor(){this.worker=null,this.chunks=[],this.totalSize=0,this.isActive=!1,this.videoTrackClone=null,this.audioTrackClone=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.setupWorker()}setupWorker(){if(typeof Worker>`u`)throw W.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);try{W.debug(`[WorkerProcessor] Setting up worker`);let e=af();W.debug(`[WorkerProcessor] Worker URL created`,{urlType:typeof e,isBlobUrl:e.startsWith(`blob:`)}),this.worker=new Worker(e,{type:`classic`}),W.debug(`[WorkerProcessor] Worker created successfully`),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),W.debug(`[WorkerProcessor] Worker event handlers attached`)}catch(e){let t=e instanceof Error?e.message:String(e);throw W.error(`[WorkerProcessor] Failed to create worker:`,e),Error(`Failed to create worker: ${t}`)}}handleWorkerMessage(e){let t=e.data;switch(t.type){case`ready`:W.debug(`[WorkerProcessor] Worker ready`),this.readyPromiseResolve&&=(this.readyPromiseResolve(),null);break;case`error`:W.error(`[WorkerProcessor] Worker error:`,t.error),this.onError&&this.onError(Error(t.error));break;case`chunk`:this.chunks.push({data:t.data,position:t.position}),this.totalSize=Math.max(this.totalSize,t.position+t.data.length);break;case`bufferUpdate`:this.onBufferUpdate&&this.onBufferUpdate(t.size,t.formatted);break;case`stateChange`:W.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;default:W.warn(`[WorkerProcessor] Unknown response type:`,t)}}handleWorkerError(e){W.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.onError&&this.onError(Error(e.message||`Unknown worker error`))}async startProcessing(e,t,n){if(!this.worker)throw Error(`Worker not initialized`);if(this.isActive)throw Error(`Processing already active`);this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.overlayConfig=n||null;let r=t.format||`mp4`,i=t.audioCodec||pd(r),a=ef(e),o=t.codec||await nf(t.width,t.height,t.bitrate);W.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:a,fps:t.fps,codec:o,bitrate:t.bitrate});let s={width:t.width,height:t.height,fps:t.fps,bitrate:tf(t.bitrate),audioCodec:i,audioBitrate:t.audioBitrate,codec:o,keyFrameInterval:5,format:r,watermark:t.watermark},c=e.getVideoTracks(),l=e.getAudioTracks();W.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:c.length,audioTracksCount:l.length,hasWorker:!!this.worker});let u=null,d=null;if(c.length>0){this.stopCurrentVideoTrack();let e=c[0];u=this.cloneVideoTrack(e),this.currentVideoTrack=u}if(l.length>0){let e=l[0];d=this.cloneAudioTrack(e)}W.debug(`[WorkerProcessor] Track details`,{hasVideoTrack:!!u,videoTrackId:u?.id,videoTrackKind:u?.kind,videoTrackReadyState:u?.readyState,hasAudioTrack:!!d,audioTrackId:d?.id,audioTrackKind:d?.kind,audioTrackReadyState:d?.readyState});let f=u===null?null:new MediaStreamTrackProcessor({track:u}).readable,p=d===null?null:new MediaStreamTrackProcessor({track:d}).readable,m={type:`start`,videoStream:f,audioStream:p,config:s,overlayConfig:this.overlayConfig||void 0},h=[];f&&h.push(f),p&&h.push(p),W.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:h.length,messageType:m.type});let g=new Promise(e=>{this.readyPromiseResolve=e});try{this.worker.postMessage(m,h),W.debug(`[WorkerProcessor] Message posted successfully`),await g,W.debug(`[WorkerProcessor] Worker confirmed ready`)}catch(e){throw W.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,e}}pause(){this.worker&&this.isActive&&this.worker.postMessage({type:`pause`})}resume(){this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`resume`})}isWorkerActive(){return!!(this.worker&&this.isActive)}toggleMute(){this.isMuted=!this.isMuted,this.onMuteStateChange&&this.onMuteStateChange(this.isMuted),this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`toggleMute`})}switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return W.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if(W.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return W.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=ef(e);W.debug(`[WorkerProcessor] Source type detected`,{isScreenCapture:n,targetFps:30}),this.worker.postMessage({type:`updateFps`,fps:30});let r={type:`updateSourceType`,isScreenCapture:n};this.worker.postMessage(r);let i=t[0];this.stopCurrentVideoTrack();let a=this.cloneVideoTrack(i);W.debug(`[WorkerProcessor] New video track details`,{trackId:a.id,trackKind:a.kind,trackReadyState:a.readyState}),this.currentVideoTrack=a;let o={type:`switchSource`,videoStream:new MediaStreamTrackProcessor({track:a}).readable};try{W.debug(`[WorkerProcessor] Posting switch source message`);let e=[];return o.videoStream&&e.push(o.videoStream),this.worker.postMessage(o,e),W.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw W.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);return new Promise((e,t)=>{let n=setTimeout(()=>{t(Error(`Finalize timeout`))},3e4),r=i=>{let a=i.data;a.type===`stateChange`&&a.state===`stopped`?(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),this.isActive=!1,e(this.createBlobFromChunks())):a.type===`error`&&(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),t(Error(a.error)))};this.worker&&(this.worker.addEventListener(`message`,r),this.worker.postMessage({type:`stop`}))})}createBlobFromChunks(){let e=[...this.chunks].sort((e,t)=>e.position-t.position),t=new ArrayBuffer(this.totalSize),n=new Uint8Array(t);for(let t of e)n.set(t.data,t.position);return{blob:new Blob([t],{type:`video/mp4`}),totalSize:this.totalSize}}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,Promise.resolve()}getBufferSize(){return this.totalSize}getMutedState(){return this.isMuted}updateTabVisibility(e,t){if(!(this.isWorkerActive()&&this.worker)){W.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/1e3});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){W.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}isPausedState(){return this.isPaused}getClonedAudioTrack(){return this.audioTrackClone}getAudioStreamForAnalysis(){return this.audioTrackClone?new MediaStream([this.audioTrackClone]):null}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnMuteStateChange(e){this.onMuteStateChange=e}cloneVideoTrack(e){if(W.debug(`[WorkerProcessor] Original video track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.videoTrackClone=t,W.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone video track:`,e),Error(`Failed to clone video track: ${e instanceof Error?e.message:String(e)}`)}return W.warn(`[WorkerProcessor] Video track clone() not available, using original`),this.videoTrackClone=e,e}cloneAudioTrack(e){if(W.debug(`[WorkerProcessor] Original audio track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.audioTrackClone=t,W.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone audio track:`,e),Error(`Failed to clone audio track: ${e instanceof Error?e.message:String(e)}`)}return W.warn(`[WorkerProcessor] Audio track clone() not available, using original`),this.audioTrackClone=e,e}stopCurrentVideoTrack(){this.currentVideoTrack&&this.currentVideoTrack.readyState===`live`&&this.currentVideoTrack.stop(),this.currentVideoTrack=null}cleanup(){this.worker&&=(this.worker.terminate(),null),rf&&=(URL.revokeObjectURL(rf),null),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}static isSupported(){return typeof Worker<`u`&&typeof MediaStreamTrackProcessor<`u`&&typeof VideoFrame<`u`&&typeof AudioData<`u`&&typeof OffscreenCanvas<`u`}},sf=class{constructor(){if(this.currentVideoStream=null,!of.isSupported())throw Error(`Web Workers are required for video processing. Please use a modern browser that supports Web Workers, MediaStreamTrackProcessor, VideoFrame, and AudioData APIs.`);try{this.workerProcessor=new of,W.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to initialize worker: ${t}. Web Workers are required for video processing.`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{W.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t})}),this.workerProcessor.setOnError(e=>{W.error(`[StreamProcessor] Worker error:`,e)}),this.currentVideoStream=e,await this.workerProcessor.startProcessing(e,t,n)}updateTabVisibility(e,t){this.workerProcessor.updateTabVisibility(e,t)}updateSourceType(e){this.workerProcessor.updateSourceType(e)}pause(){this.workerProcessor.pause()}resume(){this.workerProcessor.resume()}isPausedState(){return this.workerProcessor.isPausedState()}async finalize(){return W.debug(`[StreamProcessor] finalize called`),await this.workerProcessor.finalize()}toggleMute(){this.workerProcessor.toggleMute()}isMutedState(){return this.workerProcessor.getMutedState()}getClonedAudioTrack(){return this.workerProcessor.getClonedAudioTrack()}getAudioStreamForAnalysis(){return this.workerProcessor.getAudioStreamForAnalysis()}async switchVideoSource(e){await this.workerProcessor.switchVideoSource(e),this.currentVideoStream=e,this.onSourceChange&&this.onSourceChange(e)}getCurrentVideoSource(){return this.currentVideoStream}getBufferSize(){return this.workerProcessor.getBufferSize()}setOnMuteStateChange(e){this.workerProcessor.setOnMuteStateChange(e)}setOnSourceChange(e){this.onSourceChange=e}async cancel(){await this.workerProcessor.cancel(),this.workerProcessor.cleanup(),this.currentVideoStream=null}};let cf=1e3,lf=`recording`,uf=`idle`;var df=class{constructor(e,t){this.recordingState=uf,this.countdownDuration=5e3,this.countdownRemaining=0,this.countdownTimeoutId=null,this.countdownIntervalId=null,this.countdownStartTime=null,this.isPaused=!1,this.maxRecordingTime=null,this.maxTimeTimer=null,this.recordingStartTime=null,this.maxTimeRemaining=null,this.recordingSeconds=0,this.recordingIntervalId=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.originalCameraStream=null,this.enableTabVisibilityOverlay=!1,this.streamManager=e,this.callbacks=t}setCountdownDuration(e){this.countdownDuration=e}setMaxRecordingTime(e){this.maxRecordingTime=e}setTabVisibilityOverlayConfig(e,t){this.enableTabVisibilityOverlay=e,this.tabVisibilityOverlayText=t}getRecordingState(){return this.recordingState}isPausedState(){return this.isPaused}getRecordingSeconds(){return this.recordingSeconds}getStreamProcessor(){return this.streamProcessor}updateSourceType(e){this.recordingState!==lf||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=uf,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/cf),this.countdownStartTime=Date.now(),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining),this.countdownIntervalId=window.setInterval(()=>{if(!this.countdownStartTime)return;let e=Date.now()-this.countdownStartTime;this.countdownRemaining=Math.max(0,Math.ceil((this.countdownDuration-e)/cf)),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>{})},this.countdownDuration)}async doStartRecording(){W.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.recordingState=lf,this.callbacks.onStateChange(this.recordingState),this.resetRecordingState();let e=this.streamManager.getStream();if(W.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){W.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,W.debug(`[RecordingManager] Creating new StreamProcessor`),this.streamProcessor=new sf,W.debug(`[RecordingManager] StreamProcessor created:`,!!this.streamProcessor);let t=await this.callbacks.onGetConfig().then(e=>({config:e,error:null})).catch(e=>({config:null,error:e}));if(t.error){this.handleError(t.error),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}if(!t.config){this.handleError(Error(`Failed to get recording config`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}W.debug(`[RecordingManager] Starting recording with stream manager`);let n=await this.streamManager.startRecording(this.streamProcessor,t.config,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>(W.info(`[RecordingManager] Recording started successfully`),null)).catch(e=>(W.error(`[RecordingManager] Error starting recording:`,e),e));if(n){this.handleError(n),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.startRecordingTimer(),this.recordingStartTime=Date.now(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeRemaining=this.maxRecordingTime,this.startMaxTimeTimer())}async stopRecording(){W.debug(`[RecordingManager] stopRecording called`);try{this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState(),this.callbacks.onStopAudioTracking(),W.debug(`[RecordingManager] Stopping recording in stream manager`);let e=(await this.streamManager.stopRecording()).blob;return W.info(`[RecordingManager] Recording stopped, blob size:`,e.size),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor=null,this.callbacks.onRecordingComplete(e),e}catch(e){throw this.handleError(e),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){if(!(this.recordingState!==lf||this.isPaused)&&(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now(),this.maxTimeTimer!==null&&this.recordingStartTime!==null&&this.maxRecordingTime!==null)){let e=Date.now()-this.recordingStartTime-this.totalPausedTime;this.maxTimeRemaining=Math.max(0,this.maxRecordingTime-e),this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}}resumeRecording(){this.recordingState!==lf||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer(),this.maxTimeRemaining!==null&&this.maxTimeRemaining>0&&this.startMaxTimeTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=uf,this.countdownRemaining=0,this.countdownStartTime=null,this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)}cleanup(){this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null,this.recordingStartTime=null,this.maxTimeRemaining=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}updatePausedDuration(){if(this.pauseStartTime===null)throw Error(`Pause start time not set`);let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}startRecordingTimer(){this.recordingIntervalId===null&&(this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1,this.callbacks.onTimerUpdate(Gd(this.recordingSeconds))},1e3))}startMaxTimeTimer(){this.maxTimeRemaining===null||this.maxTimeRemaining<=0||(this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===lf&&!this.isPaused&&await this.stopRecording()},this.maxTimeRemaining))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}};let ff=()=>{},pf=()=>{},mf=()=>{},hf=()=>{},gf=e=>{},_f=(e,t)=>{},vf=e=>{},yf=e=>{},bf=e=>{},xf=()=>{},Sf=e=>{};function Cf(){return{onProgress:ff,onSuccess:pf,onError:mf,onClearStatus:hf}}var wf=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.enableTabVisibilityOverlay=!1,this.callbacks=e,this.streamManager=new Zd,this.configManager=new Sd,this.storageManager=new Ad,this.deviceManager=new Cd(this.streamManager,e.device),this.audioLevelAnalyzer=new a,this.uploadService=new $d,this.uploadCallbacks=e.upload?e.upload:Cf();let t=this.createRecordingCallbacks(e);this.recordingManager=new df(this.streamManager,t);let n=this.createSourceSwitchCallbacks(e);this.sourceSwitchManager=new Rd(this.streamManager,n),e.stream&&(this.streamManager.on(`streamstart`,({stream:t})=>{W.debug(`[RecorderController] streamstart event received, calling callback`),e.stream?.onStreamStart&&e.stream.onStreamStart(t)}),this.streamManager.on(`streamstop`,()=>{W.debug(`[RecorderController] streamstop event received, calling callback`),e.stream?.onStreamStop&&e.stream.onStreamStop()}),this.streamManager.on(`error`,({error:t})=>{W.error(`[RecorderController] stream error event received, calling callback`,t),e.stream?.onError&&e.stream.onError(t)}))}async initialize(e){if(this.isInitialized)return;e.apiKey&&e.backendUrl&&await this.configManager.initialize(e.apiKey,e.backendUrl),e.countdownDuration!==void 0&&this.recordingManager.setCountdownDuration(e.countdownDuration),e.maxRecordingTime!==void 0&&this.recordingManager.setMaxRecordingTime(e.maxRecordingTime),e.enableTabVisibilityOverlay!==void 0&&(this.enableTabVisibilityOverlay=e.enableTabVisibilityOverlay),e.tabVisibilityOverlayText!==void 0&&(this.tabVisibilityOverlayText=e.tabVisibilityOverlayText),this.recordingManager.setTabVisibilityOverlayConfig(this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText);let t=this.callbacks.onStorageCleanupError??Sf;await this.storageManager.initialize(t);let n=this.storageManager.getStorageService();n&&this.uploadService&&(this.uploadQueueManager=new Qd(n,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t)},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t)}})),this.isInitialized=!0}async startStream(){W.debug(`[RecorderController] startStream called`),await this.streamManager.startStream(),W.debug(`[RecorderController] startStream completed`)}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){await this.recordingManager.startRecording()}async stopRecording(){let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),e}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.sourceSwitchManager.toggleSource()}setCameraDevice(e){this.deviceManager.setCameraDevice(e)}setMicDevice(e){this.deviceManager.setMicDevice(e)}getAvailableDevices(){return this.deviceManager.getAvailableDevices()}muteAudio(){this.streamManager.muteAudio()}unmuteAudio(){this.streamManager.unmuteAudio()}toggleMute(){this.streamManager.toggleMute()}getIsMuted(){return this.streamManager.isMuted()}startAudioLevelTracking(e,t){if(!t)throw Error(`Audio level callbacks are required`);return this.audioLevelAnalyzer.startTracking(e,t,()=>this.streamManager.isMuted()),Promise.resolve()}stopAudioLevelTracking(){this.audioLevelAnalyzer.stopTracking()}getAudioLevel(){return this.audioLevelAnalyzer.getAudioLevel()}async uploadVideo(e,t,n,r){if(!this.uploadQueueManager)throw Error(`Upload queue manager not initialized`);this.uploadCallbacks.onClearStatus();let i=await wd(e),a=Object.keys(r).length>0?r:void 0;await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:`recording-${Date.now()}.mp4`,duration:i,metadata:void 0,userMetadata:a})}getStream(){return this.streamManager.getStream()}getRecordingState(){return this.recordingManager.getRecordingState()}isPaused(){return this.recordingManager.isPausedState()}getCurrentSourceType(){return this.sourceSwitchManager.getCurrentSourceType()}getOriginalCameraStream(){return this.sourceSwitchManager.getOriginalCameraStream()}getStreamManager(){return this.streamManager}getAudioStreamForAnalysis(){return this.streamManager.getAudioStreamForAnalysis()}getDeviceManager(){return this.deviceManager}getConfig(){return this.configManager.getConfig()}getUploadService(){return this.uploadService}isRecording(){return this.streamManager.isRecording()}isActive(){return this.streamManager.isActive()}cleanup(){this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}createRecordingCallbacks(e){let t=e.recording;return{onStateChange:t?.onStateChange??gf,onCountdownUpdate:t?.onCountdownUpdate??_f,onTimerUpdate:t?.onTimerUpdate??vf,onError:t?.onError??yf,onRecordingComplete:t?.onRecordingComplete??bf,onClearUploadStatus:t?.onClearUploadStatus??xf,onStopAudioTracking:()=>{this.audioLevelAnalyzer.stopTracking()},onGetConfig:()=>this.configManager.getConfig()}}createSourceSwitchCallbacks(e){let t=e.sourceSwitch;return{onSourceChange:t?.onSourceChange,onPreviewUpdate:t?.onPreviewUpdate,onError:t?.onError,onTransitionStart:t?.onTransitionStart,onTransitionEnd:t?.onTransitionEnd,onScreenSelectionStart:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!0)},onScreenSelectionEnd:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!1)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()}}},Tf=`2.0.7`,Ef=500,Df=`user-agent`,Of=``,kf=`?`,G={FUNCTION:`function`,OBJECT:`object`,STRING:`string`,UNDEFINED:`undefined`},Af=`browser`,jf=`cpu`,Mf=`device`,Nf=`engine`,Pf=`os`,Ff=`result`,K=`name`,q=`type`,J=`vendor`,Y=`version`,If=`architecture`,Lf=`major`,X=`model`,Rf=`console`,Z=`mobile`,Q=`tablet`,$=`smarttv`,zf=`wearable`,Bf=`xr`,Vf=`embedded`,Hf=`inapp`,Uf=`brands`,Wf=`formFactors`,Gf=`fullVersionList`,Kf=`platform`,qf=`platformVersion`,Jf=`bitness`,Yf=`sec-ch-ua`,Xf=Yf+`-full-version-list`,Zf=Yf+`-arch`,Qf=Yf+`-`+Jf,$f=Yf+`-form-factors`,ep=Yf+`-`+Z,tp=Yf+`-`+X,np=Yf+`-`+Kf,rp=np+`-version`,ip=[Uf,Gf,Z,X,Kf,qf,If,Wf,Jf],ap=`Amazon`,op=`Apple`,sp=`ASUS`,cp=`BlackBerry`,lp=`Google`,up=`Huawei`,dp=`Lenovo`,fp=`Honor`,pp=`LG`,mp=`Microsoft`,hp=`Motorola`,gp=`Nvidia`,_p=`OnePlus`,vp=`OPPO`,yp=`Samsung`,bp=`Sharp`,xp=`Sony`,Sp=`Xiaomi`,Cp=`Zebra`,wp=`Chrome`,Tp=`Chromium`,Ep=`Chromecast`,Dp=`Edge`,Op=`Firefox`,kp=`Opera`,Ap=`Facebook`,jp=`Sogou`,Mp=`Mobile `,Np=` Browser`,Pp=`Windows`,Fp=typeof window!==G.UNDEFINED&&window.navigator?window.navigator:void 0,Ip=Fp&&Fp.userAgentData?Fp.userAgentData:void 0,Lp=function(e,t){var n={},r=t;if(!Bp(t))for(var i in r={},t)for(var a in t[i])r[a]=t[i][a].concat(r[a]?r[a]:[]);for(var o in e)n[o]=r[o]&&r[o].length%2==0?r[o].concat(e[o]):e[o];return n},Rp=function(e){for(var t={},n=0;n<e.length;n++)t[e[n].toUpperCase()]=e[n];return t},zp=function(e,t){if(typeof e===G.OBJECT&&e.length>0){for(var n in e)if(Up(t)==Up(e[n]))return!0;return!1}return Vp(e)?Up(t)==Up(e):!1},Bp=function(e,t){for(var n in e)return/^(browser|cpu|device|engine|os)$/.test(n)||(t?Bp(e[n]):!1)},Vp=function(e){return typeof e===G.STRING},Hp=function(e){if(e){for(var t=[],n=Kp(/\\?\"/g,e).split(`,`),r=0;r<n.length;r++)if(n[r].indexOf(`;`)>-1){var i=Jp(n[r]).split(`;v=`);t[r]={brand:i[0],version:i[1]}}else t[r]=Jp(n[r]);return t}},Up=function(e){return Vp(e)?e.toLowerCase():e},Wp=function(e){return Vp(e)?Kp(/[^\d\.]/g,e).split(`.`)[0]:void 0},Gp=function(e){for(var t in e)if(e.hasOwnProperty(t)){var n=e[t];typeof n==G.OBJECT&&n.length==2?this[n[0]]=n[1]:this[n]=void 0}return this},Kp=function(e,t){return Vp(t)?t.replace(e,Of):t},qp=function(e){return Kp(/\\?\"/g,e)},Jp=function(e,t){return e=Kp(/^\s\s*/,String(e)),typeof t===G.UNDEFINED?e:e.substring(0,t)},Yp=function(e,t){if(!(!e||!t))for(var n=0,r,i,a,o,s,c;n<t.length&&!s;){var l=t[n],u=t[n+1];for(r=i=0;r<l.length&&!s&&l[r];)if(s=l[r++].exec(e),s)for(a=0;a<u.length;a++)c=s[++i],o=u[a],typeof o===G.OBJECT&&o.length>0?o.length===2?typeof o[1]==G.FUNCTION?this[o[0]]=o[1].call(this,c):this[o[0]]=o[1]:o.length>=3&&(typeof o[1]===G.FUNCTION&&!(o[1].exec&&o[1].test)?o.length>3?this[o[0]]=c?o[1].apply(this,o.slice(2)):void 0:this[o[0]]=c?o[1].call(this,c,o[2]):void 0:o.length==3?this[o[0]]=c?c.replace(o[1],o[2]):void 0:o.length==4?this[o[0]]=c?o[3].call(this,c.replace(o[1],o[2])):void 0:o.length>4&&(this[o[0]]=c?o[3].apply(this,[c.replace(o[1],o[2])].concat(o.slice(4))):void 0)):this[o]=c||void 0;n+=2}},Xp=function(e,t){for(var n in t)if(typeof t[n]===G.OBJECT&&t[n].length>0){for(var r=0;r<t[n].length;r++)if(zp(t[n][r],e))return n===kf?void 0:n}else if(zp(t[n],e))return n===kf?void 0:n;return t.hasOwnProperty(`*`)?t[`*`]:e},Zp={ME:`4.90`,"NT 3.51":`3.51`,"NT 4.0":`4.0`,2e3:[`5.0`,`5.01`],XP:[`5.1`,`5.2`],Vista:`6.0`,7:`6.1`,8:`6.2`,"8.1":`6.3`,10:[`6.4`,`10.0`],NT:``},Qp={embedded:`Automotive`,mobile:`Mobile`,tablet:[`Tablet`,`EInk`],smarttv:`TV`,wearable:`Watch`,xr:[`VR`,`XR`],"?":[`Desktop`,`Unknown`],"*":void 0},$p={Chrome:`Google Chrome`,Edge:`Microsoft Edge`,"Edge WebView2":`Microsoft Edge WebView2`,"Chrome WebView":`Android WebView`,"Chrome Headless":`HeadlessChrome`,"Huawei Browser":`HuaweiBrowser`,"MIUI Browser":`Miui Browser`,"Opera Mobi":`OperaMobile`,Yandex:`YaBrowser`},em={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[Y,[K,Mp+`Chrome`]],[/webview.+edge\/([\w\.]+)/i],[Y,[K,Dp+` WebView`]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[Y,[K,`Edge`]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[K,Y],[/opios[\/ ]+([\w\.]+)/i],[Y,[K,kp+` Mini`]],[/\bop(?:rg)?x\/([\w\.]+)/i],[Y,[K,kp+` GX`]],[/\bopr\/([\w\.]+)/i],[Y,[K,kp]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[Y,[K,`Baidu`]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[Y,[K,`Maxthon`]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[K,Y],[/quark(?:pc)?\/([-\w\.]+)/i],[Y,[K,`Quark`]],[/\bddg\/([\w\.]+)/i],[Y,[K,`DuckDuckGo`]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[Y,[K,`UCBrowser`]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[Y,[K,`WeChat`]],[/konqueror\/([\w\.]+)/i],[Y,[K,`Konqueror`]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[Y,[K,`IE`]],[/ya(?:search)?browser\/([\w\.]+)/i],[Y,[K,`Yandex`]],[/slbrowser\/([\w\.]+)/i],[Y,[K,`Smart `+dp+Np]],[/(avast|avg)\/([\w\.]+)/i],[[K,/(.+)/,`$1 Secure`+Np],Y],[/\bfocus\/([\w\.]+)/i],[Y,[K,Op+` Focus`]],[/\bopt\/([\w\.]+)/i],[Y,[K,kp+` Touch`]],[/coc_coc\w+\/([\w\.]+)/i],[Y,[K,`Coc Coc`]],[/dolfin\/([\w\.]+)/i],[Y,[K,`Dolphin`]],[/coast\/([\w\.]+)/i],[Y,[K,kp+` Coast`]],[/miuibrowser\/([\w\.]+)/i],[Y,[K,`MIUI`+Np]],[/fxios\/([\w\.-]+)/i],[Y,[K,Mp+Op]],[/\bqihoobrowser\/?([\w\.]*)/i],[Y,[K,`360`]],[/\b(qq)\/([\w\.]+)/i],[[K,/(.+)/,`$1Browser`],Y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[K,/(.+)/,`$1`+Np],Y],[/samsungbrowser\/([\w\.]+)/i],[Y,[K,yp+` Internet`]],[/metasr[\/ ]?([\d\.]+)/i],[Y,[K,jp+` Explorer`]],[/(sogou)mo\w+\/([\d\.]+)/i],[[K,jp+` Mobile`],Y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[K,Y],[/(lbbrowser|rekonq|steam(?= (clie|tenf|gameo)))/i],[K],[/ome\/([\w\.]+) \w* ?(iron) saf/i,/ome\/([\w\.]+).+qihu (360)[es]e/i],[Y,K],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[K,Ap],Y,[q,Hf]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[K,Y,[q,Hf]],[/\bgsa\/([\w\.]+) .*safari\//i],[Y,[K,`GSA`],[q,Hf]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[Y,[K,`TikTok`],[q,Hf]],[/\[(linkedin)app\]/i],[K,[q,Hf]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[K,/(.+)/,`Zalo`],Y,[q,Hf]],[/(chromium)[\/ ]([-\w\.]+)/i],[K,Y],[/headlesschrome(?:\/([\w\.]+)| )/i],[Y,[K,wp+` Headless`]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[Y,[K,Dp+` WebView2`]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[K,wp+` WebView`],Y],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[Y,[K,`Android`+Np]],[/chrome\/([\w\.]+) mobile/i],[Y,[K,Mp+`Chrome`]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[K,Y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[Y,[K,Mp+`Safari`]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[K,Mp+`Safari`]],[/version\/([\w\.\,]+) .*(safari)/i],[Y,K],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[K,[Y,`1`]],[/(webkit|khtml)\/([\w\.]+)/i],[K,Y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[K,Mp+Op],Y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[K,`Netscape`],Y],[/(wolvic|librewolf)\/([\w\.]+)/i],[K,Y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[Y,[K,Op+` Reality`]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[K,[Y,/_/g,`.`]],[/(cobalt)\/([\w\.]+)/i],[K,[Y,/[^\d\.]+./,Of]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[If,`amd64`]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[If,`ia32`]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[If,`arm64`]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[If,`armhf`]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[If,`arm`]],[/ sun4\w[;\)]/i],[[If,`sparc`]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[If,/ower/,Of,Up]],[/mc680.0/i],[[If,`68k`]],[/winnt.+\[axp/i],[[If,`alpha`]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[X,[J,yp],[q,Q]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[X,[J,yp],[q,Z]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[X,[J,op],[q,Z]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[X,[J,op],[q,Q]],[/(macintosh);/i],[X,[J,op]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[X,[J,bp],[q,Z]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[X,[J,fp],[q,Q]],[/honor([-\w ]+)[;\)]/i],[X,[J,fp],[q,Z]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[X,[J,up],[q,Q]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[X,[J,up],[q,Z]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[X,/_/g,` `],[J,Sp],[q,Q]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[X,/_/g,` `],[J,Sp],[q,Z]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[X,[J,_p],[q,Z]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[X,[J,vp],[q,Z]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[X,[J,Xp,{OnePlus:[`203`,`304`,`403`,`404`,`413`,`415`],"*":vp}],[q,Q]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[X,[J,`BLU`],[q,Z]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[X,[J,`Vivo`],[q,Z]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[X,[J,`Realme`],[q,Z]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[X,[J,dp],[q,Q]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[X,[J,dp],[q,Z]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[X,[J,hp],[q,Z]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[X,[J,hp],[q,Q]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[X,[J,pp],[q,Q]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[X,[J,pp],[q,Z]],[/(nokia) (t[12][01])/i],[J,X,[q,Q]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[X,/_/g,` `],[q,Z],[J,`Nokia`]],[/(pixel (c|tablet))\b/i],[X,[J,lp],[q,Q]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[X,[J,lp],[q,Z]],[/(google) (pixelbook( go)?)/i],[J,X],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[X,[J,xp],[q,Z]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[X,`Xperia Tablet`],[J,xp],[q,Q]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[X,[J,ap],[q,Q]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[X,/(.+)/g,`Fire Phone $1`],[J,ap],[q,Z]],[/(playbook);[-\w\),; ]+(rim)/i],[X,J,[q,Q]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[X,[J,cp],[q,Z]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[X,[J,sp],[q,Q]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[X,[J,sp],[q,Z]],[/(nexus 9)/i],[X,[J,`HTC`],[q,Q]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[J,[X,/_/g,` `],[q,Z]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Q]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Z]],[/(itel) ((\w+))/i],[[J,Up],X,[q,Xp,{tablet:[`p10001l`,`w7001`],"*":`mobile`}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[X,[J,`Acer`],[q,Q]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[X,[J,`Meizu`],[q,Z]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[X,[J,`Ulefone`],[q,Z]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[X,[J,`Energizer`],[q,Z]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[X,[J,`Cat`],[q,Z]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[X,[J,`Smartfren`],[q,Z]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[X,[J,`Nothing`],[q,Z]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[X,[J,`Archos`],[q,Q]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[X,[J,`Archos`],[q,Z]],[/; (n159v)/i],[X,[J,`HMD`],[q,Z]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[J,X,[q,Q]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[J,X,[q,Z]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[J,X,[q,Q]],[/(surface duo)/i],[X,[J,mp],[q,Q]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[X,[J,`Fairphone`],[q,Z]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[X,[J,gp],[q,Q]],[/(sprint) (\w+)/i],[J,X,[q,Z]],[/(kin\.[onetw]{3})/i],[[X,/\./g,` `],[J,mp],[q,Z]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[X,[J,Cp],[q,Q]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[X,[J,Cp],[q,Z]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[J,[q,$]],[/hbbtv.+maple;(\d+)/i],[[X,/^/,`SmartTV`],[J,yp],[q,$]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[J,X,[q,$]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[J,pp],[q,$]],[/(apple) ?tv/i],[J,[X,op+` TV`],[q,$]],[/crkey.*devicetype\/chromecast/i],[[X,Ep+` Third Generation`],[J,lp],[q,$]],[/crkey.*devicetype\/([^/]*)/i],[[X,/^/,`Chromecast `],[J,lp],[q,$]],[/fuchsia.*crkey/i],[[X,Ep+` Nest Hub`],[J,lp],[q,$]],[/crkey/i],[[X,Ep],[J,lp],[q,$]],[/(portaltv)/i],[X,[J,Ap],[q,$]],[/droid.+aft(\w+)( bui|\))/i],[X,[J,ap],[q,$]],[/(shield \w+ tv)/i],[X,[J,gp],[q,$]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[X,[J,bp],[q,$]],[/(bravia[\w ]+)( bui|\))/i],[X,[J,xp],[q,$]],[/(mi(tv|box)-?\w+) bui/i],[X,[J,Sp],[q,$]],[/Hbbtv.*(technisat) (.*);/i],[J,X,[q,$]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[J,/.+\/(\w+)/,`$1`,Xp,{LG:`lge`}],[X,Jp],[q,$]],[/(playstation \w+)/i],[X,[J,xp],[q,Rf]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[X,[J,mp],[q,Rf]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[J,Xp,{Nvidia:`Shield`,Anbernic:`RGCUBE`,Logitech:`GR0006`}],X,[q,Rf]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[X,[J,yp],[q,zf]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[J,X,[q,zf]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[X,[J,vp],[q,zf]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[X,[J,op],[q,zf]],[/(opwwe\d{3})/i],[X,[J,_p],[q,zf]],[/(moto 360)/i],[X,[J,hp],[q,zf]],[/(smartwatch 3)/i],[X,[J,xp],[q,zf]],[/(g watch r)/i],[X,[J,pp],[q,zf]],[/droid.+; (wt63?0{2,3})\)/i],[X,[J,Cp],[q,zf]],[/droid.+; (glass) \d/i],[X,[J,lp],[q,Bf]],[/(pico) ([\w ]+) os\d/i],[J,X,[q,Bf]],[/(quest( \d| pro)?s?).+vr/i],[X,[J,Ap],[q,Bf]],[/mobile vr; rv.+firefox/i],[[q,Bf]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[J,[q,Vf]],[/(aeobc)\b/i],[X,[J,ap],[q,Vf]],[/(homepod).+mac os/i],[X,[J,op],[q,Vf]],[/windows iot/i],[[q,Vf]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[X,[q,$]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[q,$]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[X,[q,Xp,{mobile:`Mobile`,xr:`VR`,"*":Q}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[q,Q]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[q,Z]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[X,[J,`Generic`]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[Y,[K,Dp+`HTML`]],[/(arkweb)\/([\w\.]+)/i],[K,Y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[Y,[K,`Blink`]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[K,Y],[/ladybird\//i],[[K,`LibWeb`]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[Y,K]],os:[[/(windows nt) (6\.[23]); arm/i],[[K,/N/,`R`],[Y,Xp,Zp]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[K,Y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[Y,/(;|\))/g,``,Xp,Zp],[K,Pp]],[/(windows ce)\/?([\d\.]*)/i],[K,Y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[Y,/_/g,`.`],[K,`iOS`]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[K,`macOS`],[Y,/_/g,`.`]],[/android ([\d\.]+).*crkey/i],[Y,[K,Ep+` Android`]],[/fuchsia.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Fuchsia`]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[Y,[K,Ep+` SmartSpeaker`]],[/linux.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Linux`]],[/crkey\/([\d\.]+)/i],[Y,[K,Ep]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[Y,K],[/(ubuntu) ([\w\.]+) like android/i],[[K,/(.+)/,`$1 Touch`],Y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[K,Y],[/\(bb(10);/i],[Y,[K,cp]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[Y,[K,`Symbian`]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[Y,[K,Op+` OS`]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[Y,[K,`webOS`]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[Y,Xp,{25:`120`,24:`108`,23:`94`,22:`87`,6:`79`,5:`68`,4:`53`,3:`38`,2:`538`,1:`537`,"*":`TV`}],[K,`webOS`]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[Y,[K,`watchOS`]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[K,`Chrome OS`],Y],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[K,Y],[/(sunos) ?([\d\.]*)/i],[[K,`Solaris`],Y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[K,Y]]},tm=(function(){var e={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}};return Gp.call(e.init,[[Af,[K,Y,Lf,q]],[jf,[If]],[Mf,[q,X,J]],[Nf,[K,Y]],[Pf,[K,Y]]]),Gp.call(e.isIgnore,[[Af,[Y,Lf]],[Nf,[Y]],[Pf,[Y]]]),Gp.call(e.isIgnoreRgx,[[Af,/ ?browser$/i],[Pf,/ ?os$/i]]),Gp.call(e.toString,[[Af,[K,Y]],[jf,[If]],[Mf,[J,X]],[Nf,[K,Y]],[Pf,[K,Y]]]),e})(),nm=function(e,t){var n=tm.init[t],r=tm.isIgnore[t]||0,i=tm.isIgnoreRgx[t]||0,a=tm.toString[t]||0;function o(){Gp.call(this,n)}return o.prototype.getItem=function(){return e},o.prototype.withClientHints=function(){return Ip?Ip.getHighEntropyValues(ip).then(function(t){return e.setCH(new rm(t,!1)).parseCH().get()}):e.parseCH().get()},o.prototype.withFeatureCheck=function(){return e.detectFeature().get()},t!=Ff&&(o.prototype.is=function(e){var t=!1;for(var n in this)if(this.hasOwnProperty(n)&&!zp(r,n)&&Up(i?Kp(i,this[n]):this[n])==Up(i?Kp(i,e):e)){if(t=!0,e!=G.UNDEFINED)break}else if(e==G.UNDEFINED&&t){t=!t;break}return t},o.prototype.toString=function(){var e=Of;for(var t in a)typeof this[a[t]]!==G.UNDEFINED&&(e+=(e?` `:Of)+this[a[t]]);return e||G.UNDEFINED}),o.prototype.then=function(e){var t=this,n=function(){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])};n.prototype={is:o.prototype.is,toString:o.prototype.toString,withClientHints:o.prototype.withClientHints,withFeatureCheck:o.prototype.withFeatureCheck};var r=new n;return e(r),r},new o};function rm(e,t){if(e||={},Gp.call(this,ip),t)Gp.call(this,[[Uf,Hp(e[Yf])],[Gf,Hp(e[Xf])],[Z,/\?1/.test(e[ep])],[X,qp(e[tp])],[Kf,qp(e[np])],[qf,qp(e[rp])],[If,qp(e[Zf])],[Wf,Hp(e[$f])],[Jf,qp(e[Qf])]]);else for(var n in e)this.hasOwnProperty(n)&&typeof e[n]!==G.UNDEFINED&&(this[n]=e[n])}function im(e,t,n,r){return Gp.call(this,[[`itemType`,e],[`ua`,t],[`uaCH`,r],[`rgxMap`,n],[`data`,nm(this,e)]]),this}im.prototype.get=function(e){return e?this.data.hasOwnProperty(e)?this.data[e]:void 0:this.data},im.prototype.set=function(e,t){return this.data[e]=t,this},im.prototype.setCH=function(e){return this.uaCH=e,this},im.prototype.detectFeature=function(){if(Fp&&Fp.userAgent==this.ua)switch(this.itemType){case Af:Fp.brave&&typeof Fp.brave.isBrave==G.FUNCTION&&this.set(K,`Brave`);break;case Mf:!this.get(q)&&Ip&&Ip[Z]&&this.set(q,Z),this.get(X)==`Macintosh`&&Fp&&typeof Fp.standalone!==G.UNDEFINED&&Fp.maxTouchPoints&&Fp.maxTouchPoints>2&&this.set(X,`iPad`).set(q,Q);break;case Pf:!this.get(K)&&Ip&&Ip[Kf]&&this.set(K,Ip[Kf]);break;case Ff:var e=this.data,t=function(t){return e[t].getItem().detectFeature().get()};this.set(Af,t(Af)).set(jf,t(jf)).set(Mf,t(Mf)).set(Nf,t(Nf)).set(Pf,t(Pf))}return this},im.prototype.parseUA=function(){switch(this.itemType!=Ff&&Yp.call(this.data,this.ua,this.rgxMap),this.itemType){case Af:this.set(Lf,Wp(this.get(Y)));break;case Pf:if(this.get(K)==`iOS`&&this.get(Y)==`18.6`){var e=/\) Version\/([\d\.]+)/.exec(this.ua);e&&parseInt(e[1].substring(0,2),10)>=26&&this.set(Y,e[1])}break}return this},im.prototype.parseCH=function(){var e=this.uaCH,t=this.rgxMap;switch(this.itemType){case Af:case Nf:var n=e[Gf]||e[Uf],r;if(n)for(var i=0;i<n.length;i++){var a=n[i].brand||n[i],o=n[i].version;this.itemType==Af&&!/not.a.brand/i.test(a)&&(!r||/Chrom/.test(r)&&a!=Tp||r==Dp&&/WebView2/.test(a))&&(a=Xp(a,$p),r=this.get(K),r&&!/Chrom/.test(r)&&/Chrom/.test(a)||this.set(K,a).set(Y,o).set(Lf,Wp(o)),r=a),this.itemType==Nf&&a==Tp&&this.set(Y,o)}break;case jf:var s=e[If];s&&(s&&e[Jf]==`64`&&(s+=`64`),Yp.call(this.data,s+`;`,t));break;case Mf:if(e[Z]&&this.set(q,Z),e[X]&&(this.set(X,e[X]),!this.get(q)||!this.get(J))){var c={};Yp.call(c,`droid 9; `+e[X]+`)`,t),!this.get(q)&&c.type&&this.set(q,c.type),!this.get(J)&&c.vendor&&this.set(J,c.vendor)}if(e[Wf]){var l;if(typeof e[Wf]!=`string`)for(var u=0;!l&&u<e[Wf].length;)l=Xp(e[Wf][u++],Qp);else l=Xp(e[Wf],Qp);this.set(q,l)}break;case Pf:var d=e[Kf];if(d){var f=e[qf];d==Pp&&(f=parseInt(Wp(f),10)>=13?`11`:`10`),this.set(K,d).set(Y,f)}this.get(K)==Pp&&e[X]==`Xbox`&&this.set(K,`Xbox`).set(Y,void 0);break;case Ff:var p=this.data,m=function(t){return p[t].getItem().setCH(e).parseCH().get()};this.set(Af,m(Af)).set(jf,m(jf)).set(Mf,m(Mf)).set(Nf,m(Nf)).set(Pf,m(Pf))}return this};function am(e,t,n){if(typeof e===G.OBJECT?(Bp(e,!0)?(typeof t===G.OBJECT&&(n=t),t=e):(n=e,t=void 0),e=void 0):typeof e===G.STRING&&!Bp(t,!0)&&(n=t,t=void 0),n)if(typeof n.append===G.FUNCTION){var r={};n.forEach(function(e,t){r[String(t).toLowerCase()]=e}),n=r}else{var i={};for(var a in n)n.hasOwnProperty(a)&&(i[String(a).toLowerCase()]=n[a]);n=i}if(!(this instanceof am))return new am(e,t,n).getResult();var o=typeof e===G.STRING?e:n&&n[Df]?n[Df]:Fp&&Fp.userAgent?Fp.userAgent:Of,s=new rm(n,!0),c=t?Lp(em,t):em,l=function(e){return e==Ff?function(){return new im(e,o,c,s).set(`ua`,o).set(Af,this.getBrowser()).set(jf,this.getCPU()).set(Mf,this.getDevice()).set(Nf,this.getEngine()).set(Pf,this.getOS()).get()}:function(){return new im(e,o,c[e],s).parseUA().get()}};return Gp.call(this,[[`getBrowser`,l(Af)],[`getCPU`,l(jf)],[`getDevice`,l(Mf)],[`getEngine`,l(Nf)],[`getOS`,l(Pf)],[`getResult`,l(Ff)],[`getUA`,function(){return o}],[`setUA`,function(e){return Vp(e)&&(o=Jp(e,Ef)),this}]]).setUA(o),this}am.VERSION=Tf,am.BROWSER=Rp([K,Y,Lf,q]),am.CPU=Rp([If]),am.DEVICE=Rp([X,J,q,Rf,Z,$,Q,zf,Vf]),am.ENGINE=am.OS=Rp([K,Y]);function om(e){return{recording:{onStateChange:t=>{e.updateState({recordingState:t}),t===`idle`&&(e.isProcessingBlob=!1)},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:t=>{e.updateState({error:i(t)})},onRecordingComplete:t=>{e.updateState({countdown:null}),e.processRecordingBlob(t).catch(t=>{e.updateState({error:i(t)})})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onStopAudioTracking:()=>{},onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(_d(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:t=>{e.updateState({error:i(t)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>{},onUploadComplete:()=>{},onUploadError:()=>{}},onStorageCleanupError:e=>{console.error(e)}}}function sm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function cm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function lm(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function um(e,t,n,r){return await e.stopRecording()}function dm(e){e.pauseRecording()}function fm(e){e.resumeRecording()}async function pm(e,t){await e.switchSource(t)}function mm(e){return e.toggleMute(),e.getIsMuted()}function hm(e){if(!e)return;let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`recording-${Date.now()}.mp4`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)}var gm=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new $d}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}},_m=`:root{--vidtreo-background:0 0% 100%;--vidtreo-foreground:0 0% 3.9%;--vidtreo-card:0 0% 100%;--vidtreo-card-foreground:0 0% 3.9%;--vidtreo-primary:0 0% 9%;--vidtreo-primary-foreground:0 0% 98%;--vidtreo-secondary:0 0% 96.1%;--vidtreo-secondary-foreground:0 0% 9%;--vidtreo-muted:0 0% 96.1%;--vidtreo-muted-foreground:0 0% 45.1%;--vidtreo-accent:0 0% 96.1%;--vidtreo-accent-foreground:0 0% 9%;--vidtreo-destructive:0 84.2% 60.2%;--vidtreo-destructive-foreground:0 0% 98%;--vidtreo-border:0 0% 89.8%;--vidtreo-input:0 0% 89.8%;--vidtreo-ring:0 0% 3.9%;--vidtreo-radius:.5rem;--vidtreo-preview-bg:0 0% 0%}.vidtreo-preview-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:strict;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden;transform:translateZ(0)}.vidtreo-preview-container:before{display:none}@media (width>=768px){.vidtreo-preview-container{aspect-ratio:16/9}}.vidtreo-camera-area{contain:layout style paint;backface-visibility:hidden;isolation:isolate;will-change:auto;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;display:none;position:relative;transform:translateZ(0)}.vidtreo-source-transition-overlay{z-index:100;backdrop-filter:blur(4px);contain:layout style paint;backface-visibility:hidden;will-change:opacity;background:#000000b3;border-radius:0;flex-direction:column;justify-content:center;align-items:center;transition:opacity .3s;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-source-transition-overlay.vidtreo-active{animation:.2s vidtreo-fadeIn;display:flex}@keyframes vidtreo-fadeIn{0%{opacity:0}to{opacity:1}}.vidtreo-transition-spinner{border:4px solid #ffffff4d;border-top-color:#667eea;border-radius:50%;width:40px;height:40px;margin-bottom:12px;animation:.8s linear infinite vidtreo-spin}@keyframes vidtreo-spin{to{transform:rotate(360deg)}}.vidtreo-transition-message{color:#fff;text-align:center;font-size:14px;font-weight:500}.vidtreo-camera-area.vidtreo-active{display:block}.vidtreo-preview-skeleton{z-index:10;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:1rem;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-skeleton-spinner{border:4px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:40px;height:40px;animation:.8s linear infinite vidtreo-spin}.vidtreo-skeleton-text{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-video-preview{object-fit:contain;will-change:auto;backface-visibility:hidden;background:#000;border-radius:0;width:100%;height:100%;transition:opacity .3s,transform .3s;display:block;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-video-preview-skeleton{z-index:2;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;width:100%;height:100%;position:absolute;inset:0;overflow:hidden;transform:translateZ(0)}.vidtreo-skeleton-shimmer{background:linear-gradient(90deg,hsl(var(--vidtreo-muted))0%,hsl(var(--vidtreo-muted)/.5)50%,hsl(var(--vidtreo-muted))100%);background-size:200% 100%;animation:1.5s ease-in-out infinite vidtreo-shimmer;position:absolute;inset:0}@keyframes vidtreo-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.vidtreo-video-preview-skeleton.vidtreo-hidden{opacity:0;pointer-events:none;transition:opacity .3s}.vidtreo-video-preview.vidtreo-screen-share{object-fit:cover}.vidtreo-video-preview.vidtreo-transitioning{opacity:.5;transform:scale(.98)}.vidtreo-countdown-overlay{z-index:20;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000000f2;border-radius:0;justify-content:center;align-items:center;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-countdown-overlay.vidtreo-active{display:flex}.vidtreo-countdown-content{flex-direction:column;align-items:center;gap:1rem;display:flex}.vidtreo-countdown-number{color:#fff;font-size:9rem;font-weight:700;animation:.3s vidtreo-zoomIn}@keyframes vidtreo-zoomIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.vidtreo-countdown-text{color:#fff;margin-top:1rem;font-size:.875rem;font-weight:500}.vidtreo-settings-panel{z-index:200;contain:layout style paint;backface-visibility:hidden;background:#0006;border:none;border-radius:.75rem;flex-direction:column;width:90%;margin-left:-47%;padding:.625rem;display:none;position:absolute;bottom:4rem;left:50%;overflow:hidden;transform:translateZ(0)}.vidtreo-settings-panel.vidtreo-active{display:flex}.vidtreo-settings-content{will-change:transform;backface-visibility:hidden;flex-direction:column;width:100%;display:flex;transform:translateZ(0)}.vidtreo-settings-content.vidtreo-slide-right{animation:.3s vidtreo-slideRight}.vidtreo-settings-content.vidtreo-slide-left{animation:.3s vidtreo-slideLeft}.vidtreo-settings-content.vidtreo-slide-none{will-change:auto;animation:none}@keyframes vidtreo-slideIn{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes vidtreo-slideRight{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes vidtreo-slideLeft{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.vidtreo-settings-header{color:#fff;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.75rem;width:100%;margin-bottom:1rem;padding:0;display:flex}.vidtreo-settings-back-icon{color:#fff;flex-shrink:0}.vidtreo-settings-title{color:#fff;margin:0;font-size:.875rem;font-weight:600}.vidtreo-device-options-container{flex-direction:column;gap:.375rem;display:flex}.vidtreo-device-option-nav{cursor:pointer;color:#fff;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:1rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option-nav:hover{background:#fff3}.vidtreo-device-option-nav-content{flex-shrink:0;align-items:center;gap:.75rem;display:flex}.vidtreo-device-option-nav-label{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-device-option-nav-value{flex:1;justify-content:flex-end;align-items:center;gap:.5rem;min-width:0;display:flex}.vidtreo-device-option-nav-value-text{color:#fffc;text-overflow:ellipsis;white-space:nowrap;text-align:right;flex:1;font-size:.875rem;overflow:hidden}.vidtreo-device-option-nav-chevron{color:#fff;font-size:1.25rem;line-height:1}.vidtreo-device-list{flex-direction:column;gap:0;max-height:200px;display:flex;overflow-y:auto}.vidtreo-device-list::-webkit-scrollbar{width:4px}.vidtreo-device-list::-webkit-scrollbar-track{background:0 0}.vidtreo-device-list::-webkit-scrollbar-thumb{background:#fff3;border-radius:2px}.vidtreo-device-list::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.vidtreo-device-option{cursor:pointer;color:#fff;text-align:left;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:.75rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option:hover{background:#fff3}.vidtreo-device-option-check-container{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.vidtreo-device-checkmark-placeholder{flex-shrink:0;width:20px;height:20px}.vidtreo-device-checkmark{color:#fff;flex-shrink:0}.vidtreo-device-option-label{color:#fff;flex:1;font-size:.875rem}.vidtreo-device-empty{color:#fff9;text-align:center;padding:1rem 0;font-size:.875rem}.vidtreo-audio-level-bars{z-index:10;contain:layout style paint;will-change:auto;backface-visibility:hidden;align-items:center;gap:.125rem;height:1rem;display:flex;position:absolute;bottom:.75rem;right:.75rem;transform:translateZ(0)}@media (width>=768px){.vidtreo-audio-level-bars{height:1.25rem}}.vidtreo-audio-level-bar{background:#ffffff80;border-radius:9999px;align-self:flex-end;width:.125rem;transition:all .1s}.vidtreo-recording-controls{z-index:10;contain:layout style paint;will-change:auto;backface-visibility:hidden;position:absolute;bottom:12px;left:50%;transform:translate(-50%)translateZ(0)}.vidtreo-recording-controls-row{will-change:auto;justify-content:center;align-items:center;gap:.5rem;display:flex;transform:translateZ(0)}.vidtreo-recording-timer-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.vidtreo-recording-timer-badge{z-index:10;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;display:flex;position:absolute;top:.75rem;right:.75rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.vidtreo-recording-dot-small{background:hsl(var(--vidtreo-destructive));border-radius:50%;width:.375rem;height:.375rem;animation:1.5s ease-in-out infinite vidtreo-pulse}.vidtreo-recording-timer-text{color:#fff;font-family:monospace;font-size:.75rem;font-weight:500}.vidtreo-control-buttons-row{will-change:auto;justify-content:center;align-items:center;gap:.375rem;height:auto;min-height:2rem;display:flex;transform:translateZ(0)}@media (width>=768px){.vidtreo-control-buttons-row{min-height:2.25rem}}.vidtreo-control-button{cursor:pointer;color:#fff;box-sizing:border-box;vertical-align:top;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;min-height:2rem;max-height:2rem;margin:0;padding:.25rem;transition:background-color .2s;display:inline-flex;position:relative;transform:translateZ(0)}.vidtreo-control-button:before{content:"";z-index:0;border-radius:9999px;transition:background-color .2s;position:absolute;inset:.25rem}.vidtreo-control-button svg{color:inherit;z-index:1;flex-shrink:0;position:relative;width:22px!important;height:22px!important}@media (width>=768px){.vidtreo-control-button svg{width:24px!important;height:24px!important}.vidtreo-control-button{width:2.25rem;height:2.25rem;min-height:2.25rem;max-height:2.25rem}}.vidtreo-control-button:hover:not(:disabled):before{background:#fff3}.vidtreo-control-button:disabled{opacity:.5;cursor:not-allowed}.vidtreo-control-button.vidtreo-muted:before{background:#0000004d}.vidtreo-control-button.vidtreo-muted:hover:not(:disabled):before{background:#fff3}.vidtreo-record-button{background:hsl(var(--vidtreo-destructive));height:2rem;min-height:2rem;max-height:2rem;color:hsl(var(--vidtreo-destructive-foreground));box-sizing:border-box;vertical-align:top;cursor:pointer;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;width:auto;margin:0;padding:0 .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:background-color .2s,filter .2s;display:inline-flex}@media (width>=768px){.vidtreo-record-button{height:2.25rem;min-height:2.25rem;max-height:2.25rem;font-size:.875rem}}.vidtreo-record-button:hover:not(:disabled){filter:brightness(.85)}.vidtreo-rec-indicator-top{z-index:10;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;display:flex;position:absolute;top:.75rem;left:.75rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.vidtreo-rec-indicator-top span{color:#fff;font-size:.75rem;font-weight:500}.vidtreo-start-camera-area{text-align:center;cursor:pointer;z-index:1;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border:none;border-radius:0;flex-direction:column;justify-content:center;align-items:center;padding:40px;transition:all .3s;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-start-camera-area:hover:not(.vidtreo-loading){background:#000}.vidtreo-start-camera-area.vidtreo-loading{cursor:wait;opacity:.7}.vidtreo-start-camera-area.vidtreo-loading .vidtreo-camera-text{color:#fff;opacity:.7}.vidtreo-camera-icon{color:#fff;justify-content:center;margin-bottom:16px;font-size:48px;display:flex}.vidtreo-camera-text{color:#fff;margin-bottom:8px;font-weight:600}.vidtreo-camera-hint{color:#fff;opacity:.8;font-size:12px}@keyframes vidtreo-pulse{0%,to{opacity:1}50%{opacity:.3}}.vidtreo-progress{margin-top:20px;display:none}.vidtreo-progress.vidtreo-active{display:block}.vidtreo-progress-bar{background:#e0e0e0;border-radius:4px;width:100%;height:8px;margin-bottom:8px;overflow:hidden}.vidtreo-progress-fill{background:linear-gradient(90deg,#667eea 0%,#764ba2 100%);width:0%;height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:#fff;font-size:14px}.vidtreo-error{color:#fff;text-align:center;z-index:100;word-wrap:break-word;background:#dc2626;border:none;border-radius:.5rem;max-width:90%;padding:1rem 1.25rem;font-size:.875rem;font-weight:500;display:none;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.vidtreo-error.vidtreo-active{animation:.3s ease-out vidtreo-error-fade-in-slide-down;display:block}@keyframes vidtreo-error-fade-in-slide-down{0%{opacity:0;transform:translate(-50%)translateY(-1rem)}to{opacity:1;transform:translate(-50%)translateY(0)}}.vidtreo-finishing-progress{margin-top:20px;display:none}.vidtreo-finishing-progress .vidtreo-progress-indeterminate{background:linear-gradient(90deg,#0000 0%,#667eea 50%,#0000 100%) 0 0/200% 100%;width:100%;animation:1.5s ease-in-out infinite vidtreo-progress-indeterminate}.vidtreo-upload-progress{margin-top:20px;display:none}.vidtreo-upload-progress.vidtreo-active{display:block}.vidtreo-preview-container .vidtreo-upload-progress{margin-top:0}.vidtreo-upload-status{border-radius:8px;margin-top:20px;padding:16px;display:none}.vidtreo-upload-status.vidtreo-active{display:block}.vidtreo-upload-status.vidtreo-success{color:#22543d;background:#f0f9ff;border:2px solid #48bb78}.vidtreo-upload-status.vidtreo-error{color:#c33;background:#fee;border:2px solid #fcc}.vidtreo-upload-status-text{font-size:14px;font-weight:500}.vidtreo-preview-error{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:strict;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden;transform:translateZ(0)}@media (width>=768px){.vidtreo-preview-error{aspect-ratio:16/9}}.vidtreo-error-icon{font-size:3rem;line-height:1}.vidtreo-error-retry{background:hsl(var(--vidtreo-destructive));color:hsl(var(--vidtreo-destructive-foreground));cursor:pointer;border:none;border-radius:.375rem;justify-content:center;align-items:center;margin-top:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:filter .2s;display:inline-flex}.vidtreo-error-retry:hover:not(:disabled){filter:brightness(.85)}.vidtreo-error-retry:disabled{opacity:.5;cursor:not-allowed}.vidtreo-native-camera-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}@media (width>=768px){.vidtreo-native-camera-container{aspect-ratio:16/9}}.vidtreo-native-camera-container:has(.vidtreo-native-camera-preview-container){background:0 0}.vidtreo-config-loading-indicator{z-index:10;position:absolute;top:8px;right:8px}.vidtreo-spinner-small{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite spin}.vidtreo-native-camera-empty-state{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;padding:24px;display:flex;position:relative}.vidtreo-native-camera-buttons{flex-direction:column;gap:12px;width:100%;max-width:300px;display:flex}.vidtreo-native-camera-process-button,.vidtreo-native-camera-download-button{z-index:30;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}.vidtreo-native-camera-process-button .vidtreo-btn,.vidtreo-native-camera-download-button .vidtreo-btn{min-width:200px}.vidtreo-btn{border-radius:var(--vidtreo-radius);cursor:pointer;border:none;padding:12px 24px;font-size:1rem;font-weight:500;transition:all .2s}.vidtreo-btn:disabled{opacity:.5;cursor:not-allowed}.vidtreo-btn-primary{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground))}.vidtreo-btn-primary:hover:not(:disabled){filter:brightness(.9)}.vidtreo-btn-secondary{background:hsl(var(--vidtreo-secondary));color:hsl(var(--vidtreo-secondary-foreground));border:1px solid hsl(var(--vidtreo-border))}.vidtreo-btn-secondary:hover:not(:disabled){background:hsl(var(--vidtreo-accent))}.vidtreo-transcoding-progress{width:100%;max-width:400px;padding:16px}.vidtreo-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-fill{background:hsl(var(--vidtreo-primary));height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:hsl(var(--vidtreo-foreground));margin-top:8px;font-size:.875rem}.vidtreo-native-camera-preview-container{background:0 0;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:relative}.vidtreo-native-camera-preview-image{object-fit:contain;width:100%;height:100%;display:block}.vidtreo-progress-overlay{backdrop-filter:blur(4px);z-index:20;pointer-events:none;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.vidtreo-progress-overlay .vidtreo-transcoding-progress,.vidtreo-progress-overlay .vidtreo-upload-progress{pointer-events:auto;background:0 0;flex-direction:column;align-items:center;gap:12px;width:90%;max-width:400px;padding:0;display:flex;position:relative}.vidtreo-progress-overlay .vidtreo-progress-bar,.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-progress-fill{height:100%;transition:width .3s}.vidtreo-error-overlay{background:hsl(var(--vidtreo-preview-bg));z-index:1000;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-error-content{text-align:center;color:#fff;flex-direction:column;justify-content:center;align-items:center;gap:1rem;max-width:400px;padding:2rem;display:flex}.vidtreo-error-icon{color:#fff;font-size:3rem;line-height:1}.vidtreo-error-title{font-size:1.25rem;font-weight:600;line-height:1.2}.vidtreo-error-message{opacity:.9;word-break:break-word;font-size:.875rem;line-height:1.5}.vidtreo-error-config{text-align:left;border-top:1px solid #fff3;width:100%;margin-top:1.5rem;padding-top:1.5rem}.vidtreo-error-config-title{color:#fff;margin-bottom:.75rem;font-size:.875rem;font-weight:600}.vidtreo-error-config-item{color:#ffffffd9;margin-bottom:.5rem;font-size:.8125rem;line-height:1.6}.vidtreo-error-config-item code{color:#fff;background:#ffffff26;border-radius:.25rem;padding:.125rem .375rem;font-family:monospace;font-size:.75rem}.vidtreo-progress-overlay .vidtreo-progress-text,.vidtreo-progress-overlay .vidtreo-upload-progress-text{text-align:center;color:#fff;margin-top:0;font-size:.875rem;font-weight:500}.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-upload-progress-fill{background:#fff;height:100%;transition:width .3s}`;let vm=()=>`
|
|
8427
|
+
<style>${_m}</style>
|
|
8427
8428
|
<div class="vidtreo-camera-area vidtreo-active" id="cameraArea">
|
|
8428
8429
|
<!-- Error Boundary / Preview Container -->
|
|
8429
8430
|
<div class="vidtreo-preview-container">
|
|
@@ -8609,7 +8610,7 @@ new RecorderWorker;
|
|
|
8609
8610
|
<!-- Error Message -->
|
|
8610
8611
|
<div class="vidtreo-error" id="error" style="display: none;"></div>
|
|
8611
8612
|
</div>
|
|
8612
|
-
`;function vm(e,t){return e.querySelector(t)}let ym=/^https?:\/\//i;function bm(e){return e?ym.test(e)?e:`https://${e}`:`https://api.vidtreo.com`}function xm(e,t){let n={apiKey:e.getAttribute(`api-key`),backendUrl:bm(e.getAttribute(`backend-url`))},r=e.getAttribute(`countdown-duration`);if(r){let e=Number.parseInt(r,10);Number.isNaN(e)||(n.countdownDuration=e)}let a=e.getAttribute(`max-recording-time`);if(a){let e=Number.parseInt(a,10);Number.isNaN(e)||(n.maxRecordingTime=e)}let o=e.getAttribute(`user-metadata`);if(o)try{let e=JSON.parse(o);Object.assign(t,e),n.userMetadata=t}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}let s=e.getAttribute(`enable-source-switching`);n.enableSourceSwitching=s===null||s!==`false`;let c=e.getAttribute(`enable-mute`);n.enableMute=c===null||c!==`false`;let l=e.getAttribute(`enable-pause`);n.enablePause=l===null||l!==`false`;let u=e.getAttribute(`enable-device-change`);n.enableDeviceChange=u===null||u!==`false`;let d=e.getAttribute(`enable-tab-visibility-overlay`);return n.enableTabVisibilityOverlay=d!==null&&d!==`false`,n}function Sm(){if(typeof document>`u`||document.querySelector(`script[src*="@phosphor-icons/web"]`))return;let e=document.createElement(`script`);e.src=`https://unpkg.com/@phosphor-icons/web`,e.async=!0,document.head.appendChild(e)}let Cm={recordingState:`idle`,stream:null,isMuted:!1,isPaused:!1,error:null,countdown:null,timer:`00:00`,uploadProgress:null,transitionMessage:null,recordedBlob:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var wm=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.uploadService=null,this.state={...Cm},this.config={},this.initialized=!1,this.isInitializing=!1,this.videoPreview=null,this.audioBarsContainer=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`demo`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}connectedCallback(){this.innerHTML=_m(),this.init()}disconnectedCallback(){this.cleanup()}attributeChangedCallback(e,t,n){t!==n&&[`api-key`,`backend-url`,`demo`].includes(e)&&(this.initialized&&this.cleanup(),this.init())}async init(){if(!this.isInitializing){this.isInitializing=!0;try{this.initialized&&this.cleanup(),this.config=xm(this,{});let e=this.config.apiKey||``,t=this.config.backendUrl||``;if(!(this.isDemo||e)){this.updateState({configError:Error(`apiKey is required. Provide it as an attribute or ensure demo mode is enabled.`)}),this.isInitializing=!1;return}this.isDemo||(this.uploadService=new gm({apiKey:e,backendUrl:t})),this.controller=new wf(om(this));let n={...this.config};await this.controller.initialize(n),this.initialized=!0,this.updateState({configError:null}),this.videoPreview=vm(this,`#videoPreview`),this.audioBarsContainer=vm(this,`#audioLevelBars`),this.setupEventListeners(),Sm(),setTimeout(()=>this.startPreview(),100)}catch(e){this.updateState({error:i(e)})}finally{this.isInitializing=!1}}}renderConfigError(){let e=this.state,t=!!e.configError;if(this.toggleDisplay(`#configErrorOverlay`,t),t&&e.configError){let t=e.configError.message.includes(`apiKey is required`);this.toggleDisplay(`#configErrorMessageDefault`,!t),this.toggleDisplay(`#configErrorDetails`,t),t||this.setText(`#configErrorMessageDefault`,e.configError.message)}}cleanup(){this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...Cm}}updateState(e){this.state={...this.state,...e},this.render(),e.stream!==void 0&&this.handleStreamUpdate(this.state.stream),this.state.devices.cameras.length===0&&this.state.stream&&this.updateDevices()}async updateDevices(){if(!this.controller)return;let e=this.controller.getDeviceManager(),t=await e.getAvailableDevices();this.updateState({devices:{cameras:t.videoinput,microphones:t.audioinput,selectedCamera:e.getSelectedCameraDeviceId(),selectedMic:e.getSelectedMicDeviceId()}})}handleStreamUpdate(e){this.videoPreview&&(e?(this.videoPreview.srcObject=e,this.videoPreview.style.display=`block`,this.videoPreview.play().catch(console.error),this.startAudioAnalysis(e)):(this.videoPreview.srcObject=null,this.videoPreview.style.display=`none`,this.stopAudioAnalysis()))}startAudioAnalysis(e){if(this.stopAudioAnalysis(),e.getAudioTracks().length!==0)try{this.audioContext=new AudioContext;let t=this.audioContext.createMediaStreamSource(e);this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=64,t.connect(this.analyser);let n=new Uint8Array(this.analyser.frequencyBinCount),r=()=>{if(!this.analyser)return;this.analyser.getByteFrequencyData(n);let e=0;for(let t of n)e+=t;let t=e/n.length,i=Math.min(1,t/128);this.renderAudioBars(i),this.animationFrameId=requestAnimationFrame(r)};r()}catch(e){console.error(`Audio analysis setup failed`,e)}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=[.8,1.2,.9],n=``;this.state.isMuted||t.forEach((t,r)=>{let i=Math.max(4,e*24*t);n+=`<div class="vidtreo-audio-level-bar" style="height: ${i}px;"></div>`}),this.audioBarsContainer.innerHTML=n}render(){this.renderPreviewSection(),this.renderIndicatorsSection(),this.renderButtonsSection(),this.renderStatusSection(),this.renderConfigError()}renderPreviewSection(){let e=this.state;this.toggleDisplay(`#startCameraArea`,!e.stream),this.toggleDisplay(`#videoPreview`,!!e.stream&&!e.transitionMessage),this.toggleClass(`#sourceTransitionOverlay`,`vidtreo-active`,!!e.transitionMessage),this.setText(`#transitionMessage`,e.transitionMessage||``)}renderIndicatorsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleClass(`#countdownOverlay`,`vidtreo-active`,e.recordingState===`countdown`),this.setText(`#countdownNumber`,e.countdown?.toString()||``),this.toggleDisplay(`#recIndicatorTop`,t),this.toggleDisplay(`#recordingTimerRow`,t),this.setText(`#recordingTimer`,e.timer),this.toggleDisplay(`#audioLevelBars`,t),this.toggleDisplay(`#recordingControls`,!!e.stream)}renderButtonsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleDisplay(`#btnSettings`,!t&&this.config.enableDeviceChange!==!1),this.toggleDisplay(`#btnRecord`,e.recordingState===`idle`),this.toggleDisplay(`#btnMute`,t&&this.config.enableMute!==!1),this.toggleDisplay(`#btnStop`,t),this.toggleDisplay(`#btnSwitchSource`,t&&this.config.enableSourceSwitching!==!1),this.renderPauseButton(t),this.renderMuteButton();let n=this.isDemo&&!t&&e.recordingState===`idle`&&e.recordedBlob!==null;this.toggleDisplay(`#btnDownload`,n)}renderPauseButton(e){let t=this.state,n=vm(this,`#btnPause`),r=this.querySelector(`#iconPause`);n&&(t.isPaused?(n.title=`Resume`,r&&(r.className=`ph-fill ph-play`)):(n.title=`Pause`,r&&(r.className=`ph-fill ph-pause`)),n.style.display=e&&this.config.enablePause!==!1?`inline-flex`:`none`)}renderMuteButton(){let e=this.state,t=vm(this,`#btnMute`),n=this.querySelector(`#iconMute`);t&&(n&&(n.className=e.isMuted?`ph-fill ph-microphone-slash`:`ph-fill ph-microphone`),t.classList.toggle(`vidtreo-muted`,e.isMuted))}renderStatusSection(){let e=this.state;if(this.toggleDisplay(`#error`,!!e.error),this.setText(`#error`,e.error||``),this.renderUploadStatus(),e.recordingState!==`idle`){let e=this.querySelector(`#settingsPanel`);e&&e.classList.remove(`vidtreo-active`)}}renderUploadStatus(){let e=this.state;this.toggleDisplay(`#uploadProgressOverlay`,e.uploadProgress!==null);let t=this.querySelector(`#uploadProgressFill`);t&&e.uploadProgress!==null&&(t.style.width=`${Math.round(e.uploadProgress*100)}%`);let n=this.querySelector(`#uploadProgressText`);n&&e.uploadProgress!==null&&(n.textContent=`Uploading... ${Math.round(e.uploadProgress*100)}%`)}toggleDisplay(e,t){let n=this.querySelector(e);if(n)if(t){let t=n.tagName===`BUTTON`,r=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`);t?n.style.display=`inline-flex`:r?n.style.display=`flex`:n.style.display=`block`}else n.style.display=`none`}toggleClass(e,t,n){let r=this.querySelector(e);r&&r.classList.toggle(t,n)}setText(e,t){let n=this.querySelector(e);n&&(n.textContent=t)}async startPreview(){if(this.controller)try{await this.controller.startStream(),this.updateState({stream:this.controller.getStream()})}catch(e){this.updateState({error:i(e)})}}async handleRecord(){if(this.controller)try{await lm(this.controller,`camera`)}catch(e){this.updateState({error:i(e)})}}async handleStop(){if(this.controller)try{let e=await um(this.controller,this.isDemo,()=>{},()=>{});if(this.isDemo&&e)this.updateState({recordedBlob:e});else if(!this.isDemo&&e){if(!this.uploadService)throw Error(`Upload service not ready`);let t=await wd(e),n=`recording-${Date.now()}.mp4`;this.updateState({uploadProgress:0});try{let r=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:n,duration:t,userMetadata:this.config.userMetadata,onProgress:e=>this.updateState({uploadProgress:e})});this.updateState({uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:r}))}catch(e){throw this.updateState({uploadProgress:null}),e}}}catch(e){this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused?fm(this.controller):dm(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&hm(this.state.recordedBlob)}handleMute(){this.controller&&(mm(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType()===`camera`?`screen`:`camera`;try{await pm(this.controller,e)}catch(e){this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=vm(this,e);n&&n.addEventListener(`click`,t)};e(`#btnRecord`,()=>this.handleRecord()),e(`#btnStop`,()=>this.handleStop()),e(`#btnPause`,()=>this.handlePauseToggle()),e(`#btnDownload`,()=>this.handleDownload()),e(`#btnMute`,()=>this.handleMute()),e(`#btnSwitchSource`,()=>this.handleSwitch());let t=this.querySelector(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.querySelector(`#btnSettings`),r=this.querySelector(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{r.classList.toggle(`vidtreo-active`),this.populateSettings()});let i=this.querySelector(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.querySelector(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.querySelector(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.querySelector(`#btnSettingsBack`);n&&n.addEventListener(`click`,e=>{e.stopPropagation(),this.settingsView!==`main`&&this.navigateSettings(`main`)})}navigateSettings(e){e===`main`?this.slideDirection=`left`:this.slideDirection=`right`,this.settingsView=e,this.renderSettings(),setTimeout(()=>{this.slideDirection=`none`,this.renderSettings()},300)}renderSettings(){this.updateSettingsContent(),this.renderSettingsView()}updateSettingsContent(){let e=this.querySelector(`#settingsContent`);e&&(e.classList.remove(`vidtreo-slide-left`,`vidtreo-slide-right`,`vidtreo-slide-none`),this.slideDirection!==`none`&&e.classList.add(`vidtreo-slide-${this.slideDirection}`))}renderSettingsView(){let e=this.querySelector(`#settingsMain`),t=this.querySelector(`#cameraList`),n=this.querySelector(`#micList`),r=this.querySelector(`#btnSettingsBack`);e&&(e.style.display=`none`),t&&(t.style.display=`none`),n&&(n.style.display=`none`),r&&(r.style.display=`none`),this.settingsView===`main`?this.renderSettingsMain(e,r):this.settingsView===`camera`?this.renderSettingsCamera(t,r):this.settingsView===`microphone`&&this.renderSettingsMicrophone(n,r)}renderSettingsMain(e,t){e&&(e.style.display=`flex`),t&&(t.style.display=`none`),this.updateCurrentDeviceLabels()}updateCurrentDeviceLabels(){let e=this.state.devices.cameras.filter(e=>e.deviceId&&e.deviceId.trim()!==``),t=this.state.devices.microphones.filter(e=>e.deviceId&&e.deviceId.trim()!==``),n=e.find(e=>e.deviceId===this.state.devices.selectedCamera),r=t.find(e=>e.deviceId===this.state.devices.selectedMic),i=n?.label||e[0]?.label||`Camera`,a=r?.label||t[0]?.label||`Microphone`;this.setText(`#currentCameraName`,i),this.setText(`#currentMicName`,a)}renderSettingsCamera(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.cameras,this.state.devices.selectedCamera,`camera`));let n=this.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Camera`),r&&(r.style.display=`flex`)}renderSettingsMicrophone(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.microphones,this.state.devices.selectedMic,`mic`));let n=this.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Microphone`),r&&(r.style.display=`flex`)}renderDeviceList(e,t,n,r){if(!t||t.length===0){e.innerHTML=`<div class="vidtreo-device-empty">No devices found</div>`;return}e.innerHTML=``;for(let a of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`,t.innerHTML=`
|
|
8613
|
+
`;function ym(e,t){return e.querySelector(t)}let bm=/^https?:\/\//i;function xm(e){return e?bm.test(e)?e:`https://${e}`:`https://api.vidtreo.com`}function Sm(e,t){let n={apiKey:e.getAttribute(`api-key`),backendUrl:xm(e.getAttribute(`backend-url`))},r=e.getAttribute(`countdown-duration`);if(r){let e=Number.parseInt(r,10);Number.isNaN(e)||(n.countdownDuration=e)}let a=e.getAttribute(`max-recording-time`);if(a){let e=Number.parseInt(a,10);Number.isNaN(e)||(n.maxRecordingTime=e)}let o=e.getAttribute(`user-metadata`);if(o)try{let e=JSON.parse(o);Object.assign(t,e),n.userMetadata=t}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}let s=e.getAttribute(`enable-source-switching`);n.enableSourceSwitching=s===null||s!==`false`;let c=e.getAttribute(`enable-mute`);n.enableMute=c===null||c!==`false`;let l=e.getAttribute(`enable-pause`);n.enablePause=l===null||l!==`false`;let u=e.getAttribute(`enable-device-change`);n.enableDeviceChange=u===null||u!==`false`;let d=e.getAttribute(`enable-tab-visibility-overlay`);return n.enableTabVisibilityOverlay=d!==null&&d!==`false`,n}function Cm(){if(typeof document>`u`||document.querySelector(`script[src*="@phosphor-icons/web"]`))return;let e=document.createElement(`script`);e.src=`https://unpkg.com/@phosphor-icons/web`,e.async=!0,document.head.appendChild(e)}let wm={recordingState:`idle`,stream:null,isMuted:!1,isPaused:!1,error:null,countdown:null,timer:`00:00`,isFinishing:!1,uploadProgress:null,transitionMessage:null,recordedBlob:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var Tm=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.uploadService=null,this.state={...wm},this.config={},this.initialized=!1,this.isInitializing=!1,this.isProcessingBlob=!1,this.videoPreview=null,this.audioBarsContainer=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`demo`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}connectedCallback(){this.innerHTML=vm(),this.init()}disconnectedCallback(){this.cleanup()}attributeChangedCallback(e,t,n){t!==n&&[`api-key`,`backend-url`,`demo`].includes(e)&&(this.initialized&&this.cleanup(),this.init())}async init(){if(!this.isInitializing){this.isInitializing=!0;try{this.initialized&&this.cleanup(),this.config=Sm(this,{});let e=this.config.apiKey||``,t=this.config.backendUrl||``;if(!(this.isDemo||e)){this.updateState({configError:Error(`apiKey is required. Provide it as an attribute or ensure demo mode is enabled.`)}),this.isInitializing=!1;return}this.isDemo||(this.uploadService=new gm({apiKey:e,backendUrl:t})),this.controller=new wf(om(this));let n={...this.config};await this.controller.initialize(n),this.initialized=!0,this.updateState({configError:null}),this.videoPreview=ym(this,`#videoPreview`),this.audioBarsContainer=ym(this,`#audioLevelBars`),this.setupEventListeners(),Cm(),setTimeout(()=>this.startPreview(),100)}catch(e){this.updateState({error:i(e)})}finally{this.isInitializing=!1}}}renderConfigError(){let e=this.state,t=!!e.configError;if(this.toggleDisplay(`#configErrorOverlay`,t),t&&e.configError){let t=e.configError.message.includes(`apiKey is required`);this.toggleDisplay(`#configErrorMessageDefault`,!t),this.toggleDisplay(`#configErrorDetails`,t),t||this.setText(`#configErrorMessageDefault`,e.configError.message)}}cleanup(){this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...wm}}updateState(e){this.state={...this.state,...e},this.render(),e.stream!==void 0&&this.handleStreamUpdate(this.state.stream),this.state.devices.cameras.length===0&&this.state.stream&&this.updateDevices()}async updateDevices(){if(!this.controller)return;let e=this.controller.getDeviceManager(),t=await e.getAvailableDevices();this.updateState({devices:{cameras:t.videoinput,microphones:t.audioinput,selectedCamera:e.getSelectedCameraDeviceId(),selectedMic:e.getSelectedMicDeviceId()}})}handleStreamUpdate(e){this.videoPreview&&(e?(this.videoPreview.srcObject=e,this.videoPreview.style.display=`block`,this.videoPreview.play().catch(console.error),this.startAudioAnalysis(e)):(this.videoPreview.srcObject=null,this.videoPreview.style.display=`none`,this.stopAudioAnalysis()))}startAudioAnalysis(e){if(this.stopAudioAnalysis(),e.getAudioTracks().length!==0)try{this.audioContext=new AudioContext;let t=this.audioContext.createMediaStreamSource(e);this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=64,t.connect(this.analyser);let n=new Uint8Array(this.analyser.frequencyBinCount),r=()=>{if(!this.analyser)return;this.analyser.getByteFrequencyData(n);let e=0;for(let t of n)e+=t;let t=e/n.length,i=Math.min(1,t/128);this.renderAudioBars(i),this.animationFrameId=requestAnimationFrame(r)};r()}catch(e){console.error(`Audio analysis setup failed`,e)}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=[.8,1.2,.9],n=``;this.state.isMuted||t.forEach((t,r)=>{let i=Math.max(4,e*24*t);n+=`<div class="vidtreo-audio-level-bar" style="height: ${i}px;"></div>`}),this.audioBarsContainer.innerHTML=n}render(){this.renderPreviewSection(),this.renderIndicatorsSection(),this.renderButtonsSection(),this.renderStatusSection(),this.renderConfigError()}renderPreviewSection(){let e=this.state;this.toggleDisplay(`#startCameraArea`,!e.stream),this.toggleDisplay(`#videoPreview`,!!e.stream&&!e.transitionMessage),this.toggleClass(`#sourceTransitionOverlay`,`vidtreo-active`,!!e.transitionMessage),this.setText(`#transitionMessage`,e.transitionMessage||``)}renderIndicatorsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleClass(`#countdownOverlay`,`vidtreo-active`,e.recordingState===`countdown`),this.setText(`#countdownNumber`,e.countdown?.toString()||``),this.toggleDisplay(`#recIndicatorTop`,t),this.toggleDisplay(`#recordingTimerRow`,t),this.setText(`#recordingTimer`,e.timer),this.toggleDisplay(`#audioLevelBars`,t),this.toggleDisplay(`#recordingControls`,!!e.stream)}renderButtonsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleDisplay(`#btnSettings`,!t&&this.config.enableDeviceChange!==!1),this.toggleDisplay(`#btnRecord`,e.recordingState===`idle`),this.toggleDisplay(`#btnMute`,t&&this.config.enableMute!==!1),this.toggleDisplay(`#btnStop`,t),this.toggleDisplay(`#btnSwitchSource`,t&&this.config.enableSourceSwitching!==!1),this.renderPauseButton(t),this.renderMuteButton();let n=this.isDemo&&!t&&e.recordingState===`idle`&&e.recordedBlob!==null;this.toggleDisplay(`#btnDownload`,n)}renderPauseButton(e){let t=this.state,n=ym(this,`#btnPause`),r=this.querySelector(`#iconPause`);n&&(t.isPaused?(n.title=`Resume`,r&&(r.className=`ph-fill ph-play`)):(n.title=`Pause`,r&&(r.className=`ph-fill ph-pause`)),n.style.display=e&&this.config.enablePause!==!1?`inline-flex`:`none`)}renderMuteButton(){let e=this.state,t=ym(this,`#btnMute`),n=this.querySelector(`#iconMute`);t&&(n&&(n.className=e.isMuted?`ph-fill ph-microphone-slash`:`ph-fill ph-microphone`),t.classList.toggle(`vidtreo-muted`,e.isMuted))}renderStatusSection(){let e=this.state;if(this.toggleDisplay(`#error`,!!e.error),this.setText(`#error`,e.error||``),this.renderUploadStatus(),e.recordingState!==`idle`){let e=this.querySelector(`#settingsPanel`);e&&e.classList.remove(`vidtreo-active`)}}renderUploadStatus(){let e=this.state;this.toggleDisplay(`#finishingProgress`,e.isFinishing),this.toggleDisplay(`#uploadProgress`,e.uploadProgress!==null&&!e.isFinishing);let t=this.querySelector(`#uploadProgressFill`);t&&e.uploadProgress!==null&&(t.style.width=`${Math.round(e.uploadProgress*100)}%`);let n=this.querySelector(`#uploadProgressText`);n&&e.uploadProgress!==null&&(n.textContent=`${n.textContent?.split(` `)[0]||`Uploading...`} ${Math.round(e.uploadProgress*100)}%`)}toggleDisplay(e,t){let n=this.querySelector(e);if(n)if(t){let t=n.tagName===`BUTTON`,r=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`);t?n.style.display=`inline-flex`:r?n.style.display=`flex`:n.style.display=`block`}else n.style.display=`none`}toggleClass(e,t,n){let r=this.querySelector(e);r&&r.classList.toggle(t,n)}setText(e,t){let n=this.querySelector(e);n&&(n.textContent=t)}async startPreview(){if(this.controller)try{await this.controller.startStream(),this.updateState({stream:this.controller.getStream()})}catch(e){this.updateState({error:i(e)})}}async handleRecord(){if(this.controller)try{await lm(this.controller,`camera`)}catch(e){this.updateState({error:i(e)})}}async processRecordingBlob(e){if(!this.isProcessingBlob){this.isProcessingBlob=!0;try{if(this.isDemo){this.updateState({recordedBlob:e});return}if(!this.uploadService)throw Error(`Upload service not ready`);this.updateState({isFinishing:!0});let t=await wd(e),n=`recording-${Date.now()}.mp4`;try{let r=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:n,duration:t,userMetadata:this.config.userMetadata,onProgress:e=>{this.updateState({isFinishing:!1,uploadProgress:e})}});this.updateState({isFinishing:!1,uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:r}))}catch(e){throw this.updateState({isFinishing:!1,uploadProgress:null}),e}}finally{this.isProcessingBlob=!1}}}async handleStop(){if(this.controller)try{let e=await um(this.controller,this.isDemo,()=>{},()=>{});e&&await this.processRecordingBlob(e)}catch(e){this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused?fm(this.controller):dm(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&hm(this.state.recordedBlob)}handleMute(){this.controller&&(mm(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType()===`camera`?`screen`:`camera`;try{await pm(this.controller,e)}catch(e){this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=ym(this,e);n&&n.addEventListener(`click`,t)};e(`#btnRecord`,()=>this.handleRecord()),e(`#btnStop`,()=>this.handleStop()),e(`#btnPause`,()=>this.handlePauseToggle()),e(`#btnDownload`,()=>this.handleDownload()),e(`#btnMute`,()=>this.handleMute()),e(`#btnSwitchSource`,()=>this.handleSwitch());let t=this.querySelector(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.querySelector(`#btnSettings`),r=this.querySelector(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{r.classList.toggle(`vidtreo-active`),this.populateSettings()});let i=this.querySelector(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.querySelector(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.querySelector(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.querySelector(`#btnSettingsBack`);n&&n.addEventListener(`click`,e=>{e.stopPropagation(),this.settingsView!==`main`&&this.navigateSettings(`main`)})}navigateSettings(e){e===`main`?this.slideDirection=`left`:this.slideDirection=`right`,this.settingsView=e,this.renderSettings(),setTimeout(()=>{this.slideDirection=`none`,this.renderSettings()},300)}renderSettings(){this.updateSettingsContent(),this.renderSettingsView()}updateSettingsContent(){let e=this.querySelector(`#settingsContent`);e&&(e.classList.remove(`vidtreo-slide-left`,`vidtreo-slide-right`,`vidtreo-slide-none`),this.slideDirection!==`none`&&e.classList.add(`vidtreo-slide-${this.slideDirection}`))}renderSettingsView(){let e=this.querySelector(`#settingsMain`),t=this.querySelector(`#cameraList`),n=this.querySelector(`#micList`),r=this.querySelector(`#btnSettingsBack`);e&&(e.style.display=`none`),t&&(t.style.display=`none`),n&&(n.style.display=`none`),r&&(r.style.display=`none`),this.settingsView===`main`?this.renderSettingsMain(e,r):this.settingsView===`camera`?this.renderSettingsCamera(t,r):this.settingsView===`microphone`&&this.renderSettingsMicrophone(n,r)}renderSettingsMain(e,t){e&&(e.style.display=`flex`),t&&(t.style.display=`none`),this.updateCurrentDeviceLabels()}updateCurrentDeviceLabels(){let e=this.state.devices.cameras.filter(e=>e.deviceId&&e.deviceId.trim()!==``),t=this.state.devices.microphones.filter(e=>e.deviceId&&e.deviceId.trim()!==``),n=e.find(e=>e.deviceId===this.state.devices.selectedCamera),r=t.find(e=>e.deviceId===this.state.devices.selectedMic),i=n?.label||e[0]?.label||`Camera`,a=r?.label||t[0]?.label||`Microphone`;this.setText(`#currentCameraName`,i),this.setText(`#currentMicName`,a)}renderSettingsCamera(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.cameras,this.state.devices.selectedCamera,`camera`));let n=this.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Camera`),r&&(r.style.display=`flex`)}renderSettingsMicrophone(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.microphones,this.state.devices.selectedMic,`mic`));let n=this.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Microphone`),r&&(r.style.display=`flex`)}renderDeviceList(e,t,n,r){if(!t||t.length===0){e.innerHTML=`<div class="vidtreo-device-empty">No devices found</div>`;return}e.innerHTML=``;for(let a of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`,t.innerHTML=`
|
|
8613
8614
|
<div class="vidtreo-device-option-check-container">${a.deviceId===n?`<i class="ph-fill ph-check vidtreo-device-checkmark" style="display: flex; font-size: 20px;"></i>`:`<span class="vidtreo-device-checkmark-placeholder"></span>`}</div>
|
|
8614
8615
|
<span class="vidtreo-device-option-label">${a.label||`Device ${a.deviceId.slice(0,8)}`}</span>
|
|
8615
|
-
`,t.onclick=()=>{this.controller&&(r===`camera`?sm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})):cm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})),r===`camera`&&(this.state.devices.selectedCamera=a.deviceId),r===`mic`&&(this.state.devices.selectedMic=a.deviceId),this.navigateSettings(`main`))},e.appendChild(t)}}populateSettings(){this.settingsView=`main`,this.slideDirection=`none`,this.renderSettings()}};return customElements.get(`vidtreo-recorder`)||customElements.define(`vidtreo-recorder`,
|
|
8616
|
+
`,t.onclick=()=>{this.controller&&(r===`camera`?sm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})):cm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})),r===`camera`&&(this.state.devices.selectedCamera=a.deviceId),r===`mic`&&(this.state.devices.selectedMic=a.deviceId),this.navigateSettings(`main`))},e.appendChild(t)}}populateSettings(){this.settingsView=`main`,this.slideDirection=`none`,this.renderSettings()}};return customElements.get(`vidtreo-recorder`)||customElements.define(`vidtreo-recorder`,Tm),e.VidtreoRecorder=Tm,e})({});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vidtreo/recorder-wc",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Web component for @vidtreo/recorder - video recording SDK",
|
|
6
6
|
"main": "./dist/vidtreo-recorder.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"author": "cfonseca@vidtreo.com",
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@vidtreo/recorder": ">=0.9.
|
|
30
|
+
"@vidtreo/recorder": ">=0.9.10"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^24.10.1",
|