@tuki-io/tuki-widgets 0.0.219-dev.51 → 0.0.219-dev.53

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.
@@ -158,8 +158,12 @@ const API = {
158
158
  GET_ALL: "/api/webex/configuration/customers/:customerId/siteslocations",
159
159
  },
160
160
  SITE_MIGRATION: {
161
- MIGRATE_SITE: "/api/migration/webex/sites/:siteId/migrate",
161
+ MIGRATE_SITE: "/api/migration/WEBEX/sites/:siteId/migrate",
162
162
  BATCH_STATUS: "/api/migration/webex/customer/:customerId/batchesstatus",
163
+ // Pre-existing migration batches for the customer, matched to a site by
164
+ // siteId. Reachable through the same exHost/webex gateway as everything
165
+ // else in this service — no separate host needed.
166
+ GET_BATCH_SITES: "/api/e2emigration/batch/:customerId/Sites",
163
167
  },
164
168
  };
165
169
 
@@ -205,9 +209,13 @@ class LocationsService {
205
209
  const url = API.SITES_LOCATIONS.GET_ALL.replace(':customerId', String(customerId));
206
210
  return this.apiService.fetch(url).pipe(map((response) => (Array.isArray(response) ? response : []).map(toSiteLocation)));
207
211
  }
208
- migrateSite(siteId) {
212
+ migrateSite(siteId, batchId) {
209
213
  const url = API.SITE_MIGRATION.MIGRATE_SITE.replace(':siteId', String(siteId));
210
- return this.apiService.post(url, {}, { batchId: '' });
214
+ return this.apiService.post(url, {}, batchId != null ? { batchId } : {});
215
+ }
216
+ getBatchSites(customerId) {
217
+ const url = API.SITE_MIGRATION.GET_BATCH_SITES.replace(':customerId', String(customerId));
218
+ return this.apiService.fetch(url).pipe(map((response) => (Array.isArray(response) ? response : [])));
211
219
  }
212
220
  getMigrationBatchStatuses(customerId, batchIds) {
213
221
  const url = API.SITE_MIGRATION.BATCH_STATUS.replace(':customerId', String(customerId));
@@ -267,6 +275,7 @@ class LocationsComponent {
267
275
  ? new Intl.DisplayNames(['en'], { type: 'region' })
268
276
  : null;
269
277
  this.migrationIntervals = new Map();
278
+ this.batchIdBySiteId = new Map();
270
279
  // Same icon set as users-list's "Provisioning Type" column (assets/icons/webex.svg,
271
280
  // local_24.svg, di_cloud_24.svg).
272
281
  this.provisioningTypeIcons = {
@@ -279,6 +288,7 @@ class LocationsComponent {
279
288
  this.apiService.token = this.token;
280
289
  this.apiService.apiUrl = this.exHost + '/webex';
281
290
  this.loadSiteLocations();
291
+ this.loadBatchSites();
282
292
  }
283
293
  ngOnDestroy() {
284
294
  this.migrationIntervals.forEach(interval => clearInterval(interval));
@@ -288,7 +298,7 @@ class LocationsComponent {
288
298
  this.isLoading = true;
289
299
  this.locationsService.fetchSiteLocations(this.customerId).subscribe({
290
300
  next: (siteLocations) => {
291
- this.siteLocations = siteLocations;
301
+ this.siteLocations = this.applyBatchIds(siteLocations);
292
302
  this.isLoading = false;
293
303
  },
294
304
  error: () => {
@@ -296,6 +306,19 @@ class LocationsComponent {
296
306
  },
297
307
  });
298
308
  }
309
+ // Runs independently of loadSiteLocations() — whichever resolves second
310
+ // re-applies the merge, so batchId ends up set regardless of load order.
311
+ loadBatchSites() {
312
+ this.locationsService.getBatchSites(this.customerId).subscribe({
313
+ next: (batches) => {
314
+ this.batchIdBySiteId = new Map(batches.map(batch => [batch.siteId, batch.id]));
315
+ this.siteLocations = this.applyBatchIds(this.siteLocations);
316
+ },
317
+ });
318
+ }
319
+ applyBatchIds(rows) {
320
+ return rows.map(row => ({ ...row, batchId: this.batchIdBySiteId.get(row.site.id) }));
321
+ }
299
322
  get pendingLocations() {
300
323
  return this.siteLocations.filter(row => !!row.location?.hasPendingActions);
301
324
  }
@@ -449,7 +472,7 @@ class LocationsComponent {
449
472
  migrateSite(row) {
450
473
  const siteId = row.site.id;
451
474
  row.migrationStatus = 'IN_PROGRESS';
452
- this.locationsService.migrateSite(siteId).subscribe({
475
+ this.locationsService.migrateSite(siteId, row.batchId).subscribe({
453
476
  next: (batchId) => {
454
477
  if (batchId) {
455
478
  this.pollMigrationStatus(siteId, batchId);
@@ -511,7 +534,7 @@ class LocationsComponent {
511
534
  // concurrent poll's next tick doesn't land on a row that briefly lost it.
512
535
  mergeSiteLocations(fresh) {
513
536
  const inProgressSiteIds = new Set(this.siteLocations.filter(row => row.migrationStatus === 'IN_PROGRESS').map(row => row.site.id));
514
- this.siteLocations = fresh.map(row => inProgressSiteIds.has(row.site.id) && !row.location
537
+ this.siteLocations = this.applyBatchIds(fresh).map(row => inProgressSiteIds.has(row.site.id) && !row.location
515
538
  ? { ...row, migrationStatus: 'IN_PROGRESS' }
516
539
  : row);
517
540
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tuki-io-tuki-widgets-locations.mjs","sources":["../../../../projects/tuki/widgets/locations/src/material.module.ts","../../../../projects/tuki/widgets/locations/src/location-confirm-dialog/location-confirm-dialog.component.ts","../../../../projects/tuki/widgets/locations/src/location-confirm-dialog/location-confirm-dialog.component.html","../../../../projects/tuki/widgets/locations/src/services/api.service.ts","../../../../projects/tuki/widgets/locations/src/app.constants.ts","../../../../projects/tuki/widgets/locations/src/services/locations.service.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.component.html","../../../../projects/tuki/widgets/locations/src/locations.component.ts","../../../../projects/tuki/widgets/locations/src/locations.component.html","../../../../projects/tuki/widgets/locations/src/locations.module.ts","../../../../projects/tuki/widgets/locations/public-api.ts","../../../../projects/tuki/widgets/locations/tuki-io-tuki-widgets-locations.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@NgModule({\n imports: [\n MatButtonModule,\n MatDialogModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ],\n exports: [\n MatButtonModule,\n MatDialogModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ]\n})\nexport class MaterialModule { }\n","import { Component, Inject, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nexport interface LocationConfirmDialogData {\n title: string;\n message: string;\n confirmButtonText: string;\n}\n\n@Component({\n selector: 'tk-location-confirm-dialog',\n templateUrl: './location-confirm-dialog.component.html',\n styleUrls: ['./location-confirm-dialog.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class LocationConfirmDialogComponent {\n constructor(\n public dialogRef: MatDialogRef<LocationConfirmDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: LocationConfirmDialogData,\n ) { }\n\n onClose(result: boolean): void {\n this.dialogRef.close(result);\n }\n}\n","<div class=\"tk-location-confirm-dialog\" role=\"dialog\" aria-labelledby=\"tk-location-confirm-dialog-title\">\n <h3 id=\"tk-location-confirm-dialog-title\" class=\"tk-location-confirm-dialog__title\">{{ data.title }}</h3>\n <div mat-dialog-content class=\"tk-location-confirm-dialog__content\" [innerHTML]=\"data.message\"></div>\n <div mat-dialog-actions class=\"tk-location-confirm-dialog__actions\">\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\n Cancel\n </button>\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\n {{ data.confirmButtonText }}\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class APIService {\n token!: string;\n apiUrl!: string;\n\n constructor(\n private httpClient: HttpClient\n ) { }\n\n fetch(url: string, params?: any, cache?: boolean): Observable<any> {\n const headers = this.getHeaders(cache);\n params = params || {};\n return this.httpClient.get(this.apiUrl + url, { params: this.prepareEncodedParams(params), headers });\n }\n\n post(url: string, body: any, params = {}): Observable<any> {\n body = body || null;\n const headers = this.getHeaders();\n return this.httpClient.post(this.apiUrl + url, body, { params: this.prepareEncodedParams(params), headers });\n }\n\n put(url: string, body: any = null, params = {}): Observable<any> {\n const headers = this.getHeaders();\n return this.httpClient.put(this.apiUrl + url, body, { headers, params: this.prepareEncodedParams(params) });\n }\n\n delete(url: string, params = {}) {\n const headers = this.getHeaders();\n return this.httpClient.delete(this.apiUrl + url, { headers, params: this.prepareEncodedParams(params) });\n }\n\n private prepareEncodedParams(params: any) {\n const result: any = {};\n\n if (!params) {\n return {};\n }\n for (const key of Object.keys(params)) {\n if (params[key]) {\n const stringParam = params[key].toString();\n result[key] = stringParam.includes('+') ? encodeURIComponent(stringParam) : stringParam;\n }\n }\n return result;\n }\n\n private getHeaders(cache?: boolean): HttpHeaders {\n let headers = new HttpHeaders();\n if (cache) {\n headers = headers.append('_Cache', 'true ');\n }\n const token = this.token || this.getParameterByName('token');\n headers = headers.append('Authorization', 'Bearer ' + token);\n return headers;\n }\n\n private getParameterByName(name: any, url = window.location.href) {\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(url);\n if (!results) return null;\n if (!results[2]) return '';\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n}\n","export const API = {\n SITES_LOCATIONS: {\n // Returns every site for the customer paired with its mapped Control Hub\n // location (or null when the site hasn't been migrated yet) — this is the\n // source of truth for siteId, superseding the old LOCATIONS.GET_ALL\n // endpoint, which only listed already-mapped locations and exposed no siteId.\n GET_ALL: \"/api/webex/configuration/customers/:customerId/siteslocations\",\n },\n SITE_MIGRATION: {\n MIGRATE_SITE: \"/api/migration/webex/sites/:siteId/migrate\",\n BATCH_STATUS: \"/api/migration/webex/customer/:customerId/batchesstatus\",\n },\n};\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { API } from '../app.constants';\nimport { APIService } from './api.service';\nimport { Location, LocationAddress, Site, SiteLocation } from '../types/location';\n\nexport interface SiteBatchStatus {\n id: number;\n status: string;\n progress: number;\n migErrorsCount: string;\n}\n\nfunction toLocationAddress(raw: any): LocationAddress {\n return {\n address1: raw?.address1 || '',\n address2: raw?.address2 || '',\n city: raw?.city || '',\n state: raw?.state || '',\n postalCode: raw?.postalCode || '',\n country: raw?.country || '',\n countryName: raw?.countryName || raw?.country || '',\n };\n}\n\nfunction toLocation(raw: any): Location {\n return {\n id: String(raw?.id ?? ''),\n name: raw?.name || '',\n timeZone: raw?.timeZone || '',\n address: toLocationAddress(raw?.address),\n // Every location returned by this endpoint is a Webex Control Hub location.\n provisioningType: raw?.provisioningType || 'WEBEX',\n hasPendingActions: !!raw?.hasPendingActions,\n };\n}\n\nfunction toSite(raw: any): Site {\n return {\n id: Number(raw?.id),\n name: raw?.name || '',\n };\n}\n\nfunction toSiteLocation(raw: any): SiteLocation {\n return {\n site: toSite(raw?.site),\n location: raw?.location ? toLocation(raw.location) : null,\n };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocationsService {\n constructor(private apiService: APIService) { }\n\n fetchSiteLocations(customerId: number): Observable<SiteLocation[]> {\n const url = API.SITES_LOCATIONS.GET_ALL.replace(':customerId', String(customerId));\n return this.apiService.fetch(url).pipe(\n map((response: any) => (Array.isArray(response) ? response : []).map(toSiteLocation)),\n );\n }\n\n migrateSite(siteId: number): Observable<number> {\n const url = API.SITE_MIGRATION.MIGRATE_SITE.replace(':siteId', String(siteId));\n return this.apiService.post(url, {}, { batchId: '' });\n }\n\n getMigrationBatchStatuses(customerId: number, batchIds: number[]): Observable<SiteBatchStatus[]> {\n const url = API.SITE_MIGRATION.BATCH_STATUS.replace(':customerId', String(customerId));\n return this.apiService.post(url, batchIds);\n }\n}\n","import { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './app-loader.component.html',\n styleUrls: ['./app-loader.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppLoaderComponent {\n constructor() {\n }\n\n}\n","<div class=\"overlay\">\n <mat-progress-spinner\n class=\"page-spinner\"\n mode=\"indeterminate\"\n [diameter]=\"70\"\n strokeWidth=\"3\"></mat-progress-spinner>\n</div>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { APIService } from './services/api.service';\nimport { LocationsService, SiteBatchStatus } from './services/locations.service';\nimport { LocationConfirmDialogComponent } from './location-confirm-dialog/location-confirm-dialog.component';\nimport { LocationMigrationStatus, SiteLocation } from './types/location';\n\nconst MIGRATION_POLL_INTERVAL_MS = 10000;\n\ntype LocationsSortDirection = 'asc' | 'desc';\ntype MappedFilterValue = '' | 'mapped' | 'unmapped';\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50];\n\n@Component({\n selector: 'tk-locations',\n templateUrl: './locations.component.html',\n styleUrls: ['./locations.component.scss'],\n})\nexport class LocationsComponent implements OnInit, OnDestroy {\n @Input() exHost!: string;\n @Input() token!: string;\n @Input() customerId!: number;\n\n @Output() openLocation = new EventEmitter<string>();\n @Output() editLocation = new EventEmitter<string>();\n @Output() removeLocation = new EventEmitter<string>();\n @Output() addLocation = new EventEmitter<void>();\n @Output() importLocations = new EventEmitter<void>();\n\n // Every site for the customer, each paired with its mapped Control Hub\n // location or null — the siteslocations API returns the full, unpaged list,\n // so search/filter/sort/pagination below all run client-side over this.\n siteLocations: SiteLocation[] = [];\n isLoading = false;\n\n searchTerm = '';\n sortDirection: LocationsSortDirection = 'asc';\n isBannerDismissed = false;\n\n readonly pageSizeOptions = PAGE_SIZE_OPTIONS;\n pageIndex = 0;\n pageSize = PAGE_SIZE_OPTIONS[0];\n\n isFilterPanelOpen = false;\n filters = {\n country: '',\n pendingActions: '',\n mapped: '' as MappedFilterValue,\n };\n\n private readonly countryDisplayNames = typeof Intl !== 'undefined' && 'DisplayNames' in Intl\n ? new Intl.DisplayNames(['en'], { type: 'region' })\n : null;\n\n private readonly migrationIntervals = new Map<number, ReturnType<typeof setInterval>>();\n\n constructor(\n private apiService: APIService,\n private locationsService: LocationsService,\n private dialog: MatDialog,\n ) { }\n\n ngOnInit(): void {\n this.apiService.token = this.token;\n this.apiService.apiUrl = this.exHost + '/webex';\n this.loadSiteLocations();\n }\n\n ngOnDestroy(): void {\n this.migrationIntervals.forEach(interval => clearInterval(interval));\n this.migrationIntervals.clear();\n }\n\n private loadSiteLocations(): void {\n this.isLoading = true;\n this.locationsService.fetchSiteLocations(this.customerId).subscribe({\n next: (siteLocations) => {\n this.siteLocations = siteLocations;\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n },\n });\n }\n\n get pendingLocations(): SiteLocation[] {\n return this.siteLocations.filter(row => !!row.location?.hasPendingActions);\n }\n\n get showPendingBanner(): boolean {\n return !this.isBannerDismissed && this.pendingLocations.length > 0;\n }\n\n get countries(): string[] {\n return Array.from(new Set(this.siteLocations.map(row => this.countryLabel(row)).filter(Boolean))).sort();\n }\n\n get filteredRows(): SiteLocation[] {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = this.siteLocations.filter(row =>\n (!term ||\n this.rowName(row).toLowerCase().includes(term) ||\n this.addressLine(row).toLowerCase().includes(term) ||\n (row.location?.address?.city || '').toLowerCase().includes(term) ||\n (row.location?.address?.state || '').toLowerCase().includes(term) ||\n this.countryLabel(row).toLowerCase().includes(term)) &&\n (!this.filters.country || this.countryLabel(row) === this.filters.country) &&\n (!this.filters.pendingActions || String(!!row.location?.hasPendingActions) === this.filters.pendingActions) &&\n (!this.filters.mapped || (this.filters.mapped === 'mapped' ? this.isMapped(row) : !this.isMapped(row)))\n );\n\n return filtered.sort((a, b) => {\n const comparison = this.rowName(a).localeCompare(this.rowName(b));\n return this.sortDirection === 'asc' ? comparison : -comparison;\n });\n }\n\n get pagedRows(): SiteLocation[] {\n const start = this.pageIndex * this.pageSize;\n return this.filteredRows.slice(start, start + this.pageSize);\n }\n\n get totalElements(): number {\n return this.filteredRows.length;\n }\n\n get pageRangeLabel(): string {\n if (!this.totalElements) {\n return '0 of 0';\n }\n const start = this.pageIndex * this.pageSize + 1;\n const end = Math.min(this.totalElements, start + this.pagedRows.length - 1);\n return `${start} – ${end} of ${this.totalElements}`;\n }\n\n get hasPreviousPage(): boolean {\n return this.pageIndex > 0;\n }\n\n get hasNextPage(): boolean {\n return (this.pageIndex + 1) * this.pageSize < this.totalElements;\n }\n\n rowName(row: SiteLocation): string {\n return row.site.name;\n }\n\n isMapped(row: SiteLocation): boolean {\n return !!row.location;\n }\n\n addressLine(row: SiteLocation): string {\n if (!row.location) {\n return '';\n }\n return [row.location.address.address1, row.location.address.address2, row.location.address.city]\n .filter(Boolean)\n .join(' - ');\n }\n\n countryLabel(row: SiteLocation): string {\n if (!row.location) {\n return '';\n }\n const { countryName, country } = row.location.address;\n if (countryName) {\n return countryName;\n }\n if (!country) {\n return '';\n }\n return this.countryDisplayNames?.of(country) || country;\n }\n\n // Same icon set as users-list's \"Provisioning Type\" column (assets/icons/webex.svg,\n // local_24.svg, di_cloud_24.svg).\n private readonly provisioningTypeIcons: Record<string, { src: string; tooltip: string }> = {\n WEBEX: { src: 'assets/icons/webex.svg', tooltip: 'Webex Calling' },\n UCM: { src: 'assets/icons/local_24.svg', tooltip: 'UCM' },\n DI: { src: 'assets/icons/di_cloud_24.svg', tooltip: 'Webex Calling DI' },\n };\n\n provisioningTypeIcon(row: SiteLocation): { src: string; tooltip: string } | null {\n if (!row.location) {\n return null;\n }\n return this.provisioningTypeIcons[row.location.provisioningType] || null;\n }\n\n onSearchInputChange(event: Event): void {\n this.searchTerm = (event.target as HTMLInputElement).value;\n this.pageIndex = 0;\n }\n\n toggleNameSort(): void {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n }\n\n dismissBanner(): void {\n this.isBannerDismissed = true;\n }\n\n toggleFilterPanel(): void {\n this.isFilterPanelOpen = !this.isFilterPanelOpen;\n }\n\n closeFilterPanel(): void {\n this.isFilterPanelOpen = false;\n }\n\n onFilterChange(): void {\n this.pageIndex = 0;\n }\n\n clearFilters(): void {\n this.filters = { country: '', pendingActions: '', mapped: '' };\n this.pageIndex = 0;\n }\n\n onPageSizeChange(event: Event): void {\n this.pageSize = Number((event.target as HTMLSelectElement).value);\n this.pageIndex = 0;\n }\n\n goToPreviousPage(): void {\n if (this.hasPreviousPage) {\n this.pageIndex--;\n }\n }\n\n goToNextPage(): void {\n if (this.hasNextPage) {\n this.pageIndex++;\n }\n }\n\n onOpenLocation(row: SiteLocation): void {\n if (row.location) {\n this.openLocation.emit(row.location.id);\n }\n }\n\n onEditLocation(row: SiteLocation): void {\n if (row.location) {\n this.editLocation.emit(row.location.id);\n }\n }\n\n onRemoveLocation(row: SiteLocation): void {\n if (row.location) {\n this.removeLocation.emit(row.location.id);\n }\n }\n\n canMigrateSite(row: SiteLocation): boolean {\n return row.migrationStatus !== 'IN_PROGRESS';\n }\n\n onMigrateSite(row: SiteLocation): void {\n const dialogRef = this.dialog.open(LocationConfirmDialogComponent, {\n panelClass: 'tk-location-confirm-dialog-panel',\n backdropClass: 'tk-location-confirm-dialog-backdrop',\n data: {\n title: `Migrate ${row.site.name}?`,\n message: `<p>Are you sure you want to migrate <em>${row.site.name}</em> site?</p>`,\n confirmButtonText: 'Yes, migrate',\n },\n });\n\n dialogRef.afterClosed().subscribe(confirmed => {\n if (confirmed) {\n this.migrateSite(row);\n }\n });\n }\n\n private migrateSite(row: SiteLocation): void {\n const siteId = row.site.id;\n row.migrationStatus = 'IN_PROGRESS';\n this.locationsService.migrateSite(siteId).subscribe({\n next: (batchId: number) => {\n if (batchId) {\n this.pollMigrationStatus(siteId, batchId);\n } else {\n this.onMigrationComplete(siteId);\n }\n },\n error: () => {\n this.setMigrationStatus(siteId, 'FAILED');\n },\n });\n }\n\n private pollMigrationStatus(siteId: number, batchId: number): void {\n this.clearMigrationInterval(siteId);\n\n const poll = (): void => {\n this.locationsService.getMigrationBatchStatuses(this.customerId, [batchId]).subscribe({\n next: (statuses: SiteBatchStatus[]) => {\n const status = statuses.find(item => item.id === batchId);\n if (!status || status.status === 'In Progress') {\n return;\n }\n this.clearMigrationInterval(siteId);\n if (status.status === 'Completed') {\n this.onMigrationComplete(siteId);\n } else {\n this.setMigrationStatus(siteId, 'FAILED');\n }\n },\n error: () => {\n this.clearMigrationInterval(siteId);\n this.setMigrationStatus(siteId, 'FAILED');\n },\n });\n };\n\n poll();\n this.migrationIntervals.set(siteId, setInterval(poll, MIGRATION_POLL_INTERVAL_MS));\n }\n\n // Looks the row up by siteId (rather than closing over a row reference) so\n // status updates still land on whatever object is currently in\n // siteLocations, even after loadSiteLocations()/mergeSiteLocations() below\n // have replaced the array with freshly-fetched row objects.\n private setMigrationStatus(siteId: number, status: LocationMigrationStatus): void {\n const row = this.siteLocations.find(item => item.site.id === siteId);\n if (row) {\n row.migrationStatus = status;\n }\n }\n\n // The migrate/batch-status APIs don't return the newly created location's\n // details, so re-fetch to pick up its mapping, address, timezone, etc.\n private onMigrationComplete(siteId: number): void {\n this.setMigrationStatus(siteId, 'COMPLETED');\n this.locationsService.fetchSiteLocations(this.customerId).subscribe({\n next: (fresh) => this.mergeSiteLocations(fresh),\n });\n }\n\n // Preserves the IN_PROGRESS status of any other site still migrating so a\n // concurrent poll's next tick doesn't land on a row that briefly lost it.\n private mergeSiteLocations(fresh: SiteLocation[]): void {\n const inProgressSiteIds = new Set(\n this.siteLocations.filter(row => row.migrationStatus === 'IN_PROGRESS').map(row => row.site.id)\n );\n this.siteLocations = fresh.map(row =>\n inProgressSiteIds.has(row.site.id) && !row.location\n ? { ...row, migrationStatus: 'IN_PROGRESS' as const }\n : row\n );\n }\n\n private clearMigrationInterval(siteId: number): void {\n const interval = this.migrationIntervals.get(siteId);\n if (interval) {\n clearInterval(interval);\n this.migrationIntervals.delete(siteId);\n }\n }\n\n onAddLocation(): void {\n this.addLocation.emit();\n }\n\n onImportLocations(): void {\n this.importLocations.emit();\n }\n\n exportLocations(): void {\n const rows = this.filteredRows.map(row => [\n row.site.name,\n this.addressLine(row),\n this.countryLabel(row),\n this.isMapped(row) ? 'Mapped' : 'Not mapped',\n ]);\n const csvLines = [\n ['Location Name', 'Address', 'Country/Region', 'Mapping Status'],\n ...rows,\n ].map(row => row.map(cell => `\"${String(cell).replace(/\"/g, '\"\"')}\"`).join(','));\n\n const blob = new Blob([csvLines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'locations.csv';\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n","<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ totalElements }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Mapping</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" (click)=\"onOpenLocation(row)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(row)\">{{ row.site.name }}</a>\n </td>\n <td>{{ addressLine(row) || '—' }}</td>\n <td>{{ countryLabel(row) || '—' }}</td>\n <td>\n <span class=\"tk-locations__mapping-badge\" [class.tk-locations__mapping-badge--mapped]=\"isMapped(row)\">\n {{ isMapped(row) ? 'Mapped' : 'Not mapped' }}\n </span>\n </td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(row) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>—</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <mat-progress-spinner\n *ngIf=\"row.migrationStatus === 'IN_PROGRESS'\"\n class=\"tk-locations__row-action-spinner\"\n [diameter]=\"20\"\n strokeWidth=\"2\"\n mode=\"indeterminate\"\n matTooltip=\"Migrating site…\">\n </mat-progress-spinner>\n <button\n *ngIf=\"row.migrationStatus !== 'IN_PROGRESS'\"\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onOpenLocation(row)\">View details</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onEditLocation(row)\">Edit location</button>\n <button\n *ngIf=\"canMigrateSite(row)\"\n mat-menu-item\n type=\"button\"\n (click)=\"onMigrateSite(row)\">Migrate site</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onRemoveLocation(row)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!pagedRows.length\">\n <td colspan=\"6\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-mapped\">Mapping</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-mapped\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.mapped\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option value=\"mapped\">Mapped</option>\n <option value=\"unmapped\">Not mapped</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\" (change)=\"onFilterChange()\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { FormsModule } from '@angular/forms';\nimport { MaterialModule } from './material.module';\nimport { LocationsComponent } from './locations.component';\nimport { LocationConfirmDialogComponent } from './location-confirm-dialog/location-confirm-dialog.component';\nimport { AppLoaderComponent } from './utils/app-loader/app-loader';\n\n@NgModule({\n declarations: [\n LocationsComponent,\n LocationConfirmDialogComponent,\n AppLoaderComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n MaterialModule,\n ],\n exports: [\n LocationsComponent,\n ],\n})\nexport class LocationsModule { }\n","/*\n * Public API Surface of @tuki-io/tuki-widgets\n */\n\n// Widget Modules\nexport * from './src/locations.module';\n\n// Components\nexport * from './src/locations.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.APIService","i2.LocationsService","i3","i9","i11.AppLoaderComponent"],"mappings":"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"}
1
+ {"version":3,"file":"tuki-io-tuki-widgets-locations.mjs","sources":["../../../../projects/tuki/widgets/locations/src/material.module.ts","../../../../projects/tuki/widgets/locations/src/location-confirm-dialog/location-confirm-dialog.component.ts","../../../../projects/tuki/widgets/locations/src/location-confirm-dialog/location-confirm-dialog.component.html","../../../../projects/tuki/widgets/locations/src/services/api.service.ts","../../../../projects/tuki/widgets/locations/src/app.constants.ts","../../../../projects/tuki/widgets/locations/src/services/locations.service.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.component.html","../../../../projects/tuki/widgets/locations/src/locations.component.ts","../../../../projects/tuki/widgets/locations/src/locations.component.html","../../../../projects/tuki/widgets/locations/src/locations.module.ts","../../../../projects/tuki/widgets/locations/public-api.ts","../../../../projects/tuki/widgets/locations/tuki-io-tuki-widgets-locations.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@NgModule({\n imports: [\n MatButtonModule,\n MatDialogModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ],\n exports: [\n MatButtonModule,\n MatDialogModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ]\n})\nexport class MaterialModule { }\n","import { Component, Inject, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nexport interface LocationConfirmDialogData {\n title: string;\n message: string;\n confirmButtonText: string;\n}\n\n@Component({\n selector: 'tk-location-confirm-dialog',\n templateUrl: './location-confirm-dialog.component.html',\n styleUrls: ['./location-confirm-dialog.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class LocationConfirmDialogComponent {\n constructor(\n public dialogRef: MatDialogRef<LocationConfirmDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: LocationConfirmDialogData,\n ) { }\n\n onClose(result: boolean): void {\n this.dialogRef.close(result);\n }\n}\n","<div class=\"tk-location-confirm-dialog\" role=\"dialog\" aria-labelledby=\"tk-location-confirm-dialog-title\">\n <h3 id=\"tk-location-confirm-dialog-title\" class=\"tk-location-confirm-dialog__title\">{{ data.title }}</h3>\n <div mat-dialog-content class=\"tk-location-confirm-dialog__content\" [innerHTML]=\"data.message\"></div>\n <div mat-dialog-actions class=\"tk-location-confirm-dialog__actions\">\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\n Cancel\n </button>\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\n {{ data.confirmButtonText }}\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class APIService {\n token!: string;\n apiUrl!: string;\n\n constructor(\n private httpClient: HttpClient\n ) { }\n\n fetch(url: string, params?: any, cache?: boolean): Observable<any> {\n const headers = this.getHeaders(cache);\n params = params || {};\n return this.httpClient.get(this.apiUrl + url, { params: this.prepareEncodedParams(params), headers });\n }\n\n post(url: string, body: any, params = {}): Observable<any> {\n body = body || null;\n const headers = this.getHeaders();\n return this.httpClient.post(this.apiUrl + url, body, { params: this.prepareEncodedParams(params), headers });\n }\n\n put(url: string, body: any = null, params = {}): Observable<any> {\n const headers = this.getHeaders();\n return this.httpClient.put(this.apiUrl + url, body, { headers, params: this.prepareEncodedParams(params) });\n }\n\n delete(url: string, params = {}) {\n const headers = this.getHeaders();\n return this.httpClient.delete(this.apiUrl + url, { headers, params: this.prepareEncodedParams(params) });\n }\n\n private prepareEncodedParams(params: any) {\n const result: any = {};\n\n if (!params) {\n return {};\n }\n for (const key of Object.keys(params)) {\n if (params[key]) {\n const stringParam = params[key].toString();\n result[key] = stringParam.includes('+') ? encodeURIComponent(stringParam) : stringParam;\n }\n }\n return result;\n }\n\n private getHeaders(cache?: boolean): HttpHeaders {\n let headers = new HttpHeaders();\n if (cache) {\n headers = headers.append('_Cache', 'true ');\n }\n const token = this.token || this.getParameterByName('token');\n headers = headers.append('Authorization', 'Bearer ' + token);\n return headers;\n }\n\n private getParameterByName(name: any, url = window.location.href) {\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(url);\n if (!results) return null;\n if (!results[2]) return '';\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n}\n","export const API = {\n SITES_LOCATIONS: {\n // Returns every site for the customer paired with its mapped Control Hub\n // location (or null when the site hasn't been migrated yet) — this is the\n // source of truth for siteId, superseding the old LOCATIONS.GET_ALL\n // endpoint, which only listed already-mapped locations and exposed no siteId.\n GET_ALL: \"/api/webex/configuration/customers/:customerId/siteslocations\",\n },\n SITE_MIGRATION: {\n MIGRATE_SITE: \"/api/migration/WEBEX/sites/:siteId/migrate\",\n BATCH_STATUS: \"/api/migration/webex/customer/:customerId/batchesstatus\",\n // Pre-existing migration batches for the customer, matched to a site by\n // siteId. Reachable through the same exHost/webex gateway as everything\n // else in this service — no separate host needed.\n GET_BATCH_SITES: \"/api/e2emigration/batch/:customerId/Sites\",\n },\n};\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { API } from '../app.constants';\nimport { APIService } from './api.service';\nimport { Location, LocationAddress, Site, SiteLocation } from '../types/location';\n\nexport interface SiteBatchStatus {\n id: number;\n status: string;\n progress: number;\n migErrorsCount: string;\n}\n\n// Minimal shape of the site-batch entries from GET_BATCH_SITES — only the\n// fields needed to match a batch to a site.\nexport interface SiteMigrationBatch {\n id: number;\n siteId: number;\n}\n\nfunction toLocationAddress(raw: any): LocationAddress {\n return {\n address1: raw?.address1 || '',\n address2: raw?.address2 || '',\n city: raw?.city || '',\n state: raw?.state || '',\n postalCode: raw?.postalCode || '',\n country: raw?.country || '',\n countryName: raw?.countryName || raw?.country || '',\n };\n}\n\nfunction toLocation(raw: any): Location {\n return {\n id: String(raw?.id ?? ''),\n name: raw?.name || '',\n timeZone: raw?.timeZone || '',\n address: toLocationAddress(raw?.address),\n // Every location returned by this endpoint is a Webex Control Hub location.\n provisioningType: raw?.provisioningType || 'WEBEX',\n hasPendingActions: !!raw?.hasPendingActions,\n };\n}\n\nfunction toSite(raw: any): Site {\n return {\n id: Number(raw?.id),\n name: raw?.name || '',\n };\n}\n\nfunction toSiteLocation(raw: any): SiteLocation {\n return {\n site: toSite(raw?.site),\n location: raw?.location ? toLocation(raw.location) : null,\n };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocationsService {\n constructor(private apiService: APIService) { }\n\n fetchSiteLocations(customerId: number): Observable<SiteLocation[]> {\n const url = API.SITES_LOCATIONS.GET_ALL.replace(':customerId', String(customerId));\n return this.apiService.fetch(url).pipe(\n map((response: any) => (Array.isArray(response) ? response : []).map(toSiteLocation)),\n );\n }\n\n migrateSite(siteId: number, batchId?: number): Observable<number> {\n const url = API.SITE_MIGRATION.MIGRATE_SITE.replace(':siteId', String(siteId));\n return this.apiService.post(url, {}, batchId != null ? { batchId } : {});\n }\n\n getBatchSites(customerId: number): Observable<SiteMigrationBatch[]> {\n const url = API.SITE_MIGRATION.GET_BATCH_SITES.replace(':customerId', String(customerId));\n return this.apiService.fetch(url).pipe(\n map((response: any) => (Array.isArray(response) ? response : [])),\n );\n }\n\n getMigrationBatchStatuses(customerId: number, batchIds: number[]): Observable<SiteBatchStatus[]> {\n const url = API.SITE_MIGRATION.BATCH_STATUS.replace(':customerId', String(customerId));\n return this.apiService.post(url, batchIds);\n }\n}\n","import { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './app-loader.component.html',\n styleUrls: ['./app-loader.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppLoaderComponent {\n constructor() {\n }\n\n}\n","<div class=\"overlay\">\n <mat-progress-spinner\n class=\"page-spinner\"\n mode=\"indeterminate\"\n [diameter]=\"70\"\n strokeWidth=\"3\"></mat-progress-spinner>\n</div>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { APIService } from './services/api.service';\nimport { LocationsService, SiteBatchStatus, SiteMigrationBatch } from './services/locations.service';\nimport { LocationConfirmDialogComponent } from './location-confirm-dialog/location-confirm-dialog.component';\nimport { LocationMigrationStatus, SiteLocation } from './types/location';\n\nconst MIGRATION_POLL_INTERVAL_MS = 10000;\n\ntype LocationsSortDirection = 'asc' | 'desc';\ntype MappedFilterValue = '' | 'mapped' | 'unmapped';\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50];\n\n@Component({\n selector: 'tk-locations',\n templateUrl: './locations.component.html',\n styleUrls: ['./locations.component.scss'],\n})\nexport class LocationsComponent implements OnInit, OnDestroy {\n @Input() exHost!: string;\n @Input() token!: string;\n @Input() customerId!: number;\n\n @Output() openLocation = new EventEmitter<string>();\n @Output() editLocation = new EventEmitter<string>();\n @Output() removeLocation = new EventEmitter<string>();\n @Output() addLocation = new EventEmitter<void>();\n @Output() importLocations = new EventEmitter<void>();\n\n // Every site for the customer, each paired with its mapped Control Hub\n // location or null — the siteslocations API returns the full, unpaged list,\n // so search/filter/sort/pagination below all run client-side over this.\n siteLocations: SiteLocation[] = [];\n isLoading = false;\n\n searchTerm = '';\n sortDirection: LocationsSortDirection = 'asc';\n isBannerDismissed = false;\n\n readonly pageSizeOptions = PAGE_SIZE_OPTIONS;\n pageIndex = 0;\n pageSize = PAGE_SIZE_OPTIONS[0];\n\n isFilterPanelOpen = false;\n filters = {\n country: '',\n pendingActions: '',\n mapped: '' as MappedFilterValue,\n };\n\n private readonly countryDisplayNames = typeof Intl !== 'undefined' && 'DisplayNames' in Intl\n ? new Intl.DisplayNames(['en'], { type: 'region' })\n : null;\n\n private readonly migrationIntervals = new Map<number, ReturnType<typeof setInterval>>();\n private batchIdBySiteId = new Map<number, number>();\n\n constructor(\n private apiService: APIService,\n private locationsService: LocationsService,\n private dialog: MatDialog,\n ) { }\n\n ngOnInit(): void {\n this.apiService.token = this.token;\n this.apiService.apiUrl = this.exHost + '/webex';\n this.loadSiteLocations();\n this.loadBatchSites();\n }\n\n ngOnDestroy(): void {\n this.migrationIntervals.forEach(interval => clearInterval(interval));\n this.migrationIntervals.clear();\n }\n\n private loadSiteLocations(): void {\n this.isLoading = true;\n this.locationsService.fetchSiteLocations(this.customerId).subscribe({\n next: (siteLocations) => {\n this.siteLocations = this.applyBatchIds(siteLocations);\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n },\n });\n }\n\n // Runs independently of loadSiteLocations() — whichever resolves second\n // re-applies the merge, so batchId ends up set regardless of load order.\n private loadBatchSites(): void {\n this.locationsService.getBatchSites(this.customerId).subscribe({\n next: (batches: SiteMigrationBatch[]) => {\n this.batchIdBySiteId = new Map(batches.map(batch => [batch.siteId, batch.id]));\n this.siteLocations = this.applyBatchIds(this.siteLocations);\n },\n });\n }\n\n private applyBatchIds(rows: SiteLocation[]): SiteLocation[] {\n return rows.map(row => ({ ...row, batchId: this.batchIdBySiteId.get(row.site.id) }));\n }\n\n get pendingLocations(): SiteLocation[] {\n return this.siteLocations.filter(row => !!row.location?.hasPendingActions);\n }\n\n get showPendingBanner(): boolean {\n return !this.isBannerDismissed && this.pendingLocations.length > 0;\n }\n\n get countries(): string[] {\n return Array.from(new Set(this.siteLocations.map(row => this.countryLabel(row)).filter(Boolean))).sort();\n }\n\n get filteredRows(): SiteLocation[] {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = this.siteLocations.filter(row =>\n (!term ||\n this.rowName(row).toLowerCase().includes(term) ||\n this.addressLine(row).toLowerCase().includes(term) ||\n (row.location?.address?.city || '').toLowerCase().includes(term) ||\n (row.location?.address?.state || '').toLowerCase().includes(term) ||\n this.countryLabel(row).toLowerCase().includes(term)) &&\n (!this.filters.country || this.countryLabel(row) === this.filters.country) &&\n (!this.filters.pendingActions || String(!!row.location?.hasPendingActions) === this.filters.pendingActions) &&\n (!this.filters.mapped || (this.filters.mapped === 'mapped' ? this.isMapped(row) : !this.isMapped(row)))\n );\n\n return filtered.sort((a, b) => {\n const comparison = this.rowName(a).localeCompare(this.rowName(b));\n return this.sortDirection === 'asc' ? comparison : -comparison;\n });\n }\n\n get pagedRows(): SiteLocation[] {\n const start = this.pageIndex * this.pageSize;\n return this.filteredRows.slice(start, start + this.pageSize);\n }\n\n get totalElements(): number {\n return this.filteredRows.length;\n }\n\n get pageRangeLabel(): string {\n if (!this.totalElements) {\n return '0 of 0';\n }\n const start = this.pageIndex * this.pageSize + 1;\n const end = Math.min(this.totalElements, start + this.pagedRows.length - 1);\n return `${start} – ${end} of ${this.totalElements}`;\n }\n\n get hasPreviousPage(): boolean {\n return this.pageIndex > 0;\n }\n\n get hasNextPage(): boolean {\n return (this.pageIndex + 1) * this.pageSize < this.totalElements;\n }\n\n rowName(row: SiteLocation): string {\n return row.site.name;\n }\n\n isMapped(row: SiteLocation): boolean {\n return !!row.location;\n }\n\n addressLine(row: SiteLocation): string {\n if (!row.location) {\n return '';\n }\n return [row.location.address.address1, row.location.address.address2, row.location.address.city]\n .filter(Boolean)\n .join(' - ');\n }\n\n countryLabel(row: SiteLocation): string {\n if (!row.location) {\n return '';\n }\n const { countryName, country } = row.location.address;\n if (countryName) {\n return countryName;\n }\n if (!country) {\n return '';\n }\n return this.countryDisplayNames?.of(country) || country;\n }\n\n // Same icon set as users-list's \"Provisioning Type\" column (assets/icons/webex.svg,\n // local_24.svg, di_cloud_24.svg).\n private readonly provisioningTypeIcons: Record<string, { src: string; tooltip: string }> = {\n WEBEX: { src: 'assets/icons/webex.svg', tooltip: 'Webex Calling' },\n UCM: { src: 'assets/icons/local_24.svg', tooltip: 'UCM' },\n DI: { src: 'assets/icons/di_cloud_24.svg', tooltip: 'Webex Calling DI' },\n };\n\n provisioningTypeIcon(row: SiteLocation): { src: string; tooltip: string } | null {\n if (!row.location) {\n return null;\n }\n return this.provisioningTypeIcons[row.location.provisioningType] || null;\n }\n\n onSearchInputChange(event: Event): void {\n this.searchTerm = (event.target as HTMLInputElement).value;\n this.pageIndex = 0;\n }\n\n toggleNameSort(): void {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n }\n\n dismissBanner(): void {\n this.isBannerDismissed = true;\n }\n\n toggleFilterPanel(): void {\n this.isFilterPanelOpen = !this.isFilterPanelOpen;\n }\n\n closeFilterPanel(): void {\n this.isFilterPanelOpen = false;\n }\n\n onFilterChange(): void {\n this.pageIndex = 0;\n }\n\n clearFilters(): void {\n this.filters = { country: '', pendingActions: '', mapped: '' };\n this.pageIndex = 0;\n }\n\n onPageSizeChange(event: Event): void {\n this.pageSize = Number((event.target as HTMLSelectElement).value);\n this.pageIndex = 0;\n }\n\n goToPreviousPage(): void {\n if (this.hasPreviousPage) {\n this.pageIndex--;\n }\n }\n\n goToNextPage(): void {\n if (this.hasNextPage) {\n this.pageIndex++;\n }\n }\n\n onOpenLocation(row: SiteLocation): void {\n if (row.location) {\n this.openLocation.emit(row.location.id);\n }\n }\n\n onEditLocation(row: SiteLocation): void {\n if (row.location) {\n this.editLocation.emit(row.location.id);\n }\n }\n\n onRemoveLocation(row: SiteLocation): void {\n if (row.location) {\n this.removeLocation.emit(row.location.id);\n }\n }\n\n canMigrateSite(row: SiteLocation): boolean {\n return row.migrationStatus !== 'IN_PROGRESS';\n }\n\n onMigrateSite(row: SiteLocation): void {\n const dialogRef = this.dialog.open(LocationConfirmDialogComponent, {\n panelClass: 'tk-location-confirm-dialog-panel',\n backdropClass: 'tk-location-confirm-dialog-backdrop',\n data: {\n title: `Migrate ${row.site.name}?`,\n message: `<p>Are you sure you want to migrate <em>${row.site.name}</em> site?</p>`,\n confirmButtonText: 'Yes, migrate',\n },\n });\n\n dialogRef.afterClosed().subscribe(confirmed => {\n if (confirmed) {\n this.migrateSite(row);\n }\n });\n }\n\n private migrateSite(row: SiteLocation): void {\n const siteId = row.site.id;\n row.migrationStatus = 'IN_PROGRESS';\n this.locationsService.migrateSite(siteId, row.batchId).subscribe({\n next: (batchId: number) => {\n if (batchId) {\n this.pollMigrationStatus(siteId, batchId);\n } else {\n this.onMigrationComplete(siteId);\n }\n },\n error: () => {\n this.setMigrationStatus(siteId, 'FAILED');\n },\n });\n }\n\n private pollMigrationStatus(siteId: number, batchId: number): void {\n this.clearMigrationInterval(siteId);\n\n const poll = (): void => {\n this.locationsService.getMigrationBatchStatuses(this.customerId, [batchId]).subscribe({\n next: (statuses: SiteBatchStatus[]) => {\n const status = statuses.find(item => item.id === batchId);\n if (!status || status.status === 'In Progress') {\n return;\n }\n this.clearMigrationInterval(siteId);\n if (status.status === 'Completed') {\n this.onMigrationComplete(siteId);\n } else {\n this.setMigrationStatus(siteId, 'FAILED');\n }\n },\n error: () => {\n this.clearMigrationInterval(siteId);\n this.setMigrationStatus(siteId, 'FAILED');\n },\n });\n };\n\n poll();\n this.migrationIntervals.set(siteId, setInterval(poll, MIGRATION_POLL_INTERVAL_MS));\n }\n\n // Looks the row up by siteId (rather than closing over a row reference) so\n // status updates still land on whatever object is currently in\n // siteLocations, even after loadSiteLocations()/mergeSiteLocations() below\n // have replaced the array with freshly-fetched row objects.\n private setMigrationStatus(siteId: number, status: LocationMigrationStatus): void {\n const row = this.siteLocations.find(item => item.site.id === siteId);\n if (row) {\n row.migrationStatus = status;\n }\n }\n\n // The migrate/batch-status APIs don't return the newly created location's\n // details, so re-fetch to pick up its mapping, address, timezone, etc.\n private onMigrationComplete(siteId: number): void {\n this.setMigrationStatus(siteId, 'COMPLETED');\n this.locationsService.fetchSiteLocations(this.customerId).subscribe({\n next: (fresh) => this.mergeSiteLocations(fresh),\n });\n }\n\n // Preserves the IN_PROGRESS status of any other site still migrating so a\n // concurrent poll's next tick doesn't land on a row that briefly lost it.\n private mergeSiteLocations(fresh: SiteLocation[]): void {\n const inProgressSiteIds = new Set(\n this.siteLocations.filter(row => row.migrationStatus === 'IN_PROGRESS').map(row => row.site.id)\n );\n this.siteLocations = this.applyBatchIds(fresh).map(row =>\n inProgressSiteIds.has(row.site.id) && !row.location\n ? { ...row, migrationStatus: 'IN_PROGRESS' as const }\n : row\n );\n }\n\n private clearMigrationInterval(siteId: number): void {\n const interval = this.migrationIntervals.get(siteId);\n if (interval) {\n clearInterval(interval);\n this.migrationIntervals.delete(siteId);\n }\n }\n\n onAddLocation(): void {\n this.addLocation.emit();\n }\n\n onImportLocations(): void {\n this.importLocations.emit();\n }\n\n exportLocations(): void {\n const rows = this.filteredRows.map(row => [\n row.site.name,\n this.addressLine(row),\n this.countryLabel(row),\n this.isMapped(row) ? 'Mapped' : 'Not mapped',\n ]);\n const csvLines = [\n ['Location Name', 'Address', 'Country/Region', 'Mapping Status'],\n ...rows,\n ].map(row => row.map(cell => `\"${String(cell).replace(/\"/g, '\"\"')}\"`).join(','));\n\n const blob = new Blob([csvLines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'locations.csv';\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n","<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ totalElements }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Mapping</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" (click)=\"onOpenLocation(row)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(row)\">{{ row.site.name }}</a>\n </td>\n <td>{{ addressLine(row) || '—' }}</td>\n <td>{{ countryLabel(row) || '—' }}</td>\n <td>\n <span class=\"tk-locations__mapping-badge\" [class.tk-locations__mapping-badge--mapped]=\"isMapped(row)\">\n {{ isMapped(row) ? 'Mapped' : 'Not mapped' }}\n </span>\n </td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(row) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>—</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <mat-progress-spinner\n *ngIf=\"row.migrationStatus === 'IN_PROGRESS'\"\n class=\"tk-locations__row-action-spinner\"\n [diameter]=\"20\"\n strokeWidth=\"2\"\n mode=\"indeterminate\"\n matTooltip=\"Migrating site…\">\n </mat-progress-spinner>\n <button\n *ngIf=\"row.migrationStatus !== 'IN_PROGRESS'\"\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onOpenLocation(row)\">View details</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onEditLocation(row)\">Edit location</button>\n <button\n *ngIf=\"canMigrateSite(row)\"\n mat-menu-item\n type=\"button\"\n (click)=\"onMigrateSite(row)\">Migrate site</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onRemoveLocation(row)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!pagedRows.length\">\n <td colspan=\"6\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-mapped\">Mapping</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-mapped\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.mapped\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option value=\"mapped\">Mapped</option>\n <option value=\"unmapped\">Not mapped</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\" (change)=\"onFilterChange()\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { FormsModule } from '@angular/forms';\nimport { MaterialModule } from './material.module';\nimport { LocationsComponent } from './locations.component';\nimport { LocationConfirmDialogComponent } from './location-confirm-dialog/location-confirm-dialog.component';\nimport { AppLoaderComponent } from './utils/app-loader/app-loader';\n\n@NgModule({\n declarations: [\n LocationsComponent,\n LocationConfirmDialogComponent,\n AppLoaderComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n MaterialModule,\n ],\n exports: [\n LocationsComponent,\n ],\n})\nexport class LocationsModule { }\n","/*\n * Public API Surface of @tuki-io/tuki-widgets\n */\n\n// Widget Modules\nexport * from './src/locations.module';\n\n// Components\nexport * from './src/locations.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.APIService","i2.LocationsService","i3","i9","i11.AppLoaderComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;MA0Ba,cAAc,CAAA;;4GAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAd,cAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAhBvB,eAAe;QACf,eAAe;QACf,aAAa;QACb,aAAa;QACb,wBAAwB;AACxB,QAAA,gBAAgB,aAGhB,eAAe;QACf,eAAe;QACf,aAAa;QACb,aAAa;QACb,wBAAwB;QACxB,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAGP,cAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAhBvB,eAAe;QACf,eAAe;QACf,aAAa;QACb,aAAa;QACb,wBAAwB;AACxB,QAAA,gBAAgB,EAGhB,eAAe;QACf,eAAe;QACf,aAAa;QACb,aAAa;QACb,wBAAwB;QACxB,gBAAgB,CAAA,EAAA,CAAA,CAAA;4FAGP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAlB1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,aAAa;wBACb,wBAAwB;wBACxB,gBAAgB;AACjB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,aAAa;wBACb,wBAAwB;wBACxB,gBAAgB;AACjB,qBAAA;AACF,iBAAA,CAAA;;;MCVY,8BAA8B,CAAA;IACzC,WACS,CAAA,SAAuD,EAC9B,IAA+B,EAAA;QADxD,IAAS,CAAA,SAAA,GAAT,SAAS,CAA8C;QAC9B,IAAI,CAAA,IAAA,GAAJ,IAAI,CAA2B;KAC5D;AAEL,IAAA,OAAO,CAAC,MAAe,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC9B;;AARU,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,8CAG/B,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAHd,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,kECf3C,+xBAYA,EAAA,MAAA,EAAA,CAAA,6jCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4FDGa,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;+BACE,4BAA4B,EAAA,aAAA,EAGvB,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,+xBAAA,EAAA,MAAA,EAAA,CAAA,6jCAAA,CAAA,EAAA,CAAA;;0BAKlC,MAAM;2BAAC,eAAe,CAAA;;;MEXd,UAAU,CAAA;AAIrB,IAAA,WAAA,CACU,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;KAC3B;AAEL,IAAA,KAAK,CAAC,GAAW,EAAE,MAAY,EAAE,KAAe,EAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACvC,QAAA,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;KACvG;AAED,IAAA,IAAI,CAAC,GAAW,EAAE,IAAS,EAAE,MAAM,GAAG,EAAE,EAAA;AACtC,QAAA,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;AACpB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;KAC9G;IAED,GAAG,CAAC,GAAW,EAAE,IAAA,GAAY,IAAI,EAAE,MAAM,GAAG,EAAE,EAAA;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC7G;AAED,IAAA,MAAM,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC1G;AAEO,IAAA,oBAAoB,CAAC,MAAW,EAAA;QACtC,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACrC,YAAA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;gBACf,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AACzF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AAEO,IAAA,UAAU,CAAC,KAAe,EAAA;AAChC,QAAA,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,KAAK,EAAE;YACT,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC7C,SAAA;AACD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;AAC7D,QAAA,OAAO,OAAO,CAAC;KAChB;IAEO,kBAAkB,CAAC,IAAS,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAA;QAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,mBAAmB,CAAC,EACzD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE,CAAC;AAC3B,QAAA,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;KAC3D;;wGA9DU,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAV,UAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA,CAAA;4FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACNM,MAAM,GAAG,GAAG;AACjB,IAAA,eAAe,EAAE;;;;;AAKf,QAAA,OAAO,EAAE,+DAA+D;AACzE,KAAA;AACD,IAAA,cAAc,EAAE;AACd,QAAA,YAAY,EAAE,4CAA4C;AAC1D,QAAA,YAAY,EAAE,yDAAyD;;;;AAIvE,QAAA,eAAe,EAAE,2CAA2C;AAC7D,KAAA;CACF;;ACKD,SAAS,iBAAiB,CAAC,GAAQ,EAAA;IACjC,OAAO;AACL,QAAA,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,EAAE;AAC7B,QAAA,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,EAAE;AAC7B,QAAA,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;AACrB,QAAA,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;AACvB,QAAA,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE;AACjC,QAAA,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,EAAE;QAC3B,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ,EAAA;IAC1B,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;AACzB,QAAA,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;AACrB,QAAA,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,EAAE;AAC7B,QAAA,OAAO,EAAE,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC;;AAExC,QAAA,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,IAAI,OAAO;AAClD,QAAA,iBAAiB,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,GAAQ,EAAA;IACtB,OAAO;AACL,QAAA,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;AACnB,QAAA,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAQ,EAAA;IAC9B,OAAO;AACL,QAAA,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;AACvB,QAAA,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI;KAC1D,CAAC;AACJ,CAAC;MAKY,gBAAgB,CAAA;AAC3B,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;KAAK;AAE/C,IAAA,kBAAkB,CAAC,UAAkB,EAAA;AACnC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACnF,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CACpC,GAAG,CAAC,CAAC,QAAa,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CACtF,CAAC;KACH;IAED,WAAW,CAAC,MAAc,EAAE,OAAgB,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,IAAI,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;KAC1E;AAED,IAAA,aAAa,CAAC,UAAkB,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAC1F,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CACpC,GAAG,CAAC,CAAC,QAAa,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,CAClE,CAAC;KACH;IAED,yBAAyB,CAAC,UAAkB,EAAE,QAAkB,EAAA;AAC9D,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;KAC5C;;8GAzBU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,gBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCrDY,kBAAkB,CAAA;AAC7B,IAAA,WAAA,GAAA;KACC;;gHAFU,kBAAkB,EAAA,IAAA,EAAA,EAAA,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,SAAA,EAAA,IAAA,EAAA,kBAAkB,kDCR/B,0LAOA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4FDCa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,YAAY,EAAA,aAAA,EAGP,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,0LAAA,EAAA,MAAA,EAAA,CAAA,qKAAA,CAAA,EAAA,CAAA;;;AECvC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAKzC,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;MAO1B,kBAAkB,CAAA;AAuC7B,IAAA,WAAA,CACU,UAAsB,EACtB,gBAAkC,EAClC,MAAiB,EAAA;QAFjB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAW;AArCjB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAU,CAAC;AAC1C,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAU,CAAC;AAC1C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAU,CAAC;AAC5C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAQ,CAAC;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAQ,CAAC;;;;QAKrD,IAAa,CAAA,aAAA,GAAmB,EAAE,CAAC;QACnC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAElB,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;QAChB,IAAa,CAAA,aAAA,GAA2B,KAAK,CAAC;QAC9C,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAEjB,IAAe,CAAA,eAAA,GAAG,iBAAiB,CAAC;QAC7C,IAAS,CAAA,SAAA,GAAG,CAAC,CAAC;AACd,QAAA,IAAA,CAAA,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAEhC,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAA,CAAA,OAAO,GAAG;AACR,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,MAAM,EAAE,EAAuB;SAChC,CAAC;QAEe,IAAmB,CAAA,mBAAA,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,cAAc,IAAI,IAAI;AAC1F,cAAE,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;cACjD,IAAI,CAAC;AAEQ,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,GAAG,EAA0C,CAAC;AAChF,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;;;AA2InC,QAAA,IAAA,CAAA,qBAAqB,GAAqD;YACzF,KAAK,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,OAAO,EAAE,eAAe,EAAE;YAClE,GAAG,EAAE,EAAE,GAAG,EAAE,2BAA2B,EAAE,OAAO,EAAE,KAAK,EAAE;YACzD,EAAE,EAAE,EAAE,GAAG,EAAE,8BAA8B,EAAE,OAAO,EAAE,kBAAkB,EAAE;SACzE,CAAC;KAzIG;IAEL,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QAChD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrE,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;KACjC;IAEO,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;AAClE,YAAA,IAAI,EAAE,CAAC,aAAa,KAAI;gBACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;AACvD,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB;AACF,SAAA,CAAC,CAAC;KACJ;;;IAIO,cAAc,GAAA;QACpB,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;AAC7D,YAAA,IAAI,EAAE,CAAC,OAA6B,KAAI;gBACtC,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aAC7D;AACF,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,aAAa,CAAC,IAAoB,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;KACtF;AAED,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;KAC5E;AAED,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;KACpE;AAED,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KAC1G;AAED,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,IAC5C,CAAC,CAAC,IAAI;AACJ,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAClD,YAAA,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAChE,YAAA,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AACrD,aAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;aACzE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;AAC3G,aAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CACxG,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC5B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,YAAA,OAAO,IAAI,CAAC,aAAa,KAAK,KAAK,GAAG,UAAU,GAAG,CAAC,UAAU,CAAC;AACjE,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,IAAI,SAAS,GAAA;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC7C,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC9D;AAED,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;KACjC;AAED,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,OAAO,QAAQ,CAAC;AACjB,SAAA;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAA,EAAG,KAAK,CAAM,GAAA,EAAA,GAAG,OAAO,IAAI,CAAC,aAAa,CAAA,CAAE,CAAC;KACrD;AAED,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;KAC3B;AAED,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;KAClE;AAED,IAAA,OAAO,CAAC,GAAiB,EAAA;AACvB,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;KACtB;AAED,IAAA,QAAQ,CAAC,GAAiB,EAAA;AACxB,QAAA,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;KACvB;AAED,IAAA,WAAW,CAAC,GAAiB,EAAA;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;aAC7F,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,KAAK,CAAC,CAAC;KAChB;AAED,IAAA,YAAY,CAAC,GAAiB,EAAA;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;AACtD,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,WAAW,CAAC;AACpB,SAAA;QACD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;QACD,OAAO,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;KACzD;AAUD,IAAA,oBAAoB,CAAC,GAAiB,EAAA;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;KAC1E;AAED,IAAA,mBAAmB,CAAC,KAAY,EAAA;QAC9B,IAAI,CAAC,UAAU,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;KACpB;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;KACpE;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;KAC/B;IAED,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAClD;IAED,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;KAChC;IAED,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;KACpB;IAED,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;KACpB;AAED,IAAA,gBAAgB,CAAC,KAAY,EAAA;QAC3B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAE,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;KACpB;IAED,gBAAgB,GAAA;QACd,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,SAAA;KACF;IAED,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,SAAA;KACF;AAED,IAAA,cAAc,CAAC,GAAiB,EAAA;QAC9B,IAAI,GAAG,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzC,SAAA;KACF;AAED,IAAA,cAAc,CAAC,GAAiB,EAAA;QAC9B,IAAI,GAAG,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzC,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,GAAiB,EAAA;QAChC,IAAI,GAAG,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3C,SAAA;KACF;AAED,IAAA,cAAc,CAAC,GAAiB,EAAA;AAC9B,QAAA,OAAO,GAAG,CAAC,eAAe,KAAK,aAAa,CAAC;KAC9C;AAED,IAAA,aAAa,CAAC,GAAiB,EAAA;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;AACjE,YAAA,UAAU,EAAE,kCAAkC;AAC9C,YAAA,aAAa,EAAE,qCAAqC;AACpD,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,CAAW,QAAA,EAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAG,CAAA,CAAA;AAClC,gBAAA,OAAO,EAAE,CAA2C,wCAAA,EAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAiB,eAAA,CAAA;AAClF,gBAAA,iBAAiB,EAAE,cAAc;AAClC,aAAA;AACF,SAAA,CAAC,CAAC;QAEH,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,SAAS,IAAG;AAC5C,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACvB,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,WAAW,CAAC,GAAiB,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,QAAA,GAAG,CAAC,eAAe,GAAG,aAAa,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AAC/D,YAAA,IAAI,EAAE,CAAC,OAAe,KAAI;AACxB,gBAAA,IAAI,OAAO,EAAE;AACX,oBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3C,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAClC,iBAAA;aACF;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aAC3C;AACF,SAAA,CAAC,CAAC;KACJ;IAEO,mBAAmB,CAAC,MAAc,EAAE,OAAe,EAAA;AACzD,QAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,IAAI,GAAG,MAAW;AACtB,YAAA,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACpF,gBAAA,IAAI,EAAE,CAAC,QAA2B,KAAI;AACpC,oBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;oBAC1D,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE;wBAC9C,OAAO;AACR,qBAAA;AACD,oBAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACpC,oBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE;AACjC,wBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAClC,qBAAA;AAAM,yBAAA;AACL,wBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3C,qBAAA;iBACF;gBACD,KAAK,EAAE,MAAK;AACV,oBAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACpC,oBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;iBAC3C;AACF,aAAA,CAAC,CAAC;AACL,SAAC,CAAC;AAEF,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC,CAAC;KACpF;;;;;IAMO,kBAAkB,CAAC,MAAc,EAAE,MAA+B,EAAA;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AACrE,QAAA,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC;AAC9B,SAAA;KACF;;;AAIO,IAAA,mBAAmB,CAAC,MAAc,EAAA;AACxC,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;YAClE,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChD,SAAA,CAAC,CAAC;KACJ;;;AAIO,IAAA,kBAAkB,CAAC,KAAqB,EAAA;AAC9C,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAChG,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,IACpD,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ;cAC/C,EAAE,GAAG,GAAG,EAAE,eAAe,EAAE,aAAsB,EAAE;cACnD,GAAG,CACR,CAAC;KACH;AAEO,IAAA,sBAAsB,CAAC,MAAc,EAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrD,QAAA,IAAI,QAAQ,EAAE;YACZ,aAAa,CAAC,QAAQ,CAAC,CAAC;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACxC,SAAA;KACF;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;KACzB;IAED,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;KAC7B;IAED,eAAe,GAAA;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI;YACxC,GAAG,CAAC,IAAI,CAAC,IAAI;AACb,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,YAAY;AAC7C,SAAA,CAAC,CAAC;AACH,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,CAAC,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;AAChE,YAAA,GAAG,IAAI;AACR,SAAA,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEjF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAClF,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;KAC1B;;gHArYU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,SAAA,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,SAAA,EAAA,IAAA,EAAA,kBAAkB,uSCnB/B,kqUA0OA,EAAA,MAAA,EAAA,CAAA,k3PAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,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,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,4LAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FDvNa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACE,cAAc,EAAA,QAAA,EAAA,kqUAAA,EAAA,MAAA,EAAA,CAAA,k3PAAA,CAAA,EAAA,CAAA;kJAKf,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAEI,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,cAAc,EAAA,CAAA;sBAAvB,MAAM;gBACG,WAAW,EAAA,CAAA;sBAApB,MAAM;gBACG,eAAe,EAAA,CAAA;sBAAxB,MAAM;;;MEHI,eAAe,CAAA;;6GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,iBAdxB,kBAAkB;QAClB,8BAA8B;AAC9B,QAAA,kBAAkB,aAGlB,YAAY;QACZ,gBAAgB;QAChB,WAAW;AACX,QAAA,cAAc,aAGd,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAGT,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YATxB,YAAY;QACZ,gBAAgB;QAChB,WAAW;QACX,cAAc,CAAA,EAAA,CAAA,CAAA;4FAML,eAAe,EAAA,UAAA,EAAA,CAAA;kBAhB3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,kBAAkB;wBAClB,8BAA8B;wBAC9B,kBAAkB;AACnB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,WAAW;wBACX,cAAc;AACf,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,kBAAkB;AACnB,qBAAA;AACF,iBAAA,CAAA;;;ACxBD;;AAEG;AAEH;;ACJA;;AAEG;;;;"}