ngx-rumbletalk
Version:
RumbleTalk Angular integration
1 lines • 31 kB
Source Map (JSON)
{"version":3,"file":"ngx-rumbletalk.mjs","sources":["../../../projects/ngx-rumbletalk/src/lib/ngx-rumbletalk.service.ts","../../../projects/ngx-rumbletalk/src/lib/ngx-rumbletalk.component.ts","../../../projects/ngx-rumbletalk/src/lib/ngx-rumbletalk.component.html","../../../projects/ngx-rumbletalk/src/lib/ngx-rumbletalk.module.ts","../../../projects/ngx-rumbletalk/src/public-api.ts","../../../projects/ngx-rumbletalk/src/ngx-rumbletalk.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { LoginData } from './interface/login-data';\nimport { LogoutData } from './interface/logout-data';\nimport { LogoutCbData } from './interface/logout-cb-data';\nimport { OpenPrivateChatData } from './interface/open-private-chat-data';\ndeclare const window: any;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgxRumbletalkService {\n public iframe: any;\n public server = '';\n public handleResolve;\n public handleReject;\n public iframeLoaded = new Promise((resolve, reject) => {\n this.handleResolve = resolve;\n this.handleReject = reject;\n });\n\n readonly postMessageEvents: any = {\n LOGOUT_CB: 'pm.1',\n LOGOUT_CB_RECEIVED: 'pm.2',\n LOGIN: 'pm.3',\n LOGIN_SUCCESS: 'pm.4',\n LOGIN_ALREADY_LOGGED_IN: 'pm.5',\n LOGOUT: 'pm.6',\n OPEN_PRIVATE_CHAT: 'pm.7',\n };\n\n constructor(private http: HttpClient) {}\n\n address(hash: string): Observable<string> {\n return this.http\n .get<string>(`https://rumbletalk.com/client/service.php?hash=${hash}`)\n .pipe(map((data: any) => data.address));\n }\n\n reload(url: string): Observable<any> {\n return this.http.get<any>(url);\n }\n\n login(data: LoginData): Promise<any> {\n return new Promise((resolve, reject) => {\n const message: any = {};\n\n /* handle username value */\n message.username = this.trim(data.username);\n if (!this.validateUsername(message.username)) {\n reject('Error: invalid username in \"login\" function');\n }\n\n /* handle, if set, password value */\n if (data.password) {\n if (!this.validatePassword(data.password)) {\n reject('Error: invalid password in \"login\" function');\n }\n message.password = data.password;\n }\n\n /* handle, if set, image URL */\n if (data.image) {\n if (!this.validateUrl(data.image)) {\n reject('Error: invalid image in \"login\" function');\n }\n message.image = data.image;\n }\n\n message.type = this.postMessageEvents.LOGIN;\n message.hash = data.hash;\n message.forceLogin = data.forceLogin;\n\n /* keep sending the data to the chat until the chat responds */\n const intervalHandle = setInterval(() => {\n this.postMessage(message);\n }, 1000);\n\n window.addEventListener(\n 'message',\n function handlePostMessage(this: NgxRumbletalkService, event) {\n /* validates the origin to be from a chat */\n if (!this.validateChatOrigin(event.origin)) {\n console.log('Error: invalid origin in \"login\" function');\n }\n\n if (typeof event.data !== 'object') {\n console.log(`Error: invalid data received in RumbleTalk SDK: ${event.data}`);\n }\n\n /* different chat callback */\n if (event.data.hash !== data.hash) {\n reject('Error: chat hash mismatch');\n }\n\n /* validate that the message is of a successful login of the specific chat */\n if (\n event.data.type === this.postMessageEvents.LOGIN_SUCCESS ||\n event.data.type === this.postMessageEvents.LOGIN_ALREADY_LOGGED_IN\n ) {\n clearInterval(intervalHandle);\n window.removeEventListener('message', handlePostMessage);\n\n resolve({\n status: event.data.type,\n message: event.data.type === this.postMessageEvents.LOGIN_SUCCESS ? 'success' : 'already logged in',\n });\n }\n }.bind(this),\n false\n );\n });\n }\n\n logout(data: LogoutData): void {\n const message: any = {\n type: this.postMessageEvents.LOGOUT,\n hash: data.hash,\n };\n\n if (data.userId) {\n message.userId = data.userId;\n }\n\n if (data.username) {\n message.username = data.username;\n }\n\n this.postMessage(message);\n }\n\n logoutCB(data: LogoutCbData): void {\n const intervalHandle = setInterval(() => {\n this.postMessage({ type: this.postMessageEvents.LOGOUT_CB });\n }, 1000);\n\n window.addEventListener(\n 'message',\n (event) => {\n /* validates the origin to be from a chat */\n if (!this.validateChatOrigin(event.origin)) {\n return;\n }\n\n /* expecting an object */\n if (typeof event.data !== 'object') {\n return;\n }\n\n /* different chat callback */\n if (event.data.hash !== data.hash) {\n return;\n }\n\n /* callback registered */\n if (event.data.type === this.postMessageEvents.LOGOUT_CB_RECEIVED) {\n clearInterval(intervalHandle);\n return;\n }\n\n /* validate event type */\n if (event.data.type !== this.postMessageEvents.LOGOUT_CB) {\n return;\n }\n\n data.callback(event.data.reason);\n },\n false\n );\n }\n\n openPrivateChat(data: OpenPrivateChatData): void {\n const message: any = {\n type: this.postMessageEvents.OPEN_PRIVATE_CHAT,\n hash: data.hash,\n };\n\n if (data.userId) {\n message.userId = data.userId;\n }\n\n if (data.username) {\n message.username = data.username;\n }\n\n this.postMessage(message);\n }\n\n postMessage(data) {\n try {\n const target = this.iframe instanceof HTMLIFrameElement ? this.iframe.contentWindow : this.iframe;\n target.postMessage(data, `https://${this.server}`);\n } catch (error: any) {\n console.log(error.name, error.message);\n }\n }\n\n trim(str: string): string {\n return str.replace(/^\\s+|\\s+$/g, '');\n }\n\n validateUsername(username: string): boolean {\n return !/^-?\\d+$/.test(username) && username.length < 64;\n }\n\n validatePassword(password: string): boolean {\n return 0 < password.length && password.length < 51;\n }\n\n validateUrl(url: string): boolean {\n return /(https?:)?\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/.test(url);\n }\n\n /**\n * checks if the given origin is of a chat service\n * @param origin - the URL of the origin\n * returns boolean\n */\n validateChatOrigin(origin): boolean {\n return /^https:\\/\\/.+\\.rumbletalk\\.(net|com)(:4433)?$/.test(origin);\n }\n}\n","import {\n Input,\n OnInit,\n OnDestroy,\n OnChanges,\n Component,\n ViewChild,\n ElementRef,\n SimpleChanges,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { NgxRumbletalkService } from './ngx-rumbletalk.service';\n\nconst protocol = 'https://';\nconst baseWebUrl = 'https://rumbletalk.com/';\nconst serviceRelativeUrl = 'client/service.php?hash=';\nlet server: string;\nlet messageInterval: any;\ndeclare const window: any;\n\n@Component({\n selector: 'ngx-rumbletalk',\n templateUrl: './ngx-rumbletalk.component.html',\n styleUrls: ['./ngx-rumbletalk.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxRumbletalkComponent implements OnInit, OnDestroy, OnChanges {\n @ViewChild('iframe') iframeElement: ElementRef;\n @ViewChild('chatDiv') chatDivElement: ElementRef;\n @ViewChild('counter') counterElement: ElementRef;\n @Input() public hash: string;\n @Input() public width: number;\n @Input() public height: number;\n @Input() public floating = false;\n @Input() public side = 'right';\n @Input() public image = 'https://d1pfint8izqszg.cloudfront.net/images/toolbar/toolbar.png';\n @Input() public counter = 'false';\n\n mobile: boolean;\n cdn = 'https://d1pfint8izqszg.cloudfront.net/';\n counterTop = 14;\n counterLeft = 23;\n\n constructor(private service: NgxRumbletalkService) {}\n\n ngOnInit() {\n const ua = navigator.userAgent.toUpperCase();\n this.mobile = ua.indexOf('MOBILE') !== -1 || ua.indexOf('ANDROID') !== -1 || ua.indexOf('IOS') !== -1;\n\n if (this.floating) {\n if (!this.width) {\n this.width = 700;\n }\n\n if (!this.height) {\n this.height = 500;\n }\n\n if (this.side !== 'right' && this.side !== 'left') {\n this.side = 'right';\n }\n\n if (this.counter !== 'false') {\n const counterArr = this.counter.split(':');\n const counterTop = Number(counterArr[0]);\n const counterLeft = Number(counterArr[1]);\n\n if (!isNaN(counterTop)) {\n this.counterTop = counterTop;\n }\n\n if (!isNaN(counterLeft)) {\n this.counterLeft = counterLeft;\n }\n }\n }\n\n this.loadIframe();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const hashVal = changes['hash'];\n\n if (hashVal.currentValue !== hashVal.previousValue) {\n this.reload();\n }\n }\n\n ngOnDestroy() {\n clearInterval(messageInterval);\n }\n\n /**\n * Loads the iframe\n */\n loadIframe(): void {\n this.service.address(this.hash).subscribe((address) => {\n server = address;\n\n if (!this.mobile) {\n this.iframeElement.nativeElement.src = `https://${address}/${this.hash}/`;\n }\n\n this.addListeners();\n });\n }\n\n /**\n * add the event listeners based on the embed type and device\n */\n addListeners(): void {\n window.addEventListener('message', this.info.bind(this), false);\n\n if (!this.mobile && this.floating) {\n window.addEventListener('keyup', this.escClose.bind(this), false);\n }\n }\n\n /**\n * hides the chat when the \"Esc\" key is clicked\n * @param {KeyboardEvent} event - the initiating event\n */\n escClose(event): void {\n if (event.key === 'Escape') {\n this.toggleFloatingChat(null, true);\n }\n }\n\n /**\n * handles postMessage requests\n * @param event - the event object\n */\n info(event) {\n if (isFinite(event.data)) {\n clearInterval(messageInterval);\n\n if (this.counter !== 'false') {\n this.counterElement.nativeElement.innerHTML = event.data.toString();\n }\n } else if (typeof event.data === 'object') {\n if (event.data.reload) {\n this.reload();\n }\n }\n }\n\n /**\n * reloads the iframe (or parent page) in case of a server request\n */\n reload() {\n const url = `${baseWebUrl}${serviceRelativeUrl}${this.hash}`;\n\n this.service.reload(url).subscribe(\n (res) => {\n if (res.status) {\n server = res.address;\n const address = `${protocol}${server}/${this.hash}/`;\n\n if (this.iframeElement.nativeElement instanceof HTMLIFrameElement) {\n this.iframeElement.nativeElement.src = address;\n } else {\n this.iframeElement.nativeElement.location.href = address;\n }\n }\n },\n (ignore) => {}\n );\n }\n\n /**\n * starts [repeatedly] trying to connect to the chat using postMessage\n */\n instantiateQuery() {\n messageInterval = setInterval(this.query.bind(this), 1000);\n }\n\n /**\n * instantiate a postppMessage connection with the chat\n */\n query() {\n try {\n let target;\n let origin;\n\n if (this.iframeElement.nativeElement instanceof HTMLIFrameElement) {\n target = this.iframeElement.nativeElement.contentWindow;\n origin = protocol + server;\n } else {\n target = this.iframeElement.nativeElement;\n origin = baseWebUrl;\n }\n\n target.postMessage('toolbar', origin);\n } catch (ignore) {}\n }\n\n /**\n * checks if the given origin is of a chat service\n * @param origin - the URL of the origin\n * returns boolean\n */\n validateOrigin(origin): boolean {\n return /^https:\\/\\/.+\\.rumbletalk\\.(net|com)(:4433)?$/.test(origin);\n }\n\n handleImageLoad(event: any): void {\n /* image element */\n const target = event.target;\n /* parent div */\n const parent = event.currentTarget.parentNode;\n\n /* match the dimensions of the image and the wrapping div */\n parent.style.height = `${target.height}px`;\n parent.style.width = `${target.width}px`;\n\n /* place the chat div right above the image */\n if (!this.mobile) {\n this.chatDivElement.nativeElement.style.bottom = `${target.height}px`;\n }\n }\n\n /**\n * hides or shows the floating chat\n * @param boolean [esc] - if set to true, will force hide\n */\n toggleFloatingChat(event: any = null, esc = false): void {\n if (event) {\n event.stopPropagation();\n }\n\n const chatDiv = this.chatDivElement.nativeElement;\n\n if (chatDiv.classList.contains('chat-div-in')) {\n chatDiv.classList.remove('chat-div-in');\n chatDiv.classList.add('chat-div-out');\n chatDiv.style.overflow = 'hidden';\n } else {\n if (esc) {\n return;\n }\n\n chatDiv.classList.remove('chat-div-out');\n chatDiv.classList.add('chat-div-in');\n chatDiv.style.overflow = 'visible';\n }\n }\n\n /**\n * attaches the open chat event to the given target\n * @param Element target\n */\n openChat(): void {\n const link = `${baseWebUrl}client/chat.php?${this.hash}`;\n let iframeInterval;\n const iframe = this.iframeElement;\n\n if (iframe) {\n iframe.nativeElement.focus();\n } else {\n const tempIframe = window.open(link);\n iframeInterval = setInterval(() => {\n if (tempIframe.closed) {\n clearInterval(iframeInterval);\n }\n }, 100);\n }\n }\n\n handleIframeLoad(): void {\n if (this.iframeElement && this.iframeElement.nativeElement) {\n this.service.iframe = this.iframeElement.nativeElement;\n this.service.server = server;\n this.service.handleResolve();\n this.instantiateQuery();\n }\n }\n\n handleIframeError(): void {\n this.service.handleReject('Iframe could not be loaded');\n }\n}\n","<div class=\"rumbletalk-embed\" [style.width.px]=\"width\" [style.height.px]=\"height\" *ngIf=\"!floating\">\n <iframe\n #iframe\n frameBorder=\"0\"\n allow=\"microphone; camera\"\n allowtransparency=\"true\"\n (load)=\"handleIframeLoad()\"\n ></iframe>\n</div>\n\n<div\n class=\"rumbletalk-floating\"\n [ngClass]=\"'rumbletalk-floating-' + side\"\n (click)=\"mobile ? openChat() : toggleFloatingChat()\"\n *ngIf=\"floating\"\n>\n <img\n alt=\"Click to join the conversation\"\n title=\"Click to join the conversation\"\n [src]=\"image\"\n [ngClass]=\"side\"\n (load)=\"handleImageLoad($event)\"\n />\n\n <div\n #counter\n class=\"counter-div\"\n [ngStyle]=\"{ top: counterTop + 'px', left: counterLeft + 'px' }\"\n *ngIf=\"counter !== 'false'\"\n >\n <img alt=\"loading\" [src]=\"cdn + 'images/toolbar/mini_wait.gif'\" *ngIf=\"!mobile\" />\n </div>\n\n <div #chatDiv [ngClass]=\"'chat-div chat-div-out chat-div-' + side\" *ngIf=\"!mobile\">\n <img\n class=\"close-button\"\n alt=\"close\"\n [src]=\"cdn + 'images/c.png'\"\n [ngStyle]=\"side === 'right' ? { left: '-8px' } : { right: '-8px' }\"\n (click)=\"toggleFloatingChat($event)\"\n />\n\n <iframe\n #iframe\n frameBorder=\"0\"\n allow=\"microphone; camera\"\n allowtransparency=\"true\"\n [ngStyle]=\"{\n height: height ? height + 'px' : '500px',\n width: width ? width + 'px' : '700px'\n }\"\n (load)=\"handleIframeLoad()\"\n (error)=\"handleIframeError()\"\n ></iframe>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\n\nimport { NgxRumbletalkService } from './ngx-rumbletalk.service';\nimport { NgxRumbletalkComponent } from './ngx-rumbletalk.component';\n\n@NgModule({\n declarations: [NgxRumbletalkComponent],\n imports: [FormsModule, CommonModule, HttpClientModule],\n exports: [NgxRumbletalkComponent],\n providers: [NgxRumbletalkService],\n})\nexport class NgxRumbletalkModule {}\n","/*\n * Public API Surface of ngx-rumbletalk\n */\n\nexport * from './lib/ngx-rumbletalk.service';\nexport * from './lib/ngx-rumbletalk.component';\nexport * from './lib/ngx-rumbletalk.module';\nexport * from './lib/interface/login-data';\nexport * from './lib/interface/logout-data';\nexport * from './lib/interface/logout-cb-data';\nexport * from './lib/interface/open-private-chat-data';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxRumbletalkService"],"mappings":";;;;;;;;;MAca,oBAAoB,CAAA;AAoB/B,IAAA,WAAA,CAAoB,IAAgB,EAAA;AAAhB,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;AAlB7B,QAAA,IAAM,CAAA,MAAA,GAAG,EAAE,CAAC;QAGZ,IAAY,CAAA,YAAA,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACpD,YAAA,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;AAC7B,SAAC,CAAC,CAAC;QAEM,IAAA,CAAA,iBAAiB,GAAQ;AAChC,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,aAAa,EAAE,MAAM;AACrB,YAAA,uBAAuB,EAAE,MAAM;AAC/B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,iBAAiB,EAAE,MAAM;SAC1B,CAAC;KAEsC;AAExC,IAAA,OAAO,CAAC,IAAY,EAAA;QAClB,OAAO,IAAI,CAAC,IAAI;AACb,aAAA,GAAG,CAAS,CAAA,+CAAA,EAAkD,IAAI,CAAA,CAAE,CAAC;AACrE,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,IAAS,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;KAC3C;AAED,IAAA,MAAM,CAAC,GAAW,EAAA;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAM,GAAG,CAAC,CAAC;KAChC;AAED,IAAA,KAAK,CAAC,IAAe,EAAA;QACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAQ,EAAE,CAAC;;YAGxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC5C,MAAM,CAAC,6CAA6C,CAAC,CAAC;AACvD,aAAA;;YAGD,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACzC,MAAM,CAAC,6CAA6C,CAAC,CAAC;AACvD,iBAAA;AACD,gBAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAClC,aAAA;;YAGD,IAAI,IAAI,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACjC,MAAM,CAAC,0CAA0C,CAAC,CAAC;AACpD,iBAAA;AACD,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AAC5B,aAAA;YAED,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC5C,YAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACzB,YAAA,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;;AAGrC,YAAA,MAAM,cAAc,GAAG,WAAW,CAAC,MAAK;AACtC,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;aAC3B,EAAE,IAAI,CAAC,CAAC;YAET,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,SAAS,iBAAiB,CAA6B,KAAK,EAAA;;gBAE1D,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AAC1C,oBAAA,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;AAC1D,iBAAA;AAED,gBAAA,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;oBAClC,OAAO,CAAC,GAAG,CAAC,CAAA,gDAAA,EAAmD,KAAK,CAAC,IAAI,CAAE,CAAA,CAAC,CAAC;AAC9E,iBAAA;;gBAGD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;oBACjC,MAAM,CAAC,2BAA2B,CAAC,CAAC;AACrC,iBAAA;;gBAGD,IACE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,aAAa;oBACxD,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,EAClE;oBACA,aAAa,CAAC,cAAc,CAAC,CAAC;AAC9B,oBAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAEzD,oBAAA,OAAO,CAAC;AACN,wBAAA,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;AACvB,wBAAA,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,aAAa,GAAG,SAAS,GAAG,mBAAmB;AACpG,qBAAA,CAAC,CAAC;AACJ,iBAAA;aACF,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,KAAK,CACN,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,CAAC,IAAgB,EAAA;AACrB,QAAA,MAAM,OAAO,GAAQ;AACnB,YAAA,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC9B,SAAA;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAClC,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;KAC3B;AAED,IAAA,QAAQ,CAAC,IAAkB,EAAA;AACzB,QAAA,MAAM,cAAc,GAAG,WAAW,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;SAC9D,EAAE,IAAI,CAAC,CAAC;QAET,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,CAAC,KAAK,KAAI;;YAER,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC1C,OAAO;AACR,aAAA;;AAGD,YAAA,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAClC,OAAO;AACR,aAAA;;YAGD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;gBACjC,OAAO;AACR,aAAA;;YAGD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;gBACjE,aAAa,CAAC,cAAc,CAAC,CAAC;gBAC9B,OAAO;AACR,aAAA;;YAGD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;gBACxD,OAAO;AACR,aAAA;YAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAClC,EACD,KAAK,CACN,CAAC;KACH;AAED,IAAA,eAAe,CAAC,IAAyB,EAAA;AACvC,QAAA,MAAM,OAAO,GAAQ;AACnB,YAAA,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,iBAAiB;YAC9C,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC9B,SAAA;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAClC,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;KAC3B;AAED,IAAA,WAAW,CAAC,IAAI,EAAA;QACd,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,YAAY,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;YAClG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAW,QAAA,EAAA,IAAI,CAAC,MAAM,CAAE,CAAA,CAAC,CAAC;AACpD,SAAA;AAAC,QAAA,OAAO,KAAU,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AACxC,SAAA;KACF;AAED,IAAA,IAAI,CAAC,GAAW,EAAA;QACd,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;KACtC;AAED,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;KAC1D;AAED,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QAC/B,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;KACpD;AAED,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,OAAO,gGAAgG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACnH;AAED;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,MAAM,EAAA;AACvB,QAAA,OAAO,+CAA+C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACrE;;iHAjNU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;ACAD,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AACtD,IAAI,MAAc,CAAC;AACnB,IAAI,eAAoB,CAAC;MASZ,sBAAsB,CAAA;AAiBjC,IAAA,WAAA,CAAoB,OAA6B,EAAA;AAA7B,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAsB;AAVjC,QAAA,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;AACjB,QAAA,IAAI,CAAA,IAAA,GAAG,OAAO,CAAC;AACf,QAAA,IAAK,CAAA,KAAA,GAAG,kEAAkE,CAAC;AAC3E,QAAA,IAAO,CAAA,OAAA,GAAG,OAAO,CAAC;AAGlC,QAAA,IAAG,CAAA,GAAA,GAAG,wCAAwC,CAAC;AAC/C,QAAA,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;AAChB,QAAA,IAAW,CAAA,WAAA,GAAG,EAAE,CAAC;KAEoC;IAErD,QAAQ,GAAA;QACN,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAC7C,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtG,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,gBAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;AAClB,aAAA;AAED,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,gBAAA,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;AACnB,aAAA;YAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;AACjD,gBAAA,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;AACrB,aAAA;AAED,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;gBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1C,gBAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;AACtB,oBAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC9B,iBAAA;AAED,gBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;AACvB,oBAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;AAChC,iBAAA;AACF,aAAA;AACF,SAAA;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhC,QAAA,IAAI,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,aAAa,EAAE;YAClD,IAAI,CAAC,MAAM,EAAE,CAAC;AACf,SAAA;KACF;IAED,WAAW,GAAA;QACT,aAAa,CAAC,eAAe,CAAC,CAAC;KAChC;AAED;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,KAAI;YACpD,MAAM,GAAG,OAAO,CAAC;AAEjB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,gBAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,GAAG,CAAW,QAAA,EAAA,OAAO,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AAC3E,aAAA;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;AACtB,SAAC,CAAC,CAAC;KACJ;AAED;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAEhE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnE,SAAA;KACF;AAED;;;AAGG;AACH,IAAA,QAAQ,CAAC,KAAK,EAAA;AACZ,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;AAC1B,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,SAAA;KACF;AAED;;;AAGG;AACH,IAAA,IAAI,CAAC,KAAK,EAAA;AACR,QAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACxB,aAAa,CAAC,eAAe,CAAC,CAAC;AAE/B,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;AAC5B,gBAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrE,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzC,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;gBACrB,IAAI,CAAC,MAAM,EAAE,CAAC;AACf,aAAA;AACF,SAAA;KACF;AAED;;AAEG;IACH,MAAM,GAAA;QACJ,MAAM,GAAG,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,kBAAkB,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;AAE7D,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAChC,CAAC,GAAG,KAAI;YACN,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,gBAAA,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;gBACrB,MAAM,OAAO,GAAG,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC;AAErD,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,YAAY,iBAAiB,EAAE;oBACjE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,GAAG,OAAO,CAAC;AAChD,iBAAA;AAAM,qBAAA;oBACL,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC;AAC1D,iBAAA;AACF,aAAA;SACF,EACD,CAAC,MAAM,KAAM,GAAC,CACf,CAAC;KACH;AAED;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;KAC5D;AAED;;AAEG;IACH,KAAK,GAAA;QACH,IAAI;AACF,YAAA,IAAI,MAAM,CAAC;AACX,YAAA,IAAI,MAAM,CAAC;AAEX,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,YAAY,iBAAiB,EAAE;gBACjE,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC;AACxD,gBAAA,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC5B,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;gBAC1C,MAAM,GAAG,UAAU,CAAC;AACrB,aAAA;AAED,YAAA,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACvC,SAAA;QAAC,OAAO,MAAM,EAAE,GAAE;KACpB;AAED;;;;AAIG;AACH,IAAA,cAAc,CAAC,MAAM,EAAA;AACnB,QAAA,OAAO,+CAA+C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACrE;AAED,IAAA,eAAe,CAAC,KAAU,EAAA;;AAExB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;AAE5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC;;QAG9C,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;;AAGzC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,CAAG,EAAA,MAAM,CAAC,MAAM,IAAI,CAAC;AACvE,SAAA;KACF;AAED;;;AAGG;AACH,IAAA,kBAAkB,CAAC,KAAa,GAAA,IAAI,EAAE,GAAG,GAAG,KAAK,EAAA;AAC/C,QAAA,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,eAAe,EAAE,CAAC;AACzB,SAAA;AAED,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QAElD,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AAC7C,YAAA,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACxC,YAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACtC,YAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACnC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,GAAG,EAAE;gBACP,OAAO;AACR,aAAA;AAED,YAAA,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACzC,YAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACrC,YAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;AACpC,SAAA;KACF;AAED;;;AAGG;IACH,QAAQ,GAAA;QACN,MAAM,IAAI,GAAG,CAAG,EAAA,UAAU,mBAAmB,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;AACzD,QAAA,IAAI,cAAc,CAAC;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;AAElC,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC9B,SAAA;AAAM,aAAA;YACL,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,YAAA,cAAc,GAAG,WAAW,CAAC,MAAK;gBAChC,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,aAAa,CAAC,cAAc,CAAC,CAAC;AAC/B,iBAAA;aACF,EAAE,GAAG,CAAC,CAAC;AACT,SAAA;KACF;IAED,gBAAgB,GAAA;QACd,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;YAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;AACvD,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzB,SAAA;KACF;IAED,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC;KACzD;;mHA7PU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,gfC1BnC,6jDAwDA,EAAA,MAAA,EAAA,CAAA,g+BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;2FD9Ba,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6jDAAA,EAAA,MAAA,EAAA,CAAA,g+BAAA,CAAA,EAAA,CAAA;wGAG1B,aAAa,EAAA,CAAA;sBAAjC,SAAS;uBAAC,QAAQ,CAAA;gBACG,cAAc,EAAA,CAAA;sBAAnC,SAAS;uBAAC,SAAS,CAAA;gBACE,cAAc,EAAA,CAAA;sBAAnC,SAAS;uBAAC,SAAS,CAAA;gBACJ,IAAI,EAAA,CAAA;sBAAnB,KAAK;gBACU,KAAK,EAAA,CAAA;sBAApB,KAAK;gBACU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,IAAI,EAAA,CAAA;sBAAnB,KAAK;gBACU,KAAK,EAAA,CAAA;sBAApB,KAAK;gBACU,OAAO,EAAA,CAAA;sBAAtB,KAAK;;;MEtBK,mBAAmB,CAAA;;gHAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;iHAAnB,mBAAmB,EAAA,YAAA,EAAA,CALf,sBAAsB,CAC3B,EAAA,OAAA,EAAA,CAAA,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAC3C,sBAAsB,CAAA,EAAA,CAAA,CAAA;iHAGrB,mBAAmB,EAAA,SAAA,EAFnB,CAAC,oBAAoB,CAAC,YAFvB,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAA,EAAA,CAAA,CAAA;2FAI1C,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,sBAAsB,CAAC;AACtC,oBAAA,OAAO,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC;oBACtD,OAAO,EAAE,CAAC,sBAAsB,CAAC;oBACjC,SAAS,EAAE,CAAC,oBAAoB,CAAC;iBAClC,CAAA;;;ACbD;;AAEG;;ACFH;;AAEG;;;;"}