tas-uell-sdk 0.0.1 → 0.0.2
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/README.md +122 -229
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +79 -95
- package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +74 -24
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +50 -45
- package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +179 -0
- package/esm2020/lib/config/tas.config.mjs +10 -0
- package/esm2020/lib/interfaces/tas.interfaces.mjs +32 -2
- package/esm2020/lib/services/tas.service.mjs +27 -48
- package/esm2020/lib/tas-uell-sdk.module.mjs +82 -0
- package/esm2020/public-api.mjs +13 -12
- package/esm2020/tas-uell-sdk.mjs +1 -1
- package/fesm2015/tas-uell-sdk.mjs +440 -218
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +437 -216
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-btn/tas-btn.component.d.ts +15 -11
- package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +3 -2
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +4 -3
- package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +56 -0
- package/lib/config/tas.config.d.ts +28 -0
- package/lib/interfaces/tas.interfaces.d.ts +41 -6
- package/lib/services/tas.service.d.ts +6 -16
- package/lib/tas-uell-sdk.module.d.ts +46 -0
- package/package.json +34 -23
- package/public-api.d.ts +8 -7
- package/esm2020/lib/tas.config.mjs +0 -14
- package/esm2020/lib/tas.module.mjs +0 -73
- package/lib/tas.config.d.ts +0 -51
- package/lib/tas.module.d.ts +0 -34
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tas-uell-sdk.mjs","sources":["../../src/lib/tas.config.ts","../../src/lib/services/tas.service.ts","../../src/lib/components/tas-videocall/tas-videocall.component.ts","../../src/lib/components/tas-videocall/tas-videocall.component.html","../../src/lib/components/tas-btn/tas-btn.component.ts","../../src/lib/components/tas-btn/tas-btn.component.html","../../src/lib/components/tas-floating-call/tas-floating-call.component.ts","../../src/lib/components/tas-floating-call/tas-floating-call.component.html","../../src/lib/tas.module.ts","../../src/public-api.ts","../../src/tas-uell-sdk.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\n/**\n * Configuration interface for the TAS SDK\n */\nexport interface TasConfig {\n /**\n * TokBox/Vonage API Key\n */\n tokBoxApiKey: string;\n\n /**\n * Base URL for the TAS API endpoints\n */\n apiBaseUrl: string;\n}\n\n/**\n * Interface for HTTP client that the SDK will use.\n * Implement this interface in your app and provide it to the SDK.\n */\nexport interface TasHttpClient {\n post<T>(\n url: string,\n body: any,\n options?: { headers?: Record<string, string> }\n ): Observable<T>;\n}\n\n/**\n * User data interface required by TasButtonComponent\n */\nexport interface TasUserData {\n id: string | number;\n name: string;\n surname: string;\n}\n\n/**\n * User data provider interface - implement this to provide user data to the SDK\n */\nexport interface TasUserDataProvider {\n getUserData(): TasUserData | null;\n getTenantId(): string | null;\n}\n\n/**\n * Injection token for TAS configuration\n */\nexport const TAS_CONFIG = new InjectionToken<TasConfig>(\"TAS_CONFIG\");\n\n/**\n * Injection token for HTTP client\n */\nexport const TAS_HTTP_CLIENT = new InjectionToken<TasHttpClient>(\n \"TAS_HTTP_CLIENT\"\n);\n\n/**\n * Injection token for user data provider\n */\nexport const TAS_USER_DATA_PROVIDER = new InjectionToken<TasUserDataProvider>(\n \"TAS_USER_DATA_PROVIDER\"\n);\n","import { Injectable, Inject, Optional } from \"@angular/core\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { catchError, map } from \"rxjs/operators\";\nimport * as OT from \"@opentok/client\";\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TasConfig,\n TasHttpClient,\n} from \"../tas.config\";\nimport {\n CreateRoomRequest,\n CreateRoomResponse,\n GenerateTokenRequest,\n GenerateTokenResponse,\n} from \"../interfaces/tas.interfaces\";\n\nexport enum CallState {\n IDLE = \"IDLE\",\n CONNECTING = \"CONNECTING\",\n CONNECTED = \"CONNECTED\",\n DISCONNECTED = \"DISCONNECTED\",\n ERROR = \"ERROR\",\n}\n\nexport enum ViewMode {\n FULLSCREEN = \"FULLSCREEN\",\n PIP = \"PIP\",\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class TasService {\n private session: OT.Session | null = null;\n private publisher: OT.Publisher | null = null;\n private subscribers: OT.Subscriber[] = [];\n\n private callStateSubject = new BehaviorSubject<CallState>(CallState.IDLE);\n public callState$ = this.callStateSubject.asObservable();\n\n private viewModeSubject = new BehaviorSubject<ViewMode>(ViewMode.FULLSCREEN);\n public viewMode$ = this.viewModeSubject.asObservable();\n\n private isMutedSubject = new BehaviorSubject<boolean>(false);\n public isMuted$ = this.isMutedSubject.asObservable();\n\n // Session info for PiP mode restoration\n private currentSessionId: string | null = null;\n private currentToken: string | null = null;\n\n constructor(\n @Optional() @Inject(TAS_CONFIG) private config: TasConfig | null,\n @Optional() @Inject(TAS_HTTP_CLIENT) private httpClient: TasHttpClient | null\n ) {\n if (!this.config || !this.httpClient) {\n console.warn(\n \"TasService: Configuration not provided. Make sure to use TasModule.forRoot()\"\n );\n }\n }\n\n // Getters\n public get currentSession(): OT.Session | null {\n return this.session;\n }\n\n public get currentPublisher(): OT.Publisher | null {\n return this.publisher;\n }\n\n public get currentSubscribers(): OT.Subscriber[] {\n return this.subscribers;\n }\n\n public get sessionId(): string | null {\n return this.currentSessionId;\n }\n\n public get token(): string | null {\n return this.currentToken;\n }\n\n public get isMuted(): boolean {\n return this.isMutedSubject.getValue();\n }\n\n // View Mode Methods\n public setViewMode(mode: ViewMode): void {\n this.viewModeSubject.next(mode);\n }\n\n public enterPipMode(): void {\n this.viewModeSubject.next(ViewMode.PIP);\n }\n\n public exitPipMode(): void {\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n }\n\n public isPipMode(): boolean {\n return this.viewModeSubject.getValue() === ViewMode.PIP;\n }\n\n // Audio Control\n public toggleMute(): void {\n if (this.publisher) {\n const newMuteState = !this.isMutedSubject.getValue();\n this.publisher.publishAudio(!newMuteState);\n this.isMutedSubject.next(newMuteState);\n }\n }\n\n public setMute(muted: boolean): void {\n if (this.publisher) {\n this.publisher.publishAudio(!muted);\n this.isMutedSubject.next(muted);\n }\n }\n\n // Session Management\n public disconnectSession(): void {\n if (this.session) {\n this.session.disconnect();\n this.session = null;\n }\n this.publisher = null;\n this.subscribers = [];\n this.currentSessionId = null;\n this.currentToken = null;\n this.isMutedSubject.next(false);\n this.viewModeSubject.next(ViewMode.FULLSCREEN);\n this.callStateSubject.next(CallState.DISCONNECTED);\n }\n\n public isCallActive(): boolean {\n return this.callStateSubject.getValue() === CallState.CONNECTED;\n }\n\n // API Methods\n public createRoom(\n payload: CreateRoomRequest\n ): Observable<CreateRoomResponse> {\n if (!this.config || !this.httpClient) {\n throw new Error(\"TasService not configured. Use TasModule.forRoot()\");\n }\n const url = `${this.config.apiBaseUrl}/v2/room`;\n return this.httpClient.post<CreateRoomResponse>(url, payload).pipe(\n map((response) => response as CreateRoomResponse),\n catchError((error) => {\n console.error(\"TAS Service: createRoom failed\", error);\n throw error;\n })\n );\n }\n\n public generateToken(\n payload: GenerateTokenRequest\n ): Observable<GenerateTokenResponse> {\n if (!this.config || !this.httpClient) {\n throw new Error(\"TasService not configured. Use TasModule.forRoot()\");\n }\n const url = `${this.config.apiBaseUrl}/v2/room/token`;\n return this.httpClient.post<GenerateTokenResponse>(url, payload).pipe(\n map((response: any) => response as GenerateTokenResponse),\n catchError((error) => {\n console.error(\"TAS Service: generateToken failed\", error);\n throw error;\n })\n );\n }\n\n /**\n * Connects to a TokBox video session\n */\n public connectSession(\n sessionId: string,\n token: string,\n publisherElement: string,\n subscriberElement: string\n ): Promise<void> {\n this.callStateSubject.next(CallState.CONNECTING);\n this.currentSessionId = sessionId;\n this.currentToken = token;\n\n return new Promise((resolve, reject) => { \n if (!this.config) {\n this.callStateSubject.next(CallState.ERROR);\n reject(new Error(\"TasService not configured. Use TasModule.forRoot()\"));\n return;\n }\n\n if (!OT.checkSystemRequirements()) {\n this.callStateSubject.next(CallState.ERROR);\n reject(new Error(\"Browser not compatible with TokBox\"));\n return;\n }\n\n this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);\n\n // Handle new streams (remote participants joining)\n this.session.on(\"streamCreated\", (event) => {\n const subscriber = this.session?.subscribe(\n event.stream,\n subscriberElement,\n {\n insertMode: \"append\",\n width: \"100%\",\n height: \"100%\",\n },\n (error) => {\n if (error) {\n console.error(\"Error subscribing to stream:\", error);\n }\n }\n );\n if (subscriber) {\n this.subscribers.push(subscriber);\n }\n });\n\n // Handle streams ending (remote participants leaving)\n this.session.on(\"streamDestroyed\", (event) => {\n this.subscribers = this.subscribers.filter(\n (sub) => sub.stream?.streamId !== event.stream.streamId\n );\n });\n\n // Handle session disconnection\n this.session.on(\"sessionDisconnected\", () => {\n this.callStateSubject.next(CallState.DISCONNECTED);\n });\n\n // Connect to session\n this.session.connect(token, (error) => {\n if (error) {\n console.error(\"Error connecting to session:\", error);\n this.callStateSubject.next(CallState.ERROR);\n reject(error);\n return;\n }\n\n // Initialize publisher (local video)\n this.publisher = OT.initPublisher(\n publisherElement,\n {\n insertMode: \"append\",\n width: \"100%\",\n height: \"100%\",\n },\n (err) => {\n if (err) {\n console.error(\"Error initializing publisher:\", err);\n this.callStateSubject.next(CallState.ERROR);\n reject(err);\n return;\n }\n\n // Publish to session\n this.session?.publish(this.publisher!, (pubErr) => {\n if (pubErr) {\n console.error(\"Error publishing stream:\", pubErr);\n this.callStateSubject.next(CallState.ERROR);\n reject(pubErr);\n } else {\n this.callStateSubject.next(CallState.CONNECTED);\n resolve();\n }\n });\n }\n );\n });\n });\n }\n\n // Video Element Movement Methods\n public movePublisherTo(newContainerId: string): void {\n if (!this.publisher) return;\n\n const publisherElement = this.publisher.element;\n const newContainer = document.getElementById(newContainerId);\n\n if (publisherElement && newContainer) {\n newContainer.appendChild(publisherElement);\n }\n }\n\n public moveSubscribersTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n this.subscribers.forEach((subscriber) => {\n const subscriberElement = subscriber.element;\n if (subscriberElement) {\n newContainer.appendChild(subscriberElement);\n }\n });\n }\n\n /**\n * Moves the main video (subscriber if available, otherwise publisher) to a container.\n * Used for PiP mode to show only one video.\n */\n public moveMainVideoTo(newContainerId: string): void {\n const newContainer = document.getElementById(newContainerId);\n if (!newContainer) return;\n\n // Prefer remote video (subscriber) as main\n if (this.subscribers.length > 0 && this.subscribers[0].element) {\n newContainer.appendChild(this.subscribers[0].element);\n return;\n }\n\n // Fall back to local video (publisher)\n if (this.publisher?.element) {\n newContainer.appendChild(this.publisher.element);\n }\n }\n\n /**\n * Moves videos back to fullscreen containers\n */\n public moveVideosToFullscreen(): void {\n this.moveSubscribersTo(\"subscriber-container\");\n this.movePublisherTo(\"publisher-container\");\n }\n}\n","import {\n Component,\n OnInit,\n OnDestroy,\n Input,\n ViewChild,\n ElementRef,\n AfterViewInit,\n} from \"@angular/core\";\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\nimport { TasService, CallState, ViewMode } from \"../../services/tas.service\";\nimport { Subscription } from \"rxjs\";\nimport interact from \"interactjs\";\n\n@Component({\n selector: \"tas-videocall\",\n templateUrl: \"./tas-videocall.component.html\",\n styleUrls: [\"./tas-videocall.component.scss\"],\n})\nexport class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() sessionId!: string;\n @Input() token!: string;\n @Input() isReturningFromPip: boolean = false;\n\n @ViewChild(\"publisherContainer\") publisherContainer!: ElementRef;\n @ViewChild(\"subscriberContainer\") subscriberContainer!: ElementRef;\n\n public isPublisherSmall = true;\n public callState = CallState.IDLE;\n public isMuted = false;\n\n private subscriptions = new Subscription();\n\n constructor(\n public activeModal: NgbActiveModal,\n private tasService: TasService\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeCall();\n }\n\n ngAfterViewInit(): void {\n this.initInteract();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n\n if (!this.tasService.isPipMode()) {\n this.tasService.disconnectSession();\n }\n\n interact(\".publisher-view\").unset();\n }\n\n // Public Methods\n hangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n minimize(): void {\n this.tasService.moveMainVideoTo(\"pip-main-video\");\n setTimeout(() => this.tasService.enterPipMode(), 50);\n }\n\n toggleSwap(): void {\n this.isPublisherSmall = !this.isPublisherSmall;\n this.resetVideoPositions();\n setTimeout(() => this.initInteract());\n }\n\n onDoubleClick(): void {\n this.toggleSwap();\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n this.callState = state;\n if (state === CallState.DISCONNECTED) {\n this.activeModal.close(\"hangup\");\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n if (mode === ViewMode.PIP) {\n this.activeModal.close(\"pip\");\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n }\n\n private initializeCall(): void {\n if (this.isReturningFromPip) {\n setTimeout(() => this.tasService.moveVideosToFullscreen(), 100);\n } else if (this.sessionId && this.token) {\n this.tasService\n .connectSession(\n this.sessionId,\n this.token,\n \"publisher-container\",\n \"subscriber-container\"\n )\n .catch((err) => {\n console.error(\"Error connecting to video call:\", err);\n });\n }\n }\n\n private resetVideoPositions(): void {\n const publisherEl = this.publisherContainer?.nativeElement as HTMLElement;\n const subscriberEl = this.subscriberContainer?.nativeElement as HTMLElement;\n\n if (publisherEl) {\n publisherEl.removeAttribute(\"style\");\n publisherEl.removeAttribute(\"data-x\");\n publisherEl.removeAttribute(\"data-y\");\n }\n\n if (subscriberEl) {\n subscriberEl.removeAttribute(\"style\");\n subscriberEl.removeAttribute(\"data-x\");\n subscriberEl.removeAttribute(\"data-y\");\n }\n }\n\n private initInteract(): void {\n interact(\".publisher-view\").unset();\n\n interact(\".publisher-view\")\n .draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.restrictRect({\n restriction: \"parent\",\n endOnly: true,\n }),\n ],\n autoScroll: true,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x =\n (parseFloat(target.getAttribute(\"data-x\")) || 0) + event.dx;\n const y =\n (parseFloat(target.getAttribute(\"data-y\")) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute(\"data-x\", String(x));\n target.setAttribute(\"data-y\", String(y));\n },\n },\n })\n .resizable({\n edges: { left: false, right: true, bottom: true, top: false },\n listeners: {\n move: (event) => {\n const target = event.target;\n let x = parseFloat(target.getAttribute(\"data-x\")) || 0;\n let y = parseFloat(target.getAttribute(\"data-y\")) || 0;\n\n target.style.width = `${event.rect.width}px`;\n target.style.height = `${event.rect.height}px`;\n\n x += event.deltaRect.left;\n y += event.deltaRect.top;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute(\"data-x\", String(x));\n target.setAttribute(\"data-y\", String(y));\n },\n },\n modifiers: [\n interact.modifiers.restrictEdges({ outer: \"parent\" }),\n interact.modifiers.restrictSize({ min: { width: 150, height: 100 } }),\n interact.modifiers.aspectRatio({ ratio: \"preserve\" }),\n ],\n inertia: true,\n });\n }\n}\n","<div class=\"tas-videocall-container\">\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <div class=\"controls-container\">\n <button class=\"btn swap-btn\" (click)=\"toggleSwap()\" title=\"Cambiar vista\">\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"btn hangup-btn\" (click)=\"hangUp()\" title=\"Colgar\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, Inject, Optional } from \"@angular/core\";\nimport { TasService, ViewMode } from \"../../services/tas.service\";\nimport {\n TAS_USER_DATA_PROVIDER,\n TasUserDataProvider,\n TasUserData,\n} from \"../../tas.config\";\nimport { NgbModal, NgbModalRef } from \"@ng-bootstrap/ng-bootstrap\";\nimport { TasVideocallComponent } from \"../tas-videocall/tas-videocall.component\";\nimport { Subscription } from \"rxjs\";\nimport { switchMap } from \"rxjs/operators\";\n\n@Component({\n selector: \"tas-btn\",\n templateUrl: \"./tas-btn.component.html\",\n styleUrls: [\"./tas-btn.component.scss\"],\n})\nexport class TasButtonComponent implements OnInit, OnDestroy {\n isLoading = false;\n\n private userData: TasUserData | null = null;\n private tenantId: string | null = null;\n private subscriptions = new Subscription();\n private currentModalRef: NgbModalRef | null = null;\n\n constructor(\n private tasService: TasService,\n private modalService: NgbModal,\n @Optional()\n @Inject(TAS_USER_DATA_PROVIDER)\n private userDataProvider: TasUserDataProvider | null\n ) {}\n\n ngOnInit(): void {\n this.loadUserData();\n this.setupViewModeSubscription();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n onClick(): void {\n if (!this.userData || !this.tenantId) {\n console.error(\"User data or tenant ID not available\");\n return;\n }\n\n this.isLoading = true;\n\n this.subscriptions.add(\n this.tasService\n .createRoom({\n tenant: this.tenantId,\n userId: this.userData.id.toString(),\n product: \"Uell\",\n record: true,\n roomType: \"TAS\",\n type: \"SPONTANEOUS\",\n })\n .pipe(\n switchMap((response) => {\n const sessionId = response.content.sessionId;\n return this.tasService\n .generateToken({\n sessionId: sessionId,\n name: this.userData!.name,\n lastname: this.userData!.surname,\n })\n .pipe(\n switchMap((tokenResponse) => {\n return [\n {\n sessionId,\n token: tokenResponse.content.token,\n },\n ];\n })\n );\n })\n )\n .subscribe({\n next: ({ sessionId, token }) => {\n this.isLoading = false;\n this.openVideoCallModal(sessionId, token);\n },\n error: (err) => {\n console.error(\"Error starting video call:\", err);\n this.isLoading = false;\n },\n })\n );\n }\n\n // Private Methods\n private loadUserData(): void {\n if (!this.userDataProvider) {\n console.warn(\"TasButtonComponent: UserDataProvider not configured\");\n return;\n }\n this.userData = this.userDataProvider.getUserData();\n this.tenantId = this.userDataProvider.getTenantId();\n }\n\n private setupViewModeSubscription(): void {\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n if (\n mode === ViewMode.FULLSCREEN &&\n this.tasService.isCallActive() &&\n !this.currentModalRef\n ) {\n const sessionId = this.tasService.sessionId;\n const token = this.tasService.token;\n if (sessionId && token) {\n this.openVideoCallModal(sessionId, token, true);\n }\n }\n })\n );\n }\n\n private openVideoCallModal(\n sessionId: string,\n token: string,\n isReturningFromPip: boolean = false\n ): void {\n this.currentModalRef = this.modalService.open(TasVideocallComponent, {\n size: \"xl\",\n windowClass: \"tas-video-modal\",\n backdrop: \"static\",\n keyboard: false,\n });\n\n this.currentModalRef.componentInstance.sessionId = sessionId;\n this.currentModalRef.componentInstance.token = token;\n this.currentModalRef.componentInstance.isReturningFromPip =\n isReturningFromPip;\n\n this.currentModalRef.result.then(\n () => {\n this.currentModalRef = null;\n },\n () => {\n this.currentModalRef = null;\n }\n );\n }\n}\n","<button\n type=\"button\"\n class=\"btn btn-primary boton\"\n (click)=\"onClick()\"\n [disabled]=\"isLoading\"\n>\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\"> Iniciar TAS</span>\n <span *ngIf=\"isLoading\"> Processing...</span>\n</button>\n","import { Component, OnInit, OnDestroy } from \"@angular/core\";\nimport { TasService, CallState, ViewMode } from \"../../services/tas.service\";\nimport { Subscription } from \"rxjs\";\nimport interact from \"interactjs\";\n\n@Component({\n selector: \"tas-floating-call\",\n templateUrl: \"./tas-floating-call.component.html\",\n styleUrls: [\"./tas-floating-call.component.scss\"],\n})\nexport class TasFloatingCallComponent implements OnInit, OnDestroy {\n public isVisible = false;\n public isMuted = false;\n\n private subscriptions = new Subscription();\n\n constructor(private tasService: TasService) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n interact(\".tas-floating-container\").unset();\n }\n\n // Public Methods\n onExpand(): void {\n this.tasService.exitPipMode();\n }\n\n onHangUp(): void {\n this.tasService.disconnectSession();\n }\n\n toggleMute(): void {\n this.tasService.toggleMute();\n }\n\n // Private Methods\n private setupSubscriptions(): void {\n this.subscriptions.add(\n this.tasService.callState$.subscribe((state) => {\n if (state === CallState.DISCONNECTED) {\n this.isVisible = false;\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.viewMode$.subscribe((mode) => {\n this.isVisible =\n mode === ViewMode.PIP && this.tasService.isCallActive();\n if (this.isVisible) {\n setTimeout(() => this.initInteract(), 100);\n }\n })\n );\n\n this.subscriptions.add(\n this.tasService.isMuted$.subscribe((muted) => {\n this.isMuted = muted;\n })\n );\n }\n\n private initInteract(): void {\n interact(\".tas-floating-container\").unset();\n\n interact(\".tas-floating-container\").draggable({\n inertia: true,\n modifiers: [\n interact.modifiers.restrictRect({\n restriction: \"body\",\n endOnly: true,\n }),\n ],\n autoScroll: false,\n listeners: {\n move: (event) => {\n const target = event.target;\n const x = (parseFloat(target.getAttribute(\"data-x\")) || 0) + event.dx;\n const y = (parseFloat(target.getAttribute(\"data-y\")) || 0) + event.dy;\n\n target.style.transform = `translate(${x}px, ${y}px)`;\n target.setAttribute(\"data-x\", String(x));\n target.setAttribute(\"data-y\", String(y));\n },\n },\n });\n }\n}\n","<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n <div class=\"floating-content\">\n <div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n <div class=\"floating-controls\">\n <button\n class=\"action-btn expand-btn\"\n (click)=\"onExpand()\"\n title=\"Expandir a pantalla completa\"\n >\n <i class=\"fa fa-expand\"></i>\n </button>\n <button\n class=\"action-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micrófono' : 'Silenciar micrófono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"action-btn hangup-btn\"\n (click)=\"onHangUp()\"\n title=\"Colgar llamada\"\n >\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n </div>\n</div>\n","import { NgModule, ModuleWithProviders } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgbModalModule } from \"@ng-bootstrap/ng-bootstrap\";\n\nimport { TasButtonComponent } from \"./components/tas-btn/tas-btn.component\";\nimport { TasVideocallComponent } from \"./components/tas-videocall/tas-videocall.component\";\nimport { TasFloatingCallComponent } from \"./components/tas-floating-call/tas-floating-call.component\";\nimport {\n TAS_CONFIG,\n TAS_HTTP_CLIENT,\n TAS_USER_DATA_PROVIDER,\n TasConfig,\n TasHttpClient,\n TasUserDataProvider,\n} from \"./tas.config\";\n\nexport interface TasModuleConfig {\n config: TasConfig;\n httpClient?: new (...args: any[]) => TasHttpClient;\n userDataProvider?: new (...args: any[]) => TasUserDataProvider;\n}\n\n@NgModule({\n declarations: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n ],\n imports: [CommonModule, NgbModalModule],\n exports: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n ],\n})\nexport class TasModule {\n /**\n * Use this method in your app module to configure the TAS SDK\n *\n * @example\n * ```typescript\n * TasModule.forRoot({\n * config: {\n * tokBoxApiKey: environment.tokBox,\n * apiBaseUrl: environment.apiUrl\n * },\n * httpClient: MyHttpClientAdapter,\n * userDataProvider: MyUserDataProvider\n * })\n * ```\n */\n static forRoot(\n moduleConfig: TasModuleConfig\n ): ModuleWithProviders<TasModule> {\n const providers: any[] = [\n {\n provide: TAS_CONFIG,\n useValue: moduleConfig.config,\n },\n ];\n\n if (moduleConfig.httpClient) {\n providers.push({\n provide: TAS_HTTP_CLIENT,\n useClass: moduleConfig.httpClient,\n });\n }\n\n if (moduleConfig.userDataProvider) {\n providers.push({\n provide: TAS_USER_DATA_PROVIDER,\n useClass: moduleConfig.userDataProvider,\n });\n }\n\n return {\n ngModule: TasModule,\n providers,\n };\n }\n}\n","/*\n * Public API Surface of tas-uell-sdk\n */\n\n// Module\nexport * from \"./lib/tas.module\";\n\n// Configuration\nexport * from \"./lib/tas.config\";\n\n// Services\nexport * from \"./lib/services/tas.service\";\n\n// Components\nexport * from \"./lib/components/tas-btn/tas-btn.component\";\nexport * from \"./lib/components/tas-videocall/tas-videocall.component\";\nexport * from \"./lib/components/tas-floating-call/tas-floating-call.component\";\n\n// Interfaces\nexport * from \"./lib/interfaces/tas.interfaces\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.TasService","i1.TasService"],"mappings":";;;;;;;;;;;AA+CA;;AAEG;MACU,UAAU,GAAG,IAAI,cAAc,CAAY,YAAY,EAAE;AAEtE;;AAEG;MACU,eAAe,GAAG,IAAI,cAAc,CAC/C,iBAAiB,EACjB;AAEF;;AAEG;MACU,sBAAsB,GAAG,IAAI,cAAc,CACtD,wBAAwB;;IC9Cd,UAMX;AAND,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,SAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,SAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,SAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EANW,SAAS,KAAT,SAAS,GAMpB,EAAA,CAAA,CAAA,CAAA;IAEW,SAGX;AAHD,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,QAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACb,CAAC,EAHW,QAAQ,KAAR,QAAQ,GAGnB,EAAA,CAAA,CAAA,CAAA;MAGY,UAAU,CAAA;IAkBrB,WAC0C,CAAA,MAAwB,EACnB,UAAgC,EAAA;QADrC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAkB;QACnB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAsB;QAnBvE,IAAO,CAAA,OAAA,GAAsB,IAAI,CAAC;QAClC,IAAS,CAAA,SAAA,GAAwB,IAAI,CAAC;QACtC,IAAW,CAAA,WAAA,GAAoB,EAAE,CAAC;QAElC,IAAgB,CAAA,gBAAA,GAAG,IAAI,eAAe,CAAY,SAAS,CAAC,IAAI,CAAC,CAAC;AACnE,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;QAEjD,IAAe,CAAA,eAAA,GAAG,IAAI,eAAe,CAAW,QAAQ,CAAC,UAAU,CAAC,CAAC;AACtE,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;AAE/C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;AACtD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;;QAG7C,IAAgB,CAAA,gBAAA,GAAkB,IAAI,CAAC;QACvC,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;QAMzC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,OAAO,CAAC,IAAI,CACV,8EAA8E,CAC/E,CAAC;AACH,SAAA;KACF;;AAGD,IAAA,IAAW,cAAc,GAAA;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;AAED,IAAA,IAAW,gBAAgB,GAAA;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;AAED,IAAA,IAAW,kBAAkB,GAAA;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;AAED,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC;KAC9B;AAED,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;AAED,IAAA,IAAW,OAAO,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;KACvC;;AAGM,IAAA,WAAW,CAAC,IAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACjC;IAEM,YAAY,GAAA;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACzC;IAEM,WAAW,GAAA;QAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAChD;IAEM,SAAS,GAAA;QACd,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC,GAAG,CAAC;KACzD;;IAGM,UAAU,GAAA;QACf,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC;AAC3C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACxC,SAAA;KACF;AAEM,IAAA,OAAO,CAAC,KAAc,EAAA;QAC3B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC;AACpC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,SAAA;KACF;;IAGM,iBAAiB,GAAA;QACtB,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACrB,SAAA;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;KACpD;IAEM,YAAY,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC,SAAS,CAAC;KACjE;;AAGM,IAAA,UAAU,CACf,OAA0B,EAAA;QAE1B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACvE,SAAA;QACD,MAAM,GAAG,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA,QAAA,CAAU,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAqB,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,CAChE,GAAG,CAAC,CAAC,QAAQ,KAAK,QAA8B,CAAC,EACjD,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;AACvD,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAEM,IAAA,aAAa,CAClB,OAA6B,EAAA;QAE7B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACvE,SAAA;QACD,MAAM,GAAG,GAAG,CAAG,EAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA,cAAA,CAAgB,CAAC;AACtD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAwB,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,CACnE,GAAG,CAAC,CAAC,QAAa,KAAK,QAAiC,CAAC,EACzD,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;AAC1D,YAAA,MAAM,KAAK,CAAC;SACb,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACI,IAAA,cAAc,CACnB,SAAiB,EACjB,KAAa,EACb,gBAAwB,EACxB,iBAAyB,EAAA;QAEzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAChB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5C,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;gBACxE,OAAO;AACR,aAAA;AAED,YAAA,IAAI,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE;gBACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5C,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBACxD,OAAO;AACR,aAAA;AAED,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;;YAGnE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,KAAI;AACzC,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CACxC,KAAK,CAAC,MAAM,EACZ,iBAAiB,EACjB;AACE,oBAAA,UAAU,EAAE,QAAQ;AACpB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE,MAAM;iBACf,EACD,CAAC,KAAK,KAAI;AACR,oBAAA,IAAI,KAAK,EAAE;AACT,wBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACtD,qBAAA;AACH,iBAAC,CACF,CAAC;AACF,gBAAA,IAAI,UAAU,EAAE;AACd,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACnC,iBAAA;AACH,aAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,KAAI;gBAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACxC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CACxD,CAAC;AACJ,aAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,qBAAqB,EAAE,MAAK;gBAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACrD,aAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,KAAI;AACpC,gBAAA,IAAI,KAAK,EAAE;AACT,oBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;oBACrD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC5C,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;AACR,iBAAA;;gBAGD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,aAAa,CAC/B,gBAAgB,EAChB;AACE,oBAAA,UAAU,EAAE,QAAQ;AACpB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE,MAAM;iBACf,EACD,CAAC,GAAG,KAAI;AACN,oBAAA,IAAI,GAAG,EAAE;AACP,wBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;wBACpD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC5C,MAAM,CAAC,GAAG,CAAC,CAAC;wBACZ,OAAO;AACR,qBAAA;;AAGD,oBAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAU,EAAE,CAAC,MAAM,KAAI;AAChD,wBAAA,IAAI,MAAM,EAAE;AACV,4BAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;4BAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;4BAC5C,MAAM,CAAC,MAAM,CAAC,CAAC;AAChB,yBAAA;AAAM,6BAAA;4BACL,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAChD,4BAAA,OAAO,EAAE,CAAC;AACX,yBAAA;AACH,qBAAC,CAAC,CAAC;AACL,iBAAC,CACF,CAAC;AACJ,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;;AAGM,IAAA,eAAe,CAAC,cAAsB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;AAE5B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAE7D,IAAI,gBAAgB,IAAI,YAAY,EAAE;AACpC,YAAA,YAAY,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAC5C,SAAA;KACF;AAEM,IAAA,iBAAiB,CAAC,cAAsB,EAAA;QAC7C,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;AACtC,YAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC;AAC7C,YAAA,IAAI,iBAAiB,EAAE;AACrB,gBAAA,YAAY,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAC7C,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED;;;AAGG;AACI,IAAA,eAAe,CAAC,cAAsB,EAAA;QAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;;AAG1B,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AAC9D,YAAA,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO;AACR,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;YAC3B,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAClD,SAAA;KACF;AAED;;AAEG;IACI,sBAAsB,GAAA;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;KAC7C;;uGApSU,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAmBC,UAAU,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EACV,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AApB1B,UAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cADG,MAAM,EAAA,CAAA,CAAA;2FACnB,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;0BAoB7B,QAAQ;;0BAAI,MAAM;2BAAC,UAAU,CAAA;;0BAC7B,QAAQ;;0BAAI,MAAM;2BAAC,eAAe,CAAA;;;MChC1B,qBAAqB,CAAA;IAchC,WACS,CAAA,WAA2B,EAC1B,UAAsB,EAAA;QADvB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAgB;QAC1B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAbvB,IAAkB,CAAA,kBAAA,GAAY,KAAK,CAAC;QAKtC,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;QAC3B,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;AAEf,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;KAKvC;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAED,eAAe,GAAA;QACb,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;AAEjC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACrC,SAAA;AAED,QAAA,QAAQ,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;KACrC;;IAGD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;KACrC;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;KAC9B;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;AAClD,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;KACtD;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC/C,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACvC;IAED,aAAa,GAAA;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;;IAGO,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC7C,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,YAAA,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,EAAE;AACpC,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAClC,aAAA;SACF,CAAC,CACH,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC3C,YAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/B,aAAA;SACF,CAAC,CACH,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC3C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB,CAAC,CACH,CAAC;KACH;IAEO,cAAc,GAAA;QACpB,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;AACjE,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;AACvC,YAAA,IAAI,CAAC,UAAU;AACZ,iBAAA,cAAc,CACb,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,EACV,qBAAqB,EACrB,sBAAsB,CACvB;AACA,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;AACxD,aAAC,CAAC,CAAC;AACN,SAAA;KACF;IAEO,mBAAmB,GAAA;AACzB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAA4B,CAAC;AAC1E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,aAA4B,CAAC;AAE5E,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACtC,YAAA,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACvC,SAAA;AAED,QAAA,IAAI,YAAY,EAAE;AAChB,YAAA,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACtC,YAAA,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACvC,YAAA,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACxC,SAAA;KACF;IAEO,YAAY,GAAA;AAClB,QAAA,QAAQ,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEpC,QAAQ,CAAC,iBAAiB,CAAC;AACxB,aAAA,SAAS,CAAC;AACT,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE;AACT,gBAAA,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;AAC9B,oBAAA,WAAW,EAAE,QAAQ;AACrB,oBAAA,OAAO,EAAE,IAAI;iBACd,CAAC;AACH,aAAA;AACD,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,SAAS,EAAE;AACT,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,MAAM,CAAC,GACL,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;AAC9D,oBAAA,MAAM,CAAC,GACL,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAE9D,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1C;AACF,aAAA;SACF,CAAC;AACD,aAAA,SAAS,CAAC;AACT,YAAA,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;AAC7D,YAAA,SAAS,EAAE;AACT,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AACvD,oBAAA,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAEvD,oBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;AAC7C,oBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;AAE/C,oBAAA,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAC1B,oBAAA,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;oBAEzB,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1C;AACF,aAAA;AACD,YAAA,SAAS,EAAE;gBACT,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACrD,gBAAA,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBACrE,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACtD,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;KACN;;kHA/KU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,0XCnBlC,u1CA6CA,EAAA,MAAA,EAAA,CAAA,o6EAAA,CAAA,EAAA,CAAA,CAAA;2FD1Ba,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;+BACE,eAAe,EAAA,QAAA,EAAA,u1CAAA,EAAA,MAAA,EAAA,CAAA,o6EAAA,CAAA,EAAA,CAAA;2HAKhB,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBAE2B,kBAAkB,EAAA,CAAA;sBAAlD,SAAS;uBAAC,oBAAoB,CAAA;gBACG,mBAAmB,EAAA,CAAA;sBAApD,SAAS;uBAAC,qBAAqB,CAAA;;;MERrB,kBAAkB,CAAA;AAQ7B,IAAA,WAAA,CACU,UAAsB,EACtB,YAAsB,EAGtB,gBAA4C,EAAA;QAJ5C,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAU;QAGtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAA4B;QAZtD,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAEV,IAAQ,CAAA,QAAA,GAAuB,IAAI,CAAC;QACpC,IAAQ,CAAA,QAAA,GAAkB,IAAI,CAAC;AAC/B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,IAAe,CAAA,eAAA,GAAuB,IAAI,CAAC;KAQ/C;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,yBAAyB,EAAE,CAAC;KAClC;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;KAClC;IAED,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AACpC,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AAEtB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU;AACZ,aAAA,UAAU,CAAC;YACV,MAAM,EAAE,IAAI,CAAC,QAAQ;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE;AACnC,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,aAAa;SACpB,CAAC;AACD,aAAA,IAAI,CACH,SAAS,CAAC,CAAC,QAAQ,KAAI;AACrB,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;YAC7C,OAAO,IAAI,CAAC,UAAU;AACnB,iBAAA,aAAa,CAAC;AACb,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,IAAI,EAAE,IAAI,CAAC,QAAS,CAAC,IAAI;AACzB,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAS,CAAC,OAAO;aACjC,CAAC;AACD,iBAAA,IAAI,CACH,SAAS,CAAC,CAAC,aAAa,KAAI;gBAC1B,OAAO;AACL,oBAAA;wBACE,SAAS;AACT,wBAAA,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK;AACnC,qBAAA;iBACF,CAAC;aACH,CAAC,CACH,CAAC;AACN,SAAC,CAAC,CACH;AACA,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAI;AAC7B,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;aAC3C;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACF,SAAA,CAAC,CACL,CAAC;KACH;;IAGO,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACpE,OAAO;AACR,SAAA;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;KACrD;IAEO,yBAAyB,GAAA;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC3C,YAAA,IACE,IAAI,KAAK,QAAQ,CAAC,UAAU;AAC5B,gBAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;gBAC9B,CAAC,IAAI,CAAC,eAAe,EACrB;AACA,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;AAC5C,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBACpC,IAAI,SAAS,IAAI,KAAK,EAAE;oBACtB,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACjD,iBAAA;AACF,aAAA;SACF,CAAC,CACH,CAAC;KACH;AAEO,IAAA,kBAAkB,CACxB,SAAiB,EACjB,KAAa,EACb,qBAA8B,KAAK,EAAA;QAEnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACnE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,WAAW,EAAE,iBAAiB;AAC9B,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7D,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;AACrD,QAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,kBAAkB;AACvD,YAAA,kBAAkB,CAAC;QAErB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAC9B,MAAK;AACH,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;SAC7B,EACD,MAAK;AACH,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;AAC9B,SAAC,CACF,CAAC;KACH;;AAlIU,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,iEAYnB,sBAAsB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAZrB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,+CCjB/B,2TAUA,EAAA,MAAA,EAAA,CAAA,yOAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDOa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACE,SAAS,EAAA,QAAA,EAAA,2TAAA,EAAA,MAAA,EAAA,CAAA,yOAAA,CAAA,EAAA,CAAA;;0BAehB,QAAQ;;0BACR,MAAM;2BAAC,sBAAsB,CAAA;;;MEnBrB,wBAAwB,CAAA;AAMnC,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QALnC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;AAEf,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;KAEG;IAE9C,QAAQ,GAAA;QACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC3B;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;AACjC,QAAA,QAAQ,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;KAC7C;;IAGD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;KAC/B;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;KACrC;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;KAC9B;;IAGO,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC7C,YAAA,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,EAAE;AACpC,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACxB,aAAA;SACF,CAAC,CACH,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC3C,YAAA,IAAI,CAAC,SAAS;gBACZ,IAAI,KAAK,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YAC1D,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5C,aAAA;SACF,CAAC,CACH,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC3C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB,CAAC,CACH,CAAC;KACH;IAEO,YAAY,GAAA;AAClB,QAAA,QAAQ,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;AAE5C,QAAA,QAAQ,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC;AAC5C,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE;AACT,gBAAA,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;AAC9B,oBAAA,WAAW,EAAE,MAAM;AACnB,oBAAA,OAAO,EAAE,IAAI;iBACd,CAAC;AACH,aAAA;AACD,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE;AACT,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;AACtE,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAEtE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1C;AACF,aAAA;AACF,SAAA,CAAC,CAAC;KACJ;;qHAjFU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,yDCVrC,0hCAkCA,EAAA,MAAA,EAAA,CAAA,q2DAAA,CAAA,EAAA,CAAA,CAAA;2FDxBa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,SAAS;+BACE,mBAAmB,EAAA,QAAA,EAAA,0hCAAA,EAAA,MAAA,EAAA,CAAA,q2DAAA,CAAA,EAAA,CAAA;;;ME6BlB,SAAS,CAAA;AACpB;;;;;;;;;;;;;;AAcG;IACH,OAAO,OAAO,CACZ,YAA6B,EAAA;AAE7B,QAAA,MAAM,SAAS,GAAU;AACvB,YAAA;AACE,gBAAA,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE,YAAY,CAAC,MAAM;AAC9B,aAAA;SACF,CAAC;QAEF,IAAI,YAAY,CAAC,UAAU,EAAE;YAC3B,SAAS,CAAC,IAAI,CAAC;AACb,gBAAA,OAAO,EAAE,eAAe;gBACxB,QAAQ,EAAE,YAAY,CAAC,UAAU;AAClC,aAAA,CAAC,CAAC;AACJ,SAAA;QAED,IAAI,YAAY,CAAC,gBAAgB,EAAE;YACjC,SAAS,CAAC,IAAI,CAAC;AACb,gBAAA,OAAO,EAAE,sBAAsB;gBAC/B,QAAQ,EAAE,YAAY,CAAC,gBAAgB;AACxC,aAAA,CAAC,CAAC;AACJ,SAAA;QAED,OAAO;AACL,YAAA,QAAQ,EAAE,SAAS;YACnB,SAAS;SACV,CAAC;KACH;;sGA5CU,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAT,SAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,iBAXlB,kBAAkB;QAClB,qBAAqB;AACrB,QAAA,wBAAwB,CAEhB,EAAA,OAAA,EAAA,CAAA,YAAY,EAAE,cAAc,aAEpC,kBAAkB;QAClB,qBAAqB;QACrB,wBAAwB,CAAA,EAAA,CAAA,CAAA;AAGf,SAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,EAPX,OAAA,EAAA,CAAA,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA,EAAA,CAAA,CAAA;2FAO5B,SAAS,EAAA,UAAA,EAAA,CAAA;kBAbrB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,kBAAkB;wBAClB,qBAAqB;wBACrB,wBAAwB;AACzB,qBAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC;AACvC,oBAAA,OAAO,EAAE;wBACP,kBAAkB;wBAClB,qBAAqB;wBACrB,wBAAwB;AACzB,qBAAA;AACF,iBAAA,CAAA;;;AClCD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"tas-uell-sdk.mjs","sources":["../../../projects/tas-uell-sdk/src/lib/config/tas.config.ts","../../../projects/tas-uell-sdk/src/lib/interfaces/tas.interfaces.ts","../../../projects/tas-uell-sdk/src/lib/services/tas.service.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-videocall/tas-videocall.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-videocall/tas-videocall.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-waiting-room/tas-waiting-room.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-waiting-room/tas-waiting-room.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-btn/tas-btn.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-btn/tas-btn.component.html","../../../projects/tas-uell-sdk/src/lib/components/tas-floating-call/tas-floating-call.component.ts","../../../projects/tas-uell-sdk/src/lib/components/tas-floating-call/tas-floating-call.component.html","../../../projects/tas-uell-sdk/src/lib/tas-uell-sdk.module.ts","../../../projects/tas-uell-sdk/src/public-api.ts","../../../projects/tas-uell-sdk/src/tas-uell-sdk.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Configuration interface for the TAS module\n */\nexport interface TasConfig {\n\t/** TokBox/Vonage API Key */\n\ttokBoxApiKey: string;\n\t/** Optional API base URL for room/token endpoints */\n\tapiBaseUrl?: string;\n}\n\n/**\n * HTTP client interface that consuming apps must implement\n */\nexport interface TasHttpClient {\n\tpost<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T>;\n}\n\n/**\n * Injection token for TAS configuration\n */\nexport const TAS_CONFIG = new InjectionToken<TasConfig>('TAS_CONFIG');\n\n/**\n * Injection token for HTTP client adapter\n */\nexport const TAS_HTTP_CLIENT = new InjectionToken<TasHttpClient>('TAS_HTTP_CLIENT');\n\n","export interface CreateRoomUser {\n\tuserExternalId: number;\n\trol: TasUserRole;\n}\n\nexport interface CreateRoomRequest {\n\troomType: TasRoomType;\n\ttype: TasSessionType;\n\tutcScheduled?: string;\n\tproduct: string;\n\ttenant: string;\n\tappointmentId: number;\n\tusers: CreateRoomUser[];\n}\n\nexport interface CreateRoomResponse {\n\tcontent: {\n\t\troomType: string | null;\n\t\ttenant: string | null;\n\t\tuser_id: string | null;\n\t\tproduct: string | null;\n\t\trecord: boolean | null;\n\t\tsessionId: string;\n\t\troomId: number;\n\t\tstatus: TasSessionType;\n\t};\n}\n\nexport enum TasRoomType {\n\tTAS = \"TAS\",\n\tJM = \"JM\",\n\tWEBINAR = \"WEBINAR\"\n}\n\nexport enum TasSessionType {\n\tSPONTANEOUS = \"SPONTANEOUS\",\n\tSCHEDULED = \"SCHEDULED\"\n}\n\nexport enum TasUserRole {\n\tOWNER = \"OWNER\",\n\tUSER = \"USER\",\n\tMODERATOR = \"MODERATOR\"\n}\n\nexport interface TasCurrentUser {\n\tname: string;\n\tlastname: string;\n\trole: TasUserRole;\n}\n\nexport interface GenerateTokenRequest {\n\tsessionId: string;\n\tname: string;\n\tlastname: string;\n\troleVC: TasUserRole;\n}\n\nexport interface GenerateTokenResponse {\n\tcontent: {\n\t\ttoken: string;\n\t};\n}\n\n// Enums for TAS Service state management\nexport enum CallState {\n\tIDLE = 'IDLE',\n\tCONNECTING = 'CONNECTING',\n\tCONNECTED = 'CONNECTED',\n\tDISCONNECTED = 'DISCONNECTED',\n\tERROR = 'ERROR'\n}\n\nexport enum ViewMode {\n\tFULLSCREEN = 'FULLSCREEN',\n\tPIP = 'PIP'\n}\n\n","import { Injectable, Inject } from \"@angular/core\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { catchError, map } from \"rxjs/operators\";\nimport * as OT from \"@opentok/client\";\nimport {\n\tCreateRoomRequest,\n\tCreateRoomResponse,\n\tGenerateTokenRequest,\n\tGenerateTokenResponse,\n\tCallState,\n\tViewMode,\n} from \"../interfaces/tas.interfaces\";\nimport { TAS_CONFIG, TAS_HTTP_CLIENT, TasConfig, TasHttpClient } from \"../config/tas.config\";\n\n// Re-export enums for backward compatibility\nexport { CallState, ViewMode };\n\n@Injectable({\n\tprovidedIn: \"root\",\n})\nexport class TasService {\n\tprivate session: OT.Session | null = null;\n\tprivate publisher: OT.Publisher | null = null;\n\tprivate subscribers: OT.Subscriber[] = [];\n\n\tprivate callStateSubject = new BehaviorSubject<CallState>(CallState.IDLE);\n\tpublic callState$ = this.callStateSubject.asObservable();\n\n\tprivate viewModeSubject = new BehaviorSubject<ViewMode>(ViewMode.FULLSCREEN);\n\tpublic viewMode$ = this.viewModeSubject.asObservable();\n\n\tprivate isMutedSubject = new BehaviorSubject<boolean>(false);\n\tpublic isMuted$ = this.isMutedSubject.asObservable();\n\n\t// Session info for PiP mode restoration\n\tprivate currentSessionId: string | null = null;\n\tprivate currentToken: string | null = null;\n\n\tconstructor(\n\t\t@Inject(TAS_HTTP_CLIENT) private httpClient: TasHttpClient,\n\t\t@Inject(TAS_CONFIG) private config: TasConfig\n\t) {}\n\n\t// Getters\n\tpublic get currentSession(): OT.Session | null {\n\t\treturn this.session;\n\t}\n\n\tpublic get currentPublisher(): OT.Publisher | null {\n\t\treturn this.publisher;\n\t}\n\n\tpublic get currentSubscribers(): OT.Subscriber[] {\n\t\treturn this.subscribers;\n\t}\n\n\tpublic get sessionId(): string | null {\n\t\treturn this.currentSessionId;\n\t}\n\n\tpublic get token(): string | null {\n\t\treturn this.currentToken;\n\t}\n\n\tpublic get isMuted(): boolean {\n\t\treturn this.isMutedSubject.getValue();\n\t}\n\n\t// View Mode Methods\n\tpublic setViewMode(mode: ViewMode): void {\n\t\tthis.viewModeSubject.next(mode);\n\t}\n\n\tpublic enterPipMode(): void {\n\t\tthis.viewModeSubject.next(ViewMode.PIP);\n\t}\n\n\tpublic exitPipMode(): void {\n\t\tthis.viewModeSubject.next(ViewMode.FULLSCREEN);\n\t}\n\n\tpublic isPipMode(): boolean {\n\t\treturn this.viewModeSubject.getValue() === ViewMode.PIP;\n\t}\n\n\t// Audio Control\n\tpublic toggleMute(): void {\n\t\tif (this.publisher) {\n\t\t\tconst newMuteState = !this.isMutedSubject.getValue();\n\t\t\tconst shouldEnableAudio = !newMuteState;\n\t\t\t\n\t\t\t// Use OpenTok's publishAudio\n\t\t\tthis.publisher.publishAudio(shouldEnableAudio);\n\t\t\t\n\t\t\t// Also directly control the MediaStreamTrack as backup\n\t\t\tconst audioTrack = this.publisher.getAudioSource?.();\n\t\t\tif (audioTrack) {\n\t\t\t\taudioTrack.enabled = shouldEnableAudio;\n\t\t\t}\n\t\t\t\n\t\t\tthis.isMutedSubject.next(newMuteState);\n\t\t}\n\t}\n\n\tpublic setMute(muted: boolean): void {\n\t\tif (this.publisher) {\n\t\t\tthis.publisher.publishAudio(!muted);\n\t\t\tthis.isMutedSubject.next(muted);\n\t\t}\n\t}\n\n\t// Session Management\n\tpublic disconnectSession(): void {\n\t\tif (this.session) {\n\t\t\tthis.session.disconnect();\n\t\t\tthis.session = null;\n\t\t}\n\t\tthis.publisher = null;\n\t\tthis.subscribers = [];\n\t\tthis.currentSessionId = null;\n\t\tthis.currentToken = null;\n\t\tthis.isMutedSubject.next(false); // Reset mute state\n\t\tthis.viewModeSubject.next(ViewMode.FULLSCREEN);\n\t\tthis.callStateSubject.next(CallState.DISCONNECTED);\n\t}\n\n\tpublic isCallActive(): boolean {\n\t\treturn this.callStateSubject.getValue() === CallState.CONNECTED;\n\t}\n\n\t// API Methods\n\tpublic createRoom(payload: CreateRoomRequest): Observable<CreateRoomResponse> {\n\t\treturn this.httpClient.post<CreateRoomResponse>(\"v2/room\", { body: payload, headers: {} }).pipe(\n\t\t\tmap((response) => response as CreateRoomResponse),\n\t\t\tcatchError((error) => {\n\t\t\t\tconsole.error(\"TAS Service: createRoom failed\", error);\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t);\n\t}\n\n\tpublic generateToken(payload: GenerateTokenRequest): Observable<GenerateTokenResponse> {\n\t\treturn this.httpClient.post<GenerateTokenResponse>(\"v2/room/token\", { body: payload, headers: {} }).pipe(\n\t\t\tmap((response: any) => response as GenerateTokenResponse),\n\t\t\tcatchError((error) => {\n\t\t\t\tconsole.error(\"TAS Service: generateToken failed\", error);\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Connects to a TokBox video session\n\t */\n\tpublic connectSession(\n\t\tsessionId: string,\n\t\ttoken: string,\n\t\tpublisherElement: string,\n\t\tsubscriberElement: string\n\t): Promise<void> {\n\t\tthis.callStateSubject.next(CallState.CONNECTING);\n\t\tthis.currentSessionId = sessionId;\n\t\tthis.currentToken = token;\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!OT.checkSystemRequirements()) {\n\t\t\t\tthis.callStateSubject.next(CallState.ERROR);\n\t\t\t\treject(new Error(\"Browser not compatible with TokBox\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.session = OT.initSession(this.config.tokBoxApiKey, sessionId);\n\n\t\t\t// Handle new streams (remote participants joining)\n\t\t\tthis.session.on(\"streamCreated\", (event) => {\n\t\t\t\tconst subscriber = this.session?.subscribe(\n\t\t\t\t\tevent.stream,\n\t\t\t\t\tsubscriberElement,\n\t\t\t\t\t{\n\t\t\t\t\t\tinsertMode: \"append\",\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\tconsole.error(\"Error subscribing to stream:\", error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tif (subscriber) {\n\t\t\t\t\tthis.subscribers.push(subscriber);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle streams ending (remote participants leaving)\n\t\t\tthis.session.on(\"streamDestroyed\", (event) => {\n\t\t\t\tthis.subscribers = this.subscribers.filter(\n\t\t\t\t\t(sub) => sub.stream?.streamId !== event.stream.streamId\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// Handle session disconnection\n\t\t\tthis.session.on(\"sessionDisconnected\", () => {\n\t\t\t\tthis.callStateSubject.next(CallState.DISCONNECTED);\n\t\t\t});\n\n\t\t\t// Connect to session\n\t\t\tthis.session.connect(token, (error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconsole.error(\"Error connecting to session:\", error);\n\t\t\t\t\tthis.callStateSubject.next(CallState.ERROR);\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Initialize publisher (local video)\n\t\t\t\tthis.publisher = OT.initPublisher(\n\t\t\t\t\tpublisherElement,\n\t\t\t\t\t{\n\t\t\t\t\t\tinsertMode: \"append\",\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t},\n\t\t\t\t\t(err) => {\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\tconsole.error(\"Error initializing publisher:\", err);\n\t\t\t\t\t\t\tthis.callStateSubject.next(CallState.ERROR);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Publish to session\n\t\t\t\t\t\tthis.session?.publish(this.publisher, (pubErr) => {\n\t\t\t\t\t\t\tif (pubErr) {\n\t\t\t\t\t\t\t\tconsole.error(\"Error publishing stream:\", pubErr);\n\t\t\t\t\t\t\t\tthis.callStateSubject.next(CallState.ERROR);\n\t\t\t\t\t\t\t\treject(pubErr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.callStateSubject.next(CallState.CONNECTED);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t}\n\n\t// Video Element Movement Methods\n\tpublic movePublisherTo(newContainerId: string): void {\n\t\tif (!this.publisher) return;\n\t\t\n\t\tconst publisherElement = this.publisher.element;\n\t\tconst newContainer = document.getElementById(newContainerId);\n\t\t\n\t\tif (publisherElement && newContainer) {\n\t\t\tnewContainer.appendChild(publisherElement);\n\t\t}\n\t}\n\n\tpublic moveSubscribersTo(newContainerId: string): void {\n\t\tconst newContainer = document.getElementById(newContainerId);\n\t\tif (!newContainer) return;\n\t\t\n\t\tthis.subscribers.forEach((subscriber) => {\n\t\t\tconst subscriberElement = subscriber.element;\n\t\t\tif (subscriberElement) {\n\t\t\t\tnewContainer.appendChild(subscriberElement);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Moves the main video (subscriber if available, otherwise publisher) to a container.\n\t * Used for PiP mode to show only one video.\n\t */\n\tpublic moveMainVideoTo(newContainerId: string): void {\n\t\tconst newContainer = document.getElementById(newContainerId);\n\t\tif (!newContainer) return;\n\n\t\t// Prefer remote video (subscriber) as main\n\t\tif (this.subscribers.length > 0 && this.subscribers[0].element) {\n\t\t\tnewContainer.appendChild(this.subscribers[0].element);\n\t\t\treturn;\n\t\t}\n\n\t\t// Fall back to local video (publisher)\n\t\tif (this.publisher?.element) {\n\t\t\tnewContainer.appendChild(this.publisher.element);\n\t\t}\n\t}\n\n\t/**\n\t * Moves videos back to fullscreen containers\n\t */\n\tpublic moveVideosToFullscreen(): void {\n\t\tthis.moveSubscribersTo('subscriber-container');\n\t\tthis.movePublisherTo('publisher-container');\n\t}\n}\n\n","import { Component, OnInit, OnDestroy, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { CallState, ViewMode } from '../../interfaces/tas.interfaces';\nimport { Subscription } from 'rxjs';\nimport interact from 'interactjs';\n\n@Component({\n\tselector: 'tas-videocall',\n\ttemplateUrl: './tas-videocall.component.html',\n\tstyleUrls: ['./tas-videocall.component.scss']\n})\nexport class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {\n\n\t@Input() sessionId!: string;\n\t@Input() token!: string;\n\t@Input() isReturningFromPip: boolean = false;\n\t\n\t@ViewChild('publisherContainer') publisherContainer!: ElementRef;\n\t@ViewChild('subscriberContainer') subscriberContainer!: ElementRef;\n\n\tpublic isPublisherSmall = true;\n\tpublic callState = CallState.IDLE;\n\tpublic isMuted = false;\n\n\tprivate subscriptions = new Subscription();\n\n\tconstructor(\n\t\tpublic activeModal: NgbActiveModal,\n\t\tprivate tasService: TasService\n\t) { }\n\n\tngOnInit(): void {\n\t\tthis.setupSubscriptions();\n\t\tthis.initializeCall();\n\t}\n\n\tngAfterViewInit(): void {\n\t\tthis.initInteract();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.subscriptions.unsubscribe();\n\t\t\n\t\t// Only disconnect if not in PiP mode (keep session alive for floating window)\n\t\tif (!this.tasService.isPipMode()) {\n\t\t\tthis.tasService.disconnectSession();\n\t\t}\n\t\t\n\t\tinteract('.publisher-view').unset();\n\t}\n\n\t// Public Methods\n\thangUp(): void {\n\t\tthis.tasService.disconnectSession();\n\t}\n\n\ttoggleMute(): void {\n\t\tthis.tasService.toggleMute();\n\t}\n\n\tminimize(): void {\n\t\tthis.tasService.moveMainVideoTo('pip-main-video');\n\t\t// Small delay to ensure video is moved before closing modal\n\t\tsetTimeout(() => this.tasService.enterPipMode(), 50);\n\t}\n\n\ttoggleSwap(): void {\n\t\tthis.isPublisherSmall = !this.isPublisherSmall;\n\t\tthis.resetVideoPositions();\n\t\tsetTimeout(() => this.initInteract());\n\t}\n\n\tonDoubleClick(): void {\n\t\tthis.toggleSwap();\n\t}\n\n\t// Private Methods\n\tprivate setupSubscriptions(): void {\n\t\t// Call state subscription\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.callState$.subscribe(state => {\n\t\t\t\tthis.callState = state;\n\t\t\t\tif (state === CallState.DISCONNECTED) {\n\t\t\t\t\tthis.activeModal.close('hangup');\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\t// View mode subscription\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.viewMode$.subscribe(mode => {\n\t\t\t\tif (mode === ViewMode.PIP) {\n\t\t\t\t\tthis.activeModal.close('pip');\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\t// Mute state subscription\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.isMuted$.subscribe(muted => {\n\t\t\t\tthis.isMuted = muted;\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate initializeCall(): void {\n\t\tif (this.isReturningFromPip) {\n\t\t\t// Returning from PiP - just move videos back\n\t\t\tsetTimeout(() => this.tasService.moveVideosToFullscreen(), 100);\n\t\t} else if (this.sessionId && this.token) {\n\t\t\t// New call - connect to session\n\t\t\tthis.tasService.connectSession(\n\t\t\t\tthis.sessionId,\n\t\t\t\tthis.token,\n\t\t\t\t'publisher-container',\n\t\t\t\t'subscriber-container'\n\t\t\t).catch(err => {\n\t\t\t\tconsole.error('Error connecting to video call:', err);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate resetVideoPositions(): void {\n\t\tconst publisherEl = this.publisherContainer?.nativeElement as HTMLElement;\n\t\tconst subscriberEl = this.subscriberContainer?.nativeElement as HTMLElement;\n\n\t\tif (publisherEl) {\n\t\t\tpublisherEl.removeAttribute('style');\n\t\t\tpublisherEl.removeAttribute('data-x');\n\t\t\tpublisherEl.removeAttribute('data-y');\n\t\t}\n\n\t\tif (subscriberEl) {\n\t\t\tsubscriberEl.removeAttribute('style');\n\t\t\tsubscriberEl.removeAttribute('data-x');\n\t\t\tsubscriberEl.removeAttribute('data-y');\n\t\t}\n\t}\n\n\tprivate initInteract(): void {\n\t\tinteract('.publisher-view').unset();\n\n\t\tinteract('.publisher-view')\n\t\t\t.draggable({\n\t\t\t\tinertia: true,\n\t\t\t\tmodifiers: [\n\t\t\t\t\tinteract.modifiers.restrictRect({\n\t\t\t\t\t\trestriction: 'parent',\n\t\t\t\t\t\tendOnly: true\n\t\t\t\t\t})\n\t\t\t\t],\n\t\t\t\tautoScroll: true,\n\t\t\t\tlisteners: {\n\t\t\t\t\tmove: (event) => {\n\t\t\t\t\t\tconst target = event.target;\n\t\t\t\t\t\tconst x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n\t\t\t\t\t\tconst y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n\t\t\t\t\t\ttarget.style.transform = `translate(${x}px, ${y}px)`;\n\t\t\t\t\t\ttarget.setAttribute('data-x', String(x));\n\t\t\t\t\t\ttarget.setAttribute('data-y', String(y));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.resizable({\n\t\t\t\tedges: { left: false, right: true, bottom: true, top: false },\n\t\t\t\tlisteners: {\n\t\t\t\t\tmove: (event) => {\n\t\t\t\t\t\tconst target = event.target;\n\t\t\t\t\t\tlet x = parseFloat(target.getAttribute('data-x')) || 0;\n\t\t\t\t\t\tlet y = parseFloat(target.getAttribute('data-y')) || 0;\n\n\t\t\t\t\t\ttarget.style.width = `${event.rect.width}px`;\n\t\t\t\t\t\ttarget.style.height = `${event.rect.height}px`;\n\n\t\t\t\t\t\tx += event.deltaRect.left;\n\t\t\t\t\t\ty += event.deltaRect.top;\n\n\t\t\t\t\t\ttarget.style.transform = `translate(${x}px, ${y}px)`;\n\t\t\t\t\t\ttarget.setAttribute('data-x', String(x));\n\t\t\t\t\t\ttarget.setAttribute('data-y', String(y));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodifiers: [\n\t\t\t\t\tinteract.modifiers.restrictEdges({ outer: 'parent' }),\n\t\t\t\t\tinteract.modifiers.restrictSize({ min: { width: 150, height: 100 } }),\n\t\t\t\t\tinteract.modifiers.aspectRatio({ ratio: 'preserve' })\n\t\t\t\t],\n\t\t\t\tinertia: true\n\t\t\t});\n\t}\n}\n\n","<div class=\"tas-videocall-container\">\n\t<div id=\"subscriber-container\" \n\t\t[class.subscriber-view]=\"isPublisherSmall\" \n\t\t[class.publisher-view]=\"!isPublisherSmall\"\n\t\t#subscriberContainer\n\t\t(dblclick)=\"onDoubleClick()\">\n\t</div>\n\n\t<div id=\"publisher-container\" \n\t\t[class.publisher-view]=\"isPublisherSmall\" \n\t\t[class.subscriber-view]=\"!isPublisherSmall\"\n\t\t#publisherContainer \n\t\t(dblclick)=\"onDoubleClick()\">\n\t</div>\n\t\n\t<div class=\"controls-container\">\n\t\t<button class=\"btn swap-btn\" (click)=\"toggleSwap()\" title=\"Swap view\">\n\t\t\t<i class=\"fa fa-refresh\"></i>\n\t\t</button>\n\t\t<button class=\"btn pip-btn\" (click)=\"minimize()\" title=\"Minimize (Picture in Picture)\">\n\t\t\t<i class=\"fa fa-compress\"></i>\n\t\t</button>\n\t\t<button class=\"btn mute-btn\" [class.muted]=\"isMuted\" (click)=\"toggleMute()\" [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\">\n\t\t\t<i class=\"fa\" [class.fa-microphone]=\"!isMuted\" [class.fa-microphone-slash]=\"isMuted\"></i>\n\t\t</button>\n\t\t<button class=\"btn hangup-btn\" (click)=\"hangUp()\" title=\"Hang up\">\n\t\t\t<i class=\"fa fa-phone\" style=\"transform: rotate(135deg);\"></i>\n\t\t</button>\n\t</div>\n</div>\n\n","import { Component, OnInit, OnDestroy, Input } from '@angular/core';\nimport { NgbActiveModal, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { TasService } from '../../services/tas.service';\nimport { Subscription } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport {\n\tCreateRoomRequest,\n\tCreateRoomUser,\n\tTasCurrentUser,\n\tTasRoomType,\n\tTasSessionType,\n\tTasUserRole,\n\tViewMode\n} from '../../interfaces/tas.interfaces';\nimport { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';\n\nexport enum WaitingRoomState {\n\tIDLE = 'IDLE',\n\tCREATING_ROOM = 'CREATING_ROOM',\n\tGETTING_TOKEN = 'GETTING_TOKEN',\n\tREADY = 'READY',\n\tERROR = 'ERROR'\n}\n\n@Component({\n\tselector: 'tas-waiting-room',\n\ttemplateUrl: './tas-waiting-room.component.html',\n\tstyleUrls: ['./tas-waiting-room.component.scss']\n})\nexport class TasWaitingRoomComponent implements OnInit, OnDestroy {\n\t// Room configuration inputs\n\t@Input() appointmentId: number = 1;\n\t@Input() product: string = 'uell';\n\t@Input() tenantId: string = '';\n\t@Input() currentUser!: TasCurrentUser;\n\t@Input() ownerUserIds!: number[];\n\t@Input() regularUserIds: number[] = [];\n\t@Input() moderatorUserIds: number[] = [];\n\n\t// Component state\n\tpublic state: WaitingRoomState = WaitingRoomState.IDLE;\n\tpublic WaitingRoomState = WaitingRoomState; // Expose enum to template\n\tpublic errorMessage: string = '';\n\n\t// Session data\n\tprivate sessionId: string = '';\n\tprivate token: string = '';\n\tprivate users: CreateRoomUser[] = [];\n\tprivate subscriptions = new Subscription();\n\tprivate videoCallModalRef: NgbModalRef | null = null;\n\n\tconstructor(\n\t\tpublic activeModal: NgbActiveModal,\n\t\tprivate tasService: TasService,\n\t\tprivate modalService: NgbModal\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.buildUsersArray();\n\t\tthis.setupViewModeSubscription();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.subscriptions.unsubscribe();\n\t}\n\n\t/**\n\t * Creates the room and fetches the token\n\t */\n\tcreateRoom(): void {\n\t\tif (!this.tenantId || !this.currentUser?.name) {\n\t\t\tthis.state = WaitingRoomState.ERROR;\n\t\t\tthis.errorMessage = 'Missing configuration data (tenant or user)';\n\t\t\treturn;\n\t\t}\n\n\t\tthis.state = WaitingRoomState.CREATING_ROOM;\n\t\tthis.errorMessage = '';\n\n\t\tconst body: CreateRoomRequest = {\n\t\t\troomType: TasRoomType.TAS,\n\t\t\ttype: TasSessionType.SPONTANEOUS,\n\t\t\ttenant: this.tenantId,\n\t\t\tappointmentId: this.appointmentId,\n\t\t\tusers: this.users,\n\t\t\tproduct: this.product\n\t\t};\n\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.createRoom(body).pipe(\n\t\t\t\tswitchMap(response => {\n\t\t\t\t\tthis.sessionId = response.content.sessionId;\n\t\t\t\t\tthis.state = WaitingRoomState.GETTING_TOKEN;\n\n\t\t\t\t\treturn this.tasService.generateToken({\n\t\t\t\t\t\tsessionId: this.sessionId,\n\t\t\t\t\t\tname: this.currentUser.name,\n\t\t\t\t\t\tlastname: this.currentUser.lastname,\n\t\t\t\t\t\troleVC: this.currentUser.role\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t).subscribe({\n\t\t\t\tnext: (tokenResponse) => {\n\t\t\t\t\tthis.token = tokenResponse.content.token;\n\t\t\t\t\tthis.state = WaitingRoomState.READY;\n\t\t\t\t},\n\t\t\t\terror: (err) => {\n\t\t\t\t\tconsole.error('Error creating room or getting token:', err);\n\t\t\t\t\tthis.state = WaitingRoomState.ERROR;\n\t\t\t\t\tthis.errorMessage = 'Error creating room. Please try again.';\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Joins the video call session\n\t */\n\tjoinSession(): void {\n\t\tif (!this.sessionId || !this.token) {\n\t\t\tthis.errorMessage = 'Cannot join session. Incomplete data.';\n\t\t\treturn;\n\t\t}\n\n\t\t// Close waiting room and open video call\n\t\tthis.activeModal.close('joining');\n\t\tthis.openVideoCallModal();\n\t}\n\n\t/**\n\t * Closes the waiting room\n\t */\n\tcancel(): void {\n\t\tthis.activeModal.dismiss('cancel');\n\t}\n\n\t/**\n\t * Retry after an error\n\t */\n\tretry(): void {\n\t\tthis.state = WaitingRoomState.IDLE;\n\t\tthis.errorMessage = '';\n\t\tthis.sessionId = '';\n\t\tthis.token = '';\n\t}\n\n\t// Private Methods\n\tprivate buildUsersArray(): void {\n\t\tthis.users = [];\n\n\t\t// Add owners from input\n\t\tthis.ownerUserIds.forEach(id => {\n\t\t\tthis.users.push({ userExternalId: id, rol: TasUserRole.OWNER });\n\t\t});\n\n\t\t// Add regular users from input\n\t\tthis.regularUserIds.forEach(id => {\n\t\t\tthis.users.push({ userExternalId: id, rol: TasUserRole.USER });\n\t\t});\n\n\t\t// Add moderators from input\n\t\tthis.moderatorUserIds.forEach(id => {\n\t\t\tthis.users.push({ userExternalId: id, rol: TasUserRole.MODERATOR });\n\t\t});\n\t}\n\n\tprivate setupViewModeSubscription(): void {\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.viewMode$.subscribe(mode => {\n\t\t\t\t// Re-open video call modal when returning from PiP mode\n\t\t\t\tif (mode === ViewMode.FULLSCREEN && \n\t\t\t\t\tthis.tasService.isCallActive() && \n\t\t\t\t\t!this.videoCallModalRef) {\n\t\t\t\t\tconst sessionId = this.tasService.sessionId;\n\t\t\t\t\tconst token = this.tasService.token;\n\t\t\t\t\tif (sessionId && token) {\n\t\t\t\t\t\tthis.openVideoCallModal(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate openVideoCallModal(isReturningFromPip: boolean = false): void {\n\t\tthis.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n\t\t\tsize: 'xl',\n\t\t\twindowClass: 'tas-video-modal',\n\t\t\tbackdrop: 'static',\n\t\t\tkeyboard: false\n\t\t});\n\n\t\tconst sessionIdToUse = this.sessionId || this.tasService.sessionId;\n\t\tconst tokenToUse = this.token || this.tasService.token;\n\n\t\tthis.videoCallModalRef.componentInstance.sessionId = sessionIdToUse;\n\t\tthis.videoCallModalRef.componentInstance.token = tokenToUse;\n\t\tthis.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;\n\n\t\tthis.videoCallModalRef.result.then(\n\t\t\t() => { this.videoCallModalRef = null; },\n\t\t\t() => { this.videoCallModalRef = null; }\n\t\t);\n\t}\n}\n\n","<div class=\"tas-waiting-room\">\n\t<!-- Header -->\n\t<div class=\"waiting-room-header\">\n\t\t<div class=\"header-icon\">\n\t\t\t<i class=\"fa fa-video-camera\"></i>\n\t\t</div>\n\t\t<h2 class=\"header-title\">Waiting Room</h2>\n\t\t<p class=\"header-subtitle\">Prepare for your video call</p>\n\t\t<button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t</button>\n\t</div>\n\n\t<!-- Content -->\n\t<div class=\"waiting-room-content\">\n\t\t<!-- IDLE State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.IDLE\">\n\t\t\t<div class=\"state-icon idle\">\n\t\t\t\t<i class=\"fa fa-plus-circle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tCreate a new video call room\n\t\t\t</p>\n\t\t\t<p class=\"state-submessage\">\n\t\t\t\tPress the button to begin\n\t\t\t</p>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn create-btn\"\n\t\t\t\t(click)=\"createRoom()\">\n\t\t\t\t<i class=\"fa fa-plus\"></i>\n\t\t\t\tCreate Room\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- CREATING_ROOM State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CREATING_ROOM\">\n\t\t\t<div class=\"state-icon loading\">\n\t\t\t\t<div class=\"spinner\"></div>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tCreating video call room...\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step active\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Creating</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- GETTING_TOKEN State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n\t\t\t<div class=\"state-icon loading\">\n\t\t\t\t<div class=\"spinner\"></div>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tPreparing room access...\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Created</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step active\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- READY State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n\t\t\t<div class=\"state-icon ready\">\n\t\t\t\t<i class=\"fa fa-check-circle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message success\">\n\t\t\t\tRoom is ready!\n\t\t\t</p>\n\t\t\t<p class=\"state-submessage\">\n\t\t\t\tYou can join the video call when ready\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Created</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn join-btn\"\n\t\t\t\t(click)=\"joinSession()\">\n\t\t\t\t<i class=\"fa fa-sign-in\"></i>\n\t\t\t\tJoin Session\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- ERROR State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.ERROR\">\n\t\t\t<div class=\"state-icon error\">\n\t\t\t\t<i class=\"fa fa-exclamation-triangle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message error\">\n\t\t\t\tAn error occurred\n\t\t\t</p>\n\t\t\t<p class=\"error-details\" *ngIf=\"errorMessage\">\n\t\t\t\t{{ errorMessage }}\n\t\t\t</p>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn retry-btn\"\n\t\t\t\t(click)=\"retry()\">\n\t\t\t\t<i class=\"fa fa-refresh\"></i>\n\t\t\t\tRetry\n\t\t\t</button>\n\t\t</div>\n\t</div>\n\n\t<!-- Footer -->\n\t<div class=\"waiting-room-footer\">\n\t\t<button \n\t\t\ttype=\"button\" \n\t\t\tclass=\"btn cancel-btn\"\n\t\t\t(click)=\"cancel()\">\n\t\t\tCancel\n\t\t</button>\n\t</div>\n</div>\n\n","import { Component, OnInit, OnDestroy, Input } from \"@angular/core\";\nimport { NgbModal, NgbModalRef } from \"@ng-bootstrap/ng-bootstrap\";\nimport { Subscription } from \"rxjs\";\nimport { TasCurrentUser, ViewMode } from \"../../interfaces/tas.interfaces\";\nimport { TasWaitingRoomComponent } from \"../tas-waiting-room/tas-waiting-room.component\";\nimport { TasVideocallComponent } from \"../tas-videocall/tas-videocall.component\";\nimport { TasService } from \"../../services/tas.service\";\n\n@Component({\n\tselector: \"tas-btn\",\n\ttemplateUrl: \"./tas-btn.component.html\",\n\tstyleUrls: [\"./tas-btn.component.scss\"],\n})\nexport class TasButtonComponent implements OnInit, OnDestroy {\n\t@Input() appointmentId: number = 1;\n\t@Input() product: string = \"uell\";\n\t@Input() tenantId: string = \"\";\n\t@Input() currentUser!: TasCurrentUser;\n\t@Input() ownerUserIds!: number[];\n\t@Input() regularUserIds: number[] = [];\n\t@Input() moderatorUserIds: number[] = [];\n\t\n\tpublic isLoading = false;\n\t\n\tprivate subscriptions = new Subscription();\n\tprivate currentModalRef: NgbModalRef | null = null;\n\tprivate videoCallModalRef: NgbModalRef | null = null;\n\n\tconstructor(\n\t\tprivate modalService: NgbModal,\n\t\tprivate tasService: TasService\n\t) {}\n\n\tngOnInit(): void {\n\t\tif (!this.ownerUserIds || this.ownerUserIds.length !== 1) {\n\t\t\tthrow new Error('tas-btn: ownerUserIds input is required and must contain exactly one user');\n\t\t}\n\t\t\n\t\t// Subscribe to viewMode to handle PiP return\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.viewMode$.subscribe(mode => {\n\t\t\t\t// Reopen video call modal when returning from PiP\n\t\t\t\tif (mode === ViewMode.FULLSCREEN && \n\t\t\t\t\tthis.tasService.isCallActive() && \n\t\t\t\t\t!this.videoCallModalRef) {\n\t\t\t\t\tconst sessionId = this.tasService.sessionId;\n\t\t\t\t\tconst token = this.tasService.token;\n\t\t\t\t\tif (sessionId && token) {\n\t\t\t\t\t\tthis.openVideoCallModal(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// When entering PiP, clear the videoCallModalRef since modal will close\n\t\t\t\tif (mode === ViewMode.PIP) {\n\t\t\t\t\tthis.videoCallModalRef = null;\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.subscriptions.unsubscribe();\n\t}\n\n\tonClick(): void {\n\t\tif (!this.tenantId || !this.currentUser?.name) {\n\t\t\tconsole.error(\"Tenant ID or current user not available\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.openWaitingRoomModal();\n\t}\n\n\tprivate openWaitingRoomModal(): void {\n\t\tthis.currentModalRef = this.modalService.open(TasWaitingRoomComponent, {\n\t\t\tsize: \"lg\",\n\t\t\twindowClass: \"tas-waiting-room-modal\",\n\t\t\tbackdrop: \"static\",\n\t\t\tkeyboard: false,\n\t\t\tcentered: true\n\t\t});\n\n\t\t// Pass all necessary inputs to the waiting room component\n\t\tthis.currentModalRef.componentInstance.appointmentId = this.appointmentId;\n\t\tthis.currentModalRef.componentInstance.product = this.product;\n\t\tthis.currentModalRef.componentInstance.tenantId = this.tenantId;\n\t\tthis.currentModalRef.componentInstance.currentUser = this.currentUser;\n\t\tthis.currentModalRef.componentInstance.ownerUserIds = this.ownerUserIds;\n\t\tthis.currentModalRef.componentInstance.regularUserIds = this.regularUserIds;\n\t\tthis.currentModalRef.componentInstance.moderatorUserIds = this.moderatorUserIds;\n\n\t\tthis.currentModalRef.result.then(\n\t\t\t() => { this.currentModalRef = null; },\n\t\t\t() => { this.currentModalRef = null; }\n\t\t);\n\t}\n\n\tprivate openVideoCallModal(isReturningFromPip: boolean = false): void {\n\t\tthis.videoCallModalRef = this.modalService.open(TasVideocallComponent, {\n\t\t\tsize: 'xl',\n\t\t\twindowClass: 'tas-video-modal',\n\t\t\tbackdrop: 'static',\n\t\t\tkeyboard: false\n\t\t});\n\n\t\tthis.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;\n\t\tthis.videoCallModalRef.componentInstance.token = this.tasService.token;\n\t\tthis.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;\n\n\t\tthis.videoCallModalRef.result.then(\n\t\t\t() => { this.videoCallModalRef = null; },\n\t\t\t() => { this.videoCallModalRef = null; }\n\t\t);\n\t}\n}\n\n","<button\n\ttype=\"button\"\n\tclass=\"btn btn-primary tas-btn\"\n\t(click)=\"onClick()\"\n\t[disabled]=\"isLoading\"\n>\n\t<i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n\t<span *ngIf=\"!isLoading\"> Iniciar TAS</span>\n\t<span *ngIf=\"isLoading\"> Processing...</span>\n</button>\n\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { TasService } from '../../services/tas.service';\nimport { CallState, ViewMode } from '../../interfaces/tas.interfaces';\nimport { Subscription } from 'rxjs';\nimport interact from 'interactjs';\n\n@Component({\n\tselector: 'tas-floating-call',\n\ttemplateUrl: './tas-floating-call.component.html',\n\tstyleUrls: ['./tas-floating-call.component.scss']\n})\nexport class TasFloatingCallComponent implements OnInit, OnDestroy {\n\n\tpublic isVisible = false;\n\tpublic isMuted = false;\n\n\tprivate subscriptions = new Subscription();\n\n\tconstructor(private tasService: TasService) { }\n\n\tngOnInit(): void {\n\t\tthis.setupSubscriptions();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.subscriptions.unsubscribe();\n\t\tinteract('.tas-floating-container').unset();\n\t}\n\n\t// Public Methods\n\tonExpand(): void {\n\t\tthis.tasService.exitPipMode();\n\t}\n\n\tonHangUp(): void {\n\t\tthis.tasService.disconnectSession();\n\t}\n\n\ttoggleMute(): void {\n\t\tthis.tasService.toggleMute();\n\t}\n\n\t// Private Methods\n\tprivate setupSubscriptions(): void {\n\t\t// Call state subscription\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.callState$.subscribe(state => {\n\t\t\t\tif (state === CallState.DISCONNECTED) {\n\t\t\t\t\tthis.isVisible = false;\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\t// View mode subscription\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.viewMode$.subscribe(mode => {\n\t\t\t\tthis.isVisible = mode === ViewMode.PIP && this.tasService.isCallActive();\n\t\t\t\tif (this.isVisible) {\n\t\t\t\t\tsetTimeout(() => this.initInteract(), 100);\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\t// Mute state subscription\n\t\tthis.subscriptions.add(\n\t\t\tthis.tasService.isMuted$.subscribe(muted => {\n\t\t\t\tthis.isMuted = muted;\n\t\t\t})\n\t\t);\n\t}\n\n\t// Margin from screen edges (in pixels)\n\tprivate readonly PIP_MARGIN = 20;\n\n\tprivate initInteract(): void {\n\t\tinteract('.tas-floating-container').unset();\n\n\t\t// Create restriction area with margin\n\t\tconst margin = this.PIP_MARGIN;\n\t\tconst restrictToBodyWithMargin = {\n\t\t\trestriction: () => {\n\t\t\t\treturn {\n\t\t\t\t\tleft: margin,\n\t\t\t\t\ttop: margin,\n\t\t\t\t\tright: window.innerWidth - margin,\n\t\t\t\t\tbottom: window.innerHeight - margin\n\t\t\t\t};\n\t\t\t},\n\t\t\telementRect: { left: 0, right: 1, top: 0, bottom: 1 }\n\t\t};\n\n\t\tinteract('.tas-floating-container')\n\t\t\t.draggable({\n\t\t\t\tinertia: true,\n\t\t\t\tmodifiers: [\n\t\t\t\t\tinteract.modifiers.restrict(restrictToBodyWithMargin)\n\t\t\t\t],\n\t\t\t\tautoScroll: false,\n\t\t\t\tlisteners: {\n\t\t\t\t\tmove: (event) => {\n\t\t\t\t\t\tconst target = event.target;\n\t\t\t\t\t\tconst x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n\t\t\t\t\t\tconst y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n\t\t\t\t\t\ttarget.style.transform = `translate(${x}px, ${y}px)`;\n\t\t\t\t\t\ttarget.setAttribute('data-x', String(x));\n\t\t\t\t\t\ttarget.setAttribute('data-y', String(y));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.resizable({\n\t\t\t\tedges: { left: false, right: true, bottom: true, top: false },\n\t\t\t\tlisteners: {\n\t\t\t\t\tmove: (event) => {\n\t\t\t\t\t\tconst target = event.target;\n\t\t\t\t\t\tlet x = parseFloat(target.getAttribute('data-x')) || 0;\n\t\t\t\t\t\tlet y = parseFloat(target.getAttribute('data-y')) || 0;\n\n\t\t\t\t\t\t// Update element size\n\t\t\t\t\t\ttarget.style.width = `${event.rect.width}px`;\n\t\t\t\t\t\ttarget.style.height = `${event.rect.height}px`;\n\n\t\t\t\t\t\t// Translate when resizing from top or left edges\n\t\t\t\t\t\tx += event.deltaRect.left;\n\t\t\t\t\t\ty += event.deltaRect.top;\n\n\t\t\t\t\t\ttarget.style.transform = `translate(${x}px, ${y}px)`;\n\t\t\t\t\t\ttarget.setAttribute('data-x', String(x));\n\t\t\t\t\t\ttarget.setAttribute('data-y', String(y));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodifiers: [\n\t\t\t\t\tinteract.modifiers.restrictEdges({\n\t\t\t\t\t\touter: {\n\t\t\t\t\t\t\tleft: margin,\n\t\t\t\t\t\t\ttop: margin,\n\t\t\t\t\t\t\tright: window.innerWidth - margin,\n\t\t\t\t\t\t\tbottom: window.innerHeight - margin\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tinteract.modifiers.restrictSize({\n\t\t\t\t\t\tmin: { width: 200, height: 130 },\n\t\t\t\t\t\tmax: { width: 500, height: 350 }\n\t\t\t\t\t}),\n\t\t\t\t\tinteract.modifiers.aspectRatio({ ratio: 'preserve' })\n\t\t\t\t],\n\t\t\t\tinertia: true\n\t\t\t});\n\t}\n}\n\n","<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n\t<!-- Video content area - shows main video only -->\n\t<div class=\"floating-content\">\n\t\t<!-- Main video container (subscriber if available, otherwise publisher) -->\n\t\t<div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n\t\t<!-- Bottom controls -->\n\t\t<div class=\"floating-controls\">\n\t\t\t<button class=\"action-btn expand-btn\" (click)=\"onExpand()\" title=\"Expand to fullscreen\">\n\t\t\t\t<i class=\"fa fa-expand\"></i>\n\t\t\t</button>\n\t\t\t<button class=\"action-btn mute-btn\" [class.muted]=\"isMuted\" (click)=\"toggleMute()\" [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\">\n\t\t\t\t<i class=\"fa\" [class.fa-microphone]=\"!isMuted\" [class.fa-microphone-slash]=\"isMuted\"></i>\n\t\t\t</button>\n\t\t\t<button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n\t\t\t\t<i class=\"fa fa-phone\" style=\"transform: rotate(135deg);\"></i>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</div>\n\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TasButtonComponent } from './components/tas-btn/tas-btn.component';\nimport { TasVideocallComponent } from './components/tas-videocall/tas-videocall.component';\nimport { TasFloatingCallComponent } from './components/tas-floating-call/tas-floating-call.component';\nimport { TasWaitingRoomComponent } from './components/tas-waiting-room/tas-waiting-room.component';\nimport { TasService } from './services/tas.service';\nimport { TAS_CONFIG, TAS_HTTP_CLIENT, TasConfig, TasHttpClient } from './config/tas.config';\n\n@NgModule({\n declarations: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n TasWaitingRoomComponent\n ],\n imports: [\n CommonModule,\n ],\n exports: [\n TasButtonComponent,\n TasVideocallComponent,\n TasFloatingCallComponent,\n TasWaitingRoomComponent\n ]\n})\nexport class TasUellSdkModule {\n /**\n * Use forRoot() to configure the TAS SDK module with required dependencies.\n * This should only be called once in your root AppModule.\n * \n * @example\n * ```typescript\n * import { TasUellSdkModule, TasHttpClient } from 'tas-uell-sdk';\n * \n * // Create an adapter that implements TasHttpClient\n * @Injectable({ providedIn: 'root' })\n * export class MyHttpAdapter implements TasHttpClient {\n * constructor(private http: HttpClient) {}\n * post<T>(url: string, options: { body: any; headers?: Record<string, string> }): Observable<T> {\n * return this.http.post<T>(url, options.body, { headers: options.headers });\n * }\n * }\n * \n * // In your AppModule\n * @NgModule({\n * imports: [\n * TasUellSdkModule.forRoot({\n * config: { tokBoxApiKey: 'YOUR_TOKBOX_API_KEY' },\n * httpClient: MyHttpAdapter\n * })\n * ]\n * })\n * export class AppModule { }\n * ```\n */\n static forRoot(options: {\n config: TasConfig;\n httpClient: new (...args: any[]) => TasHttpClient;\n }): ModuleWithProviders<TasUellSdkModule> {\n return {\n ngModule: TasUellSdkModule,\n providers: [\n { provide: TAS_CONFIG, useValue: options.config },\n { provide: TAS_HTTP_CLIENT, useClass: options.httpClient },\n TasService\n ]\n };\n }\n}\n\n","/*\n * Public API Surface of tas-uell-sdk\n */\n\n// Configuration and tokens\nexport * from './lib/config/tas.config';\n\n// Interfaces\nexport * from './lib/interfaces/tas.interfaces';\n\n// Service\nexport * from './lib/services/tas.service';\n\n// Components\nexport * from './lib/components/tas-btn/tas-btn.component';\nexport * from './lib/components/tas-waiting-room/tas-waiting-room.component';\nexport * from './lib/components/tas-videocall/tas-videocall.component';\nexport * from './lib/components/tas-floating-call/tas-floating-call.component';\n\n// Module\nexport * from './lib/tas-uell-sdk.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.TasService","i1.TasService"],"mappings":";;;;;;;;;;AAoBA;;AAEG;MACU,UAAU,GAAG,IAAI,cAAc,CAAY,YAAY,EAAE;AAEtE;;AAEG;MACU,eAAe,GAAG,IAAI,cAAc,CAAgB,iBAAiB;;ICAtE,YAIX;AAJD,CAAA,UAAY,WAAW,EAAA;AACtB,IAAA,WAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,WAAA,CAAA,IAAA,CAAA,GAAA,IAAS,CAAA;AACT,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACpB,CAAC,EAJW,WAAW,KAAX,WAAW,GAItB,EAAA,CAAA,CAAA,CAAA;IAEW,eAGX;AAHD,CAAA,UAAY,cAAc,EAAA;AACzB,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACxB,CAAC,EAHW,cAAc,KAAd,cAAc,GAGzB,EAAA,CAAA,CAAA,CAAA;IAEW,YAIX;AAJD,CAAA,UAAY,WAAW,EAAA;AACtB,IAAA,WAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,WAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,WAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACxB,CAAC,EAJW,WAAW,KAAX,WAAW,GAItB,EAAA,CAAA,CAAA,CAAA;AAqBD;IACY,UAMX;AAND,CAAA,UAAY,SAAS,EAAA;AACpB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,SAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,SAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,SAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AAChB,CAAC,EANW,SAAS,KAAT,SAAS,GAMpB,EAAA,CAAA,CAAA,CAAA;IAEW,SAGX;AAHD,CAAA,UAAY,QAAQ,EAAA;AACnB,IAAA,QAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,QAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACZ,CAAC,EAHW,QAAQ,KAAR,QAAQ,GAGnB,EAAA,CAAA,CAAA;;MCxDY,UAAU,CAAA;IAkBtB,WACkC,CAAA,UAAyB,EAC9B,MAAiB,EAAA;QADZ,IAAU,CAAA,UAAA,GAAV,UAAU,CAAe;QAC9B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;QAnBtC,IAAO,CAAA,OAAA,GAAsB,IAAI,CAAC;QAClC,IAAS,CAAA,SAAA,GAAwB,IAAI,CAAC;QACtC,IAAW,CAAA,WAAA,GAAoB,EAAE,CAAC;QAElC,IAAgB,CAAA,gBAAA,GAAG,IAAI,eAAe,CAAY,SAAS,CAAC,IAAI,CAAC,CAAC;AACnE,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;QAEjD,IAAe,CAAA,eAAA,GAAG,IAAI,eAAe,CAAW,QAAQ,CAAC,UAAU,CAAC,CAAC;AACtE,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;AAE/C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;AACtD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;;QAG7C,IAAgB,CAAA,gBAAA,GAAkB,IAAI,CAAC;QACvC,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;KAKvC;;AAGJ,IAAA,IAAW,cAAc,GAAA;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC;KACpB;AAED,IAAA,IAAW,gBAAgB,GAAA;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;KACtB;AAED,IAAA,IAAW,kBAAkB,GAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC;KACxB;AAED,IAAA,IAAW,SAAS,GAAA;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC;KAC7B;AAED,IAAA,IAAW,KAAK,GAAA;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;KACzB;AAED,IAAA,IAAW,OAAO,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;KACtC;;AAGM,IAAA,WAAW,CAAC,IAAc,EAAA;AAChC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAChC;IAEM,YAAY,GAAA;QAClB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KACxC;IAEM,WAAW,GAAA;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAC/C;IAEM,SAAS,GAAA;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC,GAAG,CAAC;KACxD;;IAGM,UAAU,GAAA;QAChB,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;AACrD,YAAA,MAAM,iBAAiB,GAAG,CAAC,YAAY,CAAC;;AAGxC,YAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;;YAG/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,IAAI,CAAC;AACrD,YAAA,IAAI,UAAU,EAAE;AACf,gBAAA,UAAU,CAAC,OAAO,GAAG,iBAAiB,CAAC;AACvC,aAAA;AAED,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvC,SAAA;KACD;AAEM,IAAA,OAAO,CAAC,KAAc,EAAA;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC;AACpC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,SAAA;KACD;;IAGM,iBAAiB,GAAA;QACvB,IAAI,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,SAAA;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;KACnD;IAEM,YAAY,GAAA;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC,SAAS,CAAC;KAChE;;AAGM,IAAA,UAAU,CAAC,OAA0B,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAqB,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAC9F,GAAG,CAAC,CAAC,QAAQ,KAAK,QAA8B,CAAC,EACjD,UAAU,CAAC,CAAC,KAAK,KAAI;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;AACvD,YAAA,MAAM,KAAK,CAAC;SACZ,CAAC,CACF,CAAC;KACF;AAEM,IAAA,aAAa,CAAC,OAA6B,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAwB,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CACvG,GAAG,CAAC,CAAC,QAAa,KAAK,QAAiC,CAAC,EACzD,UAAU,CAAC,CAAC,KAAK,KAAI;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;AAC1D,YAAA,MAAM,KAAK,CAAC;SACZ,CAAC,CACF,CAAC;KACF;AAED;;AAEG;AACI,IAAA,cAAc,CACpB,SAAiB,EACjB,KAAa,EACb,gBAAwB,EACxB,iBAAyB,EAAA;QAEzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACtC,YAAA,IAAI,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE;gBAClC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5C,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBACxD,OAAO;AACP,aAAA;AAED,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;;YAGnE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,KAAI;AAC1C,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CACzC,KAAK,CAAC,MAAM,EACZ,iBAAiB,EACjB;AACC,oBAAA,UAAU,EAAE,QAAQ;AACpB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE,MAAM;iBACd,EACD,CAAC,KAAK,KAAI;AACT,oBAAA,IAAI,KAAK,EAAE;AACV,wBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACrD,qBAAA;AACF,iBAAC,CACD,CAAC;AACF,gBAAA,IAAI,UAAU,EAAE;AACf,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAClC,iBAAA;AACF,aAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,KAAI;gBAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACzC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CACvD,CAAC;AACH,aAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,qBAAqB,EAAE,MAAK;gBAC3C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACpD,aAAC,CAAC,CAAC;;YAGH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,KAAI;AACrC,gBAAA,IAAI,KAAK,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;oBACrD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC5C,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;AACP,iBAAA;;gBAGD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,aAAa,CAChC,gBAAgB,EAChB;AACC,oBAAA,UAAU,EAAE,QAAQ;AACpB,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,MAAM,EAAE,MAAM;iBACd,EACD,CAAC,GAAG,KAAI;AACP,oBAAA,IAAI,GAAG,EAAE;AACR,wBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;wBACpD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC5C,MAAM,CAAC,GAAG,CAAC,CAAC;wBACZ,OAAO;AACP,qBAAA;;AAGD,oBAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAI;AAChD,wBAAA,IAAI,MAAM,EAAE;AACX,4BAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;4BAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;4BAC5C,MAAM,CAAC,MAAM,CAAC,CAAC;AACf,yBAAA;AAAM,6BAAA;4BACN,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAChD,4BAAA,OAAO,EAAE,CAAC;AACV,yBAAA;AACF,qBAAC,CAAC,CAAC;AACJ,iBAAC,CACD,CAAC;AACH,aAAC,CAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACH;;AAGM,IAAA,eAAe,CAAC,cAAsB,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;AAE5B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAE7D,IAAI,gBAAgB,IAAI,YAAY,EAAE;AACrC,YAAA,YAAY,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAC3C,SAAA;KACD;AAEM,IAAA,iBAAiB,CAAC,cAAsB,EAAA;QAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;AACvC,YAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC;AAC7C,YAAA,IAAI,iBAAiB,EAAE;AACtB,gBAAA,YAAY,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAC5C,aAAA;AACF,SAAC,CAAC,CAAC;KACH;AAED;;;AAGG;AACI,IAAA,eAAe,CAAC,cAAsB,EAAA;QAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY;YAAE,OAAO;;AAG1B,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AAC/D,YAAA,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO;AACP,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;YAC5B,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjD,SAAA;KACD;AAED;;AAEG;IACI,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;KAC5C;;uGAtRW,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAmBb,eAAe,EAAA,EAAA,EAAA,KAAA,EACf,UAAU,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AApBP,UAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFV,MAAM,EAAA,CAAA,CAAA;2FAEN,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACX,oBAAA,UAAU,EAAE,MAAM;AAClB,iBAAA,CAAA;;0BAoBE,MAAM;2BAAC,eAAe,CAAA;;0BACtB,MAAM;2BAAC,UAAU,CAAA;;;MC5BP,qBAAqB,CAAA;IAejC,WACQ,CAAA,WAA2B,EAC1B,UAAsB,EAAA;QADvB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAgB;QAC1B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAbtB,IAAkB,CAAA,kBAAA,GAAY,KAAK,CAAC;QAKtC,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;QAC3B,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;AAEf,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;KAKtC;IAEL,QAAQ,GAAA;QACP,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;KACtB;IAED,eAAe,GAAA;QACd,IAAI,CAAC,YAAY,EAAE,CAAC;KACpB;IAED,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;;AAGjC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACpC,SAAA;AAED,QAAA,QAAQ,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;KACpC;;IAGD,MAAM,GAAA;AACL,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;KACpC;IAED,UAAU,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;KAC7B;IAED,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;;AAElD,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;KACrD;IAED,UAAU,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC/C,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACtC;IAED,aAAa,GAAA;QACZ,IAAI,CAAC,UAAU,EAAE,CAAC;KAClB;;IAGO,kBAAkB,GAAA;;AAEzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,IAAG;AAC5C,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,YAAA,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,EAAE;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjC,aAAA;SACD,CAAC,CACF,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAG;AAC1C,YAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE;AAC1B,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC9B,aAAA;SACD,CAAC,CACF,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAG;AAC1C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACrB,CAAC,CACF,CAAC;KACF;IAEO,cAAc,GAAA;QACrB,IAAI,IAAI,CAAC,kBAAkB,EAAE;;AAE5B,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;AAChE,SAAA;AAAM,aAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;;YAExC,IAAI,CAAC,UAAU,CAAC,cAAc,CAC7B,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,EACV,qBAAqB,EACrB,sBAAsB,CACtB,CAAC,KAAK,CAAC,GAAG,IAAG;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;AACvD,aAAC,CAAC,CAAC;AACH,SAAA;KACD;IAEO,mBAAmB,GAAA;AAC1B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAA4B,CAAC;AAC1E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,aAA4B,CAAC;AAE5E,QAAA,IAAI,WAAW,EAAE;AAChB,YAAA,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACtC,YAAA,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACtC,SAAA;AAED,QAAA,IAAI,YAAY,EAAE;AACjB,YAAA,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACtC,YAAA,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACvC,YAAA,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACvC,SAAA;KACD;IAEO,YAAY,GAAA;AACnB,QAAA,QAAQ,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEpC,QAAQ,CAAC,iBAAiB,CAAC;AACzB,aAAA,SAAS,CAAC;AACV,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE;AACV,gBAAA,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;AAC/B,oBAAA,WAAW,EAAE,QAAQ;AACrB,oBAAA,OAAO,EAAE,IAAI;iBACb,CAAC;AACF,aAAA;AACD,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,SAAS,EAAE;AACV,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;AACtE,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAEtE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzC;AACD,aAAA;SACD,CAAC;AACD,aAAA,SAAS,CAAC;AACV,YAAA,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;AAC7D,YAAA,SAAS,EAAE;AACV,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AACvD,oBAAA,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAEvD,oBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;AAC7C,oBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;AAE/C,oBAAA,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAC1B,oBAAA,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;oBAEzB,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzC;AACD,aAAA;AACD,YAAA,SAAS,EAAE;gBACV,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACrD,gBAAA,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBACrE,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACrD,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACb,SAAA,CAAC,CAAC;KACJ;;kHAnLW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,0XCZlC,quCA+BA,EAAA,MAAA,EAAA,CAAA,s8EAAA,CAAA,EAAA,CAAA,CAAA;2FDnBa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;+BACC,eAAe,EAAA,QAAA,EAAA,quCAAA,EAAA,MAAA,EAAA,CAAA,s8EAAA,CAAA,EAAA,CAAA;2HAMhB,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBAE2B,kBAAkB,EAAA,CAAA;sBAAlD,SAAS;uBAAC,oBAAoB,CAAA;gBACG,mBAAmB,EAAA,CAAA;sBAApD,SAAS;uBAAC,qBAAqB,CAAA;;;IEHrB,iBAMX;AAND,CAAA,UAAY,gBAAgB,EAAA;AAC3B,IAAA,gBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,gBAAA,CAAA,eAAA,CAAA,GAAA,eAA+B,CAAA;AAC/B,IAAA,gBAAA,CAAA,eAAA,CAAA,GAAA,eAA+B,CAAA;AAC/B,IAAA,gBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,gBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AAChB,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,GAM3B,EAAA,CAAA,CAAA,CAAA;MAOY,uBAAuB,CAAA;AAsBnC,IAAA,WAAA,CACQ,WAA2B,EAC1B,UAAsB,EACtB,YAAsB,EAAA;QAFvB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAgB;QAC1B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAU;;QAvBtB,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;QAC1B,IAAO,CAAA,OAAA,GAAW,MAAM,CAAC;QACzB,IAAQ,CAAA,QAAA,GAAW,EAAE,CAAC;QAGtB,IAAc,CAAA,cAAA,GAAa,EAAE,CAAC;QAC9B,IAAgB,CAAA,gBAAA,GAAa,EAAE,CAAC;;AAGlC,QAAA,IAAA,CAAA,KAAK,GAAqB,gBAAgB,CAAC,IAAI,CAAC;AAChD,QAAA,IAAA,CAAA,gBAAgB,GAAG,gBAAgB,CAAC;QACpC,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;;QAGzB,IAAS,CAAA,SAAA,GAAW,EAAE,CAAC;QACvB,IAAK,CAAA,KAAA,GAAW,EAAE,CAAC;QACnB,IAAK,CAAA,KAAA,GAAqB,EAAE,CAAC;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,IAAiB,CAAA,iBAAA,GAAuB,IAAI,CAAC;KAMjD;IAEJ,QAAQ,GAAA;QACP,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,yBAAyB,EAAE,CAAC;KACjC;IAED,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;KACjC;AAED;;AAEG;IACH,UAAU,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;AAC9C,YAAA,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,YAAY,GAAG,6CAA6C,CAAC;YAClE,OAAO;AACP,SAAA;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC;AAC5C,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AAEvB,QAAA,MAAM,IAAI,GAAsB;YAC/B,QAAQ,EAAE,WAAW,CAAC,GAAG;YACzB,IAAI,EAAE,cAAc,CAAC,WAAW;YAChC,MAAM,EAAE,IAAI,CAAC,QAAQ;YACrB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CACpC,SAAS,CAAC,QAAQ,IAAG;YACpB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;AAC5C,YAAA,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC;AAE5C,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;gBACpC,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,gBAAA,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;AAC3B,gBAAA,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;AACnC,gBAAA,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;AAC7B,aAAA,CAAC,CAAC;AACJ,SAAC,CAAC,CACF,CAAC,SAAS,CAAC;AACX,YAAA,IAAI,EAAE,CAAC,aAAa,KAAI;gBACvB,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;AACzC,gBAAA,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;aACpC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;AACpC,gBAAA,IAAI,CAAC,YAAY,GAAG,wCAAwC,CAAC;aAC7D;AACD,SAAA,CAAC,CACF,CAAC;KACF;AAED;;AAEG;IACH,WAAW,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACnC,YAAA,IAAI,CAAC,YAAY,GAAG,uCAAuC,CAAC;YAC5D,OAAO;AACP,SAAA;;AAGD,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC1B;AAED;;AAEG;IACH,MAAM,GAAA;AACL,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;KACnC;AAED;;AAEG;IACH,KAAK,GAAA;AACJ,QAAA,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;KAChB;;IAGO,eAAe,GAAA;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;;AAGhB,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAG;AAC9B,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;AACjE,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAG;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAG;AAClC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;AACrE,SAAC,CAAC,CAAC;KACH;IAEO,yBAAyB,GAAA;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAG;;AAE1C,YAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,UAAU;AAC/B,gBAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;gBAC9B,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACzB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;AAC5C,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBACpC,IAAI,SAAS,IAAI,KAAK,EAAE;AACvB,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC9B,iBAAA;AACD,aAAA;SACD,CAAC,CACF,CAAC;KACF;IAEO,kBAAkB,CAAC,qBAA8B,KAAK,EAAA;QAC7D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACtE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,WAAW,EAAE,iBAAiB;AAC9B,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,KAAK;AACf,SAAA,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAEvD,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,GAAG,cAAc,CAAC;QACpE,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,GAAG,UAAU,CAAC;QAC5D,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAEjF,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CACjC,MAAK,EAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,EACxC,QAAQ,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CACxC,CAAC;KACF;;oHA7KW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,gRC7BpC,ssJAqJA,EAAA,MAAA,EAAA,CAAA,ikKAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDxHa,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBALnC,SAAS;+BACC,kBAAkB,EAAA,QAAA,EAAA,ssJAAA,EAAA,MAAA,EAAA,CAAA,ikKAAA,CAAA,EAAA,CAAA;kJAMnB,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;;;MExBM,kBAAkB,CAAA;IAe9B,WACS,CAAA,YAAsB,EACtB,UAAsB,EAAA;QADtB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAU;QACtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QAhBtB,IAAa,CAAA,aAAA,GAAW,CAAC,CAAC;QAC1B,IAAO,CAAA,OAAA,GAAW,MAAM,CAAC;QACzB,IAAQ,CAAA,QAAA,GAAW,EAAE,CAAC;QAGtB,IAAc,CAAA,cAAA,GAAa,EAAE,CAAC;QAC9B,IAAgB,CAAA,gBAAA,GAAa,EAAE,CAAC;QAElC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;AAEjB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,IAAe,CAAA,eAAA,GAAuB,IAAI,CAAC;QAC3C,IAAiB,CAAA,iBAAA,GAAuB,IAAI,CAAC;KAKjD;IAEJ,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AACzD,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;AAC7F,SAAA;;AAGD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAG;;AAE1C,YAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,UAAU;AAC/B,gBAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;gBAC9B,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACzB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;AAC5C,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBACpC,IAAI,SAAS,IAAI,KAAK,EAAE;AACvB,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC9B,iBAAA;AACD,aAAA;;AAGD,YAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,GAAG,EAAE;AAC1B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,aAAA;SACD,CAAC,CACF,CAAC;KACF;IAED,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;KACjC;IAED,OAAO,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;AAC9C,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACzD,OAAO;AACP,SAAA;QAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC5B;IAEO,oBAAoB,GAAA;QAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,uBAAuB,EAAE;AACtE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,WAAW,EAAE,wBAAwB;AACrC,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;;QAGH,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1E,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9D,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACtE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACxE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC5E,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAEhF,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAC/B,MAAK,EAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,EACtC,QAAQ,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CACtC,CAAC;KACF;IAEO,kBAAkB,CAAC,qBAA8B,KAAK,EAAA;QAC7D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACtE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,WAAW,EAAE,iBAAiB;AAC9B,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,KAAK;AACf,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;AAC/E,QAAA,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACvE,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAEjF,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CACjC,MAAK,EAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,EACxC,QAAQ,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CACxC,CAAC;KACF;;+GApGW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,uQCb/B,+TAWA,EAAA,MAAA,EAAA,CAAA,8WAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDEa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACC,SAAS,EAAA,QAAA,EAAA,+TAAA,EAAA,MAAA,EAAA,CAAA,8WAAA,CAAA,EAAA,CAAA;qHAKV,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;;;METM,wBAAwB,CAAA;AAOpC,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QALnC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;AAEf,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;;QAwD1B,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;KAtDc;IAE/C,QAAQ,GAAA;QACP,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC1B;IAED,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;AACjC,QAAA,QAAQ,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;KAC5C;;IAGD,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;KAC9B;IAED,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;KACpC;IAED,UAAU,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;KAC7B;;IAGO,kBAAkB,GAAA;;AAEzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,IAAG;AAC5C,YAAA,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,EAAE;AACrC,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,aAAA;SACD,CAAC,CACF,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAG;AAC1C,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACzE,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnB,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;AAC3C,aAAA;SACD,CAAC,CACF,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACrB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAG;AAC1C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACrB,CAAC,CACF,CAAC;KACF;IAKO,YAAY,GAAA;AACnB,QAAA,QAAQ,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;;AAG5C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;AAC/B,QAAA,MAAM,wBAAwB,GAAG;YAChC,WAAW,EAAE,MAAK;gBACjB,OAAO;AACN,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,GAAG,EAAE,MAAM;AACX,oBAAA,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM;AACjC,oBAAA,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM;iBACnC,CAAC;aACF;AACD,YAAA,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACrD,CAAC;QAEF,QAAQ,CAAC,yBAAyB,CAAC;AACjC,aAAA,SAAS,CAAC;AACV,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE;AACV,gBAAA,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC;AACrD,aAAA;AACD,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE;AACV,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;AACtE,oBAAA,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAEtE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzC;AACD,aAAA;SACD,CAAC;AACD,aAAA,SAAS,CAAC;AACV,YAAA,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;AAC7D,YAAA,SAAS,EAAE;AACV,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,oBAAA,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AACvD,oBAAA,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;;AAGvD,oBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;AAC7C,oBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;;AAG/C,oBAAA,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAC1B,oBAAA,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;oBAEzB,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,GAAA,CAAK,CAAC;oBACrD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzC;AACD,aAAA;AACD,YAAA,SAAS,EAAE;AACV,gBAAA,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC;AAChC,oBAAA,KAAK,EAAE;AACN,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,GAAG,EAAE,MAAM;AACX,wBAAA,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM;AACjC,wBAAA,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM;AACnC,qBAAA;iBACD,CAAC;AACF,gBAAA,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;oBAC/B,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;oBAChC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;iBAChC,CAAC;gBACF,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACrD,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACb,SAAA,CAAC,CAAC;KACJ;;qHAzIW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,yDCXrC,+gCAqBA,EAAA,MAAA,EAAA,CAAA,uoEAAA,CAAA,EAAA,CAAA,CAAA;2FDVa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,SAAS;+BACC,mBAAmB,EAAA,QAAA,EAAA,+gCAAA,EAAA,MAAA,EAAA,CAAA,uoEAAA,CAAA,EAAA,CAAA;;;MEmBjB,gBAAgB,CAAA;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;IACH,OAAO,OAAO,CAAC,OAGd,EAAA;QACC,OAAO;AACL,YAAA,QAAQ,EAAE,gBAAgB;AAC1B,YAAA,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;gBACjD,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE;gBAC1D,UAAU;AACX,aAAA;SACF,CAAC;KACH;;6GA1CU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAhB,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,iBAfzB,kBAAkB;QAClB,qBAAqB;QACrB,wBAAwB;QACxB,uBAAuB,CAAA,EAAA,OAAA,EAAA,CAGvB,YAAY,CAAA,EAAA,OAAA,EAAA,CAGZ,kBAAkB;QAClB,qBAAqB;QACrB,wBAAwB;QACxB,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAGd,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,EAVlB,OAAA,EAAA,CAAA;YACP,YAAY;AACb,SAAA,CAAA,EAAA,CAAA,CAAA;2FAQU,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAjB5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,kBAAkB;wBAClB,qBAAqB;wBACrB,wBAAwB;wBACxB,uBAAuB;AACxB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,kBAAkB;wBAClB,qBAAqB;wBACrB,wBAAwB;wBACxB,uBAAuB;AACxB,qBAAA;AACF,iBAAA,CAAA;;;ACzBD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import { OnInit, OnDestroy } from "@angular/core";
|
|
2
|
-
import { TasService } from "../../services/tas.service";
|
|
3
|
-
import { TasUserDataProvider } from "../../tas.config";
|
|
4
2
|
import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
|
|
3
|
+
import { TasCurrentUser } from "../../interfaces/tas.interfaces";
|
|
4
|
+
import { TasService } from "../../services/tas.service";
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class TasButtonComponent implements OnInit, OnDestroy {
|
|
7
|
-
private tasService;
|
|
8
7
|
private modalService;
|
|
9
|
-
private
|
|
8
|
+
private tasService;
|
|
9
|
+
appointmentId: number;
|
|
10
|
+
product: string;
|
|
11
|
+
tenantId: string;
|
|
12
|
+
currentUser: TasCurrentUser;
|
|
13
|
+
ownerUserIds: number[];
|
|
14
|
+
regularUserIds: number[];
|
|
15
|
+
moderatorUserIds: number[];
|
|
10
16
|
isLoading: boolean;
|
|
11
|
-
private userData;
|
|
12
|
-
private tenantId;
|
|
13
17
|
private subscriptions;
|
|
14
18
|
private currentModalRef;
|
|
15
|
-
|
|
19
|
+
private videoCallModalRef;
|
|
20
|
+
constructor(modalService: NgbModal, tasService: TasService);
|
|
16
21
|
ngOnInit(): void;
|
|
17
22
|
ngOnDestroy(): void;
|
|
18
23
|
onClick(): void;
|
|
19
|
-
private
|
|
20
|
-
private setupViewModeSubscription;
|
|
24
|
+
private openWaitingRoomModal;
|
|
21
25
|
private openVideoCallModal;
|
|
22
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TasButtonComponent,
|
|
23
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TasButtonComponent, "tas-btn", never, {}, {}, never, never>;
|
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TasButtonComponent, never>;
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TasButtonComponent, "tas-btn", never, { "appointmentId": "appointmentId"; "product": "product"; "tenantId": "tenantId"; "currentUser": "currentUser"; "ownerUserIds": "ownerUserIds"; "regularUserIds": "regularUserIds"; "moderatorUserIds": "moderatorUserIds"; }, {}, never, never>;
|
|
24
28
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { OnInit, OnDestroy } from
|
|
2
|
-
import { TasService } from
|
|
1
|
+
import { OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import { TasService } from '../../services/tas.service';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class TasFloatingCallComponent implements OnInit, OnDestroy {
|
|
5
5
|
private tasService;
|
|
@@ -13,6 +13,7 @@ export declare class TasFloatingCallComponent implements OnInit, OnDestroy {
|
|
|
13
13
|
onHangUp(): void;
|
|
14
14
|
toggleMute(): void;
|
|
15
15
|
private setupSubscriptions;
|
|
16
|
+
private readonly PIP_MARGIN;
|
|
16
17
|
private initInteract;
|
|
17
18
|
static ɵfac: i0.ɵɵFactoryDeclaration<TasFloatingCallComponent, never>;
|
|
18
19
|
static ɵcmp: i0.ɵɵComponentDeclaration<TasFloatingCallComponent, "tas-floating-call", never, {}, {}, never, never>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { OnInit, OnDestroy, ElementRef, AfterViewInit } from
|
|
2
|
-
import { NgbActiveModal } from
|
|
3
|
-
import { TasService
|
|
1
|
+
import { OnInit, OnDestroy, ElementRef, AfterViewInit } from '@angular/core';
|
|
2
|
+
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
|
|
3
|
+
import { TasService } from '../../services/tas.service';
|
|
4
|
+
import { CallState } from '../../interfaces/tas.interfaces';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class TasVideocallComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
6
7
|
activeModal: NgbActiveModal;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
|
3
|
+
import { TasService } from '../../services/tas.service';
|
|
4
|
+
import { TasCurrentUser } from '../../interfaces/tas.interfaces';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare enum WaitingRoomState {
|
|
7
|
+
IDLE = "IDLE",
|
|
8
|
+
CREATING_ROOM = "CREATING_ROOM",
|
|
9
|
+
GETTING_TOKEN = "GETTING_TOKEN",
|
|
10
|
+
READY = "READY",
|
|
11
|
+
ERROR = "ERROR"
|
|
12
|
+
}
|
|
13
|
+
export declare class TasWaitingRoomComponent implements OnInit, OnDestroy {
|
|
14
|
+
activeModal: NgbActiveModal;
|
|
15
|
+
private tasService;
|
|
16
|
+
private modalService;
|
|
17
|
+
appointmentId: number;
|
|
18
|
+
product: string;
|
|
19
|
+
tenantId: string;
|
|
20
|
+
currentUser: TasCurrentUser;
|
|
21
|
+
ownerUserIds: number[];
|
|
22
|
+
regularUserIds: number[];
|
|
23
|
+
moderatorUserIds: number[];
|
|
24
|
+
state: WaitingRoomState;
|
|
25
|
+
WaitingRoomState: typeof WaitingRoomState;
|
|
26
|
+
errorMessage: string;
|
|
27
|
+
private sessionId;
|
|
28
|
+
private token;
|
|
29
|
+
private users;
|
|
30
|
+
private subscriptions;
|
|
31
|
+
private videoCallModalRef;
|
|
32
|
+
constructor(activeModal: NgbActiveModal, tasService: TasService, modalService: NgbModal);
|
|
33
|
+
ngOnInit(): void;
|
|
34
|
+
ngOnDestroy(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Creates the room and fetches the token
|
|
37
|
+
*/
|
|
38
|
+
createRoom(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Joins the video call session
|
|
41
|
+
*/
|
|
42
|
+
joinSession(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Closes the waiting room
|
|
45
|
+
*/
|
|
46
|
+
cancel(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Retry after an error
|
|
49
|
+
*/
|
|
50
|
+
retry(): void;
|
|
51
|
+
private buildUsersArray;
|
|
52
|
+
private setupViewModeSubscription;
|
|
53
|
+
private openVideoCallModal;
|
|
54
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TasWaitingRoomComponent, never>;
|
|
55
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TasWaitingRoomComponent, "tas-waiting-room", never, { "appointmentId": "appointmentId"; "product": "product"; "tenantId": "tenantId"; "currentUser": "currentUser"; "ownerUserIds": "ownerUserIds"; "regularUserIds": "regularUserIds"; "moderatorUserIds": "moderatorUserIds"; }, {}, never, never>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration interface for the TAS module
|
|
5
|
+
*/
|
|
6
|
+
export interface TasConfig {
|
|
7
|
+
/** TokBox/Vonage API Key */
|
|
8
|
+
tokBoxApiKey: string;
|
|
9
|
+
/** Optional API base URL for room/token endpoints */
|
|
10
|
+
apiBaseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* HTTP client interface that consuming apps must implement
|
|
14
|
+
*/
|
|
15
|
+
export interface TasHttpClient {
|
|
16
|
+
post<T>(url: string, options: {
|
|
17
|
+
body: any;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
}): Observable<T>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Injection token for TAS configuration
|
|
23
|
+
*/
|
|
24
|
+
export declare const TAS_CONFIG: InjectionToken<TasConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Injection token for HTTP client adapter
|
|
27
|
+
*/
|
|
28
|
+
export declare const TAS_HTTP_CLIENT: InjectionToken<TasHttpClient>;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
export interface CreateRoomUser {
|
|
2
|
+
userExternalId: number;
|
|
3
|
+
rol: TasUserRole;
|
|
4
|
+
}
|
|
1
5
|
export interface CreateRoomRequest {
|
|
2
|
-
tenant: string;
|
|
3
|
-
userId: string;
|
|
4
|
-
product: string;
|
|
5
|
-
record: boolean;
|
|
6
6
|
roomType: TasRoomType;
|
|
7
7
|
type: TasSessionType;
|
|
8
8
|
utcScheduled?: string;
|
|
9
|
+
product: string;
|
|
10
|
+
tenant: string;
|
|
11
|
+
appointmentId: number;
|
|
12
|
+
users: CreateRoomUser[];
|
|
9
13
|
}
|
|
10
14
|
export interface CreateRoomResponse {
|
|
11
15
|
content: {
|
|
@@ -15,17 +19,48 @@ export interface CreateRoomResponse {
|
|
|
15
19
|
product: string | null;
|
|
16
20
|
record: boolean | null;
|
|
17
21
|
sessionId: string;
|
|
22
|
+
roomId: number;
|
|
23
|
+
status: TasSessionType;
|
|
18
24
|
};
|
|
19
25
|
}
|
|
20
|
-
export declare
|
|
21
|
-
|
|
26
|
+
export declare enum TasRoomType {
|
|
27
|
+
TAS = "TAS",
|
|
28
|
+
JM = "JM",
|
|
29
|
+
WEBINAR = "WEBINAR"
|
|
30
|
+
}
|
|
31
|
+
export declare enum TasSessionType {
|
|
32
|
+
SPONTANEOUS = "SPONTANEOUS",
|
|
33
|
+
SCHEDULED = "SCHEDULED"
|
|
34
|
+
}
|
|
35
|
+
export declare enum TasUserRole {
|
|
36
|
+
OWNER = "OWNER",
|
|
37
|
+
USER = "USER",
|
|
38
|
+
MODERATOR = "MODERATOR"
|
|
39
|
+
}
|
|
40
|
+
export interface TasCurrentUser {
|
|
41
|
+
name: string;
|
|
42
|
+
lastname: string;
|
|
43
|
+
role: TasUserRole;
|
|
44
|
+
}
|
|
22
45
|
export interface GenerateTokenRequest {
|
|
23
46
|
sessionId: string;
|
|
24
47
|
name: string;
|
|
25
48
|
lastname: string;
|
|
49
|
+
roleVC: TasUserRole;
|
|
26
50
|
}
|
|
27
51
|
export interface GenerateTokenResponse {
|
|
28
52
|
content: {
|
|
29
53
|
token: string;
|
|
30
54
|
};
|
|
31
55
|
}
|
|
56
|
+
export declare enum CallState {
|
|
57
|
+
IDLE = "IDLE",
|
|
58
|
+
CONNECTING = "CONNECTING",
|
|
59
|
+
CONNECTED = "CONNECTED",
|
|
60
|
+
DISCONNECTED = "DISCONNECTED",
|
|
61
|
+
ERROR = "ERROR"
|
|
62
|
+
}
|
|
63
|
+
export declare enum ViewMode {
|
|
64
|
+
FULLSCREEN = "FULLSCREEN",
|
|
65
|
+
PIP = "PIP"
|
|
66
|
+
}
|
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
import { Observable } from "rxjs";
|
|
2
2
|
import * as OT from "@opentok/client";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { CreateRoomRequest, CreateRoomResponse, GenerateTokenRequest, GenerateTokenResponse, CallState, ViewMode } from "../interfaces/tas.interfaces";
|
|
4
|
+
import { TasConfig, TasHttpClient } from "../config/tas.config";
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
export
|
|
7
|
-
IDLE = "IDLE",
|
|
8
|
-
CONNECTING = "CONNECTING",
|
|
9
|
-
CONNECTED = "CONNECTED",
|
|
10
|
-
DISCONNECTED = "DISCONNECTED",
|
|
11
|
-
ERROR = "ERROR"
|
|
12
|
-
}
|
|
13
|
-
export declare enum ViewMode {
|
|
14
|
-
FULLSCREEN = "FULLSCREEN",
|
|
15
|
-
PIP = "PIP"
|
|
16
|
-
}
|
|
6
|
+
export { CallState, ViewMode };
|
|
17
7
|
export declare class TasService {
|
|
18
|
-
private config;
|
|
19
8
|
private httpClient;
|
|
9
|
+
private config;
|
|
20
10
|
private session;
|
|
21
11
|
private publisher;
|
|
22
12
|
private subscribers;
|
|
@@ -28,7 +18,7 @@ export declare class TasService {
|
|
|
28
18
|
isMuted$: Observable<boolean>;
|
|
29
19
|
private currentSessionId;
|
|
30
20
|
private currentToken;
|
|
31
|
-
constructor(
|
|
21
|
+
constructor(httpClient: TasHttpClient, config: TasConfig);
|
|
32
22
|
get currentSession(): OT.Session | null;
|
|
33
23
|
get currentPublisher(): OT.Publisher | null;
|
|
34
24
|
get currentSubscribers(): OT.Subscriber[];
|
|
@@ -60,6 +50,6 @@ export declare class TasService {
|
|
|
60
50
|
* Moves videos back to fullscreen containers
|
|
61
51
|
*/
|
|
62
52
|
moveVideosToFullscreen(): void;
|
|
63
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TasService,
|
|
53
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TasService, never>;
|
|
64
54
|
static ɵprov: i0.ɵɵInjectableDeclaration<TasService>;
|
|
65
55
|
}
|