ngx-gem-spaas
Version:
This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.
1 lines • 17.2 kB
Source Map (JSON)
{"version":3,"file":"ngx-gem-spaas-signalr.mjs","sources":["../../../projects/ngx-gem-spaas/signalr/src/_models/signalr.model.ts","../../../projects/ngx-gem-spaas/signalr/src/_services/signalr.service.ts","../../../projects/ngx-gem-spaas/signalr/src/signalr-state/signalr-state.component.ts","../../../projects/ngx-gem-spaas/signalr/src/signalr-state/signalr-state.component.html","../../../projects/ngx-gem-spaas/signalr/src/signalr.module.ts","../../../projects/ngx-gem-spaas/signalr/src/public-api.ts","../../../projects/ngx-gem-spaas/signalr/src/ngx-gem-spaas-signalr.ts"],"sourcesContent":["import {DateTime} from \"luxon\";\r\nimport {HubConnectionState} from \"@microsoft/signalr\";\r\n\r\n/**\r\n * SignalR state object provided by the signalrService.onNewState observable\r\n *\r\n * @property {HubConnectionState} state the actual state of the signalr hub connection\r\n * @property {string} message any additional info received from SignalR on state change events\r\n */\r\nexport class SignalrStateModel {\r\n state!: HubConnectionState;\r\n message: any;\r\n}\r\n\r\n/**\r\n * SignalR response object provided by the signalrService.onNewMessage observable\r\n *\r\n * @property {any} data the actual data received from the SignalR hub connection\r\n * @property {string} received the ISO timestamp of when the event was received\r\n * @property {string} type the type of the event, which matches the event name as given in the\r\n * SignalR configuration model via the signalrEvents list\r\n */\r\nexport class SignalrResponseModel {\r\n data: any;\r\n received: string;\r\n type: string = '';\r\n\r\n constructor(ts: string = '') {\r\n this.received = ts || DateTime.now().toISO();\r\n }\r\n\r\n}\r\n\r\nexport class SignalrSendModel {\r\n data: any;\r\n type: string = '';\r\n}\r\n\r\n/**\r\n * SignalR configuration object to be provided via \"forRoot\" method.\r\n *\r\n * @property {string} signalrUrl the URL of your SignalR hub\r\n * @property {string[]} signalrEvents the list of events to listen to on the SignalR hub\r\n */\r\nexport class SignalrConfigModel {\r\n signalrUrl: string = '';\r\n signalrEvents: string[] = [];\r\n\r\n constructor(props: any) {\r\n this.signalrEvents = props.signalrEvents || [''];\r\n this.signalrUrl = props.signalrUrl || '';\r\n }\r\n\r\n\r\n}\r\n","import {Inject, Injectable, Optional} from '@angular/core';\r\nimport * as signalr from '@microsoft/signalr';\r\nimport {RetryContext} from '@microsoft/signalr';\r\nimport {Observable, ReplaySubject} from \"rxjs\";\r\nimport {OktaService} from \"ngx-gem-spaas\";\r\nimport {SignalrConfigModel, SignalrResponseModel, SignalrSendModel, SignalrStateModel} from \"../_models/signalr.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SignalrService {\r\n\r\n signalrHubConnection!: signalr.HubConnection;\r\n signalrMsg$ = new ReplaySubject<SignalrResponseModel>(1);\r\n signalrState$ = new ReplaySubject<SignalrStateModel>(1);\r\n\r\n constructor(\r\n @Optional() @Inject(SignalrConfigModel) private readonly signalrConfig: SignalrConfigModel,\r\n private oktaService: OktaService,\r\n ) {\r\n if (!this.signalrConfig?.signalrUrl || !this.signalrConfig?.signalrEvents?.length) {\r\n throw new Error(\r\n 'please provide a valid SpaasSignalrConfigModel using the forRoot method of the SpaasSignalrModule'\r\n );\r\n }\r\n this.buildConnection();\r\n }\r\n\r\n private buildConnection(): void {\r\n this.signalrHubConnection = new signalr.HubConnectionBuilder()\r\n .withUrl(\r\n this.signalrConfig?.signalrUrl,\r\n {\r\n accessTokenFactory: () => this.oktaService.getCachedAccessToken(),\r\n // logger: new MyLogger(),\r\n withCredentials: false,\r\n }\r\n )\r\n .withAutomaticReconnect({\r\n nextRetryDelayInMilliseconds(retryContext: RetryContext): number | null {\r\n // divide by 30 seconds to increment more aggressively. Could be switched to 60 for less steep incrementing\r\n // floor at 2 seconds, cap at 2 minutes\r\n return Math.min(Math.max(Math.ceil(retryContext.elapsedMilliseconds / 30), 2000), 120000);\r\n }\r\n })\r\n .build();\r\n }\r\n\r\n startConnection(): void {\r\n this.signalrHubConnection.start()\r\n .then(() => {\r\n this.newState('signalr connected');\r\n this.listenToMessages();\r\n })\r\n .catch((error) => {\r\n this.newState('signalr failed to connect: ' + error);\r\n });\r\n }\r\n\r\n private listenToMessages(): void {\r\n // state related events\r\n this.signalrHubConnection.onclose((error) => {\r\n const errStr = error ? ' with error: ' + error : ' intentionally';\r\n this.newState('signalr closed' + errStr);\r\n });\r\n this.signalrHubConnection.onreconnecting((error) => {\r\n const errStr = error ? '. Reason for disconnect: ' + error : '';\r\n this.newState('signalr disconnected, starting reconnection process' + errStr);\r\n });\r\n this.signalrHubConnection.onreconnected(() => {\r\n this.newState('signalr reconnected successfully');\r\n });\r\n // user provided events\r\n for (const t of this.signalrConfig?.signalrEvents) {\r\n this.signalrHubConnection.on(t, (msg: any) => {\r\n const resp = new SignalrResponseModel();\r\n resp.type = t;\r\n resp.data = msg;\r\n this.signalrMsg$.next(resp);\r\n });\r\n }\r\n }\r\n\r\n stopConnection(): void {\r\n this.signalrHubConnection.stop()\r\n .then(() => {\r\n // no need to do anything, the \"onclose\" will fire\r\n })\r\n .catch((error) => {\r\n this.newState('signalr connection closing failed: ' + error);\r\n });\r\n }\r\n\r\n sendMessage(msg: SignalrSendModel): void {\r\n this.signalrHubConnection.invoke(msg.type, msg.data);\r\n }\r\n\r\n // ********************************************************************************************************\r\n // BROADCAST DATA\r\n // ********************************************************************************************************\r\n\r\n onNewMessage(): Observable<SignalrResponseModel> {\r\n return this.signalrMsg$.asObservable();\r\n }\r\n\r\n private newState(msg: any): void {\r\n this.signalrState$.next({\r\n state: this.signalrHubConnection?.state,\r\n message: msg || '',\r\n });\r\n }\r\n\r\n onNewState(): Observable<SignalrStateModel> {\r\n return this.signalrState$.asObservable();\r\n }\r\n\r\n}\r\n","import {Component, HostListener, Input, OnDestroy, OnInit} from '@angular/core';\r\nimport {SignalrService} from \"../_services/signalr.service\";\r\nimport {BaseComponent} from \"ngx-gem-spaas\";\r\nimport {takeUntil} from \"rxjs/operators\";\r\nimport {HubConnectionState} from \"@microsoft/signalr\";\r\n\r\n@Component({\r\n selector: 'spaas-signalr',\r\n styleUrls: ['./signalr-state.component.scss'],\r\n templateUrl: './signalr-state.component.html',\r\n})\r\n\r\n/**\r\n * This component creates the connection to the SignalR hub and\r\n * shows a state indicator in the bottom left corner of your app.\r\n * */\r\nexport class SignalrStateComponent extends BaseComponent implements OnInit, OnDestroy {\r\n\r\n @Input() fromBottomPx = 14;\r\n\r\n signalrActive = false;\r\n\r\n constructor(\r\n private signalrService: SignalrService,\r\n ) {\r\n super();\r\n this.getSignalrState();\r\n }\r\n\r\n @HostListener('window:focus', ['$event']) onFocus(): void {\r\n // ALSO CHECK IF TAB IS VISIBLE\r\n if (document.visibilityState !== 'hidden') {\r\n this.signalrConnect();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.signalrConnect();\r\n }\r\n\r\n override ngOnDestroy() {\r\n this.signalrService.stopConnection();\r\n super.ngOnDestroy()\r\n }\r\n\r\n // ********************************************************************************************************\r\n // LOADING DATA\r\n // ********************************************************************************************************\r\n\r\n // AUTOBAHN\r\n signalrConnect(): void {\r\n if (this.signalrService.signalrHubConnection?.state !== HubConnectionState.Connected) {\r\n this.signalrService.startConnection();\r\n } else {\r\n this.signalrActive = true;\r\n }\r\n }\r\n\r\n private getSignalrState(): void {\r\n this.signalrService.onNewState()\r\n .pipe(takeUntil(this.onDestroy$))\r\n .subscribe((state) => {\r\n this.signalrActive = state?.state === HubConnectionState.Connected;\r\n });\r\n }\r\n\r\n // ********************************************************************************************************\r\n // CHANGING DATA\r\n // ********************************************************************************************************\r\n\r\n // ********************************************************************************************************\r\n // UI\r\n // ********************************************************************************************************\r\n\r\n // EVENT LISTENERS\r\n\r\n // MISCELLANEOUS\r\n\r\n}\r\n","<div [class.nok]=\"!signalrActive\"\r\n [class.ok]=\"signalrActive\"\r\n [style.bottom.px]=\"fromBottomPx\"\r\n class=\"ws-state\"\r\n matTooltip=\"{{signalrActive ? 'live update OK' : 'live update NOK'}}\">\r\n</div>\r\n","import {ModuleWithProviders, NgModule} from \"@angular/core\";\r\nimport {MatTooltipModule} from \"@angular/material/tooltip\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {SignalrStateComponent} from \"./signalr-state/signalr-state.component\";\r\nimport {SignalrConfigModel} from \"./_models/signalr.model\";\r\n\r\n@NgModule({\r\n declarations: [\r\n SignalrStateComponent,\r\n ],\r\n exports: [\r\n SignalrStateComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatTooltipModule,\r\n ],\r\n providers: []\r\n})\r\nexport class SpaasSignalrModule {\r\n static forRoot(config: SignalrConfigModel): ModuleWithProviders<SpaasSignalrModule> {\r\n return {\r\n ngModule: SpaasSignalrModule,\r\n providers: [{provide: SignalrConfigModel, useValue: config}]\r\n };\r\n }\r\n}\r\n","// MODULE\r\nexport * from './signalr.module';\r\n\r\n// COMPONENTS\r\nexport * from './signalr-state/signalr-state.component';\r\n\r\n// SERVICES\r\nexport * from './_services/signalr.service';\r\n\r\n// MODELS AND CONSTANTS\r\nexport * from './_models/signalr.model';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SignalrService"],"mappings":";;;;;;;;;;;;;AAGA;;;;;AAKG;MACU,iBAAiB,CAAA;AAG7B,CAAA;AAED;;;;;;;AAOG;MACU,oBAAoB,CAAA;AAK/B,IAAA,WAAA,CAAY,KAAa,EAAE,EAAA;QAF3B,IAAI,CAAA,IAAA,GAAW,EAAE,CAAC;AAGhB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;KAC9C;AAEF,CAAA;MAEY,gBAAgB,CAAA;AAA7B,IAAA,WAAA,GAAA;QAEE,IAAI,CAAA,IAAA,GAAW,EAAE,CAAC;KACnB;AAAA,CAAA;AAED;;;;;AAKG;MACU,kBAAkB,CAAA;AAI7B,IAAA,WAAA,CAAY,KAAU,EAAA;QAHtB,IAAU,CAAA,UAAA,GAAW,EAAE,CAAC;QACxB,IAAa,CAAA,aAAA,GAAa,EAAE,CAAC;QAG3B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;KAC1C;AAGF;;MC5CY,cAAc,CAAA;IAMzB,WAC2D,CAAA,aAAiC,EAClF,WAAwB,EAAA;QADyB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAoB;QAClF,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;AALlC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,aAAa,CAAuB,CAAC,CAAC,CAAC;AACzD,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,aAAa,CAAoB,CAAC,CAAC,CAAC;AAMtD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE;AACjF,YAAA,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAC;SACH;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,OAAO,CAAC,oBAAoB,EAAE;AAC3D,aAAA,OAAO,CACN,IAAI,CAAC,aAAa,EAAE,UAAU,EAC9B;YACE,kBAAkB,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE;;AAEjE,YAAA,eAAe,EAAE,KAAK;SACvB,CACF;AACA,aAAA,sBAAsB,CAAC;AACtB,YAAA,4BAA4B,CAAC,YAA0B,EAAA;;;gBAGrD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;aAC3F;SACF,CAAC;AACD,aAAA,KAAK,EAAE,CAAC;KACZ;IAED,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;aAC9B,IAAI,CAAC,MAAK;AACT,YAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YACnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC1B,SAAC,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,KAAK,KAAI;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,6BAA6B,GAAG,KAAK,CAAC,CAAC;AACvD,SAAC,CAAC,CAAC;KACN;IAEO,gBAAgB,GAAA;;QAEtB,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC1C,YAAA,MAAM,MAAM,GAAG,KAAK,GAAG,eAAe,GAAG,KAAK,GAAG,gBAAgB,CAAC;AAClE,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,MAAM,CAAC,CAAC;AAC3C,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,KAAK,KAAI;AACjD,YAAA,MAAM,MAAM,GAAG,KAAK,GAAG,2BAA2B,GAAG,KAAK,GAAG,EAAE,CAAC;AAChE,YAAA,IAAI,CAAC,QAAQ,CAAC,qDAAqD,GAAG,MAAM,CAAC,CAAC;AAChF,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,MAAK;AAC3C,YAAA,IAAI,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;AACpD,SAAC,CAAC,CAAC;;QAEH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE;YACjD,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAQ,KAAI;AAC3C,gBAAA,MAAM,IAAI,GAAG,IAAI,oBAAoB,EAAE,CAAC;AACxC,gBAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,aAAC,CAAC,CAAC;SACJ;KACF;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE;aAC7B,IAAI,CAAC,MAAK;;AAEX,SAAC,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,KAAK,KAAI;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,qCAAqC,GAAG,KAAK,CAAC,CAAC;AAC/D,SAAC,CAAC,CAAC;KACN;AAED,IAAA,WAAW,CAAC,GAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;KACtD;;;;IAMD,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;KACxC;AAEO,IAAA,QAAQ,CAAC,GAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK;YACvC,OAAO,EAAE,GAAG,IAAI,EAAE;AACnB,SAAA,CAAC,CAAC;KACJ;IAED,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;KAC1C;AAxGU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,kBAOH,kBAAkB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAP7B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAQI,QAAQ;;0BAAI,MAAM;2BAAC,kBAAkB,CAAA;;;ACL1C;;;AAGK;AACC,MAAO,qBAAsB,SAAQ,aAAa,CAAA;AAMtD,IAAA,WAAA,CACU,cAA8B,EAAA;AAEtC,QAAA,KAAK,EAAE,CAAC;QAFA,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QAL/B,IAAY,CAAA,YAAA,GAAG,EAAE,CAAC;QAE3B,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QAMpB,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;IAEyC,OAAO,GAAA;;AAE/C,QAAA,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE;YACzC,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;KACF;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAEQ,WAAW,GAAA;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACrC,KAAK,CAAC,WAAW,EAAE,CAAA;KACpB;;;;;IAOD,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,KAAK,KAAK,kBAAkB,CAAC,SAAS,EAAE;AACpF,YAAA,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;SACvC;aAAM;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;KACF;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAC7B,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,IAAI,CAAC,aAAa,GAAG,KAAK,EAAE,KAAK,KAAK,kBAAkB,CAAC,SAAS,CAAC;AACrE,SAAC,CAAC,CAAC;KACN;+GAhDU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,kLChBlC,+OAMA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDUa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAVjC,SAAS;+BACE,eAAe,EAAA,QAAA,EAAA,+OAAA,EAAA,CAAA;gFAWhB,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAWoC,OAAO,EAAA,CAAA;sBAAhD,YAAY;uBAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAA;;;MEV7B,kBAAkB,CAAA;IAC7B,OAAO,OAAO,CAAC,MAA0B,EAAA;QACvC,OAAO;AACL,YAAA,QAAQ,EAAE,kBAAkB;YAC5B,SAAS,EAAE,CAAC,EAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC;SAC7D,CAAC;KACH;+GANU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAAlB,kBAAkB,EAAA,YAAA,EAAA,CAX3B,qBAAqB,CAAA,EAAA,OAAA,EAAA,CAMrB,YAAY;AACZ,YAAA,gBAAgB,aAJhB,qBAAqB,CAAA,EAAA,CAAA,CAAA,EAAA;AAQZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAL3B,YAAY;YACZ,gBAAgB,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAIP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAb9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,qBAAqB;AACtB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,qBAAqB;AACtB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;AACjB,qBAAA;AACD,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA,CAAA;;;AClBD;;ACAA;;AAEG;;;;"}