@tuki-io/tuki-widgets 0.0.126 → 0.0.128

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.
Files changed (86) hide show
  1. package/contact-center/cc-readiness/cc-readiness.module.d.ts +19 -0
  2. package/contact-center/cc-readiness/cc-readiness.service.d.ts +12 -0
  3. package/contact-center/cc-readiness/components/card/card.component.d.ts +6 -0
  4. package/contact-center/cc-readiness/types/cc-readiness.d.ts +20 -0
  5. package/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.d.ts +52 -0
  6. package/contact-center/cc-readiness/widgets/summary-grid/summary-grid.component.d.ts +26 -0
  7. package/contact-center/index.d.ts +5 -0
  8. package/contact-center/public-api.d.ts +3 -0
  9. package/contact-center/shared/api.endpoints.d.ts +6 -0
  10. package/contact-center/shared/api.service.d.ts +20 -0
  11. package/contact-center/shared/material.module.d.ts +15 -0
  12. package/contact-center/shared/shared.module.d.ts +10 -0
  13. package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +71 -0
  14. package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +35 -0
  15. package/esm2020/contact-center/cc-readiness/components/card/card.component.mjs +13 -0
  16. package/esm2020/contact-center/cc-readiness/types/cc-readiness.mjs +5 -0
  17. package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +187 -0
  18. package/esm2020/contact-center/cc-readiness/widgets/summary-grid/summary-grid.component.mjs +47 -0
  19. package/esm2020/contact-center/public-api.mjs +4 -0
  20. package/esm2020/contact-center/shared/api.endpoints.mjs +7 -0
  21. package/esm2020/contact-center/shared/api.service.mjs +86 -0
  22. package/esm2020/contact-center/shared/material.module.mjs +76 -0
  23. package/esm2020/contact-center/shared/shared.module.mjs +33 -0
  24. package/esm2020/contact-center/tuki-io-tuki-widgets-contact-center.mjs +5 -0
  25. package/esm2020/di2mt/shared/services/api.service.mjs +1 -1
  26. package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
  27. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
  28. package/esm2020/user-device-manage/src/app.constants.mjs +4 -2
  29. package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +34 -0
  30. package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +11 -5
  31. package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +34 -13
  32. package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
  33. package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +26 -0
  34. package/esm2020/user-device-manage/src/services/user.service.mjs +69 -1
  35. package/esm2020/user-device-manage/src/shared/tk-page-section/page-section.component.mjs +1 -1
  36. package/esm2020/user-device-manage/src/user-device-manage.module.mjs +5 -2
  37. package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
  38. package/esm2020/user-manage/src/app.constants.mjs +5 -1
  39. package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
  40. package/esm2020/user-manage/src/classes/line-directory.mjs +3 -2
  41. package/esm2020/user-manage/src/classes/line.mjs +1 -1
  42. package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
  43. package/esm2020/user-manage/src/device-list/device-list.component.mjs +4 -3
  44. package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
  45. package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
  46. package/esm2020/user-manage/src/services/user.service.mjs +46 -4
  47. package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
  48. package/esm2020/user-manage/src/user-manage-widget.component.mjs +18 -7
  49. package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
  50. package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
  51. package/esm2020/users-list/src/users-list.component.mjs +7 -3
  52. package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
  53. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +433 -0
  54. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -0
  55. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +4 -4
  56. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  57. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +172 -23
  58. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  59. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +77 -21
  60. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  61. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +8 -4
  62. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  63. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +430 -0
  64. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -0
  65. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +4 -4
  66. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  67. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +177 -23
  68. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  69. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +80 -21
  70. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  71. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +8 -4
  72. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  73. package/package.json +9 -1
  74. package/user-device-manage/src/app.constants.d.ts +2 -0
  75. package/user-device-manage/src/classes/deviceProfile.d.ts +24 -0
  76. package/user-device-manage/src/device-info/device-info.component.d.ts +4 -1
  77. package/user-device-manage/src/device-manage-widget.component.d.ts +6 -2
  78. package/user-device-manage/src/pipes/mac-address.pipe.d.ts +7 -0
  79. package/user-device-manage/src/services/user.service.d.ts +10 -0
  80. package/user-device-manage/src/user-device-manage.module.d.ts +8 -7
  81. package/user-manage/src/app.constants.d.ts +4 -0
  82. package/user-manage/src/classes/line-association-interface.d.ts +1 -0
  83. package/user-manage/src/classes/line-directory.d.ts +1 -0
  84. package/user-manage/src/classes/line.d.ts +1 -0
  85. package/user-manage/src/services/user.service.d.ts +3 -1
  86. package/user-manage/src/user-manage-widget.component.d.ts +2 -1
@@ -0,0 +1,19 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./widgets/licences-requirement/licences-requirement.component";
3
+ import * as i2 from "./widgets/summary-grid/summary-grid.component";
4
+ import * as i3 from "./components/card/card.component";
5
+ import * as i4 from "@angular/common";
6
+ import * as i5 from "@angular/common/http";
7
+ import * as i6 from "ng-apexcharts";
8
+ import * as i7 from "@angular/material/table";
9
+ import * as i8 from "@angular/material/button";
10
+ import * as i9 from "@angular/material/checkbox";
11
+ import * as i10 from "@angular/material/select";
12
+ import * as i11 from "@angular/material/progress-spinner";
13
+ import * as i12 from "@angular/material/core";
14
+ import * as i13 from "@angular/material/paginator";
15
+ export declare class CcReadinessModule {
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<CcReadinessModule, never>;
17
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CcReadinessModule, [typeof i1.LicencesRequirementComponent, typeof i2.SummaryGridComponent, typeof i3.CardComponent], [typeof i4.CommonModule, typeof i5.HttpClientModule, typeof i6.NgApexchartsModule, typeof i7.MatTableModule, typeof i8.MatButtonModule, typeof i9.MatCheckboxModule, typeof i10.MatSelectModule, typeof i11.MatProgressSpinnerModule, typeof i12.MatOptionModule, typeof i13.MatPaginatorModule, typeof i10.MatSelectModule], [typeof i1.LicencesRequirementComponent, typeof i2.SummaryGridComponent]>;
18
+ static ɵinj: i0.ɵɵInjectorDeclaration<CcReadinessModule>;
19
+ }
@@ -0,0 +1,12 @@
1
+ import { UccxServerEntityStats, WebexLicenseUsageSummary } from './types/cc-readiness';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export declare class CcReadinessService {
5
+ private readonly api;
6
+ constructor();
7
+ fetchUccxServerEntityStats(customerId: number): Observable<UccxServerEntityStats[]>;
8
+ fetchWebexLicenseUsageSummary(customerId: number): Observable<WebexLicenseUsageSummary[]>;
9
+ setToken(token: string): void;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<CcReadinessService, never>;
11
+ static ɵprov: i0.ɵɵInjectableDeclaration<CcReadinessService>;
12
+ }
@@ -0,0 +1,6 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class CardComponent {
3
+ title: string;
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<CardComponent, never>;
5
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent, "tk-card", never, { "title": "title"; }, {}, never, ["card-content"], false, never>;
6
+ }
@@ -0,0 +1,20 @@
1
+ export type EntityType = 'applications' | 'triggers' | 'contactServiceQueues' | 'resources' | 'resourceGroups' | 'skills' | 'xml' | 'scripts' | 'audioPrompts' | 'teams' | 'phonebooks' | 'wrapUpCodes';
2
+ export interface UccxServerEntityStats {
3
+ uccxIp: string;
4
+ counts: {
5
+ [key in EntityType]: number;
6
+ };
7
+ }
8
+ export interface WebexLicenseFeatureUsage {
9
+ feature: 'PERSON' | 'ORPHANED_DEVICE';
10
+ totalCount: number;
11
+ usageCount: number;
12
+ unUsedCount: number;
13
+ }
14
+ export interface WebexLicenseUsageSummary {
15
+ webexReadinessLicenseStats: WebexLicenseFeatureUsage[];
16
+ totalProfessionalLicenseCount: number;
17
+ totalWorkspaceProfessionalLicenseCount: number;
18
+ professionalWebexReadinessTotalLicenseStatCoverage: number;
19
+ workspaceWebexReadinessTotalLicenseStatCoverage: number;
20
+ }
@@ -0,0 +1,52 @@
1
+ import { OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
2
+ import { ApexChart, ApexDataLabels, ApexLegend, ApexNonAxisChartSeries, ApexPlotOptions } from 'ng-apexcharts';
3
+ import * as i0 from "@angular/core";
4
+ interface LicenseLegendItem {
5
+ label: string;
6
+ count: number;
7
+ percentage: number;
8
+ color: string;
9
+ }
10
+ interface LicenseTableRow {
11
+ label: string;
12
+ value: number;
13
+ }
14
+ interface LicenseChartOptions {
15
+ series: ApexNonAxisChartSeries;
16
+ chart: ApexChart;
17
+ labels: string[];
18
+ colors: string[];
19
+ legend: ApexLegend;
20
+ plotOptions: ApexPlotOptions;
21
+ dataLabels: ApexDataLabels;
22
+ }
23
+ interface LicenseRequirementViewModel {
24
+ chartOptions: LicenseChartOptions;
25
+ legendItems: LicenseLegendItem[];
26
+ rows: LicenseTableRow[];
27
+ totalRequired: number;
28
+ }
29
+ export declare class LicencesRequirementComponent implements OnInit, OnDestroy, OnChanges {
30
+ customerId: number;
31
+ token: string;
32
+ private readonly ccReadinessService;
33
+ private subscription?;
34
+ viewModel: LicenseRequirementViewModel | null;
35
+ loading: boolean;
36
+ error: boolean;
37
+ filters: string[];
38
+ selectedSummaryIndex: number;
39
+ private summary;
40
+ ngOnInit(): void;
41
+ ngOnDestroy(): void;
42
+ ngOnChanges(changes: SimpleChanges): void;
43
+ onFilterChange(index: number): void;
44
+ private loadSummaries;
45
+ private selectFilter;
46
+ private mapSummaryToViewModel;
47
+ private buildChartOptions;
48
+ private normalizePercentage;
49
+ static ɵfac: i0.ɵɵFactoryDeclaration<LicencesRequirementComponent, never>;
50
+ static ɵcmp: i0.ɵɵComponentDeclaration<LicencesRequirementComponent, "cc-licenses-requirement", never, { "customerId": "customerId"; "token": "token"; }, {}, never, never, false, never>;
51
+ }
52
+ export {};
@@ -0,0 +1,26 @@
1
+ import { OnInit } from "@angular/core";
2
+ import { Observable } from "rxjs";
3
+ import * as i0 from "@angular/core";
4
+ interface SummaryGridCount {
5
+ name: string;
6
+ value: number;
7
+ }
8
+ interface SummaryGridItem {
9
+ uccxIp: string;
10
+ counts: SummaryGridCount[];
11
+ }
12
+ export declare class SummaryGridComponent implements OnInit {
13
+ customerId: number;
14
+ token: string;
15
+ private readonly ccReadinessService;
16
+ readonly ENTITY_CONFIG: {
17
+ [key: string]: {
18
+ label: string;
19
+ };
20
+ };
21
+ data$: Observable<SummaryGridItem[]>;
22
+ ngOnInit(): void;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<SummaryGridComponent, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<SummaryGridComponent, "cc-summary-grid", never, { "customerId": "customerId"; "token": "token"; }, {}, never, never, false, never>;
25
+ }
26
+ export {};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@tuki-io/tuki-widgets/contact-center" />
5
+ export * from './public-api';
@@ -0,0 +1,3 @@
1
+ export * from './cc-readiness/cc-readiness.module';
2
+ export * from './cc-readiness/widgets/summary-grid/summary-grid.component';
3
+ export * from './cc-readiness/widgets/licences-requirement/licences-requirement.component';
@@ -0,0 +1,6 @@
1
+ export declare const API: {
2
+ READINESS: {
3
+ UCCX_SERVER_ENTITY_STATS: (customerId: number) => string;
4
+ LICENSE_USAGE_SUMMARY: (customerId: number) => string;
5
+ };
6
+ };
@@ -0,0 +1,20 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export declare class APIService {
5
+ private httpClient;
6
+ token: any;
7
+ apiUrl: string;
8
+ constructor(httpClient: HttpClient);
9
+ fetch(url: string, params?: any, cache?: boolean): Observable<any>;
10
+ post(url: string, body: any, params?: {}): Observable<any>;
11
+ postExtended(url: string, body?: null, params?: {}, headers?: {}): Observable<import("@angular/common/http").HttpResponse<Object>>;
12
+ put(url: string, body?: null, params?: {}): Observable<Object>;
13
+ delete(url: string, params?: {}): Observable<Object>;
14
+ fetchPagination(url: string, pageSize: number, pageNumber: number, additionalParams?: {}, cache?: boolean): Observable<any>;
15
+ private prepareEncodedParams;
16
+ private getHeaders;
17
+ private getParameterByName;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<APIService, never>;
19
+ static ɵprov: i0.ɵɵInjectableDeclaration<APIService>;
20
+ }
@@ -0,0 +1,15 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "@angular/material/progress-bar";
3
+ import * as i2 from "@angular/material/tooltip";
4
+ import * as i3 from "@angular/material/table";
5
+ import * as i4 from "@angular/material/checkbox";
6
+ import * as i5 from "@angular/material/button";
7
+ import * as i6 from "@angular/material/icon";
8
+ import * as i7 from "@angular/material/form-field";
9
+ import * as i8 from "@angular/material/input";
10
+ import * as i9 from "@angular/material/select";
11
+ export declare class MaterialModule {
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<MaterialModule, never>;
13
+ static ɵmod: i0.ɵɵNgModuleDeclaration<MaterialModule, never, [typeof i1.MatProgressBarModule, typeof i2.MatTooltipModule, typeof i3.MatTableModule, typeof i4.MatCheckboxModule, typeof i5.MatButtonModule, typeof i6.MatIconModule, typeof i7.MatFormFieldModule, typeof i8.MatInputModule, typeof i9.MatSelectModule], [typeof i1.MatProgressBarModule, typeof i2.MatTooltipModule, typeof i3.MatTableModule, typeof i4.MatCheckboxModule, typeof i5.MatButtonModule, typeof i6.MatIconModule, typeof i7.MatFormFieldModule, typeof i8.MatInputModule, typeof i9.MatSelectModule]>;
14
+ static ɵinj: i0.ɵɵInjectorDeclaration<MaterialModule>;
15
+ }
@@ -0,0 +1,10 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "@angular/common";
3
+ import * as i2 from "./material.module";
4
+ import * as i3 from "ng-apexcharts";
5
+ import * as i4 from "@angular/common/http";
6
+ export declare class SharedModule {
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<SharedModule, never>;
8
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SharedModule, never, [typeof i1.CommonModule, typeof i2.MaterialModule, typeof i3.NgApexchartsModule, typeof i4.HttpClientModule], [typeof i2.MaterialModule]>;
9
+ static ɵinj: i0.ɵɵInjectorDeclaration<SharedModule>;
10
+ }
@@ -0,0 +1,71 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { HttpClientModule } from '@angular/common/http';
4
+ import { LicencesRequirementComponent } from './widgets/licences-requirement/licences-requirement.component';
5
+ import { SummaryGridComponent } from './widgets/summary-grid/summary-grid.component';
6
+ import { CardComponent } from './components/card/card.component';
7
+ import { NgApexchartsModule } from 'ng-apexcharts';
8
+ import { MatButtonModule } from '@angular/material/button';
9
+ import { MatCheckboxModule } from '@angular/material/checkbox';
10
+ import { MatOptionModule } from '@angular/material/core';
11
+ import { MatPaginatorModule } from '@angular/material/paginator';
12
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
13
+ import { MatSelectModule } from '@angular/material/select';
14
+ import { MatTableModule } from '@angular/material/table';
15
+ import * as i0 from "@angular/core";
16
+ export class CcReadinessModule {
17
+ }
18
+ CcReadinessModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
19
+ CcReadinessModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, declarations: [LicencesRequirementComponent,
20
+ SummaryGridComponent,
21
+ CardComponent], imports: [CommonModule,
22
+ HttpClientModule,
23
+ NgApexchartsModule,
24
+ MatTableModule,
25
+ MatButtonModule,
26
+ MatCheckboxModule,
27
+ MatSelectModule,
28
+ MatProgressSpinnerModule,
29
+ MatOptionModule,
30
+ MatPaginatorModule,
31
+ MatSelectModule], exports: [LicencesRequirementComponent,
32
+ SummaryGridComponent] });
33
+ CcReadinessModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, imports: [CommonModule,
34
+ HttpClientModule,
35
+ NgApexchartsModule,
36
+ MatTableModule,
37
+ MatButtonModule,
38
+ MatCheckboxModule,
39
+ MatSelectModule,
40
+ MatProgressSpinnerModule,
41
+ MatOptionModule,
42
+ MatPaginatorModule,
43
+ MatSelectModule] });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessModule, decorators: [{
45
+ type: NgModule,
46
+ args: [{
47
+ declarations: [
48
+ LicencesRequirementComponent,
49
+ SummaryGridComponent,
50
+ CardComponent
51
+ ],
52
+ imports: [
53
+ CommonModule,
54
+ HttpClientModule,
55
+ NgApexchartsModule,
56
+ MatTableModule,
57
+ MatButtonModule,
58
+ MatCheckboxModule,
59
+ MatSelectModule,
60
+ MatProgressSpinnerModule,
61
+ MatOptionModule,
62
+ MatPaginatorModule,
63
+ MatSelectModule
64
+ ],
65
+ exports: [
66
+ LicencesRequirementComponent,
67
+ SummaryGridComponent
68
+ ]
69
+ }]
70
+ }] });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtcmVhZGluZXNzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1yZWFkaW5lc3MvY2MtcmVhZGluZXNzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUM3RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUE0QnpELE1BQU0sT0FBTyxpQkFBaUI7OytHQUFqQixpQkFBaUI7Z0hBQWpCLGlCQUFpQixpQkF0QjFCLDRCQUE0QjtRQUM1QixvQkFBb0I7UUFDcEIsYUFBYSxhQUdiLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCxlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZix3QkFBd0I7UUFDeEIsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQixlQUFlLGFBR2YsNEJBQTRCO1FBQzVCLG9CQUFvQjtnSEFHWCxpQkFBaUIsWUFqQjFCLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCxlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZix3QkFBd0I7UUFDeEIsZUFBZTtRQUNmLGtCQUFrQjtRQUNsQixlQUFlOzRGQU9OLGlCQUFpQjtrQkF4QjdCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLDRCQUE0Qjt3QkFDNUIsb0JBQW9CO3dCQUNwQixhQUFhO3FCQUNkO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLHdCQUF3Qjt3QkFDeEIsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLGVBQWU7cUJBQ2hCO29CQUNELE9BQU8sRUFBRTt3QkFDUCw0QkFBNEI7d0JBQzVCLG9CQUFvQjtxQkFDckI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBMaWNlbmNlc1JlcXVpcmVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXRzL2xpY2VuY2VzLXJlcXVpcmVtZW50L2xpY2VuY2VzLXJlcXVpcmVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1bW1hcnlHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXRzL3N1bW1hcnktZ3JpZC9zdW1tYXJ5LWdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2FyZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jYXJkL2NhcmQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmdBcGV4Y2hhcnRzTW9kdWxlIH0gZnJvbSAnbmctYXBleGNoYXJ0cyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsTW9kdWxlIH0gZnJvbSAnLi4vc2hhcmVkL21hdGVyaWFsLm1vZHVsZSc7XHJcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJy4uL3NoYXJlZC9zaGFyZWQubW9kdWxlJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcblxyXG5cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBMaWNlbmNlc1JlcXVpcmVtZW50Q29tcG9uZW50LFxyXG4gICAgU3VtbWFyeUdyaWRDb21wb25lbnQsXHJcbiAgICBDYXJkQ29tcG9uZW50XHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxyXG4gICAgTmdBcGV4Y2hhcnRzTW9kdWxlLFxyXG4gICAgTWF0VGFibGVNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcclxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZVxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgTGljZW5jZXNSZXF1aXJlbWVudENvbXBvbmVudCxcclxuICAgIFN1bW1hcnlHcmlkQ29tcG9uZW50XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2NSZWFkaW5lc3NNb2R1bGUgeyB9XHJcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { APIService } from '../shared/api.service';
3
+ import { API } from '../shared/api.endpoints';
4
+ import { map } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ export class CcReadinessService {
7
+ constructor() {
8
+ this.api = inject(APIService);
9
+ }
10
+ fetchUccxServerEntityStats(customerId) {
11
+ return this.api.fetch(API.READINESS.UCCX_SERVER_ENTITY_STATS(customerId))
12
+ .pipe(map((stats) => {
13
+ stats.forEach(stat => {
14
+ // @ts-ignore
15
+ delete stat.counts.reasonCodes;
16
+ });
17
+ return stats;
18
+ }));
19
+ }
20
+ fetchWebexLicenseUsageSummary(customerId) {
21
+ return this.api.fetch(API.READINESS.LICENSE_USAGE_SUMMARY(customerId));
22
+ }
23
+ setToken(token) {
24
+ this.api.token = token;
25
+ }
26
+ }
27
+ CcReadinessService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
28
+ CcReadinessService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessService, providedIn: 'root' });
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcReadinessService, decorators: [{
30
+ type: Injectable,
31
+ args: [{
32
+ providedIn: 'root'
33
+ }]
34
+ }], ctorParameters: function () { return []; } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtcmVhZGluZXNzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvY29udGFjdC1jZW50ZXIvY2MtcmVhZGluZXNzL2NjLXJlYWRpbmVzcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUMsT0FBTyxFQUFjLEdBQUcsRUFBMEIsTUFBTSxNQUFNLENBQUM7O0FBSy9ELE1BQU0sT0FBTyxrQkFBa0I7SUFHN0I7UUFGaUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxQixDQUFDO0lBRWpCLDBCQUEwQixDQUFDLFVBQWtCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN0RSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBOEIsRUFBRSxFQUFFO1lBQzNDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLGFBQWE7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxVQUFrQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWE7UUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7O2dIQXRCVSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQUZqQixNQUFNOzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWNjeFNlcnZlckVudGl0eVN0YXRzLCBXZWJleExpY2Vuc2VVc2FnZVN1bW1hcnkgfSBmcm9tICcuL3R5cGVzL2NjLXJlYWRpbmVzcyc7XHJcbmltcG9ydCB7IEFQSSB9IGZyb20gJy4uL3NoYXJlZC9hcGkuZW5kcG9pbnRzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDY1JlYWRpbmVzc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBmZXRjaFVjY3hTZXJ2ZXJFbnRpdHlTdGF0cyhjdXN0b21lcklkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFVjY3hTZXJ2ZXJFbnRpdHlTdGF0c1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hcGkuZmV0Y2goQVBJLlJFQURJTkVTUy5VQ0NYX1NFUlZFUl9FTlRJVFlfU1RBVFMoY3VzdG9tZXJJZCkpXHJcbiAgICAgIC5waXBlKG1hcCgoc3RhdHM6IFVjY3hTZXJ2ZXJFbnRpdHlTdGF0c1tdKSA9PiB7XHJcbiAgICAgICAgc3RhdHMuZm9yRWFjaChzdGF0ID0+IHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGRlbGV0ZSBzdGF0LmNvdW50cy5yZWFzb25Db2RlcztcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc3RhdHM7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGZldGNoV2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5KGN1c3RvbWVySWQ6IG51bWJlcik6IE9ic2VydmFibGU8V2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5W10+IHtcclxuICAgIHJldHVybiB0aGlzLmFwaS5mZXRjaChBUEkuUkVBRElORVNTLkxJQ0VOU0VfVVNBR0VfU1VNTUFSWShjdXN0b21lcklkKSk7XHJcbiAgfVxyXG5cclxuICBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwaS50b2tlbiA9IHRva2VuO1xyXG4gIH1cclxufSJdfQ==
@@ -0,0 +1,13 @@
1
+ import { Component, Input } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class CardComponent {
4
+ }
5
+ CardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6
+ CardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: CardComponent, selector: "tk-card", inputs: { title: "title" }, ngImport: i0, template: "<article class=\"card\">\r\n <header class=\"card__header\">\r\n <h2>{{ title }}</h2>\r\n <!--<div class=\"card__menu-button\">\r\n <img width=\"18\" src=\"assets/icons/menu_icon.png\" alt=\"Menu Icon\">\r\n </div>-->\r\n </header>\r\n <div class=\"card__content\">\r\n <ng-content select=\"card-content\"></ng-content>\r\n </div>\r\n</article>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;height:100%;box-sizing:border-box}.card{font-family:Inter,Inter,sans-serif;background-color:#fff;border-radius:1rem;padding:2rem;border:1px solid hsla(0,0%,0%,.2);min-width:300px;max-width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box;gap:2.5rem}.card__header{position:relative;display:flex;align-items:center;justify-content:space-between}.card__header h2{font-size:16px;margin:0}.card__header .card__menu-button{position:relative;display:flex;align-items:center}.card__content{display:flex;flex-direction:column;gap:2.5rem;flex-grow:1}\n"] });
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CardComponent, decorators: [{
8
+ type: Component,
9
+ args: [{ selector: 'tk-card', template: "<article class=\"card\">\r\n <header class=\"card__header\">\r\n <h2>{{ title }}</h2>\r\n <!--<div class=\"card__menu-button\">\r\n <img width=\"18\" src=\"assets/icons/menu_icon.png\" alt=\"Menu Icon\">\r\n </div>-->\r\n </header>\r\n <div class=\"card__content\">\r\n <ng-content select=\"card-content\"></ng-content>\r\n </div>\r\n</article>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;height:100%;box-sizing:border-box}.card{font-family:Inter,Inter,sans-serif;background-color:#fff;border-radius:1rem;padding:2rem;border:1px solid hsla(0,0%,0%,.2);min-width:300px;max-width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box;gap:2.5rem}.card__header{position:relative;display:flex;align-items:center;justify-content:space-between}.card__header h2{font-size:16px;margin:0}.card__header .card__menu-button{position:relative;display:flex;align-items:center}.card__content{display:flex;flex-direction:column;gap:2.5rem;flex-grow:1}\n"] }]
10
+ }], propDecorators: { title: [{
11
+ type: Input
12
+ }] } });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvY29udGFjdC1jZW50ZXIvY2MtcmVhZGluZXNzL2NvbXBvbmVudHMvY2FyZC9jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1yZWFkaW5lc3MvY29tcG9uZW50cy9jYXJkL2NhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBT2pELE1BQU0sT0FBTyxhQUFhOzsyR0FBYixhQUFhOytGQUFiLGFBQWEsMkVDUDFCLGlaQVdBOzRGREphLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0ksU0FBUzs4QkFLVixLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd0ay1jYXJkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NhcmQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FyZENvbXBvbmVudCB7XHJcbiAgICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcclxufSIsIjxhcnRpY2xlIGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgPGhlYWRlciBjbGFzcz1cImNhcmRfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMj57eyB0aXRsZSB9fTwvaDI+XHJcbiAgICAgICAgPCEtLTxkaXYgY2xhc3M9XCJjYXJkX19tZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgICA8aW1nIHdpZHRoPVwiMThcIiBzcmM9XCJhc3NldHMvaWNvbnMvbWVudV9pY29uLnBuZ1wiIGFsdD1cIk1lbnUgSWNvblwiPlxyXG4gICAgICAgIDwvZGl2Pi0tPlxyXG4gICAgPC9oZWFkZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZF9fY29udGVudFwiPlxyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNhcmQtY29udGVudFwiPjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG48L2FydGljbGU+XHJcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ ;
2
+ ;
3
+ ;
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtcmVhZGluZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2NvbnRhY3QtY2VudGVyL2NjLXJlYWRpbmVzcy90eXBlcy9jYy1yZWFkaW5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JDLENBQUM7QUFPRCxDQUFDO0FBUUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEVudGl0eVR5cGUgPVxyXG4gICAgfCAnYXBwbGljYXRpb25zJ1xyXG4gICAgfCAndHJpZ2dlcnMnXHJcbiAgICB8ICdjb250YWN0U2VydmljZVF1ZXVlcydcclxuICAgIHwgJ3Jlc291cmNlcydcclxuICAgIHwgJ3Jlc291cmNlR3JvdXBzJ1xyXG4gICAgfCAnc2tpbGxzJ1xyXG4gICAgfCAneG1sJ1xyXG4gICAgfCAnc2NyaXB0cydcclxuICAgIHwgJ2F1ZGlvUHJvbXB0cydcclxuICAgIHwgJ3RlYW1zJ1xyXG4gICAgLy8gfCAncmVhc29uQ29kZXMnXHJcbiAgICB8ICdwaG9uZWJvb2tzJ1xyXG4gICAgfCAnd3JhcFVwQ29kZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVY2N4U2VydmVyRW50aXR5U3RhdHMge1xyXG4gICAgdWNjeElwOiBzdHJpbmc7XHJcbiAgICBjb3VudHM6IHsgW2tleSBpbiBFbnRpdHlUeXBlXTogbnVtYmVyIH1cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2ViZXhMaWNlbnNlRmVhdHVyZVVzYWdlIHtcclxuICAgIGZlYXR1cmU6ICdQRVJTT04nIHwgJ09SUEhBTkVEX0RFVklDRScsXHJcbiAgICB0b3RhbENvdW50OiBudW1iZXIsXHJcbiAgICB1c2FnZUNvdW50OiBudW1iZXIsXHJcbiAgICB1blVzZWRDb3VudDogbnVtYmVyXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeSB7XHJcbiAgICB3ZWJleFJlYWRpbmVzc0xpY2Vuc2VTdGF0czogV2ViZXhMaWNlbnNlRmVhdHVyZVVzYWdlW10sXHJcbiAgICB0b3RhbFByb2Zlc3Npb25hbExpY2Vuc2VDb3VudDogbnVtYmVyLFxyXG4gICAgdG90YWxXb3Jrc3BhY2VQcm9mZXNzaW9uYWxMaWNlbnNlQ291bnQ6IG51bWJlcixcclxuICAgIHByb2Zlc3Npb25hbFdlYmV4UmVhZGluZXNzVG90YWxMaWNlbnNlU3RhdENvdmVyYWdlOiBudW1iZXIsXHJcbiAgICB3b3Jrc3BhY2VXZWJleFJlYWRpbmVzc1RvdGFsTGljZW5zZVN0YXRDb3ZlcmFnZTogbnVtYmVyXHJcbn07Il19
@@ -0,0 +1,187 @@
1
+ import { Component, Input, inject } from '@angular/core';
2
+ import { catchError, finalize, of } from 'rxjs';
3
+ import { CcReadinessService } from '../../cc-readiness.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "ng-apexcharts";
7
+ import * as i3 from "@angular/material/select";
8
+ import * as i4 from "@angular/material/core";
9
+ import * as i5 from "../../components/card/card.component";
10
+ const LEGEND_COLORS = {
11
+ existing: '#16A693',
12
+ missing: '#808080'
13
+ };
14
+ export class LicencesRequirementComponent {
15
+ constructor() {
16
+ this.ccReadinessService = inject(CcReadinessService);
17
+ this.viewModel = null;
18
+ this.loading = false;
19
+ this.error = false;
20
+ this.filters = ['All', 'Professional licenses', 'Workspace licenses'];
21
+ this.selectedSummaryIndex = 0;
22
+ this.summary = null;
23
+ }
24
+ ngOnInit() {
25
+ this.loadSummaries();
26
+ }
27
+ ngOnDestroy() {
28
+ this.subscription?.unsubscribe();
29
+ }
30
+ ngOnChanges(changes) {
31
+ if ((changes['customerId'] && !changes['customerId'].firstChange) ||
32
+ (changes['token'] && !changes['token'].firstChange)) {
33
+ this.loadSummaries();
34
+ }
35
+ }
36
+ onFilterChange(index) {
37
+ if (!isNaN(index) && index >= 0 && index < this.filters.length) {
38
+ this.selectFilter(index);
39
+ }
40
+ }
41
+ loadSummaries() {
42
+ const numericCustomerId = Number(this.customerId);
43
+ if (!numericCustomerId || !this.token) {
44
+ return;
45
+ }
46
+ this.subscription?.unsubscribe();
47
+ this.loading = true;
48
+ this.error = false;
49
+ this.viewModel = null;
50
+ this.selectedSummaryIndex = 0;
51
+ this.ccReadinessService.setToken(this.token);
52
+ this.subscription = this.ccReadinessService.fetchWebexLicenseUsageSummary(numericCustomerId)
53
+ .pipe(catchError(error => {
54
+ console.error('Unable to load Webex license usage summary', error);
55
+ this.error = true;
56
+ return of([]);
57
+ }), finalize(() => this.loading = false))
58
+ .subscribe(items => {
59
+ console.log('Raw API response:', items);
60
+ // Handle both array and single object responses
61
+ if (Array.isArray(items) && items.length > 0) {
62
+ this.summary = items[0];
63
+ }
64
+ else if (items && typeof items === 'object' && !Array.isArray(items)) {
65
+ // If single object returned, use it directly
66
+ this.summary = items;
67
+ }
68
+ else {
69
+ this.summary = null;
70
+ }
71
+ console.log('Processed summary:', this.summary);
72
+ this.selectFilter(0);
73
+ });
74
+ }
75
+ selectFilter(index) {
76
+ this.selectedSummaryIndex = index;
77
+ if (!this.summary) {
78
+ this.viewModel = null;
79
+ return;
80
+ }
81
+ this.viewModel = this.mapSummaryToViewModel(this.summary, index);
82
+ console.log('Created viewModel for filter index', index, ':', this.viewModel);
83
+ }
84
+ mapSummaryToViewModel(summary, filterIndex) {
85
+ console.log('Mapping summary to viewModel:', summary, 'filterIndex:', filterIndex);
86
+ // Extract data from webexReadinessLicenseStats and license counts
87
+ const personStat = summary.webexReadinessLicenseStats?.find(stat => stat.feature === 'PERSON');
88
+ const deviceStat = summary.webexReadinessLicenseStats?.find(stat => stat.feature === 'ORPHANED_DEVICE');
89
+ const professionalNeeded = personStat?.totalCount ?? 0;
90
+ const workspaceNeeded = deviceStat?.totalCount ?? 0;
91
+ const professionalOwned = Number(summary.totalProfessionalLicenseCount ?? 0);
92
+ const workspaceOwned = Number(summary.totalWorkspaceProfessionalLicenseCount ?? 0);
93
+ // Filter data based on selection
94
+ let existingCount;
95
+ let missingCount;
96
+ let rows;
97
+ if (filterIndex === 0) {
98
+ // All - show both
99
+ existingCount = professionalOwned + workspaceOwned;
100
+ const totalNeeded = professionalNeeded + workspaceNeeded;
101
+ missingCount = Math.max(0, totalNeeded - existingCount);
102
+ rows = [
103
+ { label: 'Professional licenses', value: professionalNeeded },
104
+ { label: 'Workspace licenses', value: workspaceNeeded }
105
+ ];
106
+ }
107
+ else if (filterIndex === 1) {
108
+ // Professional licenses only
109
+ existingCount = professionalOwned;
110
+ missingCount = Math.max(0, professionalNeeded - professionalOwned);
111
+ rows = [{ label: 'Professional licenses', value: professionalNeeded }];
112
+ }
113
+ else {
114
+ // Workspace licenses only
115
+ existingCount = workspaceOwned;
116
+ missingCount = Math.max(0, workspaceNeeded - workspaceOwned);
117
+ rows = [{ label: 'Workspace licenses', value: workspaceNeeded }];
118
+ }
119
+ const totalLicenses = existingCount + missingCount;
120
+ const legendItems = [
121
+ {
122
+ label: 'Existing licenses',
123
+ count: existingCount,
124
+ percentage: totalLicenses > 0 ? (existingCount / totalLicenses) * 100 : 0,
125
+ color: LEGEND_COLORS.existing
126
+ },
127
+ {
128
+ label: 'Missing licenses',
129
+ count: missingCount,
130
+ percentage: totalLicenses > 0 ? (missingCount / totalLicenses) * 100 : 0,
131
+ color: LEGEND_COLORS.missing
132
+ }
133
+ ];
134
+ console.log('Legend items:', legendItems);
135
+ console.log('Table rows:', rows);
136
+ const totalRequired = rows.reduce((acc, row) => acc + row.value, 0);
137
+ return {
138
+ chartOptions: this.buildChartOptions(legendItems),
139
+ legendItems,
140
+ rows,
141
+ totalRequired
142
+ };
143
+ }
144
+ buildChartOptions(legendItems) {
145
+ return {
146
+ series: legendItems.map(item => item.count),
147
+ chart: {
148
+ type: 'donut',
149
+ height: 220
150
+ },
151
+ labels: legendItems.map(item => item.label),
152
+ colors: legendItems.map(item => item.color),
153
+ legend: {
154
+ show: false
155
+ },
156
+ plotOptions: {
157
+ pie: {
158
+ donut: {
159
+ size: '75%'
160
+ }
161
+ }
162
+ },
163
+ dataLabels: {
164
+ enabled: false
165
+ }
166
+ };
167
+ }
168
+ normalizePercentage(value) {
169
+ if (!isFinite(value)) {
170
+ return 0;
171
+ }
172
+ // Convert decimal to percentage (0.9487 → 94.9)
173
+ const percentage = value * 100;
174
+ return Math.round(percentage * 10) / 10;
175
+ }
176
+ }
177
+ LicencesRequirementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LicencesRequirementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
178
+ LicencesRequirementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LicencesRequirementComponent, selector: "cc-licenses-requirement", inputs: { customerId: "customerId", token: "token" }, usesOnChanges: true, ngImport: i0, template: "<tk-card title=\"Licenses requirement\">\r\n <ng-container ngProjectAs=\"card-content\">\r\n <div\r\n class=\"widget-body\"\r\n *ngIf=\"!loading && !error && viewModel; else widgetState\"\r\n >\r\n <div class=\"left-section\">\r\n <mat-select\r\n [(value)]=\"selectedSummaryIndex\"\r\n (selectionChange)=\"onFilterChange($event.value)\"\r\n class=\"filter-select\"\r\n >\r\n <mat-option *ngFor=\"let option of filters; index as i\" [value]=\"i\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-select>\r\n\r\n <div class=\"chart-section\">\r\n <div class=\"chart-wrapper\">\r\n <apx-chart\r\n [series]=\"viewModel.chartOptions.series\"\r\n [chart]=\"viewModel.chartOptions.chart\"\r\n [labels]=\"viewModel.chartOptions.labels\"\r\n [colors]=\"viewModel.chartOptions.colors\"\r\n [legend]=\"viewModel.chartOptions.legend\"\r\n [plotOptions]=\"viewModel.chartOptions.plotOptions\"\r\n [dataLabels]=\"viewModel.chartOptions.dataLabels\"\r\n >\r\n </apx-chart>\r\n </div>\r\n <div class=\"legend\">\r\n <div class=\"legend-item\" *ngFor=\"let item of viewModel.legendItems\">\r\n <span\r\n class=\"legend-marker\"\r\n [style.backgroundColor]=\"item.color\"\r\n ></span>\r\n <span class=\"legend-label\">{{ item.label }}</span>\r\n <span class=\"legend-value\">{{ item.count | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"divider\" aria-hidden=\"true\"></div>\r\n\r\n <div class=\"table-section\">\r\n <div class=\"table-header\">\r\n <span>License</span>\r\n <span>Required</span>\r\n </div>\r\n <div class=\"table-row\" *ngFor=\"let row of viewModel.rows\">\r\n <span>{{ row.label }}</span>\r\n <span>{{ row.value | number }}</span>\r\n </div>\r\n <div class=\"table-row total-row\">\r\n <span>Total</span>\r\n <span>{{ viewModel.totalRequired | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #widgetState>\r\n <div class=\"state-message\" *ngIf=\"loading\">\r\n Loading license requirements\u2026\r\n </div>\r\n <div class=\"state-message error\" *ngIf=\"!loading && error\">\r\n Unable to load license requirements.\r\n </div>\r\n <div class=\"state-message\" *ngIf=\"!loading && !error && !viewModel\">\r\n No license data available.\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</tk-card>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;width:100%;box-sizing:border-box}.filter-select{font-family:Inter,Inter,sans-serif;font-size:14px;min-width:140px;border:1px solid #e5e7eb;border-radius:.5rem;padding:.5rem .75rem;background-color:#fff}.filter-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select{border:1px solid #e5e7eb;border-radius:.5rem;background-color:#fff}:host ::ng-deep .filter-select.mat-mdc-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select.mat-focused{border-color:#16a693}:host ::ng-deep .filter-select .mat-mdc-select-trigger{font-size:14px;padding:.5rem .75rem}:host ::ng-deep .filter-select .mat-mdc-select-value{color:#111827}:host ::ng-deep .filter-select .mat-mdc-select-arrow-wrapper{padding-left:.5rem}.widget-body{display:flex;gap:2.5rem;align-items:flex-start}.left-section{flex:2;display:flex;flex-direction:column;gap:1rem}.chart-section{display:flex;gap:1.5rem;align-items:center}.chart-wrapper{width:220px;min-height:220px;flex-shrink:0}.chart-wrapper apx-chart{width:220px!important;height:220px!important}.legend{display:flex;flex-direction:column;gap:.75rem}.legend-item{display:flex;align-items:center;gap:.5rem;font-family:Inter,Inter,sans-serif;font-size:14px}.legend-marker{width:14px;height:14px;border-radius:50%;display:inline-flex}.legend-label{color:#4b5563}.legend-value{margin-left:auto;font-weight:600;color:#111827}.divider{width:1px;min-height:200px;align-self:stretch;background:#e5e7eb}.table-section{flex:3;display:flex;flex-direction:column;gap:.75rem;font-family:Inter,Inter,sans-serif}.table-header,.table-row{display:flex;justify-content:space-between;font-size:14px}.table-header{font-weight:600;color:#6b7280;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb}.table-row{color:#111827}.total-row{font-weight:700;margin-top:.5rem;padding-top:.5rem;border-top:1px solid #e5e7eb}.state-message{font-family:Inter,Inter,sans-serif;font-size:14px;color:#6b7280}.state-message.error{color:#b91c1c}@media (max-width: 960px){.widget-body{flex-direction:column}.divider{display:none}.chart-section{justify-content:space-between}}:host ::ng-deep .apexcharts-legend{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ChartComponent, selector: "apx-chart", inputs: ["chart", "annotations", "colors", "dataLabels", "series", "stroke", "labels", "legend", "markers", "noData", "fill", "tooltip", "plotOptions", "responsive", "xaxis", "yaxis", "forecastDataPoints", "grid", "states", "title", "subtitle", "theme", "autoUpdateSeries"] }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i5.CardComponent, selector: "tk-card", inputs: ["title"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LicencesRequirementComponent, decorators: [{
180
+ type: Component,
181
+ args: [{ selector: 'cc-licenses-requirement', template: "<tk-card title=\"Licenses requirement\">\r\n <ng-container ngProjectAs=\"card-content\">\r\n <div\r\n class=\"widget-body\"\r\n *ngIf=\"!loading && !error && viewModel; else widgetState\"\r\n >\r\n <div class=\"left-section\">\r\n <mat-select\r\n [(value)]=\"selectedSummaryIndex\"\r\n (selectionChange)=\"onFilterChange($event.value)\"\r\n class=\"filter-select\"\r\n >\r\n <mat-option *ngFor=\"let option of filters; index as i\" [value]=\"i\">\r\n {{ option }}\r\n </mat-option>\r\n </mat-select>\r\n\r\n <div class=\"chart-section\">\r\n <div class=\"chart-wrapper\">\r\n <apx-chart\r\n [series]=\"viewModel.chartOptions.series\"\r\n [chart]=\"viewModel.chartOptions.chart\"\r\n [labels]=\"viewModel.chartOptions.labels\"\r\n [colors]=\"viewModel.chartOptions.colors\"\r\n [legend]=\"viewModel.chartOptions.legend\"\r\n [plotOptions]=\"viewModel.chartOptions.plotOptions\"\r\n [dataLabels]=\"viewModel.chartOptions.dataLabels\"\r\n >\r\n </apx-chart>\r\n </div>\r\n <div class=\"legend\">\r\n <div class=\"legend-item\" *ngFor=\"let item of viewModel.legendItems\">\r\n <span\r\n class=\"legend-marker\"\r\n [style.backgroundColor]=\"item.color\"\r\n ></span>\r\n <span class=\"legend-label\">{{ item.label }}</span>\r\n <span class=\"legend-value\">{{ item.count | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"divider\" aria-hidden=\"true\"></div>\r\n\r\n <div class=\"table-section\">\r\n <div class=\"table-header\">\r\n <span>License</span>\r\n <span>Required</span>\r\n </div>\r\n <div class=\"table-row\" *ngFor=\"let row of viewModel.rows\">\r\n <span>{{ row.label }}</span>\r\n <span>{{ row.value | number }}</span>\r\n </div>\r\n <div class=\"table-row total-row\">\r\n <span>Total</span>\r\n <span>{{ viewModel.totalRequired | number }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #widgetState>\r\n <div class=\"state-message\" *ngIf=\"loading\">\r\n Loading license requirements\u2026\r\n </div>\r\n <div class=\"state-message error\" *ngIf=\"!loading && error\">\r\n Unable to load license requirements.\r\n </div>\r\n <div class=\"state-message\" *ngIf=\"!loading && !error && !viewModel\">\r\n No license data available.\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</tk-card>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;width:100%;box-sizing:border-box}.filter-select{font-family:Inter,Inter,sans-serif;font-size:14px;min-width:140px;border:1px solid #e5e7eb;border-radius:.5rem;padding:.5rem .75rem;background-color:#fff}.filter-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select{border:1px solid #e5e7eb;border-radius:.5rem;background-color:#fff}:host ::ng-deep .filter-select.mat-mdc-select:hover{border-color:#d1d5db}:host ::ng-deep .filter-select.mat-mdc-select.mat-focused{border-color:#16a693}:host ::ng-deep .filter-select .mat-mdc-select-trigger{font-size:14px;padding:.5rem .75rem}:host ::ng-deep .filter-select .mat-mdc-select-value{color:#111827}:host ::ng-deep .filter-select .mat-mdc-select-arrow-wrapper{padding-left:.5rem}.widget-body{display:flex;gap:2.5rem;align-items:flex-start}.left-section{flex:2;display:flex;flex-direction:column;gap:1rem}.chart-section{display:flex;gap:1.5rem;align-items:center}.chart-wrapper{width:220px;min-height:220px;flex-shrink:0}.chart-wrapper apx-chart{width:220px!important;height:220px!important}.legend{display:flex;flex-direction:column;gap:.75rem}.legend-item{display:flex;align-items:center;gap:.5rem;font-family:Inter,Inter,sans-serif;font-size:14px}.legend-marker{width:14px;height:14px;border-radius:50%;display:inline-flex}.legend-label{color:#4b5563}.legend-value{margin-left:auto;font-weight:600;color:#111827}.divider{width:1px;min-height:200px;align-self:stretch;background:#e5e7eb}.table-section{flex:3;display:flex;flex-direction:column;gap:.75rem;font-family:Inter,Inter,sans-serif}.table-header,.table-row{display:flex;justify-content:space-between;font-size:14px}.table-header{font-weight:600;color:#6b7280;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb}.table-row{color:#111827}.total-row{font-weight:700;margin-top:.5rem;padding-top:.5rem;border-top:1px solid #e5e7eb}.state-message{font-family:Inter,Inter,sans-serif;font-size:14px;color:#6b7280}.state-message.error{color:#b91c1c}@media (max-width: 960px){.widget-body{flex-direction:column}.divider{display:none}.chart-section{justify-content:space-between}}:host ::ng-deep .apexcharts-legend{display:none!important}\n"] }]
182
+ }], propDecorators: { customerId: [{
183
+ type: Input
184
+ }], token: [{
185
+ type: Input
186
+ }] } });
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGljZW5jZXMtcmVxdWlyZW1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2NvbnRhY3QtY2VudGVyL2NjLXJlYWRpbmVzcy93aWRnZXRzL2xpY2VuY2VzLXJlcXVpcmVtZW50L2xpY2VuY2VzLXJlcXVpcmVtZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1yZWFkaW5lc3Mvd2lkZ2V0cy9saWNlbmNlcy1yZXF1aXJlbWVudC9saWNlbmNlcy1yZXF1aXJlbWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRHLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7QUFnQ2hFLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLFFBQVEsRUFBRSxTQUFTO0lBQ25CLE9BQU8sRUFBRSxTQUFTO0NBQ25CLENBQUM7QUFPRixNQUFNLE9BQU8sNEJBQTRCO0lBTHpDO1FBU21CLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBR2pFLGNBQVMsR0FBdUMsSUFBSSxDQUFDO1FBQ3JELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVkLFlBQU8sR0FBYSxDQUFDLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNFLHlCQUFvQixHQUFHLENBQUMsQ0FBQztRQUVqQixZQUFPLEdBQW9DLElBQUksQ0FB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RCxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDM0MsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsS0FBSzthQUNaO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLEdBQUcsRUFBRTtvQkFDSCxLQUFLLEVBQUU7d0JBQ0wsSUFBSSxFQUFFLEtBQUs7cUJBQ1o7aUJBQ0Y7YUFDRjtZQUNELFVBQVUsRUFBRTtnQkFDVixPQUFPLEVBQUUsS0FBSzthQUNmO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELGdEQUFnRDtRQUNoRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFDLENBQUM7OzBIQTlMVSw0QkFBNEI7OEdBQTVCLDRCQUE0QiwwSUM3Q3pDLGd3RkEwRUE7NEZEN0JhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx5QkFBeUI7OEJBSzFCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwZXhDaGFydCwgQXBleERhdGFMYWJlbHMsIEFwZXhMZWdlbmQsIEFwZXhOb25BeGlzQ2hhcnRTZXJpZXMsIEFwZXhQbG90T3B0aW9ucyB9IGZyb20gJ25nLWFwZXhjaGFydHMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaW5hbGl6ZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDY1JlYWRpbmVzc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jYy1yZWFkaW5lc3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeSB9IGZyb20gJy4uLy4uL3R5cGVzL2NjLXJlYWRpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgTGljZW5zZUxlZ2VuZEl0ZW0ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBwZXJjZW50YWdlOiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIExpY2Vuc2VUYWJsZVJvdyB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGljZW5zZUNoYXJ0T3B0aW9ucyB7XHJcbiAgc2VyaWVzOiBBcGV4Tm9uQXhpc0NoYXJ0U2VyaWVzO1xyXG4gIGNoYXJ0OiBBcGV4Q2hhcnQ7XHJcbiAgbGFiZWxzOiBzdHJpbmdbXTtcclxuICBjb2xvcnM6IHN0cmluZ1tdO1xyXG4gIGxlZ2VuZDogQXBleExlZ2VuZDtcclxuICBwbG90T3B0aW9uczogQXBleFBsb3RPcHRpb25zO1xyXG4gIGRhdGFMYWJlbHM6IEFwZXhEYXRhTGFiZWxzO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGljZW5zZVJlcXVpcmVtZW50Vmlld01vZGVsIHtcclxuICBjaGFydE9wdGlvbnM6IExpY2Vuc2VDaGFydE9wdGlvbnM7XHJcbiAgbGVnZW5kSXRlbXM6IExpY2Vuc2VMZWdlbmRJdGVtW107XHJcbiAgcm93czogTGljZW5zZVRhYmxlUm93W107XHJcbiAgdG90YWxSZXF1aXJlZDogbnVtYmVyO1xyXG59XHJcblxyXG5jb25zdCBMRUdFTkRfQ09MT1JTID0ge1xyXG4gIGV4aXN0aW5nOiAnIzE2QTY5MycsXHJcbiAgbWlzc2luZzogJyM4MDgwODAnXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NjLWxpY2Vuc2VzLXJlcXVpcmVtZW50JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbGljZW5jZXMtcmVxdWlyZW1lbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xpY2VuY2VzLXJlcXVpcmVtZW50LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIExpY2VuY2VzUmVxdWlyZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBjdXN0b21lcklkITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNjUmVhZGluZXNzU2VydmljZSA9IGluamVjdChDY1JlYWRpbmVzc1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICB2aWV3TW9kZWw6IExpY2Vuc2VSZXF1aXJlbWVudFZpZXdNb2RlbCB8IG51bGwgPSBudWxsO1xyXG4gIGxvYWRpbmcgPSBmYWxzZTtcclxuICBlcnJvciA9IGZhbHNlO1xyXG5cclxuICBmaWx0ZXJzOiBzdHJpbmdbXSA9IFsnQWxsJywgJ1Byb2Zlc3Npb25hbCBsaWNlbnNlcycsICdXb3Jrc3BhY2UgbGljZW5zZXMnXTtcclxuICBzZWxlY3RlZFN1bW1hcnlJbmRleCA9IDA7XHJcblxyXG4gIHByaXZhdGUgc3VtbWFyeTogV2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkU3VtbWFyaWVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKChjaGFuZ2VzWydjdXN0b21lcklkJ10gJiYgIWNoYW5nZXNbJ2N1c3RvbWVySWQnXS5maXJzdENoYW5nZSkgfHxcclxuICAgICAgKGNoYW5nZXNbJ3Rva2VuJ10gJiYgIWNoYW5nZXNbJ3Rva2VuJ10uZmlyc3RDaGFuZ2UpKSB7XHJcbiAgICAgIHRoaXMubG9hZFN1bW1hcmllcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJDaGFuZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCFpc05hTihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZmlsdGVycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXIoaW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU3VtbWFyaWVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbnVtZXJpY0N1c3RvbWVySWQgPSBOdW1iZXIodGhpcy5jdXN0b21lcklkKTtcclxuICAgIGlmICghbnVtZXJpY0N1c3RvbWVySWQgfHwgIXRoaXMudG9rZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcclxuICAgIHRoaXMudmlld01vZGVsID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdW1tYXJ5SW5kZXggPSAwO1xyXG5cclxuICAgIHRoaXMuY2NSZWFkaW5lc3NTZXJ2aWNlLnNldFRva2VuKHRoaXMudG9rZW4pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNjUmVhZGluZXNzU2VydmljZS5mZXRjaFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeShudW1lcmljQ3VzdG9tZXJJZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gbG9hZCBXZWJleCBsaWNlbnNlIHVzYWdlIHN1bW1hcnknLCBlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiBvZjxXZWJleExpY2Vuc2VVc2FnZVN1bW1hcnlbXT4oW10pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdSYXcgQVBJIHJlc3BvbnNlOicsIGl0ZW1zKTtcclxuICAgICAgICAvLyBIYW5kbGUgYm90aCBhcnJheSBhbmQgc2luZ2xlIG9iamVjdCByZXNwb25zZXNcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5ID0gaXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtcyAmJiB0eXBlb2YgaXRlbXMgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gICAgICAgICAgLy8gSWYgc2luZ2xlIG9iamVjdCByZXR1cm5lZCwgdXNlIGl0IGRpcmVjdGx5XHJcbiAgICAgICAgICB0aGlzLnN1bW1hcnkgPSBpdGVtcyBhcyB1bmtub3duIGFzIFdlYmV4TGljZW5zZVVzYWdlU3VtbWFyeTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZXNzZWQgc3VtbWFyeTonLCB0aGlzLnN1bW1hcnkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyKDApO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0RmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdW1tYXJ5SW5kZXggPSBpbmRleDtcclxuICAgIGlmICghdGhpcy5zdW1tYXJ5KSB7XHJcbiAgICAgIHRoaXMudmlld01vZGVsID0gbnVsbDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1hcFN1bW1hcnlUb1ZpZXdNb2RlbCh0aGlzLnN1bW1hcnksIGluZGV4KTtcclxuICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIHZpZXdNb2RlbCBmb3IgZmlsdGVyIGluZGV4JywgaW5kZXgsICc6JywgdGhpcy52aWV3TW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBTdW1tYXJ5VG9WaWV3TW9kZWwoc3VtbWFyeTogV2ViZXhMaWNlbnNlVXNhZ2VTdW1tYXJ5LCBmaWx0ZXJJbmRleDogbnVtYmVyKTogTGljZW5zZVJlcXVpcmVtZW50Vmlld01vZGVsIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYXBwaW5nIHN1bW1hcnkgdG8gdmlld01vZGVsOicsIHN1bW1hcnksICdmaWx0ZXJJbmRleDonLCBmaWx0ZXJJbmRleCk7XHJcblxyXG4gICAgLy8gRXh0cmFjdCBkYXRhIGZyb20gd2ViZXhSZWFkaW5lc3NMaWNlbnNlU3RhdHMgYW5kIGxpY2Vuc2UgY291bnRzXHJcbiAgICBjb25zdCBwZXJzb25TdGF0ID0gc3VtbWFyeS53ZWJleFJlYWRpbmVzc0xpY2Vuc2VTdGF0cz8uZmluZChzdGF0ID0+IHN0YXQuZmVhdHVyZSA9PT0gJ1BFUlNPTicpO1xyXG4gICAgY29uc3QgZGV2aWNlU3RhdCA9IHN1bW1hcnkud2ViZXhSZWFkaW5lc3NMaWNlbnNlU3RhdHM/LmZpbmQoc3RhdCA9PiBzdGF0LmZlYXR1cmUgPT09ICdPUlBIQU5FRF9ERVZJQ0UnKTtcclxuXHJcbiAgICBjb25zdCBwcm9mZXNzaW9uYWxOZWVkZWQgPSBwZXJzb25TdGF0Py50b3RhbENvdW50ID8/IDA7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2VOZWVkZWQgPSBkZXZpY2VTdGF0Py50b3RhbENvdW50ID8/IDA7XHJcblxyXG4gICAgY29uc3QgcHJvZmVzc2lvbmFsT3duZWQgPSBOdW1iZXIoc3VtbWFyeS50b3RhbFByb2Zlc3Npb25hbExpY2Vuc2VDb3VudCA/PyAwKTtcclxuICAgIGNvbnN0IHdvcmtzcGFjZU93bmVkID0gTnVtYmVyKHN1bW1hcnkudG90YWxXb3Jrc3BhY2VQcm9mZXNzaW9uYWxMaWNlbnNlQ291bnQgPz8gMCk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGRhdGEgYmFzZWQgb24gc2VsZWN0aW9uXHJcbiAgICBsZXQgZXhpc3RpbmdDb3VudDogbnVtYmVyO1xyXG4gICAgbGV0IG1pc3NpbmdDb3VudDogbnVtYmVyO1xyXG4gICAgbGV0IHJvd3M6IExpY2Vuc2VUYWJsZVJvd1tdO1xyXG5cclxuICAgIGlmIChmaWx0ZXJJbmRleCA9PT0gMCkge1xyXG4gICAgICAvLyBBbGwgLSBzaG93IGJvdGhcclxuICAgICAgZXhpc3RpbmdDb3VudCA9IHByb2Zlc3Npb25hbE93bmVkICsgd29ya3NwYWNlT3duZWQ7XHJcbiAgICAgIGNvbnN0IHRvdGFsTmVlZGVkID0gcHJvZmVzc2lvbmFsTmVlZGVkICsgd29ya3NwYWNlTmVlZGVkO1xyXG4gICAgICBtaXNzaW5nQ291bnQgPSBNYXRoLm1heCgwLCB0b3RhbE5lZWRlZCAtIGV4aXN0aW5nQ291bnQpO1xyXG5cclxuICAgICAgcm93cyA9IFtcclxuICAgICAgICB7IGxhYmVsOiAnUHJvZmVzc2lvbmFsIGxpY2Vuc2VzJywgdmFsdWU6IHByb2Zlc3Npb25hbE5lZWRlZCB9LFxyXG4gICAgICAgIHsgbGFiZWw6ICdXb3Jrc3BhY2UgbGljZW5zZXMnLCB2YWx1ZTogd29ya3NwYWNlTmVlZGVkIH1cclxuICAgICAgXTtcclxuICAgIH0gZWxzZSBpZiAoZmlsdGVySW5kZXggPT09IDEpIHtcclxuICAgICAgLy8gUHJvZmVzc2lvbmFsIGxpY2Vuc2VzIG9ubHlcclxuICAgICAgZXhpc3RpbmdDb3VudCA9IHByb2Zlc3Npb25hbE93bmVkO1xyXG4gICAgICBtaXNzaW5nQ291bnQgPSBNYXRoLm1heCgwLCBwcm9mZXNzaW9uYWxOZWVkZWQgLSBwcm9mZXNzaW9uYWxPd25lZCk7XHJcblxyXG4gICAgICByb3dzID0gW3sgbGFiZWw6ICdQcm9mZXNzaW9uYWwgbGljZW5zZXMnLCB2YWx1ZTogcHJvZmVzc2lvbmFsTmVlZGVkIH1dO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gV29ya3NwYWNlIGxpY2Vuc2VzIG9ubHlcclxuICAgICAgZXhpc3RpbmdDb3VudCA9IHdvcmtzcGFjZU93bmVkO1xyXG4gICAgICBtaXNzaW5nQ291bnQgPSBNYXRoLm1heCgwLCB3b3Jrc3BhY2VOZWVkZWQgLSB3b3Jrc3BhY2VPd25lZCk7XHJcblxyXG4gICAgICByb3dzID0gW3sgbGFiZWw6ICdXb3Jrc3BhY2UgbGljZW5zZXMnLCB2YWx1ZTogd29ya3NwYWNlTmVlZGVkIH1dO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvdGFsTGljZW5zZXMgPSBleGlzdGluZ0NvdW50ICsgbWlzc2luZ0NvdW50O1xyXG5cclxuICAgIGNvbnN0IGxlZ2VuZEl0ZW1zOiBMaWNlbnNlTGVnZW5kSXRlbVtdID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdFeGlzdGluZyBsaWNlbnNlcycsXHJcbiAgICAgICAgY291bnQ6IGV4aXN0aW5nQ291bnQsXHJcbiAgICAgICAgcGVyY2VudGFnZTogdG90YWxMaWNlbnNlcyA+IDAgPyAoZXhpc3RpbmdDb3VudCAvIHRvdGFsTGljZW5zZXMpICogMTAwIDogMCxcclxuICAgICAgICBjb2xvcjogTEVHRU5EX0NPTE9SUy5leGlzdGluZ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdNaXNzaW5nIGxpY2Vuc2VzJyxcclxuICAgICAgICBjb3VudDogbWlzc2luZ0NvdW50LFxyXG4gICAgICAgIHBlcmNlbnRhZ2U6IHRvdGFsTGljZW5zZXMgPiAwID8gKG1pc3NpbmdDb3VudCAvIHRvdGFsTGljZW5zZXMpICogMTAwIDogMCxcclxuICAgICAgICBjb2xvcjogTEVHRU5EX0NPTE9SUy5taXNzaW5nXHJcbiAgICAgIH1cclxuICAgIF07XHJcblxyXG4gICAgY29uc29sZS5sb2coJ0xlZ2VuZCBpdGVtczonLCBsZWdlbmRJdGVtcyk7XHJcbiAgICBjb25zb2xlLmxvZygnVGFibGUgcm93czonLCByb3dzKTtcclxuXHJcbiAgICBjb25zdCB0b3RhbFJlcXVpcmVkID0gcm93cy5yZWR1Y2UoKGFjYywgcm93KSA9PiBhY2MgKyByb3cudmFsdWUsIDApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNoYXJ0T3B0aW9uczogdGhpcy5idWlsZENoYXJ0T3B0aW9ucyhsZWdlbmRJdGVtcyksXHJcbiAgICAgIGxlZ2VuZEl0ZW1zLFxyXG4gICAgICByb3dzLFxyXG4gICAgICB0b3RhbFJlcXVpcmVkXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENoYXJ0T3B0aW9ucyhsZWdlbmRJdGVtczogTGljZW5zZUxlZ2VuZEl0ZW1bXSk6IExpY2Vuc2VDaGFydE9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VyaWVzOiBsZWdlbmRJdGVtcy5tYXAoaXRlbSA9PiBpdGVtLmNvdW50KSxcclxuICAgICAgY2hhcnQ6IHtcclxuICAgICAgICB0eXBlOiAnZG9udXQnLFxyXG4gICAgICAgIGhlaWdodDogMjIwXHJcbiAgICAgIH0sXHJcbiAgICAgIGxhYmVsczogbGVnZW5kSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5sYWJlbCksXHJcbiAgICAgIGNvbG9yczogbGVnZW5kSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5jb2xvciksXHJcbiAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgIHNob3c6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIHBsb3RPcHRpb25zOiB7XHJcbiAgICAgICAgcGllOiB7XHJcbiAgICAgICAgICBkb251dDoge1xyXG4gICAgICAgICAgICBzaXplOiAnNzUlJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZGF0YUxhYmVsczoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBlcmNlbnRhZ2UodmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIC8vIENvbnZlcnQgZGVjaW1hbCB0byBwZXJjZW50YWdlICgwLjk0ODcg4oaSIDk0LjkpXHJcbiAgICBjb25zdCBwZXJjZW50YWdlID0gdmFsdWUgKiAxMDA7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50YWdlICogMTApIC8gMTA7XHJcbiAgfVxyXG59XHJcbiIsIjx0ay1jYXJkIHRpdGxlPVwiTGljZW5zZXMgcmVxdWlyZW1lbnRcIj5cclxuICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiY2FyZC1jb250ZW50XCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0LWJvZHlcIlxyXG4gICAgICAqbmdJZj1cIiFsb2FkaW5nICYmICFlcnJvciAmJiB2aWV3TW9kZWw7IGVsc2Ugd2lkZ2V0U3RhdGVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zZWN0aW9uXCI+XHJcbiAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgIFsodmFsdWUpXT1cInNlbGVjdGVkU3VtbWFyeUluZGV4XCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImZpbHRlci1zZWxlY3RcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyczsgaW5kZXggYXMgaVwiIFt2YWx1ZV09XCJpXCI+XHJcbiAgICAgICAgICAgIHt7IG9wdGlvbiB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxhcHgtY2hhcnRcclxuICAgICAgICAgICAgICBbc2VyaWVzXT1cInZpZXdNb2RlbC5jaGFydE9wdGlvbnMuc2VyaWVzXCJcclxuICAgICAgICAgICAgICBbY2hhcnRdPVwidmlld01vZGVsLmNoYXJ0T3B0aW9ucy5jaGFydFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsc109XCJ2aWV3TW9kZWwuY2hhcnRPcHRpb25zLmxhYmVsc1wiXHJcbiAgICAgICAgICAgICAgW2NvbG9yc109XCJ2aWV3TW9kZWwuY2hhcnRPcHRpb25zLmNvbG9yc1wiXHJcbiAgICAgICAgICAgICAgW2xlZ2VuZF09XCJ2aWV3TW9kZWwuY2hhcnRPcHRpb25zLmxlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW3Bsb3RPcHRpb25zXT1cInZpZXdNb2RlbC5jaGFydE9wdGlvbnMucGxvdE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtkYXRhTGFiZWxzXT1cInZpZXdNb2RlbC5jaGFydE9wdGlvbnMuZGF0YUxhYmVsc1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9hcHgtY2hhcnQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygdmlld01vZGVsLmxlZ2VuZEl0ZW1zXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGVnZW5kLW1hcmtlclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cIml0ZW0uY29sb3JcIlxyXG4gICAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZWdlbmQtbGFiZWxcIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGVnZW5kLXZhbHVlXCI+e3sgaXRlbS5jb3VudCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXNlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8c3Bhbj5MaWNlbnNlPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+UmVxdWlyZWQ8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2Ygdmlld01vZGVsLnJvd3NcIj5cclxuICAgICAgICAgIDxzcGFuPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuPnt7IHJvdy52YWx1ZSB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcm93IHRvdGFsLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4+VG90YWw8L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj57eyB2aWV3TW9kZWwudG90YWxSZXF1aXJlZCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3dpZGdldFN0YXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdGUtbWVzc2FnZVwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIExvYWRpbmcgbGljZW5zZSByZXF1aXJlbWVudHPigKZcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1tZXNzYWdlIGVycm9yXCIgKm5nSWY9XCIhbG9hZGluZyAmJiBlcnJvclwiPlxyXG4gICAgICAgIFVuYWJsZSB0byBsb2FkIGxpY2Vuc2UgcmVxdWlyZW1lbnRzLlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLW1lc3NhZ2VcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFlcnJvciAmJiAhdmlld01vZGVsXCI+XHJcbiAgICAgICAgTm8gbGljZW5zZSBkYXRhIGF2YWlsYWJsZS5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L3RrLWNhcmQ+XHJcbiJdfQ==